From e083ffb441420cfd0cca24e1836d0341283e439d Mon Sep 17 00:00:00 2001 From: Gabriele Cosmo Date: Thu, 9 Jun 2016 10:56:29 +0200 Subject: [PATCH] Import Geant4 6.2.0 source tree --- Configure | 579 ++- ReleaseNotes/ReleaseNotes4.6.2.html | 903 ++++ config/History | 71 +- config/architecture.gmk | 45 +- config/binmake.gmk | 85 +- config/common.gmk | 20 +- config/globlib.gmk | 29 +- config/scripts/env.csh.SH | 28 +- config/scripts/env.sh.SH | 32 +- config/scripts/install.sh.SH | 69 +- config/sys/Darwin-g++.gmk | 24 +- config/sys/Linux-g++.gmk | 17 +- config/sys/WIN32-VC.gmk | 46 +- config/sys/WIN32-VC7.gmk | 49 +- config/sys/WIN32-g++.gmk | 16 +- config/win32def.c | 30 +- electromagnetic_lists/History | 21 + electromagnetic_lists/README | 44 + .../standard/DecaysBuilder.cc | 32 +- .../standard/DecaysBuilder.hh | 71 + .../standard/G4EmHadronBuilder.cc | 106 + .../standard/G4EmHadronBuilder.hh | 64 + .../standard/G4EmHadronBuilder52.cc | 104 + .../standard/G4EmHadronBuilder52.hh | 64 + .../standard/G4EmHighEnergyBuilder.cc | 93 + .../standard/G4EmHighEnergyBuilder.hh | 64 + .../standard/G4EmMuonBuilder.cc | 105 + .../standard/G4EmMuonBuilder.hh | 63 + .../standard/G4EmMuonBuilder52.cc | 105 + .../standard/G4EmMuonBuilder52.hh | 63 + .../standard/G4EmQEDBuilder.cc | 111 + .../standard/G4EmQEDBuilder.hh | 64 + .../standard/G4EmQEDBuilder52.cc | 111 + .../standard/G4EmQEDBuilder52.hh | 64 + .../standard/ParticlesBuilder.cc | 27 +- .../standard/ParticlesBuilder.hh | 30 +- electromagnetic_lists/standard/PhysicsList.cc | 177 + electromagnetic_lists/standard/PhysicsList.hh | 88 + .../standard/PhysicsListMessenger.cc | 114 + .../standard/PhysicsListMessenger.hh | 68 + environments/MOMO/History | 6 +- environments/MOMO/MOMO.jar | Bin 173833 -> 184409 bytes examples/History | 30 +- examples/advanced/GNUmakefile | 7 +- examples/advanced/Rich/History | 5 +- examples/advanced/Rich/README | 22 +- examples/advanced/Rich/setupAidaPi.csh | 11 + examples/advanced/Rich/setupAidaPi.sh | 12 + examples/advanced/Tiara/GNUmakefile | 17 +- examples/advanced/Tiara/History | 9 +- examples/advanced/Tiara/README | 80 +- examples/advanced/Tiara/envCommon.csh | 52 +- examples/advanced/Tiara/run/runSim.py | 11 +- .../advanced/Tiara/run/runSimNoAnalysis.py | 8 +- examples/advanced/Tiara/run/runVisMode.py | 5 +- .../Tiara/source/CLHEPWrapper/GNUmakefile | 3 +- .../Tiara/source/G4KernelWrapper/GNUmakefile | 4 +- .../Tiara/source/TiaraWrapper/GNUmakefile | 10 +- .../advanced/Tiara/source/py_modules/liz.py | 445 -- .../source/py_modules/{myLiz.py => myPI.py} | 7 +- .../Tiara/source/py_modules/myUtils.py | 18 +- .../Tiara/source/py_modules/runSequence.py | 14 +- .../source/py_modules/tiaraApplication.py | 33 +- .../Tiara/source/py_modules/tiaraDetectors.py | 4 +- .../source/py_modules/tiaraGenerators.py | 6 +- .../advanced/Tiara/source/tiara/GNUmakefile | 8 +- .../tiara/include/TiaraDPSSampledEnergy.hh | 13 +- .../Tiara/source/tiara/src/TiaraCellScorer.cc | 45 +- .../source/tiara/src/TiaraDPSSampledEnergy.cc | 38 +- examples/advanced/brachytherapy/Brachy.cc | 4 +- examples/advanced/brachytherapy/History | 8 +- .../brachytherapy/IodiumSourceMacro.mac | 2 +- .../brachytherapy/IridiumSourceMacro.mac | 2 +- .../brachytherapy/LeipzigSourceMacro.mac | 2 +- examples/advanced/brachytherapy/README | 23 +- .../src/BrachyAnalysisManager.cc | 4 +- .../src/BrachyDetectorConstruction.cc | 56 +- .../src/BrachyPhantomROGeometry.cc | 6 +- .../brachytherapy/src/BrachyPhantomSD.cc | 48 +- .../advanced/composite_calorimeter/History | 9 +- .../advanced/composite_calorimeter/README | 25 +- .../composite_calorimeter/envExample.csh | 14 +- .../composite_calorimeter/envExample.sh | 14 +- .../composite_calorimeter/src/CCalAnalysis.cc | 29 +- .../advanced/cosmicray_charging/CRCharging.cc | 140 + .../advanced/cosmicray_charging/GNUmakefile | 22 + examples/advanced/cosmicray_charging/History | 24 + examples/advanced/cosmicray_charging/README | 45 + .../docs/WP500_SUM_ICL_002_v1.0.pdf | Bin 0 -> 451512 bytes .../include/LISAAnalysisManager.hh | 105 + .../include/LISADetectorConstruction.hh | 111 + .../include/LISADetectorMaterials.hh | 134 + .../include/LISAEventAction.hh | 75 + .../include/LISAPhysicsList.hh | 67 + .../include/LISAPrimaryGeneratorAction.hh | 63 + .../include/LISARunAction.hh | 66 + .../include/LISARunActionMessenger.hh | 59 + .../include/LISAStackingAction.hh | 65 + .../include/LISAStackingActionMessenger.hh | 59 + .../include/LISASteppingAction.hh | 73 + .../include/LISASteppingActionMessenger.hh | 61 + .../include/LISAVisManager.hh | 55 + examples/advanced/cosmicray_charging/init.mac | 25 + .../primaries/helium3_solmin.mac | 66 + .../primaries/helium4_solmin.mac | 65 + .../primaries/protons_solmin.mac | 71 + .../advanced/cosmicray_charging/seeds.rndm | 2 + .../advanced/cosmicray_charging/shoot.mac | 32 + .../src/LISAAnalysisManager.cc | 174 + .../cosmicray_charging/src/LISAColours.icc | 90 + .../src/LISADetectorConstruction.cc | 229 + .../src/LISAElectronicsBoxes.icc | 462 ++ .../cosmicray_charging/src/LISAEventAction.cc | 211 + .../src/LISAInertialSensor.icc | 247 + .../src/LISAInterferometerAssembly.icc | 643 +++ .../cosmicray_charging/src/LISAPhysicsList.cc | 1036 ++++ .../src/LISAPrimaryGeneratorAction.cc | 81 + .../cosmicray_charging/src/LISARunAction.cc | 167 + .../src/LISARunActionMessenger.cc | 78 + .../src/LISAScienceModuleStructures.icc | 500 ++ .../src/LISASensorHousing.icc | 101 + .../src/LISAStackingAction.cc | 164 + .../src/LISAStackingActionMessenger.cc | 107 + .../src/LISASteppingAction.cc | 178 + .../src/LISASteppingActionMessenger.cc | 89 + .../src/LISASupportSystems.icc | 206 + .../cosmicray_charging/src/LISAVisManager.cc | 160 + examples/advanced/gammaray_telescope/History | 13 + examples/advanced/gammaray_telescope/README | 16 +- .../include/GammaRayTelAnalysis.hh | 11 +- .../GammaRayTelDetectorConstruction.hh | 7 +- .../src/GammaRayTelAnalysis.cc | 194 +- .../src/GammaRayTelDetectorConstruction.cc | 33 +- examples/advanced/hadrontherapy/GNUmakefile | 17 + .../advanced/hadrontherapy/Hadrontherapy.cc | 184 + examples/advanced/hadrontherapy/History | 24 + examples/advanced/hadrontherapy/README | 211 + .../advanced/hadrontherapy/defaultMacro.mac | 18 + .../include/HadrontherapyCalorHit.hh | 84 + .../include/HadrontherapyCalorimeterSD.hh | 105 + .../HadrontherapyDetectorConstruction.hh | 364 ++ .../include/HadrontherapyDetectorMessenger.hh | 67 + .../include/HadrontherapyEventAction.hh | 74 + .../hadrontherapy/include/HadrontherapyHit.hh | 92 + .../include/HadrontherapyPhysicsList.hh | 90 + .../HadrontherapyPrimaryGeneratorAction.hh | 74 + .../include/HadrontherapyRunAction.hh | 66 + .../include/HadrontherapySteppingAction.hh | 71 + .../include/HadrontherapyVisManager.hh | 48 + .../src/HadrontherapyCalorHit.cc | 63 + .../src/HadrontherapyCalorimeterSD.cc | 207 + .../src/HadrontherapyDetectorConstruction.cc | 1920 +++++++ .../src/HadrontherapyDetectorMessenger.cc | 76 + .../src/HadrontherapyEventAction.cc | 110 + .../hadrontherapy/src/HadrontherapyHit.cc | 83 + .../src/HadrontherapyPhysicsList.cc | 475 ++ .../HadrontherapyPrimaryGenerationAction.cc | 138 + .../src/HadrontherapyRunAction.cc | 99 + .../src/HadrontherapySteppingAction.cc | 111 + .../src/HadrontherapyVisManager.cc | 144 + .../advanced/hadrontherapy/visualisation.mac | 32 + examples/advanced/lAr_calorimeter/History | 8 +- examples/advanced/lAr_calorimeter/README | 28 +- .../advanced/lAr_calorimeter/setupAidaPi.csh | 11 + .../advanced/lAr_calorimeter/setupAidaPi.sh | 12 + .../advanced/medical_linac/G4History.macro | 11 + examples/advanced/medical_linac/GNUmakefile | 31 + examples/advanced/medical_linac/History | 35 + examples/advanced/medical_linac/MedLinac.cc | 154 + examples/advanced/medical_linac/README | 181 + examples/advanced/medical_linac/dawnvis.mac | 36 + .../include/MedLinacAnalysisManager.hh | 96 + .../include/MedLinacDecorator.hh | 49 + .../include/MedLinacDetectorConstruction.hh | 151 + .../include/MedLinacDetectorMessenger.hh | 69 + .../medical_linac/include/MedLinacDummySD.hh | 48 + .../include/MedLinacEventAction.hh | 59 + .../medical_linac/include/MedLinacHead.hh | 84 + .../include/MedLinacPhantomHit.hh | 123 + .../include/MedLinacPhantomROGeometry.hh | 58 + .../include/MedLinacPhantomSD.hh | 54 + .../include/MedLinacPhysicsList.hh | 83 + .../include/MedLinacPrimaryGeneratorAction.hh | 61 + .../MedLinacPrimaryGeneratorMessenger.hh | 58 + .../include/MedLinacRunAction.hh | 64 + .../MedLinacTargetAndFilterDecorator.hh | 110 + .../include/MedLinacVGeometryComponent.hh | 48 + .../include/MedLinacVisManager.hh | 56 + examples/advanced/medical_linac/macro.mac | 17 + .../src/MedLinacAnalysisManager.cc | 208 + .../medical_linac/src/MedLinacDecorator.cc | 45 + .../src/MedLinacDetectorConstruction.cc | 460 ++ .../src/MedLinacDetectorMessenger.cc | 136 + .../medical_linac/src/MedLinacEventAction.cc | 91 + .../medical_linac/src/MedLinacHead.cc | 457 ++ .../medical_linac/src/MedLinacPhantomHit.cc | 85 + .../src/MedLinacPhantomROGeometry.cc | 198 + .../medical_linac/src/MedLinacPhantomSD.cc | 174 + .../medical_linac/src/MedLinacPhysicsList.cc | 202 + .../src/MedLinacPrimaryGeneratorAction.cc | 101 + .../src/MedLinacPrimaryGeneratorMessenger.cc | 78 + .../medical_linac/src/MedLinacRunAction.cc | 86 + .../src/MedLinacTargetAndFilterDecorator.cc | 535 ++ .../src/MedLinacVGeometryComponent.cc | 35 + .../medical_linac/src/MedLinacVisManager.cc | 100 + examples/advanced/medical_linac/vis.mac | 33 + examples/advanced/medical_linac/vrmlvis.mac | 33 + examples/advanced/purging_magnet/GNUmakefile | 26 + examples/advanced/purging_magnet/History | 29 + .../advanced/purging_magnet/MacroTesting.mac | 13 + examples/advanced/purging_magnet/PurgMag.cc | 137 + examples/advanced/purging_magnet/PurgMag.pdf | Bin 0 -> 179475 bytes .../advanced/purging_magnet/PurgMag3D.TABLE | 370 ++ examples/advanced/purging_magnet/README | 134 + .../include/PurgMagAnalysisManager.hh | 100 + .../include/PurgMagDetectorConstruction.hh | 149 + .../include/PurgMagEventAction.hh | 70 + .../include/PurgMagPhysicsList.hh | 106 + .../include/PurgMagPrimaryGeneratorAction.hh | 70 + .../include/PurgMagRunAction.hh | 83 + .../include/PurgMagSteppingAction.hh | 70 + .../include/PurgMagSteppingVerbose.hh | 57 + .../include/PurgMagTabulatedField3D.hh | 70 + .../include/PurgMagTrackingAction.hh | 58 + .../include/PurgMagVisManager.hh | 70 + .../src/PurgMagAnalysisManager.cc | 242 + .../src/PurgMagDetectorConstruction.cc | 440 ++ .../purging_magnet/src/PurgMagEventAction.cc | 126 + .../purging_magnet/src/PurgMagPhysicsList.cc | 327 ++ .../src/PurgMagPrimaryGeneratorAction.cc | 104 + .../purging_magnet/src/PurgMagRunAction.cc | 132 + .../src/PurgMagSteppingAction.cc | 166 + .../src/PurgMagSteppingVerbose.cc | 180 + .../src/PurgMagTabulatedField3D.cc | 223 + .../src/PurgMagTrackingAction.cc | 63 + .../purging_magnet/src/PurgMagVisManager.cc | 162 + examples/advanced/purging_magnet/vis.mac | 47 + examples/advanced/radioprotection/GNUmakefile | 24 + examples/advanced/radioprotection/History | 16 + examples/advanced/radioprotection/README | 249 + examples/advanced/radioprotection/gcrZ=1.txt | 837 ++++ examples/advanced/radioprotection/gcrZ=14.txt | 837 ++++ examples/advanced/radioprotection/gcrZ=2.txt | 837 ++++ examples/advanced/radioprotection/gcrZ=26.txt | 837 ++++ examples/advanced/radioprotection/gcrZ=6.txt | 837 ++++ examples/advanced/radioprotection/gcrZ=8.txt | 837 ++++ .../radioprotection/include/G4IonC12.hh | 83 + .../radioprotection/include/G4IonFe52.hh | 83 + .../radioprotection/include/G4IonO16.hh | 59 + .../radioprotection/include/G4IonSi28.hh | 83 + .../include/RemSimAnalysisManager.hh | 111 + .../include/RemSimAstronautDecorator.hh | 69 + .../include/RemSimBasicGenerator.hh | 65 + .../radioprotection/include/RemSimDecay.hh | 56 + .../include/RemSimDecorator.hh | 57 + .../include/RemSimDetectorConstruction.hh | 85 + .../include/RemSimDetectorMessenger.hh | 68 + .../radioprotection/include/RemSimDummySD.hh | 50 + .../include/RemSimElectronEEDL.hh | 57 + .../include/RemSimEventAction.hh | 62 +- .../include/RemSimHadronicPhysics.hh | 116 + .../radioprotection/include/RemSimHit.hh | 87 + .../RemSimInterplanetarySpaceConfiguration.hh | 63 + .../radioprotection/include/RemSimIonICRU.hh | 42 + .../include/RemSimIonStandard.hh | 42 + .../radioprotection/include/RemSimMaterial.hh | 75 + .../include/RemSimMoonHabitat.hh | 58 + .../include/RemSimMuonStandard.hh | 49 + .../include/RemSimParticles.hh | 55 + .../include/RemSimPhotonEPDL.hh | 57 + .../include/RemSimPhysicsList.hh | 66 + .../include/RemSimPhysicsListMessenger.hh | 59 + .../include/RemSimPositronStandard.hh | 56 + .../include/RemSimPrimaryGeneratorAction.hh | 57 + .../RemSimPrimaryGeneratorMessenger.hh | 64 + .../include/RemSimROGeometry.hh | 63 + .../include/RemSimRoofDecorator.hh | 75 + .../include/RemSimRunAction.hh | 74 + .../include/RemSimRunMessenger.hh | 60 + .../include/RemSimSensitiveDetector.hh | 52 + .../include/RemSimShelterSPEDecorator.hh | 71 + .../include/RemSimShieldingDecorator.hh | 70 + .../include/RemSimSteppingAction.hh | 65 + .../include/RemSimSteppingActionMessenger.hh | 53 + .../include/RemSimVGeometryComponent.hh | 44 + .../include/RemSimVPrimaryGeneratorFactory.hh | 48 + .../radioprotection/include/RemSimVehicle1.hh | 80 + .../include/RemSimVisManager.hh | 60 + examples/advanced/radioprotection/moon.mac | 31 + examples/advanced/radioprotection/remsim.cc | 124 + examples/advanced/radioprotection/speZ=1.txt | 837 ++++ examples/advanced/radioprotection/speZ=2.txt | 844 ++++ .../advanced/radioprotection/src/G4IonC12.cc | 87 + .../advanced/radioprotection/src/G4IonFe52.cc | 87 + .../advanced/radioprotection/src/G4IonO16.cc | 74 + .../advanced/radioprotection/src/G4IonSi28.cc | 87 + .../src/RemSimAnalysisManager.cc | 198 + .../src/RemSimAstronautDecorator.cc | 162 + .../src/RemSimBasicGenerator.cc | 79 + .../radioprotection/src/RemSimDecay.cc | 68 + .../radioprotection/src/RemSimDecorator.cc | 55 + .../src/RemSimDetectorConstruction.cc | 274 + .../src/RemSimDetectorMessenger.cc | 131 + .../radioprotection/src/RemSimElectronEEDL.cc | 60 + .../radioprotection/src/RemSimEventAction.cc | 72 + .../src/RemSimHadronicPhysics.cc | 271 + .../advanced/radioprotection/src/RemSimHit.cc | 84 + .../RemSimInterplanetarySpaceConfiguration.cc | 146 + .../radioprotection/src/RemSimIonICRU.cc | 72 + .../radioprotection/src/RemSimIonStandard.cc | 70 + .../radioprotection/src/RemSimMaterial.cc | 250 + .../radioprotection/src/RemSimMoonHabitat.cc | 115 + .../radioprotection/src/RemSimMuonStandard.cc | 86 + .../radioprotection/src/RemSimParticles.cc} | 149 +- .../radioprotection/src/RemSimPhotonEPDL.cc | 65 + .../radioprotection/src/RemSimPhysicsList.cc | 239 + .../src/RemSimPhysicsListMessenger.cc | 63 + .../src/RemSimPositronStandard.cc | 62 + .../src/RemSimPrimaryGeneratorAction.cc | 106 + .../src/RemSimPrimaryGeneratorMessenger.cc | 69 + .../radioprotection/src/RemSimROGeometry.cc | 140 + .../src/RemSimRoofDecorator.cc | 126 + .../radioprotection/src/RemSimRunAction.cc | 167 + .../radioprotection/src/RemSimRunMessenger.cc | 65 + .../src/RemSimSensitiveDetector.cc | 88 + .../src/RemSimShelterSPEDecorator.cc | 122 + .../src/RemSimShieldingDecorator.cc | 125 + .../src/RemSimSteppingAction.cc | 160 + .../src/RemSimSteppingActionMessenger.cc | 58 + .../src/RemSimVGeometryComponent.cc | 34 + .../src/RemSimVPrimaryGeneratorFactory.cc | 35 + .../radioprotection/src/RemSimVehicle1.cc | 456 ++ .../radioprotection/src/RemSimVisManager.cc | 136 + .../advanced/radioprotection/vehicle1.mac | 54 + .../advanced/radioprotection/vehicle2.mac | 49 + examples/advanced/radioprotection/vis.mac | 52 + examples/advanced/underground_physics/DMX.cc | 2 +- examples/advanced/underground_physics/DMX.py | 67 - examples/advanced/underground_physics/History | 2 + examples/advanced/underground_physics/README | 61 +- .../include/DMXAnalysisManager.hh | 73 +- .../src/DMXAnalysisManager.cc | 292 +- .../underground_physics/src/DMXEventAction.cc | 14 +- .../underground_physics/src/DMXRunAction.cc | 6 +- .../src/DMXSteppingAction.cc | 2 +- .../xray_fluorescence/G4History.macro | 26 - .../advanced/xray_fluorescence/GNUmakefile | 32 +- examples/advanced/xray_fluorescence/README | 94 +- .../advanced/xray_fluorescence/XrayFluo.cc | 105 +- .../advanced/xray_fluorescence/anaphe.gmk | 17 + .../include/XrayFluoAnalysisManager.hh | 69 +- .../include/XrayFluoAnalysisMessenger.hh | 21 +- .../include/XrayFluoDataSet.hh | 12 +- .../include/XrayFluoDetectorConstruction.hh | 98 +- .../include/XrayFluoDetectorMessenger.hh | 32 +- .../include/XrayFluoEventAction.hh | 24 +- .../include/XrayFluoEventActionMessenger.hh | 2 +- .../include/XrayFluoNormalization.hh | 2 +- .../include/XrayFluoPhysicsList.hh | 21 +- .../include/XrayFluoPhysicsListMessenger.hh | 6 +- .../include/XrayFluoPrimaryGeneratorAction.hh | 12 +- .../XrayFluoPrimaryGeneratorMessenger.hh | 2 +- .../include/XrayFluoRunAction.hh | 17 +- .../include/XrayFluoSensorHit.hh | 6 +- .../include/XrayFluoSteppingAction.hh | 15 +- .../include/XrayFluoSteppingVerbose.hh | 2 +- .../include/XrayFluoVisManager.hh | 2 +- .../advanced/xray_fluorescence/initInter.mac | 17 +- examples/advanced/xray_fluorescence/macro.mac | 9 +- .../advanced/xray_fluorescence/macro1.mac | 8 +- .../advanced/xray_fluorescence/macro2.mac | 6 +- .../advanced/xray_fluorescence/macroTest.mac | 9 + .../src/XrayFluoAnalysisManager.cc | 409 +- .../src/XrayFluoAnalysisMessenger.cc | 55 +- .../xray_fluorescence/src/XrayFluoDataSet.cc | 37 +- .../src/XrayFluoDetectorConstruction.cc | 815 ++- .../src/XrayFluoDetectorMessenger.cc | 61 +- .../src/XrayFluoEventAction.cc | 182 +- .../src/XrayFluoEventActionMessenger.cc | 2 +- .../src/XrayFluoNormalization.cc | 16 +- .../src/XrayFluoPhysicsList.cc | 184 +- .../src/XrayFluoPhysicsListMessenger.cc | 42 +- .../src/XrayFluoPrimaryGeneratorAction.cc | 35 +- .../src/XrayFluoPrimaryGeneratorMessenger.cc | 7 +- .../src/XrayFluoRunAction.cc | 263 +- .../src/XrayFluoSensorHit.cc | 31 +- .../src/XrayFluoSteppingAction.cc | 37 +- .../src/XrayFluoSteppingVerbose.cc | 8 +- .../src/XrayFluoVisManager.cc | 12 +- .../advanced/xray_fluorescence/testhbk.xml | Bin 0 -> 1621 bytes .../advanced/xray_fluorescence/xrayfluo.xml | Bin 0 -> 1586 bytes examples/advanced/xray_telescope/History | 4 +- examples/advanced/xray_telescope/README | 25 +- .../xray_telescope/include/XrayTelAnalysis.hh | 24 +- .../xray_telescope/src/XrayTelAnalysis.cc | 134 +- .../xray_telescope/src/XrayTelPhysicsList.cc | 2 +- .../src/XrayTelSteppingAction.cc | 3 +- examples/advanced/xray_telescope/test.mac | 2 +- examples/advanced/xray_telescope/xraytel.out | 138 + examples/extended/analysis/A01/History | 10 +- .../extended/analysis/A01/heprep2-000-gz.mac | 2 + .../extended/analysis/A01/heprep2-000-zip.mac | 2 + examples/extended/analysis/A01/heprep2.mac | 3 + examples/extended/analysis/A01/heprep2gz.mac | 2 + examples/extended/analysis/A01/heprep2zip.mac | 3 + examples/extended/biasing/B01/exampleB01.out | 52 +- examples/extended/biasing/B02/B02plot.py | 7 - examples/extended/biasing/B02/GNUmakefile | 13 +- examples/extended/biasing/B02/History | 25 + examples/extended/biasing/B02/setupAnaphe.csh | 148 - examples/extended/biasing/B02/setupPI.csh | 63 + .../extended/biasing/B03/B03RunApplication.py | 36 +- examples/extended/biasing/B03/GNUmakefile | 30 +- examples/extended/biasing/B03/History | 26 + examples/extended/biasing/B03/setupPI.csh | 73 + examples/extended/biasing/History | 5 +- examples/extended/biasing/README | 90 +- .../electromagnetic/MuonProcesses/GNUmakefile | 40 + .../electromagnetic/MuonProcesses/History | 23 + .../MuonProcesses/MuonProcesses.cc | 121 + .../MuonProcesses/MuonProcesses.in | 22 + .../electromagnetic/MuonProcesses/README | 149 + .../electromagnetic/MuonProcesses/allproc.mac | 29 + .../include/DetectorConstruction.hh | 89 + .../include/DetectorMessenger.hh | 69 + .../MuonProcesses/include/EventAction.hh | 60 + .../include/EventActionMessenger.hh | 58 + .../MuonProcesses/include/HistoManager.hh | 91 + .../MuonProcesses/include/HistoMessenger.hh | 70 + .../MuonProcesses/include/MuCrossSections.hh | 60 + .../include/PhysListEmG4v52.hh | 5 +- .../include/PhysListEmStandard.hh} | 16 +- .../MuonProcesses/include/PhysicsList.hh | 70 + .../include/PhysicsListMessenger.hh | 64 + .../include/PrimaryGeneratorAction.hh | 60 + .../MuonProcesses/include/ProcessesCount.hh | 63 + .../MuonProcesses/include/RunAction.hh | 73 + .../MuonProcesses/include/StackingAction.hh | 51 + .../MuonProcesses/include/SteppingAction.hh | 55 + .../MuonProcesses/include/SteppingVerbose.hh | 54 + .../MuonProcesses/include/VisManager.hh | 65 + .../MuonProcesses/src/DetectorConstruction.cc | 176 + .../MuonProcesses/src/DetectorMessenger.cc | 95 + .../MuonProcesses/src/EventAction.cc | 83 + .../MuonProcesses/src/EventActionMessenger.cc | 67 + .../MuonProcesses/src/HistoManager.cc | 165 + .../MuonProcesses/src/HistoMessenger.cc | 118 + .../MuonProcesses/src/MuCrossSections.cc | 392 ++ .../MuonProcesses/src/PhysListEmG4v52.cc | 76 + .../MuonProcesses/src/PhysListEmStandard.cc | 84 + .../src/PhysicsList.cc} | 157 +- .../MuonProcesses/src/PhysicsListMessenger.cc | 111 + .../src/PrimaryGeneratorAction.cc | 78 + .../MuonProcesses/src/RunAction.cc | 265 + .../MuonProcesses/src/StackingAction.cc | 56 + .../MuonProcesses/src/SteppingAction.cc | 86 + .../MuonProcesses/src/SteppingVerbose.cc | 177 + .../MuonProcesses/src/VisManager.cc | 151 + .../electromagnetic/MuonProcesses/vis.mac | 30 + .../PhotonProcesses/GNUmakefile | 40 + .../electromagnetic/PhotonProcesses/History | 23 + .../PhotonProcesses/PhotonProcesses.cc | 121 + .../PhotonProcesses/PhotonProcesses.in | 20 + .../electromagnetic/PhotonProcesses/README | 143 + .../PhotonProcesses/allproceses.mac | 20 + .../PhotonProcesses/compton.mac | 29 + .../electromagnetic/PhotonProcesses/conv.mac | 27 + .../PhotonProcesses/convtomu.mac | 28 + .../PhotonProcesses/geant3/README | 44 + .../PhotonProcesses/geant3/allprocesses.dat | 18 + .../PhotonProcesses/geant3/compton.dat | 23 + .../PhotonProcesses/geant3/conv.dat | 21 + .../PhotonProcesses/geant3/gmakeB | 32 + .../PhotonProcesses/geant3/gmakeT | 31 + .../geant3/include/detector.inc | 6 + .../PhotonProcesses/geant3/include/histo.inc | 8 + .../geant3/include/process.inc | 2 + .../PhotonProcesses/geant3/src/ffuser.F | 11 + .../PhotonProcesses/geant3/src/gtgama.F | 267 + .../PhotonProcesses/geant3/src/gukine.F | 40 + .../PhotonProcesses/geant3/src/guout.F | 18 + .../PhotonProcesses/geant3/src/gustep.F | 67 + .../PhotonProcesses/geant3/src/main.F | 61 + .../PhotonProcesses/geant3/src/ugeom.F | 74 + .../PhotonProcesses/geant3/src/uginit.F | 66 + .../PhotonProcesses/geant3/src/uglast.F | 63 + .../PhotonProcesses/geant3/src/uhinit.F | 28 + .../include/DetectorConstruction.hh | 89 + .../include/DetectorMessenger.hh | 69 + .../PhotonProcesses/include/EventAction.hh | 62 + .../include/EventActionMessenger.hh} | 49 +- .../PhotonProcesses/include/HistoManager.hh | 92 + .../PhotonProcesses/include/HistoMessenger.hh | 70 + .../include/PhysListEmStandard.hh | 4 +- .../PhotonProcesses/include/PhysicsList.hh | 67 + .../include/PhysicsListMessenger.hh | 64 + .../include/PrimaryGeneratorAction.hh | 62 + .../PhotonProcesses/include/ProcessesCount.hh | 65 + .../PhotonProcesses/include/RunAction.hh | 76 + .../PhotonProcesses/include/SteppingAction.hh | 57 + .../include/SteppingVerbose.hh | 55 + .../PhotonProcesses/include/VisManager.hh | 68 + .../electromagnetic/PhotonProcesses/phot.mac | 28 + .../src/DetectorConstruction.cc | 201 + .../PhotonProcesses/src/DetectorMessenger.cc | 95 + .../PhotonProcesses/src/EventAction.cc | 86 + .../src/EventActionMessenger.cc | 69 + .../PhotonProcesses/src/HistoManager.cc | 168 + .../PhotonProcesses/src/HistoMessenger.cc | 119 + .../src/PhysListEmStandard.cc | 40 +- .../PhotonProcesses/src/PhysicsList.cc | 117 + .../src/PhysicsListMessenger.cc | 67 + .../src/PrimaryGeneratorAction.cc | 80 + .../PhotonProcesses/src/RunAction.cc | 164 + .../PhotonProcesses/src/SteppingAction.cc | 112 + .../PhotonProcesses/src/SteppingVerbose.cc | 178 + .../PhotonProcesses/src/VisManager.cc | 155 + .../electromagnetic/PhotonProcesses/vis.mac | 32 + .../electromagnetic/TestEm1/GNUmakefile | 12 +- .../extended/electromagnetic/TestEm1/History | 17 +- .../extended/electromagnetic/TestEm1/README | 45 +- .../electromagnetic/TestEm1/TestEm1.out | 30 +- .../extended/electromagnetic/TestEm1/brem.mac | 4 +- .../TestEm1/include/PhysicsList.hh | 6 +- .../TestEm1/include/RunAction.hh | 16 +- .../TestEm1/src/DetectorConstruction.cc | 4 +- .../TestEm1/src/EventAction.cc | 8 +- .../TestEm1/src/G4eBremsstrahlungCMS.cc | 17 +- .../TestEm1/src/PhysListEmStandard.cc | 12 +- .../TestEm1/src/PhysicsList.cc | 134 +- .../electromagnetic/TestEm1/src/RunAction.cc | 29 +- .../TestEm1/src/SteppingAction.cc | 10 +- .../TestEm1/src/TrackingAction.cc | 10 +- .../extended/electromagnetic/TestEm10/README | 43 +- .../electromagnetic/TestEm10/TestEm10.out | 8 +- .../electromagnetic/TestEm2/GNUmakefile | 16 +- .../extended/electromagnetic/TestEm2/History | 24 +- .../extended/electromagnetic/TestEm2/README | 136 +- .../electromagnetic/TestEm2/TestEm2.cc | 14 +- .../electromagnetic/TestEm2/TestEm2.in | 5 +- .../TestEm2/TestEm2.large_N.in | 27 - .../TestEm2/TestEm2.large_N.out | 318 -- .../electromagnetic/TestEm2/TestEm2.out | 160 +- .../TestEm2/include/DecaysBuilder.hh | 71 + .../TestEm2/include/DetectorConstruction.hh | 7 +- .../TestEm2/include/DetectorMessenger.hh | 36 +- .../TestEm2/include/EmAcceptance.hh | 62 + .../TestEm2/include/G4EmHadronBuilder.hh | 64 + .../TestEm2/include/G4EmHadronBuilder52.hh | 64 + .../TestEm2/include/G4EmHighEnergyBuilder.hh | 64 + .../TestEm2/include/G4EmMuonBuilder.hh | 63 + .../TestEm2/include/G4EmMuonBuilder52.hh | 63 + .../TestEm2/include/G4EmQEDBuilder.hh | 64 + .../TestEm2/include/G4EmQEDBuilder52.hh | 64 + .../include/ParticlesBuilder.hh} | 30 +- .../TestEm2/include/PhysicsList.hh | 60 +- .../TestEm2/include/RunAction.hh | 74 +- .../TestEm2/include/RunActionMessenger.hh | 58 + .../TestEm2/include/TrackingAction.hh | 25 +- .../electromagnetic/TestEm2/run01.mac | 13 +- .../src/DecaysBuilder.cc} | 32 +- .../TestEm2/src/DetectorConstruction.cc | 22 +- .../TestEm2/src/DetectorMessenger.cc | 30 +- .../TestEm2/src/EmAcceptance.cc | 78 + .../TestEm2/src/G4EmHadronBuilder.cc | 106 + .../TestEm2/src/G4EmHadronBuilder52.cc | 104 + .../TestEm2/src/G4EmHighEnergyBuilder.cc | 93 + .../TestEm2/src/G4EmMuonBuilder.cc | 105 + .../TestEm2/src/G4EmMuonBuilder52.cc | 105 + .../TestEm2/src/G4EmQEDBuilder.cc | 111 + .../TestEm2/src/G4EmQEDBuilder52.cc | 111 + .../src/ParticlesBuilder.cc} | 27 +- .../TestEm2/src/PhysListEmG4v52.cc | 119 - .../TestEm2/src/PhysListParticles.cc | 141 - .../TestEm2/src/PhysicsList.cc | 142 +- .../electromagnetic/TestEm2/src/RunAction.cc | 286 +- .../TestEm2/src/RunActionMessenger.cc | 77 + .../electromagnetic/TestEm3/GNUmakefile | 11 +- .../extended/electromagnetic/TestEm3/History | 36 +- .../extended/electromagnetic/TestEm3/README | 53 +- .../electromagnetic/TestEm3/TestEm3.cc | 29 +- .../electromagnetic/TestEm3/TestEm3.in | 12 +- .../electromagnetic/TestEm3/TestEm3.out | 34 +- .../extended/electromagnetic/TestEm3/dedx.mac | 31 + .../electromagnetic/TestEm3/geant3/dedx.dat | 20 + .../TestEm3/geant3/include/celoss.inc | 6 +- .../TestEm3/geant3/src/guout.F | 4 +- .../TestEm3/geant3/src/gustep.F | 8 + .../TestEm3/geant3/src/gutrev.F | 1 + .../TestEm3/geant3/src/uginit.F | 2 + .../TestEm3/geant3/src/uglast.F | 21 +- .../TestEm3/include/DetectorConstruction.hh | 39 +- .../TestEm3/include/DetectorMessenger.hh | 12 +- .../include/EmAcceptance.hh} | 43 +- .../TestEm3/include/EventAction.hh | 18 +- .../TestEm3/include/HistoManager.hh | 101 + .../TestEm3/include/HistoMessenger.hh | 70 + .../TestEm3/include/PhysicsList.hh | 7 +- .../TestEm3/include/RunAction.hh | 62 +- .../TestEm3/include/RunActionMessenger.hh | 14 +- .../TestEm3/include/SteppingAction.hh | 8 +- .../TestEm3/include/SteppingVerbose.hh | 6 +- .../electromagnetic/TestEm3/ionC12.mac | 14 +- .../electromagnetic/TestEm3/run01.mac | 8 +- .../electromagnetic/TestEm3/run02.mac | 8 +- .../electromagnetic/TestEm3/run15.mac | 8 +- .../electromagnetic/TestEm3/sicapo3.mac | 4 +- .../TestEm3/src/DetectorConstruction.cc | 23 +- .../TestEm3/src/DetectorMessenger.cc | 16 +- .../TestEm3/src/EmAcceptance.cc | 77 + .../TestEm3/src/EventAction.cc | 40 +- .../TestEm3/src/HistoManager.cc | 159 + .../TestEm3/src/HistoMessenger.cc | 118 + .../TestEm3/src/PhysListEmG4v52.cc | 6 +- .../TestEm3/src/PhysListEmStandard.cc | 4 +- .../TestEm3/src/PhysicsList.cc | 134 +- .../TestEm3/src/PrimaryGeneratorAction.cc | 4 +- .../electromagnetic/TestEm3/src/RunAction.cc | 195 +- .../TestEm3/src/RunActionMessenger.cc | 70 +- .../TestEm3/src/SteppingAction.cc | 8 +- .../electromagnetic/TestEm3/tbhec.mac | 44 +- .../electromagnetic/TestEm4/GNUmakefile | 15 +- .../extended/electromagnetic/TestEm4/History | 14 +- .../extended/electromagnetic/TestEm4/README | 47 +- .../electromagnetic/TestEm4/TestEm4.out | 8 +- .../TestEm4/include/RunAction.hh | 17 +- .../TestEm4/src/EventAction.cc | 18 +- .../electromagnetic/TestEm4/src/RunAction.cc | 27 +- .../electromagnetic/TestEm5/GNUmakefile | 11 +- .../extended/electromagnetic/TestEm5/History | 22 +- .../extended/electromagnetic/TestEm5/README | 51 +- .../electromagnetic/TestEm5/TestEm5.cc | 27 +- .../electromagnetic/TestEm5/TestEm5.in | 9 +- .../electromagnetic/TestEm5/TestEm5.out | 38 +- .../extended/electromagnetic/TestEm5/dedx.mac | 30 + .../TestEm5/include/DetectorConstruction.hh | 7 +- .../TestEm5/include/DetectorMessenger.hh | 7 +- .../TestEm5/include/EventAction.hh | 7 +- .../TestEm5/include/EventMessenger.hh | 7 +- .../TestEm5/include/HistoManager.hh | 54 +- .../TestEm5/include/HistoMessenger.hh | 19 +- .../electromagnetic/TestEm5/include/IonC12.hh | 5 +- .../TestEm5/include/PhysListBinaryCascade.hh | 73 + .../TestEm5/include/PhysListEmG4v52.hh | 5 +- .../TestEm5/include/PhysListEmStandard.hh | 5 +- .../include/PhysListHadronElastic.hh} | 24 +- .../include/PhysListIonBinaryCascade.hh | 77 + .../TestEm5/include/PhysicsList.hh | 50 +- .../TestEm5/include/PhysicsListMessenger.hh | 17 +- .../TestEm5/include/PrimaryGeneratorAction.hh | 7 +- .../include/PrimaryGeneratorMessenger.hh | 7 +- .../TestEm5/include/RunAction.hh | 37 +- .../TestEm5/include/StackingAction.hh | 5 +- .../TestEm5/include/StackingMessenger.hh | 7 +- .../TestEm5/include/StepMax.hh | 6 +- .../TestEm5/include/SteppingAction.hh | 5 +- .../TestEm5/include/SteppingVerbose.hh | 5 +- .../TestEm5/include/TrackingAction.hh | 6 +- .../TestEm5/include/VisManager.hh | 7 +- .../electromagnetic/TestEm5/mumsc.mac | 14 +- .../TestEm5/src/DetectorConstruction.cc | 7 +- .../TestEm5/src/DetectorMessenger.cc | 7 +- .../TestEm5/src/EventAction.cc | 24 +- .../TestEm5/src/EventMessenger.cc | 7 +- .../TestEm5/src/HistoManager.cc | 166 +- .../TestEm5/src/HistoMessenger.cc | 43 +- .../electromagnetic/TestEm5/src/IonC12.cc | 5 +- .../TestEm5/src/PhysListBinaryCascade.cc | 92 + .../TestEm5/src/PhysListEmG4v52.cc | 9 +- .../TestEm5/src/PhysListEmStandard.cc | 5 +- .../src/PhysListHadronElastic.cc} | 39 +- .../TestEm5/src/PhysListIonBinaryCascade.cc | 171 + .../TestEm5/src/PhysicsList.cc | 270 +- .../TestEm5/src/PhysicsListMessenger.cc | 63 +- .../TestEm5/src/PrimaryGeneratorAction.cc | 7 +- .../TestEm5/src/PrimaryGeneratorMessenger.cc | 7 +- .../electromagnetic/TestEm5/src/RunAction.cc | 180 +- .../TestEm5/src/StackingAction.cc | 45 +- .../TestEm5/src/StackingMessenger.cc | 7 +- .../TestEm5/src/SteppingAction.cc | 11 +- .../TestEm5/src/SteppingVerbose.cc | 5 +- .../TestEm5/src/TrackingAction.cc | 75 +- .../electromagnetic/TestEm5/src/VisManager.cc | 8 +- .../electromagnetic/TestEm6/GNUmakefile | 12 +- .../extended/electromagnetic/TestEm6/History | 8 +- .../extended/electromagnetic/TestEm6/README | 55 +- .../electromagnetic/TestEm6/TestEm6.out | 80 +- .../TestEm6/include/RunAction.hh | 16 +- .../electromagnetic/TestEm6/run02.mac | 4 +- .../TestEm6/src/EventAction.cc | 8 +- .../electromagnetic/TestEm6/src/RunAction.cc | 25 +- .../TestEm6/src/SteppingAction.cc | 14 +- .../electromagnetic/TestEm7/GNUmakefile | 10 +- .../extended/electromagnetic/TestEm7/History | 14 +- .../extended/electromagnetic/TestEm7/README | 56 +- .../electromagnetic/TestEm7/TestEm7.in | 4 +- .../electromagnetic/TestEm7/TestEm7.out | 26 +- .../TestEm7/include/PhysListGeneral.hh | 65 - .../TestEm7/include/PhysListParticles.hh | 65 - .../TestEm7/include/PhysicsList.hh | 12 +- .../TestEm7/include/RunAction.hh | 22 +- .../electromagnetic/TestEm7/ionC12.mac | 18 +- .../TestEm7/src/PhysListGeneral.cc | 72 - .../TestEm7/src/PhysicsList.cc | 152 +- .../electromagnetic/TestEm7/src/RunAction.cc | 55 +- .../TestEm7/src/SteppingAction.cc | 10 +- .../extended/electromagnetic/TestEm8/History | 5 +- .../electromagnetic/TestEm8/TestEm8.in | 29 +- .../electromagnetic/TestEm8/TestEm8.out | 158 +- .../include/Em8DetectorConstruction.hh | 144 +- .../TestEm8/include/Em8DetectorMessenger.hh | 10 +- .../{PhysListEmModelP.hh => PhysListEmPAI.hh} | 16 +- .../TestEm8/include/PhysListEmStandard.hh | 6 +- .../TestEm8/src/Em8DetectorConstruction.cc | 320 +- .../TestEm8/src/Em8DetectorMessenger.cc | 115 +- .../TestEm8/src/Em8PrimaryGeneratorAction.cc | 7 +- .../{PhysListEmModelP.cc => PhysListEmPAI.cc} | 121 +- .../TestEm8/src/PhysListEmStandard.cc | 84 +- .../TestEm8/src/PhysListGeneral.cc | 11 +- .../TestEm8/src/PhysicsList.cc | 10 +- .../electromagnetic/TestEm9/GNUmakefile | 6 +- .../extended/electromagnetic/TestEm9/History | 7 +- .../extended/electromagnetic/TestEm9/README | 49 +- .../electromagnetic/TestEm9/TestEm9.in | 15 +- .../electromagnetic/TestEm9/TestEm9.out | 51 +- .../TestEm9/include/DetectorConstruction.hh | 8 +- .../TestEm9/include/DetectorMessenger.hh | 7 +- .../TestEm9/include/EmAcceptance.hh | 62 + .../electromagnetic/TestEm9/include/Histo.hh | 10 +- .../TestEm9/include/HistoManager.hh | 25 +- .../TestEm9/include/HistoMessenger.hh | 8 +- .../TestEm9/src/DetectorConstruction.cc | 21 +- .../TestEm9/src/DetectorMessenger.cc | 42 +- .../TestEm9/src/EmAcceptance.cc | 78 + .../electromagnetic/TestEm9/src/Histo.cc | 32 +- .../TestEm9/src/HistoManager.cc | 140 +- .../TestEm9/src/HistoMessenger.cc | 23 +- .../TestEm9/src/PrimaryGeneratorAction.cc | 9 +- examples/extended/field/BlineTracer/History | 6 +- .../field/BlineTracer/src/G4BlineTracer.cc | 5 +- examples/extended/field/History | 25 + examples/extended/field/field01/field01.out | 46 +- examples/extended/field/field02/field02.out | 4455 ++++++++--------- examples/extended/field/field03/field03.out | 28 +- examples/extended/medical/DICOM/History | 3 + examples/extended/medical/DICOM/README | 4 +- examples/extended/optical/LXe/GNUmakefile | 19 + examples/extended/optical/LXe/History | 20 + examples/extended/optical/LXe/LXe.cc | 107 + examples/extended/optical/LXe/LXe.in | 10 + examples/extended/optical/LXe/LXe.out | 125 + examples/extended/optical/LXe/README | 553 ++ examples/extended/optical/LXe/WALKTHROUGH | 73 + examples/extended/optical/LXe/cerenkov.mac | 35 + examples/extended/optical/LXe/defaults.mac | 6 + .../LXe/include/LXeDetectorConstruction.hh | 146 + .../LXe/include/LXeDetectorMessenger.hh | 69 + .../optical/LXe/include/LXeEMPhysics.hh | 79 + .../optical/LXe/include/LXeEventAction.hh | 74 + .../optical/LXe/include/LXeEventMessenger.hh | 52 + .../LXe/include/LXeGeneralPhysics.hh} | 32 +- .../optical/LXe/include/LXeMainVolume.hh | 102 + .../optical/LXe/include/LXeMuonPhysics.hh | 72 + .../optical/LXe/include/LXeOpPhysMessenger.hh | 50 + .../LXe/include/LXeOpticalPhysics.hh} | 52 +- .../extended/optical/LXe/include/LXePMTHit.hh | 98 + .../extended/optical/LXe/include/LXePMTSD.hh | 76 + .../optical/LXe/include/LXePhysicsList.hh | 47 + .../LXe/include/LXePrimaryGeneratorAction.hh | 48 + .../optical/LXe/include/LXeRunAction.hh | 43 + .../optical/LXe/include/LXeScintHit.hh | 87 + .../optical/LXe/include/LXeScintSD.hh | 52 + .../optical/LXe/include/LXeStackingAction.hh | 42 + .../optical/LXe/include/LXeSteppingAction.hh | 50 + .../LXe/include/LXeSteppingMessenger.hh | 48 + .../optical/LXe/include/LXeSteppingVerbose.hh | 46 + .../optical/LXe/include/LXeTrackingAction.hh | 46 + .../optical/LXe/include/LXeTrajectory.hh | 76 + .../LXe/include/LXeUserEventInformation.hh | 98 + .../LXe/include/LXeUserTrackInformation.hh | 70 + .../optical/LXe/include/LXeVisManager.hh | 44 + .../optical/LXe/include/LXeWLSFiber.hh | 74 + .../optical/LXe/include/LXeWLSSlab.hh | 60 + .../optical/LXe/include/RecorderBase.hh | 87 + examples/extended/optical/LXe/photon.mac | 8 + .../optical/LXe/random/goodCerenkov.rndm | 4 + .../extended/optical/LXe/random/run0.rndm | 4 + examples/extended/optical/LXe/reviewEvent.mac | 6 + .../LXe/src/LXeDetectorConstruction.cc | 359 ++ .../optical/LXe/src/LXeDetectorMessenger.cc | 185 + .../extended/optical/LXe/src/LXeEMPhysics.cc | 111 + .../optical/LXe/src/LXeEventAction.cc | 207 + .../optical/LXe/src/LXeEventMessenger.cc | 92 + .../LXe/src/LXeGeneralPhysics.cc} | 57 +- .../extended/optical/LXe/src/LXeMainVolume.cc | 283 ++ .../optical/LXe/src/LXeMuonPhysics.cc | 96 + .../optical/LXe/src/LXeOpPhysMessenger.cc | 57 + .../optical/LXe/src/LXeOpticalPhysics.cc | 100 + .../extended/optical/LXe/src/LXePMTHit.cc | 94 + examples/extended/optical/LXe/src/LXePMTSD.cc | 138 + .../optical/LXe/src/LXePhysicsList.cc | 74 + .../LXe/src/LXePrimaryGeneratorAction.cc | 57 + .../extended/optical/LXe/src/LXeRunAction.cc | 43 + .../extended/optical/LXe/src/LXeScintHit.cc | 85 + .../extended/optical/LXe/src/LXeScintSD.cc | 99 + .../optical/LXe/src/LXeStackingAction.cc | 81 + .../optical/LXe/src/LXeSteppingAction.cc | 201 + .../optical/LXe/src/LXeSteppingMessenger.cc | 51 + .../optical/LXe/src/LXeSteppingVerbose.cc | 217 + .../optical/LXe/src/LXeTrackingAction.cc | 105 + .../extended/optical/LXe/src/LXeTrajectory.cc | 151 + .../LXe/src/LXeUserEventInformation.cc | 37 + .../LXe/src/LXeUserTrackInformation.cc | 44 + .../extended/optical/LXe/src/LXeVisManager.cc | 137 + .../extended/optical/LXe/src/LXeWLSFiber.cc | 106 + .../extended/optical/LXe/src/LXeWLSSlab.cc | 86 + examples/extended/optical/LXe/vis.mac | 46 + examples/extended/optical/LXe/wls.mac | 7 + examples/extended/optical/README | 13 + examples/extended/parallel/ExDiane/Brachy.cc | 58 + .../extended/parallel/ExDiane/GNUmakefile | 30 + examples/extended/parallel/ExDiane/History | 15 + .../parallel/ExDiane/IodiumSourceMacro.mac | 8 + .../parallel/ExDiane/IridiumSourceMacro.mac | 6 + examples/extended/parallel/ExDiane/README | 94 + .../ExDiane/include/BrachyAnalysisManager.hh | 91 + .../include/BrachyDetectorConstruction.hh | 114 + .../include/BrachyDetectorConstructionI.hh | 94 + .../include/BrachyDetectorConstructionIr.hh | 88 + .../BrachyDetectorConstructionLeipzig.hh | 84 + .../include/BrachyDetectorMessenger.hh | 66 + .../parallel/ExDiane/include/BrachyDummySD.hh | 53 + .../ExDiane/include/BrachyEventAction.hh | 61 + .../parallel/ExDiane/include/BrachyFactory.hh | 68 + .../ExDiane/include/BrachyFactoryI.hh | 70 + .../ExDiane/include/BrachyFactoryIr.hh | 65 + .../ExDiane/include/BrachyFactoryLeipzig.hh | 64 + .../ExDiane/include/BrachyMaterial.hh | 70 + .../ExDiane/include/BrachyPhantomHit.hh | 132 + .../include/BrachyPhantomROGeometry.hh | 60 + .../ExDiane/include/BrachyPhantomSD.hh | 64 + .../ExDiane/include/BrachyPhysicsList.hh | 80 + .../include/BrachyPrimaryGeneratorAction.hh | 56 + .../include/BrachyPrimaryGeneratorActionI.hh | 68 + .../include/BrachyPrimaryGeneratorActionIr.hh | 127 + .../ExDiane/include/BrachyRunAction.hh | 69 + .../ExDiane/include/BrachyRunMessenger.hh | 63 + .../ExDiane/include/BrachySimulation.hh | 63 + .../ExDiane/include/BrachyVisManager.hh | 58 + .../parallel/ExDiane/include/IG4Simulation.h | 34 + examples/extended/parallel/ExDiane/iodium.job | 25 + .../extended/parallel/ExDiane/iridium.job | 23 + .../ExDiane/src/BrachyAnalysisManager.cc | 143 + .../ExDiane/src/BrachyDetectorConstruction.cc | 261 + .../src/BrachyDetectorConstructionI.cc | 187 + .../src/BrachyDetectorConstructionIr.cc | 188 + .../src/BrachyDetectorConstructionLeipzig.cc | 163 + .../ExDiane/src/BrachyDetectorMessenger.cc | 88 + .../parallel/ExDiane/src/BrachyEventAction.cc | 79 + .../parallel/ExDiane/src/BrachyFactory.cc | 43 + .../parallel/ExDiane/src/BrachyFactoryI.cc | 70 + .../parallel/ExDiane/src/BrachyFactoryIr.cc | 72 + .../ExDiane/src/BrachyFactoryLeipzig.cc | 74 + .../parallel/ExDiane/src/BrachyMaterial.cc | 237 + .../parallel/ExDiane/src/BrachyPhantomHit.cc | 91 + .../ExDiane/src/BrachyPhantomROGeometry.cc | 185 + .../parallel/ExDiane/src/BrachyPhantomSD.cc | 120 + .../parallel/ExDiane/src/BrachyPhysicsList.cc | 159 + .../src/BrachyPrimaryGeneratorAction.cc | 58 + .../src/BrachyPrimaryGeneratorActionI.cc | 144 + .../src/BrachyPrimaryGeneratorActionIr.cc | 115 + .../parallel/ExDiane/src/BrachyRunAction.cc | 118 + .../ExDiane/src/BrachyRunMessenger.cc | 73 + .../parallel/ExDiane/src/BrachySimulation.cc | 151 + .../parallel/ExDiane/src/BrachyVisManager.cc | 151 + examples/extended/parallel/ParN02/History | 6 +- .../parallel/ParN02/src/ParRunManager.cc | 14 +- examples/extended/parallel/ParN04/History | 6 +- .../parallel/ParN04/src/ParRunManager.cc | 26 +- examples/extended/parallel/README | 14 + .../extended/parallel/{ => info}/README.html | 0 examples/novice/N01/exampleN01.out | 18 +- examples/novice/N02/History | 8 +- examples/novice/N02/exampleN02.out | 4349 +++++++++++----- .../N02/src/ExN02DetectorConstruction.cc | 6 +- .../novice/N02/src/ExN02DetectorMessenger.cc | 5 +- examples/novice/N02/src/ExN02PhysicsList.cc | 13 +- examples/novice/N03/History | 13 +- examples/novice/N03/exampleN03.cc | 20 +- examples/novice/N03/exampleN03.out | 36 +- examples/novice/N03/src/ExN03PhysicsList.cc | 9 +- examples/novice/N03/visTutor/exN03Vis10.mac | 66 + examples/novice/N03/visTutor/exN03Vis11.mac | 157 + examples/novice/N03/visTutor/exN03Vis9.mac | 101 + examples/novice/N03/visTutor/gui.mac | 21 +- examples/novice/N04/exampleN04.EMtest.out | 26 +- examples/novice/N04/exampleN04.out | 24 +- examples/novice/N05/exampleN05.out | 294 +- examples/novice/N06/History | 54 +- examples/novice/N06/README | 6 +- examples/novice/N06/exampleN06.in | 8 +- examples/novice/N06/exampleN06.out | 1393 ++++-- .../N06/src/ExN06PrimaryGeneratoraction.cc | 6 +- examples/novice/N06/src/ExN06RunAction.cc | 19 +- examples/novice/N07/exampleN07.out | 258 +- source/GNUmakefile | 72 +- source/digits_hits/GNUmakefile | 5 +- source/digits_hits/History | 27 +- source/digits_hits/detector/GNUmakefile | 3 +- source/digits_hits/detector/History | 10 +- .../detector/include/G4SDManager.hh | 6 +- .../detector/include/G4SDStructure.hh | 6 +- .../digits_hits/detector/src/G4SDManager.cc | 8 +- .../digits_hits/detector/src/G4SDStructure.cc | 12 +- source/digits_hits/digits/GNUmakefile | 3 +- .../digits/include/G4DCofThisEvent.hh | 10 +- .../digits/include/G4TDigiCollection.hh | 10 +- .../digits_hits/digits/src/G4DCofThisEvent.cc | 4 +- .../digits/src/G4TDigiCollection.cc | 4 +- source/digits_hits/hits/GNUmakefile | 3 +- .../hits/include/G4HCofThisEvent.hh | 10 +- .../hits/include/G4THitsCollection.hh | 10 +- .../digits_hits/hits/src/G4HCofThisEvent.cc | 4 +- .../digits_hits/hits/src/G4THitsCollection.cc | 4 +- source/event/GNUmakefile | 8 +- source/event/History | 45 +- source/event/include/G4Event.hh | 10 +- source/event/include/G4EventManager.hh | 11 +- .../event/include/G4GeneralParticleSource.hh | 701 +-- .../G4GeneralParticleSourceMessenger.hh | 124 +- source/event/include/G4HEPEvtParticle.hh | 10 +- source/event/include/G4PrimaryParticle.hh | 10 +- source/event/include/G4PrimaryVertex.hh | 10 +- source/event/include/G4SPSAngDistribution.hh | 223 + source/event/include/G4SPSEneDistribution.hh | 251 + source/event/include/G4SPSPosDistribution.hh | 218 + source/event/include/G4SPSRandomGenerator.hh | 187 + .../event/include/G4SingleParticleSource.hh | 184 + source/event/include/G4StackedTrack.hh | 10 +- source/event/include/G4TrajectoryContainer.hh | 11 +- source/event/src/G4Event.cc | 4 +- source/event/src/G4EventManager.cc | 10 +- source/event/src/G4GeneralParticleSource.cc | 3540 +------------ .../src/G4GeneralParticleSourceMessenger.cc | 988 +++- source/event/src/G4HEPEvtParticle.cc | 4 +- source/event/src/G4PrimaryParticle.cc | 4 +- source/event/src/G4PrimaryVertex.cc | 4 +- source/event/src/G4SPSAngDistribution.cc | 607 +++ source/event/src/G4SPSEneDistribution.cc | 1221 +++++ source/event/src/G4SPSPosDistribution.cc | 1019 ++++ source/event/src/G4SPSRandomGenerator.cc | 565 +++ source/event/src/G4SingleParticleSource.cc | 165 + source/event/src/G4StackedTrack.cc | 4 +- source/event/src/G4TrajectoryContainer.cc | 4 +- source/g3tog4/GNUmakefile | 6 +- source/g3tog4/History | 16 +- source/g3tog4/include/G3toG4.hh | 6 +- source/g3tog4/src/G4gsrotm.cc | 12 +- source/g3tog4/src/clparse.cc | 5 +- source/geometry/GNUmakefile | 4 +- source/geometry/History | 14 +- source/geometry/biasing/GNUmakefile | 3 +- source/geometry/divisions/GNUmakefile | 3 +- source/geometry/divisions/History | 14 +- .../divisions/include/G4PVDivision.hh | 10 +- .../divisions/include/G4PVDivisionFactory.hh | 98 + .../include/G4ParameterisationBox.hh | 31 +- .../include/G4ParameterisationCons.hh | 28 +- .../include/G4ParameterisationPara.hh | 27 +- .../include/G4ParameterisationPolycone.hh | 25 +- .../include/G4ParameterisationPolyhedra.hh | 31 +- .../include/G4ParameterisationTrd.hh | 28 +- .../include/G4ParameterisationTubs.hh | 27 +- .../include/G4VDivisionParameterisation.hh | 19 +- .../include/G4VDivisionParameterisation.icc | 7 +- source/geometry/divisions/src/G4PVDivision.cc | 16 +- .../divisions/src/G4PVDivisionFactory.cc | 159 + .../divisions/src/G4ParameterisationBox.cc | 52 +- .../divisions/src/G4ParameterisationCons.cc | 65 +- .../divisions/src/G4ParameterisationPara.cc | 65 +- .../src/G4ParameterisationPolycone.cc | 70 +- .../src/G4ParameterisationPolyhedra.cc | 98 +- .../divisions/src/G4ParameterisationTrd.cc | 80 +- .../divisions/src/G4ParameterisationTubs.cc | 52 +- .../src/G4VDivisionParameterisation.cc | 41 +- source/geometry/management/GNUmakefile | 3 +- source/geometry/management/History | 9 +- .../include/G4ReflectedSolid.hh | 5 +- .../include/G4VPVDivisionFactory.hh | 102 + .../src/G4ReflectedSolid.cc | 4 +- .../management/src/G4VPVDivisionFactory.cc | 59 + source/geometry/navigation/GNUmakefile | 3 +- source/geometry/navigation/History | 25 +- .../navigation/include/G4Navigator.hh | 40 +- source/geometry/navigation/src/G4Navigator.cc | 130 +- .../navigation/src/G4NormalNavigation.cc | 86 +- .../navigation/src/G4VoxelNavigation.cc | 96 +- source/geometry/solids/BREPS/GNUmakefile | 5 +- source/geometry/solids/Boolean/GNUmakefile | 3 +- source/geometry/solids/Boolean/History | 9 +- source/geometry/solids/CSG/GNUmakefile | 3 +- source/geometry/solids/specific/GNUmakefile | 3 +- source/geometry/solids/specific/History | 33 +- .../solids/specific/include/G4FlatSurface.hh | 103 + .../specific/include/G4HyperbolicSurface.hh | 152 + .../specific/include/G4TwistedSurface.hh | 150 + .../solids/specific/include/G4TwistedTubs.hh | 356 ++ .../solids/specific/include/G4VSurface.hh | 337 ++ .../solids/specific/include/G4VSurface.icc | 369 ++ .../solids/specific/src/G4FlatSurface.cc | 482 ++ .../specific/src/G4HyperbolicSurface.cc | 912 ++++ .../solids/specific/src/G4TwistedSurface.cc | 949 ++++ .../solids/specific/src/G4TwistedTubs.cc | 1013 ++++ .../solids/specific/src/G4VSurface.cc | 1021 ++++ source/geometry/volumes/GNUmakefile | 3 +- source/geometry/volumes/History | 25 +- .../volumes/include/G4LogicalBorderSurface.hh | 6 +- .../volumes/include/G4LogicalSkinSurface.hh | 6 +- .../volumes/include/G4NavigationLevel.icc | 10 +- .../volumes/include/G4NavigationLevelRep.icc | 10 +- .../include/G4ReflectionFactory.hh | 39 +- .../volumes/src/G4LogicalBorderSurface.cc | 15 +- .../volumes/src/G4LogicalSkinSurface.cc | 14 +- .../src/G4ReflectionFactory.cc | 241 +- .../volumes/src/G4TouchableHistory.cc | 4 +- source/global/GNUmakefile | 4 +- source/global/HEPGeometry/GNUmakefile | 5 +- source/global/HEPNumerics/GNUmakefile | 3 +- .../HEPNumerics/src/G4DataInterpolation.cc | 35 +- source/global/HEPRandom/GNUmakefile | 4 +- source/global/History | 40 +- source/global/management/GNUmakefile | 4 +- .../global/management/include/G4Allocator.hh | 64 +- source/global/management/include/G4Types.hh | 27 +- source/global/management/include/G4ios.hh | 23 +- .../management/include/G4strstreambuf.hh | 14 +- source/global/management/src/G4ios.cc | 4 +- source/graphics_reps/GNUmakefile | 4 +- source/graphics_reps/History | 21 +- source/graphics_reps/include/G4AttDefStore.hh | 41 +- source/graphics_reps/src/G4AttDefStore.cc | 49 +- source/intercoms/GNUmakefile | 4 +- source/intercoms/History | 14 +- .../intercoms/include/G4UIcmdWith3Vector.hh | 10 +- .../include/G4UIcmdWith3VectorAndUnit.hh | 23 +- source/intercoms/include/G4UIcmdWithABool.hh | 9 +- .../intercoms/include/G4UIcmdWithADouble.hh | 9 +- .../include/G4UIcmdWithADoubleAndUnit.hh | 23 +- .../intercoms/include/G4UIcmdWithAnInteger.hh | 9 +- source/intercoms/include/G4UIcommand.hh | 27 +- source/intercoms/src/G4UIcmdWith3Vector.cc | 20 +- .../src/G4UIcmdWith3VectorAndUnit.cc | 49 +- source/intercoms/src/G4UIcmdWithABool.cc | 18 +- source/intercoms/src/G4UIcmdWithADouble.cc | 18 +- .../src/G4UIcmdWithADoubleAndUnit.cc | 47 +- source/intercoms/src/G4UIcmdWithAnInteger.cc | 18 +- source/intercoms/src/G4UIcommand.cc | 125 +- source/interfaces/GNUmakefile | 7 +- source/interfaces/History | 14 +- source/interfaces/basic/include/G4UIWin32.hh | 6 +- source/interfaces/basic/src/G4UIWin32.cc | 278 +- source/interfaces/common/include/G4Win32.hh | 11 +- source/interfaces/common/src/G4Win32.cc | 98 +- source/materials/History | 10 +- .../include/G4MaterialPropertiesTable.hh | 7 +- source/materials/include/G4SandiaTable.hh | 53 +- .../src/G4MaterialPropertiesTable.cc | 18 +- source/materials/src/G4SandiaTable.cc | 219 +- source/parameterisations/GNUmakefile | 6 +- source/parameterisations/History | 5 +- source/particles/GNUmakefile | 12 +- source/particles/History | 19 +- source/particles/bosons/GNUmakefile | 3 +- source/particles/hadrons/barions/GNUmakefile | 3 +- source/particles/hadrons/ions/GNUmakefile | 3 +- source/particles/hadrons/mesons/GNUmakefile | 3 +- source/particles/leptons/GNUmakefile | 3 +- source/particles/management/GNUmakefile | 3 +- .../management/include/G4DecayProducts.hh | 11 +- .../management/include/G4DynamicParticle.icc | 11 +- .../management/include/G4ElectronOccupancy.hh | 10 +- .../management/src/G4DecayProducts.cc | 4 +- .../management/src/G4DynamicParticle.cc | 5 +- .../management/src/G4ElectronOccupancy.cc | 5 +- source/particles/shortlived/GNUmakefile | 3 +- source/particles/utils/GNUmakefile | 3 +- source/persistency/GNUmakefile | 7 +- source/persistency/History | 3 + source/processes/GNUmakefile | 25 +- source/processes/cuts/History | 14 +- .../cuts/include/G4ProductionCuts.hh | 39 +- .../cuts/include/G4ProductionCutsTable.hh | 14 +- source/processes/cuts/src/G4ProductionCuts.cc | 32 +- .../cuts/src/G4ProductionCutsTable.cc | 329 +- source/processes/decay/History | 5 +- source/processes/decay/src/G4Decay.cc | 16 +- .../electromagnetic/lowenergy/History | 23 +- .../G4PhotoElectricAngularGenerator462.hh | 77 + ...G4PhotoElectricAngularGeneratorStandard.hh | 78 + .../G4VPhotoElectricAngularDistribution.hh | 78 + .../include/G4VhShellCrossSection.hh | 16 +- .../include/G4hLowEnergyIonisation.hh | 4 +- .../lowenergy/include/G4hShellCrossSection.hh | 14 +- .../include/G4hShellCrossSectionExp.hh | 87 + .../include/G4hShellCrossSectionExpData.hh | 154 + .../lowenergy/src/G4PenelopeBremsstrahlung.cc | 42 +- .../lowenergy/src/G4PenelopeIonisation.cc | 16 +- .../src/G4PhotoElectricAngularGenerator462.cc | 76 + ...G4PhotoElectricAngularGeneratorStandard.cc | 112 + .../G4VPhotoElectricAngularDistribution.cc | 63 + .../lowenergy/src/G4eLowEnergyLoss.cc | 8 +- .../lowenergy/src/G4hLowEnergyIonisation.cc | 8 +- .../lowenergy/src/G4hShellCrossSection.cc | 10 + .../lowenergy/src/G4hShellCrossSectionExp.cc | 145 + .../src/G4hShellCrossSectionExpData.cc | 251 + .../processes/electromagnetic/muons/History | 11 +- .../muons/include/G4MuBremsstrahlung.hh | 4 +- .../muons/include/G4MuIonisation.hh | 4 +- .../muons/include/G4MuPairProduction.hh | 6 +- .../muons/include/G4MuPairProductionModel.hh | 16 +- .../muons/src/G4MuIonisation.cc | 15 +- .../muons/src/G4MuPairProductionModel.cc | 77 +- .../electromagnetic/standard/GNUmakefile | 3 +- .../electromagnetic/standard/History | 21 +- .../standard/include/G4AnnihiToMuPair.hh | 4 +- .../include/G4GammaConversionToMuons.hh | 4 +- .../standard/include/G4PAIPhotonModel.hh | 263 + .../standard/include/G4PAIonisation.icc | 160 - .../standard/include/G4PAIxSection.hh | 22 +- .../include/G4SynchrotronRadiation.hh | 88 +- .../standard/include/G4eBremsstrahlung.hh | 4 +- .../standard/include/G4ionIonisation.hh | 9 +- .../standard/src/G4PAIPhotonModel.cc | 1195 +++++ .../standard/src/G4PAIonisation.cc | 160 + .../standard/src/G4PAIxSection.cc | 35 +- .../standard/src/G4SynchrotronRadiation.cc | 93 +- .../standard/src/G4eBremsstrahlungModel.cc | 9 +- .../standard/src/G4hIonisation.cc | 14 +- .../standard/src/G4ionIonisation.cc | 12 +- .../processes/electromagnetic/utils/History | 47 +- .../utils/include/G4BohrFluctuations.hh | 6 +- .../utils/include/G4EmMultiModel.hh | 136 + .../utils/include/G4EmProcessOptions.hh | 11 +- .../utils/include/G4LossTableManager.hh | 48 +- .../utils/include/G4MscModel.hh | 21 +- .../utils/include/G4UniversalFluctuation.hh | 6 +- .../utils/include/G4VEmModel.hh | 12 +- .../utils/include/G4VEmProcess.hh | 141 +- .../utils/include/G4VEnergyLossProcess.hh | 407 +- .../utils/include/G4VMultipleScattering.hh | 9 +- .../utils/src/G4BohrFluctuations.cc | 27 +- .../utils/src/G4EmModelManager.cc | 9 +- .../utils/src/G4EmMultiModel.cc | 293 ++ .../utils/src/G4EmProcessOptions.cc | 65 +- .../utils/src/G4IonFluctuations.cc | 18 +- .../utils/src/G4LossTableManager.cc | 12 +- .../electromagnetic/utils/src/G4MscModel.cc | 153 +- .../utils/src/G4MultipleScattering.cc | 7 +- .../utils/src/G4UniversalFluctuation.cc | 83 +- .../electromagnetic/utils/src/G4VEmProcess.cc | 91 +- .../utils/src/G4VEnergyLossProcess.cc | 307 +- .../utils/src/G4VMultipleScattering.cc | 15 +- source/processes/hadronic/GNUmakefile | 10 +- .../hadronic/cross_sections/GNUmakefile | 3 +- .../include/G4EMDissociationCrossSection.hh | 103 + .../include/G4EMDissociationSpectrum.hh | 79 + .../include/G4GeneralSpaceNNCrossSection.hh | 109 + .../include/G4IonProtonCrossSection.hh | 4 +- .../include/G4PiNuclearCrossSection.hh | 3 +- .../include/G4TripathiLightCrossSection.hh | 101 + .../src/G4EMDissociationCrossSection.cc | 243 + .../src/G4EMDissociationSpectrum.cc | 118 + .../src/G4GeneralSpaceNNCrossSection.cc | 197 + .../src/G4HadronCrossSections.cc | 4 +- .../src/G4PiNuclearCrossSection.cc | 93 +- .../src/G4TripathiCrossSection.cc | 29 +- .../src/G4TripathiLightCrossSection.cc | 307 ++ .../management/include/G4HadronicProcess.hh | 10 + .../management/src/G4HadronicProcess.cc | 97 +- source/processes/hadronic/models/GNUmakefile | 12 +- .../hadronic/models/abrasion/GNUmakefile | 50 + .../include/G4NuclearAbrasionGeometry.hh | 95 + .../abrasion/include/G4WilsonAbrasionModel.hh | 152 + .../abrasion/src/G4NuclearAbrasionGeometry.cc | 227 + .../abrasion/src/G4WilsonAbrasionModel.cc | 813 +++ .../binary_cascade/src/G4BinaryCascade.cc | 118 +- .../src/G4BinaryLightIonReaction.cc | 42 +- .../binary_cascade/src/G4RKPropagation.cc | 12 +- .../cascade/cascade/src/G4CascadeInterface.cc | 20 +- .../body/include/G4QCaptureAtRest.hh | 141 + .../body/include/G4QEnvironment.hh | 16 +- .../body/include/G4QIsotope.hh | 134 + .../body/src/G4QCaptureAtRest.cc | 661 +++ .../body/src/G4QEnvironment.cc | 2728 +++++----- .../body/src/G4QIsotope.cc | 1932 +++++++ .../include/G4DiffElasticHadrNucleus.hh | 125 + .../include/G4ElasticHadrNucleusHE.hh | 181 + .../include/G4HadronValues.hh | 78 + .../include/G4IntegrHadrNucleus.hh | 78 + .../src/G4DiffElasticHadrNucleus.cc | 334 ++ .../src/G4ElasticHadrNucleusHE.cc | 1010 ++++ .../coherent_elastic/src/G4HadronValues.cc | 211 + .../src/G4IntegrHadrNucleus.cc | 223 + .../hadronic/models/de_excitation/GNUmakefile | 2 + .../models/de_excitation/ablation/GNUmakefile | 48 + .../ablation/include/G4WilsonAblationModel.hh | 136 + .../ablation/src/G4WilsonAblationModel.cc | 511 ++ .../include/G4FermiConfigurationList.hh | 19 +- .../fermi_breakup/src/G4FermiSplitter.cc | 60 +- .../photon_evaporation/src/G4E1Probability.cc | 4 +- .../models/em_dissociation/GNUmakefile | 48 + .../include/G4EMDissociation.hh | 99 + .../em_dissociation/src/G4EMDissociation.cc | 449 ++ .../models/general_finalstate/GNUmakefile | 36 - .../include/G4HEAntiKaonZeroInelastic.hh | 18 +- .../include/G4HEAntiLambdaInelastic.hh | 18 +- .../include/G4HEAntiNeutronInelastic.hh | 18 +- .../include/G4HEAntiOmegaMinusInelastic.hh | 18 +- .../include/G4HEAntiProtonInelastic.hh | 18 +- .../include/G4HEAntiSigmaMinusInelastic.hh | 18 +- .../include/G4HEAntiSigmaPlusInelastic.hh | 18 +- .../include/G4HEAntiSigmaZeroInelastic.hh | 18 +- .../include/G4HEAntiXiMinusInelastic.hh | 18 +- .../include/G4HEAntiXiZeroInelastic.hh | 18 +- .../high_energy/include/G4HEInelastic.hh | 17 +- .../include/G4HEKaonMinusInelastic.hh | 18 +- .../include/G4HEKaonPlusInelastic.hh | 18 +- .../include/G4HEKaonZeroInelastic.hh | 18 +- .../include/G4HEKaonZeroLongInelastic.hh | 18 +- .../include/G4HEKaonZeroShortInelastic.hh | 18 +- .../include/G4HELambdaInelastic.hh | 18 +- .../include/G4HENeutronInelastic.hh | 18 +- .../include/G4HEOmegaMinusInelastic.hh | 18 +- .../include/G4HEPionMinusInelastic.hh | 18 +- .../include/G4HEPionPlusInelastic.hh | 18 +- .../include/G4HEProtonInelastic.hh | 18 +- .../include/G4HESigmaMinusInelastic.hh | 18 +- .../include/G4HESigmaPlusInelastic.hh | 18 +- .../include/G4HESigmaZeroInelastic.hh | 18 +- .../models/high_energy/include/G4HEVector.hh | 12 +- .../include/G4HEXiMinusInelastic.hh | 18 +- .../include/G4HEXiZeroInelastic.hh | 18 +- .../models/im_r_matrix/src/G4Scatterer.cc | 84 +- .../models/low_energy/src/G4LElastic.cc | 12 +- .../include/G4HadronicInteraction.hh | 39 +- .../management/src/G4InelasticInteraction.cc | 6 +- .../neutron_hp/include/G4NeutronHPData.hh | 12 +- .../neutron_hp/include/G4NeutronHPFission.hh | 6 +- .../neutron_hp/include/G4NeutronHPGamma.hh | 12 +- .../neutron_hp/include/G4NeutronHPNames.hh | 6 +- .../models/neutron_hp/src/G4NeutronHPData.cc | 8 +- .../neutron_hp/src/G4NeutronHPFissionFS.cc | 312 +- .../models/neutron_hp/src/G4NeutronHPGamma.cc | 9 + .../models/neutron_hp/src/G4NeutronHPNames.cc | 2 + .../src/G4PreCompoundTransitions.cc | 15 +- .../util/include/G4GeneralPhaseSpaceDecay.hh | 15 + .../models/util/include/G4WilsonRadius.hh | 91 + .../models/util/src/G4Fancy3DNucleus.cc | 56 +- .../util/src/G4GeneralPhaseSpaceDecay.cc | 71 +- .../models/util/src/G4KineticTrack.cc | 57 +- .../models/util/src/G4WilsonRadius.cc | 101 + .../hadronic/util/include/G4Bessel.hh | 80 + .../hadronic/util/include/G4Fuzzy.hh | 43 + .../processes/hadronic/util/src/G4Bessel.cc | 350 ++ .../hadronic/util/src/G4HadFinalState.cc | 3 +- source/processes/management/History | 5 +- .../management/src/G4ProcessManager.cc | 67 +- source/processes/optical/History | 10 + .../processes/optical/include/G4OpRayleigh.hh | 8 +- .../optical/src/G4OpBoundaryProcess.cc | 30 +- source/processes/optical/src/G4OpRayleigh.cc | 50 +- source/readout/GNUmakefile | 8 +- source/run/GNUmakefile | 9 +- source/run/History | 22 +- source/run/include/G4Run.hh | 10 +- source/run/include/G4RunManagerKernel.hh | 12 +- source/run/src/G4Run.cc | 4 +- source/run/src/G4RunManagerKernel.cc | 10 +- source/track/GNUmakefile | 7 +- source/track/History | 29 +- source/track/include/G4ParticleChange.hh | 111 +- source/track/include/G4ParticleChange.icc | 252 +- .../track/include/G4ParticleChangeForDecay.hh | 36 +- .../track/include/G4ParticleChangeForLoss.hh | 63 +- .../track/include/G4ParticleChangeForMSC.hh | 81 +- .../track/include/G4ParticleChangeForMSC.icc | 119 +- .../include/G4ParticleChangeForTransport.hh | 29 +- .../include/G4ParticleChangeForTransport.icc | 47 +- source/track/include/G4Track.icc | 14 +- source/track/include/G4VParticleChange.hh | 38 +- source/track/include/G4VParticleChange.icc | 53 +- source/track/src/G4ParticleChange.cc | 8 +- source/track/src/G4ParticleChangeForLoss.cc | 42 +- source/track/src/G4Track.cc | 5 +- source/tracking/GNUmakefile | 8 +- source/tracking/History | 18 +- source/tracking/include/G4SmoothTrajectory.hh | 10 +- .../include/G4SmoothTrajectoryPoint.hh | 13 +- source/tracking/include/G4Trajectory.hh | 10 +- source/tracking/include/G4TrajectoryPoint.hh | 11 +- source/tracking/src/G4SmoothTrajectory.cc | 5 +- .../tracking/src/G4SmoothTrajectoryPoint.cc | 4 +- source/tracking/src/G4Trajectory.cc | 5 +- source/tracking/src/G4TrajectoryPoint.cc | 4 +- .../visualization/FukuiRenderer/GNUmakefile | 9 +- source/visualization/GNUmakefile | 7 +- source/visualization/HepRep/GNUmakefile | 16 +- source/visualization/HepRep/History | 25 +- source/visualization/HepRep/README | 14 +- .../HepRep/include/G4HepRepMessenger.hh | 10 +- .../HepRep/include/G4HepRepSceneHandler.hh | 9 +- .../HepRep/include/G4HepRepViewer.hh | 11 +- .../HepRep/include/HEPREP/HepRep.h | 24 +- .../HepRep/include/HEPREP/HepRepAttribute.h | 27 +- ...orListener.h => HepRepAttributeListener.h} | 16 +- .../HepRep/include/HEPREP/HepRepDefinition.h | 10 +- .../HepRep/include/HEPREP/HepRepFactory.h | 8 + .../include/HEPREP/HepRepFrameListener.h | 34 + .../HepRep/include/HEPREP/HepRepInstance.h | 43 +- .../include/HEPREP/HepRepInstanceTree.h | 20 +- .../HepRep/include/HEPREP/HepRepIterator.h | 33 +- .../HepRep/include/HEPREP/HepRepTreeID.h | 5 +- .../HepRep/include/HEPREP/HepRepType.h | 28 +- .../HepRep/include/HEPREP/HepRepTypeTree.h | 22 +- .../HepRep/include/HEPREP/HepRepWriter.h | 11 +- .../HepRep/include/ref/DefaultHepRep.h | 18 +- .../include/ref/DefaultHepRepAttribute.h | 20 +- .../include/ref/DefaultHepRepDefinition.h | 8 +- .../HepRep/include/ref/DefaultHepRepFactory.h | 1 + .../include/ref/DefaultHepRepInstance.h | 15 +- .../include/ref/DefaultHepRepInstanceTree.h | 14 +- .../HepRep/include/ref/DefaultHepRepTreeID.h | 1 - .../HepRep/include/ref/DefaultHepRepType.h | 10 +- .../include/ref/DefaultHepRepTypeTree.h | 11 +- .../HepRep/include/ref/FreeHepTypes.h | 22 +- .../HepRep/include/ref/XMLHepRepWriter.h | 8 +- .../HepRep/include/zlib/HepRep-zconf.h | 70 +- .../visualization/HepRep/src/DefaultHepRep.cc | 34 +- .../HepRep/src/DefaultHepRepAttribute.cc | 41 +- .../HepRep/src/DefaultHepRepDefinition.cc | 19 +- .../HepRep/src/DefaultHepRepFactory.cc | 4 + .../HepRep/src/DefaultHepRepInstance.cc | 32 +- .../HepRep/src/DefaultHepRepInstanceTree.cc | 24 +- .../HepRep/src/DefaultHepRepTreeID.cc | 5 - .../HepRep/src/DefaultHepRepType.cc | 23 +- .../HepRep/src/DefaultHepRepTypeTree.cc | 23 +- source/visualization/HepRep/src/G4HepRep.cc | 6 +- .../HepRep/src/G4HepRepFileSceneHandler.cc | 8 +- .../HepRep/src/G4HepRepMessenger.cc | 31 +- .../HepRep/src/G4HepRepSceneHandler.cc | 175 +- .../HepRep/src/G4HepRepViewer.cc | 15 +- .../HepRep/src/XMLHepRepWriter.cc | 61 +- source/visualization/History | 29 +- source/visualization/OpenGL/GNUmakefile | 9 +- .../visualization/OpenGL/include/G4OpenGL.hh | 33 + .../OpenGL/include/G4OpenGLSceneHandler.hh | 10 +- .../OpenGL/include/G4OpenGLTransform3D.hh | 9 +- .../OpenGL/include/G4OpenGLXViewer.hh | 6 +- .../OpenGL/src/G4OpenGLImmediateXViewer.cc | 6 +- .../OpenGL/src/G4OpenGLImmediateXm.cc | 6 +- .../OpenGL/src/G4OpenGLImmediateXmViewer.cc | 6 +- .../OpenGL/src/G4OpenGLStoredWin32.cc | 9 +- .../OpenGL/src/G4OpenGLStoredX.cc | 6 +- .../OpenGL/src/G4OpenGLStoredXViewer.cc | 6 +- .../OpenGL/src/G4OpenGLStoredXmViewer.cc | 6 +- .../OpenGL/src/G4OpenGLWin32Viewer.cc | 31 +- .../OpenGL/src/G4OpenGLXViewer.cc | 8 +- .../OpenGL/src/G4OpenGLXmViewer.cc | 8 +- source/visualization/OpenInventor/GNUmakefile | 9 +- source/visualization/OpenInventor/History | 15 +- .../OpenInventor/include/G4OpenInventor.hh | 7 +- .../include/G4OpenInventorSceneHandler.hh | 7 +- .../include/G4OpenInventorSceneHandler.icc | 4 +- .../include/G4OpenInventorTransform3D.hh | 8 +- .../OpenInventor/include/G4OpenInventorWin.hh | 45 + .../include/G4OpenInventorWin32.hh | 14 +- .../include/G4OpenInventorWinViewer.hh | 69 + .../OpenInventor/include/G4OpenInventorX.hh | 14 +- .../OpenInventor/include/G4OpenInventorXt.hh | 47 + ...torViewer.hh => G4OpenInventorXtViewer.hh} | 39 +- .../OpenInventor/include/HEPVis/SbMath.h | 53 + .../HEPVis/nodekits/SoDetectorTreeKit.h | 115 + .../OpenInventor/include/HEPVis/nodes/SoBox.h | 155 + .../include/HEPVis/nodes/SoCons.h | 191 + .../include/HEPVis/nodes/SoTrap.h | 213 + .../OpenInventor/include/HEPVis/nodes/SoTrd.h | 169 + .../include/HEPVis/nodes/SoTubs.h | 180 + .../OpenInventor/src/G4OpenInventor.cc | 45 +- .../src/G4OpenInventorSceneHandler.cc | 33 +- .../src/G4OpenInventorTransform3D.cc | 9 +- ...nInventorWin32.cc => G4OpenInventorWin.cc} | 32 +- .../src/G4OpenInventorWinViewer.cc | 271 + ...G4OpenInventorX.cc => G4OpenInventorXt.cc} | 30 +- ...torViewer.cc => G4OpenInventorXtViewer.cc} | 141 +- .../OpenInventor/src/G4SoWindow.cc | 403 -- .../visualization/OpenInventor/src/SoBox.cc | 273 + .../visualization/OpenInventor/src/SoCons.cc | 436 ++ .../OpenInventor/src/SoDetectorTreeKit.cc | 214 + .../visualization/OpenInventor/src/SoTrap.cc | 403 ++ .../visualization/OpenInventor/src/SoTrd.cc | 339 ++ .../visualization/OpenInventor/src/SoTubs.cc | 462 ++ source/visualization/RayTracer/GNUmakefile | 11 +- source/visualization/RayTracer/History | 6 +- .../RayTracer/include/G4RayTrajectory.hh | 11 +- .../RayTracer/include/G4RayTrajectoryPoint.hh | 10 +- .../RayTracer/src/G4RayTrajectory.cc | 5 +- .../RayTracer/src/G4RayTrajectoryPoint.cc | 5 +- source/visualization/Tree/GNUmakefile | 9 +- source/visualization/VRML/GNUmakefile | 9 +- source/visualization/VRML/History | 6 +- .../VRML/src/G4VRML1FileSceneHandler.cc | 8 +- .../VRML/src/G4VRML2FileSceneHandler.cc | 8 +- source/visualization/XXX/GNUmakefile | 9 +- source/visualization/management/GNUmakefile | 9 +- source/visualization/modeling/GNUmakefile | 8 +- 1415 files changed, 111223 insertions(+), 21207 deletions(-) create mode 100644 ReleaseNotes/ReleaseNotes4.6.2.html create mode 100644 electromagnetic_lists/History create mode 100644 electromagnetic_lists/README rename examples/extended/electromagnetic/TestEm2/src/PhysListGeneral.cc => electromagnetic_lists/standard/DecaysBuilder.cc (78%) mode change 100644 => 100755 create mode 100755 electromagnetic_lists/standard/DecaysBuilder.hh create mode 100755 electromagnetic_lists/standard/G4EmHadronBuilder.cc create mode 100755 electromagnetic_lists/standard/G4EmHadronBuilder.hh create mode 100755 electromagnetic_lists/standard/G4EmHadronBuilder52.cc create mode 100755 electromagnetic_lists/standard/G4EmHadronBuilder52.hh create mode 100755 electromagnetic_lists/standard/G4EmHighEnergyBuilder.cc create mode 100755 electromagnetic_lists/standard/G4EmHighEnergyBuilder.hh create mode 100755 electromagnetic_lists/standard/G4EmMuonBuilder.cc create mode 100755 electromagnetic_lists/standard/G4EmMuonBuilder.hh create mode 100755 electromagnetic_lists/standard/G4EmMuonBuilder52.cc create mode 100755 electromagnetic_lists/standard/G4EmMuonBuilder52.hh create mode 100755 electromagnetic_lists/standard/G4EmQEDBuilder.cc create mode 100755 electromagnetic_lists/standard/G4EmQEDBuilder.hh create mode 100755 electromagnetic_lists/standard/G4EmQEDBuilder52.cc create mode 100755 electromagnetic_lists/standard/G4EmQEDBuilder52.hh rename examples/extended/electromagnetic/TestEm7/src/PhysListParticles.cc => electromagnetic_lists/standard/ParticlesBuilder.cc (87%) mode change 100644 => 100755 rename examples/extended/electromagnetic/TestEm3/include/PhysListParticles.hh => electromagnetic_lists/standard/ParticlesBuilder.hh (77%) mode change 100644 => 100755 create mode 100644 electromagnetic_lists/standard/PhysicsList.cc create mode 100644 electromagnetic_lists/standard/PhysicsList.hh create mode 100644 electromagnetic_lists/standard/PhysicsListMessenger.cc create mode 100644 electromagnetic_lists/standard/PhysicsListMessenger.hh create mode 100755 examples/advanced/Rich/setupAidaPi.csh create mode 100755 examples/advanced/Rich/setupAidaPi.sh delete mode 100644 examples/advanced/Tiara/source/py_modules/liz.py rename examples/advanced/Tiara/source/py_modules/{myLiz.py => myPI.py} (65%) create mode 100644 examples/advanced/cosmicray_charging/CRCharging.cc create mode 100644 examples/advanced/cosmicray_charging/GNUmakefile create mode 100644 examples/advanced/cosmicray_charging/History create mode 100644 examples/advanced/cosmicray_charging/README create mode 100644 examples/advanced/cosmicray_charging/docs/WP500_SUM_ICL_002_v1.0.pdf create mode 100644 examples/advanced/cosmicray_charging/include/LISAAnalysisManager.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISADetectorConstruction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISADetectorMaterials.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAEventAction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAPhysicsList.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAPrimaryGeneratorAction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISARunAction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISARunActionMessenger.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAStackingAction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAStackingActionMessenger.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISASteppingAction.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISASteppingActionMessenger.hh create mode 100644 examples/advanced/cosmicray_charging/include/LISAVisManager.hh create mode 100644 examples/advanced/cosmicray_charging/init.mac create mode 100644 examples/advanced/cosmicray_charging/primaries/helium3_solmin.mac create mode 100644 examples/advanced/cosmicray_charging/primaries/helium4_solmin.mac create mode 100644 examples/advanced/cosmicray_charging/primaries/protons_solmin.mac create mode 100644 examples/advanced/cosmicray_charging/seeds.rndm create mode 100644 examples/advanced/cosmicray_charging/shoot.mac create mode 100644 examples/advanced/cosmicray_charging/src/LISAAnalysisManager.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAColours.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISADetectorConstruction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAElectronicsBoxes.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISAEventAction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAInertialSensor.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISAInterferometerAssembly.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISAPhysicsList.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAPrimaryGeneratorAction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISARunAction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISARunActionMessenger.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAScienceModuleStructures.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISASensorHousing.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISAStackingAction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISAStackingActionMessenger.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISASteppingAction.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISASteppingActionMessenger.cc create mode 100644 examples/advanced/cosmicray_charging/src/LISASupportSystems.icc create mode 100644 examples/advanced/cosmicray_charging/src/LISAVisManager.cc create mode 100644 examples/advanced/gammaray_telescope/History create mode 100755 examples/advanced/hadrontherapy/GNUmakefile create mode 100755 examples/advanced/hadrontherapy/Hadrontherapy.cc create mode 100644 examples/advanced/hadrontherapy/History create mode 100755 examples/advanced/hadrontherapy/README create mode 100755 examples/advanced/hadrontherapy/defaultMacro.mac create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyCalorHit.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyCalorimeterSD.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyDetectorMessenger.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyEventAction.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyHit.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyPhysicsList.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyPrimaryGeneratorAction.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyRunAction.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapySteppingAction.hh create mode 100755 examples/advanced/hadrontherapy/include/HadrontherapyVisManager.hh create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyCalorHit.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyCalorimeterSD.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyDetectorMessenger.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyEventAction.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyHit.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyPhysicsList.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyPrimaryGenerationAction.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyRunAction.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapySteppingAction.cc create mode 100755 examples/advanced/hadrontherapy/src/HadrontherapyVisManager.cc create mode 100755 examples/advanced/hadrontherapy/visualisation.mac create mode 100755 examples/advanced/lAr_calorimeter/setupAidaPi.csh create mode 100755 examples/advanced/lAr_calorimeter/setupAidaPi.sh create mode 100644 examples/advanced/medical_linac/G4History.macro create mode 100644 examples/advanced/medical_linac/GNUmakefile create mode 100644 examples/advanced/medical_linac/History create mode 100644 examples/advanced/medical_linac/MedLinac.cc create mode 100644 examples/advanced/medical_linac/README create mode 100644 examples/advanced/medical_linac/dawnvis.mac create mode 100644 examples/advanced/medical_linac/include/MedLinacAnalysisManager.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacDecorator.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacDetectorConstruction.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacDetectorMessenger.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacDummySD.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacEventAction.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacHead.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPhantomHit.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPhantomROGeometry.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPhantomSD.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPhysicsList.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorAction.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorMessenger.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacRunAction.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacTargetAndFilterDecorator.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacVGeometryComponent.hh create mode 100644 examples/advanced/medical_linac/include/MedLinacVisManager.hh create mode 100644 examples/advanced/medical_linac/macro.mac create mode 100644 examples/advanced/medical_linac/src/MedLinacAnalysisManager.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacDecorator.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacDetectorConstruction.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacDetectorMessenger.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacEventAction.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacHead.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPhantomHit.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPhantomROGeometry.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPhantomSD.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPhysicsList.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorAction.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorMessenger.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacRunAction.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacTargetAndFilterDecorator.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacVGeometryComponent.cc create mode 100644 examples/advanced/medical_linac/src/MedLinacVisManager.cc create mode 100644 examples/advanced/medical_linac/vis.mac create mode 100644 examples/advanced/medical_linac/vrmlvis.mac create mode 100644 examples/advanced/purging_magnet/GNUmakefile create mode 100644 examples/advanced/purging_magnet/History create mode 100644 examples/advanced/purging_magnet/MacroTesting.mac create mode 100644 examples/advanced/purging_magnet/PurgMag.cc create mode 100644 examples/advanced/purging_magnet/PurgMag.pdf create mode 100644 examples/advanced/purging_magnet/PurgMag3D.TABLE create mode 100644 examples/advanced/purging_magnet/README create mode 100644 examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagDetectorConstruction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagEventAction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagPhysicsList.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagPrimaryGeneratorAction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagRunAction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagSteppingAction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagSteppingVerbose.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagTabulatedField3D.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagTrackingAction.hh create mode 100644 examples/advanced/purging_magnet/include/PurgMagVisManager.hh create mode 100644 examples/advanced/purging_magnet/src/PurgMagAnalysisManager.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagDetectorConstruction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagEventAction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagPhysicsList.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagPrimaryGeneratorAction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagRunAction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagSteppingAction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagSteppingVerbose.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagTabulatedField3D.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagTrackingAction.cc create mode 100644 examples/advanced/purging_magnet/src/PurgMagVisManager.cc create mode 100644 examples/advanced/purging_magnet/vis.mac create mode 100644 examples/advanced/radioprotection/GNUmakefile create mode 100644 examples/advanced/radioprotection/History create mode 100644 examples/advanced/radioprotection/README create mode 100644 examples/advanced/radioprotection/gcrZ=1.txt create mode 100644 examples/advanced/radioprotection/gcrZ=14.txt create mode 100644 examples/advanced/radioprotection/gcrZ=2.txt create mode 100644 examples/advanced/radioprotection/gcrZ=26.txt create mode 100644 examples/advanced/radioprotection/gcrZ=6.txt create mode 100644 examples/advanced/radioprotection/gcrZ=8.txt create mode 100644 examples/advanced/radioprotection/include/G4IonC12.hh create mode 100644 examples/advanced/radioprotection/include/G4IonFe52.hh create mode 100644 examples/advanced/radioprotection/include/G4IonO16.hh create mode 100644 examples/advanced/radioprotection/include/G4IonSi28.hh create mode 100644 examples/advanced/radioprotection/include/RemSimAnalysisManager.hh create mode 100644 examples/advanced/radioprotection/include/RemSimAstronautDecorator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimBasicGenerator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimDecay.hh create mode 100644 examples/advanced/radioprotection/include/RemSimDecorator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimDetectorConstruction.hh create mode 100644 examples/advanced/radioprotection/include/RemSimDetectorMessenger.hh create mode 100644 examples/advanced/radioprotection/include/RemSimDummySD.hh create mode 100644 examples/advanced/radioprotection/include/RemSimElectronEEDL.hh rename source/visualization/OpenInventor/include/G4SoWindow.hh => examples/advanced/radioprotection/include/RemSimEventAction.hh (66%) create mode 100644 examples/advanced/radioprotection/include/RemSimHadronicPhysics.hh create mode 100644 examples/advanced/radioprotection/include/RemSimHit.hh create mode 100644 examples/advanced/radioprotection/include/RemSimInterplanetarySpaceConfiguration.hh create mode 100644 examples/advanced/radioprotection/include/RemSimIonICRU.hh create mode 100644 examples/advanced/radioprotection/include/RemSimIonStandard.hh create mode 100644 examples/advanced/radioprotection/include/RemSimMaterial.hh create mode 100644 examples/advanced/radioprotection/include/RemSimMoonHabitat.hh create mode 100644 examples/advanced/radioprotection/include/RemSimMuonStandard.hh create mode 100644 examples/advanced/radioprotection/include/RemSimParticles.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPhotonEPDL.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPhysicsList.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPhysicsListMessenger.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPositronStandard.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPrimaryGeneratorAction.hh create mode 100644 examples/advanced/radioprotection/include/RemSimPrimaryGeneratorMessenger.hh create mode 100644 examples/advanced/radioprotection/include/RemSimROGeometry.hh create mode 100644 examples/advanced/radioprotection/include/RemSimRoofDecorator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimRunAction.hh create mode 100644 examples/advanced/radioprotection/include/RemSimRunMessenger.hh create mode 100644 examples/advanced/radioprotection/include/RemSimSensitiveDetector.hh create mode 100644 examples/advanced/radioprotection/include/RemSimShelterSPEDecorator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimShieldingDecorator.hh create mode 100644 examples/advanced/radioprotection/include/RemSimSteppingAction.hh create mode 100644 examples/advanced/radioprotection/include/RemSimSteppingActionMessenger.hh create mode 100644 examples/advanced/radioprotection/include/RemSimVGeometryComponent.hh create mode 100644 examples/advanced/radioprotection/include/RemSimVPrimaryGeneratorFactory.hh create mode 100644 examples/advanced/radioprotection/include/RemSimVehicle1.hh create mode 100644 examples/advanced/radioprotection/include/RemSimVisManager.hh create mode 100644 examples/advanced/radioprotection/moon.mac create mode 100644 examples/advanced/radioprotection/remsim.cc create mode 100644 examples/advanced/radioprotection/speZ=1.txt create mode 100644 examples/advanced/radioprotection/speZ=2.txt create mode 100644 examples/advanced/radioprotection/src/G4IonC12.cc create mode 100644 examples/advanced/radioprotection/src/G4IonFe52.cc create mode 100644 examples/advanced/radioprotection/src/G4IonO16.cc create mode 100644 examples/advanced/radioprotection/src/G4IonSi28.cc create mode 100644 examples/advanced/radioprotection/src/RemSimAnalysisManager.cc create mode 100644 examples/advanced/radioprotection/src/RemSimAstronautDecorator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimBasicGenerator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimDecay.cc create mode 100644 examples/advanced/radioprotection/src/RemSimDecorator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimDetectorConstruction.cc create mode 100644 examples/advanced/radioprotection/src/RemSimDetectorMessenger.cc create mode 100644 examples/advanced/radioprotection/src/RemSimElectronEEDL.cc create mode 100644 examples/advanced/radioprotection/src/RemSimEventAction.cc create mode 100644 examples/advanced/radioprotection/src/RemSimHadronicPhysics.cc create mode 100644 examples/advanced/radioprotection/src/RemSimHit.cc create mode 100644 examples/advanced/radioprotection/src/RemSimInterplanetarySpaceConfiguration.cc create mode 100644 examples/advanced/radioprotection/src/RemSimIonICRU.cc create mode 100644 examples/advanced/radioprotection/src/RemSimIonStandard.cc create mode 100644 examples/advanced/radioprotection/src/RemSimMaterial.cc create mode 100644 examples/advanced/radioprotection/src/RemSimMoonHabitat.cc create mode 100644 examples/advanced/radioprotection/src/RemSimMuonStandard.cc rename examples/{extended/electromagnetic/TestEm1/src/PhysListParticles.cc => advanced/radioprotection/src/RemSimParticles.cc} (52%) create mode 100644 examples/advanced/radioprotection/src/RemSimPhotonEPDL.cc create mode 100644 examples/advanced/radioprotection/src/RemSimPhysicsList.cc create mode 100644 examples/advanced/radioprotection/src/RemSimPhysicsListMessenger.cc create mode 100644 examples/advanced/radioprotection/src/RemSimPositronStandard.cc create mode 100644 examples/advanced/radioprotection/src/RemSimPrimaryGeneratorAction.cc create mode 100644 examples/advanced/radioprotection/src/RemSimPrimaryGeneratorMessenger.cc create mode 100644 examples/advanced/radioprotection/src/RemSimROGeometry.cc create mode 100644 examples/advanced/radioprotection/src/RemSimRoofDecorator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimRunAction.cc create mode 100644 examples/advanced/radioprotection/src/RemSimRunMessenger.cc create mode 100644 examples/advanced/radioprotection/src/RemSimSensitiveDetector.cc create mode 100644 examples/advanced/radioprotection/src/RemSimShelterSPEDecorator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimShieldingDecorator.cc create mode 100644 examples/advanced/radioprotection/src/RemSimSteppingAction.cc create mode 100644 examples/advanced/radioprotection/src/RemSimSteppingActionMessenger.cc create mode 100644 examples/advanced/radioprotection/src/RemSimVGeometryComponent.cc create mode 100644 examples/advanced/radioprotection/src/RemSimVPrimaryGeneratorFactory.cc create mode 100644 examples/advanced/radioprotection/src/RemSimVehicle1.cc create mode 100755 examples/advanced/radioprotection/src/RemSimVisManager.cc create mode 100644 examples/advanced/radioprotection/vehicle1.mac create mode 100644 examples/advanced/radioprotection/vehicle2.mac create mode 100644 examples/advanced/radioprotection/vis.mac delete mode 100644 examples/advanced/underground_physics/DMX.py create mode 100644 examples/advanced/xray_fluorescence/anaphe.gmk create mode 100644 examples/advanced/xray_fluorescence/macroTest.mac create mode 100644 examples/advanced/xray_fluorescence/testhbk.xml create mode 100644 examples/advanced/xray_fluorescence/xrayfluo.xml delete mode 100644 examples/extended/biasing/B02/B02plot.py create mode 100644 examples/extended/biasing/B02/History delete mode 100755 examples/extended/biasing/B02/setupAnaphe.csh create mode 100755 examples/extended/biasing/B02/setupPI.csh create mode 100644 examples/extended/biasing/B03/History create mode 100644 examples/extended/biasing/B03/setupPI.csh create mode 100644 examples/extended/electromagnetic/MuonProcesses/GNUmakefile create mode 100644 examples/extended/electromagnetic/MuonProcesses/History create mode 100644 examples/extended/electromagnetic/MuonProcesses/MuonProcesses.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/MuonProcesses.in create mode 100644 examples/extended/electromagnetic/MuonProcesses/README create mode 100644 examples/extended/electromagnetic/MuonProcesses/allproc.mac create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/DetectorConstruction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/DetectorMessenger.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/EventAction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/EventActionMessenger.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/HistoManager.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/HistoMessenger.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/MuCrossSections.hh rename examples/extended/electromagnetic/{TestEm2 => MuonProcesses}/include/PhysListEmG4v52.hh (95%) rename examples/extended/electromagnetic/{TestEm2/include/PhysListGeneral.hh => MuonProcesses/include/PhysListEmStandard.hh} (87%) create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/PhysicsList.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/PhysicsListMessenger.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/PrimaryGeneratorAction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/ProcessesCount.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/RunAction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/StackingAction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/SteppingAction.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/SteppingVerbose.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/include/VisManager.hh create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/DetectorConstruction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/DetectorMessenger.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/EventAction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/EventActionMessenger.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/HistoManager.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/HistoMessenger.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/MuCrossSections.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/PhysListEmG4v52.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/PhysListEmStandard.cc rename examples/extended/electromagnetic/{TestEm5/src/PhysListParticles.cc => MuonProcesses/src/PhysicsList.cc} (56%) create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/PhysicsListMessenger.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/PrimaryGeneratorAction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/RunAction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/StackingAction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/SteppingAction.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/src/SteppingVerbose.cc create mode 100755 examples/extended/electromagnetic/MuonProcesses/src/VisManager.cc create mode 100644 examples/extended/electromagnetic/MuonProcesses/vis.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/GNUmakefile create mode 100644 examples/extended/electromagnetic/PhotonProcesses/History create mode 100644 examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.in create mode 100644 examples/extended/electromagnetic/PhotonProcesses/README create mode 100644 examples/extended/electromagnetic/PhotonProcesses/allproceses.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/compton.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/conv.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/convtomu.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/README create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/allprocesses.dat create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/compton.dat create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/conv.dat create mode 100755 examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeB create mode 100755 examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeT create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/include/detector.inc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/include/histo.inc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/include/process.inc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/ffuser.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/gtgama.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/gukine.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/guout.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/gustep.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/main.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/ugeom.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/uginit.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/uglast.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/geant3/src/uhinit.F create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/DetectorConstruction.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/DetectorMessenger.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/EventAction.hh rename examples/extended/electromagnetic/{TestEm1/include/PhysListParticles.hh => PhotonProcesses/include/EventActionMessenger.hh} (75%) create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/HistoManager.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/HistoMessenger.hh rename examples/extended/electromagnetic/{TestEm2 => PhotonProcesses}/include/PhysListEmStandard.hh (95%) create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/PhysicsList.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/PhysicsListMessenger.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/PrimaryGeneratorAction.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/ProcessesCount.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/RunAction.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/SteppingAction.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/SteppingVerbose.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/include/VisManager.hh create mode 100644 examples/extended/electromagnetic/PhotonProcesses/phot.mac create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/DetectorConstruction.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/DetectorMessenger.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/EventAction.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/EventActionMessenger.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/HistoManager.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/HistoMessenger.cc rename examples/extended/electromagnetic/{TestEm2 => PhotonProcesses}/src/PhysListEmStandard.cc (75%) create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/PhysicsList.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/PhysicsListMessenger.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/PrimaryGeneratorAction.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/RunAction.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/SteppingAction.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/src/SteppingVerbose.cc create mode 100755 examples/extended/electromagnetic/PhotonProcesses/src/VisManager.cc create mode 100644 examples/extended/electromagnetic/PhotonProcesses/vis.mac delete mode 100644 examples/extended/electromagnetic/TestEm2/TestEm2.large_N.in delete mode 100644 examples/extended/electromagnetic/TestEm2/TestEm2.large_N.out create mode 100755 examples/extended/electromagnetic/TestEm2/include/DecaysBuilder.hh create mode 100644 examples/extended/electromagnetic/TestEm2/include/EmAcceptance.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder52.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmHighEnergyBuilder.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder52.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder.hh create mode 100755 examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder52.hh rename examples/extended/electromagnetic/{TestEm5/include/PhysListParticles.hh => TestEm2/include/ParticlesBuilder.hh} (77%) mode change 100644 => 100755 create mode 100644 examples/extended/electromagnetic/TestEm2/include/RunActionMessenger.hh rename examples/extended/electromagnetic/{TestEm3/src/PhysListGeneral.cc => TestEm2/src/DecaysBuilder.cc} (78%) mode change 100644 => 100755 create mode 100644 examples/extended/electromagnetic/TestEm2/src/EmAcceptance.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder52.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmHighEnergyBuilder.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder52.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder.cc create mode 100755 examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder52.cc rename examples/extended/electromagnetic/{TestEm3/src/PhysListParticles.cc => TestEm2/src/ParticlesBuilder.cc} (87%) mode change 100644 => 100755 delete mode 100644 examples/extended/electromagnetic/TestEm2/src/PhysListEmG4v52.cc delete mode 100644 examples/extended/electromagnetic/TestEm2/src/PhysListParticles.cc create mode 100644 examples/extended/electromagnetic/TestEm2/src/RunActionMessenger.cc create mode 100644 examples/extended/electromagnetic/TestEm3/dedx.mac create mode 100644 examples/extended/electromagnetic/TestEm3/geant3/dedx.dat rename examples/extended/electromagnetic/{TestEm2/include/PhysListParticles.hh => TestEm3/include/EmAcceptance.hh} (75%) create mode 100644 examples/extended/electromagnetic/TestEm3/include/HistoManager.hh create mode 100644 examples/extended/electromagnetic/TestEm3/include/HistoMessenger.hh create mode 100644 examples/extended/electromagnetic/TestEm3/src/EmAcceptance.cc create mode 100644 examples/extended/electromagnetic/TestEm3/src/HistoManager.cc create mode 100644 examples/extended/electromagnetic/TestEm3/src/HistoMessenger.cc create mode 100644 examples/extended/electromagnetic/TestEm5/dedx.mac create mode 100644 examples/extended/electromagnetic/TestEm5/include/PhysListBinaryCascade.hh rename examples/extended/electromagnetic/{TestEm1/include/PhysListGeneral.hh => TestEm5/include/PhysListHadronElastic.hh} (75%) create mode 100644 examples/extended/electromagnetic/TestEm5/include/PhysListIonBinaryCascade.hh create mode 100644 examples/extended/electromagnetic/TestEm5/src/PhysListBinaryCascade.cc rename examples/extended/electromagnetic/{TestEm1/src/PhysListGeneral.cc => TestEm5/src/PhysListHadronElastic.cc} (73%) create mode 100644 examples/extended/electromagnetic/TestEm5/src/PhysListIonBinaryCascade.cc delete mode 100644 examples/extended/electromagnetic/TestEm7/include/PhysListGeneral.hh delete mode 100644 examples/extended/electromagnetic/TestEm7/include/PhysListParticles.hh delete mode 100644 examples/extended/electromagnetic/TestEm7/src/PhysListGeneral.cc rename examples/extended/electromagnetic/TestEm8/include/{PhysListEmModelP.hh => PhysListEmPAI.hh} (85%) rename examples/extended/electromagnetic/TestEm8/src/{PhysListEmModelP.cc => PhysListEmPAI.cc} (54%) create mode 100644 examples/extended/electromagnetic/TestEm9/include/EmAcceptance.hh create mode 100644 examples/extended/electromagnetic/TestEm9/src/EmAcceptance.cc create mode 100644 examples/extended/field/History create mode 100644 examples/extended/optical/LXe/GNUmakefile create mode 100644 examples/extended/optical/LXe/History create mode 100644 examples/extended/optical/LXe/LXe.cc create mode 100644 examples/extended/optical/LXe/LXe.in create mode 100644 examples/extended/optical/LXe/LXe.out create mode 100644 examples/extended/optical/LXe/README create mode 100644 examples/extended/optical/LXe/WALKTHROUGH create mode 100644 examples/extended/optical/LXe/cerenkov.mac create mode 100644 examples/extended/optical/LXe/defaults.mac create mode 100644 examples/extended/optical/LXe/include/LXeDetectorConstruction.hh create mode 100644 examples/extended/optical/LXe/include/LXeDetectorMessenger.hh create mode 100644 examples/extended/optical/LXe/include/LXeEMPhysics.hh create mode 100644 examples/extended/optical/LXe/include/LXeEventAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeEventMessenger.hh rename examples/extended/{electromagnetic/TestEm5/include/PhysListGeneral.hh => optical/LXe/include/LXeGeneralPhysics.hh} (70%) create mode 100644 examples/extended/optical/LXe/include/LXeMainVolume.hh create mode 100644 examples/extended/optical/LXe/include/LXeMuonPhysics.hh create mode 100644 examples/extended/optical/LXe/include/LXeOpPhysMessenger.hh rename examples/extended/{electromagnetic/TestEm3/include/PhysListGeneral.hh => optical/LXe/include/LXeOpticalPhysics.hh} (66%) create mode 100644 examples/extended/optical/LXe/include/LXePMTHit.hh create mode 100644 examples/extended/optical/LXe/include/LXePMTSD.hh create mode 100644 examples/extended/optical/LXe/include/LXePhysicsList.hh create mode 100644 examples/extended/optical/LXe/include/LXePrimaryGeneratorAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeRunAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeScintHit.hh create mode 100644 examples/extended/optical/LXe/include/LXeScintSD.hh create mode 100644 examples/extended/optical/LXe/include/LXeStackingAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeSteppingAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeSteppingMessenger.hh create mode 100644 examples/extended/optical/LXe/include/LXeSteppingVerbose.hh create mode 100644 examples/extended/optical/LXe/include/LXeTrackingAction.hh create mode 100644 examples/extended/optical/LXe/include/LXeTrajectory.hh create mode 100644 examples/extended/optical/LXe/include/LXeUserEventInformation.hh create mode 100644 examples/extended/optical/LXe/include/LXeUserTrackInformation.hh create mode 100644 examples/extended/optical/LXe/include/LXeVisManager.hh create mode 100644 examples/extended/optical/LXe/include/LXeWLSFiber.hh create mode 100644 examples/extended/optical/LXe/include/LXeWLSSlab.hh create mode 100644 examples/extended/optical/LXe/include/RecorderBase.hh create mode 100644 examples/extended/optical/LXe/photon.mac create mode 100644 examples/extended/optical/LXe/random/goodCerenkov.rndm create mode 100644 examples/extended/optical/LXe/random/run0.rndm create mode 100644 examples/extended/optical/LXe/reviewEvent.mac create mode 100644 examples/extended/optical/LXe/src/LXeDetectorConstruction.cc create mode 100644 examples/extended/optical/LXe/src/LXeDetectorMessenger.cc create mode 100644 examples/extended/optical/LXe/src/LXeEMPhysics.cc create mode 100644 examples/extended/optical/LXe/src/LXeEventAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeEventMessenger.cc rename examples/extended/{electromagnetic/TestEm5/src/PhysListGeneral.cc => optical/LXe/src/LXeGeneralPhysics.cc} (69%) create mode 100644 examples/extended/optical/LXe/src/LXeMainVolume.cc create mode 100644 examples/extended/optical/LXe/src/LXeMuonPhysics.cc create mode 100644 examples/extended/optical/LXe/src/LXeOpPhysMessenger.cc create mode 100644 examples/extended/optical/LXe/src/LXeOpticalPhysics.cc create mode 100644 examples/extended/optical/LXe/src/LXePMTHit.cc create mode 100644 examples/extended/optical/LXe/src/LXePMTSD.cc create mode 100644 examples/extended/optical/LXe/src/LXePhysicsList.cc create mode 100644 examples/extended/optical/LXe/src/LXePrimaryGeneratorAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeRunAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeScintHit.cc create mode 100644 examples/extended/optical/LXe/src/LXeScintSD.cc create mode 100644 examples/extended/optical/LXe/src/LXeStackingAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeSteppingAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeSteppingMessenger.cc create mode 100644 examples/extended/optical/LXe/src/LXeSteppingVerbose.cc create mode 100644 examples/extended/optical/LXe/src/LXeTrackingAction.cc create mode 100644 examples/extended/optical/LXe/src/LXeTrajectory.cc create mode 100644 examples/extended/optical/LXe/src/LXeUserEventInformation.cc create mode 100644 examples/extended/optical/LXe/src/LXeUserTrackInformation.cc create mode 100755 examples/extended/optical/LXe/src/LXeVisManager.cc create mode 100644 examples/extended/optical/LXe/src/LXeWLSFiber.cc create mode 100644 examples/extended/optical/LXe/src/LXeWLSSlab.cc create mode 100644 examples/extended/optical/LXe/vis.mac create mode 100644 examples/extended/optical/LXe/wls.mac create mode 100644 examples/extended/optical/README create mode 100644 examples/extended/parallel/ExDiane/Brachy.cc create mode 100644 examples/extended/parallel/ExDiane/GNUmakefile create mode 100644 examples/extended/parallel/ExDiane/History create mode 100644 examples/extended/parallel/ExDiane/IodiumSourceMacro.mac create mode 100644 examples/extended/parallel/ExDiane/IridiumSourceMacro.mac create mode 100644 examples/extended/parallel/ExDiane/README create mode 100644 examples/extended/parallel/ExDiane/include/BrachyAnalysisManager.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDetectorConstruction.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionI.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionIr.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionLeipzig.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDetectorMessenger.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyDummySD.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyEventAction.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyFactory.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyFactoryI.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyFactoryIr.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyFactoryLeipzig.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyMaterial.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPhantomHit.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPhantomROGeometry.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPhantomSD.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPhysicsList.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorAction.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionI.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionIr.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyRunAction.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyRunMessenger.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachySimulation.hh create mode 100644 examples/extended/parallel/ExDiane/include/BrachyVisManager.hh create mode 100644 examples/extended/parallel/ExDiane/include/IG4Simulation.h create mode 100644 examples/extended/parallel/ExDiane/iodium.job create mode 100644 examples/extended/parallel/ExDiane/iridium.job create mode 100644 examples/extended/parallel/ExDiane/src/BrachyAnalysisManager.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyDetectorConstruction.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionI.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionIr.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionLeipzig.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyDetectorMessenger.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyEventAction.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyFactory.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyFactoryI.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyFactoryIr.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyFactoryLeipzig.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyMaterial.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPhantomHit.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPhantomROGeometry.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPhantomSD.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPhysicsList.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorAction.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionI.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionIr.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyRunAction.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyRunMessenger.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachySimulation.cc create mode 100644 examples/extended/parallel/ExDiane/src/BrachyVisManager.cc create mode 100644 examples/extended/parallel/README rename examples/extended/parallel/{ => info}/README.html (100%) create mode 100644 examples/novice/N03/visTutor/exN03Vis10.mac create mode 100644 examples/novice/N03/visTutor/exN03Vis11.mac create mode 100644 examples/novice/N03/visTutor/exN03Vis9.mac create mode 100644 source/event/include/G4SPSAngDistribution.hh create mode 100644 source/event/include/G4SPSEneDistribution.hh create mode 100644 source/event/include/G4SPSPosDistribution.hh create mode 100644 source/event/include/G4SPSRandomGenerator.hh create mode 100644 source/event/include/G4SingleParticleSource.hh create mode 100644 source/event/src/G4SPSAngDistribution.cc create mode 100644 source/event/src/G4SPSEneDistribution.cc create mode 100644 source/event/src/G4SPSPosDistribution.cc create mode 100644 source/event/src/G4SPSRandomGenerator.cc create mode 100644 source/event/src/G4SingleParticleSource.cc create mode 100644 source/geometry/divisions/include/G4PVDivisionFactory.hh create mode 100644 source/geometry/divisions/src/G4PVDivisionFactory.cc rename source/geometry/{solids/Boolean => management}/include/G4ReflectedSolid.hh (98%) create mode 100644 source/geometry/management/include/G4VPVDivisionFactory.hh rename source/geometry/{solids/Boolean => management}/src/G4ReflectedSolid.cc (99%) create mode 100644 source/geometry/management/src/G4VPVDivisionFactory.cc create mode 100644 source/geometry/solids/specific/include/G4FlatSurface.hh create mode 100644 source/geometry/solids/specific/include/G4HyperbolicSurface.hh create mode 100644 source/geometry/solids/specific/include/G4TwistedSurface.hh create mode 100644 source/geometry/solids/specific/include/G4TwistedTubs.hh create mode 100644 source/geometry/solids/specific/include/G4VSurface.hh create mode 100644 source/geometry/solids/specific/include/G4VSurface.icc create mode 100644 source/geometry/solids/specific/src/G4FlatSurface.cc create mode 100644 source/geometry/solids/specific/src/G4HyperbolicSurface.cc create mode 100644 source/geometry/solids/specific/src/G4TwistedSurface.cc create mode 100644 source/geometry/solids/specific/src/G4TwistedTubs.cc create mode 100644 source/geometry/solids/specific/src/G4VSurface.cc rename source/geometry/{solids/Boolean => volumes}/include/G4ReflectionFactory.hh (82%) rename source/geometry/{solids/Boolean => volumes}/src/G4ReflectionFactory.cc (71%) create mode 100644 source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGenerator462.hh create mode 100644 source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGeneratorStandard.hh create mode 100644 source/processes/electromagnetic/lowenergy/include/G4VPhotoElectricAngularDistribution.hh create mode 100644 source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExp.hh create mode 100644 source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExpData.hh create mode 100644 source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGenerator462.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGeneratorStandard.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4VPhotoElectricAngularDistribution.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExp.cc create mode 100644 source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExpData.cc create mode 100644 source/processes/electromagnetic/standard/include/G4PAIPhotonModel.hh create mode 100644 source/processes/electromagnetic/standard/src/G4PAIPhotonModel.cc create mode 100644 source/processes/electromagnetic/utils/include/G4EmMultiModel.hh create mode 100644 source/processes/electromagnetic/utils/src/G4EmMultiModel.cc create mode 100644 source/processes/hadronic/cross_sections/include/G4EMDissociationCrossSection.hh create mode 100644 source/processes/hadronic/cross_sections/include/G4EMDissociationSpectrum.hh create mode 100644 source/processes/hadronic/cross_sections/include/G4GeneralSpaceNNCrossSection.hh create mode 100644 source/processes/hadronic/cross_sections/include/G4TripathiLightCrossSection.hh create mode 100644 source/processes/hadronic/cross_sections/src/G4EMDissociationCrossSection.cc create mode 100644 source/processes/hadronic/cross_sections/src/G4EMDissociationSpectrum.cc create mode 100644 source/processes/hadronic/cross_sections/src/G4GeneralSpaceNNCrossSection.cc create mode 100644 source/processes/hadronic/cross_sections/src/G4TripathiLightCrossSection.cc create mode 100644 source/processes/hadronic/models/abrasion/GNUmakefile create mode 100644 source/processes/hadronic/models/abrasion/include/G4NuclearAbrasionGeometry.hh create mode 100644 source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh create mode 100644 source/processes/hadronic/models/abrasion/src/G4NuclearAbrasionGeometry.cc create mode 100644 source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc create mode 100644 source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QCaptureAtRest.hh create mode 100644 source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QIsotope.hh create mode 100644 source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QCaptureAtRest.cc create mode 100644 source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QIsotope.cc create mode 100644 source/processes/hadronic/models/coherent_elastic/include/G4DiffElasticHadrNucleus.hh create mode 100644 source/processes/hadronic/models/coherent_elastic/include/G4ElasticHadrNucleusHE.hh create mode 100644 source/processes/hadronic/models/coherent_elastic/include/G4HadronValues.hh create mode 100644 source/processes/hadronic/models/coherent_elastic/include/G4IntegrHadrNucleus.hh create mode 100644 source/processes/hadronic/models/coherent_elastic/src/G4DiffElasticHadrNucleus.cc create mode 100644 source/processes/hadronic/models/coherent_elastic/src/G4ElasticHadrNucleusHE.cc create mode 100644 source/processes/hadronic/models/coherent_elastic/src/G4HadronValues.cc create mode 100644 source/processes/hadronic/models/coherent_elastic/src/G4IntegrHadrNucleus.cc create mode 100644 source/processes/hadronic/models/de_excitation/ablation/GNUmakefile create mode 100644 source/processes/hadronic/models/de_excitation/ablation/include/G4WilsonAblationModel.hh create mode 100644 source/processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc create mode 100644 source/processes/hadronic/models/em_dissociation/GNUmakefile create mode 100644 source/processes/hadronic/models/em_dissociation/include/G4EMDissociation.hh create mode 100644 source/processes/hadronic/models/em_dissociation/src/G4EMDissociation.cc delete mode 100644 source/processes/hadronic/models/general_finalstate/GNUmakefile create mode 100644 source/processes/hadronic/models/util/include/G4WilsonRadius.hh create mode 100644 source/processes/hadronic/models/util/src/G4WilsonRadius.cc create mode 100644 source/processes/hadronic/util/include/G4Bessel.hh create mode 100644 source/processes/hadronic/util/include/G4Fuzzy.hh create mode 100644 source/processes/hadronic/util/src/G4Bessel.cc rename source/visualization/HepRep/include/HEPREP/{HepRepIteratorListener.h => HepRepAttributeListener.h} (86%) create mode 100644 source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h create mode 100644 source/visualization/OpenGL/include/G4OpenGL.hh create mode 100644 source/visualization/OpenInventor/include/G4OpenInventorWin.hh create mode 100644 source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh create mode 100644 source/visualization/OpenInventor/include/G4OpenInventorXt.hh rename source/visualization/OpenInventor/include/{G4OpenInventorViewer.hh => G4OpenInventorXtViewer.hh} (75%) create mode 100644 source/visualization/OpenInventor/include/HEPVis/SbMath.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodekits/SoDetectorTreeKit.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodes/SoBox.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodes/SoCons.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodes/SoTrap.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodes/SoTrd.h create mode 100644 source/visualization/OpenInventor/include/HEPVis/nodes/SoTubs.h rename source/visualization/OpenInventor/src/{G4OpenInventorWin32.cc => G4OpenInventorWin.cc} (69%) create mode 100644 source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc rename source/visualization/OpenInventor/src/{G4OpenInventorX.cc => G4OpenInventorXt.cc} (76%) rename source/visualization/OpenInventor/src/{G4OpenInventorViewer.cc => G4OpenInventorXtViewer.cc} (65%) delete mode 100644 source/visualization/OpenInventor/src/G4SoWindow.cc create mode 100644 source/visualization/OpenInventor/src/SoBox.cc create mode 100644 source/visualization/OpenInventor/src/SoCons.cc create mode 100644 source/visualization/OpenInventor/src/SoDetectorTreeKit.cc create mode 100644 source/visualization/OpenInventor/src/SoTrap.cc create mode 100644 source/visualization/OpenInventor/src/SoTrd.cc create mode 100644 source/visualization/OpenInventor/src/SoTubs.cc diff --git a/Configure b/Configure index 40ef4cd1f3..c5f13acbf8 100755 --- a/Configure +++ b/Configure @@ -18,9 +18,9 @@ # you may fetch it yourself from your nearest archive site.) # -# $Id: Configure,v 1.49 2004/02/09 14:58:45 stesting Exp $ +# $Id: Configure,v 1.60 2004/06/29 09:33:29 stesting Exp $ # -# Generated on Mon Feb 9 15:57:09 CET 2004 [metaconfig 3.0 PL70] +# Generated on Tue Jun 29 11:27:51 CEST 2004 [metaconfig 3.0 PL70] cat >/tmp/c1$$ </dev/null || echo "ERROR: There is no 'cl' compiler.") 2>&1` + case $clcompiler in + *"Version 12"*) g4compiler=VC + ;; + *"Version 13"*) g4compiler=VC7 + ;; + *) g4compiler=VC7 + ;; + esac ;; 'Darwin') g4compiler=g++ @@ -2392,10 +2399,15 @@ esac case "$g4install" in '') - if [ X$HOME = X/ ] ; then +if test $g4system = "WIN32-VC" -o $g4system = "WIN32-VC7"; then + g4install="c:/geant4" +else + if [ X"$HOME" = X/ ] ; then HOME="" fi - g4install=$HOME/geant4 + g4install="$HOME"/geant4 + +fi # Check for Windows! if test $g4system = "WIN32-VC" -o $g4system = "WIN32-VC7"; then @@ -2496,6 +2508,12 @@ case "$g4lib" in ;; esac +#case "$g4bin" in +#'') +# g4bin=$g4workdir/bin +# ;; +#esac + while test 1 = 1 ; do g4message=`cat << EOM @@ -2585,6 +2603,12 @@ case "$g4neutronhpcrosssections" in ;; esac +case "$g4elasticdata" in +'') + g4elasticdata=$g4data/Elastic + ;; +esac + while test 1 = 1 ; do g4message=`cat << EOM @@ -2599,6 +2623,8 @@ Please, specify directories where the Geant4 data is installed: 4) NeutronHPCrossSections: $g4neutronhpcrosssections +5) G4ELASTICDATA: $g4elasticdata + To modify default settings, select number above (e.g. 2) EOM` @@ -2640,6 +2666,15 @@ gans=$ans . ./getfile g4neutronhpcrosssections=$ans ;; + + 5) + dflt=$g4elasticdata + fn='f~' + rp="Where is G4ELASTICDATA installed?" + . ./getfile + g4elasticdata=$ans + ;; + # [eE]) # break # ;; @@ -2839,211 +2874,6 @@ gans=$ans esac done -if test "X$g4clhep_base_dir" = "X/usr" -o "X$g4clhep_base_dir" = "X/usr/local"; then -g4clhep_base_dir="" -fi - -if test "X$g4clhep_include_dir" = "X/usr/include" -o "X$g4clhep_include_dir" = "X/usr/local/include"; then -g4clhep_include_dir="" -fi - -if test "X$g4clhep_lib_dir" = "X/usr/lib" -o "X$g4clhep_lib_dir" = "X/usr/local/lib"; then -g4clhep_lib_dir="" -fi - -echo " " -case "$g4global" in -'') - g4global=n - ;; -esac - -echo " " -# By default it's 'grabular'! -case "$g4granular" in -'') - g4granular=y - ;; -esac - -echo " " -# Will be set (if needed) in GNUmakefile! -case "$g4lib_use_granular" in -'') - g4lib_use_granular=y - ;; -esac - -# -# Ask about g4global - default "(empty)". -# -echo "" - -while test 1 = 1 ; do - -g4message=`cat << EOM - -Do you want to build 'global' compound libraries? -EOM` - -dflt=$g4global -rp=$g4message -. ./myread -gans=$ans - - case $gans in - - n*|N*) - g4global=n - g4granular=y - g4lib_use_granular=y - break - ;; - y*|Y*) - g4global=y -# Shoud be comment out to keep settings from config.sh - not now to keep as in release - g4granular=n -# Shoud be comment out to keep settings from config.sh - not now to keep as in release - g4lib_use_granular=n - break - ;; -# [eE]) -# break -# ;; -# *) -# echo " " -# break -# ;; - esac -done - -if [ X$g4global = Xy ] ; then -# -# Ask about g4granular - default "n". -# -echo "" - -while test 1 = 1 ; do - -g4message=`cat << EOM - -Granular libraries are used by defaults, you asked to build global -compound libraries. Do you want to build 'granular' libraries too? -EOM` - -dflt=$g4granular -rp=$g4message -. ./myread -gans=$ans - - case $gans in - - n*|N*) - g4granular=n - break - ;; - y*|Y*) - g4granular=y - break - ;; -# [eE]) -# break -# ;; -# *) -# echo " " -# break -# ;; - esac -done - -if [ X$g4granular = Xy ] ; then -# -# Ask about g4lib_use_granular - default "n". -# -echo "" - -while test 1 = 1 ; do - -g4message=`cat << EOM - -Global libraries are used by defaults, you asked to build global -compound libraries and granular libraries. -Do you want to use 'granular' libraries instead? -EOM` - -dflt=$g4lib_use_granular -rp=$g4message -. ./myread -gans=$ans - - case $gans in - - n*|N*) - g4lib_use_granular=n - break - ;; - y*|Y*) - g4lib_use_granular=y - break - ;; -# [eE]) -# break -# ;; -# *) -# echo " " -# break -# ;; - esac -done -fi -fi - -### End file - without will be problem! Check in others... - - -echo " " -case "$g4debug" in -'') - g4debug="" - ;; -esac - -# -# Ask about g4debug - default "(empty)". -# -echo "" - -while test 1 = 1 ; do - -g4message=`cat << EOM - -Do you want to compile libraries in DEBUG mode (-g)? -EOM` - -dflt="n" -rp=$g4message -. ./myread -gans=$ans - - case $gans in - - n*|N*) - break - ;; - y*|Y*) - g4debug=1 - break - ;; -# [eE]) -# break -# ;; -# *) -# echo " " -# break -# ;; - esac -done - echo " " @@ -3077,12 +2907,117 @@ case "$g4lib_use_static" in ;; esac +case "$g4lib_build_dll" in +'') + g4lib_build_dll=n + ;; +esac + +case "$g4lib_build_dyn" in +'') + g4lib_build_dyn=n + ;; +esac + # # Ask about building of SHARED|STATIC libraries - default STATIC. # echo "" -if test "X$g4system" != "XWIN32-VC" -a "X$g4system" != "XWIN32-VC7"; then +if test "X$g4system" = "XWIN32-VC" -o "X$g4system" = "XWIN32-VC7"; then + +while test 1 = 1 ; do + +g4message=`cat << EOM + +By default 'static' libraries are built. + +Do you want to build DLL (.dll) libraries? +EOM` + +dflt=$g4lib_build_dll +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + g4lib_build_dll=n + g4lib_build_shared=n + g4lib_build_static=y + break + ;; + y*|Y*) + g4lib_build_dll=y + g4lib_build_shared=n + g4lib_build_static=n + +# g4lib_build_static="" +# g4lib_use_shared=1 +# g4lib_use_static="" + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done + +fi + +############################################### +if test "X$g4system" = "XDarwin-g++" ; then + +while test 1 = 1 ; do + +g4message=`cat << EOM + +By default 'static' libraries are built. + +Do you want to build dynamic libraries? +EOM` + +dflt=$g4lib_build_dyn +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + g4lib_build_dyn=n + g4lib_build_shared=n + g4lib_build_static=y + break + ;; + y*|Y*) + g4lib_build_dyn=y + g4lib_build_shared=n + g4lib_build_static=n + +# g4lib_build_static="" +# g4lib_use_shared=1 +# g4lib_use_static="" + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done + +fi + +if test "X$g4system" != "XWIN32-VC" -a "X$g4system" != "XWIN32-VC7" -a "X$g4system" != "XDarwin-g++" ; then while test 1 = 1 ; do @@ -3212,6 +3147,212 @@ done fi fi # if !Win +echo " " +case "$g4global" in +'') + g4global=n + ;; +esac + +echo " " +# By default it's 'grabular'! +case "$g4granular" in +'') + g4granular=y + ;; +esac + +echo " " +# Will be set (if needed) in GNUmakefile! +case "$g4lib_use_granular" in +'') + g4lib_use_granular=y + ;; +esac + +if test \( \( "X$g4system" = "XWIN32-VC" -o "X$g4system" = "XWIN32-VC7" \) -a "X$g4lib_build_dll" = "Xy" \) -o \( "X$g4system" = "XDarwin-g++" -a "X$g4lib_build_dyn" = "Xy" \) ; then + + g4global=n + g4granular=n + g4lib_use_granular=n + +fi + +if test \( "X$g4system" != "XWIN32-VC" -a "X$g4system" != "XWIN32-VC7" -a "X$g4system" != "XDarwin-g++" \) -o \( \( "X$g4system" = "XWIN32-VC" -o "X$g4system" = "XWIN32-VC7" \) -a "X$g4lib_build_dll" = "Xn" \) -o \( "X$g4system" = "XDarwin-g++" -a "X$g4lib_build_dyn" = "Xn" \) ; then + +# +# Ask about g4global - default "(empty)". +# +echo "" + +while test 1 = 1 ; do + +g4message=`cat << EOM + +Do you want to build 'global' compound libraries? +EOM` + +dflt=$g4global +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + g4global=n + g4granular=y + g4lib_use_granular=y + break + ;; + y*|Y*) + g4global=y +# Shoud be comment out to keep settings from config.sh - not now to keep as in release + g4granular=n +# Shoud be comment out to keep settings from config.sh - not now to keep as in release + g4lib_use_granular=n + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done + +if [ X$g4global = Xy ] ; then +# +# Ask about g4granular - default "n". +# +echo "" + +while test 1 = 1 ; do + +g4message=`cat << EOM + +Granular libraries are used by defaults, you asked to build global +compound libraries. Do you want to build 'granular' libraries too? +EOM` + +dflt=$g4granular +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + g4granular=n + break + ;; + y*|Y*) + g4granular=y + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done + +if [ X$g4granular = Xy ] ; then +# +# Ask about g4lib_use_granular - default "n". +# +echo "" + +while test 1 = 1 ; do + +g4message=`cat << EOM + +Global libraries are used by defaults, you asked to build global +compound libraries and granular libraries. +Do you want to use 'granular' libraries instead? +EOM` + +dflt=$g4lib_use_granular +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + g4lib_use_granular=n + break + ;; + y*|Y*) + g4lib_use_granular=y + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done +fi +fi + +fi # !Win + +### End file - without will be problem! Check in others... + + +echo " " +case "$g4debug" in +'') + g4debug="" + ;; +esac + +# +# Ask about g4debug - default "(empty)". +# +echo "" + +while test 1 = 1 ; do + +g4message=`cat << EOM + +Do you want to compile libraries in DEBUG mode (-g)? +EOM` + +dflt="n" +rp=$g4message +. ./myread +gans=$ans + + case $gans in + + n*|N*) + break + ;; + y*|Y*) + g4debug=1 + break + ;; +# [eE]) +# break +# ;; +# *) +# echo " " +# break +# ;; + esac +done + + echo " " case "$g4make" in @@ -4355,6 +4496,7 @@ State='$State' c='$c' cf_by='$cf_by' cf_time='$cf_time' +clhep_dirs='$clhep_dirs' contains='$contains' d_portable='$d_portable' eunicefix='$eunicefix' @@ -4372,6 +4514,7 @@ g4compiler='$g4compiler' g4conf='$g4conf' g4data='$g4data' g4debug='$g4debug' +g4elasticdata='$g4elasticdata' g4global='$g4global' g4granular='$g4granular' g4include='$g4include' @@ -4380,11 +4523,7 @@ g4install='$g4install' g4ledata='$g4ledata' g4levelgammadata='$g4levelgammadata' g4lib='$g4lib' -g4lib_build_shared='$g4lib_build_shared' -g4lib_build_static='$g4lib_build_static' g4lib_use_granular='$g4lib_use_granular' -g4lib_use_shared='$g4lib_use_shared' -g4lib_use_static='$g4lib_use_static' g4make='$g4make' g4neutronhpcrosssections='$g4neutronhpcrosssections' g4osname='$g4osname' @@ -4461,7 +4600,7 @@ echo "CONFIG=true" >> $g4conf/config.sh : propagate old symbols if $test -f .config/UU/config.sh; then <.config/UU/config.sh sort | uniq >.config/UU/oldconfig.sh - sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' config.sh config.sh .config/UU/oldconfig.sh |\ + sed -n 's/^\([a-zA-Z_0-9]*\)=.*/\1/p' $g4conf/config.sh $g4conf/config.sh .config/UU/oldconfig.sh |\ sort | uniq -u >.config/UU/oldsyms set X `cat .config/UU/oldsyms` shift diff --git a/ReleaseNotes/ReleaseNotes4.6.2.html b/ReleaseNotes/ReleaseNotes4.6.2.html new file mode 100644 index 0000000000..2904d2afe1 --- /dev/null +++ b/ReleaseNotes/ReleaseNotes4.6.2.html @@ -0,0 +1,903 @@ + + +Geant4 6.2 Release Notes + + + +

+
+

+ +

+ +Geant4 6.2 Release Notes + + + + +
+ +June 25th, 2004 + +
+ +

+


+

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

+

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

+ +

Contents

+
    +
  1. Supported and Tested Platforms
  2. +
  3. AIDA and CLHEP
  4. +
  5. Compiler Specific Problems
  6. +
  7. Known Run-Time Problems
  8. +
  9. Compilation Warnings
  10. +
  11. Known Run-Time Warnings
  12. +
  13. Major items for migration of user code
  14. +
  15. Detailed list of changes and fixes
  16. +
+ +

+ +
+ + + +

1. Supported and Tested Platforms

+ +Official platforms: + + +More verified configurations: + + +More verified configurations, which we plan to stop supporting +in releases or patches after November 2004: + + +Platforms configured but not tested and not supported: + + +

+ +
+ + + +

2. AIDA and CLHEP

+ +Geant4 6.2 requires the installation +of CLHEP.
+Tests have been performed with CLHEP-1.8.1.0
+

+Geant4 6.2 examples with histogramming cowork with AIDA 3.2.1 +implementations. These include: + + +AIDA headers can be downloaded from: +http://aida.freehep.org + + +

+ +
+ + + +

3. Compiler Specific Problems

+ + + +

+ +
+ + + +

4. Known Run-Time Problems and Limitations

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

+ +
+ + + +

5. Compilation Warnings

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

+ +
+ + + +

6. Known Run-Time Warnings

+ +The following message can be written to error output while tracking. +We believe it does not give rise to incorrect behaviour. +
+    G4PropagateInField: Warning: Particle is looping 
+    -  tracking in field will be stopped. 
+       It has performed 1000 steps in Field while a maximum of 1000
+       are allowed. 
+
+ + +

+ +
+ + + +

7. Major items for migration of user code

+ +There're not known migrations necessary if upgrading from release 6.1, +other than recompilation and/or reinstallation of libraries and user +applications. +

+Future migration for G4VParticleChange class +

+For the future releases, an interface change to the class +G4VParticleChange is foreseen. The required changes are already +implemented in this release while still keeping valid the old interface.
+The following methods will be removed in the future: +
+      void  SetTrueStepLength(G4double truePathLength);
+      void  SetLocalEnergyDeposit(G4double anEnergyPart);
+      G4TrackStatus GetStatusChange() const;
+      void  SetStatusChange(G4TrackStatus status);
+      void  SetSteppingControl(G4SteppingControl StepControlFlag);
+      void  SetParentWeight(G4double);
+
+They will have to be replaced by the following methods, respectively: +
+      void ProposeTrueStepLength(G4double truePathLength);
+      void ProposeLocalEnergyDeposit(G4double anEnergyPart);
+      G4TrackStatus GetTrackStatus() const;
+      void ProposeTrackStatus(G4TrackStatus status);
+      void ProposeSteppingControl(G4SteppingControl StepControlFlag);
+      void ProposeParentWeight(G4double);
+
+

+Future migration for G4GeneralParticleSource class +

+A 'tree-structured' command format is implemented in this release for +G4GeneralParticleSource. The old UI commands have been kept +for backward compatibility but will be removed in the future.
+For more information, please consult: +http://reat.space.qinetiq.com/gps. + +

+ +
+ + + +

8. Detailed list of changes and fixes

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

+ + +

Configuration

+ + + +

Digitization & Hits

+ + + +

Event

+ + + +

Electromagnetic Processes (Low-energy)

+ + + +

Electromagnetic Processes (Standard)

+ + + +

General Processes, Parameterisation, Cuts, Decay, Optical

+ + + +

Geometry

+ + + +

Global

+ + + +

Graphical Representations

+ + + +

Materials

+ + + +

Hadronic Processes

+ + + +

Particles

+ + + +

Run, Intercoms and Interfaces

+ + + +

Track and Tracking

+ + + +

Visualization

+ + + +

Data sets

+ + + +

Electromagnetic physics-lists

+ + + +

Environments

+ + + +

G3toG4 Tool

+ + + +

Examples

+ + +
+ + + diff --git a/config/History b/config/History index b575716387..bd0462c063 100644 --- a/config/History +++ b/config/History @@ -1,5 +1,5 @@ -$Id: History,v 1.238 2004/02/24 09:49:45 gcosmo Exp $ -$Name: geant4-06-01 $ +$Id: History,v 1.254 2004/06/23 10:56:23 gcosmo Exp $ +$Name: geant4-06-02 $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,73 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +23rd June 2004 Gabriele Cosmo (config-V06-01-10) +- Updated win32def.c program to fix retrivial of public static data for + building DLLs on Windows (G.Barrand). +- Updated Configure scripts. + +17th June 2004 Gabriele Cosmo (config-V06-01-09) +- Darwin-g++.gmk: use twolevel_namespace and GLOBLIBS for shared-libs + build on MacOS. Shared-libs build are possible only global libraries + and requires shared-lib version of CLHEP build with compatible options + (G.Barrand). + +14th June 2004 Gabriele Cosmo (config-V06-01-08) +- architecture.gmk: added specification for G4LIB_USE_DLL. + +11th June 2004 Gabriele Cosmo (config-V06-01-07) +- binmake.gmk: activated shared-libs mechanism for Windows platforms; + forced creation of static library for examples/applications for the + usage with DLLs. + +8th June 2004 Gabriele Cosmo (config-V06-01-06) +- binmake.gmk: restored global lib for interfaces which was missing + from linking list. +- common.gmk, globlib.gmk: fixed clean/clean_libs target. +- architecture.gmk: added definition of G4LIB_BUILD_DLL flag. +- WIN32-VC.gmk: added targets for DLLs build. +- Linux-g++.gmk: made -O2 the default optimisation mode. + Archived temporary setup Linux-gO2 introduced in "config-V06-01-01". + +7th June 2004 Gabriele Cosmo (config-V06-01-05) +- Corrected setup for WIN32-VC7 for building of DLLs. +- Cosmetics in build printout... + +1st June 2004 Gabriele Cosmo (config-V06-01-04) +- binmake.gmk, added include paths to new hadronic models for + abrasion, em_dissociation, de_excitation/ablation and + de_excitation/fission. +- architecture.gmk: updated comments to header. + +26th May 2004 Mark Donszelmann (config-V06-01-03) +- Fixed small problem in previous fix. + +26th May 2004 Gunter Folger (config-V06-01-02) +- binmake.gmk: fixed problem for WIN32 such that also LDLIBS (including + EXTRALIBS) will be mangled to replace -L by its WIN32 correspondance + libpath. + +11th May 2004 Gabriele Cosmo (config-V06-01-01) +- Added new experimental setup for Linux-g++ using -O2 optimisation + as default. To trigger this setup G4SYSTEM must be set to "Linux-gO2". + It also includes (deactivated by default) Pentium4 chip specific options + for using chips-specific floating-point arithmetics based on the SSE unit. + +8th April 2004 Guy Barrand +- architecture.gmk: revisited Inventor default. Removed HEPVis dependencies + (Inventor visualization driver does not need these libraries any longer). + +7th April 2004 Guy Barrand +- Darwin-g++.gmk: + 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. + +5th April 2004 Gabriele Cosmo (config-V06-01-00) +- architecture.gmk: added check for definition of LDFLAGS. + Fixes bug report #603. + 24th February 2004 Gabriele Cosmo (config-V06-00-03) - Fixed link rpath definition in Linux-icc.gmk. diff --git a/config/architecture.gmk b/config/architecture.gmk index d284099369..fca16c0dbb 100644 --- a/config/architecture.gmk +++ b/config/architecture.gmk @@ -1,4 +1,4 @@ -# $Id: architecture.gmk,v 1.91 2004/02/09 15:22:49 gunter Exp $ +# $Id: architecture.gmk,v 1.99 2004/06/14 10:42:12 gcosmo Exp $ # ------------------------------------------------------------------------ # GEANT 4 - Architecture configuration script for GNU Make # @@ -13,11 +13,11 @@ # List of the supported architectures/compilers and related flavors for # the environment variable G4SYSTEM: # -# Linux-g++ Linux (Red Hat 7.3), gcc-2.95.2 or gcc-3.2 (default) +# Linux-g++ Linux (Red Hat 7.3), gcc-3.2.3 (default) # # SUN-CC SunOS 5.8, CC 5.4 # -# WIN32-VC Windows/2000/XP and Microsoft Visual C++ 6.0 - SP5 +# WIN32-VC7 Windows/2000/XP and Microsoft Visual C++ 7.1 .NET # Adding CYGWIN32 tools # ------------------------------------------------------------------------- @@ -84,6 +84,18 @@ ifeq ($(G4LIB_BUILD_SHARED),) endif endif +# Specify if to build the DLL libraries on Windows. Default is NO. +# +ifneq ($(G4LIB_USE_DLL),) + G4LIB_BUILD_DLL = 1 + CPPFLAGS += -DG4LIB_BUILD_DLL +endif +ifneq ($(G4LIB_BUILD_DLL),) + G4LIB_BUILD_DLL = 1 + CPPFLAGS += -DG4LIB_BUILD_DLL + G4LIB_USE_DLL = 1 +endif + # Specify if to build the G3TOG4 module or not. Default is NO. # ifneq ($(G4LIB_BUILD_G3TOG4),) @@ -115,7 +127,7 @@ endif # CLHEP path, etc. # ifndef CLHEP_BASE_DIR - CLHEP_BASE_DIR := /afs/cern.ch/sw/geant4/dev/CLHEP/$(G4SYSTEM)/pro + CLHEP_BASE_DIR := $(shell ls CLHEP_BASE_DIR--UNDEFINED) endif ifndef CLHEP_INCLUDE_DIR CLHEP_INCLUDE_DIR := $(CLHEP_BASE_DIR)/include @@ -151,7 +163,7 @@ ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) OUT_LIB := '-out:' OUT_EXE := '-Fe' LIB_PATH := '-libpath:' - CERNLIB_PATH := "z:\p32\cern\new\df\lib" + CERNLIB_PATH := "c:\cern\pro\lib" PATH_DEL := \\ # # pattern for next substitution @@ -180,11 +192,14 @@ CPPFLAGS += -I$(CLHEP_INCLUDE_DIR) # Positional qualifiers in action... # +ifndef LDFLAGS + LDFLAGS := +endif ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) - LDFLAGS := -link $(LIB_PATH)$(CLHEP_LIB_DIR) + LDFLAGS += -link $(LIB_PATH)$(CLHEP_LIB_DIR) LOADLIBS := $(CLHEP_LIB) else - LDFLAGS := -L$(CLHEP_LIB_DIR) + LDFLAGS += -L$(CLHEP_LIB_DIR) LOADLIBS := -l$(CLHEP_LIB) LOADLIBS += -lm endif @@ -220,21 +235,19 @@ XAWLIBS := -lXaw # are set below. Most system-dependent code assumes OGLHOME is set. # # ------------- OpenInventor ----------------- -# The path to the installation of HEPVis and OpenInventor must be specified -# in HEPVISDIR -only- if the packages are installed in a location different +# The path to the installation of OpenInventor must be specified +# if the package is installed in a location different # than default system directories (like... /usr or /usr/local). # -ifndef HEPVISINC - HEPVISINC := $(HEPVISDIR)/include -endif -ifndef HEPVISLIB - HEPVISLIB := $(HEPVISDIR)/lib + +ifndef OIVHOME + OIVHOME := /usr/local/Inventor endif ifndef OIVFLAGS - OIVFLAGS := -I${HEPVISINC} + OIVFLAGS := -I$(OIVHOME)/include endif ifndef OIVLIBS - OIVLIBS := -L${HEPVISLIB} -lHEPVis -lHEPVisXt -lInventor -lInventorXt + OIVLIBS := -L$(OIVHOME)/lib -lInventorXt -lInventor endif # For cfront compilers the repository location is set to diff --git a/config/binmake.gmk b/config/binmake.gmk index d44f62a31f..4e08d65e39 100644 --- a/config/binmake.gmk +++ b/config/binmake.gmk @@ -1,4 +1,4 @@ -# $Id: binmake.gmk,v 1.94 2003/11/18 11:28:10 hpw Exp $ +# $Id: binmake.gmk,v 1.102 2004/06/11 14:07:47 gcosmo Exp $ # ---------------------------------------------------------- # Script defining rules and paths for making binaries. # First implementation: Gabriele Cosmo, 25/06/1998. @@ -20,6 +20,9 @@ include $(G4INSTALL)/config/G4VIS_USE.gmk include $(G4INSTALL)/config/interactivity.gmk include $(G4INSTALL)/config/analysis.gmk +# Verify the existance of the global static libraries first. +# if not verify the existance of global shared libraries (Unix only). +# ifndef G4LIB_USE_GRANULAR GLOBALLIBS := $(shell test -f $(G4LIB)/$(G4SYSTEM)/libG4global.a && echo yes) ifndef GLOBALLIBS @@ -28,10 +31,15 @@ ifndef G4LIB_USE_GRANULAR endif endif +# Verify the existance of granular shared libraries (Unix) or global DLLs (Windows) +# ifndef SHAREDLIBS SHAREDLIBS := $(shell test -f $(G4LIB)/$(G4SYSTEM)/libG4globman.$(SHEXT) && echo yes) endif - +ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) + SHAREDLIBS := $(shell test -f $(G4LIB)/$(G4SYSTEM)/G4global.$(SHEXT) && echo yes) +endif + ifndef INCFLAGS ifeq ($(G4INCLUDE_EXEC),1) INCFLAGS := -I$(G4INCLUDE) @@ -64,44 +72,47 @@ ifndef INCFLAGS -I$(G4BASE)/processes/electromagnetic/lowenergy/include \ -I$(G4BASE)/processes/hadronic/cross_sections/include \ -I$(G4BASE)/processes/hadronic/management/include \ + -I$(G4BASE)/processes/hadronic/models/abrasion/include \ + -I$(G4BASE)/processes/hadronic/models/binary_cascade/include \ -I$(G4BASE)/processes/hadronic/models/cascade/cascade/include \ -I$(G4BASE)/processes/hadronic/models/cascade/evaporation/include \ -I$(G4BASE)/processes/hadronic/models/cascade/utils/include \ -I$(G4BASE)/processes/hadronic/models/chiral_inv_phase_space/body/include \ -I$(G4BASE)/processes/hadronic/models/chiral_inv_phase_space/interface/include \ -I$(G4BASE)/processes/hadronic/models/coherent_elastic/include \ - -I$(G4BASE)/processes/hadronic/models/high_energy/include \ - -I$(G4BASE)/processes/hadronic/models/isotope_production/include \ - -I$(G4BASE)/processes/hadronic/models/leading_particle/include \ - -I$(G4BASE)/processes/hadronic/models/low_energy/include \ - -I$(G4BASE)/processes/hadronic/models/neutron_hp/include \ - -I$(G4BASE)/processes/hadronic/models/binary_cascade/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/ablation/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/fermi_breakup/include \ - -I$(G4BASE)/processes/hadronic/models/de_excitation/fission/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/fission/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/gem_evaporation/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/handler/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/management/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/multifragmentation/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/photon_evaporation/include \ -I$(G4BASE)/processes/hadronic/models/de_excitation/util/include \ - -I$(G4BASE)/processes/hadronic/models/inucl/include \ - -I$(G4BASE)/processes/hadronic/models/photolepton_hadron/muon_nuclear/include \ - -I$(G4BASE)/processes/hadronic/models/pre_equilibrium/exciton_model/include \ - -I$(G4BASE)/processes/hadronic/models/quark_molecular_dynamics/body/include \ - -I$(G4BASE)/processes/hadronic/models/quark_molecular_dynamics/util/include \ - -I$(G4BASE)/processes/hadronic/models/relativistic_qmd/include \ - -I$(G4BASE)/processes/hadronic/models/relativistic_qmd/uplusplus/include \ + -I$(G4BASE)/processes/hadronic/models/em_dissociation/include \ + -I$(G4BASE)/processes/hadronic/models/general_finalstate/include \ + -I$(G4BASE)/processes/hadronic/models/high_energy/include \ -I$(G4BASE)/processes/hadronic/models/im_r_matrix/include \ + -I$(G4BASE)/processes/hadronic/models/inucl/include \ + -I$(G4BASE)/processes/hadronic/models/isotope_production/include \ + -I$(G4BASE)/processes/hadronic/models/leading_particle/include \ + -I$(G4BASE)/processes/hadronic/models/low_energy/include \ -I$(G4BASE)/processes/hadronic/models/management/include \ + -I$(G4BASE)/processes/hadronic/models/neutron_hp/include \ -I$(G4BASE)/processes/hadronic/models/parton_string/diffraction/include \ -I$(G4BASE)/processes/hadronic/models/parton_string/hadronization/include \ -I$(G4BASE)/processes/hadronic/models/parton_string/management/include \ -I$(G4BASE)/processes/hadronic/models/parton_string/qgsm/include \ + -I$(G4BASE)/processes/hadronic/models/photolepton_hadron/muon_nuclear/include \ + -I$(G4BASE)/processes/hadronic/models/pre_equilibrium/exciton_model/include \ + -I$(G4BASE)/processes/hadronic/models/quark_molecular_dynamics/body/include \ + -I$(G4BASE)/processes/hadronic/models/quark_molecular_dynamics/util/include \ + -I$(G4BASE)/processes/hadronic/models/radioactive_decay/include \ + -I$(G4BASE)/processes/hadronic/models/relativistic_qmd/include \ + -I$(G4BASE)/processes/hadronic/models/relativistic_qmd/uplusplus/include \ -I$(G4BASE)/processes/hadronic/models/theo_high_energy/include \ -I$(G4BASE)/processes/hadronic/models/util/include \ - -I$(G4BASE)/processes/hadronic/models/general_finalstate/include \ - -I$(G4BASE)/processes/hadronic/models/radioactive_decay/include \ -I$(G4BASE)/processes/hadronic/processes/include \ -I$(G4BASE)/processes/hadronic/stopping/include \ -I$(G4BASE)/processes/hadronic/util/include \ @@ -160,23 +171,32 @@ endif # ifndef USER_DEFINED_LDLIBS -# LDLIBS1 contains the very high level libraries... +# TARGETLIB is the library generated for the final user application... # ifdef G4EXLIB - LDLIBS1 := -l$(G4TARGET) + ifeq (,$(findstring WIN32-VC,$(G4SYSTEM))) + # Unix + TARGETLIB := -l$(G4TARGET) + else + # Windows + TARGETLIB := lib$(G4TARGET).a + endif endif -LDLIBS1 += $(EXTRALIBS) -# VISLIBS and UILIBS are now handled by the granular library script... +# LDLIBS1 contains the very high level libraries... +# +LDLIBS1 := $(EXTRALIBS) + +# VISLIBS (and UILIBS?) is handled by the granular library script... # ifdef GLOBALLIBS - LDLIBS1 += $(VISLIBS) $(UILIBS) -lG4persistency + LDLIBS2 := $(VISLIBS) -lG4interfaces -lG4persistency ifdef G4USE_G3TOG4 - LDLIBS1 += -lG3toG4 + LDLIBS2 += -lG3toG4 endif - LDLIBS2 := -lG4readout \ + LDLIBS2 += -lG4readout \ -lG4run \ -lG4event \ -lG4tracking \ @@ -241,13 +261,18 @@ LDLIBS_PREFINAL += $(LDLIBS4) ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) WIN32TMP := $(patsubst -L%,$(LIB_PATH)%,$(LDFLAGS)) LDFLAGS = $(patsubst /,$(PATH_DEL),$(WIN32TMP)) - LDLIBS = $(patsubst -l%,lib%.a,$(LDLIBS_PREFINAL)) + WIN32TMP2 := $(patsubst -L%,$(LIB_PATH)%,$(LDLIBS_PREFINAL)) + ifdef SHAREDLIBS + LDLIBS = $(TARGETLIB) $(patsubst -l%,lib%.lib,$(WIN32TMP2)) + else + LDLIBS = $(TARGETLIB) $(patsubst -l%,lib%.a,$(WIN32TMP2)) + endif else - LDLIBS = $(LDLIBS_PREFINAL) + LDLIBS = $(TARGETLIB) $(LDLIBS_PREFINAL) endif ifdef transform-RPath -#invoke system specific transformation of +# Invoke system specific transformation of include $(G4INSTALL)/config/sys/$(G4SYSTEM)-runpath.gmk endif @@ -279,7 +304,7 @@ ifndef USER_DEFINED_LDLIBS echo " gmake libmap"; \ exit 1; fi else - @echo "Using global libraries." + @echo "Using global libraries ..." endif endif @if [ ! -d $(G4BINDIR) ] ; then mkdir $(G4BINDIR) ;fi @@ -339,7 +364,7 @@ $(G4TMPDIR)/exe/$(G4TARGET).d: $(G4TARGET).cc @if [ ! -d $(G4TMP)/$(G4SYSTEM) ] ; then mkdir $(G4TMP)/$(G4SYSTEM) ;fi @if [ ! -d $(G4TMPDIR) ] ; then mkdir $(G4TMPDIR) ;fi @if [ ! -d $(G4TMPDIR)/exe ] ; then mkdir $(G4TMPDIR)/exe ;fi - @echo Making dependency for file $<... + @echo Making dependency for file $< ... @set -e;\ g++ $(GPPFLAGS) $(CPPFLAGS) -w $< |\ sed 's!$(G4TARGET)\.o!$(G4TMPDIR)/exe/& $@!' >$@;\ diff --git a/config/common.gmk b/config/common.gmk index 59e94e7999..3544348a12 100644 --- a/config/common.gmk +++ b/config/common.gmk @@ -1,4 +1,4 @@ -# $Id: common.gmk,v 1.35 2003/01/22 18:02:03 gcosmo Exp $ +# $Id: common.gmk,v 1.38 2004/06/08 10:04:47 gcosmo Exp $ # ---------------------------------------------------------------- # Common part of GNUmakefile for libraries. John Allison, 5/7/95. # ---------------------------------------------------------------- @@ -37,7 +37,7 @@ ifneq ($(G4LIB_BUILD_SHARED),) # Make shared library. $(G4LIBDIR)/lib$(name).$(SHEXT): $(G4TMPDIR)/obj.last @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ;fi - @echo Creating shared library $@ + @echo Creating shared library $@ ... @$(RM) $@ # use architecture specific macro defined in sys/$(G4SYSTEM).gmk $(build-granular-shared-lib) @@ -47,7 +47,7 @@ ifneq ($(G4LIB_BUILD_STATIC),) # Make static (archive) library. $(G4LIBDIR)/lib$(name).a: $(G4TMPDIR)/obj.last @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ;fi - @echo Creating/replacing object files in $(G4LIBDIR)/lib$(name).a + @echo Creating/replacing object files in $(G4LIBDIR)/lib$(name).a ... @rm -f $(G4LIBDIR)/lib$(name).a @$(AR) $(OUT_LIB)$(G4LIBDIR)/lib$(name).a $(G4TMPDIR)/*.o @if [ -f /usr/bin/ranlib -o -f /bin/ranlib ] ; then ranlib $(G4LIBDIR)/lib$(name).a ;fi @@ -130,14 +130,16 @@ ifndef G4EXLIB clean: @echo Cleaning up ... @rm -f $(G4LIBDIR)/lib$(name).a + @rm -f $(G4LIBDIR)/*$(name).lib + @rm -f $(G4LIBDIR)/*$(name).exp @rm -f $(G4LIBDIR)/lib$(name).$(SHEXT) @rm -rf $(G4TMPDIR) endif clean_libs: - @if [ -f $(G4LIBDIR)/lib$(name).a ] ; then \ - $(ECHO) Removing library lib$(name).a ... ; \ - $(RM) -f $(G4LIBDIR)/lib$(name).a ; fi - @if [ -f $(G4LIBDIR)/lib$(name).$(SHEXT) ] ; then \ - $(ECHO) Removing library lib$(name).$(SHEXT) ... ; \ - $(RM) -f $(G4LIBDIR)/lib$(name).$(SHEXT) ; fi + @echo Removing library lib$(name).a ... + @rm -f $(G4LIBDIR)/*$(name).a + @echo Removing library lib$(name).$(SHEXT) ... + @rm -f $(G4LIBDIR)/*$(name).lib + @rm -f $(G4LIBDIR)/*$(name).exp + @rm -f $(G4LIBDIR)/*$(name).$(SHEXT) diff --git a/config/globlib.gmk b/config/globlib.gmk index adca1bbebd..e5a83a4e45 100644 --- a/config/globlib.gmk +++ b/config/globlib.gmk @@ -1,4 +1,4 @@ -# $Id: globlib.gmk,v 1.20 2003/01/22 18:02:04 gcosmo Exp $ +# $Id: globlib.gmk,v 1.24 2004/06/08 10:04:46 gcosmo Exp $ # -------------------------------------------------------------- # Script for compound libraries. Gabriele Cosmo, 25/6/98. # -------------------------------------------------------------- @@ -40,7 +40,7 @@ ifneq ($(G4LIB_BUILD_STATIC),) $(G4LIBDIR)/lib$(name).a: \ $(foreach dir,$(SUBLIBS),$(G4TMP)/$(G4SYSTEM)/$(dir)/obj.last) @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ; fi - @echo Merging object files in $(G4LIBDIR)/lib$(name).a + @echo Merging object files in $(G4LIBDIR)/lib$(name).a ... @$(RM) $(G4LIBDIR)/lib$(name).a # # @@ -79,7 +79,7 @@ endif ifneq ($(G4LIB_BUILD_SHARED),) $(SHARED_LIB): $(foreach dir,$(SUBLIBS),$(G4TMP)/$(G4SYSTEM)/$(dir)/obj.last) @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ; fi - @echo Creating global shared library $@ + @echo Creating global shared library $@ ... @$(RM) $@ # use system specific commands to build the library $(build-global-shared-lib) @@ -105,16 +105,25 @@ clean: @echo Cleaning up ... @for lib in $(SUBLIBS); do ( \ rm -rf $(G4TMP)/$(G4SYSTEM)/$$lib;\ - rm -f $(G4LIBDIR)/lib$$lib.a;\ - rm -f $(G4LIBDIR)/lib$$lib.$(SHEXT) );\ + rm -f $(G4LIBDIR)/*$$lib.a;\ + rm -f $(G4LIBDIR)/*$$lib.lib;\ + rm -f $(G4LIBDIR)/*$$lib.exp;\ + rm -f $(G4LIBDIR)/*$$lib.$(SHEXT) );\ done - @rm -f $(G4LIBDIR)/lib$(name).a + @rm -f $(G4LIBDIR)/*$(name).a + @rm -f $(G4LIBDIR)/*$(name).lib + @rm -f $(G4LIBDIR)/*$(name).exp + @rm -f $(G4LIBDIR)/*$(name).$(SHEXT) clean_libs: @echo Removing lib$(name).a/.$(SHEXT) and sub-libraries ... @for lib in $(SUBLIBS); do ( \ - rm -f $(G4LIBDIR)/lib$$lib.a;\ - rm -f $(G4LIBDIR)/lib$$lib.$(SHEXT) );\ + rm -f $(G4LIBDIR)/*$$lib.a;\ + rm -f $(G4LIBDIR)/*$$lib.lib;\ + rm -f $(G4LIBDIR)/*$$lib.exp;\ + rm -f $(G4LIBDIR)/*$$lib.$(SHEXT) );\ done - @rm -f $(G4LIBDIR)/lib$(name).a - @rm -f $(G4LIBDIR)/lib$(name).$(SHEXT) + @rm -f $(G4LIBDIR)/*$(name).a + @rm -f $(G4LIBDIR)/*$(name).lib + @rm -f $(G4LIBDIR)/*$(name).exp + @rm -f $(G4LIBDIR)/*$(name).$(SHEXT) diff --git a/config/scripts/env.csh.SH b/config/scripts/env.csh.SH index 8642aca708..91f163ef68 100755 --- a/config/scripts/env.csh.SH +++ b/config/scripts/env.csh.SH @@ -73,6 +73,12 @@ setenv NeutronHPCrossSections "$g4neutronhpcrosssections" echo "On this machine the NeutronHPCrossSections=\$NeutronHPCrossSections" endif +#+ +if ( X$g4elasticdata != X ) then +setenv G4ELASTICDATA "$g4elasticdata" +echo "On this machine the G4ELASTICDATA=\$G4ELASTICDATA" +endif + # # g4clhep.U # @@ -303,26 +309,8 @@ else # Check for Windows! if ( "X$G4SYSTEM" == "XWIN32-VC" || "X$G4SYSTEM" == "XWIN32-VC7" ) then -setenv checkdrive `echo $HOME|cut -d"/" -f2` - -if ( "X$checkdrive" == "Xcygdrive" ) then - -setenv windrive `echo $HOME|cut -d"/" -f3` -setenv winpath `echo $HOME|cut -d"/" -f4-` - -setenv fullwinpath "$windrive:/$winpath" -setenv G4WORKDIR $fullwinpath - -endif # if cygwin syntax is used - -if ( "X$winpath" == "X" ) then -echo "G4WORKDIR will be set to ${G4WORKDIR}geant4 (in "native" Windows syntax)." -setenv G4WORKDIR ${G4WORKDIR}geant4 -else -echo "G4WORKDIR will be set to $G4WORKDIR/geant4 (in "native" Windows syntax)." -setenv G4WORKDIR $G4WORKDIR/geant4 -endif - +echo "G4WORKDIR will be set to c:/geant4 (in "native" Windows syntax)." +setenv G4WORKDIR "c:/geant4" else # if Unix diff --git a/config/scripts/env.sh.SH b/config/scripts/env.sh.SH index 5f5be575b3..2e7ecd1305 100755 --- a/config/scripts/env.sh.SH +++ b/config/scripts/env.sh.SH @@ -97,6 +97,15 @@ echo "On this machine the NeutronHPCrossSections=\$NeutronHPCrossSections" fi fi +#+ +if [ X$g4elasticdata != X ] ; then +G4ELASTICDATA="$g4elasticdata" +export G4ELASTICDATA +if [ X\$g4non_display = X ] ; then +echo "On this machine the G4ELASTICDATA=\$G4ELASTICDATA" +fi +fi + # # g4clhep.U # @@ -430,26 +439,9 @@ if [ X$g4non_display = X ] ; then # Check for Windows! if test "X$G4SYSTEM" = "XWIN32-VC" -o "X$G4SYSTEM" = "XWIN32-VC7"; then -checkdrive=`echo $HOME|cut -d"/" -f2` - -if test "X$checkdrive" = "Xcygdrive"; then - -windrive=`echo $HOME|cut -d"/" -f3` -winpath=`echo $HOME|cut -d"/" -f4-` - -fullwinpath="$windrive:/$winpath" -G4WORKDIR=$fullwinpath - -fi # if cygwin syntax is used - -if test "X$winpath" = "X"; then -echo "G4WORKDIR will be set to ${G4WORKDIR}geant4 (in "native" Windows syntax)" -export G4WORKDIR=${G4WORKDIR}geant4 -else -echo "G4WORKDIR will be set to $G4WORKDIR/geant4 (in "native" Windows syntax)" -export G4WORKDIR=${G4WORKDIR}/geant4 -fi - +echo "G4WORKDIR will be set to c:/geant4 (in "native" Windows syntax)" +G4WORKDIR="c:/geant4" +export G4WORKDIR else # if Unix diff --git a/config/scripts/install.sh.SH b/config/scripts/install.sh.SH index 55a5c335d5..bf2103b66a 100755 --- a/config/scripts/install.sh.SH +++ b/config/scripts/install.sh.SH @@ -60,6 +60,12 @@ export G4LIB echo "On this machine the G4LIB=\$G4LIB" fi +#+ +if [ X$g4lib != X ] ; then +G4BIN="$g4lib/../bin" +export G4BIN +fi + #+ if [ X$g4levelgammadata != X ] ; then G4LEVELGAMMADATA="$g4levelgammadata" @@ -88,6 +94,13 @@ export NeutronHPCrossSections echo "On this machine the NeutronHPCrossSections=\$NeutronHPCrossSections" fi +#+ +if [ X$g4elasticdata != X ] ; then +G4ELASTICDATA="$g4elasticdata" +export G4ELASTICDATA +echo "On this machine the G4ELASTICDATA=\$g4elasticdata" +fi + # # g4clhep.U # @@ -335,8 +348,6 @@ fi ##################################################################### -echo g4conf=$g4conf - ##################################################################### # Create GNUmakefile.db to keep ALL GNUmakefile DB :) @@ -371,29 +382,59 @@ rm -rf $g4conf/g4make.log $g4make 2>&1 | tee $g4conf/g4make.log fi -# Check for errors in log file -export err=\$[ \`grep Error $g4conf/g4make.log | wc -w\` ] -export int=\$[ \`grep Stop\. $g4conf/g4make.log | wc -w\` ] -# echo err=\$err +if [ X$g4lib_build_dll = Xy ] ; then +echo "" +rm -rf $g4conf/g4make.log +$g4make dll 2>&1 | tee $g4conf/g4make.log +fi -if [ X\$err = X0 -a X\$int = X0 ] ; then +if [ X$g4lib_build_dyn = Xy ] ; then +echo "" +rm -rf $g4conf/g4make.log +$g4make global G4LIB_BUILD_SHARED=1 2>&1 | tee $g4conf/g4make.log +fi + +# Check for errors in log file +if test -f \$g4conf/g4make.log ; then + +# There are two (at least) shells 'sh' and 'bash' with +# different arithmetic expansion...So we are doing it by 'text' +# in two steps... + +err=\`grep Error $g4conf/g4make.log | wc -w\` +int=\`grep Stop\. $g4conf/g4make.log | wc -w\` + +err2=\`echo \$err\` +int2=\`echo \$int\` + +if [ X\$err2 = X0 -a X\$int2 = X0 ] ; then echo "" echo "####################################################" -echo "# Your Geant4 installation seems to be successful! #" -echo "# To be sure please have a look into the log file: #" -echo "# $g4conf/g4make.log #" +echo "# Your Geant4 installation seems to be successful! " +echo "# To be sure please have a look into the log file: " +echo "# $g4conf/g4make.log " echo "####################################################" echo "" else echo "" echo "############################################################" -echo "# It looks like you had errors during Geant4 installation #" -echo "# (or interrupted installation)! #" -echo "# Please check log file: #" -echo "# $g4conf/g4make.log #" +echo "# It looks like you had errors during Geant4 installation " +echo "# (or interrupted installation)! " +echo "# Please check log file: " +echo "# $g4conf/g4make.log " echo "############################################################" echo "" fi +else +echo "" +echo "############################################################" +echo "# It looks like you had errors during Geant4 installation " +echo "# (or interrupted installation)! " +echo "# You have no log file: " +echo "# $g4conf/g4make.log " +echo "############################################################" +echo "" +fi # There is no env! if [ X$g4includes_flag = Xy ] ; then diff --git a/config/sys/Darwin-g++.gmk b/config/sys/Darwin-g++.gmk index 61bdc2f91a..86ecd2d039 100644 --- a/config/sys/Darwin-g++.gmk +++ b/config/sys/Darwin-g++.gmk @@ -35,12 +35,6 @@ ifeq ($(G4SYSTEM),Darwin-g++) FCFLAGS += -pg CCFLAGS += -pg endif - ifdef G4LIB_BUILD_SHARED - CXXFLAGS += -fPIC - FCFLAGS += -fPIC - CCFLAGS += -fPIC - endif -# G4RUNPATHOPTION := -Wl,-rpath FC := g77 FCFLAGS += -fno-automatic -fno-backslash -fno-second-underscore FCLIBS := -lg2c -lnsl @@ -48,8 +42,8 @@ ifeq ($(G4SYSTEM),Darwin-g++) SHEXT := dylib X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 X11LIBS := -L/usr/X11R6/lib -lXmu -lXt -lXext -lX11 -lSM -lICE - XMFLAGS := -I/usr/X11R6/include - XMLIBS := -lXm -lXpm + XMFLAGS := -I/sw/include + XMLIBS := -L/sw/lib -lXm -lXpm DLDLIBS := -ldl ifndef OGLHOME OGLHOME := /usr/X11R6 @@ -60,16 +54,22 @@ ifeq ($(G4SYSTEM),Darwin-g++) ifndef OGLLIBS OGLLIBS := -L$(OGLHOME)/lib -lGLU -lGL endif - OIVFLAGS += -I$(OIHOME)/include define build-granular-shared-lib @libdir=`(cd $(@D);/bin/pwd)`; \ cd $(G4TMPDIR); \ - g++ -dynamiclib -flat_namespace -undefined suppress -o $$libdir/$(@F) $(INTYLIBS) *.o + g++ -dynamiclib -twolevel_namespace -undefined error -dynamic \ + -single_module -o $$libdir/$(@F) *.o -L$(G4LIB)/$(G4SYSTEM) \ + $(patsubst lib%,-l%,$(patsubst %.lib,%,$(GLOBLIBS))) \ + -L$(CLHEP_LIB_DIR) -l$(CLHEP_LIB) $(INTYLIBS) endef define build-global-shared-lib - libdir=`(cd $(@D);/bin/pwd)`; \ + @libdir=`(cd $(@D);/bin/pwd)`; \ cd $(G4TMP)/$(G4SYSTEM); \ - g++ -dynamiclib -flat_namespace -undefined suppress -o $$libdir/$(@F) $(INTYLIBS) $(foreach dir,$(SUBLIBS),$(dir)/*.o); + g++ -dynamiclib -twolevel_namespace -undefined error -dynamic \ + -single_module -o $$libdir/$(@F) \ + $(foreach dir,$(SUBLIBS),$(dir)/*.o) -L$(G4LIB)/$(G4SYSTEM) \ + $(patsubst lib%,-l%,$(patsubst %.lib,%,$(GLOBLIBS))) \ + -L$(CLHEP_LIB_DIR) -l$(CLHEP_LIB) $(INTYLIBS); endef endif diff --git a/config/sys/Linux-g++.gmk b/config/sys/Linux-g++.gmk index a15d1baac0..a39ca5dd6c 100644 --- a/config/sys/Linux-g++.gmk +++ b/config/sys/Linux-g++.gmk @@ -1,14 +1,23 @@ # -# ------ GNU/LINUX ------ gcc 2.95.2 / gcc 3.2 +# ------ GNU/LINUX ------ gcc 3.2 and higher # ifeq ($(G4SYSTEM),Linux-g++) CXX := g++ CXXFLAGS := -W -Wall -ansi -pedantic -Wno-non-virtual-dtor -Wno-long-long CXXFLAGS += -Wwrite-strings -Wpointer-arith -Woverloaded-virtual -pipe +# +# Uncomment the following options to activate Pentium4 chip specific +# floating-point operations on the SSE unit. It will allow for more stable +# results (no output differences between debug/optimised runs) and little +# performance improvement (in the order of 2%). +# NOTE: binaries built using these options will NOT be portable cross +# platforms. Will only run on Pentium4-based architectures ! +# +# CXXFLAGS += -march=pentium4 -mfpmath=sse ifdef G4OPTIMISE - CXXFLAGS += -O - FCFLAGS := -O - CCFLAGS := -O + CXXFLAGS += -O2 + FCFLAGS := -O2 + CCFLAGS := -O2 else ifdef G4DEBUG CXXFLAGS += -g diff --git a/config/sys/WIN32-VC.gmk b/config/sys/WIN32-VC.gmk index 4064374fc9..6e4baa8bf6 100644 --- a/config/sys/WIN32-VC.gmk +++ b/config/sys/WIN32-VC.gmk @@ -15,6 +15,7 @@ ifeq ($(G4SYSTEM),WIN32-VC) CPPFLAGS += -DWIN32 LDFLAGS += -FORCE /NODEFAULTLIB:MSVCRT.dll + SHEXT := dll AR := LIB ECHO := echo -e FC := g77 @@ -30,10 +31,49 @@ ifeq ($(G4SYSTEM),WIN32-VC) endif define build-granular-shared-lib - @echo "Shared Libraries not supported on $(G4SYSTEM) + @libdir=`(cd $(@D);/bin/pwd)`;\ + cd $(G4TMP)/$(G4SYSTEM);\ + echo "Building $(name).dumpbin file ...";\ + $(RM) $(name).dumpbin;\ + dumpbin /symbols $(G4LIBDIR)/lib$(name).a > $(name).dumpbin;\ + echo "Building $(name).def file ...";\ + $(RM) $(name).def;\ + $(G4LIB)/$(G4SYSTEM)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ + $(RM) $(name).dumpbin;\ + echo "Building lib$(name).exp and lib$(name).lib file ...";\ + $(RM) $(G4LIBDIR)/lib$(name).exp;\ + $(RM) $(G4LIBDIR)/lib$(name).lib;\ + lib.exe /nologo /machine:ix86 /def:$(name).def \ + /out:$(G4LIBDIR)/lib$(name).lib;\ + $(RM) $(G4LIBDIR)/$(name).dll;\ + echo "Building $(name).dll file ...";\ + link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll \ + $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a \ + /libpath:$(G4LIBDIR) $(GLOBLIBS) \ + $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) \ + $(INTYLIBS) $(ANALYSISLIBS) $(UI32LIBS) endef define build-global-shared-lib - @echo "Shared Libraries not supported on $(G4SYSTEM) + @libdir=`(cd $(@D);/bin/pwd)`;\ + cd $(G4TMP)/$(G4SYSTEM);\ + echo "Building $(name).dumpbin file ...";\ + $(RM) $(name).dumpbin;\ + dumpbin /symbols $(G4LIBDIR)/lib$(name).a > $(name).dumpbin;\ + echo "Building $(name).def file ...";\ + $(RM) $(name).def;\ + $(G4LIB)/$(G4SYSTEM)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ + $(RM) $(name).dumpbin;\ + echo "Building lib$(name).exp and lib$(name).lib ...";\ + $(RM) $(G4LIBDIR)/lib$(name).exp;\ + $(RM) $(G4LIBDIR)/lib$(name).lib;\ + lib.exe /nologo /machine:ix86 /def:$(name).def \ + /out:$(G4LIBDIR)/lib$(name).lib;\ + $(RM) $(G4LIBDIR)/$(name).dll;\ + echo "Building $(name).dll ...";\ + link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll \ + $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a \ + /libpath:$(G4LIBDIR) $(GLOBLIBS) \ + $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) \ + $(INTYLIBS) $(ANALYSISLIBS) $(UI32LIBS) endef - endif diff --git a/config/sys/WIN32-VC7.gmk b/config/sys/WIN32-VC7.gmk index cd602df20e..501da9bce8 100644 --- a/config/sys/WIN32-VC7.gmk +++ b/config/sys/WIN32-VC7.gmk @@ -1,6 +1,6 @@ # # ------ WIN32/VC ------ Visual-C++ 7 .NET -# experimental setup +# ifeq ($(G4SYSTEM),WIN32-VC7) CXX := CL ifdef G4OPTIMISE @@ -31,16 +31,17 @@ ifeq ($(G4SYSTEM),WIN32-VC7) endif # -# Building DLLs (from G.Barrand) +# Building DLLs (G.Barrand) # ------------- -# The below commands permit to build DLLs from the archive libraries. +# The commands below allow to build DLLs from the archive libraries. # From a libG4xxx.a, it will extract the symbols with : # DOS> dumpbin /symbols libG4xxx.a > G4xxx.dumpbin # After that it will produce a G4xxx.def using the 'win32def' program. # The G4xxx.def file will contain the list of symbols that are "exported" # or made public for using the DLLs. -# The source win32def.c is in config/sys. The binary is built during the -# library installation process, and will be placed in $G4LIB/G4SYSTEM. +# The source win32def.c is in the geant4/config directory. The binary is +# built during the library installation process, and will be placed in +# $G4LIB/G4SYSTEM. # If can also be built as follows : # DOS> cl.exe /Fowin32def.exe win32def.c # Then, to use it : @@ -56,37 +57,47 @@ ifeq ($(G4SYSTEM),WIN32-VC7) define build-granular-shared-lib @libdir=`(cd $(@D);/bin/pwd)`;\ cd $(G4TMP)/$(G4SYSTEM);\ - echo "Building $(name).dumpbin file";\ + echo "Building $(name).dumpbin file ...";\ $(RM) $(name).dumpbin;\ dumpbin /symbols $(G4LIBDIR)/lib$(name).a > $(name).dumpbin;\ - echo "Building $(name).def file";\ + echo "Building $(name).def file ...";\ $(RM) $(name).def;\ - $(G4LIBDIR)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ + $(G4LIB)/$(G4SYSTEM)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ $(RM) $(name).dumpbin;\ - echo "Building lib$(name).exp and lib$(name).lib file";\ + echo "Building lib$(name).exp and lib$(name).lib file ...";\ $(RM) $(G4LIBDIR)/lib$(name).exp;\ $(RM) $(G4LIBDIR)/lib$(name).lib;\ - lib.exe /nologo /machine:ix86 /def:$(name).def /out:$(G4LIBDIR)/lib$(name).lib;\ + lib.exe /nologo /machine:ix86 /def:$(name).def \ + /out:$(G4LIBDIR)/lib$(name).lib;\ $(RM) $(G4LIBDIR)/$(name).dll;\ - echo "Building $(name).dll file";\ - link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a /libpath:$(G4LIBDIR) $(GLOBLIBS) $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) + echo "Building $(name).dll file ...";\ + link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll \ + $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a \ + /libpath:$(G4LIBDIR) $(GLOBLIBS) \ + $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) \ + $(INTYLIBS) $(ANALYSISLIBS) $(UI32LIBS) endef define build-global-shared-lib @libdir=`(cd $(@D);/bin/pwd)`;\ cd $(G4TMP)/$(G4SYSTEM);\ - echo "Building $(name).dumpbin file";\ + echo "Building $(name).dumpbin file ...";\ $(RM) $(name).dumpbin;\ dumpbin /symbols $(G4LIBDIR)/lib$(name).a > $(name).dumpbin;\ - echo "Building $(name).def file";\ + echo "Building $(name).def file ...";\ $(RM) $(name).def;\ - $(G4LIBDIR)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ + $(G4LIB)/$(G4SYSTEM)/win32def.exe $(name) < $(name).dumpbin > $(name).def;\ $(RM) $(name).dumpbin;\ - echo "Building lib$(name).exp and lib$(name).lib file";\ + echo "Building lib$(name).exp and lib$(name).lib ...";\ $(RM) $(G4LIBDIR)/lib$(name).exp;\ $(RM) $(G4LIBDIR)/lib$(name).lib;\ - lib.exe /nologo /machine:ix86 /def:$(name).def /out:$(G4LIBDIR)/lib$(name).lib;\ + lib.exe /nologo /machine:ix86 /def:$(name).def \ + /out:$(G4LIBDIR)/lib$(name).lib;\ $(RM) $(G4LIBDIR)/$(name).dll;\ - echo "Building $(name).dll file";\ - link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a /libpath:$(G4LIBDIR) $(GLOBLIBS) $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) + echo "Building $(name).dll ...";\ + link.exe /nologo /dll /out:$(G4LIBDIR)/$(name).dll \ + $(G4LIBDIR)/lib$(name).exp $(G4LIBDIR)/lib$(name).a \ + /libpath:$(G4LIBDIR) $(GLOBLIBS) \ + $(LIB_PATH)$(CLHEP_LIB_DIR) $(CLHEP_LIB) \ + $(INTYLIBS) $(ANALYSISLIBS) $(UI32LIBS) endef endif diff --git a/config/sys/WIN32-g++.gmk b/config/sys/WIN32-g++.gmk index a907c781f2..006e6a7ceb 100644 --- a/config/sys/WIN32-g++.gmk +++ b/config/sys/WIN32-g++.gmk @@ -1,7 +1,7 @@ # # ------ GNU/WIN32 CYGNUS ------ !!! not supported !!! -# Cygnus CygWin - gcc-2.95.3, gcc-3.2 -# Windows 2000/XP +# Cygnus CygWin - gcc-3.2 and higher +# Windows 2000/XP # # Stefano Agostinelli (agos001@pn.itnet.it) - IST Group, Genova # @@ -24,10 +24,12 @@ ifeq ($(G4SYSTEM),WIN32-g++) FCFLAGS += -fPIC CCFLAGS += -fPIC endif + G4RUNPATHOPTION := -Wl,-rpath FC := g77 FCFLAGS += -fno-automatic -fno-backslash -fno-second-underscore FCLIBS := -lg2c -lnsl ECHO := echo -e + SHEXT := so X11FLAGS := -I/usr/include/X11/extensions -I/usr/include/X11 X11LIBS := -L/usr/X11R6/lib -lXmu -lXt -lXext -lX11 -lSM -lICE XMFLAGS := -I/usr/X11R6/include @@ -39,12 +41,16 @@ ifeq ($(G4SYSTEM),WIN32-g++) OGLLIBS := -L$(OGLHOME)/lib -lGLU -lGL endif OIVFLAGS += -I$(OIHOME)/include - define build-granular-shared-lib - @echo "Shared Libraries not supported on $(G4SYSTEM) + @libdir=`(cd $(@D);/bin/pwd)`; \ + cd $(G4TMPDIR); \ + $(CXX) -Wl,-soname,$(@F) -shared -o $$libdir/$(@F) $(INTYLIBS) *.o endef define build-global-shared-lib - @echo "Shared Libraries not supported on $(G4SYSTEM) + @libdir=`(cd $(@D);/bin/pwd)`; \ + cd $(G4TMP)/$(G4SYSTEM); \ + $(CXX) -Wl,-soname,$(@F) -shared -o $$libdir/$(@F) $(INTYLIBS) \ + $(foreach dir,$(SUBLIBS),$(dir)/*.o); endef endif diff --git a/config/win32def.c b/config/win32def.c index 74e8e2dde4..e599d3b26f 100644 --- a/config/win32def.c +++ b/config/win32def.c @@ -1,4 +1,4 @@ -/* $Id: win32def.c,v 1.2 2004/02/09 16:44:45 gcosmo Exp $ */ +/* $Id: win32def.c,v 1.3 2004/06/18 16:10:06 gcosmo Exp $ */ /* +---------------------- Copyright notice -------------------------------+ */ /* | Copyright (C) 1995, Guy Barrand, LAL Orsay, (barrand@lal.in2p3.fr) | */ /* | Permission to use, copy, modify, and distribute this software | */ @@ -60,8 +60,11 @@ EXPORTS\n",aArgs[1]); length--; } if(strstr(buffer,"SECT")==NULL) continue; - if(strstr(buffer,"??_")!=NULL) continue; if(strstr(buffer,"External")==NULL) continue; + if(strstr(buffer,"??_")!=NULL) { + if(strstr(buffer,"operator/=")==NULL) continue; + /* Keep operator /= */ + } { char** words; @@ -69,24 +72,25 @@ EXPORTS\n",aArgs[1]); words = GetWords (buffer," ",&wordn); if(wordn>=8) { int iword = 7; + int offset = 0; if(strcmp(words[4],"()")==0) { iword = 7; } else if(strcmp(words[4],"External")==0) { iword = 6; } - if(words[iword][0]=='_') { - if(iword==6) { - printf(" %s\tDATA\n",words[iword]+1); - } else { - printf(" %s\n",words[iword]+1); - } + if(words[iword][0]=='_') offset = 1; + + if( (iword==6) && (strstr(buffer,"static class")!=NULL) ){ + /* static class objects are not DATA */ + printf(" %s\n",words[iword]+offset); + } else if(iword==6) { + /* DATA */ + printf(" %s\tDATA\n",words[iword]+offset); } else { - if(iword==6) { - printf(" %s\tDATA\n",words[iword]); - } else { - printf(" %s\n",words[iword]); - } + /* code */ + printf(" %s\n",words[iword]+offset); } + } {int count; for(count=0;countvalue(); G4ProcessManager* pmanager = particle->GetProcessManager(); - if (fDecayProcess->IsApplicable(*particle)) { + if (fDecayProcess->IsApplicable(*particle)) { pmanager ->AddProcess(fDecayProcess); diff --git a/electromagnetic_lists/standard/DecaysBuilder.hh b/electromagnetic_lists/standard/DecaysBuilder.hh new file mode 100755 index 0000000000..74045bdc05 --- /dev/null +++ b/electromagnetic_lists/standard/DecaysBuilder.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DecaysBuilder.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DecaysBuilder_h +#define DecaysBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DecaysBuilder : public G4VPhysicsConstructor +{ +public: + DecaysBuilder(const G4String& name = "decays"); + virtual ~DecaysBuilder(); + +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(); + +private: + + // hide assignment operator + DecaysBuilder & operator=(const DecaysBuilder &right); + DecaysBuilder(const DecaysBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + + + + + + + diff --git a/electromagnetic_lists/standard/G4EmHadronBuilder.cc b/electromagnetic_lists/standard/G4EmHadronBuilder.cc new file mode 100755 index 0000000000..773dcd1f68 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHadronBuilder.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHadronBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHadronBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering.hh" + +#include "G4hIonisation.hh" +#include "G4ionIonisation.hh" + +#include "G4Electron.hh" +#include "G4Proton.hh" +#include "G4GenericIon.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder::G4EmHadronBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder::~G4EmHadronBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder::ConstructParticle() +{ + G4Electron::Electron(); + G4Proton::Proton(); + G4GenericIon::GenericIon(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder::ConstructProcess() +{ + // Add standard EM Processes + theParticleIterator->reset(); + + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + + if(particle->GetPDGMass() > 110.*MeV) { + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "GenericIon") { + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4ionIonisation, -1, 2,2); + + } else if ((!particle->IsShortLived()) && + (particle->GetPDGCharge() != 0.0) && + (particle->GetParticleName() != "chargedgeantino")) { + + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); + pmanager->AddProcess(new G4hIonisation, -1,2,2); + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmHadronBuilder.hh b/electromagnetic_lists/standard/G4EmHadronBuilder.hh new file mode 100755 index 0000000000..6cee1dff65 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHadronBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHadronBuilder_h +#define G4EmHadronBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHadronBuilder : public G4VPhysicsConstructor +{ +public: + G4EmHadronBuilder(const G4String& name = "EM_stand_had"); + virtual ~G4EmHadronBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmHadronBuilder & operator=(const G4EmHadronBuilder &right); + G4EmHadronBuilder(const G4EmHadronBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/electromagnetic_lists/standard/G4EmHadronBuilder52.cc b/electromagnetic_lists/standard/G4EmHadronBuilder52.cc new file mode 100755 index 0000000000..2f58b4124b --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHadronBuilder52.cc @@ -0,0 +1,104 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder52.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHadronBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHadronBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4hIonisation52.hh" + +#include "G4Electron.hh" +#include "G4Proton.hh" +#include "G4GenericIon.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder52::G4EmHadronBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder52::~G4EmHadronBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder52::ConstructParticle() +{ + G4Electron::Electron(); + G4Proton::Proton(); + G4GenericIon::GenericIon(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder52::ConstructProcess() +{ + // Add standard EM Processes + theParticleIterator->reset(); + + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + + if(particle->GetPDGMass() > 110.*MeV) { + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "GenericIon") { + + pmanager->AddProcess(new G4hIonisation52, -1, 1, 1); + + } else if ((!particle->IsShortLived()) && + (particle->GetPDGCharge() != 0.0) && + (particle->GetParticleName() != "chargedgeantino")) { + + pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); + pmanager->AddProcess(new G4hIonisation52, -1,2,2); + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmHadronBuilder52.hh b/electromagnetic_lists/standard/G4EmHadronBuilder52.hh new file mode 100755 index 0000000000..2ede31253a --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHadronBuilder52.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder52.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHadronBuilder52_h +#define G4EmHadronBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHadronBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmHadronBuilder52(const G4String& name = "EM_stand_had"); + virtual ~G4EmHadronBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmHadronBuilder52 & operator=(const G4EmHadronBuilder52 &right); + G4EmHadronBuilder52(const G4EmHadronBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/electromagnetic_lists/standard/G4EmHighEnergyBuilder.cc b/electromagnetic_lists/standard/G4EmHighEnergyBuilder.cc new file mode 100755 index 0000000000..5a3599a669 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHighEnergyBuilder.cc @@ -0,0 +1,93 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHighEnergyBuilder.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHighEnergyBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHighEnergyBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4AnnihiToMuPair.hh" +#include "G4GammaConversionToMuons.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHighEnergyBuilder::G4EmHighEnergyBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHighEnergyBuilder::~G4EmHighEnergyBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHighEnergyBuilder::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHighEnergyBuilder::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + pmanager->AddDiscreteProcess( new G4GammaConversionToMuons() ); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + pmanager->AddDiscreteProcess( new G4AnnihiToMuPair() ); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmHighEnergyBuilder.hh b/electromagnetic_lists/standard/G4EmHighEnergyBuilder.hh new file mode 100755 index 0000000000..e523da7e0c --- /dev/null +++ b/electromagnetic_lists/standard/G4EmHighEnergyBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHighEnergyBuilder.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHighEnergyBuilder_h +#define G4EmHighEnergyBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHighEnergyBuilder : public G4VPhysicsConstructor +{ +public: + G4EmHighEnergyBuilder(const G4String& name = "EM_stan_HE"); + virtual ~G4EmHighEnergyBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmHighEnergyBuilder & operator=(const G4EmHighEnergyBuilder &right); + G4EmHighEnergyBuilder(const G4EmHighEnergyBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/electromagnetic_lists/standard/G4EmMuonBuilder.cc b/electromagnetic_lists/standard/G4EmMuonBuilder.cc new file mode 100755 index 0000000000..70839c1573 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmMuonBuilder.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmMuonBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmMuonBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering.hh" + +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder::G4EmMuonBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder::~G4EmMuonBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder::ConstructProcess() +{ + // Add standard EM Processes for mu+ + const G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); + + + // Add standard EM Processes for mu- + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmMuonBuilder.hh b/electromagnetic_lists/standard/G4EmMuonBuilder.hh new file mode 100755 index 0000000000..e9b787f781 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmMuonBuilder.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmMuonBuilder_h +#define G4EmMuonBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmMuonBuilder : public G4VPhysicsConstructor +{ +public: + G4EmMuonBuilder(const G4String& name = "EM_stan_muons"); + virtual ~G4EmMuonBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmMuonBuilder & operator=(const G4EmMuonBuilder &right); + G4EmMuonBuilder(const G4EmMuonBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/electromagnetic_lists/standard/G4EmMuonBuilder52.cc b/electromagnetic_lists/standard/G4EmMuonBuilder52.cc new file mode 100755 index 0000000000..d16b9a3bdf --- /dev/null +++ b/electromagnetic_lists/standard/G4EmMuonBuilder52.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder52.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmMuonBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmMuonBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4MuIonisation52.hh" +#include "G4MuBremsstrahlung52.hh" +#include "G4MuPairProduction52.hh" +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder52::G4EmMuonBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder52::~G4EmMuonBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder52::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder52::ConstructProcess() +{ + // Add standard EM Processes for mu+ + const G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation52, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,4); + + + // Add standard EM Processes for mu- + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation52, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmMuonBuilder52.hh b/electromagnetic_lists/standard/G4EmMuonBuilder52.hh new file mode 100755 index 0000000000..c105bacf85 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmMuonBuilder52.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder52.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmMuonBuilder52_h +#define G4EmMuonBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmMuonBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmMuonBuilder52(const G4String& name = "EM_stan_muons"); + virtual ~G4EmMuonBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmMuonBuilder52 & operator=(const G4EmMuonBuilder52 &right); + G4EmMuonBuilder52(const G4EmMuonBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/electromagnetic_lists/standard/G4EmQEDBuilder.cc b/electromagnetic_lists/standard/G4EmQEDBuilder.cc new file mode 100755 index 0000000000..0208c69b74 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmQEDBuilder.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder.cc,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmQEDBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmQEDBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4PhotoElectricEffect.hh" + +#include "G4MultipleScattering.hh" + +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder::G4EmQEDBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder::~G4EmQEDBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder::ConstructParticle() +{ + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddDiscreteProcess( new G4PhotoElectricEffect() ); + pmanager->AddDiscreteProcess( new G4ComptonScattering() ); + pmanager->AddDiscreteProcess( new G4GammaConversion() ); + + // Add standard EM Processes for e- + particle = G4Electron::Electron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmQEDBuilder.hh b/electromagnetic_lists/standard/G4EmQEDBuilder.hh new file mode 100755 index 0000000000..a877679449 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmQEDBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder.hh,v 1.1 2004/05/04 10:03:03 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmQEDBuilder_h +#define G4EmQEDBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmQEDBuilder : public G4VPhysicsConstructor +{ +public: + G4EmQEDBuilder(const G4String& name = "EM_stan_QED"); + virtual ~G4EmQEDBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmQEDBuilder & operator=(const G4EmQEDBuilder &right); + G4EmQEDBuilder(const G4EmQEDBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/electromagnetic_lists/standard/G4EmQEDBuilder52.cc b/electromagnetic_lists/standard/G4EmQEDBuilder52.cc new file mode 100755 index 0000000000..28eb6dadf3 --- /dev/null +++ b/electromagnetic_lists/standard/G4EmQEDBuilder52.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder52.cc,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmQEDBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmQEDBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4PhotoElectricEffect.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4eIonisation52.hh" +#include "G4eBremsstrahlung52.hh" +#include "G4eplusAnnihilation.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder52::G4EmQEDBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder52::~G4EmQEDBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder52::ConstructParticle() +{ + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder52::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddDiscreteProcess( new G4PhotoElectricEffect() ); + pmanager->AddDiscreteProcess( new G4ComptonScattering() ); + pmanager->AddDiscreteProcess( new G4GammaConversion() ); + + // Add standard EM Processes for e- + particle = G4Electron::Electron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); + pmanager->AddProcess(new G4eIonisation52, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); + pmanager->AddProcess(new G4eIonisation52, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/electromagnetic_lists/standard/G4EmQEDBuilder52.hh b/electromagnetic_lists/standard/G4EmQEDBuilder52.hh new file mode 100755 index 0000000000..cd6319fd5c --- /dev/null +++ b/electromagnetic_lists/standard/G4EmQEDBuilder52.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder52.hh,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmQEDBuilder52_h +#define G4EmQEDBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmQEDBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmQEDBuilder52(const G4String& name = "EM_stan_QED"); + virtual ~G4EmQEDBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmQEDBuilder52 & operator=(const G4EmQEDBuilder52 &right); + G4EmQEDBuilder52(const G4EmQEDBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm7/src/PhysListParticles.cc b/electromagnetic_lists/standard/ParticlesBuilder.cc old mode 100644 new mode 100755 similarity index 87% rename from examples/extended/electromagnetic/TestEm7/src/PhysListParticles.cc rename to electromagnetic_lists/standard/ParticlesBuilder.cc index 44e22c2495..536b94bb1e --- a/examples/extended/electromagnetic/TestEm7/src/PhysListParticles.cc +++ b/electromagnetic_lists/standard/ParticlesBuilder.cc @@ -21,13 +21,24 @@ // ******************************************************************** // // -// $Id: PhysListParticles.cc,v 1.1 2003/04/22 16:25:07 maire Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ParticlesBuilder.cc,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: ParticleBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "PhysListParticles.hh" +#include "ParticlesBuilder.hh" // Bosons #include "G4ChargedGeantino.hh" @@ -73,22 +84,22 @@ #include "G4He3.hh" #include "G4GenericIon.hh" -#include "IonC12.hh" +//#include "IonC12.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListParticles::PhysListParticles(const G4String& name) +ParticlesBuilder::ParticlesBuilder(const G4String& name) : G4VPhysicsConstructor(name) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListParticles::~PhysListParticles() +ParticlesBuilder::~ParticlesBuilder() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PhysListParticles::ConstructParticle() +void ParticlesBuilder::ConstructParticle() { // pseudo-particles @@ -137,7 +148,7 @@ void PhysListParticles::ConstructParticle() G4He3::He3Definition(); G4Alpha::AlphaDefinition(); G4GenericIon::GenericIonDefinition(); - IonC12::IonDefinition(); +// IonC12::IonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/include/PhysListParticles.hh b/electromagnetic_lists/standard/ParticlesBuilder.hh old mode 100644 new mode 100755 similarity index 77% rename from examples/extended/electromagnetic/TestEm3/include/PhysListParticles.hh rename to electromagnetic_lists/standard/ParticlesBuilder.hh index 9ae360bb99..42ca24b715 --- a/examples/extended/electromagnetic/TestEm3/include/PhysListParticles.hh +++ b/electromagnetic_lists/standard/ParticlesBuilder.hh @@ -21,34 +21,34 @@ // ******************************************************************** // // -// $Id: PhysListParticles.hh,v 1.2 2003/10/06 10:09:23 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ParticlesBuilder.hh,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListParticles_h -#define PhysListParticles_h 1 +#ifndef ParticlesBuilder_h +#define ParticlesBuilder_h 1 #include "G4VPhysicsConstructor.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListParticles : public G4VPhysicsConstructor +class ParticlesBuilder : public G4VPhysicsConstructor { - public: - PhysListParticles(const G4String& name = "particles"); - ~PhysListParticles(); +public: + ParticlesBuilder(const G4String& name = "particles"); + virtual ~ParticlesBuilder(); - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(); - - // This method is dummy. - void ConstructProcess() {}; +public: + // This method will be invoked in the Construct() method. + // each particle type will be instantiated + virtual void ConstructParticle(); + + // This method is dummy. + virtual void ConstructProcess() {}; }; diff --git a/electromagnetic_lists/standard/PhysicsList.cc b/electromagnetic_lists/standard/PhysicsList.cc new file mode 100644 index 0000000000..c291d4496a --- /dev/null +++ b/electromagnetic_lists/standard/PhysicsList.cc @@ -0,0 +1,177 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysicsList.cc,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: PhysicsList +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsList.hh" +#include "PhysicsListMessenger.hh" + +#include "ParticlesBuilder.hh" +#include "G4EmQEDBuilder.hh" +#include "G4EmMuonBuilder.hh" +#include "G4EmHadronBuilder.hh" +#include "G4EmHighEnergyBuilder.hh" +#include "G4EmQEDBuilder52.hh" +#include "G4EmMuonBuilder52.hh" +#include "G4EmHadronBuilder52.hh" +#include "DecaysBuilder.hh" + +#include "G4UnitsTable.hh" +#include "G4LossTableManager.hh" +#include "G4EmProcessOptions.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::PhysicsList() : G4VModularPhysicsList(), + verbose(0), + emBuilderIsRegisted(false) +{ + G4LossTableManager::Instance(); + defaultCutValue = 1.*mm; + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForPositron = defaultCutValue; + + pMessenger = new PhysicsListMessenger(this); + + // Add Physics builders + RegisterPhysics(new ParticlesBuilder()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::~PhysicsList() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructParticle() +{ + if(!emBuilderIsRegisted) AddPhysicsList("standard"); + G4VModularPhysicsList::ConstructParticle(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructProcess() +{ + G4VModularPhysicsList::ConstructProcess(); + + // Define energy interval for loss processes + G4EmProcessOptions emOptions; + emOptions.SetMinEnergy(0.1*keV); + emOptions.SetMaxEnergy(100.*GeV); + emOptions.SetDEDXBinning(90); + emOptions.SetLambdaBinning(90); + emOptions.SetBuildPreciseRange(false); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::AddPhysicsList(const G4String& name) +{ + G4bool yes = false; + + if ("standard" == name && !emBuilderIsRegisted) { + RegisterPhysics(new G4EmQEDBuilder()); + RegisterPhysics(new G4EmMuonBuilder()); + RegisterPhysics(new G4EmHadronBuilder()); + RegisterPhysics(new DecaysBuilder()); + emBuilderIsRegisted = true; + yes = true; + + } else if ("g4v52" == name && !emBuilderIsRegisted) { + RegisterPhysics(new G4EmQEDBuilder52()); + RegisterPhysics(new G4EmMuonBuilder52()); + RegisterPhysics(new G4EmHadronBuilder52()); + RegisterPhysics(new DecaysBuilder()); + emBuilderIsRegisted = true; + yes = true; + + } else if ("high_energy" == name ) { + RegisterPhysics(new G4EmHighEnergyBuilder()); + + } else { + G4cout << "PhysicsList::AddPhysicsList <" << name << ">" + << " fail - name is unknown " << G4endl; + } + if (verbose>0 && yes) { + G4cout << "PhysicsList::AddPhysicsList <" << name << ">" << G4endl; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCuts() +{ + + SetCutValue(cutForGamma, "gamma"); + SetCutValue(cutForElectron, "e-"); + SetCutValue(cutForPositron, "e+"); + + if (verbose>0) DumpCutValuesTable(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetVerbose(G4int val) +{ + verbose = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCutForGamma(G4double cut) +{ + cutForGamma = cut; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCutForElectron(G4double cut) +{ + cutForElectron = cut; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCutForPositron(G4double cut) +{ + cutForPositron = cut; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/electromagnetic_lists/standard/PhysicsList.hh b/electromagnetic_lists/standard/PhysicsList.hh new file mode 100644 index 0000000000..f8295a2f3a --- /dev/null +++ b/electromagnetic_lists/standard/PhysicsList.hh @@ -0,0 +1,88 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsList.hh,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// +//--------------------------------------------------------------------------- +// +// ClassName: PhysicsList +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsList_h +#define PhysicsList_h 1 + +#include "G4VModularPhysicsList.hh" +#include "globals.hh" + +class PhysicsListMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsList: public G4VModularPhysicsList +{ +public: + PhysicsList(); + ~PhysicsList(); + + virtual void ConstructParticle(); + virtual void ConstructProcess(); + virtual void SetCuts(); + + void SetCutForGamma(G4double); + void SetCutForElectron(G4double); + void SetCutForPositron(G4double); + + void AddPhysicsList(const G4String&); + void SetVerbose(G4int val); + +private: + + // hide assignment operator + PhysicsList & operator=(const PhysicsList &right); + PhysicsList(const PhysicsList&); + + G4double cutForGamma; + G4double cutForElectron; + G4double cutForPositron; + G4int verbose; + G4bool emBuilderIsRegisted; + + PhysicsListMessenger* pMessenger; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/electromagnetic_lists/standard/PhysicsListMessenger.cc b/electromagnetic_lists/standard/PhysicsListMessenger.cc new file mode 100644 index 0000000000..67363a5446 --- /dev/null +++ b/electromagnetic_lists/standard/PhysicsListMessenger.cc @@ -0,0 +1,114 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsListMessenger.cc,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsListMessenger.hh" + +#include "PhysicsList.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithAString.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) +:pPhysicsList(pPhys) +{ + gammaCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setGCut",this); + gammaCutCmd->SetGuidance("Set gamma cut."); + gammaCutCmd->SetParameterName("Gcut",false); + gammaCutCmd->SetUnitCategory("Length"); + gammaCutCmd->SetRange("Gcut>0.0"); + gammaCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + electCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setECut",this); + electCutCmd->SetGuidance("Set electron cut."); + electCutCmd->SetParameterName("Ecut",false); + electCutCmd->SetUnitCategory("Length"); + electCutCmd->SetRange("Ecut>0.0"); + electCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + protoCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setPCut",this); + protoCutCmd->SetGuidance("Set positron cut."); + protoCutCmd->SetParameterName("Pcut",false); + protoCutCmd->SetUnitCategory("Length"); + protoCutCmd->SetRange("Pcut>0.0"); + protoCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + allCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setCuts",this); + allCutCmd->SetGuidance("Set cut for all."); + allCutCmd->SetParameterName("cut",false); + allCutCmd->SetUnitCategory("Length"); + allCutCmd->SetRange("cut>0.0"); + allCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + pListCmd = new G4UIcmdWithAString("/testem/phys/addPhysics",this); + pListCmd->SetGuidance("Add modula physics list."); + pListCmd->SetParameterName("PList",false); + pListCmd->AvailableForStates(G4State_PreInit); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::~PhysicsListMessenger() +{ + delete gammaCutCmd; + delete electCutCmd; + delete protoCutCmd; + delete allCutCmd; + delete pListCmd; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListMessenger::SetNewValue(G4UIcommand* command, + G4String newValue) +{ + if( command == gammaCutCmd ) + { pPhysicsList->SetCutForGamma(gammaCutCmd->GetNewDoubleValue(newValue));} + + if( command == electCutCmd ) + { pPhysicsList->SetCutForElectron(electCutCmd->GetNewDoubleValue(newValue));} + + if( command == protoCutCmd ) + { pPhysicsList->SetCutForPositron(protoCutCmd->GetNewDoubleValue(newValue));} + + if( command == allCutCmd ) + { + G4double cut = allCutCmd->GetNewDoubleValue(newValue); + pPhysicsList->SetCutForGamma(cut); + pPhysicsList->SetCutForElectron(cut); + pPhysicsList->SetCutForPositron(cut); + } + + if( command == pListCmd ) + { pPhysicsList->AddPhysicsList(newValue);} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/electromagnetic_lists/standard/PhysicsListMessenger.hh b/electromagnetic_lists/standard/PhysicsListMessenger.hh new file mode 100644 index 0000000000..3b9a63367a --- /dev/null +++ b/electromagnetic_lists/standard/PhysicsListMessenger.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsListMessenger.hh,v 1.1 2004/05/04 10:03:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsListMessenger_h +#define PhysicsListMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class PhysicsList; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithAString; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsListMessenger: public G4UImessenger +{ + public: + + PhysicsListMessenger(PhysicsList* ); + ~PhysicsListMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + + PhysicsList* pPhysicsList; + + G4UIcmdWithADoubleAndUnit* gammaCutCmd; + G4UIcmdWithADoubleAndUnit* electCutCmd; + G4UIcmdWithADoubleAndUnit* protoCutCmd; + G4UIcmdWithADoubleAndUnit* allCutCmd; + G4UIcmdWithAString* pListCmd; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/environments/MOMO/History b/environments/MOMO/History index a86df37b59..964dad714d 100644 --- a/environments/MOMO/History +++ b/environments/MOMO/History @@ -1,4 +1,4 @@ -$Id: History,v 1.3 2003/12/09 08:00:40 yhajime Exp $ +$Id: History,v 1.4 2004/01/05 07:41:56 yhajime Exp $ ------------------------------------------------------------------- ========================================================= @@ -18,6 +18,10 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +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 diff --git a/environments/MOMO/MOMO.jar b/environments/MOMO/MOMO.jar index 74338834ffb46c5ed5d9f4d888f30176711a6e9d..f3d03811852bcee9240bb9ca36ffc20508af4ddf 100644 GIT binary patch delta 69121 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 diff --git a/examples/History b/examples/History index e6b023c494..36de5f41ef 100644 --- a/examples/History +++ b/examples/History @@ -1,4 +1,4 @@ -$Id: History,v 1.80 2004/03/25 18:10:57 gcosmo Exp $ +$Id: History,v 1.84 2004/06/23 16:15:45 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,34 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +24th June 2004 Gabriele Cosmo (examples-V06-01-02) +- Updated reference outputs according to reference tag geant4-06-02-ref-00. +- Includes tags: cosmicray_charging-V06-01-02, GammaRayTel-V06-01-01, + hadrontherapy-V06-01-01, lAr_calorimeter-V06-01-01, + purtag-V06-01-02, radioprotection-V06-01-06, Rich-V06-01-00, + Tiara-V06-01-03, DMX-V06-01-00, XrayFluo-V06-01-06, + xraytel-V06-01-01, exampleA01-V06-01-01, exbiasing-V06-01-00, + muonprocesses-V06-01-01, photonprocesses-V06-01-01, + testem1-V06-01-03, testem2-V06-01-03, testem3-V06-01-04, + testem3-V06-01-01, testem5-V06-01-04, testem7-V06-01-01 + testem8-V06-01-00, testem9-V06-01-00, BlineTracer-V06-01-00, + opticalex-V06-01-00, exparallel-V06-01-00, + exampleN03-V06-01-00, exampleN06-V06-01-01. + +28th May 2004 Gabriele Cosmo (examples-V06-01-01) +- Updated reference outputs according to reference tag geant4-06-01-ref-02. +- Includes tags: brachy-V06-01-01, ccal-V06-01-01, lAr_calorimeter-V06-01-00, + medical_linac-V06-01-03, photonprocesses-V06-01-00, + testem2-V06-01-02, testem3-V06-01-01, testem5-V06-01-00, + DICOM-V06-01-00. + +30th April 2004 Gabriele Cosmo (examples-V06-01-00) +- Updated reference outputs according to reference tag geant4-06-01-ref-01. +- Includes tags: testem1-V06-01-02, testem2-V06-01-00, testem3-V06-01-00, + testem4-V06-01-00, testem5-V06-01-00, testem6-V06-01-00, + testem7-V06-01-00, exampleN02-V06-01-00, exampleN03-V06-00-00, + exampleN06-V06-01-00. + 25th March 2004 Gabriele Cosmo (examples-V06-00-02) - Updated reference outputs according to reference tag geant4-06-01-ref-00. diff --git a/examples/advanced/GNUmakefile b/examples/advanced/GNUmakefile index 5503375e61..1f3eecdbe5 100644 --- a/examples/advanced/GNUmakefile +++ b/examples/advanced/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.4 2003/06/25 14:55:54 gcosmo Exp $ +# $Id: GNUmakefile,v 1.5 2004/06/23 16:09:48 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -9,8 +9,9 @@ endif include $(G4INSTALL)/config/architecture.gmk -SUBDIRS = brachytherapy gammaray_telescope underground_physics -SUBDIRS += xray_fluorescence xray_telescope +SUBDIRS = gammaray_telescope underground_physics xray_fluorescence xray_telescope +SUBDIRS += brachytherapy cosmicray_charging hadrontherapy +SUBDURS += medical_linac purging_magnet radioprotection SUBDIRS += Tiara Rich composite_calorimeter lAr_calorimeter .PHONY : all clean clean_libs diff --git a/examples/advanced/Rich/History b/examples/advanced/Rich/History index 0644275212..3ff526aafe 100644 --- a/examples/advanced/Rich/History +++ b/examples/advanced/Rich/History @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -$Id: History,v 1.2 2004/03/12 16:17:29 ribon Exp $ +$Id: History,v 1.3 2004/05/28 11:19:18 ribon Exp $ ------------------------------------------------------------------- ========================================================= @@ -9,6 +9,9 @@ $Id: History,v 1.2 2004/03/12 16:17:29 ribon Exp $ Category History file --------------------- +18.05.2004 - A.Ribon (Rich-V06-01-00) + Ported to PI light. No changes of the code. + 12.03.2004 - A.Ribon (Rich-V06-00-00) Fixed compilation errors and warnings for g++ 3.2 . diff --git a/examples/advanced/Rich/README b/examples/advanced/Rich/README index 92e1941380..e95ae169ec 100644 --- a/examples/advanced/Rich/README +++ b/examples/advanced/Rich/README @@ -118,21 +118,15 @@ See their definition on AnalysisManager. Note that histograms are disabled via the flag G4ANALYSIS_USE in GNUmakefile. -7. USING THE LAST ANAPHE IMPLEMENTATION OF AIDA HISTOGRAMS ------------------------------------------------------------- +7. Using the PI implementation of the AIDA histograms: +------------------------------------------------------ -In order to use the new Anaphe implementation of the AIDA interfaces -prepare some environment variables by source-ing one of the following -startup scripts: +In order to setup the proper environmental variables, needed for +running AIDA / PI , run the script: -(THIS EXAMPLE HAS BEEN DEVELOPED AND TESTED WITH THE gcc-2.95.5 COMPILER) -(A.R. 12-Mar-2004 : TESTED ALSO WITH gcc-3.2 or Linux RH 7.3) + --- For c-shell : source setupAidaPi.csh -o Setup the environment variable: G4ANALYSIS_USE 1 -o setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/specific/redhat73/gcc-2.95.2/5.0.5/bin -o source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/install/sharedstart.csh -o ln -s /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/* ~/bin/ (this has -to be done only once) + --- For bash-shell : . setupAidaPi.sh -After this, you will have access to the last 'aida-config' command -which is used in the GNUmakefile. \ No newline at end of file +Notice that you need g++ 3.2 or 3.23. + diff --git a/examples/advanced/Rich/setupAidaPi.csh b/examples/advanced/Rich/setupAidaPi.csh new file mode 100755 index 0000000000..943e9e63fe --- /dev/null +++ b/examples/advanced/Rich/setupAidaPi.csh @@ -0,0 +1,11 @@ +#------------------------------------------------------------------ +# C-shell script to be run before building/executing this example. +#------------------------------------------------------------------ +# +# --- Geant4 specific --- +setenv G4ANALYSIS_USE 1 +# +# --- Aida / PI --- +eval `aida-config --runtime csh` +# + diff --git a/examples/advanced/Rich/setupAidaPi.sh b/examples/advanced/Rich/setupAidaPi.sh new file mode 100755 index 0000000000..cf277fbe5f --- /dev/null +++ b/examples/advanced/Rich/setupAidaPi.sh @@ -0,0 +1,12 @@ +#------------------------------------------------------------------ +# Bash-shell script to be run before building/executing this example. +#------------------------------------------------------------------ +# +# --- Geant4 specific --- +export G4ANALYSIS_USE=1 +# +# --- Aida / PI --- +eval `aida-config --runtime sh` +# + + diff --git a/examples/advanced/Tiara/GNUmakefile b/examples/advanced/Tiara/GNUmakefile index 9e9c4598a9..845a25d073 100644 --- a/examples/advanced/Tiara/GNUmakefile +++ b/examples/advanced/Tiara/GNUmakefile @@ -1,6 +1,6 @@ -# $Id: GNUmakefile,v 1.5 2003/12/08 17:53:25 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/09 15:04:34 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # -------------------------------------------------------------- @@ -10,17 +10,26 @@ TIARA_SRC_SWIG_DIRS = CLHEPWrapper G4KernelWrapper TiaraWrapper include $(G4INSTALL)/config/architecture.gmk -.PHONY: Tiara tiaraClean swigClean all +.PHONY: Tiara tiaraClean swigClean clean_all all all: Tiara +#ifdef G4ANALYSIS_USE +# CPPFLAGS += `aida-config --include` +# LDFLAGS += `aida-config --lib` +# LDLIBS += `aida-config --lib` +#endif + Tiara: @for dir in $(TIARA_SRC_DIRS); do ( cd source/$$dir && $(MAKE)); done;: @for dir in $(TIARA_SRC_SWIG_DIRS); do ( cd source/$$dir && $(MAKE)); done;: +clean_all: swigClean tiaraClean + @rm -f source/py_modules/*.pyc + @rm -rf run/simData + tiaraClean: @for dir in $(TIARA_SRC_DIRS); do ( cd source/$$dir && $(MAKE) tiaraClean); done;: @for dir in $(TIARA_SRC_SWIG_DIRS); do ( cd source/$$dir && $(MAKE) tiaraClean); done;: swigClean: @for dir in $(TIARA_SRC_SWIG_DIRS); do ( cd source/$$dir && $(MAKE) swigClean); done;: - diff --git a/examples/advanced/Tiara/History b/examples/advanced/Tiara/History index 865a396972..390a6b79d7 100644 --- a/examples/advanced/Tiara/History +++ b/examples/advanced/Tiara/History @@ -1,6 +1,6 @@ -# $Id: History,v 1.18 2003/12/09 08:48:33 daquinog Exp $ +# $Id: History,v 1.19 2004/06/09 15:04:34 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- ========================================================= @@ -18,6 +18,11 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 9th, 2004 G.Daquino - Tiara-V06-01-00 +- Passing from Anaphe to PI, Tiara has been partly fixed. Still problems + are present on the compatibility between the PI and Anaphe pointers for hf. + However, runSimNoAnalysis.py works correctly, being independent of the + analysis tool. Dec 9th, 2003 G.Daquino - Tiara-V05-02-06 - Fixed implementation of TiaraPrimaryGeneratorAction, where copy diff --git a/examples/advanced/Tiara/README b/examples/advanced/Tiara/README index e511b85b3b..48c31ccdf3 100644 --- a/examples/advanced/Tiara/README +++ b/examples/advanced/Tiara/README @@ -1,6 +1,6 @@ -# $Id: README,v 1.15 2003/12/08 17:53:25 gcosmo Exp $ +# $Id: README,v 1.18 2004/06/13 13:35:12 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- Simulation of the TIARA experiment using importance sampling @@ -16,7 +16,7 @@ created by 43 MeV and 68 MeV protons bombarding a 7Li target are measured behind several shields. The simulation starts from the neutron spectra. In this example the interactions of the neutrons with the (concrete) shields are simulated and energy dependent neutron fluxes are measured -behind the shields. Users may chose to run the simulation for different +behind the shields. Users may choose to run the simulation for different shielding configuration with or without importance sampling. The simulated neutron fluxes are compared to the published experimental data. The efficiency of applying importance sampling @@ -28,9 +28,9 @@ For Application Developers", Chapter "Toolkit Fundamentals" Section "Event Biasing Techniques" and references there. The example has been tested on CERN RH 7.3 with the -gcc-3.2 and gcc-2.95.2 compilers. +gcc-3.2.3 and gcc-2.95.2 compilers. -Note for system testing without analysis: see points 1, 1.3 and 3.2. +Note for system testing without analysis: see points 1.1, 1.3 and 3.2. @@ -41,51 +41,43 @@ Note for system testing without analysis: see points 1, 1.3 and 3.2. You must compile Geant4 with: "G4LIB_BUILD_SHARED" set to 1. You need to set: - "NeutronHPCrossSections" (e.g. to ${G4INSTALL}/data/G4NDL3.7) + "NeutronHPCrossSections" (e.g. pointing to a directory containing G4NDL3.7) Three examples are given of how to set environment variables in the three cases: -1.1) Anaphe via AFS (most simple): +1.1) PI via AFS (most simple): -------------------- - You have access to afs and you want to use Anaphe for the + You have access to afs and you want to use PI for the analysis: Set the following environment variables: "G4ANALYSIS_USE" + "PI_BASE_DIR" (where PI has been installed) + "SWIG_BASE_DIR" (where SWIG has been installed) - "ANAPHETOP" (e.g. /afs/cern.ch/sw/lhcxx) - "AIDA_DIR" (e.g. /afs/cern.ch/sw/contrib/AIDA/3.0/src/cpp) - "ANAPHE_SCRIPTS" (e.g. /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts) - - Finally source the script envCommon.csh from the directory - you have Tiara installed, e.g. ${G4INSTALL}/examples/advanced/Tiara + Finally source the script envCommon.csh from the directory where you have Tiara + installed, e.g. ${G4INSTALL}/examples/advanced/Tiara -1.2) No afs but a local Anaphe and AIDA installation: +1.2) No afs but a local PI and SWIG installation: ----------------------------------------------------- - You don't use afs but you have a local installation of Anaphe and AIDA - (e.g. from http://anaphe.web.cern.ch/anaphe/. + You don't use afs but you have a local installation of SWIG and PI Set the following environment variables: "G4ANALYSIS_USE" - - "ANAPHETOP" (e.g. /Anaphe/release) - "AIDA_DIR" (e.g. /AIDA/3.0.0/3.0.0/AIDA/3.0/src/cpp) - "ANAPHE_SCRIPTS" (e.g. ${ANAPHETOP}/share/LHCXX/5.0.6/scripts) + "PI_BASE_DIR" + "SWIG_BASE_DIR" - here is a place holder for your directory with the - respective installations of Anaphe and AIDA - - Finally source the script envCommon.csh from the directory + Finally source the script envCommon.csh from the directory where you have Tiara installed, e.g. ${G4INSTALL}/examples/advanced/Tiara -1.3) No afs, no Anaphe and no AIDA (e.g. for system testing): +1.3) No afs, no PI and no SWIG (e.g. for system testing): ------------------------------------------------------------- - You don't want to use Anaphe and AIDA and you don't have afs access. - Make sure "G4ANALYSIS_USE" is unset (e.g. unsetenv G4ANALYSIS_USE). - - Note: python must be built against a "libc". + You don't want to use PI and SWIG and you don't have afs access. + Make sure "G4ANALYSIS_USE" is unset (e.g. unsetenv G4ANALYSIS_USE) + + Note 1: python must be built against a "libc". You may do this by creating a shared library by a command similar to this "ld -shared -o libpython2.2.so --whole-archive libpython2.2.a /usr/lib/libc.so" @@ -97,16 +89,21 @@ in the three cases: "SWIG_BASE_DIR" (e.g. /usr) "CLHEP_BASE_DIR" (e.g. to /opt/local) - Finally source the script envCommon.csh from the directory + Finally source the script envCommon.csh from the directory where you have Tiara installed, e.g. ${G4INSTALL}/examples/advanced/Tiara - + + Note 2: Passing from a simulation WITH to another WITHOUT analysis implies + that the G4ANALYSIS_use should be unset and that the SWIG-wrapper scripts + in the directory TiaraWrapper should be deleted. Normally, the whole code + should be compiled again using gmake tiaraClean and, afterwards, gmake. + The same procedure should be followed also passing from a simulation WITHOUT + to another WITH analysis. 2) Building the example ======================= Geant4 has to be compiled using G4LIB_BUILD_SHARED 1 and the one of the above environment settings have to be set. - Type "gmake". @@ -116,10 +113,7 @@ Type "gmake". Geant4 must be compiled into granular shared libraries. Therefore before compiling Geant4 set "G4LIB_BUILD_SHARED" to "1". -External packages used in this example are Anaphe, SWIG and Python. -The Anaphe package comes with SWIG and Python versions used to build -Anaphe itself. These SWIG and Python versions should also be used with -this example if Anaphe is used. +External packages used in this example are PI, SWIG and Python. 2.2) Cleaning up @@ -134,10 +128,10 @@ $G4WORKDIR/tmp/$G4SYSTEM/ use "gmake tiaraClean". ======================= -3.1) Using Anaphe +3.1) Using PI ----------------- Change to the sub directory "run" and execute "runSim.py". -"runSim.py" runs an example configuration which nay be +"runSim.py" runs an example configuration which may be changed by the user. The results of the simulation are stored in the directory "simData". The script "runSim.py" periodically prints scoring information to the @@ -146,8 +140,8 @@ It also prints out the relative path of a ".shelve" file. This file can be used to access results of the simulation. In case the example was build using analysis -results may be viewed e.g. using lizard and scripts: -1) Start python2.2 or lizard +results may be viewed e.g. using python or ROOT: +1) Start python2.2 2) type: import dataAcess 3) type: p = dataAcess.ExpMcPlot (shelveFileName,detectorposition) where "shelveFileName" is the name (enclosed in quotes) of the @@ -184,7 +178,7 @@ set the print out period to 30 minutes by setting: -3.2) Not using Anaphe (mainly for system testing) +3.2) Not using PI (mainly for system testing) ------------------------------------------------- Change to the sub directory "run" and execute runSimNoAnalysis.py. @@ -197,7 +191,7 @@ runSimNoAnalysis.py. ============================ -simCommon.csh - a script to setup environment variables +envCommon.csh - a script to setup environment variables in case the above one of the above environment settings have been done beforehand. diff --git a/examples/advanced/Tiara/envCommon.csh b/examples/advanced/Tiara/envCommon.csh index fc9db78aed..0a8ff2a151 100644 --- a/examples/advanced/Tiara/envCommon.csh +++ b/examples/advanced/Tiara/envCommon.csh @@ -1,6 +1,6 @@ -# $Id: envCommon.csh,v 1.8 2003/12/08 17:53:26 gcosmo Exp $ +# $Id: envCommon.csh,v 1.9 2004/06/09 15:04:34 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # Before sourcing this script make sure you have set the # environment variables according to the description in README. @@ -8,44 +8,38 @@ # setup in case Anaphe is used -------------------------------------- -if (${?ANAPHE_SCRIPTS} == 1 && ${?ANAPHETOP} == 1 && ${?AIDA_DIR} == 1 ) then +if (${?PI_BASE_DIR} == 1 && ${?SWIG_BASE_DIR} == 1) then - if ( -f $ANAPHE_SCRIPTS/setupAnaphe.csh ) then - source $ANAPHE_SCRIPTS/setupAnaphe.csh - else if ( -f $ANAPHE_SCRIPTS/setup-Anaphe.csh) then - source $ANAPHE_SCRIPTS/setup-Anaphe.csh - else - echo "envCommon.csh: ERROR: could not find a setup file for anaphe" - exit - endif - setenv PATH ${ANAPHE_SCRIPTS}:$PATH - setenv ANAPHESPECDIR `(cd $ANAPHE_REL_DIR/../; pwd)` + setenv PI_VERSION 1_2_1 + setenv PI_VER 1.2.1 + setenv PI_ARCH rh73_gcc32 + setenv PATH ${PATH}:${PI_BASE_DIR}/${PI_VER}/app/releases/PI/PI_${PI_VER}/${PI_ARCH}/bin + setenv PATH ${PI_BASE_DIR}/Linux-g++/bin:$PATH + eval `aida-config -r csh` # - # python from Anaphe + # python from PI # setenv PYTHONVERSION 2.2 - setenv PYTHON_INCLUDE_DIR ${ANAPHESPECDIR}/PublicDomainPackages/2.0.0/include/python${PYTHONVERSION} - setenv PYTHON_LIB_DIR ${ANAPHESPECDIR}/PublicDomainPackages/2.0.0/lib/python${PYTHONVERSION}/config + setenv PYTHON_INCLUDE_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PI_ARCH}/include/python${PYTHONVERSION} + setenv PYTHON_LIB_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PI_ARCH}/lib/python${PYTHONVERSION}/config + # + # python for PI +if (${?PYTHONPATH} == 0) then + setenv PYTHONPATH +endif + setenv PYTHONPATH ${PI_BASE_DIR}/Linux-g++/python:$PYTHONPATH + setenv PYTHONPATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/rh73_gcc32/lib:$PYTHONPATH # # setup the swig command # setenv SWIG_VERSION 1.3.15 - setenv SWIG_BASE_DIR ${ANAPHESPECDIR}/PublicDomainPackages/2.0.0 setenv SWIG_INCDIRS "-I${SWIG_BASE_DIR}/lib/swig-${SWIG_VERSION} -I${SWIG_BASE_DIR}/lib/swig-${SWIG_VERSION}/python" setenv SWIG ${SWIG_BASE_DIR}/bin/swig-${SWIG_VERSION} - # - # CLHEP from Anaphe (shared libraries are required) - # - setenv CLHEP_BASE_DIR ${ANAPHETOP}/specific/${PLATF}/CLHEP/1.8.0.0 - # - # add scripts path to PATH - # - setenv PATH ${ANAPHETOP}/share/LHCXX/${ANAPHE_VERSION}/scripts:${PATH} else # not using Anaphe echo "-- WARNING: histograms are not activated !" - echo " Either ANAPHE_SCRIPTS, ANAPHETOP or AIDA_DIR are not set." + echo " Either PI_BASE_DIR or SWIG_BASE_DIR are not set." # if ( ${?PYTHONVERSION} == 1 && \ ${?PYTHON_BASE_DIR} == 1 && \ @@ -75,7 +69,7 @@ else # not using Anaphe exit endif -endif # end settings for not using Anaphe +endif # end settings for not using PI # # common settings @@ -92,6 +86,9 @@ setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/tmp/${G4SYSTEM}/tiaraPhys setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/tmp/${G4SYSTEM}/tiaraPhysicsLists setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/lib/${G4SYSTEM} setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${PYTHON_LIB_DIR} +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH /afs/cern.ch/sw/lcg/external/Python/2.2.2/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/external/Boost/1.30.2/rh73_gcc32/lib:$LD_LIBRARY_PATH setenv TIARA_BASE `pwd` setenv TIARASCRIPTS ${TIARA_BASE}/source/py_modules if (${?PYTHONPATH} == 0) then @@ -102,3 +99,4 @@ setenv PYTHONPATH ${PYTHONPATH}:${TIARA_BASE}/run:${TIARASCRIPTS} setenv PYTHONPATH ${PYTHONPATH}:${TIARA_BASE}/source/TiaraWrapper setenv PYTHONPATH ${PYTHONPATH}:${TIARA_BASE}/source/G4KernelWrapper setenv PYTHONPATH ${PYTHONPATH}:${TIARA_BASE}/source/CLHEPWrapper +# diff --git a/examples/advanced/Tiara/run/runSim.py b/examples/advanced/Tiara/run/runSim.py index 6ae7937097..9dface0b8c 100755 --- a/examples/advanced/Tiara/run/runSim.py +++ b/examples/advanced/Tiara/run/runSim.py @@ -1,8 +1,8 @@ #!/usr/bin/env python2.2 # -# $Id: runSim.py,v 1.7 2003/06/20 12:41:06 dressel Exp $ +# $Id: runSim.py,v 1.8 2004/06/09 15:04:35 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # importing python libraries @@ -96,7 +96,6 @@ comment = "" ########################################################################## # this should be fine for most settings - experiment = tiaraSpecifications.Experiment(beamEnergy, particleCut["neutron"], particleCut, @@ -159,10 +158,8 @@ impScorer = G4Kernel.G4Scorer() ########################################################################## # this and the remaining part should be fine for most settings - tApp = tiaraApplication.TiaraApplet(tiaraSpecs, Tiara.TiaraSim_GetTiaraSim()) - if totalTime == 0: tApp.visMode() else: @@ -173,18 +170,14 @@ tApp.specifyPhysicsList(physList, particleCut) # detectors tApp.setScoreDetectorCreator(scoreDetectorCreator) - tApp.buildGeometry() - tiara_dir = os.environ["TIARA_BASE"] - primGenBuilder = tiaraGenerators.\ TiaraDPSEnergyGenerator(tiaraSpecs, tiara_dir + "/data/expDataConverted/dpsSource.xml") #primGenBuilder = tiaraGenerators.TiaraPrimaryGenerator(tiaraSpecs) #primGenBuilder = tiaraGenerators.FixedEnergyPrimaryGenerator(tiaraSpecs) - tApp.setPrimaryGenerator(primGenBuilder.primGen) diff --git a/examples/advanced/Tiara/run/runSimNoAnalysis.py b/examples/advanced/Tiara/run/runSimNoAnalysis.py index dad8760dee..c815368501 100755 --- a/examples/advanced/Tiara/run/runSimNoAnalysis.py +++ b/examples/advanced/Tiara/run/runSimNoAnalysis.py @@ -1,8 +1,8 @@ #!/usr/bin/env python2.2 # -# $Id: runSimNoAnalysis.py,v 1.3 2003/06/20 12:41:06 dressel Exp $ +# $Id: runSimNoAnalysis.py,v 1.4 2004/06/09 15:04:35 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- @@ -124,7 +124,7 @@ impScorer = G4Kernel.G4Scorer() ########################################################################## tApp = tiaraApplication.TiaraApplet(tiaraSpecs = tiaraSpecs, tSim = Tiara.TiaraSim_GetTiaraSim(), - useLizard = False) + usePI = False) #tApp.visMode() @@ -190,7 +190,7 @@ rc.impScorer = impScorer rc.totalTime = totalTime rc.comment = comment -rs = runSequence.RunSequence(runConfig=rc, useLizard = False) +rs = runSequence.RunSequence(runConfig=rc, usePI = False) rs.runNevents(100) rs.runLoop() diff --git a/examples/advanced/Tiara/run/runVisMode.py b/examples/advanced/Tiara/run/runVisMode.py index 2e42441a0b..4fd0179de6 100644 --- a/examples/advanced/Tiara/run/runVisMode.py +++ b/examples/advanced/Tiara/run/runVisMode.py @@ -1,8 +1,8 @@ #!/usr/bin/env python2.2 # -# $Id: runVisMode.py,v 1.3 2003/06/20 12:41:06 dressel Exp $ +# $Id: runVisMode.py,v 1.4 2004/06/09 15:04:35 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- @@ -11,6 +11,7 @@ import os # importing wrapper modules (see the source/*Wrapper directories) # created by swig (from the source/*Wrapper/*.i files). +import CLHEP import Tiara import G4Kernel diff --git a/examples/advanced/Tiara/source/CLHEPWrapper/GNUmakefile b/examples/advanced/Tiara/source/CLHEPWrapper/GNUmakefile index 9a1ffebc2e..5d7845a89c 100644 --- a/examples/advanced/Tiara/source/CLHEPWrapper/GNUmakefile +++ b/examples/advanced/Tiara/source/CLHEPWrapper/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1.1.1 2003/06/12 13:08:24 dressel Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/09 15:04:35 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile Michael Dressel # -------------------------------------------------------------- @@ -46,3 +46,4 @@ LDLIBS += -lpython$(PYTHONVERSION) \ tiaraClean: @echo Cleaning up $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) @rm -rf $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) + @rm -f *.pyc diff --git a/examples/advanced/Tiara/source/G4KernelWrapper/GNUmakefile b/examples/advanced/Tiara/source/G4KernelWrapper/GNUmakefile index e76d84c0fe..619cfb6994 100644 --- a/examples/advanced/Tiara/source/G4KernelWrapper/GNUmakefile +++ b/examples/advanced/Tiara/source/G4KernelWrapper/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/12/08 17:53:26 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/09 15:04:35 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile Michael Dressel # -------------------------------------------------------------- @@ -43,4 +43,4 @@ LDLIBS += -lpython$(PYTHONVERSION) \ tiaraClean: @echo Cleaning up $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) @rm -rf $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) - + @rm -f *.pyc diff --git a/examples/advanced/Tiara/source/TiaraWrapper/GNUmakefile b/examples/advanced/Tiara/source/TiaraWrapper/GNUmakefile index 6d139db65a..46cda9ca27 100644 --- a/examples/advanced/Tiara/source/TiaraWrapper/GNUmakefile +++ b/examples/advanced/Tiara/source/TiaraWrapper/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.6 2003/12/08 17:53:26 gcosmo Exp $ +# $Id: GNUmakefile,v 1.7 2004/06/09 15:04:35 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile Michael Dressel # -------------------------------------------------------------- @@ -46,10 +46,10 @@ all: $(copyDeps) $(SWIGSO) include $(G4INSTALL)/config/binmake.gmk ifdef G4ANALYSIS_USE -CPPFLAGS += `$(ANAPHE_SCRIPTS)/aida-config -i` + CPPFLAGS += `aida-config --include` +# LDFLAGS += `aida-config --lib` endif - CPPFLAGS += -I$(TIARA_BASE)/source/tiara/include\ -I$(PYTHON_INCLUDE_DIR) \ -I$(TIARA_BASE)/source/tiaraPhysicsPackaging/include \ @@ -65,7 +65,7 @@ LDLIBS1 += -ltiaraPhysicsLists \ -ltiaraPhysicsPackaging-handMade ifdef G4ANALYSIS_USE -LDLIBS += `$(ANAPHE_SCRIPTS)/aida-config -l` + LDLIBS += `aida-config --lib` endif LDLIBS += -lpython$(PYTHONVERSION) \ @@ -89,4 +89,4 @@ tiaraClean: @echo Cleaning up $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) @echo $(tiaraDeps) @rm -rf $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) - + @rm -f *.pyc diff --git a/examples/advanced/Tiara/source/py_modules/liz.py b/examples/advanced/Tiara/source/py_modules/liz.py deleted file mode 100644 index 5c7ecc88be..0000000000 --- a/examples/advanced/Tiara/source/py_modules/liz.py +++ /dev/null @@ -1,445 +0,0 @@ -# $Id: liz.py,v 1.2 2003/06/16 17:06:44 dressel Exp $ -# ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ -# ------------------------------------------------------------------- -# - -import os, sys, string - -if ( not os.environ.has_key("ANAPHETOP") ) : - os.environ["ANAPHETOP"] = "/afs/cern.ch/sw/lhcxx" - - -if ( not os.environ.has_key("PLATF") ) : - os.environ["PLATF"] = "redhat73/gcc-3.2" - -if ( not os.environ.has_key("ANAPHE_VERSION") ) : - if ( not os.environ.has_key("ANAPHEVERS") ) : - os.environ["ANAPHEVERS"] = "5.0.4" -else : - os.environ["ANAPHEVERS"] = os.environ["ANAPHE_VERSION"] - -if ( not os.environ.has_key("PUBDOMVERS") ) : - os.environ["PUBDOMVERS"] = "2.0.0" - -if ( not os.environ.has_key("ANAPHE_REL_DIR") ) : - os.environ["ANAPHE_REL_DIR"] = os.environ["ANAPHETOP"]+"/specific/"+os.environ["PLATF"]+"/"+os.environ["ANAPHEVERS"] - - -if ( not os.environ.has_key("OS") ) : - os.environ["OS"] = "Linux" # for now !!! - -# for debugging purposes this might be set differently ... -if ( not os.environ.has_key("LIZARD_ROOT") ) : - os.environ["LIZARD_ROOT"] = os.environ["ANAPHE_REL_DIR"] + "/python" - -os.environ["LIZARD_LIB"] = os.environ["LIZARD_ROOT"] + "/lib" - -#-toDo: clean up the LD_LIBRARY_PATH, PATH and PYTHONPATH variables from wrong versions -# of Anaphe s/w -#export LD_LIBRARY_PATH=`${LIZARD_ROOT}/bin/cleanupPath.py LD_LIBRARY_PATH` -#export PATH=`${LIZARD_ROOT}/bin/cleanupPath.py PATH` -#export PYTHONPATH=`${LIZARD_ROOT}/bin/cleanupPath.py PYTHONPATH` - -# add to path in order to find xmgrace ... -if (not os.environ.has_key("GRACE_DIR") ) : - os.environ["GRACE_DIR"] = os.environ["ANAPHETOP"]+"/specific/"+os.environ["PLATF"]+"/PublicDomainPackages/" + os.environ["PUBDOMVERS"] + "/grace" - -os.environ["PATH"] = os.environ["GRACE_DIR"] + "/bin:" + os.environ["PATH"] -os.environ["LD_LIBRARY_PATH"] = os.environ["LD_LIBRARY_PATH"] + ":" + os.environ["LIZARD_LIB"] + ":" + os.environ["ANAPHE_REL_DIR"] + "/lib" - - -# toDo: -# if [ `uname` = "SunOS" ] ; then -# SUN_CC_DIR=/afs/cern.ch/project/sun/solaris/opt/SUNWspro62Apr02 -# export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${SUN_CC_DIR}/lib:/usr/local/lib # /opt/SUNWspro/lib:/usr/local/lib:/opt/SUNWspro/WS6U1/lib -# fi -# -# to find the proper versions of libs for python-2.0 and swig-1.3a5 -# (it should be SWIG_DIR) - -if (not os.environ.has_key("SWIG_DIR")) : - os.environ["SWIG_DIR"] = os.environ["ANAPHETOP"]+"/specific/"+os.environ["PLATF"]+"/PublicDomainPackages/" + os.environ["PUBDOMVERS"] - - -os.environ["LD_LIBRARY_PATH"] = os.environ["SWIG_DIR"] + "/lib:" + os.environ["LD_LIBRARY_PATH"] - -# need to add "." for automatic code compilation (ntuples et al) -os.environ["LD_LIBRARY_PATH"] = os.environ["LD_LIBRARY_PATH"] + ":" + os.environ["LIZARD_ROOT"] + "/" + os.environ["PLATF"] + ":." - -# add to PYTHONPATH -sys.path.append(os.environ["LIZARD_LIB"]) -sys.path.append(os.environ["LIZARD_ROOT"] + "/" + os.environ["PLATF"]) -sys.path.append(os.environ["LIZARD_ROOT"] + "/src") -sys.path.append(os.environ["HOME"]) - -sys.path.append(os.environ["LIZARD_ROOT"] + "/contrib") - -# toDo -#if [ -z $LIZARD_NO_PUBLIC_CONTRIB ] ; then -# export PYTHONPATH=${PYTHONPATH}:${ANAPHETOP}/share/PythonContrib -#fi - -# # define location of python -# if [ -z $PYDIR ] ; then -# export PYDIR=${ANAPHETOP}/specific/${PLATF}/PublicDomainPackages/${PUBDOMVERS} -# fi -# -# if [ -z $PYTHON ] ; then -# export PYTHON=${PYDIR}/bin/python2.2 -# fi -# - -# create a local temporary file (with the PID as part of the name) to -# speed up access from Nag fitter if starting directory is in AFS: -if (not os.environ.has_key("LIZARD_KEEP_FITRESULT")) : - os.system("rm -f e04ucc.r") - os.system("ln -s /tmp/pid-$$-e04ucc.r e04ucc.r") - -# $PYTHON -i ${LIZARD_ROOT}/bin/.Lizardrc $* -print "executing startup from'"+os.environ["LIZARD_ROOT"] + "/bin/.Lizardrc"+"'" -# execfile(os.environ["LIZARD_ROOT"] + "/bin/.Lizardrc") - - - -# Settings for Lizard - -lizardVersion = "3.0.0.5" -lizardVersionDate = "20 Dec 2002" - -lizardBatch = None -lizardObjy = None -lizardNag = None -lizardNoGraphics = None - -from math import * -from time import * - -import string -import os -import sys - -import random -import atexit -import gc - -# the following works only for python-2.0 (or later) - -# for command-line completion : -import rlcompleter -rlcompleter.readline.parse_and_bind("tab: complete") - -try : - if (sys.version_info[0] == 2) : - # for history (across-sessions) - import readline - # limit history file to 1000 lines - readline.set_history_length(1000) - # read previous file (if existing) - histfile = os.path.join(os.environ["HOME"], ".LizHist") - try: - readline.read_history_file(histfile) - except IOError: - print "cannot read command history file ", histfile - pass - # register function to write history file at exit - atexit.register(readline.write_history_file, histfile) - del histfile - # end history -except : - print "\nerror while accessing command history file" - raise - -# end python-2.0 specific part ... - - -# -------------------------------------------------------------------------------- - -def usage (): - print """ - -usage: startLizard.sh [] [ ...] - -where the optional can be one of the following: - - -?, -h, --help : print this text - -v, --version : print version info - - -b, --batch : run in batch mode and execute the scripts passed after all options - - --noGraphics : don't instantiate a Plotter (use this if your DISPLAY variable is not set) - - --useNag : use minimizer engine from Nag-C library - - --useObjy : use Objectivity/DB for persistent Histograms and (row-wise) Ntuples - - default : use FML with Minuit minimizer engine - -the (optional) list of files will be executed after startup - -NOTE: the options need to be _before_ any script file - -""" - - -# -------------------------------------------------------------------------------- -# set some defaults: use FML, Objy, Nag-C -# -------------------------------------------------------------------------------- -lizardFML = 1 -lizardHBook = 0 -lizardNag = 0 -# -------------------------------------------------------------------------------- - -# -------------------------------------------------------------------------------- - -def lizardVersionInfo() : - print "\nThis is Lizard version " + lizardVersion + "\n" - - -# -------------------------------------------------------------------------------- -# check if we got any flags: -# -------------------------------------------------------------------------------- - -import getopt -#optlist = [] -#args = [] -try: - optlist, args = getopt.getopt(sys.argv[1:], ['?', 'h', 'v', 'b'], - ['help', 'version', 'batch', 'noGraphics', - 'useNag', 'useNag', 'useObjy', 'objy' ]) - -except : - print "\nunknown option:",o,"\n" - usage() - sys.exit() - -# -------------------------------------------------------------------------------- -# have a first look at options now, see if the user wants some info without -# the need to start the system ... -# -------------------------------------------------------------------------------- - -for o, a in optlist: - if o in ("-?", "-h", "--help"): - usage() - sys.exit() - elif o in ("-v", "--version",): - lizardVersionInfo() - sys.exit() - elif o in ("", "--useObjy", "--objy",): - lizardObjy = 1 - - -import dl -# -------------------------------------------------------------------------------- -# check if Objectivity can be used, if requested -# -------------------------------------------------------------------------------- - -if (lizardObjy == 1) : - try: - dl.open( "liboo.so" ) - except: - print "Objectivity requested, but liboo not found in LD_LIBRARY_PATH !! Aborting !" - sys.exit() - -# -------------------------------------------------------------------------------- -# check if Nag_C can be used, -# -------------------------------------------------------------------------------- - -if (lizardNag == 1 ) : - try: - dl.open( "libnagc.so" ) - except: - print "Minimizer from NAG requested, but libnagc not found in LD_LIBRARY_PATH !! Aborting !" - sys.exit() - -# -------------------------------------------------------------------------------- -# check the other possible flags: -# -------------------------------------------------------------------------------- -for o, a in optlist: - if o in ("-b", "--batch",): - lizardBatch = 1 - elif o in ("--noGraphics",): - lizardNoGraphics = 1 - elif o in ("--nag", "--useNag"): - lizardNag = 1 - -# -------------------------------------------------------------------------------- - -print "\n" - -# -------------------------------------------------------------------------------- -# check now whether DISPLAY is set. -# -------------------------------------------------------------------------------- -if (lizardNoGraphics != 1) : - try: - disp = os.environ["DISPLAY"] - except: - print "\n==========> no DISPLAY set, switching to no-graphics mode." - lizardNoGraphics = 1 - -# prompt -sys.ps1=":-) " - -# -------------------------------------------------------------------------------- - -# welcome message parameters -lizMsgWelcome = "Welcome to Lizard" -lizMsgID = "Version "+ lizardVersion + " (" + lizardVersionDate + ")" -lizMsgURL = "http://cern.ch/Anaphe" -lizMsgSide = "|" -lizMsgCorner = "+" -lizMsgTop = "-" -lizMsgWidth = 50 -lizMsgSideIndent = 8 -lizMsgTopIndent = 1 - -# generate welcome message -lizMsgBar = "" -for i in range (0,lizMsgWidth) : - lizMsgBar = lizMsgBar + lizMsgTop - -lizMsgPad = "" -for i in range (0,lizMsgSideIndent) : - lizMsgPad = lizMsgPad + " " - -lizMsgBlank = lizMsgSide + string.center("",lizMsgWidth) + lizMsgSide -for i in range (0, lizMsgTopIndent) : - print "" - -print lizMsgPad + lizMsgCorner + lizMsgBar + lizMsgCorner -print lizMsgPad + lizMsgBlank -print lizMsgPad + lizMsgSide + string.center(lizMsgWelcome,lizMsgWidth) + lizMsgSide -print lizMsgPad + lizMsgBlank -print lizMsgPad + lizMsgSide + string.center(lizMsgID,lizMsgWidth) + lizMsgSide -print lizMsgPad + lizMsgBlank -print lizMsgPad + lizMsgSide + string.center(lizMsgURL,lizMsgWidth) + lizMsgSide -print lizMsgPad + lizMsgBlank -print lizMsgPad + lizMsgCorner + lizMsgBar + lizMsgCorner -for i in range (0, lizMsgTopIndent) : - print "" - - -# -------------------------------------------------------------------------------- - -print "Chosen configuration: ", -if ( lizardObjy == 1 ) : - print "Objectivity", -else: - print "HBook and XML", -print " persistency and ", -if ( lizardNag == 1 ) : - print "Nag-C", -else: - print "Minuit", -print "minimizer engine" - -print "\nType help() for help\n" - -sys.stdout.flush() - -# -------------------------------------------------------------------------------- -# global startup files ... -# -------------------------------------------------------------------------------- - -# remember where we started from ... -curDir = os.getcwd() - -# check for global StartupFiles (so far, the order doesn't matter): -startDir = os.environ['LIZARD_ROOT']+"/startUpFiles/" -fileList = os.listdir(startDir) - -# change to directory containing the startup files and exec them one by one: -os.chdir(startDir) -try: - for file in fileList : - if (string.find(file,".py") == -1) : - continue; - if (file == "constants.py") : - continue; - if (os.path.isfile(file)) : - # print "loading startUp file ", file - execfile(file) - else : - print "Strange: cannot \"execfile\" startUp file ", file, " in ", startDir, " !?!?" -except: - raise - -#-ap execfile("constants.py") -# return to where we left from ... -os.chdir(curDir) - -LizardIsInitialized = 1 - -print "\n\nLizard initialised\n" - -# -------------------------------------------------------------------------------- -# local/user-specific startup files ... -# -------------------------------------------------------------------------------- - -# check for local initfiles: -homeStart = os.environ['HOME']+"/.Lizardrc" -if os.path.isfile(homeStart): - execfile(homeStart) - -# avoid reading it twice ... -if (os.getcwd() != os.environ['HOME'] and - os.getcwd() != os.environ['LIZARD_ROOT']+"/bin" ) : - localStart = "./.Lizardrc" - if os.path.isfile(localStart): - execfile(localStart) - -# -------------------------------------------------------------------------------- -def lizardCleanUp() : - global af, tf, pf, pl - # in reverse order of construction - if (lizardNoGraphics != 1) : - pl.thisown = 1 ; del pl - pf.thisown = 1 ; del pf - tf.thisown = 1 ; del tf - af.thisown = 1 ; del af - # print "global objects deleted ... " ; sys.stdout.flush() - - for lib in theListOfLoadedLibraries.keys() : - sys.stdout.flush() - theListOfLoadedLibraries[lib].close() - # print "\nall libs unloaded ... " ; sys.stdout.flush() - - print "\nobjects deleted and libs unloaded, exiting python ... " ; sys.stdout.flush() - - return -# -------------------------------------------------------------------------------- -def exit() : - lizardCleanUp() - sys.exit() - -# -------------------------------------------------------------------------------- -# execute file given at input (ignoring startup file .Lizardrc) ... -# -------------------------------------------------------------------------------- - -if (len(args) > 0 ) : - args[0] = os.path.abspath(args[0]) - file = args[0] - # reset the environment ... the scripts will now look as if invoked from the shell ... - sys.argv = args - print "executing ", file - if (os.path.isfile(file)) : - try : - execfile(file) - except: - # if something goes wrong in batch mode, clean up and exit ... - if (lizardBatch == 1) : - lizardCleanUp() - sys.exit(2) - else : - raise - else : - print "file ", file, " not found." - - -if (lizardBatch == 1) : - # clean up (explicitly destroy some objects) - lizardCleanUp() - sys.exit() - - - diff --git a/examples/advanced/Tiara/source/py_modules/myLiz.py b/examples/advanced/Tiara/source/py_modules/myPI.py similarity index 65% rename from examples/advanced/Tiara/source/py_modules/myLiz.py rename to examples/advanced/Tiara/source/py_modules/myPI.py index 777ca231ef..3f4a197c52 100644 --- a/examples/advanced/Tiara/source/py_modules/myLiz.py +++ b/examples/advanced/Tiara/source/py_modules/myPI.py @@ -1,10 +1,11 @@ -# $Id: myLiz.py,v 1.2 2003/06/16 17:06:44 dressel Exp $ +# $Id: myPI.py,v 1.1 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import sys + origArgv = sys.argv sys.argv = ["","--noGraphics"] -from liz import * +from PyAida import * sys.argv = origArgv diff --git a/examples/advanced/Tiara/source/py_modules/myUtils.py b/examples/advanced/Tiara/source/py_modules/myUtils.py index 734a7dc440..cb8fb819ae 100644 --- a/examples/advanced/Tiara/source/py_modules/myUtils.py +++ b/examples/advanced/Tiara/source/py_modules/myUtils.py @@ -1,6 +1,6 @@ -# $Id: myUtils.py,v 1.4 2003/06/20 12:41:06 dressel Exp $ +# $Id: myUtils.py,v 1.5 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import CLHEP @@ -13,7 +13,7 @@ import shelve G4analysisUse = os.environ.has_key("G4ANALYSIS_USE") if G4analysisUse: - import myLiz + import myPI def createParallelSampler(impGeo, impScorer): @@ -48,7 +48,7 @@ def saveResults(tApp, path, shelveName, impScorer, impGeo): table.Print(tApp.cellScorerStore.GetMapGeometryCellCellScorer()) if G4analysisUse: storePath = path + "/" + myShelve["xmlStoreName"] - persistantStore = myLiz.tf.create(storePath,"xml",0,1) + persistantStore = myPI.tf.create(storePath,"xml",0,1) coppyTrees(tApp.tree, persistantStore) persistantStore.commit() persistantStore.close() @@ -187,7 +187,7 @@ if G4analysisUse: def addToXML(mergedXMLStore, xmlStore): objNames = xmlStore.listObjectNames() objTypes = xmlStore.listObjectTypes() - hf = myLiz.af.createHistogramFactory(mergedXMLStore) + hf = myPI.af.createHistogramFactory(mergedXMLStore) for i in range(len(objNames)): oName = objNames[i] oType = objTypes[i] @@ -230,11 +230,11 @@ def addToShelve(mergedShelve, she, shelveNameToBeAdded): if G4analysisUse: def mergeData(mergedName, shelveList): mergedShelveName = mergedName + ".shelve" - print "createing merged shelve: ", mergedShelveName + print "creating merged shelve: ", mergedShelveName mergedShelve = shelve.open(mergedShelveName) mergedXMLname = mergedName + ".xml" - print "createing merged XML store: ", mergedXMLname - mergedXMLStore = myLiz.tf.create(mergedXMLname, "xml", 0, 1) + print "creating merged XML store: ", mergedXMLname + mergedXMLStore = myPI.tf.create(mergedXMLname, "xml", 0, 1) for i in range(len(shelveList)): @@ -243,7 +243,7 @@ if G4analysisUse: she = shelve.open(shelveName,"r") xmlStoreName = she["xmlStoreName"] print "opening: ", xmlStoreName - xmlStore = myLiz.tf.create(xmlStoreName,"xml",1,0) + xmlStore = myPI.tf.create(xmlStoreName,"xml",1,0) if i == 0: if mergedXMLStore.listObjectNames() == (): setUpMergedShelve(she, mergedShelve, mergedXMLname, shelveName) diff --git a/examples/advanced/Tiara/source/py_modules/runSequence.py b/examples/advanced/Tiara/source/py_modules/runSequence.py index 37a278f6e2..2859a30fd1 100644 --- a/examples/advanced/Tiara/source/py_modules/runSequence.py +++ b/examples/advanced/Tiara/source/py_modules/runSequence.py @@ -1,6 +1,6 @@ -# $Id: runSequence.py,v 1.3 2003/06/16 17:06:44 dressel Exp $ +# $Id: runSequence.py,v 1.4 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import Tiara @@ -31,9 +31,9 @@ class RunConfig(object): class RunSequence(object): # methods to be used public - def __init__(self, runConfig, useLizard = True): + def __init__(self, runConfig, usePI = True): self.rc = runConfig - self.useLizard = useLizard + self.usePI = usePI self.runNum = -1 self.confInfo = self.rc.getConfInfo() self.storeName = myUtils.getStoreName() @@ -74,7 +74,7 @@ class RunSequence(object): def report(self): print "\n\nRunSequence.report:" print self.confInfo - if self.useLizard: + if self.usePI: print "the xml store will be named: " print " ", self.pathXMLName print "the shelve name: " @@ -97,7 +97,7 @@ class RunSequence(object): rns = string.rjust(rns, 5) rns = string.replace(rns,' ','0') rId = "_run" + rns - if self.useLizard: + if self.usePI: self.xmlStore = self.storeName + rId + ".xml" self.pathXMLName = self.path + "/" + self.xmlStore @@ -108,7 +108,7 @@ class RunSequence(object): def mkShelve(self): myShelve = shelve.open(self.pathShelveName) - if self.useLizard: + if self.usePI: myShelve["xmlStoreName"] = self.xmlStore for info in self.confInfo: myShelve[info] = self.confInfo[info] diff --git a/examples/advanced/Tiara/source/py_modules/tiaraApplication.py b/examples/advanced/Tiara/source/py_modules/tiaraApplication.py index 81650e43de..275e242a90 100644 --- a/examples/advanced/Tiara/source/py_modules/tiaraApplication.py +++ b/examples/advanced/Tiara/source/py_modules/tiaraApplication.py @@ -1,10 +1,9 @@ -# $Id: tiaraApplication.py,v 1.3 2003/06/16 17:06:44 dressel Exp $ +# $Id: tiaraApplication.py,v 1.4 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import string - import CLHEP import G4Kernel import Tiara @@ -16,11 +15,27 @@ import tallyData class TiaraApplet(object): tiaraSim = None - def __init__(self, tiaraSpecs, tSim = None, useLizard = True): - if useLizard: - import myLiz - self.tree = myLiz.tf.create() - self.hf = myLiz.af.createHistogramFactory (self.tree) + def __init__(self, tiaraSpecs, tSim = None, usePI = True): + if usePI: + import myPI + self.tree = myPI.tf.create() + self.hf = myPI.af.createHistogramFactory (self.tree) + print self.hf + print "hf" + hf_ptr = str(self.hf._theObject) + print hf_ptr + print "hf_ptr before split" + hf_ptr = string.split(str(self.hf._theObject))[-1] + print hf_ptr + print "hf_ptr after split" + hf_ptr2 = hf_ptr.split('x')[1] + for i in range(len(hf_ptr2),8) : + hf_ptr2 = '0'+hf_ptr2 + + self.hf.this='_' + hf_ptr2 + '_p_AIDA__IHistogramFactory' + self.hf.thisown = 1 + print self.hf.this + print "hf.this after split" else: self.tree = None self.hf = None @@ -160,6 +175,7 @@ class TiaraApplet(object): self.tiaraSpecs. experiment.binEdgesBonner, tally) + else: self.scSrc = Tiara.\ TiaraCellScorer("source_detector", @@ -220,4 +236,3 @@ class TiaraApplet(object): self.sampler.Configure() - diff --git a/examples/advanced/Tiara/source/py_modules/tiaraDetectors.py b/examples/advanced/Tiara/source/py_modules/tiaraDetectors.py index 25b59cde6a..b87a8b7ce1 100644 --- a/examples/advanced/Tiara/source/py_modules/tiaraDetectors.py +++ b/examples/advanced/Tiara/source/py_modules/tiaraDetectors.py @@ -1,6 +1,6 @@ -# $Id: tiaraDetectors.py,v 1.3 2003/06/20 12:41:07 dressel Exp $ +# $Id: tiaraDetectors.py,v 1.4 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import CLHEP diff --git a/examples/advanced/Tiara/source/py_modules/tiaraGenerators.py b/examples/advanced/Tiara/source/py_modules/tiaraGenerators.py index 252efa141a..d76bf5e864 100644 --- a/examples/advanced/Tiara/source/py_modules/tiaraGenerators.py +++ b/examples/advanced/Tiara/source/py_modules/tiaraGenerators.py @@ -1,6 +1,6 @@ -# $Id: tiaraGenerators.py,v 1.2 2003/06/16 17:06:44 dressel Exp $ +# $Id: tiaraGenerators.py,v 1.3 2004/06/09 15:04:36 daquinog Exp $ # ------------------------------------------------------------------- -# GEANT4 tag $Name: geant4-05-02-patch-01 $ +# GEANT4 tag $Name: geant4-06-02 $ # ------------------------------------------------------------------- # import string @@ -36,7 +36,6 @@ class TiaraPrimaryGenerator(object): class TiaraDPSEnergyGenerator(object): def __init__(self, tiaraSpecs, xmlName): self.Name = "dpsSource" - self.eSamp = Tiara.\ TiaraDPSSampledEnergy(tiaraSpecs. experiment.energy, @@ -45,7 +44,6 @@ class TiaraDPSEnergyGenerator(object): xmlName, "") - self.tally = Tiara.TiaraTally() if string.find(xmlName,"other") > -1: diff --git a/examples/advanced/Tiara/source/tiara/GNUmakefile b/examples/advanced/Tiara/source/tiara/GNUmakefile index 10c72abda9..09d77ce14e 100644 --- a/examples/advanced/Tiara/source/tiara/GNUmakefile +++ b/examples/advanced/Tiara/source/tiara/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/12/08 17:53:26 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/09 15:04:37 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile Michael Dressel # -------------------------------------------------------------- @@ -27,9 +27,11 @@ all: lib bin include $(G4INSTALL)/config/binmake.gmk ifdef G4ANALYSIS_USE - CPPFLAGS += `$(ANAPHE_SCRIPTS)/aida-config -i` + CPPFLAGS += `aida-config --include` +# LDFLAGS += `aida-config --lib` endif + CPPFLAGS += -I$(PYTHON_INCLUDE_DIR) \ -I$(TIARA_BASE)/source/tiaraPhysicsPackaging/include \ -I$(TIARA_BASE)/source/tiaraPhysicsLists/include @@ -37,7 +39,7 @@ CPPFLAGS += -I$(PYTHON_INCLUDE_DIR) \ LDFLAGS += -L$(PYTHON_LIB_DIR) ifdef G4ANALYSIS_USE - LDLIBS += `$(ANAPHE_SCRIPTS)/aida-config -l` + LDLIBS += `aida-config --lib` endif LDLIBS += -lpython$(PYTHONVERSION) \ diff --git a/examples/advanced/Tiara/source/tiara/include/TiaraDPSSampledEnergy.hh b/examples/advanced/Tiara/source/tiara/include/TiaraDPSSampledEnergy.hh index 03d0073332..ec077a7b8f 100644 --- a/examples/advanced/Tiara/source/tiara/include/TiaraDPSSampledEnergy.hh +++ b/examples/advanced/Tiara/source/tiara/include/TiaraDPSSampledEnergy.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: TiaraDPSSampledEnergy.hh,v 1.5 2003/06/25 09:12:37 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: TiaraDPSSampledEnergy.hh,v 1.6 2004/06/09 15:04:37 daquinog Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ---------------------------------------------------------------------- // @@ -61,8 +61,13 @@ private: void getBounds(G4int &cL, G4int &cH, G4double v); - std::auto_ptr fTree; - std::auto_ptr fSampleDPS; + //std::auto_ptr fTree; + // std::auto_ptr fSampleDPS; + // ///// + AIDA::ITree* fTree; + AIDA::IDataPointSet* fSampleDPS; + ////// + G4double fMinEnergyCut; std::map fEnergy_Flux; G4double fMaxProb; diff --git a/examples/advanced/Tiara/source/tiara/src/TiaraCellScorer.cc b/examples/advanced/Tiara/source/tiara/src/TiaraCellScorer.cc index 5b1b5fc843..8d5daaae3b 100644 --- a/examples/advanced/Tiara/source/tiara/src/TiaraCellScorer.cc +++ b/examples/advanced/Tiara/source/tiara/src/TiaraCellScorer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: TiaraCellScorer.cc,v 1.3 2003/06/18 16:40:28 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: TiaraCellScorer.cc,v 1.4 2004/06/09 15:04:37 daquinog Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ---------------------------------------------------------------------- // GEANT 4 class source file @@ -48,22 +48,37 @@ TiaraCellScorer::TiaraCellScorer(AIDA::IHistogramFactory *hf, &binEdgesBonner, const TiaraTally &tally) : fBaseName(histBaseName), - fEnergyHisto(hf->createHistogram1D(histBaseName, - histBaseName + ": flux vs. energy", - binEdgesScinti)), - fEnergyFluxHisto(hf->createHistogram1D(histBaseName + "Eflux", - histBaseName + ": energy flux vs. energy", - binEdgesScinti)), + // fEnergyHisto(hf->createHistogram1D(histBaseName, + // histBaseName + ": flux vs. energy", + // binEdgesScinti)), + //fEnergyFluxHisto(hf->createHistogram1D(histBaseName + "Eflux", + // histBaseName + ": energy flux vs. energy", + // binEdgesScinti)), - fEnergyHistoBonner(hf->createHistogram1D(histBaseName + "Bonner", - histBaseName + ": flux vs. energy", - binEdgesBonner)), - fEnergyFluxHistoBonner(hf->createHistogram1D(histBaseName + "BonnerEflux", - histBaseName + ": energy flux vs. energy", - binEdgesBonner)), + //fEnergyHistoBonner(hf->createHistogram1D(histBaseName + "Bonner", + // histBaseName + ": flux vs. energy", + // binEdgesBonner)), + //fEnergyFluxHistoBonner(hf->createHistogram1D(histBaseName + "BonnerEflux", + // histBaseName + ": energy flux vs. energy", + // binEdgesBonner)), fTally(tally) -{} +{ + //G4cout << "porca troia" << G4endl; + G4cout << hf << " hf in G4" << G4endl; + fEnergyHisto = hf->createHistogram1D(histBaseName, + histBaseName + ": flux vs. energy", + binEdgesScinti); + fEnergyFluxHisto = hf->createHistogram1D(histBaseName + "Eflux", + histBaseName + ": energy flux vs. energy", + binEdgesScinti); + fEnergyHistoBonner = hf->createHistogram1D(histBaseName + "Bonner", + histBaseName + ": flux vs. energy", + binEdgesBonner); + fEnergyFluxHistoBonner = hf->createHistogram1D(histBaseName + "BonnerEflux", + histBaseName + ": energy flux vs. energy", + binEdgesBonner); +} #else TiaraCellScorer::TiaraCellScorer(const G4String &histBaseName, const TiaraTally &tally) : diff --git a/examples/advanced/Tiara/source/tiara/src/TiaraDPSSampledEnergy.cc b/examples/advanced/Tiara/source/tiara/src/TiaraDPSSampledEnergy.cc index 5be6f2d825..435ef5f39c 100644 --- a/examples/advanced/Tiara/source/tiara/src/TiaraDPSSampledEnergy.cc +++ b/examples/advanced/Tiara/source/tiara/src/TiaraDPSSampledEnergy.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: TiaraDPSSampledEnergy.cc,v 1.7 2003/12/08 17:53:27 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: TiaraDPSSampledEnergy.cc,v 1.8 2004/06/09 15:04:37 daquinog Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "TiaraDPSSampledEnergy.hh" @@ -40,16 +40,34 @@ TiaraDPSSampledEnergy::TiaraDPSSampledEnergy(const G4String &eng, const G4String &sourceTree, const G4String &nameExt) : - fTree( (checkFileIsReadable(sourceTree, "TiaraDPSSampledEnergy::TiaraDPSSampledEnergy"), - AIDA_createAnalysisFactory() - ->createTreeFactory() - ->create(sourceTree, "xml",true,false)) ), - fSampleDPS(dynamic_cast(fTree->find(G4String("dps" + eng + nameExt)))), + // fTree( (checkFileIsReadable(sourceTree, "TiaraDPSSampledEnergy::TiaraDPSSampledEnergy"), +// AIDA_createAnalysisFactory() +// ->createTreeFactory() +// ->create(sourceTree, "xml",true,false)) ), + //fSampleDPS(dynamic_cast(fTree->find(G4String("dps" + eng + nameExt)))), fMinEnergyCut(minEnergyCut), - fMaxProb(0), - fMinE(fSampleDPS->point(0)->coordinate(0)->value()), - fMaxE(fSampleDPS->point(fSampleDPS->size()-1)->coordinate(0)->value()) + fMaxProb(0) + // fMinE(fSampleDPS->point(0)->coordinate(0)->value()), + //fMaxE(fSampleDPS->point(fSampleDPS->size()-1)->coordinate(0)->value()) { + ///////////////////////////////////////// + + AIDA::IAnalysisFactory* aFact = AIDA_createAnalysisFactory(); + + AIDA::ITreeFactory *treeFact = aFact->createTreeFactory(); + + fTree = treeFact -> create(sourceTree, "xml",true,false); + + AIDA::IManagedObject* object = fTree->find("dps" + eng + nameExt); + if(object) { + AIDA::IDataPointSet* sample = object->cast("AIDA::IDataPointSet"); + fSampleDPS = sample; + } + fMinE = fSampleDPS->point(0)->coordinate(0)->value(); + fMaxE = fSampleDPS->point(fSampleDPS->size()-1)->coordinate(0)->value(); + + ///////////////////////////////////////// + for (G4int i=0; i < fSampleDPS->size(); i++) { AIDA::IDataPoint *p = fSampleDPS->point(i); G4double prob(p->coordinate(1)->value()); diff --git a/examples/advanced/brachytherapy/Brachy.cc b/examples/advanced/brachytherapy/Brachy.cc index c422f8fef2..b2e0a8651e 100644 --- a/examples/advanced/brachytherapy/Brachy.cc +++ b/examples/advanced/brachytherapy/Brachy.cc @@ -22,7 +22,7 @@ // // // $Id: Brachy.cc -// GEANT4 tag $Name: geant4-06-01 $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------- // GEANT 4 - Brachytherapy example @@ -100,7 +100,7 @@ int main(int argc ,char ** argv) #ifdef G4ANALYSIS_USE G4cout << G4endl << G4endl << G4endl << " User Environment " << G4endl - << " Using AIDA 3.0 analysis " << G4endl; + << " Using AIDA 3.2.1 analysis " << G4endl; # else G4cout << G4endl << G4endl << G4endl << " User Environment " << G4endl diff --git a/examples/advanced/brachytherapy/History b/examples/advanced/brachytherapy/History index 4e77e571ab..d2be69882e 100644 --- a/examples/advanced/brachytherapy/History +++ b/examples/advanced/brachytherapy/History @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -$Id: History,v 1.7 2004/03/11 15:38:41 guatelli Exp $ +$Id: History,v 1.8 2004/05/13 14:47:46 guatelli Exp $ ------------------------------------------------------------------- ========================================================= @@ -8,7 +8,11 @@ $Id: History,v 1.7 2004/03/11 15:38:41 guatelli Exp $ Category History file --------------------- -11.3.2003 - Susanna Guatelli + +13.5.2004 - Susanna Guatelli + Migration to AIDA 3.2.1 and PI 1.2.1 + +11.3.2004 - Susanna Guatelli Add a histogram, maintenance of the code 12.11.2003 - John Allison diff --git a/examples/advanced/brachytherapy/IodiumSourceMacro.mac b/examples/advanced/brachytherapy/IodiumSourceMacro.mac index 58c2a85f4f..7bdd15cdcc 100644 --- a/examples/advanced/brachytherapy/IodiumSourceMacro.mac +++ b/examples/advanced/brachytherapy/IodiumSourceMacro.mac @@ -4,4 +4,4 @@ /source/switch Iodium /run/energy Iodium /run/initialize -/run/beamOn 1000 +/run/beamOn 5000 diff --git a/examples/advanced/brachytherapy/IridiumSourceMacro.mac b/examples/advanced/brachytherapy/IridiumSourceMacro.mac index e1d20450bf..5967cfe720 100644 --- a/examples/advanced/brachytherapy/IridiumSourceMacro.mac +++ b/examples/advanced/brachytherapy/IridiumSourceMacro.mac @@ -2,4 +2,4 @@ /run/verbose 0 /event/verbose 0 /run/initialize -/run/beamOn 1000 +/run/beamOn 5000 diff --git a/examples/advanced/brachytherapy/LeipzigSourceMacro.mac b/examples/advanced/brachytherapy/LeipzigSourceMacro.mac index 923c4b3af9..9a26fa8644 100644 --- a/examples/advanced/brachytherapy/LeipzigSourceMacro.mac +++ b/examples/advanced/brachytherapy/LeipzigSourceMacro.mac @@ -3,4 +3,4 @@ /event/verbose 0 /source/switch Leipzig /run/initialize -/run/beamOn 1000 +/run/beamOn 5000 diff --git a/examples/advanced/brachytherapy/README b/examples/advanced/brachytherapy/README index 7230e114e6..6779a212fe 100644 --- a/examples/advanced/brachytherapy/README +++ b/examples/advanced/brachytherapy/README @@ -23,28 +23,23 @@ voxels (1.mm dimension) | ------------------------------------------------------------------------- ----> 2.SET-UP | - -example enviroment with the compiler 3.2 + -example enviroment with the compiler 3.2.3 -a standard Geant4 example GNUmakefile is provided | setup with: | -compiler = gcc-3.2 +compiler = gcc-3.2.3 G4SYSTEM = linux-g++ | The following environment variables need to be set: | -G4LEDATA: points to low energy data base - G4EMLOW2.2 | +G4LEDATA: points to low energy data base - G4EMLOW2.3 | -setup for analysis with AIDA 3.0/Anaphe 5.0.5 for user with account | -on lxplus: - | -setenv G4ANALYSIS_USE 1 - | -source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/setupAnaphe.csh -setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/ | +setup for analysis: AIDA 3.2.1, PI 1.2.1 | - Please take a look to the Anaphe/Lizard web page | - http://anaphe.web.cern.ch/anaphe - for more info | +Users can download the analysis tools from: + | +http://aida.freehep.org/ +http://www.cern.ch/PI | ------------------------------------------------------------------------ ----> 3.How to run the example. | @@ -108,4 +103,4 @@ a macro is provided ad example of visualisation: VisualisationMacro.mac| for comments, advices, doubts and questions: guatelli@ge.infn.it for more info http://www.ge.infn.it/geant4/examples/index.html -last modified: Susanna Guatelli 11/3/2004 +last modified: Susanna Guatelli 14/5/2004 diff --git a/examples/advanced/brachytherapy/src/BrachyAnalysisManager.cc b/examples/advanced/brachytherapy/src/BrachyAnalysisManager.cc index 9c7c3c0622..fbcc926a63 100644 --- a/examples/advanced/brachytherapy/src/BrachyAnalysisManager.cc +++ b/examples/advanced/brachytherapy/src/BrachyAnalysisManager.cc @@ -29,8 +29,8 @@ // * * // ******************************* // -// $Id: BrachyAnalysisManager.cc,v 1.13 2004/03/11 15:38:42 guatelli Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: BrachyAnalysisManager.cc,v 1.14 2004/05/13 14:47:46 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifdef G4ANALYSIS_USE #include diff --git a/examples/advanced/brachytherapy/src/BrachyDetectorConstruction.cc b/examples/advanced/brachytherapy/src/BrachyDetectorConstruction.cc index 194a5ab564..1c65a2714f 100644 --- a/examples/advanced/brachytherapy/src/BrachyDetectorConstruction.cc +++ b/examples/advanced/brachytherapy/src/BrachyDetectorConstruction.cc @@ -34,8 +34,8 @@ // * * // **************************************** // -// $Id: BrachyDetectorConstruction.cc,v 1.24 2004/03/11 16:05:02 guatelli Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: BrachyDetectorConstruction.cc,v 1.25 2004/05/13 14:47:46 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "BrachyPhantomROGeometry.hh" #include "BrachyPhantomSD.hh" @@ -101,7 +101,7 @@ BrachyDetectorConstruction::BrachyDetectorConstruction(G4String &SDName) factory = new BrachyFactoryIr(); - pMaterial= new BrachyMaterial(); + pMaterial = new BrachyMaterial(); } @@ -115,9 +115,9 @@ BrachyDetectorConstruction::~BrachyDetectorConstruction() G4VPhysicalVolume* BrachyDetectorConstruction::Construct() { - pMaterial-> DefineMaterials(); + pMaterial -> DefineMaterials(); ConstructPhantom(); - factory->CreateSource(PhantomPhys); + factory -> CreateSource(PhantomPhys); //Build the source inside the phantom ConstructSensitiveDetector(); return WorldPhys; @@ -125,7 +125,8 @@ G4VPhysicalVolume* BrachyDetectorConstruction::Construct() void BrachyDetectorConstruction::SwitchBrachytherapicSeed() { - factory->CleanSource(); + factory -> CleanSource(); + delete factory; switch(detectorChoice) { @@ -142,11 +143,10 @@ void BrachyDetectorConstruction::SwitchBrachytherapicSeed() factory = new BrachyFactoryIr(); break; } - factory->CreateSource(PhantomPhys); + factory -> CreateSource(PhantomPhys); // Notify run manager that the new geometry has been built - - G4RunManager::GetRunManager()->DefineWorldVolume( WorldPhys ); + G4RunManager::GetRunManager() -> DefineWorldVolume( WorldPhys ); } void BrachyDetectorConstruction::SelectBrachytherapicSeed(G4String val) @@ -176,28 +176,32 @@ void BrachyDetectorConstruction::ConstructPhantom() { G4Colour lblue (0.0, 0.0, .75); - G4Material* air=pMaterial->GetMat("Air") ; - G4Material* water=pMaterial->GetMat("Water"); + G4Material* air = pMaterial -> GetMat("Air") ; + G4Material* water = pMaterial -> GetMat("Water"); ComputeDimVoxel(); // World volume World = new G4Box("World",Worldx,Worldy,Worldz); WorldLog = new G4LogicalVolume(World,air,"WorldLog",0,0,0); - WorldPhys = new G4PVPlacement(0,G4ThreeVector(),"WorldPhys",WorldLog,0,false,0); + WorldPhys = new G4PVPlacement(0,G4ThreeVector(), + "WorldPhys",WorldLog,0,false,0); // Water Box - Phantom = new G4Box("Phantom",phantomDimensionX,phantomDimensionY,phantomDimensionZ); + Phantom = new G4Box("Phantom",phantomDimensionX,phantomDimensionY, + phantomDimensionZ); PhantomLog = new G4LogicalVolume(Phantom,water,"PhantomLog",0,0,0); - PhantomPhys = new G4PVPlacement(0,G4ThreeVector(),"PhantomPhys",PhantomLog,WorldPhys,false,0); + PhantomPhys = new G4PVPlacement(0,G4ThreeVector(), + "PhantomPhys",PhantomLog, + WorldPhys,false,0); - WorldLog->SetVisAttributes (G4VisAttributes::Invisible); + WorldLog -> SetVisAttributes (G4VisAttributes::Invisible); - G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(lblue); - simpleBoxVisAtt->SetVisibility(true); - simpleBoxVisAtt->SetForceWireframe(true); + G4VisAttributes* simpleBoxVisAtt = new G4VisAttributes(lblue); + simpleBoxVisAtt -> SetVisibility(true); + simpleBoxVisAtt -> SetForceWireframe(true); - PhantomLog->SetVisAttributes(simpleBoxVisAtt); + PhantomLog -> SetVisAttributes(simpleBoxVisAtt); } void BrachyDetectorConstruction::ConstructSensitiveDetector() @@ -209,11 +213,13 @@ void BrachyDetectorConstruction::ConstructSensitiveDetector() { phantomSD = new BrachyPhantomSD(sensitiveDetectorName); G4String ROGeometryName = "PhantomROGeometry"; - phantomROGeometry = new BrachyPhantomROGeometry(ROGeometryName,phantomDimensionX,phantomDimensionZ,numberOfVoxelsAlongX,numberOfVoxelsAlongZ); - phantomROGeometry->BuildROGeometry(); - phantomSD->SetROgeometry(phantomROGeometry); - pSDManager->AddNewDetector(phantomSD); - PhantomLog->SetSensitiveDetector(phantomSD); + phantomROGeometry = new BrachyPhantomROGeometry(ROGeometryName, + phantomDimensionX,phantomDimensionZ, + numberOfVoxelsAlongX,numberOfVoxelsAlongZ); + phantomROGeometry -> BuildROGeometry(); + phantomSD -> SetROgeometry(phantomROGeometry); + pSDManager -> AddNewDetector(phantomSD); + PhantomLog -> SetSensitiveDetector(phantomSD); } } @@ -248,7 +254,7 @@ void BrachyDetectorConstruction::SetPhantomMaterial(G4String materialChoice) if (pttoMaterial) { phantomAbsorberMaterial = pttoMaterial; - PhantomLog->SetMaterial(pttoMaterial); + PhantomLog -> SetMaterial(pttoMaterial); PrintDetectorParameters(); } else diff --git a/examples/advanced/brachytherapy/src/BrachyPhantomROGeometry.cc b/examples/advanced/brachytherapy/src/BrachyPhantomROGeometry.cc index 1eafafb3b9..6072079c76 100644 --- a/examples/advanced/brachytherapy/src/BrachyPhantomROGeometry.cc +++ b/examples/advanced/brachytherapy/src/BrachyPhantomROGeometry.cc @@ -30,8 +30,8 @@ // * * // ************************************ // -// $Id: BrachyPhantomROGeometry.cc,v 1.8 2004/03/11 15:38:43 guatelli Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: BrachyPhantomROGeometry.cc,v 1.9 2004/05/13 14:47:46 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "BrachyPhantomROGeometry.hh" #include "BrachyDummySD.hh" @@ -177,7 +177,7 @@ G4VPhysicalVolume* BrachyPhantomROGeometry::Build() numberOfVoxelsAlongZ, voxelXThickness); BrachyDummySD *dummySD = new BrachyDummySD; - ROPhantomYDivisionLog->SetSensitiveDetector(dummySD); + ROPhantomYDivisionLog -> SetSensitiveDetector(dummySD); return ROWorldPhys; } diff --git a/examples/advanced/brachytherapy/src/BrachyPhantomSD.cc b/examples/advanced/brachytherapy/src/BrachyPhantomSD.cc index 787c91e386..17cd3fdfbb 100644 --- a/examples/advanced/brachytherapy/src/BrachyPhantomSD.cc +++ b/examples/advanced/brachytherapy/src/BrachyPhantomSD.cc @@ -30,8 +30,8 @@ // * * // ******************************** // -// $Id: BrachyPhantomSD.cc,v 1.7 2004/03/11 16:05:03 guatelli Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: BrachyPhantomSD.cc,v 1.8 2004/05/13 14:47:46 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "BrachyPhantomSD.hh" #include "BrachyPhantomHit.hh" @@ -72,34 +72,32 @@ G4bool BrachyPhantomSD::ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist) G4double energyDeposit = aStep->GetTotalEnergyDeposit(); if(energyDeposit == 0.) return false; - - // Read Voxel indexes: i is the x index, k is the z index - G4int k = ROhist->GetReplicaNumber(1); - G4int i = ROhist->GetReplicaNumber(2); - G4int j = ROhist->GetReplicaNumber(); - - G4int numberOfVoxelZ = 300; - G4double voxelWidthZ = 1. *mm; - G4double x = (-numberOfVoxelZ+1+2*i)*voxelWidthZ/2; - G4double y = (- numberOfVoxelZ+1+2*j)*voxelWidthZ/2; - G4double z = (- numberOfVoxelZ+1+2*k)*voxelWidthZ/2; - - - if(energyDeposit != 0) + if(energyDeposit != 0) { #ifdef G4ANALYSIS_USE - BrachyAnalysisManager* analysis = - BrachyAnalysisManager::getInstance(); - analysis -> FillNtupleWithEnergy(x,y,z,energyDeposit); - if (y<0.8*mm && y> -0.8*mm) - { - analysis -> FillHistogramWithEnergy(x,z,energyDeposit/MeV); + // Read Voxel indexes: i is the x index, k is the z index + G4int k = ROhist->GetReplicaNumber(1); + G4int i = ROhist->GetReplicaNumber(2); + G4int j = ROhist->GetReplicaNumber(); + + G4int numberOfVoxelZ = 300; + G4double voxelWidthZ = 1. *mm; + G4double x = (-numberOfVoxelZ+1+2*i)*voxelWidthZ/2; + G4double y = (- numberOfVoxelZ+1+2*j)*voxelWidthZ/2; + G4double z = (- numberOfVoxelZ+1+2*k)*voxelWidthZ/2; + + BrachyAnalysisManager* analysis = + BrachyAnalysisManager::getInstance(); + analysis -> FillNtupleWithEnergy(x,y,z,energyDeposit); + if (y<0.8*mm && y> -0.8*mm) + { + analysis -> FillHistogramWithEnergy(x,z,energyDeposit/MeV); - if (z<0.8*mm && z> -0.8*mm) - analysis -> DoseDistribution(x,energyDeposit/MeV); - } + if (z<0.8*mm && z> -0.8*mm) + analysis -> DoseDistribution(x,energyDeposit/MeV); + } #endif } return true; diff --git a/examples/advanced/composite_calorimeter/History b/examples/advanced/composite_calorimeter/History index 1d61935c3a..8421fa967a 100644 --- a/examples/advanced/composite_calorimeter/History +++ b/examples/advanced/composite_calorimeter/History @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -$Id: History,v 1.21 2003/12/05 07:38:38 gcosmo Exp $ +$Id: History,v 1.23 2004/05/27 09:07:50 ribon Exp $ ------------------------------------------------------------------- ========================================================= @@ -9,6 +9,13 @@ $Id: History,v 1.21 2003/12/05 07:38:38 gcosmo Exp $ Example History file --------------------- +27.05.04 - A.Ribon (ccal-V06-01-01) +- Changed use of the ntuple. Now it is simpler and the ntuple + is always correctly filled. + +18.05.04 - A.Ribon (ccal-V06-01-00) +- Ported to PI. Only the setup is changed, no changes in the code. + 05.12.03 - G.Cosmo (ccal-V05-02-07) - Changed LISTS_BASE to G4LISTS_BASE for hadronic physics lists path. Cowork with "ghad-lists-V05-02-01". diff --git a/examples/advanced/composite_calorimeter/README b/examples/advanced/composite_calorimeter/README index 8c04c90334..85ebbd63a3 100644 --- a/examples/advanced/composite_calorimeter/README +++ b/examples/advanced/composite_calorimeter/README @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -$Id: README,v 1.10 2003/12/04 16:49:55 ribon Exp $ +$Id: README,v 1.11 2004/05/18 14:57:48 ribon Exp $ ------------------------------------------------------------------- ========================================================= @@ -50,24 +50,15 @@ $Id: README,v 1.10 2003/12/04 16:49:55 ribon Exp $ The user should first setup, as "usual", the Geant4 environmental variables (in particular, the variable G4ANALYSIS_USE must be set if you want to have the histograms and the ntuple). - Then the specific setup for this example should be run: + Then the specific setup for this example, including the AIDA/PI part + used in the analysis, should be run: > source envExample.csh in the case of C-shell or > . envExample.sh in the case of bash-shell - The analysis part is based on: - *** AIDA version 3.0 & Anaphe version 5.0.6 *** - - NB) Be careful that if you want to have this analysis part, - you have not only to set the variable G4ANALYSIS_USE but - also to edit the above script file (envExample.csh or envExample.sh) - and remove the comments "#" on the setup of AIDA/Anaphe, - because, by default, the analysis is not done (the reason being - that, in some platform, such AIDA/Anaphe setup does not work). - - Please take a look to the Anaphe/Lizard web page - http://anaphe.web.cern.ch/anaphe + The analysis part is based on AIDA/PI. + Please take a look to the web page: http://www.cern.ch/PI . 2. Sample run @@ -368,10 +359,8 @@ No Noise and Digitization ---------------------------- The analysis part of CompositeCalorimeter is kept in class CCalAnalysis, - and is based on the AIDA interfaces and their implementation in Anaphe: - *** AIDA version 3.0 & Anaphe version 5.0.6 *** - please look at their documentation for more details: - http://anaphe.web.cern.ch/anaphe + and is based on the AIDA interfaces and their implementation in PI. + Please take a look to the web page: http://www.cern.ch/PI . Both the histograms and the ntuple are saved at the end of the run in the HBOOK file "ccal.his". You can than analyze offline the contents of such a file, using Lizard (or any other AIDA-compliant package) or with diff --git a/examples/advanced/composite_calorimeter/envExample.csh b/examples/advanced/composite_calorimeter/envExample.csh index 152cd042bd..87b0748782 100755 --- a/examples/advanced/composite_calorimeter/envExample.csh +++ b/examples/advanced/composite_calorimeter/envExample.csh @@ -1,16 +1,12 @@ #------------------------------------------------------------------ # C-shell script to be run before building/executing this example. -# It has two parts: one for the Aida setup (for the histograms, -# ntuples, and more in general for the data analysis); and one -# more specific for this test-beam example. -# Please notice that before running this script, you have to define -# the usual Geant4 variables (in particular, the variable -# G4ANALYSIS_USE must be set to 1). #------------------------------------------------------------------ # -# --- Aida 3.0 , Anaphe 5.0.6 --- -#source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts/setupAnaphe.csh -#setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts +# --- Geant4 specific --- +setenv G4ANALYSIS_USE 1 +# +# --- Aida / PI --- +eval `aida-config --runtime csh` # # --- Specific setup for this test-beam example --- setenv CCAL_CONFPATH ./dataconf diff --git a/examples/advanced/composite_calorimeter/envExample.sh b/examples/advanced/composite_calorimeter/envExample.sh index 846b262660..012e31a72b 100755 --- a/examples/advanced/composite_calorimeter/envExample.sh +++ b/examples/advanced/composite_calorimeter/envExample.sh @@ -1,16 +1,12 @@ #------------------------------------------------------------------ # Bash-shell script to be run before building/executing this example. -# It has two parts: one for the Aida setup (for the histograms, -# ntuples, and more in general for the data analysis); and one -# more specific for this test-beam example. -# Please notice that before running this script, you have to define -# the usual Geant4 variables (in particular, the variable -# G4ANALYSIS_USE must be set to 1). #------------------------------------------------------------------ # -# --- Aida 3.0 , Anaphe 5.0.6 --- -#. /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts/setupAnaphe -#export PATH=$PATH:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts +# --- Geant4 specific --- +export G4ANALYSIS_USE=1 +# +# --- Aida / PI --- +eval `aida-config --runtime sh` # # --- Specific setup for this test-beam example --- export CCAL_CONFPATH=./dataconf diff --git a/examples/advanced/composite_calorimeter/src/CCalAnalysis.cc b/examples/advanced/composite_calorimeter/src/CCalAnalysis.cc index af72571739..f97d94e71e 100644 --- a/examples/advanced/composite_calorimeter/src/CCalAnalysis.cc +++ b/examples/advanced/composite_calorimeter/src/CCalAnalysis.cc @@ -34,6 +34,8 @@ #include +#include + //#define debug CCalAnalysis* CCalAnalysis::instance = 0; @@ -80,8 +82,8 @@ CCalAnalysis::CCalAnalysis() :analysisFactory(0), tree(0), tuple(0), energy(0) { tag2 = tag + " ELAB, XPOS, YPOS, ZPOS"; tag = tag2 + ", EDEP, EDEC, EDHC"; - //tuple = tupleFactory->create("1","Event info", tag); // Column wise (default) - tuple = tupleFactory->create("1","Event info", tag, "--preferRWN"); // Row wise + tuple = tupleFactory->create("1","Event info", tag); // Column wise (default) + //tuple = tupleFactory->create("1","Event info", tag, "--preferRWN"); // Row wise assert(tuple); @@ -292,25 +294,24 @@ void CCalAnalysis::setNtuple(float* hcalE, float* ecalE, float elab, float x, float y, float z, float edep, float edec, float edhc) { - AIDA::ITuple * ntuple = dynamic_cast ( tree->find("1") ); - if (ntuple) { + if (tuple) { char tag[10]; for (int i=0; i<28; i++) { sprintf (tag, "hcal%d", i); - ntuple->fill(tuple->findColumn(tag),hcalE[i]); + tuple->fill(tuple->findColumn(tag),hcalE[i]); } for (int i=0; i<49; i++) { sprintf (tag, "ecal%d", i); - ntuple->fill(tuple->findColumn(tag),ecalE[i]); + tuple->fill(tuple->findColumn(tag),ecalE[i]); } - ntuple->fill(tuple->findColumn("ELAB"),elab); - ntuple->fill(tuple->findColumn("XPOS"),x); - ntuple->fill(tuple->findColumn("YPOS"),y); - ntuple->fill(tuple->findColumn("ZPOS"),z); - ntuple->fill(tuple->findColumn("EDEP"),edep); - ntuple->fill(tuple->findColumn("EDEC"),edec); - ntuple->fill(tuple->findColumn("EDHC"),edhc); - ntuple->addRow(); + tuple->fill(tuple->findColumn("ELAB"),elab); + tuple->fill(tuple->findColumn("XPOS"),x); + tuple->fill(tuple->findColumn("YPOS"),y); + tuple->fill(tuple->findColumn("ZPOS"),z); + tuple->fill(tuple->findColumn("EDEP"),edep); + tuple->fill(tuple->findColumn("EDEC"),edec); + tuple->fill(tuple->findColumn("EDHC"),edhc); + tuple->addRow(); #ifdef debug G4cout << "CCalAnalysis:: Fill Ntuple " << G4endl; #endif diff --git a/examples/advanced/cosmicray_charging/CRCharging.cc b/examples/advanced/cosmicray_charging/CRCharging.cc new file mode 100644 index 0000000000..94ad43204f --- /dev/null +++ b/examples/advanced/cosmicray_charging/CRCharging.cc @@ -0,0 +1,140 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * main program class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" + +#ifdef G4UI_USE_XM +#include "G4UIXm.hh" +#endif + +#include "Randomize.hh" + +#ifdef G4VIS_USE +#include "LISAVisManager.hh" +#endif + +#include "LISADetectorConstruction.hh" +#include "LISAPhysicsList.hh" +#include "LISAPrimaryGeneratorAction.hh" +#include "LISARunAction.hh" +#include "LISAEventAction.hh" +#include "LISASteppingAction.hh" +#include "LISAStackingAction.hh" + +#include + + +int main(int argc,char** argv) { + + // choose the Random engine + HepRandom::setTheEngine(new RanecuEngine); + + + // Construct the default run manager + G4RunManager* runManager = new G4RunManager; + + // set mandatory initialization classes + LISADetectorConstruction* detector = new LISADetectorConstruction; + runManager->SetUserInitialization(detector); + runManager->SetUserInitialization(new LISAPhysicsList); + LISAPrimaryGeneratorAction* generatorAction = new LISAPrimaryGeneratorAction; + runManager->SetUserAction(generatorAction); + + // set user action classes + LISASteppingAction* steppingAction = new LISASteppingAction; + runManager->SetUserAction(steppingAction); + runManager->SetUserAction(new LISAStackingAction); + runManager->SetUserAction( + new LISAEventAction(generatorAction,steppingAction)); + runManager->SetUserAction(new LISARunAction); + + + G4UIsession* session=0; + if (argc==1) { // Define UI session for interactive mode. + // G4UIterminal is a (dumb) terminal. +#ifdef G4UI_USE_XM + session = new G4UIXm(argc,argv); +#else +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif +#endif + } + +#ifdef G4VIS_USE + // visualization manager + G4VisManager* visManager = new LISAVisManager; + visManager->Initialize(); +#endif + + + //Initialize G4 kernel + runManager->Initialize(); + + // get the pointer to the User Interface manager + G4UImanager* UI = G4UImanager::GetUIpointer(); + + // Define UI session for interactive mode. + if(session) { + // G4UIterminal is a (dumb) terminal. + UI->ApplyCommand("/control/execute init.mac"); + session->SessionStart(); + delete session; + } + // Batch mode + else { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI->ApplyCommand(command+fileName); + } + + // job termination +#ifdef G4VIS_USE + delete visManager; +#endif + delete runManager; + + return 0; +} + diff --git a/examples/advanced/cosmicray_charging/GNUmakefile b/examples/advanced/cosmicray_charging/GNUmakefile new file mode 100644 index 0000000000..b4fb35d04f --- /dev/null +++ b/examples/advanced/cosmicray_charging/GNUmakefile @@ -0,0 +1,22 @@ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := CRCharging +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all +all: lib bin + +include $(G4INSTALL)/config/binmake.gmk + +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` + LOADLIBS += `aida-config --lib` +endif diff --git a/examples/advanced/cosmicray_charging/History b/examples/advanced/cosmicray_charging/History new file mode 100644 index 0000000000..be5735950c --- /dev/null +++ b/examples/advanced/cosmicray_charging/History @@ -0,0 +1,24 @@ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + 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 * + ---------------------------------------------------------- + +07.05.2004 - Henrique Araujo, tag cosmicray_charging-V06-01-00 + First submission of cosmicray_charging example. + +28.05.2004 - Henrique Araujo, tag cosmicray_charging-V06-01-01 + Minor changes to GNUMakeFile + Ported to PI Light (no changes in code required) diff --git a/examples/advanced/cosmicray_charging/README b/examples/advanced/cosmicray_charging/README new file mode 100644 index 0000000000..9c73a520e8 --- /dev/null +++ b/examples/advanced/cosmicray_charging/README @@ -0,0 +1,45 @@ +======================================================================== + + cosmicray_charging advanced example + + Henrique Araujo & Peter Wass + Imperial College London + + April 2004 + +======================================================================== + +This Geant4 example was derived from an application aimed at +simulating the electrostatic charging of isolated test masses in the +LISA mission by galactic cosmic ray protons and helium nuclei. This +work was supported by the European Space Agency through the SEPTIMESS +project under Contract No. 16339/02/NL/FM. + +LISA, the Laser Interferometer Space Antenna for the detection of +gravitational waves, is a joint ESA/NASA mission composed of three +identical spacecraft orbiting the Sun in a triangular formation, each +containing two cubic test masses in pure geodesic (drag free) motion. +The interferometric measurements between different spacecraft +are affected by the accrual of charge in the test masses caused by the +interaction of energetic cosmic rays. + +With this example we intend to demonstrate an application of Geant4 to +space environment simulations, using an extensive set of physics +models spanning from TeV energies down to a few hundred eV. This code +retains most (but not all) of the complex spacecraft and sensor +geometry implemented for the original purpose. In particular, some +complex elements of the inertial sensor surrounding the test masses +have not been included. Differential energy spectra for protons, He-4 +and He-3 nuclei at solar minimum conditions are the only input macros +provided. The remaining application classes have been kept unchanged. + +A Software Users' Manual suitable for Geant4 users of all levels is +distributed with this application (/docs). The technical description +of the original software package, including further software +documentation, physics analysis and a similar effort for the precursor +ESA mission LISA Pathfinder are available from the SEPTIMESS project +website at http://reat.space.qinetiq.com/septimess/ or from +http://astro.ic.ac.uk/~haraujo/SEPTIMESS/ . + +Any queries regarding this example or the original work can be +directed to h.araujo@imperial.ac.uk. diff --git a/examples/advanced/cosmicray_charging/docs/WP500_SUM_ICL_002_v1.0.pdf b/examples/advanced/cosmicray_charging/docs/WP500_SUM_ICL_002_v1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..142cc423f605bfddf5bcd0479c8b2e7b82bb6d81 GIT binary patch literal 451512 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�k=W0~kmzRC(cTy5F2+V?G;F})M3GW_eK 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
  1. H85;s>}1O0E`QOCghX)( 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¨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

    M;fnw9Ez@ot^Xp%-;(h(uhy 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 literal 0 HcmV?d00001 diff --git a/examples/advanced/cosmicray_charging/include/LISAAnalysisManager.hh b/examples/advanced/cosmicray_charging/include/LISAAnalysisManager.hh new file mode 100644 index 0000000000..95124a0d4b --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAAnalysisManager.hh @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + + +#ifdef G4ANALYSIS_USE +#ifndef LISAAnalysisManager_h +#define LISAAnalysisManager_h 1 + +#include "globals.hh" + +#include + +namespace AIDA { + class IAnalysisFactory; + class ITree; + class IHistogramFactory; + class ITupleFactory; + class ITuple; + class IHistogram1D; + class IHistogram2D; + class IPlotter; + class IFitter; + class IFitResult; + class IFitData; + class IRangeSet; + class IFitParameterSettings; + class IFunctionFactory; + class IFunction; + class IFitFactory; +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class LISAAnalysisManager { + + public: + virtual ~LISAAnalysisManager(); + void Init(); + void Dispose(); + + + // Run analysis + void bookRun(G4String); + void FinishRun(); + void analyseRun + (G4int evt, G4int tm, G4double energy, G4int charge, + G4int in, G4int out, long seed1, long seed2); + + // grab instance + static LISAAnalysisManager* getInstance(); + + + private: + + // private constructor for singleton + LISAAnalysisManager(); + + static LISAAnalysisManager* instance; + + + AIDA::IAnalysisFactory *af; + AIDA::ITreeFactory *tf; + AIDA::ITree *run_tree; + AIDA::ITupleFactory *run_tpf; + AIDA::ITuple *run_tuple; + + +}; +#endif +#endif + + + diff --git a/examples/advanced/cosmicray_charging/include/LISADetectorConstruction.hh b/examples/advanced/cosmicray_charging/include/LISADetectorConstruction.hh new file mode 100644 index 0000000000..ffd33b63da --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISADetectorConstruction.hh @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISADetectorConstruction_h +#define LISADetectorConstruction_h 1 + +#include "G4VUserDetectorConstruction.hh" + +#include "G4UserLimits.hh" + +#include "G4Material.hh" +#include "G4MaterialTable.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Element.hh" +#include "G4Isotope.hh" +#include "G4UnitsTable.hh" + +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4Sphere.hh" +#include "G4Cons.hh" +#include "G4Trap.hh" +#include "G4Torus.hh" +#include "G4Trd.hh" +#include "G4VSolid.hh" +#include "G4UnionSolid.hh" +#include "G4SubtractionSolid.hh" + +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" + +#include "G4PVPlacement.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" + +#include "G4Region.hh" + +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +#include "G4ios.hh" +#include "globals.hh" + +#include + + +class LISADetectorConstruction : public G4VUserDetectorConstruction { + + public: + LISADetectorConstruction(); + ~LISADetectorConstruction(); + + G4VPhysicalVolume* Construct(); + + private: + void ConstructMaterials(); + G4VPhysicalVolume* ConstructDetector(); + + + private: + // pointers to materials + G4Material *vacuum; + G4Material *Al6061; + G4Material *AlHoneycomb; + G4Material *Scell; + G4Material *MLImat; + G4Material *molybdenum; + G4Material *TiAlloy; + G4Material *gold; + G4Material *AuPt; + G4Material *CFRP; + G4Material *ULEglass; + G4Material *SHAPAL; + G4Material *SiC; + G4Material *foam; + + +}; + +#endif + diff --git a/examples/advanced/cosmicray_charging/include/LISADetectorMaterials.hh b/examples/advanced/cosmicray_charging/include/LISADetectorMaterials.hh new file mode 100644 index 0000000000..3fbf376aba --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISADetectorMaterials.hh @@ -0,0 +1,134 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + + +void LISADetectorConstruction::ConstructMaterials(void) { + + // Elements + + G4Element* elementH = new G4Element("Hydrogen", "H", 1., 1.0079*g/mole); + G4Element* elementC = new G4Element("Carbon", "C", 6., 12.011*g/mole); + G4Element* elementN = new G4Element("Nitrogen", "N", 7., 14.007*g/mole); + G4Element* elementO = new G4Element("Oxygen", "O", 8., 15.9994*g/mole); + G4Element* elementMg = new G4Element("Magnesium", "Mg",12., 24.3050*g/mole); + G4Element* elementAl = new G4Element("Aluminium", "Al",13., 26.9815*g/mole); + G4Element* elementSi = new G4Element("Silicon", "Si",14., 28.0855*g/mole); + G4Element* elementTi = new G4Element("Titanium", "Ti",22., 47.90*g/mole); + G4Element* elementV = new G4Element("Vanadium", "V", 23., 50.9415*g/mole); + G4Element* elementFe = new G4Element("Iron", "Fe",26., 55.845*g/mole); + G4Element* elementMo = new G4Element("Molybdenum","Mo",42., 95.94*g/mole); + G4Element* elementPt = new G4Element("Platinum", "Pt",78., 195.08*g/mole); + G4Element* elementAu = new G4Element("Gold", "Au",79., 196.97*g/mole); + + + // Materials + + vacuum = new G4Material("vacuum", 1, 1.00794*g/mole, + 1.0E-25*g/cm3, kStateGas, 0.1*kelvin, 1.0E-19*pascal); + + // Aluminium alloy 6061-T6 + Al6061 = new G4Material("Al6061", 2.70*g/cm3, 4); + Al6061->AddElement(elementAl, 0.980); + Al6061->AddElement(elementMg, 0.010); + Al6061->AddElement(elementSi, 0.006); + Al6061->AddElement(elementFe, 0.004); + + // Aluminium Alloy honeycomb + AlHoneycomb = new G4Material("AlHoneycomb",0.05*g/cm3, 4); + AlHoneycomb->AddElement(elementAl, 0.980); + AlHoneycomb->AddElement(elementMg, 0.010); + AlHoneycomb->AddElement(elementSi, 0.006); + AlHoneycomb->AddElement(elementFe, 0.004); + + // Solar Cells**** + Scell = new G4Material("Scell", 7.82*g/cm3, 1); + Scell->AddElement(elementSi, 1.00); + + // MLI Blanket: mylar (composition from STAR Stopping Power database) + MLImat = new G4Material("MLImat", 1.40*g/cm3, 3); + MLImat->AddElement(elementH, 0.041959); + MLImat->AddElement(elementC, 0.625017); + MLImat->AddElement(elementO, 0.333025); + + // Molybdenum + molybdenum = new G4Material("molybdenum", 10.22*g/cm3, 1); + molybdenum->AddElement(elementMo, 1.00); + + // Titanium Alloy (Ti-6Al-4V) + TiAlloy = new G4Material("TiAlloy", 4.43*g/cm3, 3); + TiAlloy->AddElement(elementTi, 0.90); + TiAlloy->AddElement(elementAl, 0.06); + TiAlloy->AddElement(elementV, 0.04); + + // Gold + gold = new G4Material("gold", 19.32*g/cm3, 1); + gold->AddElement(elementAu, 1.00); + + // Gold-Platinum 70%/30% + AuPt = new G4Material("AuPt", 19.92*g/cm3, 2); + AuPt->AddElement(elementAu, 0.70); + AuPt->AddElement(elementPt, 0.30); + + // CRFP (Carbon Fiber Reinforced Polymer): M55 Quasiisotropic Layup + CFRP = new G4Material("CFRP", 1.66*g/cm3, 1); + CFRP->AddElement(elementC,1); + + // Silicate glass + G4Material* SiGlass = new G4Material("SiGlass", 2.20*g/cm3, 2); + SiGlass->AddElement(elementO, 2); + SiGlass->AddElement(elementSi,1); + // Titanium glass + G4Material* TiGlass = new G4Material("TiGlass", 4.25*g/cm3, 2); + TiGlass->AddElement(elementO, 2); + TiGlass->AddElement(elementTi,1); + // Corning 7972 ULE Titanium Silicate Glass + ULEglass = new G4Material("ULEglass", 2.21*g/cm3, 2); + ULEglass->AddMaterial(SiGlass, 0.925); + ULEglass->AddMaterial(TiGlass, 0.075); + + // SHAPAL-M (AlN) + SHAPAL = new G4Material("SHAPAL-M", 2.90*g/cm3, 2); + SHAPAL->AddElement(elementAl,1); + SHAPAL->AddElement(elementN, 1); + + // Silicon carbide + SiC = new G4Material("SiC", 3.1*g/cm3, 2); + SiC->AddElement(elementSi,1); + SiC->AddElement(elementC, 1); + + // Foam: Polystyrene-based + foam = new G4Material("foam",0.05*g/cm3, 2); + foam->AddElement(elementC, 0.90); + foam->AddElement(elementH, 0.10); + + +} diff --git a/examples/advanced/cosmicray_charging/include/LISAEventAction.hh b/examples/advanced/cosmicray_charging/include/LISAEventAction.hh new file mode 100644 index 0000000000..92b9b7f005 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAEventAction.hh @@ -0,0 +1,75 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAEventAction_h +#define LISAEventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" +#include "G4ios.hh" +#include + +class LISAPrimaryGeneratorAction; +class LISASteppingAction; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +class LISAEventAction : public G4UserEventAction { + + public: + LISAEventAction(LISAPrimaryGeneratorAction*, LISASteppingAction*); + virtual ~LISAEventAction(); + virtual void BeginOfEventAction(const G4Event*); + virtual void EndOfEventAction(const G4Event*); + + private: + LISAPrimaryGeneratorAction* genAction; + LISASteppingAction* stepAction; + + public: + inline void SetFilename(const G4String& name) {filename = name;}; + + + private: + G4int event_id; + G4double energy_pri; + G4int charge_in[2]; + G4int charge_out[2]; + G4int charge_tot[2]; + const long* seeds; + G4String filename; + +}; + +#endif + + diff --git a/examples/advanced/cosmicray_charging/include/LISAPhysicsList.hh b/examples/advanced/cosmicray_charging/include/LISAPhysicsList.hh new file mode 100644 index 0000000000..5fe2b4c1ee --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAPhysicsList.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAPhysicsList_h +#define LISAPhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class LISAPhysicsList: public G4VUserPhysicsList { + + public: + LISAPhysicsList(); + virtual ~LISAPhysicsList(); + + public: + virtual void SetCuts(); + + protected: + // particles and physics + virtual void ConstructParticle(); + virtual void ConstructProcess(); + + // physics processes + virtual void AddTransportation(); + virtual void ElectromagneticPhysics(); + virtual void HadronicPhysics(); + virtual void ElectroNuclearPhysics(); + virtual void GeneralPhysics(); + + private: + G4int VerboseLevel; + +}; + +#endif diff --git a/examples/advanced/cosmicray_charging/include/LISAPrimaryGeneratorAction.hh b/examples/advanced/cosmicray_charging/include/LISAPrimaryGeneratorAction.hh new file mode 100644 index 0000000000..339d6f860f --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAPrimaryGeneratorAction.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAPrimaryGeneratorAction_h +#define LISAPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class G4GeneralParticleSource; +class G4Event; + +class LISAPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction { + + public: + LISAPrimaryGeneratorAction(); + ~LISAPrimaryGeneratorAction(); + void GeneratePrimaries(G4Event* anEvent); + + private: + G4GeneralParticleSource* particleGun; + + private: + long seeds[2]; + G4double energy_pri; + + public: + const long* GetEventSeeds() {return seeds;}; + G4double GetEnergyPrimary() {return energy_pri;}; + +}; + +#endif + diff --git a/examples/advanced/cosmicray_charging/include/LISARunAction.hh b/examples/advanced/cosmicray_charging/include/LISARunAction.hh new file mode 100644 index 0000000000..1a60b28898 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISARunAction.hh @@ -0,0 +1,66 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISARunAction_h +#define LISARunAction_h 1 + +#include "G4UserRunAction.hh" +#include "globals.hh" + +class LISARunActionMessenger; +class G4Run; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +class LISARunAction : public G4UserRunAction { + + public: + LISARunAction(); + ~LISARunAction(); + + public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + + + public: + inline void SetAutoSeed (const G4bool val) {autoSeed = val;} + + private: + LISARunActionMessenger* runMessenger; + + G4bool autoSeed; + +}; + +#endif + diff --git a/examples/advanced/cosmicray_charging/include/LISARunActionMessenger.hh b/examples/advanced/cosmicray_charging/include/LISARunActionMessenger.hh new file mode 100644 index 0000000000..afbdff2692 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISARunActionMessenger.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISARunActionMessenger_h +#define LISARunActionMessenger_h 1 + +#include "G4UImessenger.hh" +#include "G4UIcommand.hh" +#include "G4UIcmdWithABool.hh" +#include +#include "globals.hh" + +class LISARunAction; + +class LISARunActionMessenger: public G4UImessenger { + + public: + LISARunActionMessenger(LISARunAction*); + ~LISARunActionMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + LISARunAction* runAction; + + G4UIcmdWithABool* SetAutoSeedCmd; + +}; + +#endif diff --git a/examples/advanced/cosmicray_charging/include/LISAStackingAction.hh b/examples/advanced/cosmicray_charging/include/LISAStackingAction.hh new file mode 100644 index 0000000000..07ff166850 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAStackingAction.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAStackingAction_h +#define LISAStackingAction_h 1 + +#include "globals.hh" +#include "G4UserStackingAction.hh" + +class LISAStackingActionMessenger; +class G4Track; + +class LISAStackingAction : public G4UserStackingAction { + + public: + LISAStackingAction(); + virtual ~LISAStackingAction(); + + virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track* aTrack); + virtual void NewStage(); + virtual void PrepareNewEvent(); + + public: + inline void SetPrimarySurvey (const G4bool val) {PrimarySurveyFlag = val;} + inline void SetParticleSurvey(const G4bool val) {ParticleSurveyFlag = val;} + + private: + LISAStackingActionMessenger* stackingMessenger; + G4bool PrimarySurveyFlag; + G4bool ParticleSurveyFlag; + + +}; + +#endif + diff --git a/examples/advanced/cosmicray_charging/include/LISAStackingActionMessenger.hh b/examples/advanced/cosmicray_charging/include/LISAStackingActionMessenger.hh new file mode 100644 index 0000000000..8bc97001ca --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAStackingActionMessenger.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAStackingActionMessenger_h +#define LISAStackingActionMessenger_h 1 + +#include "G4UImessenger.hh" +#include "G4UIcommand.hh" +#include "G4UIcmdWithABool.hh" +#include "globals.hh" + +class LISAStackingAction; + +class LISAStackingActionMessenger: public G4UImessenger { + + public: + LISAStackingActionMessenger(LISAStackingAction*); + ~LISAStackingActionMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + LISAStackingAction* stackingAction; + + G4UIcmdWithABool* SetPriSurvey; + G4UIcmdWithABool* SetPartSurvey; + +}; + +#endif diff --git a/examples/advanced/cosmicray_charging/include/LISASteppingAction.hh b/examples/advanced/cosmicray_charging/include/LISASteppingAction.hh new file mode 100644 index 0000000000..02f0f682b8 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISASteppingAction.hh @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISASteppingAction_h +#define LISASteppingAction_h 1 + +#include "G4UserSteppingAction.hh" +#include "globals.hh" + +class LISAEventAction; +class LISASteppingActionMessenger; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +class LISASteppingAction : public G4UserSteppingAction { + + public: + LISASteppingAction(); + virtual ~LISASteppingAction(); + + virtual void UserSteppingAction(const G4Step*); + + public: + inline void Discharge(void) {charge_in[0]=0; charge_out[0]=0; + charge_in[1]=0; charge_out[1]=0;}; + + inline G4int GetChargeIn(const G4int tm) {return charge_in[tm];} + inline G4int GetChargeOut(const G4int tm) {return charge_out[tm];} + + + inline void SetFlagSpectrum(const G4bool val) {FlagSpectrum = val;} + + private: + G4int charge_in[2]; + G4int charge_out[2]; + + LISASteppingActionMessenger* steppingMessenger; + G4bool FlagSpectrum; + + + +}; + +#endif diff --git a/examples/advanced/cosmicray_charging/include/LISASteppingActionMessenger.hh b/examples/advanced/cosmicray_charging/include/LISASteppingActionMessenger.hh new file mode 100644 index 0000000000..4fb36620b3 --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISASteppingActionMessenger.hh @@ -0,0 +1,61 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISASteppingActionMessenger_h +#define LISASteppingActionMessenger_h 1 + +#include "G4UImessenger.hh" +#include "G4UIcommand.hh" +#include "G4UIcmdWithABool.hh" +#include "G4UIdirectory.hh" +#include "globals.hh" + +class LISASteppingAction; + +class LISASteppingActionMessenger: public G4UImessenger { + + public: + LISASteppingActionMessenger(LISASteppingAction*); + ~LISASteppingActionMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + LISASteppingAction* steppingAction; + + G4UIcmdWithABool* SetFlagSpectrum; + + G4UIdirectory* newDir; + +}; + +#endif diff --git a/examples/advanced/cosmicray_charging/include/LISAVisManager.hh b/examples/advanced/cosmicray_charging/include/LISAVisManager.hh new file mode 100644 index 0000000000..71046d600b --- /dev/null +++ b/examples/advanced/cosmicray_charging/include/LISAVisManager.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// ******************************************************************** + +#ifndef LISAVisManager_h +#define LISAVisManager_h 1 + +#ifdef G4VIS_USE + +#include "G4VisManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class LISAVisManager: public G4VisManager { + + public: + LISAVisManager(); + + private: + void RegisterGraphicsSystems (); + +}; + +#endif + +#endif + diff --git a/examples/advanced/cosmicray_charging/init.mac b/examples/advanced/cosmicray_charging/init.mac new file mode 100644 index 0000000000..64e239028d --- /dev/null +++ b/examples/advanced/cosmicray_charging/init.mac @@ -0,0 +1,25 @@ +#############################################################################*# +# Initialisation macro for interactive mode # +############################################################################### +# +/control/verbose 1 +/control/saveHistory +# +# Create empty scene +/vis/scene/create +# +# Create a scene handler for a specific graphics system +# (Edit the next line(s) to choose another graphic system) +/vis/open OGLSX +#/vis/open OGLIX +#/vis/open OGLSXm +#/vis/open OGLIXm +#/vis/open DANWFILE +# +# Add detector to scene +/vis/drawVolume +# +# Flush visualization +#/vis/viewer/flush +# +/vis/viewer/set/lineSegmentsPerCircle 120 diff --git a/examples/advanced/cosmicray_charging/primaries/helium3_solmin.mac b/examples/advanced/cosmicray_charging/primaries/helium3_solmin.mac new file mode 100644 index 0000000000..a0c92c7ab1 --- /dev/null +++ b/examples/advanced/cosmicray_charging/primaries/helium3_solmin.mac @@ -0,0 +1,66 @@ +################################################################# +# Differential energy spectrum for solar minimum HELIUM-3 at 1 AU +################################################################# +# +/vis/disable +/tracking/storeTrajectory 0 +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +# +/control/suppressAbortion 1 +# +# Random seeds +/run/autoSeed 1 +#/random/resetEngineFrom seeds.rndm +# +# particle surveys +#/surveys/surveyParticles 1 +#/surveys/surveyPrimaries 1 +#/surveys/surveyTestMasses 1 +# +/gps/particle He3 +# +# Isotropic distribution +/gps/type Surface +/gps/shape Sphere +/gps/radius 1499. mm +/gps/centre 0. 0. 0. mm +/gps/angtype cos +# +# Differential energy spectrum for solar minimum +# Helium flux (/m2/s/sr/MeV) from Vannuccini 2001 +# He-3/He-4 compiled by C. Grimani +# EPN TAKEN FOR A=4!!! +# INTEGRAL FLUX = 0.0591 He/cm2/s +/gps/energytype Arb +/gps/histname arb +# +/gps/histpoint 4.000E+02 2.409E+01 +/gps/histpoint 5.970E+02 2.972E+01 +/gps/histpoint 8.910E+02 3.448E+01 +/gps/histpoint 1.330E+03 3.691E+01 +/gps/histpoint 1.985E+03 3.068E+01 +/gps/histpoint 2.962E+03 2.202E+01 +/gps/histpoint 4.421E+03 1.459E+01 +/gps/histpoint 6.599E+03 9.011E+00 +/gps/histpoint 9.848E+03 4.512E+00 +/gps/histpoint 1.470E+04 2.042E+00 +/gps/histpoint 2.194E+04 8.501E-01 +/gps/histpoint 3.274E+04 3.318E-01 +/gps/histpoint 4.887E+04 1.234E-01 +/gps/histpoint 7.293E+04 4.435E-02 +/gps/histpoint 1.089E+05 1.555E-02 +/gps/histpoint 1.625E+05 5.360E-03 +/gps/histpoint 2.425E+05 1.826E-03 +#/gps/histpoint 3.619E+05 6.172E-04 +#/gps/histpoint 5.401E+05 2.075E-04 +#/gps/histpoint 8.061E+05 6.949E-05 +#/gps/histpoint 1.203E+06 2.322E-05 +#/gps/histpoint 1.796E+06 7.745E-06 +#/gps/histpoint 2.680E+06 2.581E-06 +#/gps/histpoint 4.000E+06 8.593E-07 +# +/gps/arbint Lin +# +/run/beamOn 1000000 diff --git a/examples/advanced/cosmicray_charging/primaries/helium4_solmin.mac b/examples/advanced/cosmicray_charging/primaries/helium4_solmin.mac new file mode 100644 index 0000000000..25eea5f143 --- /dev/null +++ b/examples/advanced/cosmicray_charging/primaries/helium4_solmin.mac @@ -0,0 +1,65 @@ +################################################################# +# Differential energy spectrum for solar minimum HELIUM-4 at 1 AU +################################################################# +# +/vis/disable +/tracking/storeTrajectory 0 +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +# +/control/suppressAbortion 1 +# +# Random seeds +/run/autoSeed 1 +#/random/resetEngineFrom seeds.rndm +# +# particle surveys +#/surveys/surveyParticles 1 +#/surveys/surveyPrimaries 1 +#/surveys/surveyTestMasses 1 +# +/gps/particle alpha +# +# Isotropic distribution +/gps/type Surface +/gps/shape Sphere +/gps/radius 1499. mm +/gps/centre 0. 0. 0. mm +/gps/angtype cos +# +# Differential energy spectrum for solar minimum +# Helium flux (/m2/s/sr/MeV) from Vannuccini 2001 +# He-3/He-4 compiled by C. Grimani +# INTEGRAL FLUX = 0.315 He/cm2/s +/gps/energytype Arb +/gps/histname arb +# +/gps/histpoint 4.000E+02 2.666E+02 +/gps/histpoint 5.970E+02 2.619E+02 +/gps/histpoint 8.910E+02 2.419E+02 +/gps/histpoint 1.330E+03 2.062E+02 +/gps/histpoint 1.985E+03 1.641E+02 +/gps/histpoint 2.962E+03 1.177E+02 +/gps/histpoint 4.421E+03 7.428E+01 +/gps/histpoint 6.599E+03 4.096E+01 +/gps/histpoint 9.848E+03 2.051E+01 +/gps/histpoint 1.470E+04 9.280E+00 +/gps/histpoint 2.194E+04 3.864E+00 +/gps/histpoint 3.274E+04 1.508E+00 +/gps/histpoint 4.887E+04 5.611E-01 +/gps/histpoint 7.293E+04 2.016E-01 +/gps/histpoint 1.089E+05 7.068E-02 +/gps/histpoint 1.625E+05 2.436E-02 +/gps/histpoint 2.425E+05 8.300E-03 +#/gps/histpoint 3.619E+05 2.805E-03 +#/gps/histpoint 5.401E+05 9.430E-04 +#/gps/histpoint 8.061E+05 3.159E-04 +#/gps/histpoint 1.203E+06 1.055E-04 +#/gps/histpoint 1.796E+06 3.521E-05 +#/gps/histpoint 2.680E+06 1.173E-05 +#/gps/histpoint 4.000E+06 3.906E-06 +# +/gps/arbint Lin +# +/run/beamOn 1000000 diff --git a/examples/advanced/cosmicray_charging/primaries/protons_solmin.mac b/examples/advanced/cosmicray_charging/primaries/protons_solmin.mac new file mode 100644 index 0000000000..8bb724ec6c --- /dev/null +++ b/examples/advanced/cosmicray_charging/primaries/protons_solmin.mac @@ -0,0 +1,71 @@ +################################################################# +# Differential energy spectrum for solar minimum PROTONS at 1 AU +################################################################# +# +/vis/disable +/tracking/storeTrajectory 0 +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +# +/control/suppressAbortion 1 +# +# Random seeds +/run/autoSeed 1 +#/random/resetEngineFrom seeds.rndm +# +# particle surveys +#/surveys/surveyParticles 1 +#/surveys/surveyPrimaries 1 +#/surveys/surveyTestMasses 1 +# +/gps/particle proton +# +# Isotropic distribution +/gps/type Surface +/gps/shape Sphere +/gps/radius 1499. mm +/gps/centre 0. 0. 0. mm +/gps/angtype cos +# +# Differential energy spectrum for solar minimum +# proton flux (/m2/s/sr/MeV) from Vannuccini 2001 +# INTEGRAL FLUX = 4.29 p/cm2/s +/gps/energytype Arb +/gps/histname arb +# +/gps/histpoint 1.0000e+01 1.0886e+02 +/gps/histpoint 1.4874e+01 1.6753e+02 +/gps/histpoint 2.2122e+01 2.5783e+02 +/gps/histpoint 3.2903e+01 3.9680e+02 +/gps/histpoint 4.8939e+01 6.1068e+02 +/gps/histpoint 7.2790e+01 9.3985e+02 +/gps/histpoint 1.0826e+02 1.3421e+03 +/gps/histpoint 1.6103e+02 1.6191e+03 +/gps/histpoint 2.3950e+02 1.8305e+03 +/gps/histpoint 3.5622e+02 1.9002e+03 +/gps/histpoint 5.2983e+02 1.7726e+03 +/gps/histpoint 7.8805e+02 1.4572e+03 +/gps/histpoint 1.1721e+03 1.0417e+03 +/gps/histpoint 1.7433e+03 6.4545e+02 +/gps/histpoint 2.5929e+03 3.4914e+02 +/gps/histpoint 3.8566e+03 1.6753e+02 +/gps/histpoint 5.7362e+03 7.2810e+01 +/gps/histpoint 8.5317e+03 2.9280e+01 +/gps/histpoint 1.2690e+04 1.1109e+01 +/gps/histpoint 1.8874e+04 4.0399e+00 +/gps/histpoint 2.8072e+04 1.4257e+00 +/gps/histpoint 4.1753e+04 4.9270e-01 +/gps/histpoint 6.2102e+04 1.6783e-01 +/gps/histpoint 9.2367e+04 5.6602e-02 +/gps/histpoint 1.3738e+05 1.8962e-02 +/gps/histpoint 2.0434e+05 6.3234e-03 +/gps/histpoint 3.0392e+05 2.1023e-03 +/gps/histpoint 4.5204e+05 6.9745e-04 +/gps/histpoint 6.7234e+05 2.3106e-04 +/gps/histpoint 1.0000e+06 7.6479e-05 +# +/gps/arbint Lin + +# +/run/beamOn 10000 diff --git a/examples/advanced/cosmicray_charging/seeds.rndm b/examples/advanced/cosmicray_charging/seeds.rndm new file mode 100644 index 0000000000..c7649ac02f --- /dev/null +++ b/examples/advanced/cosmicray_charging/seeds.rndm @@ -0,0 +1,2 @@ +0 +3495773572 1779568655 diff --git a/examples/advanced/cosmicray_charging/shoot.mac b/examples/advanced/cosmicray_charging/shoot.mac new file mode 100644 index 0000000000..c3125a23ce --- /dev/null +++ b/examples/advanced/cosmicray_charging/shoot.mac @@ -0,0 +1,32 @@ +################################################################# +# Shoots 1 GeV protons randomly from generator surface +################################################################# +# +/vis/enable +/tracking/storeTrajectory 1 +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +# +/control/suppressAbortion 1 +# +# Random seeds +#/run/autoSeed 1 +/random/resetEngineFrom seeds.rndm +# +# particle surveys +#/surveys/surveyParticles 1 +#/surveys/surveyPrimaries 1 +#/surveys/surveyTestMasses 1 +# +/gps/particle proton +/gps/energy 1 GeV +# +# Isotropic distribution +/gps/type Surface +/gps/shape Sphere +/gps/radius 1499. mm +/gps/centre 0. 0. 0. mm +/gps/angtype cos +# +/run/beamOn 100 diff --git a/examples/advanced/cosmicray_charging/src/LISAAnalysisManager.cc b/examples/advanced/cosmicray_charging/src/LISAAnalysisManager.cc new file mode 100644 index 0000000000..21049e9883 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAAnalysisManager.cc @@ -0,0 +1,174 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAAnalysisManager class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#ifdef G4ANALYSIS_USE + +#include "LISAAnalysisManager.hh" +#include +#include "globals.hh" + +LISAAnalysisManager* LISAAnalysisManager::instance = 0; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +LISAAnalysisManager::LISAAnalysisManager() : + af(0), + tf(0), + run_tree(0), + run_tpf(0), + run_tuple(0) +{;} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +LISAAnalysisManager::~LISAAnalysisManager() { + + if(af) { + delete tf; + G4cout << " LISAAnalysis -- deleted tree factory" << G4endl; + delete af; + G4cout << " LISAAnalysis -- deleted analysis factory" << G4endl; + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISAAnalysisManager* LISAAnalysisManager::getInstance() { + + if (!instance) instance = new LISAAnalysisManager(); + return instance; + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAAnalysisManager::Dispose() { + + if(instance) { + delete instance; + instance = 0; + } +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAAnalysisManager::Init() { + + G4cout << G4endl << "******* Analysis with AIDA 3.0 *********" << G4endl; + + // create analysis factory + if( (af = AIDA_createAnalysisFactory()) ) + G4cout << " LISAAnalysis -- created analysis factory" << G4endl; + + // create tree factory + if( (tf = af->createTreeFactory()) ) + G4cout << " LISAAnalysis -- created tree factory" << G4endl; + +} + + + + +// +// RUN ANALYSIS ************************************************************** +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAAnalysisManager::bookRun(G4String hbookfile) { + + + // create RunTree + G4bool fileExists = false; + G4bool readOnly = false; + run_tree = tf->create(hbookfile, "hbook", readOnly, fileExists); + G4cout << " LISAAnalysis -- tree store: " << run_tree->storeName()<createTupleFactory(*run_tree ); + G4cout << " LISAAnalysis -- created NTuple factory" << G4endl; + + // Run Information + run_tuple = run_tpf->create( "1", "Run Tuple", + "float evt,tm,energy,charge,in,out,seed1,seed2"); + assert(run_tuple); + G4cout << " LISAAnalysis -- created Run NTuple" << G4endl; + + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAAnalysisManager::FinishRun() { + + // Committing transaction with the tree + G4cout << " LISAAnalysis -- committing run_tree..." << G4endl; + run_tree->commit(); + run_tree->close(); + + delete run_tpf; + delete run_tree; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAAnalysisManager::analyseRun(G4int evt, G4int tm, G4double energy, + G4int charge, G4int in, G4int out, long seed1, long seed2) { + + AIDA::ITuple* ntuple = dynamic_cast ( run_tree->find("1") ); + + // Fill the ntuple + ntuple->fill( ntuple->findColumn( "evt" ), (float) evt ); + ntuple->fill( ntuple->findColumn( "tm" ), (float) tm ); + ntuple->fill( ntuple->findColumn( "energy" ), (float) energy ); + ntuple->fill( ntuple->findColumn( "charge" ), (float) charge ); + ntuple->fill( ntuple->findColumn( "in" ), (float) in ); + ntuple->fill( ntuple->findColumn( "out" ), (float) out ); + ntuple->fill( ntuple->findColumn( "seed1" ), (float) seed1 ); + ntuple->fill( ntuple->findColumn( "seed2" ), (float) seed2 ); + + // Values of attributes are prepared; store them to the nTuple: + ntuple->addRow(); + +} + + +#endif diff --git a/examples/advanced/cosmicray_charging/src/LISAColours.icc b/examples/advanced/cosmicray_charging/src/LISAColours.icc new file mode 100644 index 0000000000..7db58004cd --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAColours.icc @@ -0,0 +1,90 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +// ************************************************************************** +// Colours and VisAttributes +//*************************************************************************** + + + // edge colour attributes + G4VisAttributes* white_vat = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); + G4VisAttributes* grey_vat = new G4VisAttributes(G4Colour(0.5, 0.5, 0.5)); + G4VisAttributes* black_vat = new G4VisAttributes(G4Colour(0.0, 0.0, 0.0)); + G4VisAttributes* red_vat = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); + G4VisAttributes* orange_vat = new G4VisAttributes(G4Colour(1.0, 0.5, 0.0)); + G4VisAttributes* yellow_vat = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0)); + G4VisAttributes* gold_vat = new G4VisAttributes(G4Colour(.75, .75, 0.0)); + G4VisAttributes* green_vat = new G4VisAttributes(G4Colour(0.0, 1.0, 0.0)); + G4VisAttributes* lgreen_vat = new G4VisAttributes(G4Colour(0.0, .75, 0.0)); + G4VisAttributes* cyan_vat = new G4VisAttributes(G4Colour(0.0, 1.0, 1.0)); + G4VisAttributes* lblue_vat = new G4VisAttributes(G4Colour(0.0, 0.0, .75)); + G4VisAttributes* blue_vat = new G4VisAttributes(G4Colour(0.0, 0.0, 1.0)); + G4VisAttributes* magenta_vat = new G4VisAttributes(G4Colour(1.0, 0.0, 1.0)); + + // solid colour attributes + G4VisAttributes* sol_white_vat = new G4VisAttributes(G4Colour(1.0,1.0,1.0)); + sol_white_vat->SetForceSolid(true); + G4VisAttributes* sol_grey_vat = new G4VisAttributes(G4Colour(0.5,0.5,0.5)); + sol_grey_vat->SetForceSolid(true); + G4VisAttributes* sol_dgrey_vat = new G4VisAttributes(G4Colour(.25,.25,.25)); + sol_dgrey_vat->SetForceSolid(true); + G4VisAttributes* sol_black_vat = new G4VisAttributes(G4Colour(0.0,0.0,0.0)); + sol_black_vat->SetForceSolid(true); + G4VisAttributes* sol_red_vat = new G4VisAttributes(G4Colour(1.0,0.0,0.0)); + sol_red_vat->SetForceSolid(true); + G4VisAttributes* sol_green_vat = new G4VisAttributes(G4Colour(0.0,1.0,0.0)); + sol_green_vat->SetForceSolid(true); + G4VisAttributes* sol_lgreen_vat = new G4VisAttributes(G4Colour(0.0,.75,0.0)); + sol_lgreen_vat->SetForceSolid(true); + G4VisAttributes* sol_lblue_vat = new G4VisAttributes(G4Colour(0.0,0.0,.75)); + sol_lblue_vat->SetForceSolid(true); + G4VisAttributes* sol_cyan_vat = new G4VisAttributes(G4Colour(0.0,1.0,1.0)); + sol_cyan_vat->SetForceSolid(true); + G4VisAttributes* sol_blue_vat = new G4VisAttributes(G4Colour(0.0,0.0,1.0)); + sol_blue_vat->SetForceSolid(true); + G4VisAttributes* sol_gold_vat = new G4VisAttributes(G4Colour(.75,.75,0.0)); + sol_gold_vat->SetForceSolid(true); + G4VisAttributes* sol_yellow_vat = new G4VisAttributes(G4Colour(1.0,1.0,0.0)); + sol_yellow_vat->SetForceSolid(true); + G4VisAttributes* sol_orange_vat = new G4VisAttributes(G4Colour(1.0,0.5,0.0)); + sol_orange_vat->SetForceSolid(true); + + +//***************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISADetectorConstruction.cc b/examples/advanced/cosmicray_charging/src/LISADetectorConstruction.cc new file mode 100644 index 0000000000..b4fd36d5df --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISADetectorConstruction.cc @@ -0,0 +1,229 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + + +#include "LISADetectorConstruction.hh" +#include "LISADetectorMaterials.hh" + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISADetectorConstruction::LISADetectorConstruction() {;} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISADetectorConstruction::~LISADetectorConstruction() {;} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4VPhysicalVolume* LISADetectorConstruction::Construct() { + + + // material definitions + ConstructMaterials(); + + + // build it + return ConstructDetector(); + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4VPhysicalVolume* LISADetectorConstruction::ConstructDetector() { + + + // Edge and solid colour attributes +#include "LISAColours.icc" + + + + //*************************************************************************** + // world + //*************************************************************************** + + G4double wld_len = 3000.*mm; + + G4Tubs* truewld_sol = + new G4Tubs("truewld_box", 0., 0.5*wld_len, 0.5*wld_len, 0., 360.*deg); + G4LogicalVolume* truewld_log = + new G4LogicalVolume(truewld_sol, vacuum, "truewld_log"); + G4VPhysicalVolume* truewld_phys = new G4PVPlacement(0, G4ThreeVector(), + "truewld_phys", truewld_log, NULL, false, 0); + truewld_log->SetVisAttributes(G4VisAttributes::Invisible); + + // allow spacecraft rotation + G4RotationMatrix wld_rot; wld_rot.rotateZ(0.*deg); + G4Tubs* wld_sol = + new G4Tubs("wld_box", 0., 0.49*wld_len, 0.5*wld_len, 0., 360.*deg); + G4LogicalVolume* wld_log = + new G4LogicalVolume(wld_sol, vacuum, "wld_log"); + G4VPhysicalVolume* wld_phys = new G4PVPlacement(G4Transform3D(wld_rot, + G4ThreeVector()), "wld_phys", wld_log, truewld_phys, false, 0); + // wld_log->SetVisAttributes(white_vat); + wld_log->SetVisAttributes(G4VisAttributes::Invisible); + + + // Probe volume + // uncomment code in LISASteppingAction.cc to count hits + // G4Sphere* probe_sol = + // new G4Sphere("probe_sol", 0., 100.*mm, 0., 360.*deg, 0., 180.*deg); + // G4LogicalVolume* probe_log = + // new G4LogicalVolume(probe_sol, vacuum, "probe_log"); + // G4VPhysicalVolume* probe_phys = + // new G4PVPlacement(0, G4ThreeVector(0*mm,0*mm,0*mm), + // "probe_phys", probe_log, wld_phys, false, 0); + // probe_log->SetVisAttributes(sol_white_vat); + + + + //************************************************************************** + // Science Module Structure (SMS) + //************************************************************************** + // Primary Structure + // Lower Deck + // Upper Deck + // Thermal Shield + // Solar Array + // Optical Surface Reflectors (OSR) + // Radiator Panels + //************************************************************************** + + // position of science module spacecraft in world volume + G4ThreeVector spacecraft_pos(0.*mm,0.*mm,0.*mm); + +#include "LISAScienceModuleStructures.icc" + + + + //*************************************************************************** + // Interferometer Assembly + //*************************************************************************** + // Payload Shield (Y Tube) + // Telescope Light Shields + // Telescope Electronics Mounting + // Telescope Mirrors Mounting + // Telescope Actuator Mechanism + // Optical Bench Mounting + // Optical Bench + //*************************************************************************** + + + // position of payload shields in spacecraft + G4double YTube_xoff = -800.*mm; + + // position of interferometer in Y-tubes + G4RotationMatrix tel_rot1; tel_rot1.rotateY(210.*deg); + G4ThreeVector tel_pos1(+319.*mm, 0.*mm, 920.*mm); + G4RotationMatrix tel_rot2; tel_rot2.rotateY(150.*deg); + G4ThreeVector tel_pos2(-319.*mm, 0.*mm, 920.*mm); + + // position of optical bench along Y-tube + G4double OpticalBench_off = 0.0*mm; + +#include "LISAInterferometerAssembly.icc" + + + + //*************************************************************************** + // Sensor Vacuum Housing + // Modified to contain LTP Inertial Sensor and Caging Mechanism + //*************************************************************************** + + G4RotationMatrix IS_rot; IS_rot.rotateX(90.*deg); IS_rot.rotateY(90.*deg); + +#include "LISASensorHousing.icc" + + + + //*************************************************************************** + // LTP Caging Mechanism + //*************************************************************************** + + //#include "LISACagingMechanism.icc" + + + + + //*************************************************************************** + // Inertial Sensors: YZ-Injection, 46 mm Test Mass + // Design adopted for LTP/SMART-2: Report LTP-RT-CGS-001, issue 2 + //*************************************************************************** + +#include "LISAInertialSensor.icc" + + // Sensor Region (cuts 250 eV) + G4Region* ISensor = new G4Region(G4String("sensor")); + cage_o_log->SetRegion(ISensor); + ISensor->AddRootLogicalVolume(cage_o_log); + + + + + //*************************************************************************** + // Electronics Boxes + //*************************************************************************** + +#include "LISAElectronicsBoxes.icc" + + + + + //*************************************************************************** + // Support Systems + //*************************************************************************** + // Star Trackers + // FEEP Thrusters + // Communications Antennas + //*************************************************************************** + +#include "LISASupportSystems.icc" + + + + // ...................................................................... + // attach user limits ................................................... + + // reduce step size in electrodes + // goldplating_log->SetUserLimits (new G4UserLimits(30.*nanometer)); + + // return + return truewld_phys; + +} diff --git a/examples/advanced/cosmicray_charging/src/LISAElectronicsBoxes.icc b/examples/advanced/cosmicray_charging/src/LISAElectronicsBoxes.icc new file mode 100644 index 0000000000..e447cfe488 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAElectronicsBoxes.icc @@ -0,0 +1,462 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +//*************************************************************************** +// Electronics Boxes +//*************************************************************************** + + + // Lower Deck electronics + G4double EB_zoff = -230.*mm; + G4ThreeVector EPC1_pos(-680*mm, +580*mm, EB_zoff+0.5*110.*mm); + G4ThreeVector EPC2_pos(-680*mm, -580*mm, EB_zoff+0.5*110.*mm); + G4ThreeVector GyroPack_pos(+150*mm, +980*mm, EB_zoff+0.5* 85.*mm); + G4ThreeVector InstConE1_pos(+720*mm, -190*mm, EB_zoff+0.5*180.*mm); + G4ThreeVector InstConE2_pos(+720*mm, +190*mm, EB_zoff+0.5*180.*mm); + G4ThreeVector RFDU_pos( +30*mm,-1000*mm, EB_zoff+0.5* 80.*mm); + G4ThreeVector StarTrack3_pos(+450*mm, -850*mm, EB_zoff+0.5* 54.*mm); + G4ThreeVector StarTrack4_pos(+450*mm, +850*mm, EB_zoff+0.5* 54.*mm); + G4ThreeVector STElec1_pos( +30*mm, -720*mm, EB_zoff+0.5*100.*mm); + G4ThreeVector STElec2_pos(-280*mm, -900*mm, EB_zoff+0.5*100.*mm); + G4ThreeVector STElec3_pos(-280*mm, +900*mm, EB_zoff+0.5*100.*mm); + G4ThreeVector STElec4_pos( +30*mm, +720*mm, EB_zoff+0.5*100.*mm); + G4ThreeVector TWT1_pos(-730*mm, +350*mm, EB_zoff+0.5* 36.*mm); + G4ThreeVector TWT2_pos(-730*mm, -350*mm, EB_zoff+0.5* 36.*mm); + G4ThreeVector UVBox1_pos(+180*mm, 0, EB_zoff+0.5* 70.*mm); + G4ThreeVector UVBox2_pos(+480*mm, 0, EB_zoff+0.5* 70.*mm); + + // Upper Deck electronics + EB_zoff = 220.*mm; + G4ThreeVector PCDU_pos(-770*mm, +600*mm, EB_zoff-0.5*300.*mm); + G4ThreeVector CentELCPS_pos(-780*mm, -570*mm, EB_zoff-0.5*115.*mm); + G4ThreeVector CentEL2_pos(-250*mm,-1000*mm, EB_zoff-0.5*284.*mm); + G4ThreeVector FEEPEL1_pos(-250*mm,+1000*mm, EB_zoff-0.5*200.*mm); + G4ThreeVector FEEPEL2_pos(+270*mm,+1020*mm, EB_zoff-0.5*200.*mm); + G4ThreeVector HGADrive1_pos( 20*mm,-1210*mm, EB_zoff-0.5*100.*mm); + G4ThreeVector HGADrive2_pos( 20*mm,+1210*mm, EB_zoff-0.5*100.*mm); + G4ThreeVector InterfelEL1_pos(1030*mm, -180*mm, EB_zoff-0.5*150.*mm); + G4ThreeVector InterfelEL2_pos(1030*mm, +180*mm, EB_zoff-0.5*150.*mm); + G4ThreeVector LaserEL1_pos(+720*mm, -220*mm, EB_zoff-0.5*100.*mm); + G4ThreeVector LaserEL2_pos(+720*mm, +220*mm, EB_zoff-0.5*100.*mm); + G4ThreeVector LaserHead1_pos(1100*mm, -400*mm, EB_zoff-0.5* 5.*mm); + G4ThreeVector LaserHead2_pos(1010*mm, -480*mm, EB_zoff-0.5* 50.*mm); + G4ThreeVector LaserHead3_pos(1100*mm, +400*mm, EB_zoff-0.5* 50.*mm); + G4ThreeVector LaserHead4_pos(1010*mm, +480*mm, EB_zoff-0.5* 50.*mm); + G4ThreeVector StarTrack1_pos(+650*mm,+1050*mm, EB_zoff-0.5* 54.*mm); + G4ThreeVector StarTrack2_pos(+650*mm,-1050*mm, EB_zoff-0.5* 54.*mm); + G4ThreeVector Transpond2_pos(+270*mm,-1050*mm, EB_zoff-0.5*178.*mm); + + + // rotations + G4RotationMatrix EB_rot1; EB_rot1.rotateZ(+30.*deg); + G4RotationMatrix EB_rot2; EB_rot2.rotateZ(-30.*deg); + G4RotationMatrix EB_rot3; EB_rot3.rotateZ(+60.*deg); + G4RotationMatrix EB_rot4; EB_rot4.rotateZ(-60.*deg); + + + G4double f; + // Each box is made from solid Al6061 from which a volume + // f times smaller is removed to match assigned mass; + + + // Lower Deck electronics + + G4Box* EPC_box_o = new G4Box("EPC_box_o", + 0.5*227.*mm, 0.5*63.*mm, 0.5*110.*mm); + G4LogicalVolume* EPC_log_o = new G4LogicalVolume + (EPC_box_o, Al6061, "EPC_log_o"); + G4VPhysicalVolume* EPC_phys_o; + EPC_phys_o = new G4PVPlacement(0, spacecraft_pos + EPC1_pos, + "EPC_phys_o", EPC_log_o, wld_phys, false, 0); + EPC_phys_o = new G4PVPlacement(0, spacecraft_pos + EPC2_pos, + "EPC_phys_o", EPC_log_o, wld_phys, false, 1); + f = pow(1.-1.4/(2.70*227*63*110)*1E6, 1./3.); + // G4cout << "f: " << f << G4endl; + G4Box* EPC_box_i = new G4Box("EPC_box_i", + f*0.5*227.*mm, f*0.5*63.*mm, f*0.5*110.*mm); + G4LogicalVolume* EPC_log_i = new G4LogicalVolume + (EPC_box_i, vacuum, "EPC_log_i"); + G4VPhysicalVolume* EPC_phys_i = new G4PVPlacement + (0, 0, "EPC_phys_i", EPC_log_i, EPC_phys_o, false, 0); + // + // + G4Tubs* GyroPack_tub_o = new G4Tubs("GyroPack_tub_o", + 0., 0.5*89.*mm, 0.5*85.*mm, 0., 360.*deg); + G4LogicalVolume* GyroPack_log_o = new G4LogicalVolume + (GyroPack_tub_o, Al6061, "GyroPack_log_o"); + G4VPhysicalVolume* GyroPack_phys_o = new G4PVPlacement(0, spacecraft_pos + + GyroPack_pos, "GyroPack_phys_o", GyroPack_log_o, wld_phys, false, 0); + f = pow(1.-1.00/(2.70*M_PI*(0.5*89.)*(0.5*89.)*85.)*1E6, 1./3.); + // G4cout << "f: " << f << G4endl; + G4Tubs* GyroPack_tub_i = new G4Tubs("GyroPack_tub_i", + 0., f*0.5*89.*mm, f*0.5*85.*mm, 0., 360.*deg); + G4LogicalVolume* GyroPack_log_i = new G4LogicalVolume + (GyroPack_tub_i, vacuum, "GyroPack_log_i"); + G4VPhysicalVolume* GyroPack_phys_i = new G4PVPlacement(0, 0, + "GyroPack_phys_i", GyroPack_log_i, GyroPack_phys_o, false, 0); + // + // + G4Box* InstConE_box_o = new G4Box("InstConE_box_o", + 0.5*250.*mm, 0.5*180.*mm, 0.5*180.*mm); + G4LogicalVolume* InstConE_log_o = new G4LogicalVolume + (InstConE_box_o, Al6061, "InstConE_log_o"); + G4VPhysicalVolume* InstConE_phys_o; + InstConE_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot1, spacecraft_pos + InstConE1_pos), + "InstConE_phys_o", InstConE_log_o, wld_phys, false, 0); + InstConE_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot2, spacecraft_pos + InstConE2_pos), + "InstConE_phys_o", InstConE_log_o, wld_phys, false, 1); + f = pow(1.-4.5/(2.70*250*180*180)*1E6, 1./3.); + G4Box* InstConE_box_i = new G4Box("InstConE_box_i", + f*0.5*250.*mm, f*0.5*180.*mm, f*0.5*180.*mm); + G4LogicalVolume* InstConE_log_i = new G4LogicalVolume + (InstConE_box_i, vacuum, "InstConE_log_i"); + G4VPhysicalVolume* InstConE_phys_i = new G4PVPlacement + (0, 0, "InstConE_phys_i", InstConE_log_i, InstConE_phys_o, false, 0); + // + // + G4Box* RFDU_box_o = new G4Box("RFDU_box_o", + 0.5*160.*mm, 0.5*60.*mm, 0.5*80.*mm); + G4LogicalVolume* RFDU_log_o = new G4LogicalVolume + (RFDU_box_o, Al6061, "RFDU_log_o"); + G4VPhysicalVolume* RFDU_phys_o = new G4PVPlacement(0, spacecraft_pos + + RFDU_pos, "RFDU_phys_o", RFDU_log_o, wld_phys, false, 0); + f = pow(1.-1.0/(2.70*160*60*80)*1E6, 1./3.); + G4Box* RFDU_box_i = new G4Box("RFDU_box_i", + f*0.5*160.*mm, f*0.5*60.*mm, f*0.5*80.*mm); + G4LogicalVolume* RFDU_log_i = new G4LogicalVolume + (RFDU_box_i, vacuum, "RFDU_log_i"); + G4VPhysicalVolume* RFDU_phys_i = new G4PVPlacement + (0, 0, "RFDU_phys_i", RFDU_log_i, RFDU_phys_o, false, 0); + // + // + G4Box* StarTrack_L_box_o = new G4Box("StarStrack_box_o", + 0.5*50.*mm, 0.5*50.*mm, 0.5*54.*mm); + G4LogicalVolume* StarTrack_L_log_o = new G4LogicalVolume + (StarTrack_L_box_o, Al6061, "StarTrack_log_o"); + G4VPhysicalVolume* StarTrack_L_phys_o; + StarTrack_L_phys_o = new G4PVPlacement(0, spacecraft_pos + StarTrack3_pos, + "STarTrack3_phys_o", StarTrack_L_log_o, wld_phys, false, 0); + StarTrack_L_phys_o = new G4PVPlacement(0, spacecraft_pos + StarTrack4_pos, + "STarTrack4_phys_o", StarTrack_L_log_o, wld_phys, false, 1); + f = pow(1.-0.30/(2.70*50*50*54)*1E6, 1./3.); + G4Box* StarTrack_L_box_i = new G4Box("StarTrack_L_box_i", + f*0.5*50.*mm, f*0.5*50.*mm, f*0.5*54.*mm); + G4LogicalVolume* StarTrack_L_log_i = new G4LogicalVolume + (StarTrack_L_box_i, vacuum, "StarTrack_L_log_i"); + G4VPhysicalVolume* StarTrack_L_phys_i = new G4PVPlacement + (0,0,"StarTrack_L_phys_i",StarTrack_L_log_i,StarTrack_L_phys_o,false,0); + // + // + G4Box* STElec_box_o = new G4Box("STElec_box_o", + 0.5*100.*mm, 0.5*100.*mm, 0.5*100.*mm); + G4LogicalVolume* STElec_log_o = new G4LogicalVolume + (STElec_box_o, Al6061, "STElec_log_o"); + G4VPhysicalVolume* STElec_phys_o; + STElec_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot1, spacecraft_pos + STElec1_pos), + "STElec_phys_o", STElec_log_o, wld_phys, false, 0); + STElec_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot1, spacecraft_pos + STElec2_pos), + "STElec_phys_o", STElec_log_o, wld_phys, false, 1); + STElec_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot2, spacecraft_pos + STElec3_pos), + "STElec_phys_o", STElec_log_o, wld_phys, false, 2); + STElec_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot2, spacecraft_pos + STElec4_pos), + "STElec_phys_o", STElec_log_o, wld_phys, false, 3); + f = pow(1.-2.0/(2.70*100*100*100)*1E6, 1./3.); + G4Box* STElec_box_i = new G4Box("STElec_box_i", + f*0.5*100.*mm, f*0.5*100.*mm, f*0.5*100.*mm); + G4LogicalVolume* STElec_log_i = new G4LogicalVolume + (STElec_box_i, vacuum, "STElec_log_i"); + G4VPhysicalVolume* STElec_phys_i = new G4PVPlacement + (0, 0, "STElec_phys_i", STElec_log_i, STElec_phys_o, false, 0); + // + // + G4Box* TWT_box_o = new G4Box("TWT_box_o", + 0.5*321.*mm, 0.5*58.*mm, 0.5*36.*mm); + G4LogicalVolume* TWT_log_o = new G4LogicalVolume + (TWT_box_o, Al6061, "TWT_log_o"); + G4VPhysicalVolume* TWT_phys_o; + TWT_phys_o = new G4PVPlacement(0, spacecraft_pos + TWT1_pos, + "TWT_phys_o", TWT_log_o, wld_phys, false, 0); + TWT_phys_o = new G4PVPlacement(0, spacecraft_pos + TWT2_pos, + "TWT_phys_o", TWT_log_o, wld_phys, false, 1); + f = pow(1.-0.75/(2.70*321*58*36)*1E6, 1./3.); + G4Box* TWT_box_i = new G4Box("TWT_box_i", + f*0.5*321.*mm, f*0.5*58.*mm, f*0.5*36.*mm); + G4LogicalVolume* TWT_log_i = new G4LogicalVolume + (TWT_box_i, vacuum, "TWT_log_i"); + G4VPhysicalVolume* TWT_phys_i = new G4PVPlacement + (0, 0, "TWT_phys_i", TWT_log_i, TWT_phys_o, false, 0); + // + // + G4Box* UVBox_box_o = new G4Box("UVBox_box_o", + 0.5*150.*mm, 0.5*100.*mm, 0.5*70.*mm); + G4LogicalVolume* UVBox_log_o = new G4LogicalVolume + (UVBox_box_o, Al6061, "UVBox_log_o"); + G4VPhysicalVolume* UVBox_phys_o; + UVBox_phys_o = new G4PVPlacement(0, spacecraft_pos + UVBox1_pos, + "UVBox_phys_o", UVBox_log_o, wld_phys, false, 0); + UVBox_phys_o = new G4PVPlacement(0, spacecraft_pos + UVBox2_pos, + "UVBox_phys_o", UVBox_log_o, wld_phys, false, 1); + f = pow(1.-0.50/(2.70*150*100*70)*1E6, 1./3.); + G4Box* UVBox_box_i = new G4Box("UVBox_box_i", + f*0.5*150.*mm, f*0.5*100.*mm, f*0.5*70.*mm); + G4LogicalVolume* UVBox_log_i = new G4LogicalVolume + (UVBox_box_i, vacuum, "UVBox_log_i"); + G4VPhysicalVolume* UVBox_phys_i = new G4PVPlacement + (0, 0, "UVBox_phys_i", UVBox_log_i, UVBox_phys_o, false, 0); + + + + // Upper Deck electronics + + G4Box* PCDU_box_o = new G4Box("PCDU_box_o", + 0.5*200.*mm, 0.5*350.*mm, 0.5*300.*mm); + G4LogicalVolume* PCDU_log_o = new G4LogicalVolume + (PCDU_box_o, Al6061, "PCDU_log_o"); + G4VPhysicalVolume* PCDU_phys_o = new G4PVPlacement(0, spacecraft_pos + + PCDU_pos, "PCDU_phys_o", PCDU_log_o, wld_phys, false, 0); + f = pow(1.-15.90/(2.70*200*350*300)*1E6, 1./3.); + G4Box* PCDU_box_i = new G4Box("PCDU_box_i", + f*0.5*200.*mm, f*0.5*350.*mm, f*0.5*300.*mm); + G4LogicalVolume* PCDU_log_i = new G4LogicalVolume + (PCDU_box_i, vacuum, "PCDU_log_i"); + G4VPhysicalVolume* PCDU_phys_i = new G4PVPlacement + (0, 0, "PCDU_phys_i", PCDU_log_i, PCDU_phys_o, false, 0); + // + // + G4Box* CentELCPS_box_o = new G4Box("CentELCPS_box_o", + 0.5*240.*mm, 0.5*356.*mm, 0.5*140.*mm); + G4LogicalVolume* CentELCPS_log_o = new G4LogicalVolume + (CentELCPS_box_o, Al6061, "CentELCPS_log_o"); + G4VPhysicalVolume* CentELCPS_phys_o = new G4PVPlacement(0, spacecraft_pos + + CentELCPS_pos, "CentELCPS_phys_o", CentELCPS_log_o, wld_phys, false, 0); + f = pow(1.-15.90/(2.70*240*356*140)*1E6, 1./3.); + G4Box* CentELCPS_box_i = new G4Box("CentELCPS_box_i", + f*0.5*240.*mm, f*0.5*356.*mm, f*0.5*140.*mm); + G4LogicalVolume* CentELCPS_log_i = new G4LogicalVolume + (CentELCPS_box_i, vacuum, "CentELCPS_log_i"); + G4VPhysicalVolume* CentELCPS_phys_i = new G4PVPlacement + (0, 0, "CentELCPS_phys_i", CentELCPS_log_i, CentELCPS_phys_o, false, 0); + // + // + G4Box* CentEL2_box_o = new G4Box("CentEL2_box_o", + 0.5*220.*mm, 0.5*184.*mm, 0.5*284.*mm); + G4LogicalVolume* CentEL2_log_o = new G4LogicalVolume + (CentEL2_box_o, Al6061, "CentEL2_log_o"); + G4VPhysicalVolume* CentEL2_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot3, spacecraft_pos + CentEL2_pos), + "CentEL2_phys_o", CentEL2_log_o, wld_phys, false, 0); + f = pow(1.-15.90/(2.70*220*184*284)*1E6, 1./3.); + G4Box* CentEL2_box_i = new G4Box("CentEL2_box_i", + f*0.5*220.*mm, f*0.5*184.*mm, f*0.5*284.*mm); + G4LogicalVolume* CentEL2_log_i = new G4LogicalVolume + (CentEL2_box_i, vacuum, "CentEL2_log_i"); + G4VPhysicalVolume* CentEL2_phys_i = new G4PVPlacement + (0, 0, "CentEL2_phys_i", CentEL2_log_i, CentEL2_phys_o, false, 0); + // + // + G4Box* FEEPEL_box_o = new G4Box("FEEPEL_box_o", + 0.5*260.*mm, 0.5*170.*mm, 0.5*200.*mm); + G4LogicalVolume* FEEPEL_log_o = new G4LogicalVolume + (FEEPEL_box_o, Al6061, "FEEPEL_log_o"); + G4VPhysicalVolume* FEEPEL_phys_o; + FEEPEL_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot4, spacecraft_pos + FEEPEL1_pos), + "FEEPEL_phys_o", FEEPEL_log_o, wld_phys, false, 0); + FEEPEL_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot1, spacecraft_pos + FEEPEL2_pos), + "FEEPEL_phys_o", FEEPEL_log_o, wld_phys, false, 1); + f = pow(1.-6.50/(2.70*260*170*200)*1E6, 1./3.); + G4Box* FEEPEL_box_i = new G4Box("FEEPEL_box_i", + f*0.5*260.*mm, f*0.5*170.*mm, f*0.5*200.*mm); + G4LogicalVolume* FEEPEL_log_i = new G4LogicalVolume + (FEEPEL_box_i, vacuum, "FEEPEL_log_i"); + G4VPhysicalVolume* FEEPEL_phys_i = new G4PVPlacement + (0, 0, "FEEPEL_phys_i", FEEPEL_log_i, FEEPEL_phys_o, false, 0); + // + // + G4Box* HGADrive_box_o = new G4Box("HGADrive_box_o", + 0.5*100.*mm, 0.5*100.*mm, 0.5*100.*mm); + G4LogicalVolume* HGADrive_log_o = new G4LogicalVolume + (HGADrive_box_o, Al6061, "HGADrive_log_o"); + G4VPhysicalVolume* HGADrive_phys_o; + HGADrive_phys_o = new G4PVPlacement(0, spacecraft_pos + HGADrive1_pos, + "HGADrive_phys_o", HGADrive_log_o, wld_phys, false, 0); + HGADrive_phys_o = new G4PVPlacement(0, spacecraft_pos + HGADrive2_pos, + "HGADrive_phys_o", HGADrive_log_o, wld_phys, false, 1); + f = pow(1.-1.00/(2.70*100*100*100)*1E6, 1./3.); + G4Box* HGADrive_box_i = new G4Box("HGADrive_box_i", + f*0.5*100.*mm, f*0.5*100.*mm, f*0.5*100.*mm); + G4LogicalVolume* HGADrive_log_i = new G4LogicalVolume + (HGADrive_box_i, vacuum, "HGADrive_log_i"); + G4VPhysicalVolume* HGADrive_phys_i = new G4PVPlacement + (0, 0, "HGADrive_phys_i", HGADrive_log_i, HGADrive_phys_o, false, 0); + // + // + G4Box* InterfelEL_box_o = new G4Box("InterfelEL_box_o", + 0.5*200.*mm, 0.5*200.*mm, 0.5*150.*mm); + G4LogicalVolume* InterfelEL_log_o = new G4LogicalVolume + (InterfelEL_box_o, Al6061, "InterfelEL_log_o"); + G4VPhysicalVolume* InterfelEL_phys_o; + InterfelEL_phys_o = new G4PVPlacement(0, spacecraft_pos + InterfelEL1_pos, + "InterfelEL_phys_o", InterfelEL_log_o, wld_phys, false, 0); + InterfelEL_phys_o = new G4PVPlacement(0, spacecraft_pos + InterfelEL2_pos, + "InterfelEL_phys_o", InterfelEL_log_o, wld_phys, false, 1); + f = pow(1.-3.50/(2.70*200*200*150)*1E6, 1./3.); + G4Box* InterfelEL_box_i = new G4Box("InterfelEL_box_i", + f*0.5*200.*mm, f*0.5*200.*mm, f*0.5*150.*mm); + G4LogicalVolume* InterfelEL_log_i = new G4LogicalVolume + (InterfelEL_box_i, vacuum, "InterfelEL_log_i"); + G4VPhysicalVolume* InterfelEL_phys_i = new G4PVPlacement(0, 0, + "InterfelEL_phys_i", InterfelEL_log_i, InterfelEL_phys_o, false, 0); + // + // + G4Box* LaserEL_box_o = new G4Box("LaserEL_box_o", + 0.5*200.*mm, 0.5*200.*mm, 0.5*100.*mm); + G4LogicalVolume* LaserEL_log_o = new G4LogicalVolume + (LaserEL_box_o, Al6061, "LaserEL_log_o"); + G4VPhysicalVolume* LaserEL_phys_o; + LaserEL_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot1, spacecraft_pos + LaserEL1_pos), + "LaserEL_phys_o", LaserEL_log_o, wld_phys, false, 0); + LaserEL_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot2, spacecraft_pos + LaserEL2_pos), + "LaserEL_phys_o", LaserEL_log_o, wld_phys, false, 1); + f = pow(1.-3.00/(2.70*200*200*100)*1E6, 1./3.); + G4Box* LaserEL_box_i = new G4Box("LaserEL_box_i", + f*0.5*200.*mm, f*0.5*200.*mm, f*0.5*100.*mm); + G4LogicalVolume* LaserEL_log_i = new G4LogicalVolume + (LaserEL_box_i, vacuum, "LaserEL_log_i"); + G4VPhysicalVolume* LaserEL_phys_i = new G4PVPlacement + (0, 0, "LaserEL_phys_i", LaserEL_log_i, LaserEL_phys_o, false, 0); + // + // + G4Box* LaserHead_box_o = new G4Box("LaserHead_box_o", + 0.5*100.*mm, 0.5*100.*mm, 0.5*50.*mm); + G4LogicalVolume* LaserHead_log_o = new G4LogicalVolume + (LaserHead_box_o, Al6061, "LaserHead_log_o"); + G4VPhysicalVolume* LaserHead_phys_o; + LaserHead_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot3, spacecraft_pos + LaserHead1_pos), + "LaserHead_phys_o", LaserHead_log_o, wld_phys, false, 0); + LaserHead_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot3, spacecraft_pos + LaserHead2_pos), + "LaserHead_phys_o", LaserHead_log_o, wld_phys, false, 1); + LaserHead_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot4, spacecraft_pos + LaserHead3_pos), + "LaserHead_phys_o", LaserHead_log_o, wld_phys, false, 2); + LaserHead_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot4, spacecraft_pos + LaserHead4_pos), + "LaserHead_phys_o", LaserHead_log_o, wld_phys, false, 3); + f = pow(1.-0.70/(2.70*100*100*50)*1E6, 1./3.); + G4Box* LaserHead_box_i = new G4Box("LaserHead_box_i", + f*0.5*100.*mm, f*0.5*100.*mm, f*0.5*50.*mm); + G4LogicalVolume* LaserHead_log_i = new G4LogicalVolume + (LaserHead_box_i, vacuum, "LaserHead_log_i"); + G4VPhysicalVolume* LaserHead_phys_i = new G4PVPlacement + (0, 0, "LaserHead_phys_i", LaserHead_log_i, LaserHead_phys_o, false, 0); + // + // + G4Box* StarTrack_U_box_o = new G4Box("StarStrack_box_o", + 0.5*50.*mm, 0.5*50.*mm, 0.5*54.*mm); + G4LogicalVolume* StarTrack_U_log_o = new G4LogicalVolume + (StarTrack_U_box_o, Al6061, "StarTrack_log_o"); + G4VPhysicalVolume* StarTrack_U_phys_o; + StarTrack_U_phys_o = new G4PVPlacement(0, spacecraft_pos + StarTrack1_pos, + "STarTrack_phys_o", StarTrack_U_log_o, wld_phys, false, 0); + StarTrack_U_phys_o = new G4PVPlacement(0, spacecraft_pos + StarTrack2_pos, + "STarTrack_phys_o", StarTrack_U_log_o, wld_phys, false, 1); + f = pow(1.-0.30/(2.70*50*50*54)*1E6, 1./3.); + G4Box* StarTrack_U_box_i = new G4Box("StarTrack_U_box_i", + f*0.5*50.*mm, f*0.5*50.*mm, f*0.5*54.*mm); + G4LogicalVolume* StarTrack_U_log_i = new G4LogicalVolume + (StarTrack_U_box_i, vacuum, "StarTrack_U_log_i"); + G4VPhysicalVolume* StarTrack_U_phys_i = new G4PVPlacement(0, 0, + "StarTrack_U_phys_i", StarTrack_U_log_i, StarTrack_U_phys_o, false, 0); + // + // + G4Box* Transpond2_box_o = new G4Box("Transpond2_box_o", + 0.5*220.*mm, 0.5*184.*mm, 0.5*178.*mm); + G4LogicalVolume* Transpond2_log_o = new G4LogicalVolume + (Transpond2_box_o, Al6061, "Transpond2_log_o"); + G4VPhysicalVolume* Transpond2_phys_o = new G4PVPlacement(G4Transform3D + (EB_rot2, spacecraft_pos + Transpond2_pos), + "Transpond2_phys_o", Transpond2_log_o, wld_phys, false, 0); + f = pow(1.-3.50/(2.70*220*184*178)*1E6, 1./3.); + G4Box* Transpond2_box_i = new G4Box("Transpond2_box_i", + f*0.5*220.*mm, f*0.5*184.*mm, f*0.5*178.*mm); + G4LogicalVolume* Transpond2_log_i = new G4LogicalVolume + (Transpond2_box_i, vacuum, "Transpond2_log_i"); + G4VPhysicalVolume* Transpond2_phys_i = new G4PVPlacement(0, 0, + "Transpond2_phys_i", Transpond2_log_i, Transpond2_phys_o, false, 0); + + + // vis Attributes + + EPC_log_o->SetVisAttributes(sol_blue_vat); + GyroPack_log_o->SetVisAttributes(sol_blue_vat); + InstConE_log_o->SetVisAttributes(sol_blue_vat); + RFDU_log_o->SetVisAttributes(sol_blue_vat); + StarTrack_L_log_o->SetVisAttributes(sol_blue_vat); + STElec_log_o->SetVisAttributes(sol_blue_vat); + TWT_log_o->SetVisAttributes(sol_blue_vat); + UVBox_log_o->SetVisAttributes(sol_blue_vat); + + PCDU_log_o->SetVisAttributes(sol_lblue_vat); + CentELCPS_log_o->SetVisAttributes(sol_lblue_vat); + CentEL2_log_o->SetVisAttributes(sol_lblue_vat); + FEEPEL_log_o->SetVisAttributes(sol_lblue_vat); + HGADrive_log_o->SetVisAttributes(sol_lblue_vat); + InterfelEL_log_o->SetVisAttributes(sol_lblue_vat); + LaserEL_log_o->SetVisAttributes(sol_lblue_vat); + LaserHead_log_o->SetVisAttributes(sol_lblue_vat); + StarTrack_U_log_o->SetVisAttributes(sol_lblue_vat); + Transpond2_log_o->SetVisAttributes(sol_lblue_vat); + + + + // ************************************************************************** + + diff --git a/examples/advanced/cosmicray_charging/src/LISAEventAction.cc b/examples/advanced/cosmicray_charging/src/LISAEventAction.cc new file mode 100644 index 0000000000..4504b82a7c --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAEventAction.cc @@ -0,0 +1,211 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAEventAction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISAEventAction.hh" + +#include "LISAPrimaryGeneratorAction.hh" +#include "LISASteppingAction.hh" + +#ifdef G4ANALYSIS_USE +#include "LISAAnalysisManager.hh" +#endif + +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4ParticleDefinition.hh" +#include "G4VVisManager.hh" +#include "G4UImanager.hh" +#include "G4Polyline.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" + +#include +#include + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISAEventAction::LISAEventAction(LISAPrimaryGeneratorAction* generatorAction, + LISASteppingAction* steppingAction) + : genAction(generatorAction),stepAction(steppingAction) { + + energy_pri = 0; + charge_in[0] = 0; + charge_in[1] = 0; + charge_out[0] = 0; + charge_out[1] = 0; + charge_tot[0] = 0; + charge_tot[1] = 0; + seeds = NULL; + filename = G4String(); + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISAEventAction::~LISAEventAction() {;} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAEventAction::BeginOfEventAction(const G4Event* evt) { + + // reset event charges + stepAction->Discharge(); + + // grab event seeds + seeds = genAction->GetEventSeeds(); + // G4cout << " 1st seed: " << *seeds << G4endl;; + // G4cout << " 2nd seed: " << *(seeds+1) << G4endl; + // HepRandom::showEngineStatus(); + + // grab energy of primary + energy_pri = genAction->GetEnergyPrimary(); + + event_id = evt->GetEventID(); + if(event_id%1000==0 || (event_id%100==0 && event_id<1000)) + G4cout << "\n---> Begin of event: " << event_id << G4endl; + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISAEventAction::EndOfEventAction(const G4Event* evt) { + + + // Look at TM0 and TM1 + for(int tm=0; tm<=1; ++tm) { + + charge_in[tm] = stepAction->GetChargeIn(tm); + charge_out[tm] = stepAction->GetChargeOut(tm); + charge_tot[tm] = charge_in[tm] - charge_out[tm]; + + // save if changed + if(charge_tot[tm]) { + + // printout + G4cout << " *** Evt: " << event_id + << "\tTM: " << tm + << "\tE: " << energy_pri + << "\tQnet: " << charge_tot[tm] + << "\tQin: " << charge_in[tm] + << "\tQout: " << charge_out[tm] + << G4endl; + + // append to file + std::ofstream chargefile(filename,std::ios::app); + chargefile << event_id << "\t" + << tm << "\t" + << energy_pri << "\t" + << charge_tot[tm] << "\t" + << charge_in[tm] << "\t" + << charge_out[tm] << "\t" + << *seeds << "\t" + << *(seeds+1) << "\t" + << G4endl; + + // Write event information to HBOOK NTuple if using analysis +#ifdef G4ANALYSIS_USE + LISAAnalysisManager* analysis = LISAAnalysisManager::getInstance(); + analysis->analyseRun(event_id, + tm, + energy_pri, + charge_tot[tm], + charge_in[tm], + charge_out[tm], + *seeds, + *(seeds+1)); +#endif + + } // if(charge_tot[tm]) + + } // for(int tm=0; tm<=1; ++tm) + + + + // draw trajectories + // colours by particle type + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) { + + G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) + n_trajectories = trajectoryContainer->entries(); + + for (G4int i=0; i((*trajectoryContainer)[i]); + + G4String name = trj->GetParticleDefinition()->GetParticleName(); + G4Colour colour = G4Colour(1.0, 1.0, 1.0); + G4Polyline pPolyline; + + if (trj) { + + for (int i=0; iGetPointEntries(); i++) + pPolyline.push_back( trj->GetPoint(i)->GetPosition() ); + + if(name=="proton") colour=G4Colour(0.0, 0.0, 1.0); + else if(name=="alpha") colour=G4Colour(0.0, 0.0, 0.5); + else if(name=="He3") colour=G4Colour(1.0, 0.0, 1.0); + else if(name=="pi+") colour=G4Colour(0.5, 0.5, 0.5); + else if(name=="pi-") colour=G4Colour(0.5, 0.5, 0.5); + else if(name=="e+") colour=G4Colour(0.0, 1.0, 1.0); + else if(name=="e-") colour=G4Colour(1.0, 0.0, 0.0); + else if(name=="gamma") colour=G4Colour(0.0, 1.0, 0.0); + else if(name=="neutron") colour=G4Colour(1.0, 1.0, 0.0); + else colour=G4Colour(1.0, 1.0, 1.0); + + G4VisAttributes attribs(colour); + pPolyline.SetVisAttributes(attribs); + if(pVVisManager) pVVisManager->Draw(pPolyline); + + } else + G4cerr << "EndOfEventAction: Failed to dynamic cast to G4Trajectory!" + << G4endl; + } + } + + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISAInertialSensor.icc b/examples/advanced/cosmicray_charging/src/LISAInertialSensor.icc new file mode 100644 index 0000000000..83a7e8041c --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAInertialSensor.icc @@ -0,0 +1,247 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +// ************************************************************************** +// Inertial Sensors: YZ-Injection, 46 mm Test Mass +// LISA Inertial Sensor Design Report LTP-RT-CGS-001, issue 2 +//*************************************************************************** + + + // Molybdenum cage (electrode housing) + G4double cage_o = 75.0*mm; + G4double cage_i_x = 53.8*mm; + G4double cage_i_y = 51.6*mm; + G4double cage_i_z = 52.8*mm; + + // Molybdenum disks (top and bottom) + G4double disk_thi = 3.0*mm; + G4double disk_id = 12.0*mm; + G4double disk_od = 60.0*mm; + G4double disk_off = 0.5*cage_o+0.5*disk_thi; + + // SHAPAL electrode supports + G4double elecsupp_x_thi = 6.5*mm; + G4double elecsupp_y_thi = 7.6*mm; + G4double elecsupp_yi_thi = 6.5*mm; + G4double elecsupp_z_thi = 7.0*mm; + G4double elecsupp_zi_thi = 6.5*mm; + + + // gold plating thickness + G4double elec_thi = 0.300*micrometer; + + // electrodes (x faces) + G4double elec_x_xoff = 0.5*cage_i_x + 0.5*elecsupp_x_thi + elec_thi; + G4double elec_x_y = 14.5*mm, elec_x_z = 36.0*mm; + G4double elec_x_yoff = 10.*mm; + // electrodes (y faces) + G4double elec_y_yoff = 0.5*cage_i_y + 0.5*elecsupp_y_thi + elec_thi; + G4double elec_y_x = 38.2*mm, elec_y_z = 7.1*mm; + G4double elec_y_zoff = 15.*mm; + // electrodes (y injection) + G4double elec_yi_yoff = 0.5*cage_i_y + 0.5*elecsupp_yi_thi + elec_thi; + G4double elec_yi_x = 38.2*mm, elec_yi_z = 16.0*mm; + // electrodes (z faces) + G4double elec_z_zoff = 0.5*cage_i_z + 0.5*elecsupp_z_thi + elec_thi; + G4double elec_z_x = 6.5*mm, elec_z_y = 37.0*mm; + // electrodes (z injection) + G4double elec_zi_x = 16.0*mm; + G4double elec_zi_y = 12.0*mm; + G4double elec_zi_zoff = 0.5*cage_i_z + 0.5*elecsupp_zi_thi + elec_thi; + G4double elec_zi_yoff = 12.*mm; + + // Test Mass + G4double tmass_len = 46.0*mm; + + + + + // Molybdenum cage ********************************************************** + G4Box* cage_o_sol = new G4Box("cage_o_sol", .5*cage_o, .5*cage_o, .5*cage_o); + G4LogicalVolume* cage_o_log = + new G4LogicalVolume(cage_o_sol, molybdenum, "cage_o_log"); + G4VPhysicalVolume* cage_o_phys = new G4PVPlacement(0, G4ThreeVector(), + "cage_o_phys", cage_o_log, SensorHousing_i_phys, false, 0); + cage_o_log->SetVisAttributes(lgreen_vat); +// cage_o_log->SetVisAttributes(G4VisAttributes::Invisible); + + // 0.3 um gold plating + G4Box* goldplating_sol = new G4Box("goldplating_sol", + 0.5*cage_i_x+elec_thi, 0.5*cage_i_y+elec_thi, 0.5*cage_i_z+elec_thi); + G4LogicalVolume* goldplating_log = + new G4LogicalVolume(goldplating_sol, gold, "goldplating_log"); + G4VPhysicalVolume* goldplating_phys = new G4PVPlacement(0, G4ThreeVector(), + "goldplating_phys", goldplating_log, cage_o_phys, false, 0); + goldplating_log->SetVisAttributes(yellow_vat); + + // Inside cage + G4Box* cage_i_sol = + new G4Box("cage_i_sol", .5*cage_i_x, .5*cage_i_y, .5*cage_i_z); + G4LogicalVolume* cage_i_log = + new G4LogicalVolume(cage_i_sol, vacuum, "cage_i_log"); + G4VPhysicalVolume* cage_i_phys = new G4PVPlacement(0, G4ThreeVector(), + "cage_i_phys", cage_i_log, goldplating_phys, false, 0); + cage_i_log->SetVisAttributes(white_vat); + + + // Molybdenum disks ********************************************************* + G4Tubs* disk_sol = new G4Tubs("disk_sol", 0.5*disk_id, 0.5*disk_od, + 0.5*disk_thi, 0., 360.*deg); + G4LogicalVolume* disk_log = + new G4LogicalVolume(disk_sol, molybdenum, "disk_log"); + G4VPhysicalVolume* disk_phys; + disk_phys = new G4PVPlacement(0, G4ThreeVector(0,0,+disk_off), + "disk_phys", disk_log, SensorHousing_i_phys, false, 0); + disk_phys = new G4PVPlacement(0, G4ThreeVector(0,0,-disk_off), + "disk_phys", disk_log, SensorHousing_i_phys, false, 1); + disk_log->SetVisAttributes(lgreen_vat); +// disk_log->SetVisAttributes(G4VisAttributes::Invisible); + + + + // electrodes (x faces) ***************************************************** + G4Box* elecsupp_x_sol = + new G4Box("elecsupp_x_sol", 0.5*elecsupp_x_thi,0.5*elec_x_y,0.5*elec_x_z); + G4LogicalVolume* elecsupp_x_log = + new G4LogicalVolume(elecsupp_x_sol, SHAPAL, "elecsupp_x_log"); + G4VPhysicalVolume* elecsupp_x_phys; + elecsupp_x_phys = new G4PVPlacement(0, + G4ThreeVector(+elec_x_xoff,-elec_x_yoff,0), + "elecsupp_x_phys", elecsupp_x_log, cage_o_phys, false, 0); + elecsupp_x_phys = new G4PVPlacement(0, + G4ThreeVector(+elec_x_xoff,+elec_x_yoff,0), + "elecsupp_x_phys", elecsupp_x_log, cage_o_phys, false, 1); + elecsupp_x_phys = new G4PVPlacement(0, + G4ThreeVector(-elec_x_xoff,-elec_x_yoff,0), + "elecsupp_x_phys", elecsupp_x_log, cage_o_phys, false, 2); + elecsupp_x_phys = new G4PVPlacement(0, + G4ThreeVector(-elec_x_xoff,+elec_x_yoff,0), + "elecsupp_x_phys", elecsupp_x_log, cage_o_phys, false, 3); + + + // electrodes (y faces) ***************************************************** + G4Box* elecsupp_y_sol = + new G4Box("elecsupp_y_sol", 0.5*elec_y_x,0.5*elecsupp_y_thi,0.5*elec_y_z); + G4LogicalVolume* elecsupp_y_log = + new G4LogicalVolume(elecsupp_y_sol, SHAPAL, "elecsupp_y_log"); + G4VPhysicalVolume* elecsupp_y_phys; + elecsupp_y_phys = new G4PVPlacement(0, + G4ThreeVector(0,+elec_y_yoff,-elec_y_zoff), + "elecsupp_y_phys", elecsupp_y_log, cage_o_phys, false, 0); + elecsupp_y_phys = new G4PVPlacement(0, + G4ThreeVector(0,+elec_y_yoff,+elec_y_zoff), + "elecsupp_y_phys", elecsupp_y_log, cage_o_phys, false, 1); + elecsupp_y_phys = new G4PVPlacement(0, + G4ThreeVector(0,-elec_y_yoff,-elec_y_zoff), + "elecsupp_y_phys", elecsupp_y_log, cage_o_phys, false, 2); + elecsupp_y_phys = new G4PVPlacement(0, + G4ThreeVector(0,-elec_y_yoff,+elec_y_zoff), + "elecsupp_y_phys", elecsupp_y_log, cage_o_phys, false, 3); + + // y injection + G4Box* elecsupp_yi_sol = + new G4Box("elecsupp_yi_sol",.5*elec_yi_x,.5*elecsupp_yi_thi,.5*elec_yi_z); + G4LogicalVolume* elecsupp_yi_log = + new G4LogicalVolume(elecsupp_yi_sol, SHAPAL, "elecsupp_yi_log"); + G4VPhysicalVolume* elecsupp_yi_phys; + elecsupp_yi_phys = new G4PVPlacement(0, G4ThreeVector(0,+elec_yi_yoff,0), + "elecsupp_yi_phys", elecsupp_yi_log, cage_o_phys, false, 0); + elecsupp_yi_phys = new G4PVPlacement(0, G4ThreeVector(0,-elec_yi_yoff,0), + "elecsupp_yi_phys", elecsupp_yi_log, cage_o_phys, false, 1); + + + // electrodes (z faces) ***************************************************** + G4Box* elecsupp_z_sol = + new G4Box("elecsupp_z_sol",.5*elec_z_x,.5*elec_z_y,.5*elecsupp_z_thi); + G4LogicalVolume* elecsupp_z_log = + new G4LogicalVolume(elecsupp_z_sol, SHAPAL, "elecsupp_z_log"); + G4VPhysicalVolume* elecsupp_z_phys; + elecsupp_z_phys = new G4PVPlacement(0, + G4ThreeVector(-elec_y_zoff,0,+elec_z_zoff), + "elecsupp_y_phys", elecsupp_z_log, cage_o_phys, false, 0); + elecsupp_z_phys = new G4PVPlacement(0, + G4ThreeVector(+elec_y_zoff,0,+elec_z_zoff), + "elecsupp_y_phys", elecsupp_z_log, cage_o_phys, false, 1); + elecsupp_z_phys = new G4PVPlacement(0, + G4ThreeVector(-elec_y_zoff,0,-elec_z_zoff), + "elecsupp_y_phys", elecsupp_z_log, cage_o_phys, false, 2); + elecsupp_z_phys = new G4PVPlacement(0, + G4ThreeVector(+elec_y_zoff,0,-elec_z_zoff), + "elecsupp_y_phys", elecsupp_z_log, cage_o_phys, false, 3); + + // z injection + G4Box* elecsupp_zi_sol = + new G4Box("elecsupp_zi_sol",.5*elec_zi_x,.5*elec_zi_y,.5*elecsupp_zi_thi); + G4LogicalVolume* elecsupp_zi_log = + new G4LogicalVolume(elecsupp_zi_sol, SHAPAL, "elecsupp_zi_log"); + G4VPhysicalVolume* elecsupp_zi_phys; + elecsupp_zi_phys=new G4PVPlacement(0, + G4ThreeVector(0,-elec_zi_yoff,+elec_zi_zoff), + "elecsupp_zi_phys", elecsupp_zi_log, cage_o_phys, false, 0); + elecsupp_zi_phys=new G4PVPlacement(0, + G4ThreeVector(0,+elec_zi_yoff,+elec_zi_zoff), + "elecsupp_zi_phys", elecsupp_zi_log, cage_o_phys, false, 1); + elecsupp_zi_phys=new G4PVPlacement(0, + G4ThreeVector(0,-elec_zi_yoff,-elec_zi_zoff), + "elecsupp_zi_phys", elecsupp_zi_log, cage_o_phys, false, 2); + elecsupp_zi_phys=new G4PVPlacement(0, + G4ThreeVector(0,+elec_zi_yoff,-elec_zi_zoff), + "elecsupp_zi_phys", elecsupp_zi_log, cage_o_phys, false, 3); + + // electrode vis attributes + elecsupp_x_log ->SetVisAttributes(sol_white_vat); + elecsupp_y_log ->SetVisAttributes(sol_white_vat); + elecsupp_z_log ->SetVisAttributes(sol_white_vat); + elecsupp_yi_log->SetVisAttributes(sol_orange_vat); + elecsupp_zi_log->SetVisAttributes(sol_orange_vat); + + + // Test Masses ************************************************************** + G4Box* tmass_sol = + new G4Box("tmass_sol", 0.5*tmass_len, 0.5*tmass_len, 0.5*tmass_len); + G4LogicalVolume* tmass_log = + new G4LogicalVolume(tmass_sol, AuPt, "tmass_log"); + G4VPhysicalVolume* tmass_phys = new G4PVPlacement + (0, G4ThreeVector(), "tmass_phys", tmass_log, cage_i_phys, false, 0); + tmass_log->SetVisAttributes(sol_gold_vat); + + + +//***************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISAInterferometerAssembly.icc b/examples/advanced/cosmicray_charging/src/LISAInterferometerAssembly.icc new file mode 100644 index 0000000000..583c7fed3e --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAInterferometerAssembly.icc @@ -0,0 +1,643 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +//*************************************************************************** +// Interferometer Assembly +//*************************************************************************** +// Payload Shield (Y Tube) +// Telescope Light Shields +// Telescope Electronics Mounting +// Telescope Mirrors Mounting +// Telescope Actuator Mechanism +// Optical Bench Mounting +// Optical Bench +//*************************************************************************** + + + + //*************************************************************************** + // Payload Shield + //*************************************************************************** + + // Y-tube + G4double YTube_dia = 400.*mm; + G4double YTube_thi = 5.*mm; + G4double arm1_len = 900.*mm; + G4double arm2_len = 900.*mm; + G4double arm3_len = 900.*mm; + // G4double YTube_xoff = -800.*mm; + G4double tune_x = 800.*mm; + G4double tune_y = 250.*mm; + + // outer volumes + G4Tubs* arm1_o_sol = + new G4Tubs("arm1_o_sol", 0., 0.5*YTube_dia, 0.5*arm1_len, 0., 360.*deg); + G4Tubs* arm2_o_sol = + new G4Tubs("arm2_o_sol", 0., 0.5*YTube_dia, 0.5*arm2_len, 0., 360.*deg); + G4Tubs* arm3_o_sol = + new G4Tubs("arm3_o_sol", 0., 0.5*YTube_dia, 0.5*arm3_len, 0., 360.*deg); + G4RotationMatrix ytube_rot1; ytube_rot1.rotateY(30.*deg); + G4UnionSolid* uni1_o_sol = new G4UnionSolid("uni1_o_sol", arm1_o_sol, + arm2_o_sol, G4Transform3D(ytube_rot1, G4ThreeVector(+tune_y,0,tune_x))); + G4RotationMatrix ytube_rot2; ytube_rot2.rotateY(-30.*deg); + G4UnionSolid* uni2_o_sol = new G4UnionSolid("uni2_o_sol", uni1_o_sol, + arm3_o_sol, G4Transform3D(ytube_rot2, G4ThreeVector(-tune_y,0,tune_x))); + G4LogicalVolume* arms_o_log = + new G4LogicalVolume(uni2_o_sol, CFRP, "arms_o_log"); + G4RotationMatrix ytube_rot3; + ytube_rot3.rotateX(90.*deg); ytube_rot3.rotateZ(90.*deg); + G4VPhysicalVolume* arms_o_phys = new G4PVPlacement + (G4Transform3D(ytube_rot3, spacecraft_pos + G4ThreeVector(YTube_xoff,0,0)), + "arms_o_phys", arms_o_log, wld_phys, false, 0); + arms_o_log->SetVisAttributes(yellow_vat); + // inner volumes + G4Tubs* arm1_i_sol = new G4Tubs("arm1_i_sol", 0., 0.5*YTube_dia-YTube_thi, + 0.5*arm1_len, 0.*deg, 360.*deg); + G4Tubs* arm2_i_sol = new G4Tubs("arm2_i_sol", 0., 0.5*YTube_dia-YTube_thi, + 0.5*arm2_len, 0.*deg, 360.*deg); + G4Tubs* arm3_i_sol = new G4Tubs("arm3_i_sol", 0., 0.5*YTube_dia-YTube_thi, + 0.5*arm3_len, 0.*deg, 360.*deg); + G4UnionSolid* uni1_i_sol = new G4UnionSolid("uni1_i_sol", arm1_i_sol, + arm2_i_sol, G4Transform3D(ytube_rot1, G4ThreeVector(+tune_y,0,tune_x))); + G4UnionSolid* uni2_i_sol = new G4UnionSolid("uni2_i_sol", uni1_i_sol, + arm3_i_sol, G4Transform3D(ytube_rot2, G4ThreeVector(-tune_y,0,tune_x))); + G4LogicalVolume* arms_i_log = + new G4LogicalVolume(uni2_i_sol, vacuum, "arms_i_log"); + G4VPhysicalVolume* arms_i_phys = new G4PVPlacement(0, G4ThreeVector(0,0,0), + "arms_i_phys", arms_i_log, arms_o_phys, false, 0); + arms_i_log->SetVisAttributes(yellow_vat); + + + + // Telescope Light Shields: ~5.5 kg + G4double TelShield_len = 730.*mm; + G4double TelShield_dia = 370.*mm; + G4double TelShield_thi = 5.*mm; + G4double TelShield_yoff = 663.*mm; + G4double TelShield_xoff = 1511.*mm; + G4double TelShieldCutout_len = 2000.*mm; + G4double TelShieldCutout_off = 1000.*mm; + + G4Tubs* TelShield_tub = new G4Tubs("TelShield_sol", 0.5*TelShield_dia - + TelShield_thi, 0.5*TelShield_dia, 0.5*TelShield_len, 0., 360.*deg); + G4Box* TelShieldCutout_box = new G4Box("TelShieldCutout_box", + 0.5*TelShieldCutout_len, 0.5*TelShieldCutout_len, 0.5*TelShieldCutout_len); + G4RotationMatrix ytube_rot4; ytube_rot4.rotateX(-30.*deg); + G4SubtractionSolid* TelShield_sol = new G4SubtractionSolid("TelShield_sol", + TelShield_tub, TelShieldCutout_box, G4Transform3D(ytube_rot4, + G4ThreeVector(0,0,-0.5*TelShield_len-TelShieldCutout_off))); + G4LogicalVolume* TelShield_log = + new G4LogicalVolume(TelShield_sol, CFRP, "TelShield_log"); + G4VPhysicalVolume* TelShield_phys; + G4RotationMatrix telsh_rot1; telsh_rot1.rotateY(-90.*deg); + telsh_rot1.rotateX(90.*deg); telsh_rot1.rotateZ(-30.*deg); + TelShield_phys = new G4PVPlacement(G4Transform3D(telsh_rot1, + spacecraft_pos+G4ThreeVector(YTube_xoff+TelShield_xoff,-TelShield_yoff,0)), + "TelShield_phys", TelShield_log, wld_phys, false, 0); + G4RotationMatrix telsh_rot2; telsh_rot2.rotateY(-90.*deg); + telsh_rot2.rotateX(90.*deg); telsh_rot2.rotateZ(+30.*deg); + TelShield_phys = new G4PVPlacement(G4Transform3D(telsh_rot2, + spacecraft_pos+G4ThreeVector(YTube_xoff+TelShield_xoff,+TelShield_yoff,0)), + "TelShield_phys", TelShield_log, wld_phys, false, 1); + TelShield_log->SetVisAttributes(green_vat); + + + + // Telescope actuator: 1.8 kg + // includes mass of Al arms + G4double TelActuatorCyl_dia = 76.*mm; + G4double TelActuatorCyl_len = 147.*mm; + // Actuator mount: 0.45 kg + G4double TelActuatorMount_hei = 147.*mm; + G4double TelActuatorMount_wid = 120.*mm; + G4double TelActuatorMount_thi = 7.5*mm; + G4ThreeVector TelActuator_pos1(-100.*mm,0.,550.*mm); + G4ThreeVector TelActuator_pos2( 100.*mm,0.,550.*mm); + + // Telescope actuator 1: cylinder + G4Tubs* TelActuatorCyl_sol = new G4Tubs("TelActuatorCyl_sol", + 0, 0.5*TelActuatorCyl_dia, 0.5*TelActuatorCyl_len, 0., 360.*deg); + G4LogicalVolume* TelActuatorCyl_log = + new G4LogicalVolume(TelActuatorCyl_sol, Al6061, "TelActuatorCyl_log"); + G4RotationMatrix act_rot1; act_rot1.rotateY(60.*deg); + G4VPhysicalVolume* TelActuatorCyl_phys; + TelActuatorCyl_phys = new G4PVPlacement(G4Transform3D(act_rot1, + TelActuator_pos1), "TelActuatorCyl_phys", TelActuatorCyl_log, + arms_i_phys, false, 0); + TelActuatorCyl_log->SetVisAttributes(sol_red_vat); + // Telescope actuator 1: mount + G4Box* TelActuatorMount_box = new G4Box("TelActuatorMount_box", + .5*TelActuatorMount_wid, .5*TelActuatorMount_hei, .5*TelActuatorMount_thi); + G4SubtractionSolid* TelActuatorMount_sol = new G4SubtractionSolid + ("TelActuatorMount_sol", TelActuatorMount_box, TelActuatorCyl_sol, + 0, G4ThreeVector(0,0.5*TelActuatorMount_hei,0)); + G4LogicalVolume* TelActuatorMount_log = + new G4LogicalVolume(TelActuatorMount_sol, TiAlloy, "TelActuatorMount_log"); + G4VPhysicalVolume* TelActuatorMount_phys; + TelActuatorMount_phys = new G4PVPlacement(G4Transform3D(act_rot1, + TelActuator_pos1 + G4ThreeVector(0,-0.5*TelActuatorMount_hei-2.*mm,0.)), + "TelActuatorMount_phys", TelActuatorMount_log, arms_i_phys, false, 0); + TelActuatorMount_log->SetVisAttributes(sol_yellow_vat); + // Telescope actuator 2 + G4RotationMatrix act_rot2; act_rot2.rotateY(-60.*deg); + TelActuatorCyl_phys = new G4PVPlacement(G4Transform3D + (act_rot2, TelActuator_pos2), "TelActuatorCyl_phys", + TelActuatorCyl_log, arms_i_phys, false, 1); + TelActuatorMount_phys = new G4PVPlacement(G4Transform3D(act_rot2, + TelActuator_pos2 + G4ThreeVector(0,-0.5*TelActuatorMount_hei-2.*mm,0.)), + "TelActuatorMount_phys", TelActuatorMount_log, arms_i_phys, false, 1); + + + + + //*************************************************************************** + // Telescope / GRS Assembly (in dummy wrapper volume) + //*************************************************************************** + + + // Dummy (assembly) box for telescope + G4double TelBox_len = 620.*mm; + G4double TelBox_dia = 370.*mm; + // Dummy (assembly) box for telescope + G4Tubs* TelBox_sol = + new G4Tubs("TelBox_sol", 0., 0.5*TelBox_dia, 0.5*TelBox_len, 0., 360.*deg); + G4LogicalVolume* TelBox_log = + new G4LogicalVolume(TelBox_sol, vacuum, "TelBox_log"); + G4VPhysicalVolume* TelBox_phys; + TelBox_phys = + new G4PVPlacement(G4Transform3D(tel_rot1, tel_pos1), + "TelBox1_phys", TelBox_log, arms_i_phys, false, 0); + TelBox_phys = + new G4PVPlacement(G4Transform3D(tel_rot2, tel_pos2), + "TelBox2_phys", TelBox_log, arms_i_phys, false, 1); + // TelBox_log->SetVisAttributes(white_vat); + TelBox_log->SetVisAttributes(G4VisAttributes::Invisible); + + + // all z-offsets referred to TM centre + // change OpticalBench_off to move telescope components along z-axis + + // Optical Bench: 4.41 kg + G4double OpticalBench_len = 350.0*mm; + G4double OpticalBench_wid = 200.0*mm; + G4double OpticalBench_thi = 40.0*mm; + // Sensor Housing as in Solid Model + // G4double OpticalBenchCutout_len = 170.0*mm + 1.*mm; + // G4double OpticalBenchCutout_wid = 120.0*mm + 1.*mm; + // Sensor Housing to fit LTP Sensor + G4double OpticalBenchCutout_dia = 126.0*mm; + G4double OpticalBenchCutout_thi = 100.0*mm; + // G4double OpticalBench_off = 0.0*mm; + + // Optical Bench + G4Box* OpticalBench_box = new G4Box("OpticalBench_box", + 0.5*OpticalBench_wid, 0.5*OpticalBench_thi, 0.5*OpticalBench_len); + // old design cutout + // G4Box* OpticalBenchCutout_box = new G4Box("OpticalBenchCutout_box", + // 0.5*OpticalBenchCutout_wid, 0.5*OpticalBenchCutout_thi, + // 0.5*OpticalBenchCutout_len); + // LTP design cutout + G4Tubs* OpticalBenchCutout_box = new G4Tubs("OpticalBenchCutout_box", + 0., 0.5*OpticalBenchCutout_dia, 0.5*OpticalBenchCutout_thi, 0., 360.*deg); + G4RotationMatrix cutout_rot; cutout_rot.rotateX(90.*deg); + G4SubtractionSolid* OpticalBench_sol = new G4SubtractionSolid + ("OpticalBench_sol", OpticalBench_box, OpticalBenchCutout_box, + G4Transform3D(cutout_rot, G4ThreeVector())); + G4LogicalVolume* OpticalBench_log = + new G4LogicalVolume(OpticalBench_sol, ULEglass, "OpticalBench_log"); + G4VPhysicalVolume* OpticalBench_phys= + new G4PVPlacement(0, G4ThreeVector(0,0, OpticalBench_off), + "OpticalBench_phys", OpticalBench_log, TelBox_phys, false, 0); + OpticalBench_log->SetVisAttributes(sol_white_vat); + + + // Support ring: 0.99 kg + G4double SupportRing_od = 359.*mm; + G4double SupportRing_dia_o = 23.*mm; + G4double SupportRing_dia_i = 10.*mm; + // Support yokes: 0.12 kg + // also accounts for pivot mass + G4double SupportYoke_thi = 5.*mm; + G4double SupportYoke_dia = 15.*mm; + G4double SupportYoke_len = 170.*mm; + G4double SupportYoke_xoff = 122.*mm; + G4double SupportYoke_yoff = 50.*mm; + G4double SupportYoke_zoff = 90.*mm; + + // Support ring + G4Torus* SupportRing_sol = new G4Torus("SupportRing_sol", + 0.5*SupportRing_dia_i,0.5*SupportRing_dia_o, + 0.5*(SupportRing_od-SupportRing_dia_o), 0.,360.*deg); + G4LogicalVolume* SupportRing_log = + new G4LogicalVolume(SupportRing_sol, ULEglass, "SupportRing_log"); + G4VPhysicalVolume* SupportRing_phys= + new G4PVPlacement(0, G4ThreeVector(0.,0.,OpticalBench_off), + "SupportRing_phys", SupportRing_log, TelBox_phys, false, 0); + SupportRing_log->SetVisAttributes(sol_red_vat); + // Support yokes + G4Tubs* SupportYoke_sol = new G4Tubs("SupportYoke_sol", 0.5*SupportYoke_dia + - SupportYoke_thi, 0.5*SupportYoke_dia, 0.5*SupportYoke_len, 0., 360.*deg); + G4LogicalVolume* SupportYoke_log = + new G4LogicalVolume(SupportYoke_sol, TiAlloy, "SupportYoke_log"); + SupportYoke_log->SetVisAttributes(sol_red_vat); + G4VPhysicalVolume* SupportYoke_phys; + // upper + G4RotationMatrix tel_rot3; + tel_rot3.rotateX(+30.*deg); tel_rot3.rotateY(-10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot3, + G4ThreeVector(+SupportYoke_xoff, +SupportYoke_yoff , + OpticalBench_off + SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 0); + G4RotationMatrix tel_rot4; + tel_rot4.rotateX(+30.*deg); tel_rot4.rotateY(+10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot4, + G4ThreeVector(-SupportYoke_xoff, +SupportYoke_yoff , + OpticalBench_off + SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 1); + G4RotationMatrix tel_rot5; + tel_rot5.rotateX(-30.*deg); tel_rot5.rotateY(+10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot5, + G4ThreeVector(+SupportYoke_xoff, +SupportYoke_yoff , + OpticalBench_off - SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 2); + G4RotationMatrix tel_rot6; + tel_rot6.rotateX(-30.*deg); tel_rot6.rotateY(-10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot6, + G4ThreeVector(-SupportYoke_xoff, +SupportYoke_yoff , + OpticalBench_off - SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 3); + // lower + G4RotationMatrix tel_rot7; + tel_rot7.rotateX(-30.*deg); tel_rot7.rotateY(-10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot7, + G4ThreeVector(+SupportYoke_xoff, -SupportYoke_yoff , + OpticalBench_off + SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 4); + G4RotationMatrix tel_rot8; + tel_rot8.rotateX(-30.*deg); tel_rot8.rotateY(+10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot8, + G4ThreeVector(-SupportYoke_xoff, -SupportYoke_yoff , + OpticalBench_off + SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 5); + G4RotationMatrix tel_rot9; + tel_rot9.rotateX(+30.*deg); tel_rot9.rotateY(+10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot9, + G4ThreeVector(+SupportYoke_xoff, -SupportYoke_yoff , + OpticalBench_off - SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 6); + G4RotationMatrix tel_rot10; + tel_rot10.rotateX(+30.*deg); tel_rot10.rotateY(-10.*deg); + SupportYoke_phys = new G4PVPlacement(G4Transform3D(tel_rot10, + G4ThreeVector(-SupportYoke_xoff, -SupportYoke_yoff , + OpticalBench_off - SupportYoke_zoff)), "SupportYoke_phys", + SupportYoke_log, TelBox_phys, false, 7); + + + + // Shield tube: 3.66 kg + G4double ShieldTube_len = 500.*mm; + G4double ShieldTube_thi = 4.*mm; + G4double ShieldTube_dia = 360.*mm + 2*ShieldTube_thi; + G4double ShieldTube_off = 60.*mm; + + // Shield tube + G4Tubs* ShieldTube_sol = new G4Tubs("ShieldTube_sol", + 0.5*ShieldTube_dia-ShieldTube_thi, 0.5*ShieldTube_dia, + 0.5*ShieldTube_len, 0., 360.*deg); + G4LogicalVolume* ShieldTube_log = + new G4LogicalVolume(ShieldTube_sol, CFRP, "ShieldTube_log"); + G4VPhysicalVolume* ShieldTube_phys = new G4PVPlacement(0, + G4ThreeVector(0,0,OpticalBench_off-ShieldTube_off), + "ShieldTube_phys", ShieldTube_log, TelBox_phys, false, 0); + ShieldTube_log->SetVisAttributes(G4VisAttributes::Invisible); + + + + // Mounting rings: 0.78 kg + G4double TelRing_dia = 360.0*mm; + G4double TelRing_thi = 15.0*mm; + G4double TelRing_len = 30.0*mm; + G4double TelRing_off1 = 0.5*OpticalBench_len - 0.5*TelRing_len + 0.5*mm; + G4double TelRing_off2 = 0.5*OpticalBench_len; + + // Mounting rings + G4Tubs* TelRing_sol = + new G4Tubs("TelRing_sol", 0.5*TelRing_dia-TelRing_thi, 0.5*TelRing_dia, + 0.5*TelRing_len, 0., 360.*deg); + G4LogicalVolume* TelRing_log = + new G4LogicalVolume(TelRing_sol, CFRP, "TelRing_log"); + TelRing_log->SetVisAttributes(sol_white_vat); + G4VPhysicalVolume* TelRing_phys; + TelRing_phys = new G4PVPlacement(0, G4ThreeVector + (0,0,OpticalBench_off - TelRing_off1), + "TelRing_phys", TelRing_log, TelBox_phys, false, 0); + // Electronics mounting ring + TelRing_phys = new G4PVPlacement(0, G4ThreeVector + (0,0,OpticalBench_off + TelRing_off2), + "TelRing_phys", TelRing_log, TelBox_phys, false, 1); + + + + // Shield/Mounting Plate: 1.54 kg + G4double ShieldPlate_dia = 350.*mm; + G4double ShieldPlate_thi = 10.*mm; + G4double ShieldPlate_off = TelRing_off2 + + 0.5*(TelRing_len+ShieldPlate_thi) + 20.0*mm; + // Shield/Mounting Plate + G4Tubs* ShieldPlate_sol = new G4Tubs("ShieldPlate_sol", + 0., 0.5*ShieldPlate_dia, 0.5*ShieldPlate_thi, 0., 360.*deg); + G4LogicalVolume* ShieldPlate_log = + new G4LogicalVolume(ShieldPlate_sol, CFRP, "ShieldPlate_log"); + G4VPhysicalVolume* ShieldPlate_phys = new G4PVPlacement(0, + G4ThreeVector(0,0,OpticalBench_off + ShieldPlate_off), + "ShieldPlate_phys", ShieldPlate_log, TelBox_phys, false, 0); + ShieldPlate_log->SetVisAttributes(sol_white_vat); + + + + // Telescope electronics boxes: 0.36 kg + G4double TelElecBox_wid = 100.0*mm; + G4double TelElecBox_len = 90.0*mm; + G4double TelElecBox_hei = 180.0*mm; + G4double TelElecBoxes_sep = 150.0*mm; + G4double TelElecBoxes_off = ShieldPlate_off + + 0.5*(ShieldPlate_thi + TelElecBox_len); + + // Telescope electronics boxes + G4Box* TelElecBox_sol = new G4Box("TelElecBox_sol", 0.5*TelElecBox_wid, + 0.5*TelElecBox_hei, 0.5*TelElecBox_len); + G4LogicalVolume* TelElecBox_log = + new G4LogicalVolume(TelElecBox_sol, Al6061, "TelElecBox_log"); + G4VPhysicalVolume* TelElecBox_phys; + // Interferometer electronics + TelElecBox_phys = new G4PVPlacement(0, + G4ThreeVector(-0.5*TelElecBoxes_sep, 0,OpticalBench_off+TelElecBoxes_off), + "TelElecBox_phys", TelElecBox_log, TelBox_phys, false, 0); + TelElecBox_log->SetVisAttributes(sol_red_vat); + // Accelerator electronics + TelElecBox_phys = new G4PVPlacement(0, + G4ThreeVector(0.5*TelElecBoxes_sep, 0, OpticalBench_off+TelElecBoxes_off), + "TelElecBox_phys", TelElecBox_log, TelBox_phys, false, 1); + // Each box is made from solid Al6061 from which a volume + // s times smaller is removed to match assigned mass; + G4double s = pow(1.-0.36/(2.70*TelElecBox_wid*TelElecBox_hei*TelElecBox_len) + *1E6,1./3.); + G4Box* TelElecBoxIn_sol = new G4Box("TelElecBoxIn_sol", s*0.5*TelElecBox_wid, + s*0.5*TelElecBox_hei, s*0.5*TelElecBox_len); + G4LogicalVolume* TelElecBoxIn_log = + new G4LogicalVolume(TelElecBoxIn_sol, vacuum, "TelElecBoxIn_log"); + G4VPhysicalVolume* TelElecBoxIn_phys = new G4PVPlacement + (0, 0, "TelElecBoxIn_i", TelElecBoxIn_log, TelElecBox_phys, false, 0); + + + + // Front thermal shield: 0.15 kg + G4double FrontThermalShield_dia = 350.*mm; + G4double FrontThermalShield_thi = 1.*mm; + G4double FrontThermalShield_hol = 25.*mm; + G4double FrontThermalShield_roff = 30.*mm; + G4double FrontThermalShield_off = TelRing_off1 + 0.5*TelRing_len + + 0.5*FrontThermalShield_thi + 20.0*mm; + + // Front thermal shield + G4Tubs* FrontThermalShield_tub = new G4Tubs("FrontThermalShield_tub", + 0., 0.5*FrontThermalShield_dia, 0.5*FrontThermalShield_thi, 0., 360.*deg); + G4Tubs* FrontThermalShieldCutout_tub = + new G4Tubs("FrontThermalShieldCutout_tub", + 0., 0.5*FrontThermalShield_hol, 2*FrontThermalShield_thi, 0., 360.*deg); + G4SubtractionSolid* FrontThermalShield_sol = + new G4SubtractionSolid("FrontThermalShield_sol", FrontThermalShield_tub, + FrontThermalShieldCutout_tub, G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0,FrontThermalShield_roff,0))); + G4LogicalVolume* FrontThermalShield_log = + new G4LogicalVolume(FrontThermalShield_sol, CFRP, + "FrontThermalShield_log"); + G4VPhysicalVolume* FrontThermalShield_phys = new G4PVPlacement + (0, G4ThreeVector(0, 0, OpticalBench_off-FrontThermalShield_off), + "FrontThermalShield_phys", FrontThermalShield_log, TelBox_phys, false, 0); + FrontThermalShield_log->SetVisAttributes(sol_white_vat); + + + + //*************************************************************************** + // Telescope assembly + //*************************************************************************** + + + // Primary mirror mount: ~1.9 kg + G4double TelPriMirMount_rad = 420.*mm; + G4double TelPriMirMount_yoff = 220.*mm; + G4double TelPriMirMount_thi = 13.*mm; + G4double TelPriMirMount_off = FrontThermalShield_off + + 0.5*TelPriMirMount_thi + 20.*mm; + G4double TelPriMirMountCutout0_dia = 350.*mm; + G4double TelPriMirMountCutout0_yoff = 220.*mm; + G4double TelPriMirMountCutout1_dia = 60.*mm; + G4double TelPriMirMountCutout1_yoff = 190.*mm; + G4double TelPriMirMountCutout2_dia = 46.*mm; + G4double TelPriMirMountCutout2_yoff = 367.*mm; + + // Primary mirror mount + // full thickness assumed; material density is decreased to conserve mass + G4Tubs* TelPriMirMount_tub = new G4Tubs("TelPriMirMount_tub", + 0, TelPriMirMount_rad, 0.5*TelPriMirMount_thi, -115.*deg, 50.*deg); + G4Tubs* TelPriMirMountCutout0_tub = new G4Tubs + ("TelPriMirMountCutout0_tub", 0.5*TelPriMirMountCutout0_dia, + 0.8*TelPriMirMountCutout0_dia, TelPriMirMount_thi, 0., 360.*deg); + G4SubtractionSolid* TelPriMirMount_sol0 = new G4SubtractionSolid + ("TelPriMirMount_sol1", TelPriMirMount_tub, TelPriMirMountCutout0_tub, + G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0,-TelPriMirMountCutout0_yoff,0))); + G4Tubs* TelPriMirMountCutout1_tub = new G4Tubs("TelPriMirMountCutout1_tub", + 0, 0.5*TelPriMirMountCutout1_dia, TelPriMirMount_thi, 0.*deg, 360.*deg); + G4SubtractionSolid* TelPriMirMount_sol1 = new G4SubtractionSolid + ("TelPriMirMount_sol1", TelPriMirMount_sol0, TelPriMirMountCutout1_tub, + G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0, -TelPriMirMountCutout1_yoff,0))); + G4Tubs* TelPriMirMountCutout2_tub = new G4Tubs("TelPriMirMountCutout2_tub", + 0, 0.5*TelPriMirMountCutout2_dia, TelPriMirMount_thi, 0.*deg, 360.*deg); + G4SubtractionSolid* TelPriMirMount_sol2 = new G4SubtractionSolid + ("TelPriMirMount_sol2", TelPriMirMount_sol1, TelPriMirMountCutout2_tub, + G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0, -TelPriMirMountCutout2_yoff,0))); + G4LogicalVolume* TelPriMirMount_log = + new G4LogicalVolume(TelPriMirMount_sol2, Al6061, "TelPriMirMount_log"); + G4VPhysicalVolume* TelPriMirMount_phys = new G4PVPlacement(0, + G4ThreeVector(0, TelPriMirMount_yoff, OpticalBench_off-TelPriMirMount_off), + "TelPriMirMount_phys", TelPriMirMount_log, TelBox_phys, false, 0); + TelPriMirMount_log->SetVisAttributes(sol_blue_vat); + + + // primary mirror: 2.03 kg + G4double TelPriMir_thi = 9.0*mm; + G4double TelPriMir_rad = 500.0*mm; + G4double TelPriMir_dia = 304.0*mm; + G4double TelPriMir_yoff = 30.0*mm; + G4double TelPriMirHol_dia = 35.0*mm; + G4double TelPriMirHol_thi = 5.0*mm; + G4double TelPriMirHol_len = 45.0*mm; + G4double TelPriMir_off = TelPriMirMount_off + + 0.5*TelPriMirMount_thi +2.*mm; + // primary mirror: cylinder + G4Tubs* TelPriMirCyl_sol = new G4Tubs("TelPriMirCyl_sol", + 0.5*TelPriMirHol_dia, 0.5*TelPriMirHol_dia+TelPriMirHol_thi, + 0.5*TelPriMirHol_len, 0., 360.*deg); + G4LogicalVolume* TelPriMirCyl_log = + new G4LogicalVolume(TelPriMirCyl_sol, SiC, "TelPriMirCyl_log"); + G4VPhysicalVolume* TelPriMirCyl_phys= new G4PVPlacement(0, G4ThreeVector + (0,TelPriMir_yoff,OpticalBench_off-TelPriMir_off+0.5*TelPriMirMount_thi), + "TelPriMirCyl_phys", TelPriMirCyl_log, TelBox_phys, false, 0); + TelPriMirCyl_log->SetVisAttributes(sol_green_vat); + // primary mirror: dish + G4Sphere* TelPriMir_sol = + new G4Sphere("TelPriMir_sol", TelPriMir_rad - TelPriMir_thi, + TelPriMir_rad, 0, 360.*deg, + atan(0.5*TelPriMirHol_dia/TelPriMir_rad), + atan(0.5*TelPriMir_dia/TelPriMir_rad) - + atan(0.5*TelPriMirHol_dia/TelPriMir_rad)); + G4LogicalVolume* TelPriMir_log = + new G4LogicalVolume(TelPriMir_sol, SiC, "TelPriMir_log"); + G4VPhysicalVolume* TelPriMir_phys= new G4PVPlacement(0, G4ThreeVector + (0,TelPriMir_yoff, OpticalBench_off-TelPriMir_off-TelPriMir_rad-17.*mm), + "TelPriMir_phys", TelPriMir_log, TelBox_phys, false, 0); + TelPriMir_log->SetVisAttributes(sol_green_vat); + + + + // *** NOTE *** + // Following items are NOT in TelBox_phys but in TelShield_phys + + G4ThreeVector offset(0,0,0.5*TelShield_len); + + // Telescope mast: 0.41 kg + G4double TelMast_thi = 2.0*mm; + G4double TelMast_dia = 44.0*mm; + G4double TelMast_len = 500.*mm; + G4double TelMast_off = 0.5*TelMast_len; + // Telescope mast + G4Tubs* TelMast_sol = + new G4Tubs("TelMast_sol", 0.5*TelMast_dia-TelMast_thi, 0.5*TelMast_dia, + 0.5*TelMast_len, 0., 360.*deg); + G4LogicalVolume* TelMast_log = + new G4LogicalVolume(TelMast_sol, SiC, "TelMast_log"); + G4VPhysicalVolume* TelMast_phys= new G4PVPlacement(0, offset+G4ThreeVector + (0,-0.5*TelPriMir_dia - 0.5*TelMast_dia + TelPriMir_yoff, -TelMast_off), + "TelMastTel_phys", TelMast_log, TelShield_phys, false, 0); + TelMast_log->SetVisAttributes(sol_grey_vat); + + + // secondary mirror: 0.27 kg + G4double TelSecMir_dia = 40.0*mm; + G4double TelSecMir_len = 70.0*mm; + G4double TelSecMir_off = TelMast_off + 0.5*TelMast_len + - 0.5*TelSecMir_len + 10.*mm; + // secondary mirror + G4Tubs* TelSecMir_sol = + new G4Tubs("TelSecMir_sol", 0., 0.5*TelSecMir_dia, + 0.5*TelSecMir_len, 0., 360.*deg); + G4LogicalVolume* TelSecMir_log = + new G4LogicalVolume(TelSecMir_sol, SiC, "TelSecMir_log"); + G4VPhysicalVolume* TelSecMir_phys= new G4PVPlacement + (0, offset+G4ThreeVector(0,TelPriMir_yoff, -TelSecMir_off), + "TelSecMir_phys", TelSecMir_log, TelShield_phys, false, 0); + TelSecMir_log->SetVisAttributes(sol_green_vat); + + + + // secondary mirror holder: 0.35 kg + G4double TelSecHol_top = 20.0*mm; + G4double TelSecHol_bot = 60.0*mm; + G4double TelSecHol_thi = 5.0*mm; + G4double TelSecHolCap1_thi = 5.0*mm; + G4double TelSecHolCap1_len = TelSecHol_bot; + G4double TelSecHolCap2_thi = 5.0*mm; + G4double TelSecHolCap2_len = TelSecHol_top; + G4double TelSecHol_len = 0.5*(TelPriMir_dia-TelSecMir_dia) + - TelSecHolCap1_thi - TelSecHolCap2_thi; + // secondary mirror holder + G4Trap* TelSecHol_sol = new G4Trap("TelSecHol_sol", + TelSecHol_thi, TelSecHol_len, + TelSecHol_bot, TelSecHol_top); + G4RotationMatrix tel_rot11; tel_rot11.rotateZ(-90.*deg); + tel_rot11.rotateY(-90.*deg); tel_rot11.rotateX(-90.*deg); + G4LogicalVolume* TelSecHol_log = + new G4LogicalVolume(TelSecHol_sol, SiC, "TelSecHol_log"); + G4VPhysicalVolume* TelSecHol_phys= new G4PVPlacement(G4Transform3D + (tel_rot11, offset + G4ThreeVector(0, + TelPriMir_yoff-0.5*TelSecHol_len-0.5*TelSecMir_dia-TelSecHolCap2_thi, + -TelMast_off-0.5*TelMast_len+TelSecHol_top)), + "TelSecHol_phys", TelSecHol_log, TelShield_phys, false, 0); + TelSecHol_log->SetVisAttributes(sol_grey_vat); + // cap1 + G4Tubs* TelSecHolCap1_sol = + new G4Tubs("TelSecHolCap1_sol", 0.5*TelMast_dia, + 0.5*TelMast_dia+TelSecHolCap1_thi, 0.5*TelSecHolCap1_len, 0., 360.*deg); + G4LogicalVolume* TelSecHolCap1_log = + new G4LogicalVolume(TelSecHolCap1_sol, SiC, "TelSecHolCap1_log"); + G4VPhysicalVolume* TelSecHolCap1_phys= new G4PVPlacement(0, + offset + G4ThreeVector(0,-0.5*TelPriMir_dia-0.5*TelMast_dia+TelPriMir_yoff, + -TelMast_off-0.5*TelMast_len+0.5*TelSecHol_bot), + "TelSecHolCap1_phys", TelSecHolCap1_log, TelShield_phys, false, 0); + TelSecHolCap1_log->SetVisAttributes(sol_grey_vat); + // cap2 + G4Tubs* TelSecHolCap2_sol = + new G4Tubs("TelSecHolCap2_sol", 0.5*TelSecMir_dia, + 0.5*TelSecMir_dia+TelSecHolCap2_thi, 0.5*TelSecHolCap2_len, 0., 360.*deg); + G4LogicalVolume* TelSecHolCap2_log = + new G4LogicalVolume(TelSecHolCap2_sol, SiC, "TelSecHolCap2_log"); + G4VPhysicalVolume* TelSecHolCap2_phys= new G4PVPlacement(0, + offset + G4ThreeVector(0,TelPriMir_yoff, + -TelMast_off-0.5*TelMast_len+0.5*TelSecHol_top), + "TelSecHolCap2_phys", TelSecHolCap2_log, TelShield_phys, false, 0); + TelSecHolCap2_log->SetVisAttributes(sol_grey_vat); + + + // make structure invisible + // arms_o_log->SetVisAttributes(G4VisAttributes::Invisible); + // arms_i_log->SetVisAttributes(G4VisAttributes::Invisible); + // TelShield_log->SetVisAttributes(G4VisAttributes::Invisible); + + // make structure solid + // arms_o_log->SetVisAttributes(sol_yellow_vat); + // arms_i_log->SetVisAttributes(yellow_vat); + // TelShield_log->SetVisAttributes(sol_green_vat); + + +// **************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISAPhysicsList.cc b/examples/advanced/cosmicray_charging/src/LISAPhysicsList.cc new file mode 100644 index 0000000000..0547f35d04 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAPhysicsList.cc @@ -0,0 +1,1036 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAPhysicsList class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + +// Hadronics : +// : PreCo for p, n at 0 < E < 70 MeV +// : BiC for p, n at 65 MeV < E < 6.1 GeV +// : QGSP for p, n at 6 GeV < E < 100 TeV +// : BiC for pi at 0 < E < 1.5 GeV +// : LEP for pi at 1.4 GeV < E < 6.1 GeV +// : QGSP for pi at 6 GeV < E < 100 TeV +// : LEP for H2, H3, He4 at 0 < E < 100 MeV +// : BiC for H2, H3, He4 at 80 MeV < E < 40 GeV +// : BiC for He3, GenIon at 0 < E < 30 GeV + + + +#include "LISAPhysicsList.hh" + +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" + +#include "G4ParticleDefinition.hh" +#include "G4ParticleWithCuts.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" + +#include "globals.hh" +#include "G4ios.hh" +#include + + +// Constructor ///////////////////////////////////////////////////////////// +LISAPhysicsList::LISAPhysicsList() : G4VUserPhysicsList() { + + VerboseLevel = 1; + SetVerboseLevel(VerboseLevel); +} + + +// Destructor ////////////////////////////////////////////////////////////// +LISAPhysicsList::~LISAPhysicsList() +{;} + + + +//////////////////////////////////////////////////////////////////////////// +// Construct Particles ///////////////////////////////////////////////////// + +#include "G4LeptonConstructor.hh" +#include "G4BaryonConstructor.hh" +#include "G4MesonConstructor.hh" +#include "G4BosonConstructor.hh" +#include "G4ShortLivedConstructor.hh" +#include "G4IonConstructor.hh" + +void LISAPhysicsList::ConstructParticle() { + + G4LeptonConstructor aC1; + G4BaryonConstructor aC2; + G4MesonConstructor aC3; + G4BosonConstructor aC4; + G4IonConstructor aC5; + G4ShortLivedConstructor aC6; + + aC1.ConstructParticle(); + aC2.ConstructParticle(); + aC3.ConstructParticle(); + aC4.ConstructParticle(); + aC5.ConstructParticle(); + aC6.ConstructParticle(); + +} + +///////////////////////////////////////////////////////////////////////////// +// Construct Processes ////////////////////////////////////////////////////// + +void LISAPhysicsList::ConstructProcess() { + + AddTransportation(); + + ElectromagneticPhysics(); + + HadronicPhysics(); + + ElectroNuclearPhysics(); + + GeneralPhysics(); + +} + + +///////////////////////////////////////////////////////////////////////////// +// Transportation /////////////////////////////////////////////////////////// + +void LISAPhysicsList::AddTransportation() { + + G4VUserPhysicsList::AddTransportation(); + +} + + +///////////////////////////////////////////////////////////////////////////// +// Electromagnetic Processes //////////////////////////////////////////////// + +// all charged particles +#include "G4MultipleScattering.hh" + +// gamma +#include "G4LowEnergyRayleigh.hh" +#include "G4LowEnergyPhotoElectric.hh" +#include "G4LowEnergyCompton.hh" +#include "G4LowEnergyGammaConversion.hh" + +// e- +#include "G4LowEnergyIonisation.hh" +#include "G4LowEnergyBremsstrahlung.hh" + +// e+ +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +// muons +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4MuonMinusCaptureAtRest.hh" + +// hadrons and ions +#include "G4hIonisation.hh" +#include "G4ionIonisation.hh" + + +void LISAPhysicsList::ElectromagneticPhysics() { + + + G4cout << "Electromagnetic Physics" << G4endl; + + + // processes + + G4LowEnergyPhotoElectric* lowePhot = new G4LowEnergyPhotoElectric(); + G4LowEnergyIonisation* loweIon = new G4LowEnergyIonisation(); + G4LowEnergyBremsstrahlung* loweBrem = new G4LowEnergyBremsstrahlung(); + lowePhot->SetCutForLowEnSecPhotons(100*eV); + loweIon ->SetCutForLowEnSecPhotons(100*eV); + loweBrem->SetCutForLowEnSecPhotons(100*eV); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + G4String particleType = particle->GetParticleType(); + G4double particleCharge = particle->GetPDGCharge(); + + if (particleName == "gamma") { + //gamma + pmanager->AddDiscreteProcess(new G4LowEnergyRayleigh()); + pmanager->AddDiscreteProcess(lowePhot); + pmanager->AddDiscreteProcess(new G4LowEnergyCompton()); + pmanager->AddDiscreteProcess(new G4LowEnergyGammaConversion()); + + } else if (particleName == "e-") { + //electron + G4MultipleScattering* aMultipleScattering = new G4MultipleScattering(); + // Modifying Facrange from default value (0.199) + // to improve backscattering fraction for electrons + aMultipleScattering->SetFacrange(0.01); + pmanager->AddProcess(aMultipleScattering, -1, 1, 1); + pmanager->AddProcess(loweIon, -1, 2, 2); + pmanager->AddProcess(loweBrem, -1,-1, 3); + + } else if (particleName == "e+") { + //positron + G4MultipleScattering* aMultipleScattering = new G4MultipleScattering(); + pmanager->AddProcess(aMultipleScattering, -1, 1, 1); + pmanager->AddProcess(new G4eIonisation(), -1, 2, 2); + pmanager->AddProcess(new G4eBremsstrahlung(), -1,-1, 3); + pmanager->AddProcess(new G4eplusAnnihilation(), 0,-1, 4); + + } else if( particleName == "mu+" || + particleName == "mu-" ) { + //muon + G4MultipleScattering* aMultipleScattering = new G4MultipleScattering(); + pmanager->AddProcess(aMultipleScattering, -1, 1, 1); + pmanager->AddProcess(new G4MuIonisation(), -1, 2, 2); + pmanager->AddProcess(new G4MuBremsstrahlung(), -1,-1, 3); + pmanager->AddProcess(new G4MuPairProduction(), -1,-1, 4); + if( particleName == "mu-" ) + pmanager->AddProcess(new G4MuonMinusCaptureAtRest(),0,-1,-1); + + } else if( particleName == "GenericIon" ) { + // ions + pmanager->AddProcess(new G4MultipleScattering, -1, 1, 1); + pmanager->AddProcess(new G4ionIonisation, -1, 2, 2); + + } else if (!particle->IsShortLived() && + particleCharge != 0.0 && + particleName != "chargedgeantino") { + // all other stable charged particles + pmanager->AddProcess(new G4MultipleScattering, -1, 1, 1); + pmanager->AddProcess(new G4hIonisation, -1, 2, 2); + } + + } + +} + + + +/////////////////////////////////////////////////////////////////////////// +// ElectroNuclear Physics ///////////////////////////////////////////////// + +// photonuclear and electronuclear reaction +#include "G4PhotoNuclearProcess.hh" +#include "G4ElectronNuclearProcess.hh" +#include "G4PositronNuclearProcess.hh" +#include "G4GammaNuclearReaction.hh" +#include "G4ElectroNuclearReaction.hh" + +// CHIPS fragmentation model +#include "G4TheoFSGenerator.hh" +#include "G4StringChipsParticleLevelInterface.hh" +#include "G4QGSModel.hh" +#include "G4GammaParticipants.hh" +#include "G4QGSMFragmentation.hh" +#include "G4ExcitedStringDecay.hh" + +// muon photonuclear reaction +// #include "G4MuonNucleusProcess.hh" +// #include "G4MuNuclearInteraction.hh" + + +void LISAPhysicsList::ElectroNuclearPhysics() { + + G4cout << "ElectroNuclear Physics" << G4endl; + + // gamma + G4PhotoNuclearProcess* thePhotoNuclearProcess = + new G4PhotoNuclearProcess("PhotoNuclear"); + // low energy + G4GammaNuclearReaction* theGammaReaction = + new G4GammaNuclearReaction; + theGammaReaction->SetMaxEnergy(3.*GeV); + thePhotoNuclearProcess->RegisterMe(theGammaReaction); + // high energy + // CHIPS fragmentation for photonuclear reaction + // Quark Gluon String model for high energy gammas + G4TheoFSGenerator* theHEModel = new G4TheoFSGenerator; + G4StringChipsParticleLevelInterface* theCascade = + new G4StringChipsParticleLevelInterface; + G4QGSModel theStringModel; + theHEModel->SetTransport(theCascade); + theHEModel->SetHighEnergyGenerator(&theStringModel); + theHEModel->SetMinEnergy(3.*GeV); + theHEModel->SetMaxEnergy(10*TeV); + G4QGSMFragmentation theFragmentation; + G4ExcitedStringDecay* theStringDecay = + new G4ExcitedStringDecay(&theFragmentation); + theStringModel.SetFragmentationModel(theStringDecay); + thePhotoNuclearProcess->RegisterMe(theHEModel); + // + G4ProcessManager* pmanager = G4Gamma::Gamma()->GetProcessManager(); + pmanager->AddDiscreteProcess(thePhotoNuclearProcess); + + // e- + pmanager = G4Electron::Electron()->GetProcessManager(); + G4ElectronNuclearProcess* theElectronNuclearProcess = + new G4ElectronNuclearProcess("ElectronNuclear"); + // see G4ElectroNuclearReaction.hh for defaults + // 0 < E < 10 TeV + G4ElectroNuclearReaction* theElectroReaction = + new G4ElectroNuclearReaction; + theElectroReaction->SetMaxEnergy(10*TeV); + theElectronNuclearProcess->RegisterMe(theElectroReaction); + pmanager->AddDiscreteProcess(theElectronNuclearProcess); + + // e+ + pmanager = G4Positron::Positron()->GetProcessManager(); + G4PositronNuclearProcess* thePositronNuclearProcess = + new G4PositronNuclearProcess("PositronNuclear"); + // see G4ElectroNuclearReaction.hh for defaults + // 0 < E < 10 TeV + thePositronNuclearProcess->RegisterMe(theElectroReaction); + pmanager->AddDiscreteProcess(thePositronNuclearProcess); + + + // Muon spectra too soft for photonuclear reaction + // // mu- + // pmanager = G4MuonMinus::MuonMinus()->GetProcessManager(); + // G4MuonNucleusProcess* theMuonNucleusProcess = + // new G4MuonNucleusProcess("MuonNucleus"); + // pmanager->AddDiscreteProcess(theMuonNucleusProcess); + // // mu+ + // pmanager = G4MuonPlus::MuonPlus()->GetProcessManager(); + // pmanager->AddDiscreteProcess(theMuonNucleusProcess); + + +} + + + +///////////////////////////////////////////////////////////////////////////// +// Hadronic Physics ///////////////////////////////////////////////////////// + +#include "G4HadronElasticProcess.hh" +#include "G4HadronInelasticProcess.hh" +#include "G4HadronCaptureProcess.hh" +#include "G4HadronFissionProcess.hh" + +// Inelastic Processes +#include "G4ProtonInelasticProcess.hh" +#include "G4AntiProtonInelasticProcess.hh" +#include "G4NeutronInelasticProcess.hh" +#include "G4AntiNeutronInelasticProcess.hh" +#include "G4PionPlusInelasticProcess.hh" +#include "G4PionMinusInelasticProcess.hh" +#include "G4KaonPlusInelasticProcess.hh" +#include "G4KaonZeroSInelasticProcess.hh" +#include "G4KaonZeroLInelasticProcess.hh" +#include "G4KaonMinusInelasticProcess.hh" +#include "G4DeuteronInelasticProcess.hh" +#include "G4TritonInelasticProcess.hh" +#include "G4AlphaInelasticProcess.hh" +// #include "G4IonInelasticProcess.hh" +#include "G4LambdaInelasticProcess.hh" +#include "G4AntiLambdaInelasticProcess.hh" +#include "G4OmegaMinusInelasticProcess.hh" +#include "G4AntiOmegaMinusInelasticProcess.hh" +#include "G4SigmaMinusInelasticProcess.hh" +#include "G4AntiSigmaMinusInelasticProcess.hh" +#include "G4SigmaPlusInelasticProcess.hh" +#include "G4AntiSigmaPlusInelasticProcess.hh" +#include "G4XiZeroInelasticProcess.hh" +#include "G4AntiXiZeroInelasticProcess.hh" +#include "G4XiMinusInelasticProcess.hh" +#include "G4AntiXiMinusInelasticProcess.hh" + +// Low-energy Parameterised Models: 1 to 25 GeV +#include "G4LElastic.hh" +#include "G4LEPionPlusInelastic.hh" +#include "G4LEPionMinusInelastic.hh" +#include "G4LEKaonPlusInelastic.hh" +#include "G4LEKaonZeroSInelastic.hh" +#include "G4LEKaonZeroLInelastic.hh" +#include "G4LEKaonMinusInelastic.hh" +// #include "G4LEProtonInelastic.hh" +#include "G4LEAntiProtonInelastic.hh" +// #include "G4LENeutronInelastic.hh" +#include "G4LEAntiNeutronInelastic.hh" +#include "G4LEDeuteronInelastic.hh" +#include "G4LETritonInelastic.hh" +#include "G4LEAlphaInelastic.hh" +#include "G4LELambdaInelastic.hh" +#include "G4LEAntiLambdaInelastic.hh" +#include "G4LEOmegaMinusInelastic.hh" +#include "G4LEAntiOmegaMinusInelastic.hh" +#include "G4LESigmaMinusInelastic.hh" +#include "G4LEAntiSigmaMinusInelastic.hh" +#include "G4LESigmaPlusInelastic.hh" +#include "G4LEAntiSigmaPlusInelastic.hh" +#include "G4LEXiZeroInelastic.hh" +#include "G4LEAntiXiZeroInelastic.hh" +#include "G4LEXiMinusInelastic.hh" +#include "G4LEAntiXiMinusInelastic.hh" +// neutrons +#include "G4LCapture.hh" +#include "G4LFission.hh" +// #include "G4ParaFissionModel.hh" + +// High-energy Parameterised Models: 25 GeV to 10 TeV +// #include "G4HEPionPlusInelastic.hh" +// #include "G4HEPionMinusInelastic.hh" +// #include "G4HEKaonPlusInelastic.hh" +// #include "G4HEKaonZeroInelastic.hh" +// #include "G4HEKaonZeroInelastic.hh" +// #include "G4HEKaonMinusInelastic.hh" +// #include "G4HEProtonInelastic.hh" +// #include "G4HENeutronInelastic.hh" +#include "G4HEAntiProtonInelastic.hh" +#include "G4HEAntiNeutronInelastic.hh" +#include "G4HELambdaInelastic.hh" +#include "G4HEAntiLambdaInelastic.hh" +#include "G4HEOmegaMinusInelastic.hh" +#include "G4HEAntiOmegaMinusInelastic.hh" +#include "G4HESigmaMinusInelastic.hh" +#include "G4HEAntiSigmaMinusInelastic.hh" +#include "G4HESigmaPlusInelastic.hh" +#include "G4HEAntiSigmaPlusInelastic.hh" +#include "G4HEXiZeroInelastic.hh" +#include "G4HEAntiXiZeroInelastic.hh" +#include "G4HEXiMinusInelastic.hh" +#include "G4HEAntiXiMinusInelastic.hh" + +// Neutron HP Models: Thermal to 19 MeV +// #include "G4NeutronHPElastic.hh" +// #include "G4NeutronHPElasticData.hh" +// #include "G4NeutronHPCapture.hh" +// #include "G4NeutronHPCaptureData.hh" +// #include "G4NeutronHPInelastic.hh" +// #include "G4NeutronHPInelasticData.hh" + +// Stopping processes +#include "G4PiMinusAbsorptionAtRest.hh" +#include "G4KaonMinusAbsorptionAtRest.hh" +#include "G4AntiProtonAnnihilationAtRest.hh" +#include "G4AntiNeutronAnnihilationAtRest.hh" + +// Generator models: HE +#include "G4TheoFSGenerator.hh" +#include "G4Evaporation.hh" +#include "G4CompetitiveFission.hh" +#include "G4FermiBreakUp.hh" +#include "G4StatMF.hh" +#include "G4ExcitationHandler.hh" +#include "G4PreCompoundModel.hh" +#include "G4GeneratorPrecompoundInterface.hh" +#include "G4QGSModel.hh" +#include "G4QGSParticipants.hh" +#include "G4QGSMFragmentation.hh" +#include "G4ExcitedStringDecay.hh" + +// Kinetic Model +#include "G4BinaryCascade.hh" +#include "G4BinaryLightIonReaction.hh" +#include "G4TripathiCrossSection.hh" +#include "G4IonsShenCrossSection.hh" + + +void LISAPhysicsList::HadronicPhysics() { + + + G4cout << "Hadronic Physics" << G4endl; + + + // **************************************************// + // *** preparing inelastic reactions for hadrons *** // + // **************************************************// + + // high energy model for proton, neutron, pions and kaons + G4TheoFSGenerator* theHEModel = new G4TheoFSGenerator; + + // all models for treatment of thermal nucleus + G4Evaporation* theEvaporation = new G4Evaporation; + G4FermiBreakUp* theFermiBreakUp = new G4FermiBreakUp; + G4StatMF* theMF = new G4StatMF; + + // evaporation logic + G4ExcitationHandler* theHandler = new G4ExcitationHandler; + theHandler->SetEvaporation(theEvaporation); + theHandler->SetFermiModel(theFermiBreakUp); + theHandler->SetMultiFragmentation(theMF); + theHandler->SetMaxAandZForFermiBreakUp(12, 6); + theHandler->SetMinEForMultiFrag(3.*MeV); + + // pre-equilibrium stage + G4PreCompoundModel* thePreEquilib = new G4PreCompoundModel(theHandler); + thePreEquilib->SetMaxEnergy(70*MeV); + + // a no-cascade generator-precompound interaface + G4GeneratorPrecompoundInterface* theCascade = + new G4GeneratorPrecompoundInterface; + theCascade->SetDeExcitation(thePreEquilib); + + // QGSP model + G4VPartonStringModel* theStringModel; + theStringModel = new G4QGSModel; + theHEModel->SetTransport(theCascade); + theHEModel->SetHighEnergyGenerator(theStringModel); + theHEModel->SetMinEnergy(6*GeV); + theHEModel->SetMaxEnergy(100*TeV); + + // Binary cascade for p, n + G4BinaryCascade* theCasc = new G4BinaryCascade; + theCasc->SetMinEnergy(65*MeV); + theCasc->SetMaxEnergy(6.1*GeV); + + // fragmentation + G4VLongitudinalStringDecay* theFragmentation = new G4QGSMFragmentation; + G4ExcitedStringDecay* theStringDecay = + new G4ExcitedStringDecay(theFragmentation); + theStringModel->SetFragmentationModel(theStringDecay); + + + // pion inelastics + // Binary cascade + G4BinaryCascade* theCascForPi = new G4BinaryCascade; + // theCascForPi->SetMinEnergy(65*MeV); + theCascForPi->SetMinEnergy(0*MeV); + theCascForPi->SetMaxEnergy(1.5*GeV); + // LEP to fill the gap + G4LEPionPlusInelastic* theLEPModelPiPlus = new G4LEPionPlusInelastic; + theLEPModelPiPlus->SetMinEnergy(1.4*GeV); + theLEPModelPiPlus->SetMaxEnergy(6.1*GeV); + G4LEPionMinusInelastic* theLEPModelPiMinus = new G4LEPionMinusInelastic; + theLEPModelPiMinus->SetMinEnergy(1.4*GeV); + theLEPModelPiMinus->SetMaxEnergy(6.1*GeV); + + + + // *******************************************************// + // *** preparing inelastic reactions for light nuclei *** // + // *******************************************************// + + // binary cascade for light nuclei + // NOTE: Shen XS only up to 10 GeV/n; + // pushing up to 40 GeV for alphas; will fail for d>20 GeV and t>30 GeV + G4BinaryLightIonReaction * theIonBC= new G4BinaryLightIonReaction; + theIonBC->SetMinEnergy(80*MeV); + // theIonBC->SetMaxEnergy(20*GeV); + theIonBC->SetMaxEnergy(40*GeV); + G4TripathiCrossSection* TripathiCrossSection= new G4TripathiCrossSection; + G4IonsShenCrossSection* aShen = new G4IonsShenCrossSection; + + // deuteron + G4LEDeuteronInelastic* theDIModel = new G4LEDeuteronInelastic; + theDIModel->SetMaxEnergy(100*MeV); + + // triton + G4LETritonInelastic* theTIModel = new G4LETritonInelastic; + theTIModel->SetMaxEnergy(100*MeV); + + // alpha + G4LEAlphaInelastic* theAIModel = new G4LEAlphaInelastic; + theAIModel->SetMaxEnergy(100*MeV); + + // Generic Ion and He3 + // NOTE: Shen XS only up to 10 GeV/n; + // pushing up to 30 GeV for He3; + G4BinaryLightIonReaction* theGenIonBC= new G4BinaryLightIonReaction; + theGenIonBC->SetMinEnergy(0*MeV); + // theGenIonBC->SetMaxEnergy(10*GeV); + theGenIonBC->SetMaxEnergy(30*GeV); + + + + // *************************************// + // *** preparing elastic scattering *** // + // *************************************// + + // elastic process + // now producing nuclear recoils + G4HadronElasticProcess* theElasticProcess = + new G4HadronElasticProcess("elastic"); + G4LElastic* theElasticModel = new G4LElastic; + theElasticProcess->RegisterMe(theElasticModel); + + + + // *****************************************// + // *** attaching processes to particles *** // + // *****************************************// + + theParticleIterator->reset(); + while ((*theParticleIterator)()) { + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + if (particleName == "pi+") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4PionPlusInelasticProcess* theInelasticProcess = + new G4PionPlusInelasticProcess("inelastic"); + // NOTE: PreCo crahes for Pi+ + // theInelasticProcess->RegisterMe(thePreEquilib); + theInelasticProcess->RegisterMe(theCascForPi); + theInelasticProcess->RegisterMe(theLEPModelPiPlus); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "pi-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4PionMinusInelasticProcess* theInelasticProcess = + new G4PionMinusInelasticProcess("inelastic"); + // theInelasticProcess->RegisterMe(thePreEquilib); + theInelasticProcess->RegisterMe(theCascForPi); + theInelasticProcess->RegisterMe(theLEPModelPiMinus); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + pmanager->AddRestProcess(new G4PiMinusAbsorptionAtRest, ordDefault); + + } else if (particleName == "kaon+") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4KaonPlusInelasticProcess* theInelasticProcess = + new G4KaonPlusInelasticProcess("inelastic"); + G4LEKaonPlusInelastic* theLEInelasticModel = new G4LEKaonPlusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + // G4HEKaonPlusInelastic* theHEInelasticModel = + // new G4HEKaonPlusInelastic; + // theInelasticProcess->RegisterMe(theHEInelasticModel); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "kaon0S") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4KaonZeroSInelasticProcess* theInelasticProcess = + new G4KaonZeroSInelasticProcess("inelastic"); + G4LEKaonZeroSInelastic* theLEInelasticModel = new G4LEKaonZeroSInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + // G4HEKaonZeroInelastic* theHEInelasticModel = + // new G4HEKaonZeroInelastic; + // theInelasticProcess->RegisterMe(theHEInelasticModel); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "kaon0L") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4KaonZeroLInelasticProcess* theInelasticProcess = + new G4KaonZeroLInelasticProcess("inelastic"); + G4LEKaonZeroLInelastic* theLEInelasticModel = new G4LEKaonZeroLInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + // G4HEKaonZeroInelastic* theHEInelasticModel = + // new G4HEKaonZeroInelastic; + // theInelasticProcess->RegisterMe(theHEInelasticModel); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "kaon-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4KaonMinusInelasticProcess* theInelasticProcess = + new G4KaonMinusInelasticProcess("inelastic"); + G4LEKaonMinusInelastic* theLEInelasticModel = new G4LEKaonMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + // G4HEKaonMinusInelastic* theHEInelasticModel = + // new G4HEKaonMinusInelastic; + // theInelasticProcess->RegisterMe(theHEInelasticModel); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + pmanager->AddRestProcess(new G4KaonMinusAbsorptionAtRest, ordDefault); + + } else if (particleName == "proton") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4ProtonInelasticProcess* theInelasticProcess = + new G4ProtonInelasticProcess("inelastic"); + // G4LEProtonInelastic* theLEInelasticModel = new G4LEProtonInelastic; + // theLEInelasticModel->SetMaxEnergy(25*GeV); + // theInelasticProcess->RegisterMe(theLEInelasticModel); + // G4HEProtonInelastic* theHEInelasticModel = new G4HEProtonInelastic; + // theInelasticProcess->RegisterMe(theHEInelasticModel); + theInelasticProcess->RegisterMe(thePreEquilib); + theInelasticProcess->RegisterMe(theCasc); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_proton") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiProtonInelasticProcess* theInelasticProcess = + new G4AntiProtonInelasticProcess("inelastic"); + G4LEAntiProtonInelastic* theLEInelasticModel=new G4LEAntiProtonInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + G4HEAntiProtonInelastic* theHEInelasticModel = + new G4HEAntiProtonInelastic; + theInelasticProcess->RegisterMe(theLEInelasticModel); + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + pmanager->AddRestProcess(new G4AntiProtonAnnihilationAtRest, ordDefault); + + } else if (particleName == "neutron") { + // elastic scattering + G4HadronElasticProcess* theNeutronElasticProcess = + new G4HadronElasticProcess("elastic"); + G4LElastic* theElasticModel1 = new G4LElastic; + // theElasticModel1->SetMinEnergy(19*MeV); + theNeutronElasticProcess->RegisterMe(theElasticModel1); + // G4NeutronHPElastic* theElasticModel2 = new G4NeutronHPElastic; + // theNeutronElasticProcess->RegisterMe(theElasticModel2); + // G4CrossSectionDataStore* theElasticStore = + // ((G4HadronElasticProcess*)theNeutronElasticProcess) + // ->GetCrossSectionDataStore(); + // G4NeutronHPElasticData* theElasticData = new G4NeutronHPElasticData; + // theElasticStore->AddDataSet(theElasticData); + pmanager->AddDiscreteProcess(theNeutronElasticProcess); + + // inelastic scattering + G4NeutronInelasticProcess* theInelasticProcess = + new G4NeutronInelasticProcess("inelastic"); + // // inelastic model 1: HP + // G4NeutronHPInelastic* theInelasticModel1 = + // new G4NeutronHPInelastic; + // theInelasticProcess->RegisterMe(theInelasticModel1); + // G4CrossSectionDataStore* theInelasticStore = + // ((G4HadronInelasticProcess*)theInelasticProcess) + // ->GetCrossSectionDataStore(); + // G4NeutronHPInelasticData* theInelasticData1 = + // new G4NeutronHPInelasticData; + // theInelasticStore->AddDataSet(theInelasticData1); + // inelastic model 2: HK + // G4LENeutronInelastic* theInelasticModel2 = new G4LENeutronInelastic; + // theInelasticModel2->SetMinEnergy(19*MeV); + // theInelasticModel2->SetMaxEnergy(25*GeV); + // theInelasticProcess->RegisterMe(theInelasticModel2); + // using pre-equilibrium instead of neutronHP + theInelasticProcess->RegisterMe(thePreEquilib); + theInelasticProcess->RegisterMe(theCasc); + theInelasticProcess->RegisterMe(theHEModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + // capture + G4HadronCaptureProcess* theCaptureProcess = + new G4HadronCaptureProcess("capture"); + G4LCapture* theCaptureModel = new G4LCapture; + // theCaptureModel->SetMinEnergy(19*MeV); + theCaptureProcess->RegisterMe(theCaptureModel); + // G4NeutronHPCapture* theLENeutronCaptureModel = new G4NeutronHPCapture; + // theCaptureProcess->RegisterMe(theLENeutronCaptureModel); + // G4CrossSectionDataStore* theCaptureStore = + // ((G4HadronCaptureProcess*)theCaptureProcess)-> + // GetCrossSectionDataStore(); + // G4NeutronHPCaptureData* theCaptureData = new G4NeutronHPCaptureData; + // theCaptureStore->AddDataSet(theCaptureData); + pmanager->AddDiscreteProcess(theCaptureProcess); + + // fission + G4HadronFissionProcess* theFissionProcess = + new G4HadronFissionProcess; + G4LFission* theFissionModel = new G4LFission; + // G4ParaFissionModel* theFissionModel = new G4ParaFissionModel; + theFissionProcess->RegisterMe(theFissionModel); + pmanager->AddDiscreteProcess(theFissionProcess); + + } else if (particleName == "anti_neutron") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiNeutronInelasticProcess* theInelasticProcess = + new G4AntiNeutronInelasticProcess("inelastic"); + G4LEAntiNeutronInelastic* theLEInelasticModel = + new G4LEAntiNeutronInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + G4HEAntiNeutronInelastic* theHEInelasticModel = + new G4HEAntiNeutronInelastic; + theInelasticProcess->RegisterMe(theLEInelasticModel); + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + pmanager->AddRestProcess(new G4AntiNeutronAnnihilationAtRest,ordDefault); + + } else if (particleName == "deuteron") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4DeuteronInelasticProcess* theIPdeuteron = + new G4DeuteronInelasticProcess; + theIPdeuteron->AddDataSet(TripathiCrossSection); + theIPdeuteron->AddDataSet(aShen); + theIPdeuteron->RegisterMe(theDIModel); + theIPdeuteron->RegisterMe(theIonBC); + pmanager->AddDiscreteProcess(theIPdeuteron); + + } else if (particleName == "triton") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4TritonInelasticProcess* theIPtriton = + new G4TritonInelasticProcess; + theIPtriton->AddDataSet(TripathiCrossSection); + theIPtriton->AddDataSet(aShen); + theIPtriton->RegisterMe(theTIModel); + theIPtriton->RegisterMe(theIonBC); + pmanager->AddDiscreteProcess(theIPtriton); + + } else if (particleName == "alpha") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AlphaInelasticProcess* theIPalpha = + new G4AlphaInelasticProcess; + theIPalpha->AddDataSet(TripathiCrossSection); + theIPalpha->AddDataSet(aShen); + theIPalpha->RegisterMe(theAIModel); + theIPalpha->RegisterMe(theIonBC); + pmanager->AddDiscreteProcess(theIPalpha); + + } else if (particleName == "He3") { + // NOTE elastic scattering does not stick to He3! + pmanager->AddDiscreteProcess(theElasticProcess); + G4HadronInelasticProcess* theIPHe3 = + new G4HadronInelasticProcess("He3Inelastic", G4He3::He3()); + theIPHe3->AddDataSet(TripathiCrossSection); + theIPHe3->AddDataSet(aShen); + theIPHe3->RegisterMe(theGenIonBC); + pmanager->AddDiscreteProcess(theIPHe3); + + } else if (particleName == "GenericIon") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4HadronInelasticProcess* theIPGenericIon = + new G4HadronInelasticProcess("IonInel",G4GenericIon::GenericIon()); + theIPGenericIon->AddDataSet(TripathiCrossSection); + theIPGenericIon->AddDataSet(aShen); + theIPGenericIon->RegisterMe(theGenIonBC); + pmanager->AddDiscreteProcess(theIPGenericIon); + + } else if (particleName == "lambda") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4LambdaInelasticProcess* theInelasticProcess = + new G4LambdaInelasticProcess("inelastic"); + G4LELambdaInelastic* theLEInelasticModel = new G4LELambdaInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HELambdaInelastic* theHEInelasticModel = + new G4HELambdaInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_lambda") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiLambdaInelasticProcess* theInelasticProcess = + new G4AntiLambdaInelasticProcess("inelastic"); + G4LEAntiLambdaInelastic* theLEInelasticModel=new G4LEAntiLambdaInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiLambdaInelastic* theHEInelasticModel = + new G4HEAntiLambdaInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "omega-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4OmegaMinusInelasticProcess* theInelasticProcess = + new G4OmegaMinusInelasticProcess("inelastic"); + G4LEOmegaMinusInelastic* theLEInelasticModel = + new G4LEOmegaMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEOmegaMinusInelastic* theHEInelasticModel = + new G4HEOmegaMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_omega-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiOmegaMinusInelasticProcess* theInelasticProcess = + new G4AntiOmegaMinusInelasticProcess("inelastic"); + G4LEAntiOmegaMinusInelastic* theLEInelasticModel = + new G4LEAntiOmegaMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiOmegaMinusInelastic* theHEInelasticModel = + new G4HEAntiOmegaMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "sigma-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4SigmaMinusInelasticProcess* theInelasticProcess = + new G4SigmaMinusInelasticProcess("inelastic"); + G4LESigmaMinusInelastic* theLEInelasticModel = + new G4LESigmaMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HESigmaMinusInelastic* theHEInelasticModel = + new G4HESigmaMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_sigma-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiSigmaMinusInelasticProcess* theInelasticProcess = + new G4AntiSigmaMinusInelasticProcess("inelastic"); + G4LEAntiSigmaMinusInelastic* theLEInelasticModel = + new G4LEAntiSigmaMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiSigmaMinusInelastic* theHEInelasticModel = + new G4HEAntiSigmaMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "sigma+") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4SigmaPlusInelasticProcess* theInelasticProcess = + new G4SigmaPlusInelasticProcess("inelastic"); + G4LESigmaPlusInelastic* theLEInelasticModel = + new G4LESigmaPlusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HESigmaPlusInelastic* theHEInelasticModel = + new G4HESigmaPlusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_sigma+") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiSigmaPlusInelasticProcess* theInelasticProcess = + new G4AntiSigmaPlusInelasticProcess("inelastic"); + G4LEAntiSigmaPlusInelastic* theLEInelasticModel = + new G4LEAntiSigmaPlusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiSigmaPlusInelastic* theHEInelasticModel = + new G4HEAntiSigmaPlusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "xi0") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4XiZeroInelasticProcess* theInelasticProcess = + new G4XiZeroInelasticProcess("inelastic"); + G4LEXiZeroInelastic* theLEInelasticModel = + new G4LEXiZeroInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEXiZeroInelastic* theHEInelasticModel = + new G4HEXiZeroInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_xi0") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiXiZeroInelasticProcess* theInelasticProcess = + new G4AntiXiZeroInelasticProcess("inelastic"); + G4LEAntiXiZeroInelastic* theLEInelasticModel = + new G4LEAntiXiZeroInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiXiZeroInelastic* theHEInelasticModel = + new G4HEAntiXiZeroInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "xi-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4XiMinusInelasticProcess* theInelasticProcess = + new G4XiMinusInelasticProcess("inelastic"); + G4LEXiMinusInelastic* theLEInelasticModel = + new G4LEXiMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEXiMinusInelastic* theHEInelasticModel = + new G4HEXiMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + + } else if (particleName == "anti_xi-") { + pmanager->AddDiscreteProcess(theElasticProcess); + G4AntiXiMinusInelasticProcess* theInelasticProcess = + new G4AntiXiMinusInelasticProcess("inelastic"); + G4LEAntiXiMinusInelastic* theLEInelasticModel = + new G4LEAntiXiMinusInelastic; + theLEInelasticModel->SetMaxEnergy(25*GeV); + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEAntiXiMinusInelastic* theHEInelasticModel = + new G4HEAntiXiMinusInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + } + } +} + + +// Decays /////////////////////////////////////////////////////////////////// +#include "G4Decay.hh" +// #include "G4RadioactiveDecay.hh" +#include "G4IonTable.hh" +#include "G4Ions.hh" + +void LISAPhysicsList::GeneralPhysics() { + + // Add Decay Process + G4Decay* theDecayProcess = new G4Decay("decay"); + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (theDecayProcess->IsApplicable(*particle)) { + pmanager ->AddProcess(theDecayProcess); + pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest); + } + } + +} + + + +// Cuts ///////////////////////////////////////////////////////////////////// +#include "G4Region.hh" +#include "G4RegionStore.hh" +#include "G4ProductionCuts.hh" + +void LISAPhysicsList::SetCuts() { + + // low energy limit + G4double lowlimit=250*eV; + G4ProductionCutsTable::GetProductionCutsTable() + ->SetEnergyRange(lowlimit, 100.*GeV); + + // default cuts for world volume + G4double cutValue = 2.0*mm; + SetCutValue(cutValue,"gamma"); + SetCutValue(cutValue,"e-"); + SetCutValue(cutValue,"e+"); + + // cuts per region: inertial sensor (250 eV for gamma, e-, e+) + G4Region* region = G4RegionStore::GetInstance()->GetRegion("sensor"); + G4ProductionCuts* cuts = new G4ProductionCuts(); + cuts->SetProductionCut(0.050*micrometer); + region->SetProductionCuts(cuts); + + if (verboseLevel>0) DumpCutValuesTable(); + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISAPrimaryGeneratorAction.cc b/examples/advanced/cosmicray_charging/src/LISAPrimaryGeneratorAction.cc new file mode 100644 index 0000000000..9721390ad1 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAPrimaryGeneratorAction.cc @@ -0,0 +1,81 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAPrimaryGeneratorAction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISAPrimaryGeneratorAction.hh" +#include "G4GeneralParticleSource.hh" + +#include "G4Event.hh" +#include "Randomize.hh" + + +LISAPrimaryGeneratorAction::LISAPrimaryGeneratorAction() { + + particleGun = new G4GeneralParticleSource(); + + energy_pri=0; + seeds[0]=-1; + seeds[1]=-1; + +} + + +LISAPrimaryGeneratorAction::~LISAPrimaryGeneratorAction() { + + delete particleGun; +} + + +void LISAPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { + + energy_pri = 0.; + + // seeds + seeds[0] = *HepRandom::getTheSeeds(); + seeds[1] = *(HepRandom::getTheSeeds()+1); + // G4cout << " 1st seed: " << *seeds << G4endl;; + // G4cout << " 2nd seed: " << *(seeds+1) << G4endl; + // HepRandom::showEngineStatus(); + + particleGun->GeneratePrimaryVertex(anEvent); + + energy_pri = particleGun->GetParticleEnergy(); + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISARunAction.cc b/examples/advanced/cosmicray_charging/src/LISARunAction.cc new file mode 100644 index 0000000000..48a39b49bc --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISARunAction.cc @@ -0,0 +1,167 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISARunAction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISARunAction.hh" + +#include "LISARunActionMessenger.hh" +#include "LISAEventAction.hh" + +#ifdef G4ANALYSIS_USE +#include "LISAAnalysisManager.hh" +#endif + +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "globals.hh" +#include + +#include "Randomize.hh" +#include + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISARunAction::LISARunAction() { + + // defaults + autoSeed = false; + + // create messenger + runMessenger = new LISARunActionMessenger(this); + +#ifdef G4ANALYSIS_USE + // Book histograms and ntuples + LISAAnalysisManager* analysis = LISAAnalysisManager::getInstance(); + analysis->Init(); +#endif + + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISARunAction::~LISARunAction() { + +#ifdef G4ANALYSIS_USE + // delete analysis + LISAAnalysisManager* analysis = LISAAnalysisManager::getInstance(); + analysis->Dispose(); +#endif + + delete runMessenger; + + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISARunAction::BeginOfRunAction(const G4Run* aRun) { + + // run id + G4int run_id = aRun->GetRunID(); + G4cout << "### Run " << run_id << " start." << G4endl; + + + char filename[100]; + std::ostrstream os(filename,100); + + if(autoSeed) { + // automatic (time-based) random seeds and filenames for each run + G4cout << "*******************" << G4endl; + G4cout << "*** AUTOSEED ON ***" << G4endl; + G4cout << "*******************" << G4endl; + long seeds[2]; + time_t systime = time(NULL); + seeds[0] = (long) systime; + seeds[1] = (long) (systime*G4UniformRand()); + // G4cout << "seed1: " << seeds[0] << "; seed2: " << seeds[1] << G4endl; + HepRandom::setTheSeeds(seeds); + HepRandom::showEngineStatus(); + + // form filename (eg run00_7324329387_3284798343.out) + os << "run" << std::setw(2) << std::setfill('0') << run_id + << "_" << seeds[0] << "_" << seeds[1] << std::ends; + } + else { + // default filename, seeds set by /random/reset + os << "charge" << std::ends; + } + // G4cout << "Filename: " << G4String(filename) << G4endl; + + + // send filename to eventAction + LISAEventAction* eventAction = (LISAEventAction*) + G4RunManager::GetRunManager()->GetUserEventAction(); + eventAction->SetFilename( G4String(filename)+G4String(".out") ); + + +#ifdef G4ANALYSIS_USE + // Book histograms and ntuples + LISAAnalysisManager* analysis = LISAAnalysisManager::getInstance(); + analysis->bookRun( G4String(filename)+G4String(".hbook") ); +#endif + + + // if (G4VVisManager::GetConcreteInstance()) { + // G4UImanager* UI = G4UImanager::GetUIpointer(); + // UI->ApplyCommand("/vis/scene/notifyHandlers"); + // } + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISARunAction::EndOfRunAction(const G4Run* aRun) { + +#ifdef G4ANALYSIS_USE + LISAAnalysisManager* analysis = LISAAnalysisManager::getInstance(); + analysis->FinishRun(); +#endif + + // if (G4VVisManager::GetConcreteInstance()) { + // G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); + // } + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/cosmicray_charging/src/LISARunActionMessenger.cc b/examples/advanced/cosmicray_charging/src/LISARunActionMessenger.cc new file mode 100644 index 0000000000..b8cbba7554 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISARunActionMessenger.cc @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISARunActionMessenger class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISARunActionMessenger.hh" + +#include "LISARunAction.hh" + + +LISARunActionMessenger::LISARunActionMessenger + (LISARunAction* runAct) : runAction(runAct){ + + SetAutoSeedCmd = new G4UIcmdWithABool("/run/autoSeed",this); + SetAutoSeedCmd->SetGuidance("Switch on/off time-based random seeds"); + SetAutoSeedCmd->SetGuidance(" true: run seeds determined by system time"); + SetAutoSeedCmd->SetGuidance("false: use command 'random/resetEngineFrom'"); + SetAutoSeedCmd->SetGuidance("Default = false"); + SetAutoSeedCmd->SetParameterName("autoSeed", false); + SetAutoSeedCmd->AvailableForStates(G4State_Idle); + +} + + +LISARunActionMessenger::~LISARunActionMessenger() { + + delete SetAutoSeedCmd; +} + + +void LISARunActionMessenger::SetNewValue + (G4UIcommand* command, G4String newValue) { + + if(command == SetAutoSeedCmd) { + G4int vl; + const char* t = newValue; + std::istrstream is((char*)t); + is >> vl; + runAction->SetAutoSeed(vl!=0); + } + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISAScienceModuleStructures.icc b/examples/advanced/cosmicray_charging/src/LISAScienceModuleStructures.icc new file mode 100644 index 0000000000..3bdcb949ac --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAScienceModuleStructures.icc @@ -0,0 +1,500 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +//************************************************************************** +// Science Module Structure (SMS) +//************************************************************************** +// Primary Structure +// Lower Deck +// Upper Deck +// Thermal Shield +// Solar Array +// Optical Solar Reflectors (OSR) +// Radiator Panels +//************************************************************************** + + + // Structure Tubes + G4double StructTube_dia = 100.*mm; + G4double StructTube_thi = 11.*mm; + G4double StructTube_hei = 490.*mm; + G4double StructTube_sep = 1480.*mm; + G4double StructTubeSpacer_dia = 200.*mm; + G4double StructTubeSpacer_thi = 50.*mm; + G4double StructTubeSpacer_hei = 16.*mm; + + // Diagonal Panels + G4double DiagPanelSkin_thi = 0.5*mm; + G4double DiagPanelSkin_len = 1420.*mm; + G4double DiagPanelSkin_hei = 490.*mm; + G4double DiagPanelCore_thi = 19.*mm; + G4double DiagPanelCore_len = DiagPanelSkin_len; + G4double DiagPanelCore_hei = DiagPanelSkin_hei; + G4double DiagPanelCutout_dia = 466.*mm; + G4double DiagPanelCutout_off = 50.*mm; + + // Radial Panels + G4double RadialPanelSkin_thi = 0.5*mm; + G4double RadialPanelSkin_hei = 490.*mm; + G4double RadialPanelSkin_top = 424.*mm; + G4double RadialPanelSkin_bot = 159.*mm; + G4double RadialPanelCore_thi = 19.*mm; + G4double RadialPanel_roff = 910.*mm; + + // Upper and Lower Decks + G4double UpperDeck_dia = 2700.*mm; + G4double UpperDeckCore_thi = 29.0*mm; + G4double LowerDeckCore_thi = 29.0*mm; + G4double UpperDeck_zoff = 0.5*mm; + G4double UpperDeckSkin_thi = 0.5*mm; + G4double LowerDeck_dia = 2174.*mm; + G4double LowerDeckSkin_thi = 0.5*mm; + G4double LowerDeck_zoff = 0.5*mm; + G4double MLIBlanket_dia = LowerDeck_dia; + G4double MLIBlanket_thi = 1.0*mm; + + // Thermal Shield + G4double ThermalShieldFacesheet_thi = 0.6*mm; + G4double ThermalShieldCore_thi = 20.*mm; + G4double ThermalShieldFoam_thi = 20.*mm; + G4double ThermalShield_zoff = StructTubeSpacer_hei; + G4double ThermalShield_thi = 3*ThermalShieldFacesheet_thi + + ThermalShieldCore_thi + + ThermalShieldFoam_thi; + // Solar Array and OSR Assy + G4double SolarArray_i = 0.5*1683*mm; + G4double SolarArray_o = 0.5*UpperDeck_dia; + G4double SolarArray_thi = 0.5*mm; + G4double OSRAssy_o = SolarArray_i; + G4double OSRAssy_thi = 0.5*mm; + + // Radiator Panels + G4double RadPanel_top = UpperDeck_dia+12.*mm; + G4double RadPanel_bot = LowerDeck_dia+12.*mm; + G4double RadPanel_len = 510.*mm; + G4double RadPanel_thi = 1.25*mm; + G4double RadPanel_zoff = 20*mm; + G4double RadPanelCutout_roff = 0.5*(RadPanel_top+RadPanel_bot)/2.; + G4double RadPanelCutout1_dia = 466.*mm; + G4double RadPanelCutout1_len = 200.*mm; + G4double RadPanelCutout2_hei = 500.*mm; + G4double RadPanelCutout2_wid = 400.*mm; + G4double RadPanelCutout2_len = 400.*mm; + G4double RadPanelCutout2_zoff = 330.*mm; + + + + + // Structure Tubes ********************************************************** + + // Struct Tube: 2.16 kg + // (ID adjusted to make up for mass of missing top part of tube) + G4Tubs* StructTube_sol = new G4Tubs("StructTube_sol", + 0.5*StructTube_dia-StructTube_thi, 0.5*StructTube_dia, + 0.5*StructTube_hei, 0., 360.*deg); + G4LogicalVolume* StructTube_log = new G4LogicalVolume + (StructTube_sol, Al6061, "StructTube_log"); + G4VPhysicalVolume* StructTube_phys; + StructTube_phys = new G4PVPlacement(0, spacecraft_pos + + G4ThreeVector(+0.5*StructTube_sep/cos(30.*deg),0,0), + "StructTube_phys", StructTube_log, wld_phys, false, 0); + StructTube_phys = new G4PVPlacement(0, spacecraft_pos + + G4ThreeVector(-0.5*StructTube_sep*tan(30.*deg),+0.5*StructTube_sep,0), + "StructTube_phys", StructTube_log, wld_phys, false, 1); + StructTube_phys = new G4PVPlacement(0, spacecraft_pos + + G4ThreeVector(-0.5*StructTube_sep*tan(30.*deg),-0.5*StructTube_sep,0), + "StructTube_phys", StructTube_log, wld_phys, false, 2); + StructTube_log->SetVisAttributes(sol_white_vat); + + // Struct Tube Spacer: 1.0 kg + // (ID adjusted to include mass of missing TopCap) + G4Tubs* StructTubeSpacer_sol = new G4Tubs("StructTubeSpacer_sol", + 0.5*StructTubeSpacer_dia-StructTubeSpacer_thi, + 0.5*StructTubeSpacer_dia, 0.5*StructTubeSpacer_hei, 0., 360.*deg); + G4LogicalVolume* StructTubeSpacer_log = new G4LogicalVolume + (StructTubeSpacer_sol, Al6061, "StructTubeSpacer_log"); + G4VPhysicalVolume* StructTubeSpacer_phys; + StructTubeSpacer_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(+0.5*StructTube_sep/cos(30.*deg),0, + +0.5*StructTube_hei+UpperDeckCore_thi+2*UpperDeckSkin_thi + +0.5*StructTubeSpacer_hei+UpperDeck_zoff), + "StructTubeSpacer_phys", StructTubeSpacer_log, wld_phys, false, 0); + StructTubeSpacer_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(-0.5*StructTube_sep*tan(30.*deg), + +0.5*StructTube_sep, +0.5*StructTube_hei+UpperDeckCore_thi + +2*UpperDeckSkin_thi+0.5*StructTubeSpacer_hei+UpperDeck_zoff), + "StructTubeSpacer_phys", StructTubeSpacer_log, wld_phys, false, 1); + StructTubeSpacer_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(-0.5*StructTube_sep*tan(30.*deg), + -0.5*StructTube_sep,+0.5*StructTube_hei+UpperDeckCore_thi + +2*UpperDeckSkin_thi+0.5*StructTubeSpacer_hei+UpperDeck_zoff), + "StructTubeSpacer_phys", StructTubeSpacer_log, wld_phys, false, 2); + StructTubeSpacer_log->SetVisAttributes(sol_grey_vat); + + + // Diagonal Panels ********************************************************** + + // Diagonal Panel: core (x3) + // Honeycomb core is represented by Al6061 at 0.05 g/cm3 + G4Box* DiagPanelCore_box = new G4Box("DiagPanelCore_box", + 0.5*DiagPanelCore_len-2.*cm, 0.5*DiagPanelCore_thi, 0.5*DiagPanelCore_hei); + G4Tubs* DiagPanelCutout_tub = new G4Tubs("DiagPanelCutout_tub", 0., + 0.5*DiagPanelCutout_dia, 2*DiagPanelCore_thi, 0., 360.*deg); + G4UnionSolid* DiagPanelCutout_sol = new G4UnionSolid("DiagPanelCutout_sol", + DiagPanelCutout_tub, DiagPanelCutout_tub, + G4Transform3D(G4RotationMatrix(), G4ThreeVector(DiagPanelCutout_off,0,0))); + G4RotationMatrix SMS_rot1; SMS_rot1.rotateX(90.*deg); + G4SubtractionSolid* DiagPanelCore_sol = + new G4SubtractionSolid("DiagPanelCore_sol", DiagPanelCore_box, + DiagPanelCutout_sol, G4Transform3D(SMS_rot1, + G4ThreeVector(-0.5*DiagPanelCutout_off,0,0))); + G4LogicalVolume* DiagPanelCore_log = new G4LogicalVolume + (DiagPanelCore_sol, AlHoneycomb, "DiagPanelCore_log"); + G4VPhysicalVolume* DiagPanelCore_phys; + G4RotationMatrix SMS_rot2; SMS_rot2.rotateZ(90.*deg); + DiagPanelCore_phys = new G4PVPlacement(G4Transform3D(SMS_rot2, + spacecraft_pos + G4ThreeVector(-0.5*DiagPanelCore_len*tan(30.*deg),0,0)), + "DiagPanelCore_phys", DiagPanelCore_log, wld_phys, false, 0); + G4RotationMatrix SMS_rot3; SMS_rot3.rotateZ(-30.*deg); + DiagPanelCore_phys = new G4PVPlacement(G4Transform3D(SMS_rot3, + spacecraft_pos + G4ThreeVector + (.5*DiagPanelCore_len*sin(30.*deg)*tan(30.*deg), + 0.5*DiagPanelCore_len*sin(30.*deg),0)), "DiagPanelCore_phys", + DiagPanelCore_log, wld_phys, false, 1); + G4RotationMatrix SMS_rot4; SMS_rot4.rotateZ(+30.*deg); + DiagPanelCore_phys = new G4PVPlacement(G4Transform3D(SMS_rot4, + spacecraft_pos + G4ThreeVector + (0.5*DiagPanelCore_len*sin(30*deg)*tan(30*deg), + -0.5*DiagPanelCore_len*sin(30.*deg),0)), + "DiagPanelCore_phys", DiagPanelCore_log, wld_phys, false, 2); + DiagPanelCore_log->SetVisAttributes(sol_white_vat); + + // Diagonal Panel: skins (x6) + G4Box* DiagPanelSkin_box = new G4Box("DiagPanelSkin_box", + 0.5*DiagPanelSkin_len-2.*cm, 0.5*DiagPanelSkin_thi, 0.5*DiagPanelSkin_hei); + G4SubtractionSolid* DiagPanelSkin_sol = + new G4SubtractionSolid("DiagPanelSkin_sol", DiagPanelSkin_box, + DiagPanelCutout_sol, G4Transform3D(SMS_rot1, + G4ThreeVector(-0.5*DiagPanelCutout_off,0,0))); + G4LogicalVolume* DiagPanelSkin_log = new G4LogicalVolume + (DiagPanelSkin_sol, CFRP, "DiagPanelSkin_log"); + G4VPhysicalVolume* DiagPanelSkin_phys; + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot2, + spacecraft_pos + G4ThreeVector(-0.5*DiagPanelCore_len*tan(30.*deg) + + 0.5*(DiagPanelCore_thi+DiagPanelSkin_thi),0,0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 0); + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot2, + spacecraft_pos + G4ThreeVector(-0.5*DiagPanelCore_len*tan(30.*deg) - + 0.5*(DiagPanelCore_thi+DiagPanelSkin_thi),0,0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 1); + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot3, + spacecraft_pos + G4ThreeVector + (0.5*DiagPanelCore_len*sin(30*deg)*tan(30*deg), + 0.5*DiagPanelCore_len*sin(30.*deg),0) + + G4ThreeVector(0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*sin(30.*deg), + 0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*cos(30.*deg),0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 2); + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot3, + spacecraft_pos + G4ThreeVector + (0.5*DiagPanelCore_len*sin(30*deg)*tan(30*deg), + 0.5*DiagPanelCore_len*sin(30.*deg),0) + + G4ThreeVector(-0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*sin(30.*deg), + -0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*cos(30.*deg),0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 3); + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot4, + spacecraft_pos + G4ThreeVector + (0.5*DiagPanelCore_len*sin(30*deg)*tan(30*deg), + -0.5*DiagPanelCore_len*sin(30.*deg),0) + + G4ThreeVector(0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*sin(30.*deg), + -0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*cos(30.*deg),0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 3); + DiagPanelSkin_phys = new G4PVPlacement(G4Transform3D(SMS_rot4, + spacecraft_pos + G4ThreeVector + (0.5*DiagPanelCore_len*sin(30*deg)*tan(30*deg), + -0.5*DiagPanelCore_len*sin(30.*deg),0) + + G4ThreeVector(-0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*sin(30.*deg), + +0.5*(DiagPanelCore_thi+DiagPanelSkin_thi)*cos(30.*deg),0)), + "DiagPanelSkin_phys", DiagPanelSkin_log, wld_phys, false, 4); + DiagPanelSkin_log->SetVisAttributes(sol_white_vat); + + + + // Radial Panels ************************************************************ + + // Radial Panels: skins (x3) + G4Trap* RadialPanelSkin_sol = new G4Trap("RadialPanelSkin_sol", + 2*RadialPanelSkin_thi+RadialPanelCore_thi, RadialPanelSkin_hei, + RadialPanelSkin_top, RadialPanelSkin_bot); + G4LogicalVolume* RadialPanelSkin_log = new G4LogicalVolume + (RadialPanelSkin_sol, CFRP, "RadialPanelSkin_log"); + G4VPhysicalVolume* RadialPanelSkin_phys; + G4RotationMatrix SMS_rot5; SMS_rot5.rotateX(-90.*deg); + RadialPanelSkin_phys = new G4PVPlacement + (G4Transform3D(SMS_rot5, spacecraft_pos + + G4ThreeVector(+RadialPanel_roff/cos(30.*deg),0,0)), + "RadialPanelSkin_phys", RadialPanelSkin_log, wld_phys, false, 0); + G4RotationMatrix SMS_rot6; + SMS_rot6.rotateX(-90.*deg); SMS_rot6.rotateZ(120.*deg); + RadialPanelSkin_phys = new G4PVPlacement + (G4Transform3D(SMS_rot6, spacecraft_pos + + G4ThreeVector(-RadialPanel_roff*tan(30.*deg),+RadialPanel_roff,0)), + "RadialPanelSkin_phys", RadialPanelSkin_log, wld_phys, false, 1); + G4RotationMatrix SMS_rot7; + SMS_rot7.rotateX(-90.*deg); SMS_rot7.rotateZ(-120.*deg); + RadialPanelSkin_phys = new G4PVPlacement + (G4Transform3D(SMS_rot7, spacecraft_pos + + G4ThreeVector(-RadialPanel_roff*tan(30.*deg),-RadialPanel_roff,0)), + "RadialPanelSkin_phys", RadialPanelSkin_log, wld_phys, false, 2); + RadialPanelSkin_log->SetVisAttributes(sol_white_vat); + // Radial Panels: core + // Honeycomb core is represented by Al6061 at 0.05 g/cm3 + G4Trap* RadialPanelCore_sol = new G4Trap("RadialPanelCore_sol", + RadialPanelCore_thi, RadialPanelSkin_hei, + RadialPanelSkin_top, RadialPanelSkin_bot); + G4LogicalVolume* RadialPanelCore_log = new G4LogicalVolume + (RadialPanelCore_sol, AlHoneycomb, "RadialPanelCore_log"); + G4VPhysicalVolume* RadialPanelCore_phys = new G4PVPlacement + (0, G4ThreeVector(0,0,0), "RadialPanelCore_phys", + RadialPanelCore_log, RadialPanelSkin_phys, false, 0); + RadialPanelCore_log->SetVisAttributes(sol_white_vat); + + + + // Upper and Lower Decks **************************************************** + + + // Upper Deck - skin: 2*4.56 kg + G4Tubs* UpperDeckSkin_sol = new G4Tubs + ("UpperDeckSkin_sol", 0., 0.5*UpperDeck_dia, + 0.5*UpperDeckCore_thi + UpperDeckSkin_thi, 0., 360.*deg); + G4LogicalVolume* UpperDeckSkin_log = new G4LogicalVolume + (UpperDeckSkin_sol, CFRP, "UpperDeckSkin_log"); + G4VPhysicalVolume* UpperDeckSkin_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(0,0,+0.5*StructTube_hei + +0.5*UpperDeckCore_thi+UpperDeckSkin_thi+UpperDeck_zoff), + "UpperDeckSkin_phys", UpperDeckSkin_log, wld_phys, false, 0); + UpperDeckSkin_log->SetVisAttributes(white_vat); + // upper deck - core: 8.3 kg + // Honeycomb core is represented by Al6061 at 0.05 g/cm3 + G4Tubs* UpperDeckCore_sol = new G4Tubs + ("UpperDeckCore_sol",0.,.5*UpperDeck_dia,.5*UpperDeckCore_thi,0.,360.*deg); + G4LogicalVolume* UpperDeckCore_log = new G4LogicalVolume + (UpperDeckCore_sol, AlHoneycomb, "UpperDeckCore_log"); + G4VPhysicalVolume* UpperDeckCore_phys = new G4PVPlacement(0,G4ThreeVector(), + "UpperDeckCore_phys", UpperDeckCore_log, UpperDeckSkin_phys, false, 0); + UpperDeckCore_log->SetVisAttributes(white_vat); + + // Lower Deck - skin: 2*2.95 kg + G4Tubs* LowerDeckSkin_sol = new G4Tubs + ("LowerDeckSkin_sol", 0., 0.5*LowerDeck_dia, + 0.5*LowerDeckCore_thi + LowerDeckSkin_thi, 0., 360.*deg); + G4LogicalVolume* LowerDeckSkin_log = new G4LogicalVolume + (LowerDeckSkin_sol, CFRP, "LowerDeckSkin_log"); + G4VPhysicalVolume* LowerDeckSkin_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(0,0,-0.5*StructTube_hei + -0.5*LowerDeckCore_thi-LowerDeckSkin_thi-LowerDeck_zoff), + "LowerDeckSkin_phys", LowerDeckSkin_log, wld_phys, false, 0); + LowerDeckSkin_log->SetVisAttributes(sol_dgrey_vat); + // lower deck - core: 5.38 kg + // Honeycomb core is represented by Al6061 at 0.05 g/cm3 + G4Tubs* LowerDeckCore_sol = new G4Tubs + ("LowerDeckCore_sol",0.,.5*LowerDeck_dia,.5*LowerDeckCore_thi,0.,360.*deg); + G4LogicalVolume* LowerDeckCore_log = new G4LogicalVolume + (LowerDeckCore_sol, AlHoneycomb, "LowerDeckCore_log"); + G4VPhysicalVolume* LowerDeckCore_phys = new G4PVPlacement(0,G4ThreeVector(), + "LowerDeckCore_phys", LowerDeckCore_log, LowerDeckSkin_phys, false, 0); + LowerDeckCore_log->SetVisAttributes(sol_dgrey_vat); + + // Lower Deck MLI Blanket: 5.3 kg + G4Tubs* MLIBlanket_sol = new G4Tubs("MLIBlanket_sol", + 0., 0.5*MLIBlanket_dia, 0.5*MLIBlanket_thi, 0., 360.*deg); + G4LogicalVolume* MLIBlanket_log = new G4LogicalVolume + (MLIBlanket_sol, MLImat, "MLIBlanket_log"); + G4VPhysicalVolume* MLIBlanket_phys = new G4PVPlacement + (0, spacecraft_pos + G4ThreeVector(0,0,-0.5*StructTube_hei + -LowerDeckCore_thi-2*LowerDeckSkin_thi-LowerDeck_zoff-.5*MLIBlanket_thi), + "MLIBlanket_phys", MLIBlanket_log, wld_phys, false, 0); + MLIBlanket_log->SetVisAttributes(sol_orange_vat); + + + // Thermal Shield *********************************************************** + + // Thermal Shield (Facesheet+HoneycombCore+Facesheet+Foam+Facesheet) + // Thermal Shield - facesheet: 3*5.47 kg + G4Tubs* ThermalShieldFacesheet_sol = new G4Tubs("ThermalShieldFacesheet_sol", + 0., 0.5*UpperDeck_dia, 0.5*ThermalShield_thi, 0., 360.*deg); + G4LogicalVolume* ThermalShieldFacesheet_log = new G4LogicalVolume + (ThermalShieldFacesheet_sol, CFRP, "ThermalShieldFacesheet_log"); + G4VPhysicalVolume* ThermalShieldFacesheet_phys = new G4PVPlacement(0, + spacecraft_pos + G4ThreeVector + (0,0,+.5*StructTube_hei+UpperDeckCore_thi+2*UpperDeckSkin_thi+ + UpperDeck_zoff+0.5*ThermalShield_thi+ThermalShield_zoff), + "ThermalShieldFacesheet_phys",ThermalShieldFacesheet_log,wld_phys,false,0); + ThermalShieldFacesheet_log->SetVisAttributes(red_vat); + // Thermal Shield: core + // Honeycomb core is represented by Al6061 at 0.05 g/cm3 + G4Tubs* ThermalShieldCore_sol = new G4Tubs("ThermalShieldCore_sol", + 0., 0.5*UpperDeck_dia, 0.5*ThermalShieldCore_thi, 0., 360.*deg); + G4LogicalVolume* ThermalShieldCore_log = new G4LogicalVolume + (ThermalShieldCore_sol, AlHoneycomb, "ThermalShieldCore_log"); + G4VPhysicalVolume* ThermalShieldCore_phys = new G4PVPlacement(0, + G4ThreeVector(0,0,.5*ThermalShieldFacesheet_thi+.5*ThermalShieldCore_thi), + "ThermalShieldCore_phys", ThermalShieldCore_log, + ThermalShieldFacesheet_phys, false, 0); + ThermalShieldCore_log->SetVisAttributes(red_vat); +// Thermal Shield: foam + G4Tubs* ThermalShieldFoam_sol = new G4Tubs("ThermalShieldFoam_sol", + 0., 0.5*UpperDeck_dia, 0.5*ThermalShieldFoam_thi, 0., 360.*deg); + G4LogicalVolume* ThermalShieldFoam_log = new G4LogicalVolume + (ThermalShieldFoam_sol, foam, "ThermalShieldFoam_log"); + G4VPhysicalVolume* ThermalShieldFoam_phys = new G4PVPlacement(0, + G4ThreeVector(0,0,-.5*ThermalShieldFacesheet_thi-.5*ThermalShieldFoam_thi), + "ThermalShieldFoam_phys", ThermalShieldFoam_log, + ThermalShieldFacesheet_phys, false, 0); + ThermalShieldFoam_log->SetVisAttributes(red_vat); + + + + // Solar Array and OSR Assy ************************************************* + + // Solar Array: 13.5 kg + // Thickness for correct mass + G4Tubs* SolarArray_sol = new G4Tubs("SolarArray_sol", + SolarArray_i, SolarArray_o, 0.5*SolarArray_thi, 0., 360.*deg); + G4LogicalVolume* SolarArray_log = new G4LogicalVolume + (SolarArray_sol, Scell, "SolarArray_log"); + G4VPhysicalVolume* SolarArray_phys = new G4PVPlacement(0, spacecraft_pos + + G4ThreeVector(0,0,+.5*StructTube_hei+UpperDeckCore_thi+2*UpperDeckSkin_thi+ + UpperDeck_zoff+ThermalShield_thi+ThermalShield_zoff+0.5*SolarArray_thi), + "SolarArray_phys",SolarArray_log, wld_phys, false, 0); + SolarArray_log->SetVisAttributes(lblue_vat); + // Optical Solar Reflector: NO MASS + G4Tubs* OSRAssy_sol = new G4Tubs("OSRAssy_sol", + 0., OSRAssy_o, 0.5*OSRAssy_thi, 0., 360.*deg); + G4LogicalVolume* OSRAssy_log = new G4LogicalVolume + (OSRAssy_sol, vacuum, "OSRAssy_log"); + G4VPhysicalVolume* OSRAssy_phys = new G4PVPlacement(0, spacecraft_pos + + G4ThreeVector(0,0,+.5*StructTube_hei+UpperDeckCore_thi+2*UpperDeckSkin_thi+ + UpperDeck_zoff+ThermalShield_thi+ThermalShield_zoff+0.5*OSRAssy_thi), + "OSRAssy_phys",OSRAssy_log, wld_phys, false, 0); + OSRAssy_log->SetVisAttributes(lblue_vat); + + + + // Radiator Panels ********************************************************** + + // Radiator Panels: 3*3.87 kg + // Thickess adjusted for correct mass of FS+Core+FS + G4Cons* RadPanel_con = new G4Cons("RadPanel_con", + 0.5*RadPanel_bot-RadPanel_thi, 0.5*RadPanel_bot, + 0.5*RadPanel_top-RadPanel_thi, 0.5*RadPanel_top, + 0.5*RadPanel_len, 0.*deg, 360.*deg); + // window cutouts + G4Tubs* RadPanelCutout_tub = new G4Tubs("RadPanelCutout_tub", 0., + 0.5*RadPanelCutout1_dia, 2*RadPanelCutout1_len, 0., 360.*deg); + G4RotationMatrix SMS_rot8; SMS_rot8.rotateY(90.*deg); + G4SubtractionSolid* RadPanel1_sol = + new G4SubtractionSolid("RadPanel1_sol", RadPanel_con, + RadPanelCutout_tub, G4Transform3D(SMS_rot8, + G4ThreeVector(-RadPanelCutout_roff,0,0))); + G4RotationMatrix SMS_rot9; + SMS_rot9.rotateY(90.*deg); SMS_rot9.rotateZ(49.*deg); + G4SubtractionSolid* RadPanel2_sol = + new G4SubtractionSolid("RadPanel2_sol", RadPanel1_sol, + RadPanelCutout_tub, G4Transform3D(SMS_rot9, G4ThreeVector + (RadPanelCutout_roff*sin(49.*deg),RadPanelCutout_roff*cos(49.*deg),0))); + G4RotationMatrix SMS_rot10; + SMS_rot10.rotateY(90.*deg); SMS_rot10.rotateZ(131.*deg); + G4SubtractionSolid* RadPanel3_sol = + new G4SubtractionSolid("RadPanel3_sol", RadPanel2_sol, + RadPanelCutout_tub, G4Transform3D(SMS_rot10, G4ThreeVector + (RadPanelCutout_roff*sin(131.*deg),RadPanelCutout_roff*cos(131.*deg),0))); + // box cutouts + G4Box* RadPanelCutout_box = new G4Box("RadPanelCutout_box", + 0.5*RadPanelCutout2_len, 0.5*RadPanelCutout2_wid, 0.5*RadPanelCutout2_hei); + G4SubtractionSolid* RadPanel4_sol = + new G4SubtractionSolid("RadPanel4_sol", RadPanel3_sol, + RadPanelCutout_box, G4Transform3D(G4RotationMatrix(), G4ThreeVector + (RadPanelCutout_roff,0,RadPanelCutout2_zoff))); + G4RotationMatrix SMS_rot11; SMS_rot11.rotateZ(+120.*deg); + G4SubtractionSolid* RadPanel5_sol = + new G4SubtractionSolid("RadPanel5_sol", RadPanel4_sol, + RadPanelCutout_box, G4Transform3D(SMS_rot11, + G4ThreeVector(RadPanelCutout_roff*cos(120.*deg), + RadPanelCutout_roff*sin(120.*deg), RadPanelCutout2_zoff))); + G4RotationMatrix SMS_rot12; SMS_rot12.rotateZ(-120.*deg); + G4SubtractionSolid* RadPanel6_sol = + new G4SubtractionSolid("RadPanel6_sol", RadPanel5_sol, + RadPanelCutout_box, G4Transform3D(SMS_rot12, + G4ThreeVector(RadPanelCutout_roff*cos(-120.*deg), + RadPanelCutout_roff*sin(-120.*deg), RadPanelCutout2_zoff))); + G4LogicalVolume* RadPanel_log = + new G4LogicalVolume(RadPanel6_sol, Al6061, "RadPanel_log"); + G4VPhysicalVolume* RadPanel_phys = + new G4PVPlacement(0, spacecraft_pos + G4ThreeVector(0,0,0), + "RadPanel_phys", RadPanel_log, wld_phys, false, 0); + RadPanel_log->SetVisAttributes(sol_white_vat); + +//***************************************************************************** + + + // invisible spacecraft top + if(0) { + UpperDeckSkin_log->SetVisAttributes(G4VisAttributes::Invisible); + UpperDeckCore_log->SetVisAttributes(G4VisAttributes::Invisible); + ThermalShieldFacesheet_log->SetVisAttributes(G4VisAttributes::Invisible); + ThermalShieldCore_log->SetVisAttributes(G4VisAttributes::Invisible); + ThermalShieldFoam_log->SetVisAttributes(G4VisAttributes::Invisible); + // SolarArray_log->SetVisAttributes(G4VisAttributes::Invisible); + OSRAssy_log->SetVisAttributes(G4VisAttributes::Invisible); + } + + // solid spacecraft top + if(0) { + UpperDeckSkin_log->SetVisAttributes(sol_white_vat); + UpperDeckCore_log->SetVisAttributes(sol_white_vat); + ThermalShieldFacesheet_log->SetVisAttributes(sol_red_vat); + ThermalShieldCore_log->SetVisAttributes(sol_red_vat); + ThermalShieldFoam_log->SetVisAttributes(sol_red_vat); + SolarArray_log->SetVisAttributes(sol_lblue_vat); + OSRAssy_log->SetVisAttributes(sol_lgreen_vat); + } + +//***************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISASensorHousing.icc b/examples/advanced/cosmicray_charging/src/LISASensorHousing.icc new file mode 100644 index 0000000000..eb57ad366e --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISASensorHousing.icc @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +//************************************************************************* +// Sensor Vacuum Housing (TiAlloy) +// Modified to contain LTP Inertial Sensor and Caging Mechanism +//************************************************************************* + + + // Sensor housing + G4double SensorHousing_thi = 5.0*mm; + G4double SensorHousing_yoff = +30.0*mm; + // original dimentions + // G4double SensorHousing_len = 170.0*mm; + // G4double SensorHousing_wid = 120.0*mm; + // G4double SensorHousing_hei = 120.0*mm; + G4double SensorHousing_dia = 125.0*mm; + G4double SensorHousing_hei = 224.0*mm; + + + // Sensor vacuum housing **************************************************** + + // // Outer dimensions as shown in Solid Model Document + // G4Box* SensorHousing_o_sol = new G4Box("SensorHousing_o_sol", + // 0.5*SensorHousing_len, 0.5*SensorHousing_hei, 0.5*SensorHousing_wid); + // G4LogicalVolume* SensorHousing_o_log = + // new G4LogicalVolume(SensorHousing_o_sol, TiAlloy,"SensorHousing_o_log"); + // G4VPhysicalVolume* SensorHousing_o_phys = new G4PVPlacement(G4Transform3D + // (IS_rot, G4ThreeVector(0,SensorHousing_yoff,OpticalBench_off)), + // "SensorHousing_o_phys", SensorHousing_o_log, wld_phys, false, 0); + // G4Box* SensorHousing_i_sol = new G4Box("SensorHousing_i_sol", + // 0.5*SensorHousing_len-SensorHousing_thi, + // 0.5*SensorHousing_hei-SensorHousing_thi, + // 0.5*SensorHousing_wid-SensorHousing_thi); + // G4LogicalVolume* SensorHousing_i_log = + // new G4LogicalVolume(SensorHousing_i_sol, vacuum, "SensorHousing_i_log"); + // G4VPhysicalVolume* SensorHousing_i_phys = new G4PVPlacement + // (0, G4ThreeVector(0,0,0), "SensorHousing_i_phys", + // SensorHousing_i_log, SensorHousing_o_phys, false, 0); + // SensorHousing_o_log->SetVisAttributes(blue_vat); + // SensorHousing_i_log->SetVisAttributes(blue_vat); + + + // Modified to contain LTP Inertial Sensor and Caging Mechanism + G4Tubs* SensorHousing_o_sol = new G4Tubs("SensorHousing_o_sol", + 0., 0.5*SensorHousing_dia, 0.5*SensorHousing_hei, 0., 360.*deg); + G4LogicalVolume* SensorHousing_o_log = + new G4LogicalVolume(SensorHousing_o_sol, TiAlloy, "SensorHousing_o_log"); + G4VPhysicalVolume* SensorHousing_o_phys = new G4PVPlacement(G4Transform3D + (IS_rot, G4ThreeVector(0,SensorHousing_yoff,OpticalBench_off)), + "SensorHousing_o_phys", SensorHousing_o_log, TelBox_phys, false, 0); + G4Tubs* SensorHousing_i_sol = new G4Tubs("SensorHousing_i_sol", + 0., 0.5*SensorHousing_dia - SensorHousing_thi, 0.5*SensorHousing_hei + - SensorHousing_thi, 0., 360.*deg); + G4LogicalVolume* SensorHousing_i_log = + new G4LogicalVolume(SensorHousing_i_sol, vacuum, "SensorHousing_i_log"); + G4VPhysicalVolume* SensorHousing_i_phys = new G4PVPlacement + (0, G4ThreeVector(0,0,0), "SensorHousing_i_phys", + SensorHousing_i_log, SensorHousing_o_phys, false, 0); + SensorHousing_o_log->SetVisAttributes(blue_vat); + SensorHousing_i_log->SetVisAttributes(blue_vat); + + +//***************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISAStackingAction.cc b/examples/advanced/cosmicray_charging/src/LISAStackingAction.cc new file mode 100644 index 0000000000..d18d38514d --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAStackingAction.cc @@ -0,0 +1,164 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAStackingAction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISAStackingAction.hh" + +#include "LISAStackingActionMessenger.hh" + +#include "G4Track.hh" +#include "G4TrackStatus.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleTypes.hh" +#include + +LISAStackingAction::LISAStackingAction() { + + // messenger defaults + PrimarySurveyFlag = false; + ParticleSurveyFlag = false; + + // create messenger + stackingMessenger = new LISAStackingActionMessenger(this); + +} + + +LISAStackingAction::~LISAStackingAction() { + + delete stackingMessenger; + +} + + +G4ClassificationOfNewTrack LISAStackingAction::ClassifyNewTrack +(const G4Track* aTrack) { + + + // write primary spectrum to file + if(PrimarySurveyFlag) { + if(!aTrack->GetParentID()) { + G4double energy = aTrack->GetKineticEnergy(); + std::ofstream primaries("primaries.out",std::ios::app); + primaries << energy/MeV << G4endl; + return (G4ClassificationOfNewTrack) fKill; + } + } + + // Particle Survey + if(ParticleSurveyFlag) { + G4String particle = aTrack->GetDefinition()->GetParticleName(); + G4double energy = aTrack->GetKineticEnergy(); + // + // gammas above 1 MeV + if(particle=="gamma" && energy>1*MeV) { + std::ofstream gammas("gammas.out",std::ios::app); + gammas << energy/MeV << G4endl; + } + // electrons and positrons above 1 MeV + else if((particle=="e-" || particle=="e+") && energy>1.*MeV) { + std::ofstream electrons("electrons.out",std::ios::app); + electrons << energy/MeV << G4endl; + } + // delta electrons + // else if(particle=="e-" && aTrack->GetParentID()>0) { + // std::ofstream deltas("deltas.out",std::ios::app); + // deltas << energy/eV << G4endl; + // return (G4ClassificationOfNewTrack) fKill; + // } + // + // neutrons + else if(particle=="neutron") { + std::ofstream neutrons("neutrons.out",std::ios::app); + neutrons << energy/MeV << G4endl; + } + // pions + else if(particle=="pi+" || particle=="pi-" || particle=="pi0") { + std::ofstream pions("pions.out",std::ios::app); + pions << energy/MeV << G4endl; + } + // fragments (energy per nucleon) + else if(particle=="deuteron" || particle=="triton" || + particle=="He3" || particle=="alpha") { + G4int A = aTrack->GetDefinition()->GetBaryonNumber(); + std::ofstream fragments("fragments.out",std::ios::app); + fragments << energy/A/MeV << G4endl; + } + // muons + else if(particle=="mu+" || particle=="mu-") { + std::ofstream muons("muons.out",std::ios::app); + muons << energy/MeV << G4endl; + } + // kaons + else if(particle=="kaon+" || particle=="kaon-" || + particle=="kaon0S" || particle=="kaon0L" ) { + std::ofstream kaons("kaons.out",std::ios::app); + kaons << energy/MeV << G4endl; + } + // nuclei (energy per nucleon) + else if(aTrack->GetDefinition()->GetParticleType()=="nucleus") { + G4int A = aTrack->GetDefinition()->GetBaryonNumber(); + std::ofstream nuclei("nuclei.out",std::ios::app); + nuclei << energy/A/MeV << "\t" << particle << G4endl; + } + // others + else if(particle!="proton" && energy>1.*MeV) { + std::ofstream others("others.out",std::ios::app); + others << energy/MeV << "\t" << particle << G4endl; + } + + } + + + return (G4ClassificationOfNewTrack) fWaiting; + +} + + +void LISAStackingAction::NewStage() {;} + + +void LISAStackingAction::PrepareNewEvent() {;} + + + + + + + diff --git a/examples/advanced/cosmicray_charging/src/LISAStackingActionMessenger.cc b/examples/advanced/cosmicray_charging/src/LISAStackingActionMessenger.cc new file mode 100644 index 0000000000..e667a39d5e --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAStackingActionMessenger.cc @@ -0,0 +1,107 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAStackingActionMessenger class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISAStackingActionMessenger.hh" + +#include "LISAStackingAction.hh" + + +LISAStackingActionMessenger::LISAStackingActionMessenger + (LISAStackingAction* stackAct) : stackingAction(stackAct){ + + // set flag for primaries survey + SetPriSurvey = new G4UIcmdWithABool("/surveys/surveyPrimaries",this); + SetPriSurvey->SetGuidance + ("Dump primary energies (MeV) to file 'primaries.out'"); + SetPriSurvey->SetGuidance("Default = false"); + SetPriSurvey->SetParameterName("SurveyPrimariesFlag", false); + SetPriSurvey->AvailableForStates(G4State_Idle); + + // set flag for particle survey + SetPartSurvey = new G4UIcmdWithABool("/surveys/surveyParticles",this); + SetPartSurvey->SetGuidance("Dump particle energies to different files"); + SetPartSurvey->SetGuidance("Fragments and nuclei in MeV/nucleon, other in MeV."); + SetPartSurvey->SetGuidance("'gammas.out': gammas above 1 MeV"); + SetPartSurvey->SetGuidance("'electrons.out': e- and e+ above 1 MeV"); + SetPartSurvey->SetGuidance("'neutrons.out': all neutrons"); + SetPartSurvey->SetGuidance("'pions.out': all pions"); + SetPartSurvey->SetGuidance("'muons.out': all muons"); + SetPartSurvey->SetGuidance("'kaons.out': all kaons"); + SetPartSurvey->SetGuidance("'fragments.out': 2H, 3H, He3, alphas"); + SetPartSurvey->SetGuidance("'nuclei.out': all nuclei"); + SetPartSurvey->SetGuidance("'others.out': others above 1 MeV"); + SetPartSurvey->SetGuidance("Default = false"); + SetPartSurvey->SetParameterName("SurveyParticlesFlag", false); + SetPartSurvey->AvailableForStates(G4State_Idle); + +} + + +LISAStackingActionMessenger::~LISAStackingActionMessenger() { + + delete SetPriSurvey; + delete SetPartSurvey; + +} + + +void LISAStackingActionMessenger::SetNewValue + (G4UIcommand* command, G4String newValue) { + + if(command == SetPriSurvey) { + G4int vl; + const char* t = newValue; + std::istrstream is((char*)t); + is >> vl; + stackingAction->SetPrimarySurvey(vl!=0); + } + + else if(command == SetPartSurvey) { + G4int vl; + const char* t = newValue; + std::istrstream is((char*)t); + is >> vl; + stackingAction->SetParticleSurvey(vl!=0); + } + + + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISASteppingAction.cc b/examples/advanced/cosmicray_charging/src/LISASteppingAction.cc new file mode 100644 index 0000000000..4c1cb11b9a --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISASteppingAction.cc @@ -0,0 +1,178 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISASteppingAction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +#include "LISASteppingAction.hh" + +#include "LISASteppingActionMessenger.hh" + +#include "G4Step.hh" +#include "G4Track.hh" +#include "G4TrackStatus.hh" +#include "G4StepPoint.hh" +#include "G4ParticleDefinition.hh" +#include "G4DynamicParticle.hh" +#include "G4ParticleTypes.hh" +#include "G4VPhysicalVolume.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" + +#include "globals.hh" +#include "G4ios.hh" +#include + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISASteppingAction::LISASteppingAction() { + + charge_in[0] = 0; + charge_in[1] = 0; + charge_out[0] = 0; + charge_out[1] = 0; + + // defaults + FlagSpectrum = false; + + // create messenger + steppingMessenger = new LISASteppingActionMessenger(this); + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +LISASteppingAction::~LISASteppingAction() { + + delete steppingMessenger; + +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void LISASteppingAction::UserSteppingAction(const G4Step* fStep) { + + if(fStep->GetTrack()->GetNextVolume()) { + + // step points + G4TouchableHistory* thePreTouchable = + (G4TouchableHistory*)(fStep->GetPreStepPoint()->GetTouchable()); + G4TouchableHistory* thePostTouchable = + (G4TouchableHistory*)(fStep->GetPostStepPoint()->GetTouchable()); + G4String PreVol = thePreTouchable->GetVolume()->GetName(); + G4String PosVol = thePostTouchable->GetVolume()->GetName(); + + // particle + G4double charge = fStep->GetTrack()->GetDefinition()->GetPDGCharge(); + G4String pName = fStep->GetTrack()->GetDefinition()->GetParticleName(); + G4double energy = fStep->GetTrack()->GetKineticEnergy(); + + G4int tm = -1; + + + // *** entering a test mass *** + if(PreVol!="tmass_phys" && PosVol=="tmass_phys") { + + tm = thePostTouchable->GetReplicaNumber(6); + + charge_in[tm] += (int)charge; + + // energy spectra at test-mass boundary + if(FlagSpectrum) { + // electrons entering test mass + if(pName=="e-") { + std::ofstream electrons_in("electrons_in.out",std::ios::app); + electrons_in << energy/eV << G4endl; + } + // hadrons entering test mass + else if(pName=="proton" || + pName=="pi+" || pName=="pi-" || + pName=="deuteron" || pName=="He3" || + pName=="alpha" || pName=="triton") { + std::ofstream hadrons_in("hadrons_in.out",std::ios::app); + hadrons_in << energy/eV << G4endl; + } + } + + } // *** entering a test mass *** + + + // *** leaving a test mass *** + else if(PreVol!=PosVol && PreVol=="tmass_phys") { + + tm = thePreTouchable->GetReplicaNumber(6); + + charge_out[tm] += (int)charge; + + // energy spectra at test-mass boundary + if(FlagSpectrum) { + // electrons leaving test mass + if(pName=="e-") { + std::ofstream electrons_out("electrons_out.out",std::ios::app); + electrons_out << energy/eV << G4endl; + } + // hadrons leaving test mass + else if(pName=="proton" || + pName=="pi+" || pName=="pi-" || + pName=="deuteron" || pName=="He3" || + pName=="alpha" || pName=="triton") { + std::ofstream hadrons_out("hadrons_out.out",std::ios::app); + hadrons_out << energy/eV << G4endl; + } + } + + } // *** leaving a test mass *** + + + } // if(next volume) + + + // count particles hitting probe volume + // if(fStep->GetTrack()->GetNextVolume()) { + // static int i=0; + // G4String PosVol=fStep->GetPostStepPoint() + // ->GetPhysicalVolume()->GetName(); + // if(PosVol=="probe_phys") { + // fStep->GetTrack()->SetTrackStatus(fStopAndKill); + // G4cout << i++ << G4endl; + // } + // } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/examples/advanced/cosmicray_charging/src/LISASteppingActionMessenger.cc b/examples/advanced/cosmicray_charging/src/LISASteppingActionMessenger.cc new file mode 100644 index 0000000000..dbc92da0e6 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISASteppingActionMessenger.cc @@ -0,0 +1,89 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISASteppingActionMessenger class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + +#include "LISASteppingActionMessenger.hh" + +#include "LISASteppingAction.hh" + + +LISASteppingActionMessenger::LISASteppingActionMessenger + (LISASteppingAction* stepAct) : steppingAction(stepAct){ + + + newDir = new G4UIdirectory("/surveys/"); + newDir->SetGuidance("Particle survey control commands."); + + // set flag for spectrum saving + SetFlagSpectrum = new G4UIcmdWithABool("/surveys/surveyTestMasses",this); + SetFlagSpectrum->SetGuidance("Dump energies (eV) for e- and hadrons"); + SetFlagSpectrum->SetGuidance("entering and leaving the test masses."); + SetFlagSpectrum->SetGuidance("'electrons_in.out' : e- entering TM"); + SetFlagSpectrum->SetGuidance("'electrons_out.out': e- leaving TM"); + SetFlagSpectrum->SetGuidance("'hadrons_in.out' : hadrons entering TM"); + SetFlagSpectrum->SetGuidance("'hadrons_out.out' : hadrons leaving TM"); + SetFlagSpectrum->SetGuidance("Default = false"); + SetFlagSpectrum->SetParameterName("FlagSpectrum", false); + SetFlagSpectrum->AvailableForStates(G4State_Idle); + +} + + +LISASteppingActionMessenger::~LISASteppingActionMessenger() { + + delete SetFlagSpectrum; + delete newDir; + +} + + +void LISASteppingActionMessenger::SetNewValue + (G4UIcommand* command, G4String newValue) { + + if(command == SetFlagSpectrum) { + G4int vl; + const char* t = newValue; + std::istrstream is((char*)t); + is >> vl; + steppingAction->SetFlagSpectrum(vl!=0); + } + + + +} + diff --git a/examples/advanced/cosmicray_charging/src/LISASupportSystems.icc b/examples/advanced/cosmicray_charging/src/LISASupportSystems.icc new file mode 100644 index 0000000000..a2dca9569a --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISASupportSystems.icc @@ -0,0 +1,206 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISADetectorConstruction class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + + +//*************************************************************************** +// Support systems +//*************************************************************************** +// Star Trackers +// FEEP Thrusters +// Communications Antennas +//*************************************************************************** + + + // Star Trackers ************************************************************ + + G4double ST_rad = 0.5*2270*mm; + G4RotationMatrix ST_rot1; ST_rot1.rotateZ(+30.*deg); + G4ThreeVector ST_pos1(ST_rad*cos(56*deg),+ST_rad*sin(56*deg),180.*mm); + G4RotationMatrix ST_rot2; ST_rot2.rotateZ(-30.*deg); + G4ThreeVector ST_pos2(ST_rad*cos(56*deg),-ST_rad*sin(56*deg),180.*mm); + G4RotationMatrix ST_rot3; ST_rot3.rotateY(90.*deg); + + // Star Tracker: 2 kg + G4double StarTracker_dia_o = 100.*mm; + G4double StarTracker_dia_i = 40.*mm; + G4double StarTracker_len = 120.*mm; + // Bracket: 0.25 kg + G4double StarTrackerBracket_wid = 120.*mm; + G4double StarTrackerBracket_hei = 104.*mm; + G4double StarTrackerBracket_thi = 7.5*mm; + + G4Tubs* StarTracker_tub = new G4Tubs("StarTracker_tub",0.5*StarTracker_dia_i, + 0.5*StarTracker_dia_o, 0.5*StarTracker_len, 0., 360.*deg); + G4Box* StarTrackerBracket_box = new G4Box("StarTrackerBracket_box", + 0.5*StarTrackerBracket_thi, 0.5*StarTrackerBracket_wid, + 0.5*StarTrackerBracket_hei); + G4UnionSolid* StarTracker_sol = new G4UnionSolid("StarTracker_sol", + StarTrackerBracket_box, StarTracker_tub, G4Transform3D(ST_rot3, + G4ThreeVector(0.5*(StarTracker_len + StarTrackerBracket_thi),0,0))); + G4LogicalVolume* StarTracker_log = + new G4LogicalVolume(StarTracker_sol, Al6061, "StarTracker_log"); + G4VPhysicalVolume* StarTracker_phys; + StarTracker_phys = new G4PVPlacement(G4Transform3D(ST_rot1, spacecraft_pos + + ST_pos1), "StarTracker_phys", StarTracker_log, wld_phys, false, 0); + StarTracker_phys = new G4PVPlacement(G4Transform3D(ST_rot2, spacecraft_pos + + ST_pos2), "StarTracker_phys", StarTracker_log, wld_phys, false, 1); + StarTracker_log->SetVisAttributes(sol_cyan_vat); + + + + // FEEP Thrusters *********************************************************** + + G4double FEEP_rad = 0.5*2520*mm; + G4RotationMatrix FEEP_rot1; + FEEP_rot1.rotateZ(-90.*deg); FEEP_rot1.rotateX(180.*deg); + G4ThreeVector FEEP_pos1(FEEP_rad,0,170.*mm); + G4RotationMatrix FEEP_rot2; + FEEP_rot2.rotateZ(+30.*deg); FEEP_rot2.rotateX(180.*deg); + G4ThreeVector FEEP_pos2(-FEEP_rad*cos(60*deg),-FEEP_rad*sin(60*deg),170.*mm); + G4RotationMatrix FEEP_rot3; + FEEP_rot3.rotateZ(150.*deg); FEEP_rot3.rotateX(180.*deg); + G4ThreeVector FEEP_pos3(-FEEP_rad*cos(60*deg),+FEEP_rad*sin(60*deg),170.*mm); + + // 1 support + 2 FEEPs: ~11 kg + G4double FEEP_dia_o = 140.*mm; + G4double FEEP_dia_i = 130.*mm; + G4double FEEP_len = 105.*mm; + G4double FEEP_xoff = 110.*mm; + G4double FEEP_yoff = 70.*mm; + G4double FEEP_zoff = 15.*mm; + G4double FEEPSup_len = 245.*mm; + G4double FEEPSup_wid = 276.*mm; + G4double FEEPSup_hei = 146.*mm; + G4double FEEPCut1_wid = 31.*mm; + G4double FEEPCut1_yoff = 50.*mm; + G4double FEEPCut2_len = 70.*mm; + G4double FEEPCut2_zoff = 10.*mm; + G4double FEEPCut3_xoff = 140.*mm; + + G4RotationMatrix FEEP_rot4; + FEEP_rot4.rotateY((90.+15.)*deg); FEEP_rot4.rotateZ(-25.*deg); + G4RotationMatrix FEEP_rot5; + FEEP_rot5.rotateY((90.-15.)*deg); FEEP_rot5.rotateZ(+25.*deg); + + // Mounting bracket + G4Box* FEEP_sol1 = new G4Box("FEEP_sol1", + 0.5*FEEPSup_wid, 0.5*FEEPSup_len, 0.5*FEEPSup_hei); + G4Box* FEEPSupCutout1 = new G4Box("FEEPSupCutout1", + 0.5*FEEPCut1_wid, 0.5*FEEPSup_len, 0.6*FEEPSup_hei); + G4SubtractionSolid* FEEP_sol2 = new G4SubtractionSolid("FEEP_sol2", + FEEP_sol1, FEEPSupCutout1, G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0, -FEEPCut1_yoff, 0.))); + G4Box* FEEPSupCutout2 = new G4Box("FEEPSupCutout2", + 0.6*FEEPSup_wid, 0.5*FEEPCut2_len, 0.51*FEEPSup_hei); + G4SubtractionSolid* FEEP_sol3 = new G4SubtractionSolid("FEEP_sol3", + FEEP_sol2, FEEPSupCutout2, G4Transform3D(G4RotationMatrix(), + G4ThreeVector(0,-0.5*FEEPSup_len+0.5*FEEPCut2_len-.5*mm, FEEPCut2_zoff))); + G4Box* FEEPSupCutout3 = new G4Box("FEEPSupCutout3", + FEEPSup_wid, FEEPSup_hei, FEEPCut2_len); + G4SubtractionSolid* FEEP_sol4 = new G4SubtractionSolid("FEEP_sol4", + FEEP_sol3, FEEPSupCutout3, G4Transform3D(FEEP_rot4, + G4ThreeVector(-FEEPCut3_xoff,FEEPCut2_len,0))); + G4SubtractionSolid* FEEP_sol5 = new G4SubtractionSolid("FEEP_sol5", + FEEP_sol4, FEEPSupCutout3, G4Transform3D(FEEP_rot5, + G4ThreeVector(+FEEPCut3_xoff,FEEPCut2_len,0))); + // FEEPs + G4Tubs* FEEP_tub = new G4Tubs("FEEP_tub", 0.5*FEEP_dia_i, 0.5*FEEP_dia_o, + 0.5*FEEP_len, 0., 360.*deg); + G4UnionSolid* FEEP_sol6 = new G4UnionSolid("FEEP_sol", + FEEP_sol5, FEEP_tub, G4Transform3D(FEEP_rot4, + G4ThreeVector(-FEEP_xoff,FEEP_yoff,FEEP_zoff))); + G4UnionSolid* FEEP_sol7 = new G4UnionSolid("FEEP_sol", + FEEP_sol6, FEEP_tub, G4Transform3D(FEEP_rot5, + G4ThreeVector(+FEEP_xoff,FEEP_yoff,FEEP_zoff))); + G4LogicalVolume* FEEP_log = + new G4LogicalVolume(FEEP_sol7, Al6061, "FEEP_log"); + G4VPhysicalVolume* FEEP_phys; + FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot1, + spacecraft_pos+FEEP_pos1), "FEEP_phys", FEEP_log, wld_phys, false, 0); + FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot2, + spacecraft_pos+FEEP_pos2), "FEEP_phys", FEEP_log, wld_phys, false, 1); + FEEP_phys = new G4PVPlacement(G4Transform3D(FEEP_rot3, + spacecraft_pos+FEEP_pos3), "FEEP_phys", FEEP_log, wld_phys, false, 2); + FEEP_log->SetVisAttributes(sol_cyan_vat); + + + // Communications Antennas ************************************************** + + + // Antenna dish: ~1.4 kg + G4double Antenna_dia = 295.*mm; + G4double Antenna_thi = 7.*mm; + G4double Antenna_rad = 300.*mm; + // Antenna mount: 1 kg cylindrical shell + G4double AntennaMount_dia_o = 90.*mm; + G4double AntennaMount_dia_i = 77.*mm; + G4double AntennaMount_len = 220.*mm; + + G4ThreeVector ant_pos1(Antenna_rad+0*mm,+1250*mm,+550.*mm); + G4ThreeVector ant_pos2(Antenna_rad-0*mm,-1250*mm,+550.*mm); + G4RotationMatrix ant_rot3; ant_rot3.rotateY(-90.*deg); + + // Dish + G4Sphere* Antenna_sol = new G4Sphere("Antenna_sol", Antenna_rad-Antenna_thi, + Antenna_rad, 0., 360.*deg, 0, asin(0.5*Antenna_dia/Antenna_rad)); + G4LogicalVolume* Antenna_log = new G4LogicalVolume + (Antenna_sol, Al6061, "Antenna_log"); + G4VPhysicalVolume* Antenna_phys; + Antenna_phys = new G4PVPlacement(G4Transform3D(ant_rot3, spacecraft_pos + + ant_pos1), "Antenna_phys", Antenna_log, wld_phys, false, 0); + Antenna_phys = new G4PVPlacement(G4Transform3D(ant_rot3, spacecraft_pos + + ant_pos2), "Antenna_phys", Antenna_log, wld_phys, false, 1); + Antenna_log->SetVisAttributes(sol_cyan_vat); + + // Mount + G4Tubs* AntennaMount_tub = new G4Tubs("AntennaMount_sol", + 0.5*AntennaMount_dia_i, 0.5*AntennaMount_dia_o, 0.5*AntennaMount_len, + 0., 360.*deg); + G4LogicalVolume* AntennaMount_log = new G4LogicalVolume + (AntennaMount_tub, Al6061, "AntennaMount_log"); + G4VPhysicalVolume* AntennaMount_phys; + AntennaMount_phys = new G4PVPlacement(0, spacecraft_pos+ant_pos1+ + G4ThreeVector(-Antenna_rad-60.*mm,0,-80.*mm), + "AntennaMount_phys", AntennaMount_log, wld_phys, false, 0); + AntennaMount_phys = new G4PVPlacement(0, spacecraft_pos+ant_pos2+ + G4ThreeVector(-Antenna_rad-60.*mm,0,-80.*mm), + "AntennaMount_phys", AntennaMount_log, wld_phys, false, 1); + AntennaMount_log->SetVisAttributes(sol_cyan_vat); + +//***************************************************************************** diff --git a/examples/advanced/cosmicray_charging/src/LISAVisManager.cc b/examples/advanced/cosmicray_charging/src/LISAVisManager.cc new file mode 100644 index 0000000000..a29f919215 --- /dev/null +++ b/examples/advanced/cosmicray_charging/src/LISAVisManager.cc @@ -0,0 +1,160 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// * * +// * cosmicray_charging advanced example for Geant4 * +// * (adapted simulation of test-mass charging in the LISA mission) * +// * * +// * Henrique Araujo (h.araujo@imperial.ac.uk) & Peter Wass * +// * Imperial College London * +// * * +// * LISAVisManager class * +// * * +// ******************************************************************** +// +// HISTORY +// 22/02/2004: migrated from LISA-V04 +// +// ******************************************************************** + +#ifdef G4VIS_USE + +#include "LISAVisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPACS +#include "G4Wo.hh" +#include "G4Xo.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +LISAVisManager::LISAVisManager () {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void LISAVisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPACS + RegisterGraphicsSystem (new G4Wo); + RegisterGraphicsSystem (new G4Xo); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/gammaray_telescope/History b/examples/advanced/gammaray_telescope/History new file mode 100644 index 0000000000..d3213adf86 --- /dev/null +++ b/examples/advanced/gammaray_telescope/History @@ -0,0 +1,13 @@ +------------------------------------------------------------------- +$Id: History,v 1.1 2004/06/01 06:59:38 guatelli Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - gammaray_telescope + ========================================================= + + Category History file + --------------------- + +1.06.2004 - Susanna Guatelli + Migration to AIDA 3.2.1 and PI 1.2.1 diff --git a/examples/advanced/gammaray_telescope/README b/examples/advanced/gammaray_telescope/README index 7aebee8aee..15db5850d6 100644 --- a/examples/advanced/gammaray_telescope/README +++ b/examples/advanced/gammaray_telescope/README @@ -1,4 +1,4 @@ -$Id: README,v 1.19 2003/05/29 13:32:52 flongo Exp $ +$Id: README,v 1.20 2004/06/01 06:59:38 guatelli Exp $ ------------------------------------------------------------------- ========================================================= @@ -75,22 +75,18 @@ The main features of this example are - Setup for Xmotif user interface - setenv G4UI_USE_XM 1 + setenv G4UI_USE_XM 1 - - Set up for analysis using AIDA + - Set up for analysis using AIDA3.2.1 and PI1.2.1 To compile the GammaRayTel example with the analysis tools activated, set the following variables setenv G4ANALYSIS_USE 1 # Use the analysis tools - and be sure to have the right path to the Anaphe library (or to another AIDA - compliant implementation), inserting this on the .tcshrc: - - (on a CERN machine with the gcc-2.95.2 or gcc-3.2 compiler) - - source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/setupAnaphe.csh - setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/ + Users can download the analysis tools from: + > http://aida.freehep.org/ + > http://www.cern.ch/PI 2. Sample run ------------- diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelAnalysis.hh b/examples/advanced/gammaray_telescope/include/GammaRayTelAnalysis.hh index 00b029f186..b54db27494 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelAnalysis.hh +++ b/examples/advanced/gammaray_telescope/include/GammaRayTelAnalysis.hh @@ -22,8 +22,8 @@ // #ifdef G4ANALYSIS_USE // -// $Id: GammaRayTelAnalysis.hh,v 1.16 2003/06/25 10:18:27 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: GammaRayTelAnalysis.hh,v 1.17 2004/06/01 06:59:38 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // ------------------------------------------------------------ // GEANT 4 class header file // CERN Geneva Switzerland @@ -61,13 +61,10 @@ class AIDA::IAnalysisFactory; class AIDA::ITree; class AIDA::IHistogramFactory; class AIDA::ITupleFactory; -class AIDA::IPlotter; +//class AIDA::IPlotter; class AIDA::IHistogram1D; class AIDA::IHistogram2D; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - class GammaRayTelAnalysis { public: virtual ~GammaRayTelAnalysis(); @@ -116,7 +113,7 @@ private: IAnalysisFactory* analysisFactory; ITree* tree; - IPlotter* plotter; + //IPlotter* plotter; ITuple* tuple; IHistogram1D* energy; diff --git a/examples/advanced/gammaray_telescope/include/GammaRayTelDetectorConstruction.hh b/examples/advanced/gammaray_telescope/include/GammaRayTelDetectorConstruction.hh index 50be36e571..c2fa72cfd5 100644 --- a/examples/advanced/gammaray_telescope/include/GammaRayTelDetectorConstruction.hh +++ b/examples/advanced/gammaray_telescope/include/GammaRayTelDetectorConstruction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: GammaRayTelDetectorConstruction.hh,v 1.6 2001/07/11 09:56:56 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: GammaRayTelDetectorConstruction.hh,v 1.7 2004/06/02 15:21:29 flongo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // ------------------------------------------------------------ // GEANT 4 class header file // CERN Geneva Switzerland @@ -44,6 +44,7 @@ class G4LogicalVolume; class G4VPhysicalVolume; class G4Material; class G4UniformMagField; +class G4Region; class GammaRayTelDetectorMessenger; class GammaRayTelTrackerSD; class GammaRayTelAnticoincidenceSD; @@ -264,6 +265,8 @@ private: GammaRayTelCalorimeterSD* calorimeterSD; //pointer to the sensitive detector GammaRayTelAnticoincidenceSD* anticoincidenceSD; //pointer to the sensitive detector + G4Region* aTKRRegion; // TKR cut region + G4Region* aCALRegion; // CAL cut region private: diff --git a/examples/advanced/gammaray_telescope/src/GammaRayTelAnalysis.cc b/examples/advanced/gammaray_telescope/src/GammaRayTelAnalysis.cc index c0f185fd6a..f967a67e10 100644 --- a/examples/advanced/gammaray_telescope/src/GammaRayTelAnalysis.cc +++ b/examples/advanced/gammaray_telescope/src/GammaRayTelAnalysis.cc @@ -22,8 +22,8 @@ // #ifdef G4ANALYSIS_USE // -// $Id: GammaRayTelAnalysis.cc,v 1.19 2003/06/25 10:18:28 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: GammaRayTelAnalysis.cc,v 1.20 2004/06/01 06:59:39 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // ------------------------------------------------------------ // GEANT 4 class implementation file // CERN Geneva Switzerland @@ -62,7 +62,8 @@ GammaRayTelAnalysis* GammaRayTelAnalysis::instance = 0; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... GammaRayTelAnalysis::GammaRayTelAnalysis() -:GammaRayTelDetector(0),analysisFactory(0), tree(0), plotter(0), tuple(0) + :GammaRayTelDetector(0),analysisFactory(0), tree(0)//, plotter(0), + ,tuple(0) ,energy(0), hits(0), posXZ(0), posYZ(0) ,histo1DDraw("enable"),histo1DSave("enable"),histo2DDraw("enable") ,histo2DSave("enable"),histo2DMode("strip") @@ -74,13 +75,11 @@ GammaRayTelAnalysis::GammaRayTelAnalysis() #ifdef G4ANALYSIS_USE // Define the messenger and the analysis system - analysisMessenger = new GammaRayTelAnalysisMessenger(this); + analysisMessenger = new GammaRayTelAnalysisMessenger(this); + analysisFactory = AIDA_createAnalysisFactory(); // create the Analysis Factory - if(analysisFactory) { - - ITreeFactory* treeFactory = analysisFactory->createTreeFactory(); - + AIDA::ITreeFactory* treeFactory = analysisFactory->createTreeFactory(); // create Tree Factory if(treeFactory) { @@ -89,12 +88,9 @@ GammaRayTelAnalysis::GammaRayTelAnalysis() // tree = treeFactory->create("gammaraytel.hbook", "hbook", false, false); // (hbook implementation) - - tree = treeFactory->create("gammaraytel.aida","xml",false,true,"compress=yes"); - + tree = treeFactory->create("gammaraytel.aida","xml",false,true,"uncompress"); if(tree) { // Get a tuple factory : - ITupleFactory* tupleFactory = analysisFactory->createTupleFactory(*tree); if(tupleFactory) { // Create a tuple : @@ -124,18 +120,19 @@ GammaRayTelAnalysis::GammaRayTelAnalysis() // 1D histogram that store the hits distribution along the TKR X-planes hits = histoFactory->createHistogram1D("20","Hits dist in TKR X planes",Nplane, 0, Nplane-1); - // 2D histogram that store the position (mm) of the hits (XZ projection) - if (histo2DMode == "strip") + if (histo2DMode == "strip"){ posXZ = histoFactory->createHistogram2D("30","Tracker Hits XZ (strip,plane)", N, 0, N-1, - 2*Nplane, 0, Nplane-1); + 2*Nplane, 0, Nplane-1); + } else + { posXZ = histoFactory->createHistogram2D("30","Tracker Hits XZ (x,z) in mm", int(sizexy/5), -sizexy/2, sizexy/2, int(sizez/5), -sizez/2, sizez/2); - + } // 2D histogram that store the position (mm) of the hits (YZ projection) if(histo2DMode=="strip") @@ -151,33 +148,30 @@ GammaRayTelAnalysis::GammaRayTelAnalysis() } } - delete treeFactory; // Will not delete the ITree. + } + delete treeFactory; // Will not delete the ITree. + } - IPlotterFactory* plotterFactory = analysisFactory->createPlotterFactory(0,0); - if(plotterFactory) { - plotter = plotterFactory->create(); - if(plotter) { - plotter->show(); - plotter->setParameter("pageTitle","Gamma Ray Tel"); - } - delete plotterFactory; - } - - } - - + // IPlotterFactory* plotterFactory = analysisFactory->createPlotterFactory(0,0); +// if(plotterFactory) { +// plotter = plotterFactory->create(); +// if(plotter) { +// plotter->show(); +// plotter->setParameter("pageTitle","Gamma Ray Tel"); + +// } +// delete plotterFactory; +// } #endif } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... GammaRayTelAnalysis::~GammaRayTelAnalysis() { Finish(); } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void GammaRayTelAnalysis::Init() { @@ -187,7 +181,7 @@ void GammaRayTelAnalysis::Finish() { #ifdef G4ANALYSIS_USE delete tree; - delete plotter; + //delete plotter; // delete analysisFactory; // Will delete tree and histos. delete analysisMessenger; @@ -201,9 +195,6 @@ GammaRayTelAnalysis* GammaRayTelAnalysis::getInstance() return instance; } - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - // This function fill the 2d histogram of the XZ positions void GammaRayTelAnalysis::InsertPositionXZ(double x, double z) { @@ -212,8 +203,6 @@ void GammaRayTelAnalysis::InsertPositionXZ(double x, double z) #endif } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - // This function fill the 2d histogram of the YZ positions void GammaRayTelAnalysis::InsertPositionYZ(double y, double z) { @@ -222,8 +211,6 @@ void GammaRayTelAnalysis::InsertPositionYZ(double y, double z) #endif } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - // This function fill the 1d histogram of the energy released in the last Si plane void GammaRayTelAnalysis::InsertEnergy(double en) { @@ -232,8 +219,6 @@ void GammaRayTelAnalysis::InsertEnergy(double en) #endif } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - // This function fill the 1d histogram of the hits distribution along the TKR planes void GammaRayTelAnalysis::InsertHits(int nplane) { @@ -279,7 +264,7 @@ void GammaRayTelAnalysis::BeginOfRun() /* This member is called at the end of each run */ -void GammaRayTelAnalysis::EndOfRun(G4int n) +void GammaRayTelAnalysis::EndOfRun(G4int) { #ifdef G4ANALYSIS_USE if(tree) { @@ -287,53 +272,46 @@ void GammaRayTelAnalysis::EndOfRun(G4int n) tree->close(); } - if(plotter) { +// if(plotter) { - // We set one single region for the plotter - // We now print the histograms, each one in a separate file +// // We set one single region for the plotter +// // We now print the histograms, each one in a separate file - if(histo2DSave == "enable") { - char name[15]; - plotter->createRegions(1,1); - sprintf(name,"posxz_%d.ps", n); - plotter->currentRegion().plot(*posXZ); - plotter->refresh(); - // plotter->write(name,"ps"); // temporary unavailable +// if(histo2DSave == "enable") { +// char name[15]; +// plotter->createRegions(1,1); +// sprintf(name,"posxz_%d.ps", n); +// plotter->currentRegion().plot(*posXZ); +// plotter->refresh(); +// // plotter->write(name,"ps"); // temporary unavailable - plotter->createRegions(1,1); - sprintf(name,"posyz_%d.ps", n); - plotter->currentRegion().plot(*posYZ); - plotter->next().plot(*posYZ); - plotter->refresh(); - // plotter->write(name,"ps"); // temporary unavailable - } - - if(histo1DSave == "enable") { - plotter->createRegions(1,1); - char name[15]; - sprintf(name,"energy_%d.ps", n); - plotter->currentRegion().plot(*energy); - plotter->refresh(); - // plotter->write(name,"ps"); // temporary unavailable - plotter->createRegions(1,1); - sprintf(name,"hits_%d.ps", n); - plotter->currentRegion().plot(*hits); - plotter->refresh(); - // plotter->write(name,"ps"); // temporary unavailable - plotter->createRegions(1,2); - plotter->currentRegion().plot(*energy); - plotter->next().plot(*hits); - plotter->refresh(); - } - - - - - } +// plotter->createRegions(1,1); +// sprintf(name,"posyz_%d.ps", n); +// plotter->currentRegion().plot(*posYZ); +// plotter->next().plot(*posYZ); +// plotter->refresh(); +// // plotter->write(name,"ps"); // temporary unavailable +// } +// if(histo1DSave == "enable") { +// plotter->createRegions(1,1); +// char name[15]; +// sprintf(name,"energy_%d.ps", n); +// plotter->currentRegion().plot(*energy); +// plotter->refresh(); +// // plotter->write(name,"ps"); // temporary unavailable +// plotter->createRegions(1,1); +// sprintf(name,"hits_%d.ps", n); +// plotter->currentRegion().plot(*hits); +// plotter->refresh(); +// // plotter->write(name,"ps"); // temporary unavailable +// plotter->createRegions(1,2); +// plotter->currentRegion().plot(*energy); +// plotter->next().plot(*hits); +// plotter->refresh(); + // } #endif } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... /* This member is called at the end of every event */ void GammaRayTelAnalysis::EndOfEvent(G4int flag) @@ -346,30 +324,30 @@ void GammaRayTelAnalysis::EndOfEvent(G4int flag) // to plot for each region. // It is done here, since then EndOfRun set regions // for paper output. - if(plotter) { - if((histo2DDraw == "enable") && (histo1DDraw == "enable")) { - plotter->createRegions(1,2); - //plotter->currentRegion().plot(*posXZ); //temporary unavailable - plotter->currentRegion().plot(*hits); - // plotter->next().plot(*posYZ); //temporary unavailable - plotter->next().plot(*energy); - //plotter->next().plot(*energy); - // plotter->currentRegion().plot(*hits); - //plotter->next().plot(*hits); - } else if((histo1DDraw == "enable") && (histo2DDraw != "enable")) { - plotter->createRegions(1,2); - plotter->currentRegion().plot(*energy); - plotter->next().plot(*hits); - } else if((histo1DDraw != "enable") && (histo2DDraw == "enable")) { - /* plotter->createRegions(1,2); - plotter->currentRegion().plot(*posXZ); - plotter->next().plot(*posYZ);*/ - G4cout << "Temporary Unavailable " << G4endl; - } else { // Nothing to plot. - plotter->createRegions(1,1); - } - plotter->refresh(); - } + // if(plotter) { +// if((histo2DDraw == "enable") && (histo1DDraw == "enable")) { +// plotter->createRegions(1,2); +// //plotter->currentRegion().plot(*posXZ); //temporary unavailable +// plotter->currentRegion().plot(*hits); +// // plotter->next().plot(*posYZ); //temporary unavailable +// plotter->next().plot(*energy); +// //plotter->next().plot(*energy); +// // plotter->currentRegion().plot(*hits); +// //plotter->next().plot(*hits); +// } else if((histo1DDraw == "enable") && (histo2DDraw != "enable")) { +// plotter->createRegions(1,2); +// plotter->currentRegion().plot(*energy); +// plotter->next().plot(*hits); +// } else if((histo1DDraw != "enable") && (histo2DDraw == "enable")) { +// /* plotter->createRegions(1,2); +// plotter->currentRegion().plot(*posXZ); +// plotter->next().plot(*posYZ);*/ +// G4cout << "Temporary Unavailable " << G4endl; +// } else { // Nothing to plot. +// plotter->createRegions(1,1); +// } +// plotter->refresh(); +// } #endif } diff --git a/examples/advanced/gammaray_telescope/src/GammaRayTelDetectorConstruction.cc b/examples/advanced/gammaray_telescope/src/GammaRayTelDetectorConstruction.cc index 569ab4c96a..8c1c6e5a93 100644 --- a/examples/advanced/gammaray_telescope/src/GammaRayTelDetectorConstruction.cc +++ b/examples/advanced/gammaray_telescope/src/GammaRayTelDetectorConstruction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: GammaRayTelDetectorConstruction.cc,v 1.10 2003/05/28 13:56:33 flongo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: GammaRayTelDetectorConstruction.cc,v 1.11 2004/06/02 15:20:46 flongo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // ------------------------------------------------------------ // GEANT 4 class implementation file // CERN Geneva Switzerland @@ -77,7 +77,8 @@ GammaRayTelDetectorConstruction::GammaRayTelDetectorConstruction() solidCALDetectorX(0),logicCALDetectorX(0),physiCALDetectorX(0), solidCALDetectorY(0),logicCALDetectorY(0),physiCALDetectorY(0), solidPlane(0),logicPlane(0),physiPlane(0), - solidConverter(0),logicConverter(0),physiConverter(0) + solidConverter(0),logicConverter(0),physiConverter(0), + aTKRRegion(0), aCALRegion(0) { // default parameter values of the payload @@ -281,7 +282,7 @@ G4VPhysicalVolume* GammaRayTelDetectorConstruction::ConstructPayload() solidCALDetectorX=0;logicCALDetectorX=0;physiCALDetectorX=0; solidCALDetectorY=0;logicCALDetectorY=0;physiCALDetectorY=0; solidPlane=0;logicPlane=0;physiPlane=0; - + aCALRegion=0; aTKRRegion=0; // // Payload // @@ -680,17 +681,19 @@ G4VPhysicalVolume* GammaRayTelDetectorConstruction::ConstructPayload() G4String regName[] = {"Calorimeter","Tracker"}; - - G4Region* aCALRegion = new G4Region(regName[0]); - G4Region* aTKRRegion = new G4Region(regName[1]); - - - logicCAL->SetRegion(aCALRegion); - logicTKR->SetRegion(aTKRRegion); - aCALRegion->AddRootLogicalVolume(logicCAL); - aTKRRegion->AddRootLogicalVolume(logicTKR); - - // Sensitive Detector Manager + if (!aCALRegion) + { + aCALRegion = new G4Region(regName[0]); + logicCAL->SetRegion(aCALRegion); + aCALRegion->AddRootLogicalVolume(logicCAL); + } + if (!aTKRRegion) + { + aTKRRegion = new G4Region(regName[1]); + logicTKR->SetRegion(aTKRRegion); + aTKRRegion->AddRootLogicalVolume(logicTKR); + } + //Sensitive Detector Manager G4SDManager* SDman = G4SDManager::GetSDMpointer(); diff --git a/examples/advanced/hadrontherapy/GNUmakefile b/examples/advanced/hadrontherapy/GNUmakefile new file mode 100755 index 0000000000..655c638cf7 --- /dev/null +++ b/examples/advanced/hadrontherapy/GNUmakefile @@ -0,0 +1,17 @@ +# $Id: GNUmakefile,v 1.1 2004/04/13 12:10:02 cirrone Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := Hadrontherapy +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all +all: lib bin + +include $(G4INSTALL)/config/binmake.gmk diff --git a/examples/advanced/hadrontherapy/Hadrontherapy.cc b/examples/advanced/hadrontherapy/Hadrontherapy.cc new file mode 100755 index 0000000000..d7c1708350 --- /dev/null +++ b/examples/advanced/hadrontherapy/Hadrontherapy.cc @@ -0,0 +1,184 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: Hadrontherapy.cc +// +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// +// **************** Hadrontherapy **************************************** +// Hadrontherapy simulates a general transport beam line dedicated to the +// irradiation of toumors with hadron beams. +// All the elements of a typical hadron beam line (collimator, +// scattering system, range shifter, etc.) are simulated. +// Positions, dimensions and materials of such element can be changed by the users. +// Actually only proton beams can be simulated. +// All the characteristics of the incident beam can be changed. +// Two typical detectors commonly used in the hadrontherapy +// field are simulated: the Markus ionization chamber for the +// reconstruction of the depth dose distributions, +// and a gafchromic film for the reconstruction of the +// lateral dose distributions. +// ************************************************************************** + +#include +#include +#include +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" + +#ifdef G4VIS_USE +#include "HadrontherapyVisManager.hh" +#endif + +#include "HadrontherapyDetectorConstruction.hh" +#include "HadrontherapyPhysicsList.hh" +#include "HadrontherapyPrimaryGeneratorAction.hh" +#include "HadrontherapyRunAction.hh" +#include "HadrontherapyEventAction.hh" +#include "HadrontherapySteppingAction.hh" +// ----------------------------------------------------------------------- +int main(int argc,char** argv) { + + //*************************** + // choose the Random engine + //*************************** + + HepRandom::setTheEngine(new RanecuEngine); + G4int seed = time(NULL); + HepRandom::setTheSeed(seed); + + //*********************************** + // Construct the default run manager + //*********************************** + + G4RunManager * runManager = new G4RunManager; + + //*************************************** + // set mandatory initialization classes + //*************************************** + + HadrontherapyDetectorConstruction* detector; + detector = new HadrontherapyDetectorConstruction; + runManager -> SetUserInitialization(detector); + runManager -> SetUserInitialization(new HadrontherapyPhysicsList(detector)); + + //*********************************************** + // Set the visualization if you chose to have it! + //*********************************************** + +#ifdef G4VIS_USE + G4VisManager* visManager = new HadrontherapyVisManager; + visManager -> Initialize(); +#endif + + //********************************** + // set mandatory user action class + //******************************** + + runManager -> SetUserAction(new HadrontherapyPrimaryGeneratorAction( detector )); + + //**************************************** + // set the optional user action classes + //*************************************** + + HadrontherapyRunAction* runaction = new HadrontherapyRunAction; + runManager -> SetUserAction(runaction); + + HadrontherapyEventAction* eventaction = new HadrontherapyEventAction( runaction ); + runManager -> SetUserAction(eventaction); + + HadrontherapySteppingAction* steppingaction = new HadrontherapySteppingAction( eventaction ); + runManager -> SetUserAction(steppingaction); + + //********************* + // Initialize G4 kernel + //********************* + + runManager -> Initialize(); + + //*********************************************** + // get the pointer to the User Interface manager + //*********************************************** + + G4UImanager* UI = G4UImanager::GetUIpointer(); + + //******************************************************************* + //Define UI terminal for interactive mode (wait command from keyboard + //or for batch mode but reading a macro file + //******************************************************************** + + G4UIsession* session = 0; + + if (argc==1) // Define UI session for interactive mode. + { + +#ifdef G4UI_USE_XM + session = new G4UIXm(argc,argv); +#else + +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif +#endif + } + + + if (session) // Define UI session for interactive mode. + { + + UI->ApplyCommand("/control/execute defaultMacro.mac"); + session -> SessionStart(); + delete session; + } + + else // Batch mode + + { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI->ApplyCommand(command+fileName); + } + + //******************* + // job termination + //******************* + +#ifdef G4VIS_USE + delete visManager; +#endif + + delete runManager; + + return 0; +} + diff --git a/examples/advanced/hadrontherapy/History b/examples/advanced/hadrontherapy/History new file mode 100644 index 0000000000..0f856c9ed0 --- /dev/null +++ b/examples/advanced/hadrontherapy/History @@ -0,0 +1,24 @@ +----------------------------------------------------------- +$Id: History, v 1.6 2004/02/27 G.A.P. Cirrone +----------------------------------------------------------- + + ==================================================== + Geant4 - Hadrontherapy + ==================================================== + + Category History file + --------------------- +28.05.2005 - S. Guatelli + Update of the README, code review for public release. + +27.02.2004 - G.A.P. Cirrone + Created, first version. + +13.03.2004 - G.A.P. Cirrone + Redefinition of the design. + +14.03.2004 - G.A.P. Cirrone + Attempt to insert AIDA class for .xml file creation. + +29.03.2004 - G. Russo + Redefinition of the physics list with hadronic model. diff --git a/examples/advanced/hadrontherapy/README b/examples/advanced/hadrontherapy/README new file mode 100755 index 0000000000..919f89543e --- /dev/null +++ b/examples/advanced/hadrontherapy/README @@ -0,0 +1,211 @@ + + ========================================================= + Geant4 - Hadrontherapy example + ========================================================= + + README + --------------------- + +This example is developed by G.A.Pablo Cirrone, Giorgio Russo and +Francesco Di Rosa of the Laboratori Nazionali del Sud - Istituto Nazionale +di Fisica Nucleare, Via S. Sofia, 44 Catania, Sicily, Italy (www.lns.infn.it) + +The authors are supported by Laboratori Nazionali del Sud, Catania and by the +Dipartimento di Fisica of Catania University, Catania. + +The authors wish to thank Susanna Guatelli and Maria Grazia Pia for +their support in the realization of the sensitive detector and +Harald Paganetti (from NPTC, Massachussets (US)) for the +help in the realization of the movement of the modulator wheel. +------------------------------------------------------------------------ +----> INTRODUCTION. + +The hadrontherapy example simulates a hadron therapy beam line. +In particular the example models the specific proton therapy beam line +installed at Laboratori Nazionali del Sud (INFN) in Catania, Sicily (Italy). +For more information on the proton therapy center of Catania +or/and proton/hadron therapy in general, please visit the +pages: +> www.lns.infn.it/~catana + +----> GEOMETRY SET-UP. + +The elements simulated are: + +1. A scattering system, to spread geometrically the beam; + +2. A system of collimators, to avoid the scattering radiation; + +3. A modulation system that spreads the beam in energy and + produces the so-called spread out bragg peak; + It is constituted by a rotating wheel of different thichnesses. + The wheel rotates around is axis (parallel to the proton + beam axis) and its movement can be obtained by means of a + messenger between runs. + +4. A set of monitor chambers (special transmission ionisation + chambers used to control hadron flux during the irradiation); + +5. A "nozzle" and a final collimator defining the final shape + of the beam before reaching the patient. + +6. A water phantom: it is a box of water inside of which the + dosimeter is placed; the dosimeter performs the measurements of + dose distributions. + The use of the water phantom is required by the international protocol + on the measure of dose in the case of proton and ion beams (IAEA 398, 2000). + +7. A "Markus" ionisation chamber, to reconstruct the depth dose distribution + (Bragg curve). + +8. A radiographic film, to evaluate the beam lateral dose + distribution, registering the spatial distribution of the + primary particles + +------------------------------------------------------------------------ +----> 1.EXPERIMENTAL SET-UP. + +The application fully simulates the proton therapy beam line +installed at Laboratori Nazionali del Sud. Inside the water +phantom (placed at the end of the proton beam line) the Markus ionisation +chamber and a radiographic film are located; these elements permit the +reconstruction of the Bragg curve (registered on the file BraggPeak.out) +and of the lateral and energy distribution of the particles (registered +on the files energyDistribution.out and angularDistribution.out). Please +see later for the description of the produced files. +The Markus chamber is realized by means of a water cylinder (placed inside +the water phantom) with its main axis coincident with proton beam axis. +The cylinder is divided in slices and the energy deposit in each slide is +collected at the end of each run. The default thickness of the slices +is 2 micron. +The radiographic film is simulated by a plane. It is located, by default, +at the entrance window of the water phantom (the isocenter point) and +its thickness is 1. mm. + +------------------------------------------------------------------------- +----> 2.SET-UP + +- a standard Geant4 example GNUmakefile is provided + +setup with: +compiler = gcc-3.2.3 +G4SYSTEM = linux-g++ + +The following section reports the necessary environment variables +necessary for the run of Hadrontherapy. + +----> 2.1 ENVIROMENT VARIABLES + + - G4SYSTEM = Linux-g++ + + - G4INSTALL points to the installation directory of GEANT4; + + - G4LIB point to the compiled libraries of GEANT4; + + - G4WORKDIR points to the work directory; + + - CLHEP_BASE_DIR points to the installation directory of CHLEP; + + - G4LEVELGAMMADATA points to the photoevaporation library; + + - NeutronHPCrossSections points to the neutron data files; + + - G4RADIOACTIVEDATA points to the libraries for radio-active decay + hadronic processes; + + - G4LEDATA points to the low energy electromagnetic libraries + + - LD_LIBRARY_PATH = $CLHEP_BASE_DIR/lib + +----> 2.2 VISUALISATION + +The user can visualise the experimental set-up with OpenGL, DAWN and vrml + +------------------------------------------------------------------------ +----> 3. HOW TO RUN THE EXAMPLE. + +In interactive mode: +> $G4WORDIR/bin/Linux-g++/Hadrontherapy +The defaultMacro.mac is executed + +The primary particle beam parameter are: +Radiation: proton beam; +Energy distribution: gaussian; +Mean energy: 63.4 MeV; +Energy spread: 300 keV; +Beam spot size: 1 mm; +Beam angular spread: 0.057 deg; + + +Cut per region feature permits to set different cut in different regions. +In this example it is sufficient to set a small cut inside the dosemeter +(where the information of dose distribution is collected). + +Default values are: +cut = 10 mm along the beam line; +cut = 0.2 mm inside the dosemeter; + +The modulator wheel can be rotated via the messenger: + +Idle>/modulator/angle/modAngle xx deg + +It is sufficient to rotate the modulator from 0 deg (default position) +to 45 deg using 1 deg steps to obtain a Spread Out Bragg Peak (SOBP). + +Modulator wheel can be omitted setting its material air. + +run $G4WORKDIR/bin/Linux-g++/Hadrontherapy visualisation.mac +to visualise the experimental set-up with OpenGL +----------------------------------------------------------------------- +----> 4. PHYSICS + +Electromagnetic and hadronic processes are modeled. + +The LowEnergy package is used to model the electromagnetic processes +of all the particles involved in the experimental set-up. + +------------------------------------------------------------------------ +----> 5. SIMULATION OUTPUT + +The output is in ASCII file format: + +1.) BraggPeak.out: a two columns file. +The first column represent depth in water (mm), the second contains the energy +deposit (MeV). + +2.) energyDistribution.out: a two columns file. +The first column contains the energy deposit (in MeV) by primary particles +in the plane (radiographic film) positioned at isocenter. +The second column indicates the number of the primary particle +responsible for the energy deposit. + +3.) angularDistribution.out: a three columns file. +It contains the coordinates in millimeters (x, y, z) of a primary +particle interacting with the plane representing the radiographic film. +x direction is along the beam direction, +y and z directions are orthogonal to the beam direction. + +------------------------------------------------------------------------ +----> 6. FUTURE PLANS + +Next planned improvements will be: + +** Use of AIDA and PI analysis tools to store the results of the + simulation in .xml/.hbk files + +** Addition of messengers to interactively change position, dimension + and composition of all the beam line elements and of the + simulated dosimetric systems and to change cut values; + +** Addition of messenger to change energy, energy spread, + beam spot size and angular divergence of the proton beam; + +** Realization of the read-out-geometry: this will permit to collect + the energy deposit inside a voxelized three dimensional volume. + -------------------------------------------------------------------------- + +for comments, advices, doubts and questions please contact: +cirrone@lns.infn.it, giorgiorusso@lns.infn.it + +last modified: Susanna Guatelli, 28/5/2004 + diff --git a/examples/advanced/hadrontherapy/defaultMacro.mac b/examples/advanced/hadrontherapy/defaultMacro.mac new file mode 100755 index 0000000000..dd1343d92e --- /dev/null +++ b/examples/advanced/hadrontherapy/defaultMacro.mac @@ -0,0 +1,18 @@ + +#******************************** +# defaultMacro.mac +# +#******************************** + +/process/activate Transportation all +/hits/activate +/hits/verbose 0 + +/gun/particle proton + +/tracking/verbose 0 +/run/initialize + +/run/beamOn 1000 + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyCalorHit.hh b/examples/advanced/hadrontherapy/include/HadrontherapyCalorHit.hh new file mode 100755 index 0000000000..b7a1440a86 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyCalorHit.hh @@ -0,0 +1,84 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyCalorHit.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#ifndef HadrontherapyCalorHit_h +#define HadrontherapyCalorHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" + +// -------------------------------------------------------------- +class HadrontherapyCalorHit : public G4VHit +{ + public: + HadrontherapyCalorHit(); + ~HadrontherapyCalorHit(); + HadrontherapyCalorHit(const HadrontherapyCalorHit&); + const HadrontherapyCalorHit& operator=(const HadrontherapyCalorHit&); + + inline void* operator new(size_t); + inline void operator delete(void*); + void Print(); + +public: + void AddAbs(G4double de, G4double dl) {EdepAbs += de; TrackLengthAbs += dl;}; + void AddGap(G4double de, G4double dl) {EdepGap += de; TrackLengthGap += dl;}; + G4double GetEdepAbs() {return EdepAbs;}; + G4double GetTrakAbs() {return TrackLengthAbs;}; + G4double GetEdepGap() {return EdepGap; }; + G4double GetTrakGap() {return TrackLengthGap;}; +private: + G4double EdepAbs, TrackLengthAbs; + G4double EdepGap, TrackLengthGap; +}; + +// ------------------------------------------------------------------- +typedef G4THitsCollection HadrontherapyCalorHitsCollection; +extern G4Allocator HadrontherapyCalorHitAllocator; + +// ------------------------------------------------------------------- +inline void* HadrontherapyCalorHit::operator new(size_t) +{ + void* aHit; + aHit = (void*) HadrontherapyCalorHitAllocator.MallocSingle(); + return aHit; +} + +// ------------------------------------------------------------------ +inline void HadrontherapyCalorHit::operator delete(void* aHit) +{ + HadrontherapyCalorHitAllocator.FreeSingle((HadrontherapyCalorHit*) aHit); +} +#endif + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyCalorimeterSD.hh b/examples/advanced/hadrontherapy/include/HadrontherapyCalorimeterSD.hh new file mode 100755 index 0000000000..7f49e463de --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyCalorimeterSD.hh @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyCalorimeterSD.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#ifndef HadrontherapyCalorimeterSD_h +#define HadrontherapyCalorimeterSD_h 1 + +#include "G4VSensitiveDetector.hh" +#include "globals.hh" +#include "G4ios.hh" +#include "HadrontherapyHit.hh" +class HadrontherapyDetectorConstruction; +class G4HCofThisEvent; +class G4Step; +class HadrontherapyRunAction; +class HadrontherapyHit; + +// ------------------------------------------------------------- +class HadrontherapyCalorimeterSD : public G4VSensitiveDetector +{ +public: + + HadrontherapyCalorimeterSD(G4String, HadrontherapyDetectorConstruction*); + ~HadrontherapyCalorimeterSD(); + + void Initialize(G4HCofThisEvent*); + G4bool ProcessHits(G4Step*,G4TouchableHistory*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void PrintAll(); + +private: + G4String filename; + G4int sliceID[50000]; + G4double energy[50000]; + G4double depth; + + HadrontherapyDetectorConstruction* Detector; + + G4double backEnergy; + G4double leakEnergy; + G4double delta; + G4double depthMax; + G4double tkinold; + G4bool part_is_out; + G4int evno; + G4int evnOld; + G4int trIDold; + G4int NbOfLayer; + HadrontherapyRunAction* p_Run; + HadrontherapyHitsCollection* CalCollection; +}; +#endif + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh b/examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh new file mode 100755 index 0000000000..8240a04989 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyDetectorConstruction.hh @@ -0,0 +1,364 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyDetectorConstruction.hh +// +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// +// +#ifndef HadrontherapyDetectorConstruction_h +#define HadrontherapyDetectorConstruction_h 1 + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" +#include "G4Region.hh" +#include "G4RegionStore.hh" + +class G4Text; +class G4Box; +class G4Tubs; +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Material; +class HadrontherapyDetectorMessenger; +class HadrontherapyCalorimeterSD; + +class HadrontherapyDetectorConstruction : public G4VUserDetectorConstruction +{ + +public: + HadrontherapyDetectorConstruction(); + ~HadrontherapyDetectorConstruction(); + +public: + void SetModulatorAngle (G4double); + void SetDosemeterMaterial (G4String); + G4VPhysicalVolume* Construct(); + +public: + G4double GetModulatorAngle() {return ModulatorAngle;}; + G4double ModulatorAngle; + G4int NbOfLayer; + G4double hightDosemeter; + G4double DosemeterPosition_x; + G4Material* GetDosemeterMaterial() {return DosemeterMaterial;}; + G4Material* GetWorldMaterial() {return WorldMaterial;}; + + const G4VPhysicalVolume* GetTreatmentRoom() {return physiTreatmentRoom;}; + const G4VPhysicalVolume* GetDosemeter() {return physiDosemeter;}; + +private: + G4Material* DosemeterMaterial; + G4Material* WorldMaterial; + + // TREATMENT ROOM + + G4Box* solidTreatmentRoom; + G4LogicalVolume* logicTreatmentRoom; + G4VPhysicalVolume* physiTreatmentRoom; + + // BEAM LINE SUPPORT + + G4Box* solidBeamLineSupport; + G4LogicalVolume* logicBeamLineSupport; + G4VPhysicalVolume* physiBeamLineSupport; + + // BEAM LINE COVER 1 (left panel) + + G4Box* solidBeamLineCover; + G4LogicalVolume* logicBeamLineCover; + G4VPhysicalVolume* physiBeamLineCover; + + // BEAM LINE COVER 2 (rigth panel) + + G4Box* solidBeamLineCover2; + G4LogicalVolume* logicBeamLineCover2; + G4VPhysicalVolume* physiBeamLineCover2; + + + // VACUUM ZONE + + G4Box* solidVacuumZone; + G4LogicalVolume* logicVacuumZone; + G4VPhysicalVolume* physiVacuumZone; + + // FIRST SCATTERING FOIL + + G4Box* solidFirstScatteringFoil; + G4LogicalVolume* logicFirstScatteringFoil; + G4VPhysicalVolume* physiFirstScatteringFoil; + + // KAPTON WINDOW + + G4Box* solidKaptonWindow; + G4LogicalVolume* logicKaptonWindow; + G4VPhysicalVolume* physiKaptonWindow; + + // BEAM STOPPER + + G4Tubs* solidStopper; + G4LogicalVolume* logicStopper; + G4VPhysicalVolume* physiStopper; + + // SECOND SCATTERING FOIL + + G4Box* solidSecondScatteringFoil; + G4LogicalVolume* logicSecondScatteringFoil; + G4VPhysicalVolume* physiSecondScatteringFoil; + + // FIRST COLLIMATOR + + G4Box* solidFirstCollimator; + G4LogicalVolume* logicFirstCollimator; + G4VPhysicalVolume* physiFirstCollimator; + + G4Tubs* solidHoleFirstCollimator; + G4LogicalVolume* logicHoleFirstCollimator; + G4VPhysicalVolume* physiHoleFirstCollimator; + + + //FIRST MODULATOR COLLIMATOR + + G4Box* solidFirstCollimatorModulatorBox; + G4LogicalVolume* logicFirstCollimatorModulatorBox; + G4VPhysicalVolume* physiFirstCollimatorModulatorBox; + + G4Tubs* solidHoleFirstCollimatorModulatorBox; + G4LogicalVolume* logicHoleFirstCollimatorModulatorBox; + G4VPhysicalVolume* physiHoleFirstCollimatorModulatorBox; + + + + G4Box* solidMotherMod; // pointer to the solid + G4LogicalVolume* logicMotherMod; // pointer to the logical Target + G4VPhysicalVolume* physiMotherMod; + + G4Material* MotherModMater; + G4Material* Mod0Mater; + G4Material* ModMater; + + + G4Tubs* solidMod0; // pointer to the + G4LogicalVolume* logicMod0; // pointer to the + G4VPhysicalVolume* physiMod0; + + + G4Tubs* solidMod1; // pointer to the + G4LogicalVolume* logicMod1; // pointer to the + G4VPhysicalVolume* physiMod1; + + G4Tubs* solidMod2; // pointer to the + G4LogicalVolume* logicMod2; // pointer to the + G4VPhysicalVolume* physiMod2; + + G4Tubs* solidMod3; // pointer to the + G4LogicalVolume* logicMod3; // pointer to the + G4VPhysicalVolume* physiMod3; + + G4Tubs* solidMod4; // pointer to the + G4LogicalVolume* logicMod4; // pointer to the + G4VPhysicalVolume* physiMod4; + + G4Tubs* solidMod5; // pointer to the + G4LogicalVolume* logicMod5; // pointer to the + G4VPhysicalVolume* physiMod5; + + G4Tubs* solidMod6; // pointer to the + G4LogicalVolume* logicMod6; // pointer to the + G4VPhysicalVolume* physiMod6; + + G4Tubs* solidMod7; // pointer to the + G4LogicalVolume* logicMod7; // pointer to the + G4VPhysicalVolume* physiMod7; + + G4Tubs* solidMod8; // pointer to the + G4LogicalVolume* logicMod8; // pointer to the + G4VPhysicalVolume* physiMod8; + + G4Tubs* solidMod9; // pointer to the + G4LogicalVolume* logicMod9; // pointer to the + G4VPhysicalVolume* physiMod9; + + G4Tubs* solidMod10; // pointer to the + G4LogicalVolume* logicMod10; // pointer to the + G4VPhysicalVolume* physiMod10; + + G4Tubs* solidMod11; // pointer to the + G4LogicalVolume* logicMod11; // pointer to the + G4VPhysicalVolume* physiMod11; + + G4Tubs* solidMod12; // pointer to the + G4LogicalVolume* logicMod12; // pointer to the + G4VPhysicalVolume* physiMod12; + + G4Tubs* solidMod13; // pointer to the + G4LogicalVolume* logicMod13; // pointer to the + G4VPhysicalVolume* physiMod13; + + G4Tubs* solidMod14; // pointer to the + G4LogicalVolume* logicMod14; // pointer to the + G4VPhysicalVolume* physiMod14; + + G4Tubs* solidMod15; // pointer to the + G4LogicalVolume* logicMod15; // pointer to the + G4VPhysicalVolume* physiMod15; + + G4Tubs* solidMod16; // pointer to the + G4LogicalVolume* logicMod16; // pointer to the + G4VPhysicalVolume* physiMod16; + + G4Tubs* solidMod17; // pointer to the + G4LogicalVolume* logicMod17; // pointer to the + G4VPhysicalVolume* physiMod17; + + G4Tubs* solidMod18; // pointer to the + G4LogicalVolume* logicMod18; // pointer to the + G4VPhysicalVolume* physiMod18; + + G4Tubs* solidMod20; // pointer to the + G4LogicalVolume* logicMod20; // pointer to the + G4VPhysicalVolume* physiMod20; + + //SECOND MODULATOR COLLIMATOR + + G4Box* solidSecondCollimatorModulatorBox; + G4LogicalVolume* logicSecondCollimatorModulatorBox; + G4VPhysicalVolume* physiSecondCollimatorModulatorBox; + + G4Tubs* solidHoleSecondCollimatorModulatorBox; + G4LogicalVolume* logicHoleSecondCollimatorModulatorBox; + G4VPhysicalVolume* physiHoleSecondCollimatorModulatorBox; + + //SECOND COLLIMATOR + + G4Box* solidSecondCollimator; + G4LogicalVolume* logicSecondCollimator; + G4VPhysicalVolume* physiSecondCollimator; + + G4Tubs* solidHoleSecondCollimator; + G4LogicalVolume* logicHoleSecondCollimator; + G4VPhysicalVolume* physiHoleSecondCollimator; + + // FIRST MONITOR CHAMBER + + G4Box* solidFirstMonitorLayer1; + G4LogicalVolume* logicFirstMonitorLayer1; + G4VPhysicalVolume* physiFirstMonitorLayer1; + + G4Box* solidFirstMonitorLayer2; + G4LogicalVolume* logicFirstMonitorLayer2; + G4VPhysicalVolume* physiFirstMonitorLayer2; + + G4Box* solidFirstMonitorLayer3; + G4LogicalVolume* logicFirstMonitorLayer3; + G4VPhysicalVolume* physiFirstMonitorLayer3; + + G4Box* solidFirstMonitorLayer4; + G4LogicalVolume* logicFirstMonitorLayer4; + G4VPhysicalVolume* physiFirstMonitorLayer4; + + //SECODN MONITOR CHAMBER + + G4Box* solidSecondMonitorLayer1; + G4LogicalVolume* logicSecondMonitorLayer1; + G4VPhysicalVolume* physiSecondMonitorLayer1; + + G4Box* solidSecondMonitorLayer2; + G4LogicalVolume* logicSecondMonitorLayer2; + G4VPhysicalVolume* physiSecondMonitorLayer2; + + G4Box* solidSecondMonitorLayer3; + G4LogicalVolume* logicSecondMonitorLayer3; + G4VPhysicalVolume* physiSecondMonitorLayer3; + + G4Box* solidSecondMonitorLayer4; + G4LogicalVolume* logicSecondMonitorLayer4; + G4VPhysicalVolume* physiSecondMonitorLayer4; + + // THIRD MONITOR CHAMBER + + G4Box* solidThirdMonitorLayer1; + G4LogicalVolume* logicThirdMonitorLayer1; + G4VPhysicalVolume* physiThirdMonitorLayer1; + + G4Box* solidThirdMonitorLayer2; + G4LogicalVolume* logicThirdMonitorLayer2; + G4VPhysicalVolume* physiThirdMonitorLayer2; + + + G4Box* solidThirdMonitorLayer3; + G4LogicalVolume* logicThirdMonitorLayer3; + G4VPhysicalVolume* physiThirdMonitorLayer3; + + G4Box* solidThirdMonitorLayer4; + G4LogicalVolume* logicThirdMonitorLayer4; + G4VPhysicalVolume* physiThirdMonitorLayer4; + + //NOZZLE + + G4Box* solidNozzleSupport; + G4LogicalVolume* logicNozzleSupport; + G4VPhysicalVolume* physiNozzleSupport; + + G4Tubs* solidHoleNozzleSupport; + G4LogicalVolume* logicHoleNozzleSupport; + G4VPhysicalVolume* physiHoleNozzleSupport; + + G4Tubs* solidSecondHoleNozzleSupport; + G4LogicalVolume* logicSecondHoleNozzleSupport; + G4VPhysicalVolume* physiSecondHoleNozzleSupport; + + //FINAL COLLIMATOR + + G4Tubs* solidFinalCollimator; + G4LogicalVolume* logicFinalCollimator; + G4VPhysicalVolume* physiFinalCollimator; + + // WATER PHANTOM + + G4Box* solidWaterPhantom; + G4LogicalVolume* logicWaterPhantom; + G4VPhysicalVolume* physiWaterPhantom; + + //DOSEMETER (sensitive detector) + + G4Tubs* solidDosemeter; + G4LogicalVolume* logicDosemeter; + G4VPhysicalVolume* physiDosemeter; + HadrontherapyDetectorMessenger* detectorMessenger; + + HadrontherapyCalorimeterSD* calorimeterSD; //pointer to the sensitive detector + +private: + G4VPhysicalVolume* ConstructCalorimeter(); +}; +#endif + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyDetectorMessenger.hh b/examples/advanced/hadrontherapy/include/HadrontherapyDetectorMessenger.hh new file mode 100755 index 0000000000..cc6f4487b9 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyDetectorMessenger.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyDetectorMessenger.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- + +#ifndef HadrontherapyDetectorMessenger_h +#define HadrontherapyDetectorMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class HadrontherapyDetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +// ------------------------------------------------------------------- +class HadrontherapyDetectorMessenger: public G4UImessenger +{ + public: + HadrontherapyDetectorMessenger(HadrontherapyDetectorConstruction* ); + ~HadrontherapyDetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + HadrontherapyDetectorConstruction* HadrontherapyDetector; + + G4UIdirectory* HadronDir; + G4UIdirectory* detDir; + G4UIcmdWithADoubleAndUnit* ModulatorAngleCmd; +}; + +// ---------------------------------------------------------------------- + +#endif + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyEventAction.hh b/examples/advanced/hadrontherapy/include/HadrontherapyEventAction.hh new file mode 100755 index 0000000000..1c5b0a4048 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyEventAction.hh @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyEventAction.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- + +#ifndef HadrontherapyEventAction_h +#define HadrontherapyEventAction_h 1 +#include "G4UserEventAction.hh" +#include "globals.hh" + +class HadrontherapyRunAction; +class HadrontherapyEventActionMessenger; +class HadrontherapyHit; +// --------------------------------------------------------------- +class HadrontherapyEventAction : public G4UserEventAction +{ +public: + HadrontherapyEventAction(HadrontherapyRunAction* runAction ); + ~HadrontherapyEventAction(); + +public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + void setEventVerbose(G4int level); + void CountStepsCharged() ; + void CountStepsNeutral() ; + void AddCharged() ; + void AddNeutral() ; + void AddE(); + void AddP(); + void SetTr(); + void SetRef(); + + G4int GetEventno(); + G4int Trasporto(); + +private: + G4int event_id; + G4int calorimeterCollID; + HadrontherapyEventActionMessenger* eventMessenger; + HadrontherapyRunAction* p_Run; + G4int verboselevel; + G4double nstep; + G4double energyDep[50000]; +}; +#endif diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyHit.hh b/examples/advanced/hadrontherapy/include/HadrontherapyHit.hh new file mode 100755 index 0000000000..41e2eece07 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyHit.hh @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyHit.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- + +#ifndef HadrontherapyHit_h +#define HadrontherapyHit_h 1 +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" + +// ------------------------------------------------------------------ +class HadrontherapyHit : public G4VHit +{ +public: + HadrontherapyHit(G4int); + ~HadrontherapyHit(); + HadrontherapyHit(const HadrontherapyHit &right); + const HadrontherapyHit& operator=(const HadrontherapyHit &right); + int operator==(const HadrontherapyHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + +private: + + G4int slice; + G4double m_Edep; + +public: + inline G4int GetSliceID() {return slice;} + inline void SetSliceID(G4int sliceID) + {slice= sliceID;} + inline void SetEdep(G4double edep) + {m_Edep = edep;} + inline void AddEdep(G4double edep) + {m_Edep += edep;} + inline G4double GetEdep() + {return m_Edep;} +}; + +typedef G4THitsCollection HadrontherapyHitsCollection; +extern G4Allocator HadrontherapyHitAllocator; +inline void* HadrontherapyHit::operator new(size_t) +{ + void *aHit; + aHit = (void *) HadrontherapyHitAllocator.MallocSingle(); + return aHit; +} + +inline void HadrontherapyHit::operator delete(void *aHit) +{ + HadrontherapyHitAllocator.FreeSingle((HadrontherapyHit*) aHit); +} +#endif + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyPhysicsList.hh b/examples/advanced/hadrontherapy/include/HadrontherapyPhysicsList.hh new file mode 100755 index 0000000000..42281c5ee0 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyPhysicsList.hh @@ -0,0 +1,90 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyPhysicsList.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#ifndef HadrontherapyPhysicsList_h +#define HadrontherapyPhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +class HadrontherapyDetectorConstruction; +class HadrontherapyPhysicsListMessenger; + +// ---------------------------------------------------------------- +class HadrontherapyPhysicsList: public G4VUserPhysicsList +{ +public: + HadrontherapyPhysicsList( HadrontherapyDetectorConstruction*); + ~HadrontherapyPhysicsList(); + +protected: + // Construct particle and physics + void ConstructParticle(); + void ConstructProcess(); + void SetCuts(); + +protected: + // these methods Construct particles + void ConstructBosons(); + void ConstructLeptons(); + void ConstructMesons(); + void ConstructBarions(); + void ConstructIons(); + +protected: + // these methods Construct physics processes and register them + void ConstructGeneral(); + void ConstructEM(); + void ConstructHad(); + void ConstructOp(); + +public: + void SetGammaCut(G4double); + void SetElectronCut(G4double); + void SetProtonCut(G4double); + void GetRange(G4double); + void SetMaxStep(G4double); + +private: + G4double cutForGamma; + G4double cutForElectron; + G4double cutForProton; + G4double currentDefaultCut; + G4double defaultCutValue; + HadrontherapyDetectorConstruction* pDet; + HadrontherapyPhysicsListMessenger* physicsListMessenger; +}; + +#endif + + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyPrimaryGeneratorAction.hh b/examples/advanced/hadrontherapy/include/HadrontherapyPrimaryGeneratorAction.hh new file mode 100755 index 0000000000..8d1d41ba8b --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyPrimaryGeneratorAction.hh @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyPrimaryGeneratorAction.hh,v 1.0 +// +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// ----------------------------------------------------------------- + +#ifndef HadrontherapyPrimaryGeneratorAction_h +#define HadrontherapyPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class G4ParticleGun; +class G4Event; +class HadrontherapyDetectorConstruction; +class HadrontherapyPrimaryGeneratorMessenger; +class HadrontherapyPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction + +// --------------------------------------------------------------------------- +{ +public: + HadrontherapyPrimaryGeneratorAction(HadrontherapyDetectorConstruction*); + ~HadrontherapyPrimaryGeneratorAction(); + +public: + void SetDefaultKinematic(); + void GeneratePrimaries(G4Event*); + +private: + G4ParticleGun* particleGun; + HadrontherapyDetectorConstruction* HadrontherapyDetector; + + G4double X0; + G4double Y0; + G4double Z0; + + G4double sigmaX; + G4double sigmaY; + G4double sigmaZ; + + HadrontherapyPrimaryGeneratorMessenger* gunMessenger; +}; + +#endif + + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyRunAction.hh b/examples/advanced/hadrontherapy/include/HadrontherapyRunAction.hh new file mode 100755 index 0000000000..cf61f46738 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyRunAction.hh @@ -0,0 +1,66 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyRunAction.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- + +#ifndef HadrontherapyRunAction_h +#define HadrontherapyRunAction_h 1 + +#include "G4UserRunAction.hh" +#include "globals.hh" +#include + +class G4Run; + +// ------------------------------------------------------------- +class HadrontherapyRunAction : public G4UserRunAction +{ +public: + HadrontherapyRunAction(); + ~HadrontherapyRunAction(); + + G4double energy[50000]; + +public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + G4int GetProva(); + + void EnergyTotSlice(G4int, G4double); + void EnergyTotMarkus(); + +private: + G4int NbOfLayer; + G4int slice; + G4double energy_dep; +}; +#endif + diff --git a/examples/advanced/hadrontherapy/include/HadrontherapySteppingAction.hh b/examples/advanced/hadrontherapy/include/HadrontherapySteppingAction.hh new file mode 100755 index 0000000000..ea4900d021 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapySteppingAction.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapySteppingAction.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#ifndef HadrontherapySteppingAction_h +#define HadrontherapySteppingAction_h 1 + +#include "G4UserSteppingAction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4ios.hh" +#include "globals.hh" +#include + +class HadrontherapyDetectorConstruction; +class HadrontherapyRunAction; +class HadrontherapyEventAction; +class HadrontherapySteppingMessenger; + +// --------------------------------------------------------------- +#ifndef G4NOHIST + class HepTupleManager; + class HepHistogram; +#endif + +class HadrontherapySteppingAction : public G4UserSteppingAction +{ +public: + HadrontherapySteppingAction( HadrontherapyEventAction* ); + ~HadrontherapySteppingAction(); + + void UserSteppingAction(const G4Step*); + + G4int event_id; + G4int Controllo; + +private: + HadrontherapyDetectorConstruction* detector; + HadrontherapyEventAction* eventaction; + HadrontherapyRunAction* runaction; + HadrontherapySteppingMessenger* steppingMessenger; +}; +#endif diff --git a/examples/advanced/hadrontherapy/include/HadrontherapyVisManager.hh b/examples/advanced/hadrontherapy/include/HadrontherapyVisManager.hh new file mode 100755 index 0000000000..3092e61413 --- /dev/null +++ b/examples/advanced/hadrontherapy/include/HadrontherapyVisManager.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyVisManager.hh,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// ------------------------------------------------------------- + +#ifndef HadrontherapyVisManager_h +#define HadrontherapyVisManager_h 1 + +#include "G4VisManager.hh" + +// ------------------------------------------------------------ +class HadrontherapyVisManager: public G4VisManager { + +public: + HadrontherapyVisManager (); + +private: + void RegisterGraphicsSystems (); +}; +#endif diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyCalorHit.cc b/examples/advanced/hadrontherapy/src/HadrontherapyCalorHit.cc new file mode 100755 index 0000000000..d10611fe41 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyCalorHit.cc @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyCalorHit.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyCalorHit.hh" +G4Allocator HadrontherapyCalorHitAllocator; + +// ------------------------------------------------------------- +HadrontherapyCalorHit::HadrontherapyCalorHit() +{ + EdepAbs = 0.; TrackLengthAbs = 0.; +} + +// -------------------------------------------------------------- +HadrontherapyCalorHit::~HadrontherapyCalorHit() +{ } + +// ---------------------------------------------------------------- +HadrontherapyCalorHit::HadrontherapyCalorHit(const HadrontherapyCalorHit& right):G4VHit() +{ + EdepAbs = right.EdepAbs; +} + +// ----------------------------------------------------------------- +const HadrontherapyCalorHit& HadrontherapyCalorHit::operator=(const HadrontherapyCalorHit& right) +{ + EdepAbs = right.EdepAbs; + return *this; +} + +// --------------------------------------------------------------- +void HadrontherapyCalorHit::Print() +{ } + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyCalorimeterSD.cc b/examples/advanced/hadrontherapy/src/HadrontherapyCalorimeterSD.cc new file mode 100755 index 0000000000..bc5edf0bb9 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyCalorimeterSD.cc @@ -0,0 +1,207 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyCalorimeterSD.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyCalorimeterSD.hh" +#include "G4HCofThisEvent.hh" +#include "HadrontherapyEventAction.hh" +#include "HadrontherapyHit.hh" +#include "HadrontherapyDetectorConstruction.hh" +#include "HadrontherapyHit.hh" +#include "G4VPhysicalVolume.hh" +#include "G4Step.hh" +#include "G4Positron.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" +#include "G4SDManager.hh" +#include "HadrontherapyRunAction.hh" +#include "G4ios.hh" + +HadrontherapyCalorimeterSD::HadrontherapyCalorimeterSD(G4String name, + HadrontherapyDetectorConstruction* det) +:G4VSensitiveDetector(name),Detector(det), +delta(1.0e-6*mm),evno(0),evnOld(-1),trIDold(-1),NbOfLayer(20000) +{ + collectionName.insert("CalCollection"); + + p_Run = new HadrontherapyRunAction(); +} + +// ------------------------------------------------------------------- +HadrontherapyCalorimeterSD::~HadrontherapyCalorimeterSD() +{ + delete p_Run; +} + +// ----------------------------------------------------------------- +void HadrontherapyCalorimeterSD::Initialize(G4HCofThisEvent*) +{ + CalCollection = new HadrontherapyHitsCollection + (SensitiveDetectorName,collectionName[0]); + + for (G4int i=0; i < NbOfLayer; i++) + { + energy[i] = 0.0; + } + +for (G4int k=0; k < NbOfLayer; k++) + { + sliceID[k] = -1; + } + +depthMax = (0.002*NbOfLayer - delta); // 0.2 is the actual dosimeter thickness +} + +// --------------------------------------------------------------------- +G4bool HadrontherapyCalorimeterSD::ProcessHits(G4Step* aStep,G4TouchableHistory*) +{ + +G4int j = aStep -> GetPreStepPoint() -> GetPhysicalVolume() -> GetCopyNo(); +G4double edep = aStep->GetTotalEnergyDeposit(); + if (edep ==0) return false; + if(sliceID[j]== -1) + { + HadrontherapyHit* newHit = new HadrontherapyHit(j); + + newHit->SetEdep(edep); + G4int barbatrucco_ID = CalCollection->insert(newHit); + sliceID[j] = barbatrucco_ID - 1; + + } + else + { + (*CalCollection)[sliceID[j]]->AddEdep(edep); + } + + if (j < 0 || j >= NbOfLayer) + + { + G4cout << " Warning!! HadrontherapyCalorimeterSD cannot add " + << edep + << " to the layer Nb " << j << G4endl; + } + else + + { + energy[j] = energy[j] + edep; + } + +const G4Track* track = aStep->GetTrack(); + +G4int trIDnow = track->GetTrackID(); +G4double tkin = track->GetKineticEnergy(); +G4double xend = aStep->GetPostStepPoint()->GetPosition().x(); + +G4bool stop = false; +G4bool primary = false; +G4bool outAbs = false; + + if(track->GetNextVolume()->GetName() == "TreatmentRoom" + && (xend <= delta || xend >= depthMax-delta) ) outAbs = true; + + if(tkin == 0.0) stop = true; + + // Here checks if the particle is primary + + if(aStep->GetTrack()->GetParentID() == 0) + { + primary = true; + } + + // new particle + + if(trIDnow != trIDold || evno != evnOld) + { + trIDold = trIDnow; + evnOld = evno; + part_is_out = true; + tkinold = aStep->GetPreStepPoint()->GetKineticEnergy(); + } + + // Primary particle stop + if(primary && (stop || outAbs)) { + } + + if(outAbs && part_is_out) { + G4double e = tkin; + if(track->GetDefinition() == G4Positron::Positron()) + e += 2.*electron_mass_c2; + if(xend > depthMax-delta) leakEnergy += e; + else if(xend < delta) backEnergy += e; + part_is_out = false; + } + + return true; +} + +// ---------------------------------------------------------------------- +void HadrontherapyCalorimeterSD::EndOfEvent(G4HCofThisEvent* HCE) +{ + +G4int i; +G4double etot = 0.0; + if (NbOfLayer > 0) + { + G4double s = 0.002; //Actual thickness in mm of the dosimeter + G4double z = -0.5 * s; + + for (i = 0; i < NbOfLayer; i ++) + { + z += s; + etot += energy[i]; + } + } + + //******************************* + // Total energy of a particle + // that reach the dosemeter + //******************************* + + static G4int HCID = -1; + if(HCID<0) + { + HCID = GetCollectionID(0); + } + HCE->AddHitsCollection(HCID, CalCollection); + +} + +// ------------------------------------------------------------------------- + +void HadrontherapyCalorimeterSD::clear() +{} + +void HadrontherapyCalorimeterSD::PrintAll() +{} + + + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc b/examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc new file mode 100755 index 0000000000..4be69d2858 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyDetectorConstruction.cc @@ -0,0 +1,1920 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyDetectorConstruction.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.Pablo Cirrone, Giorgio Russo and Francesco Di Rosa +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +#include "HadrontherapyDetectorMessenger.hh" +#include "HadrontherapyDetectorConstruction.hh" +#include "HadrontherapyCalorimeterSD.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4TransportationManager.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4ios.hh" +#include "G4Region.hh" +#include "G4RegionStore.hh" + +HadrontherapyDetectorConstruction::HadrontherapyDetectorConstruction() + :WorldMaterial(0), + solidTreatmentRoom(0), logicTreatmentRoom(0), physiTreatmentRoom(0), + solidBeamLineSupport(0), logicBeamLineSupport(0), physiBeamLineSupport(0), + solidBeamLineCover(0), logicBeamLineCover(0), physiBeamLineCover(0), + solidBeamLineCover2(0), logicBeamLineCover2(0), physiBeamLineCover2(0), + solidVacuumZone(0), logicVacuumZone(0), physiVacuumZone(0), + solidFirstScatteringFoil(0), logicFirstScatteringFoil(0), physiFirstScatteringFoil(0), + solidKaptonWindow(0), logicKaptonWindow(0), physiKaptonWindow(0), + solidStopper(0), logicStopper(0), physiStopper(0), + solidSecondScatteringFoil(0), logicSecondScatteringFoil(0), physiSecondScatteringFoil(0), + solidFirstCollimator(0), logicFirstCollimator(0), physiFirstCollimator(0), + solidHoleFirstCollimator(0), logicHoleFirstCollimator(0), physiHoleFirstCollimator(0), + solidFirstCollimatorModulatorBox(0), logicFirstCollimatorModulatorBox(0), + physiFirstCollimatorModulatorBox(0), + solidHoleFirstCollimatorModulatorBox(0), + logicHoleFirstCollimatorModulatorBox(0), + physiHoleFirstCollimatorModulatorBox(0), + solidMotherMod(0),logicMotherMod(0), physiMotherMod(0), Mod0Mater(0),ModMater(0), + solidMod0(0), logicMod0(0), physiMod0(0), + solidMod1(0), logicMod1(0), physiMod1(0), + solidMod2(0), logicMod2(0), physiMod2(0), + solidMod3(0), logicMod3(0), physiMod3(0), + solidMod4(0), logicMod4(0), physiMod4(0), + solidMod5(0), logicMod5(0), physiMod5(0), + solidMod6(0), logicMod6(0), physiMod6(0), + solidMod7(0), logicMod7(0), physiMod7(0), + solidMod8(0), logicMod8(0), physiMod8(0), + solidMod9(0), logicMod9(0), physiMod9(0), + solidMod10(0), logicMod10(0), physiMod10(0), + solidMod11(0), logicMod11(0), physiMod11(0), + solidMod12(0), logicMod12(0), physiMod12(0), + solidMod13(0), logicMod13(0), physiMod13(0), + solidMod14(0), logicMod14(0), physiMod14(0), + solidMod15(0), logicMod15(0), physiMod15(0), + solidMod16(0), logicMod16(0), physiMod16(0), + solidMod17(0), logicMod17(0), physiMod17(0), + solidMod18(0), logicMod18(0), physiMod18(0), + solidSecondCollimatorModulatorBox(0), + logicSecondCollimatorModulatorBox(0), + physiSecondCollimatorModulatorBox(0), + solidHoleSecondCollimatorModulatorBox(0), + logicHoleSecondCollimatorModulatorBox(0), + physiHoleSecondCollimatorModulatorBox(0), + solidSecondCollimator(0),logicSecondCollimator(0),physiSecondCollimator(0), + solidHoleSecondCollimator(0),logicHoleSecondCollimator(0),physiHoleSecondCollimator(0), + solidFirstMonitorLayer1(0), logicFirstMonitorLayer1(0), physiFirstMonitorLayer1(0), + solidFirstMonitorLayer2(0), logicFirstMonitorLayer2(0), physiFirstMonitorLayer2(0), + solidFirstMonitorLayer3(0), logicFirstMonitorLayer3(0), physiFirstMonitorLayer3(0), + solidFirstMonitorLayer4(0), logicFirstMonitorLayer4(0), physiFirstMonitorLayer4(0), + + solidSecondMonitorLayer1(0), logicSecondMonitorLayer1(0), physiSecondMonitorLayer1(0), + solidSecondMonitorLayer2(0), logicSecondMonitorLayer2(0), physiSecondMonitorLayer2(0), + solidSecondMonitorLayer3(0), logicSecondMonitorLayer3(0), physiSecondMonitorLayer3(0), + solidSecondMonitorLayer4(0), logicSecondMonitorLayer4(0), physiSecondMonitorLayer4(0), + + solidThirdMonitorLayer1(0), logicThirdMonitorLayer1(0), physiThirdMonitorLayer1(0), + solidThirdMonitorLayer2(0), logicThirdMonitorLayer2(0), physiThirdMonitorLayer2(0), + solidThirdMonitorLayer3(0), logicThirdMonitorLayer3(0), physiThirdMonitorLayer3(0), + solidThirdMonitorLayer4(0), logicThirdMonitorLayer4(0), physiThirdMonitorLayer4(0), + + solidNozzleSupport(0), logicNozzleSupport(0), physiNozzleSupport(0), + solidHoleNozzleSupport(0), logicHoleNozzleSupport(0), physiHoleNozzleSupport(0), + solidSecondHoleNozzleSupport(0), logicSecondHoleNozzleSupport(0),physiSecondHoleNozzleSupport(0), + solidFinalCollimator(0), logicFinalCollimator(0), physiFinalCollimator(0), + solidWaterPhantom(0), logicWaterPhantom(0), physiWaterPhantom(0), + calorimeterSD(0) + +{ + // create commands for interactive definition of the calorimeter + detectorMessenger = new HadrontherapyDetectorMessenger(this); +} + +// ----------------------------------------------------------------------------------------------- +HadrontherapyDetectorConstruction::~HadrontherapyDetectorConstruction() +{ + delete detectorMessenger; +} + +//********************************** +// DEFINITION OF THE USED MATERIALS +//********************************** + +G4VPhysicalVolume* HadrontherapyDetectorConstruction::Construct() +{ + + + G4String name, symbol; //a = ATOMIC MASS + G4double a, z, density; //z = ATOMIC NUMBER + + G4int ncomponents, natoms; + G4double fractionmass; + G4double temperature, pressure; + + + //************************************* + // DEFINITION OF MATERIALS AS ELEMENTS + //************************************* + + + a = 1.01*g/mole; + G4Element* H = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); //HIDROGEN + + a = 12.01*g/mole; + G4Element* C = new G4Element(name="Carbon" ,symbol="C" , z= 6., a); // CARBON + + a = 14.01*g/mole; + G4Element* N = new G4Element(name="Nitrogen",symbol="N" , z= 7., a); // NITROGEN + + a = 16.00*g/mole; + G4Element* O = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a); // OXIGEN + + density = 16.6*g/cm3; + a = 180.948*g/mole; + G4Material* Ta = new G4Material(name="Tantalio", z=73,a,density); // TANTALUM + + density = 7.14*g/cm3; + a = 65.38*g/mole; + G4Material* Zn = new G4Material(name="Zinc" , z=30, a, density); // ZINC + + density = 8.90*g/cm3; + a = 63.546*g/mole; + G4Material* Cu = new G4Material(name="Copper", z=29, a, density); // COPPER + + density = 2.700*g/cm3; + a = 26.98*g/mole; + G4Material* Al = new G4Material(name="Aluminium", z=13., a, density); //ALLUMINUM + + + //************************************** + // DEFINITION OF MATERIAL AS COMPOSIT + //************************************** + + + density = 1.000*g/cm3; + G4Material* Water = new G4Material(name="Water", density, ncomponents=2); // WATER + Water->AddElement(H, natoms=2); + Water->AddElement(O, natoms=1); + + density = 1.290*mg/cm3; + G4Material* Air = new G4Material(name="Air" , density, ncomponents=2); // AIR + Air->AddElement(N, fractionmass=0.7); + Air->AddElement(O, fractionmass=0.3); + + density = 1.18*g/cm3; + G4Material* PMMA = new G4Material(name="PMMA", density, ncomponents=3); // PMMA + PMMA->AddElement(C, natoms=5); + PMMA->AddElement(O, natoms=2); + PMMA->AddElement(H, natoms=8); + + density = 8.40*g/cm3; + G4Material* Brass = new G4Material(name="Brass", density, ncomponents=2); // BRASS + Brass->AddMaterial(Zn, fractionmass=30*perCent); + Brass->AddMaterial(Cu, fractionmass=70*perCent); + + density = 1.43*g/cm3; + G4Material* Kapton = new G4Material(name="Kapton",density, ncomponents=4); + Kapton->AddElement(H, natoms=10); + Kapton->AddElement(O, natoms=5); + Kapton->AddElement(C, natoms=22); + Kapton->AddElement(N, natoms=2); + + //************************* + // Definition of the vacuum + //************************* + + density = universe_mean_density; //from PhysicalConstants.h + pressure = 3.e-18*pascal; + temperature = 2.73*kelvin; + G4Material* Vacuum = new G4Material("Galactic", z=1., a=1.01*g/mole,density, + kStateGas,temperature,pressure); + + G4cout << *(G4Material::GetMaterialTable()) << G4endl; + Mod0Mater = Air; + ModMater = Air; + + + //********************************* + // DEFINITIONS OF ALL THE VOLUMES + //********************************* + + + //****************************** + // TREATMENT ROOM (world volume) + // beam line along x axis + //****************************** + + G4double TreatmentRoom_x = 200.*cm; + G4double TreatmentRoom_y = 200.*cm; + G4double TreatmentRoom_z = 200.*cm; + + G4Box* TreatmentRoom + = new G4Box("TreatmentRoom", + TreatmentRoom_x, + TreatmentRoom_y, + TreatmentRoom_z); + logicTreatmentRoom = new G4LogicalVolume(TreatmentRoom,Air, + "TreatmentRoom", + 0, + 0, + 0); + physiTreatmentRoom = new G4PVPlacement(0, + G4ThreeVector(), + "TreatmentRoom", + logicTreatmentRoom, + 0, + false, + 0); + + + //******************************** + // BEAM LINE SUPPORT + //******************************** + + + G4double BeamLineSupport_x = 1.5 *m; + G4double BeamLineSupport_y = 20. *mm; + G4double BeamLineSupport_z = 600. *mm; + + G4double BeamLineSupportPosition_x = -700. *mm; + G4double BeamLineSupportPosition_y = -230. *mm; + G4double BeamLineSupportPosition_z = 0. *mm; + + G4Box* BeamLineSupport = new G4Box("BeamLineSupport", + BeamLineSupport_x, + BeamLineSupport_y, + BeamLineSupport_z); + + logicBeamLineSupport = new G4LogicalVolume(BeamLineSupport, + Al, + "BeamLineSupport"); + + physiBeamLineSupport = new G4PVPlacement(0, + G4ThreeVector(BeamLineSupportPosition_x, + BeamLineSupportPosition_y, + BeamLineSupportPosition_z), + "BeamLineSupport", + logicBeamLineSupport, + physiTreatmentRoom, + false, + 0); + + //******************************** + // BEAM LINE COVER 1 (left panel) + //******************************** + + G4double BeamLineCover_x = 1.5 *m; + G4double BeamLineCover_y = 750. *mm; + G4double BeamLineCover_z = 10. *mm; + + G4double BeamLineCoverPosition_x = -700. *mm; + G4double BeamLineCoverPosition_y = -980. *mm; + G4double BeamLineCoverPosition_z = 600. *mm; + + G4Box* BeamLineCover = new G4Box("BeamLineCover", + BeamLineCover_x, + BeamLineCover_y, + BeamLineCover_z); + + logicBeamLineCover = new G4LogicalVolume(BeamLineCover, + Al, + "BeamLineCover"); + + physiBeamLineCover = new G4PVPlacement(0, + G4ThreeVector(BeamLineCoverPosition_x, + BeamLineCoverPosition_y, + BeamLineCoverPosition_z), + "BeamLineCover", + logicBeamLineCover, + physiTreatmentRoom, + false, + 0); + + + //******************************** + // BEAM LINE COVER 2 (rigth panel) + //******************************** + + G4double BeamLineCover2_x = 1.5 *m; + G4double BeamLineCover2_y = 750. *mm; + G4double BeamLineCover2_z = 10. *mm; + + G4double BeamLineCover2Position_x = -700. *mm; + G4double BeamLineCover2Position_y = -980. *mm; + G4double BeamLineCover2Position_z = -600. *mm; + + G4Box* BeamLineCover2 = new G4Box("BeamLineCover2", + BeamLineCover2_x, + BeamLineCover2_y, + BeamLineCover2_z); + + logicBeamLineCover2 = new G4LogicalVolume(BeamLineCover2, + Al, + "BeamLineCover2"); + + physiBeamLineCover2 = new G4PVPlacement(0, + G4ThreeVector(BeamLineCover2Position_x, + BeamLineCover2Position_y, + BeamLineCover2Position_z), + "BeamLineCover2", + logicBeamLineCover2, + physiTreatmentRoom, + false, + 0); + + //******************************** + // VACUUM ZONE + // Before the beam exits + // in air it traverses a vacuum zone + // in which a first scattering foil + // may be placed + //******************************** + + G4double VacuumZone_x = 60.5325 *mm; + G4double VacuumZone_y = 52.5 *mm; + G4double VacuumZone_z = 52.5 *mm; + + G4double VacuumZonePosition_x = -1939.4675 *mm; + G4double VacuumZonePosition_y = 0. *mm; + G4double VacuumZonePosition_z = 0. *mm; + + G4Box* VacuumZone= new G4Box("VacuumZone", + VacuumZone_x, + VacuumZone_y, + VacuumZone_z); + + logicVacuumZone = new G4LogicalVolume(VacuumZone, + Vacuum, + "VacuumZone"); + + physiVacuumZone = new G4PVPlacement(0, + G4ThreeVector(VacuumZonePosition_x, + VacuumZonePosition_y, + VacuumZonePosition_z), + "VacuumZone", + logicVacuumZone, + physiTreatmentRoom, + false, + 0); + + + //************************** + // FIRST SCATTERING FOIL + // placed in the Vaccum Zone + //************************** + + G4double FirstScatteringFoil_x = 0.0075 *mm; + G4double FirstScatteringFoil_y = 52.5 *mm; + G4double FirstScatteringFoil_z = 52.5 *mm; + + G4double FirstScatteringFoilPosition_x = -59.525 *mm; + G4double FirstScatteringFoilPosition_y = 0 *mm; + G4double FirstScatteringFoilPosition_z = 0 *mm; + + G4Box* FirstScatteringFoil = new G4Box("FirstScatteringFoil", + FirstScatteringFoil_x, + FirstScatteringFoil_y, + FirstScatteringFoil_z); + + logicFirstScatteringFoil = new G4LogicalVolume(FirstScatteringFoil, + Ta, + "FirstScatteringFoil"); + + + physiFirstScatteringFoil = new G4PVPlacement(0, + G4ThreeVector(FirstScatteringFoilPosition_x, + FirstScatteringFoilPosition_y, + FirstScatteringFoilPosition_z), + "FirstScatteringFoil", + logicFirstScatteringFoil, + physiVacuumZone, + false, + 0); + + + //********************* + // KAPTON WINDOW + // Is the point in which + // the beam exits in air + //********************** + + solidKaptonWindow = new G4Box("KaptonWindow", + 0.025*mm, + 5.25*cm, + 5.25*cm); + + logicKaptonWindow = new G4LogicalVolume(solidKaptonWindow, + Kapton, + "KaptonWindow"); + + physiKaptonWindow = new G4PVPlacement(0, + G4ThreeVector(60.5075*mm, + 0.*cm, + 0.*cm), + "KaptonWindow", + logicKaptonWindow, + physiVacuumZone, + false, + 0); + + + // ************************ + // STOPPER + // a small cilinder + // on the beam axis + // ************************ + + G4double phi = 90. *deg; // Matrix definition for a 90 deg rotation. Also used for other volumes + G4RotationMatrix rm; + rm.rotateY(phi); + + G4double innerRadiusStopper = 0.*cm; + G4double outerRadiusStopper = 2*mm; + G4double hightStopper = 3.5*mm; + G4double startAngleStopper = 0.*deg; + G4double spanningAngleStopper = 360.*deg; + + G4double StopperPosition_x = -1707.435*mm; + G4double StopperPosition_y = 0.*m; + G4double StopperPosition_z = 0.*m; + + solidStopper = new G4Tubs("Stopper", + innerRadiusStopper, + outerRadiusStopper, + hightStopper, + startAngleStopper, + spanningAngleStopper); + + logicStopper = new G4LogicalVolume(solidStopper, + Brass, + "Stopper", + 0, + 0, + 0); + + physiStopper = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector(StopperPosition_x, + StopperPosition_y, + StopperPosition_z)), + "Stopper", + logicStopper, + physiTreatmentRoom, + false, + 0); + + // ********************** + // SECOND SCATTERING FOIL + // ********************** + + G4double SecondScatteringFoil_x = 0.0125 *mm; + G4double SecondScatteringFoil_y = 52.5 *mm; + G4double SecondScatteringFoil_z = 52.5 *mm; + + G4double SecondScatteringFoilPosition_x = -1703.9225 *mm; + G4double SecondScatteringFoilPosition_y = 0 *mm; + G4double SecondScatteringFoilPosition_z = 0 *mm; + + solidSecondScatteringFoil = new G4Box("SecondScatteringFoil", + SecondScatteringFoil_x, + SecondScatteringFoil_y, + SecondScatteringFoil_z); + + logicSecondScatteringFoil = new G4LogicalVolume(solidSecondScatteringFoil, + Ta, + "SecondScatteringFoil"); + + physiSecondScatteringFoil = new G4PVPlacement(0, + G4ThreeVector(SecondScatteringFoilPosition_x, + SecondScatteringFoilPosition_y, + SecondScatteringFoilPosition_z), + "SeconScatteringFoil", + logicSecondScatteringFoil, + physiTreatmentRoom, + false, + 0); + + + // ******************** + // FIRST COLLIMATOR + // ******************** + + G4double FirstCollimator_x = 20 *mm; + G4double FirstCollimator_y = 100 *mm; + G4double FirstCollimator_z = 100 *mm; + + G4double FirstCollimatorPosition_x = -1683.91 *mm; + G4double FirstCollimatorPosition_y = 0 *mm; + G4double FirstCollimatorPosition_z = 0 *mm; + + solidFirstCollimator = new G4Box("FirstCollimator", + FirstCollimator_x, + FirstCollimator_y, + FirstCollimator_z); + + logicFirstCollimator = new G4LogicalVolume(solidFirstCollimator, + PMMA, + "FirstCollimator"); + + physiFirstCollimator = new G4PVPlacement(0, + G4ThreeVector(FirstCollimatorPosition_x, + FirstCollimatorPosition_y, + FirstCollimatorPosition_z), + "FirstCollimator", + logicFirstCollimator, + physiTreatmentRoom, + false, + 0); + + //************************** + // HOLE OF FIRST COLLIMATOR + //************************** + + G4double innerRadiusHoleFirstCollimator = 0.*mm; + G4double outerRadiusHoleFirstCollimator = 15.*mm; + G4double hightHoleFirstCollimator = 20.*mm; + G4double startAngleHoleFirstCollimator = 0.*deg; + G4double spanningAngleHoleFirstCollimator = 360.*deg; + + + solidHoleFirstCollimator = new G4Tubs("HoleFirstCollimator", + innerRadiusHoleFirstCollimator, + outerRadiusHoleFirstCollimator, + hightHoleFirstCollimator, + startAngleHoleFirstCollimator, + spanningAngleHoleFirstCollimator); + + logicHoleFirstCollimator = new G4LogicalVolume(solidHoleFirstCollimator, + Air, + "HoleFirstCollimator", + 0, + 0, + 0); + + physiHoleFirstCollimator = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector()), + "HoleFirstCollimator", + logicHoleFirstCollimator, + physiFirstCollimator, + false, + 0); + + + // ****************** + // SECOND COLLIMATOR + // ****************** + + G4double SecondCollimator_x = 20 *mm; + G4double SecondCollimator_y = 100 *mm; + G4double SecondCollimator_z = 100 *mm; + + G4double SecondCollimatorPosition_x = -779.91 *mm; + G4double SecondCollimatorPosition_y = 0 *mm; + G4double SecondCollimatorPosition_z = 0 *mm; + + + solidSecondCollimator = new G4Box("SecondCollimator", + SecondCollimator_x, + SecondCollimator_y, + SecondCollimator_z); + + logicSecondCollimator = new G4LogicalVolume(solidSecondCollimator, + PMMA, + "SecondCollimator"); + + physiSecondCollimator = new G4PVPlacement(0, + G4ThreeVector(SecondCollimatorPosition_x, + SecondCollimatorPosition_y, + SecondCollimatorPosition_z), + "SecondCollimator", + logicSecondCollimator, + physiTreatmentRoom, + false, + 0); + + //************************** + // HOLE OF SECOND COLLIMATOR + //************************** + + G4double innerRadiusHoleSecondCollimator = 0.*mm; + G4double outerRadiusHoleSecondCollimator = 15.*mm; + G4double hightHoleSecondCollimator = 20.*mm; + G4double startAngleHoleSecondCollimator = 0.*deg; + G4double spanningAngleHoleSecondCollimator = 360.*deg; + + solidHoleSecondCollimator = new G4Tubs("HoleSecondCollimator", + innerRadiusHoleSecondCollimator, + outerRadiusHoleSecondCollimator, + hightHoleSecondCollimator, + startAngleHoleSecondCollimator, + spanningAngleHoleSecondCollimator); + + logicHoleSecondCollimator = new G4LogicalVolume(solidHoleSecondCollimator, + Air, + "HoleSecondCollimator", + 0, + 0, + 0); + + physiHoleSecondCollimator = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector()), + "HoleSecondCollimator", + logicHoleSecondCollimator, + physiSecondCollimator, + false, + 0); + + + // ************************* + // FIRST + // COLLIMATOR MODULATOR BOX + // ************************** + + G4double FirstCollimatorModulatorBox_x = 10 *mm; + G4double FirstCollimatorModulatorBox_y = 200 *mm; + G4double FirstCollimatorModulatorBox_z = 200 *mm; + + G4double FirstCollimatorModulatorBoxPosition_x = -1411.91 *mm; + G4double FirstCollimatorModulatorBoxPosition_y = 0 *mm; + G4double FirstCollimatorModulatorBoxPosition_z = 0 *mm; + + solidFirstCollimatorModulatorBox = new G4Box("FirstCollimatorModulatorBox", + FirstCollimatorModulatorBox_x, + FirstCollimatorModulatorBox_y, + FirstCollimatorModulatorBox_z); + + + logicFirstCollimatorModulatorBox = new G4LogicalVolume(solidFirstCollimatorModulatorBox, + Al, + "FirstCollimatorModulatorBox"); + physiFirstCollimatorModulatorBox = new G4PVPlacement(0, + G4ThreeVector(FirstCollimatorModulatorBoxPosition_x, + FirstCollimatorModulatorBoxPosition_y, + FirstCollimatorModulatorBoxPosition_z), + "FirstCollimatorModulatorBox", + logicFirstCollimatorModulatorBox, + physiTreatmentRoom, + false, + 0); + + // ************************************* + // HOLE OF THE FIRST COLLLIMATOR + // MODULATOR BOX + // ************************************ + + G4double innerRadiusHoleFirstCollimatorModulatorBox = 0. *mm; + G4double outerRadiusHoleFirstCollimatorModulatorBox = 31. *mm; + G4double hightHoleFirstCollimatorModulatorBox = 10. *mm; + G4double startAngleHoleFirstCollimatorModulatorBox = 0. *deg; + G4double spanningAngleHoleFirstCollimatorModulatorBox = 360. *deg; + + solidHoleFirstCollimatorModulatorBox = new G4Tubs("HoleFirstCollimatorModulatorBox", + innerRadiusHoleFirstCollimatorModulatorBox, + outerRadiusHoleFirstCollimatorModulatorBox, + hightHoleFirstCollimatorModulatorBox , + startAngleHoleFirstCollimatorModulatorBox, + spanningAngleHoleFirstCollimatorModulatorBox); + + logicHoleFirstCollimatorModulatorBox = new G4LogicalVolume(solidHoleFirstCollimatorModulatorBox, + Air, + "HoleFirstCollimatorModulatorBox", + 0, + 0, + 0); + + physiHoleFirstCollimatorModulatorBox = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector()), + "HoleFirstCollimatorModulatorBox", + logicHoleFirstCollimatorModulatorBox, + physiFirstCollimatorModulatorBox, + false, + 0); + + // ************************* + // SECOND + // COLLIMATOR MODULATOR BOX + // ************************** + + G4double SecondCollimatorModulatorBox_x = 10 *mm; + G4double SecondCollimatorModulatorBox_y = 200 *mm; + G4double SecondCollimatorModulatorBox_z = 200 *mm; + + G4double SecondCollimatorModulatorBoxPosition_x = -841.91 *mm; + G4double SecondCollimatorModulatorBoxPosition_y = 0 *mm; + G4double SecondCollimatorModulatorBoxPosition_z = 0 *mm; + + solidSecondCollimatorModulatorBox= new G4Box("SecondCollimatorModulatorBox", + SecondCollimatorModulatorBox_x, + SecondCollimatorModulatorBox_y, + SecondCollimatorModulatorBox_z); + + logicSecondCollimatorModulatorBox = new G4LogicalVolume(solidSecondCollimatorModulatorBox, + Al, + "SecondCollimatorModulatorBox"); + + physiSecondCollimatorModulatorBox = new G4PVPlacement(0, + G4ThreeVector(SecondCollimatorModulatorBoxPosition_x, + SecondCollimatorModulatorBoxPosition_y, + SecondCollimatorModulatorBoxPosition_z), + "SecondCollimatorModulatorBox", + logicSecondCollimatorModulatorBox, + physiTreatmentRoom, + false, + 0); + + // ************************************* + // HOLE OF THE SECOND COLLLIMATOR + // MODULATOR BOX + // ************************************ + + G4double innerRadiusHoleSecondCollimatorModulatorBox = 0. *mm; + G4double outerRadiusHoleSecondCollimatorModulatorBox = 31. *mm; + G4double hightHoleSecondCollimatorModulatorBox = 10. *mm; + G4double startAngleHoleSecondCollimatorModulatorBox = 0. *deg; + G4double spanningAngleHoleSecondCollimatorModulatorBox = 360. *deg; + + solidHoleSecondCollimatorModulatorBox = new G4Tubs("HoleSecondCollimatorModulatorBox", + innerRadiusHoleSecondCollimatorModulatorBox, + outerRadiusHoleSecondCollimatorModulatorBox, + hightHoleSecondCollimatorModulatorBox , + startAngleHoleSecondCollimatorModulatorBox, + spanningAngleHoleSecondCollimatorModulatorBox); + + logicHoleSecondCollimatorModulatorBox = new G4LogicalVolume(solidHoleSecondCollimatorModulatorBox, + Air, + "HoleSecondCollimatorModulatorBox", + 0, + 0, + 0); + + physiHoleSecondCollimatorModulatorBox = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector()), + "HoleSecondCollimatorModulatorBox", + logicHoleSecondCollimatorModulatorBox, + physiSecondCollimatorModulatorBox, + false, + 0); + + // ************************ + // FIRST MONITOR CHAMBER + // ************************ + + // Each chamber consist of 9 mm of air in a box + // that has two layers one of kapton and one + // of copper + + solidFirstMonitorLayer1 = new G4Box("FirstMonitorLayer1", + 4.525022*mm, + 10*cm, + 10*cm); + + logicFirstMonitorLayer1 = new G4LogicalVolume(solidFirstMonitorLayer1, + Kapton, + "FirstMonitorLayer1"); + + physiFirstMonitorLayer1 = new G4PVPlacement(0, + G4ThreeVector(-517.384978*mm,0.*cm,0.*cm), + "FirstMonitorLayer1", + logicFirstMonitorLayer1, + physiTreatmentRoom, + false, + 0); + + solidFirstMonitorLayer2 = new G4Box("FirstMonitorLayer2", + 0.000011*mm, + 10*cm, + 10*cm); + + logicFirstMonitorLayer2 = new G4LogicalVolume(solidFirstMonitorLayer2, + Cu, + "FirstMonitorLayer2"); + + physiFirstMonitorLayer2 = new G4PVPlacement(0, + G4ThreeVector(-4.500011*mm,0.*cm,0.*cm), + "FirstMonitorLayer2", + logicFirstMonitorLayer2, + physiFirstMonitorLayer1, + false, + 0); + + solidFirstMonitorLayer3 = new G4Box("FirstMonitorLayer3", + 4.5*mm, + 10*cm, + 10*cm); + + logicFirstMonitorLayer3 = new G4LogicalVolume(solidFirstMonitorLayer3, + Air, + "FirstMonitorLayer3"); + + physiFirstMonitorLayer3 = new G4PVPlacement(0, + G4ThreeVector(0.*mm,0.*cm,0.*cm), + "MonitorLayer3", + logicFirstMonitorLayer3, + physiFirstMonitorLayer1, + false, + 0); + + solidFirstMonitorLayer4 = new G4Box("FirstMonitorLayer4", + 0.000011*mm, + 10*cm, + 10*cm); + + logicFirstMonitorLayer4 = new G4LogicalVolume(solidFirstMonitorLayer4, + Cu, + "FirstMonitorLayer4"); + + physiFirstMonitorLayer4 = new G4PVPlacement(0, + G4ThreeVector(4.500011*mm,0.*cm,0.*cm), + "FirstMonitorLayer4", + logicFirstMonitorLayer4, + physiFirstMonitorLayer1, + false, + 0); + + // ************************ + // SECOND MONITOR CHAMBER + // ************************ + + solidSecondMonitorLayer1 = new G4Box("SecondMonitorLayer1", + 4.525022*mm, + 10*cm, + 10*cm); + + logicSecondMonitorLayer1 = new G4LogicalVolume(solidSecondMonitorLayer1, + Kapton, + "SecondMonitorLayer1"); + + physiSecondMonitorLayer1 = new G4PVPlacement(0, + G4ThreeVector(-386.334934 *mm,0.*cm,0.*cm), + "SecondMonitorLayer1", + logicSecondMonitorLayer1, + physiTreatmentRoom, + false, + 0); + + solidSecondMonitorLayer2 = new G4Box("SecondMonitorLayer2", + 0.000011*mm, + 10*cm, + 10*cm); + + logicSecondMonitorLayer2 = new G4LogicalVolume(solidSecondMonitorLayer2, + Cu, + "SecondMonitorLayer2"); + + physiSecondMonitorLayer2 = new G4PVPlacement(0, + G4ThreeVector(-4.500011*mm,0.*cm,0.*cm), + "SecondMonitorLayer2", + logicSecondMonitorLayer2, + physiSecondMonitorLayer1, + false, + 0); + + solidSecondMonitorLayer3 = new G4Box("SecondMonitorLayer3", + 4.5*mm, + 10*cm, + 10*cm); + + logicSecondMonitorLayer3 = new G4LogicalVolume(solidSecondMonitorLayer3, + Air, + "SecondMonitorLayer3"); + + physiSecondMonitorLayer3 = new G4PVPlacement(0, + G4ThreeVector(0.*mm,0.*cm,0.*cm), + "MonitorLayer3", + logicSecondMonitorLayer3, + physiSecondMonitorLayer1, + false, + 0); + + solidSecondMonitorLayer4 = new G4Box("SecondMonitorLayer4", + 0.000011*mm, + 10*cm, + 10*cm); + + logicSecondMonitorLayer4 = new G4LogicalVolume(solidSecondMonitorLayer4, + Cu, + "SecondMonitorLayer4"); + + physiSecondMonitorLayer4 = new G4PVPlacement(0, + G4ThreeVector(4.500011*mm,0.*cm,0.*cm), + "SecondMonitorLayer4", + logicSecondMonitorLayer4, + physiSecondMonitorLayer1, + false, + 0); + + + //************************ + // THIRD MONITOR CHAMBER + // ************************ + + solidThirdMonitorLayer1 = new G4Box("ThirdMonitorLayer1", + 4.525022*mm, + 10*cm, + 10*cm); + + logicThirdMonitorLayer1 = new G4LogicalVolume(solidThirdMonitorLayer1, + Kapton, + "ThirdMonitorLayer1"); + + physiThirdMonitorLayer1 = new G4PVPlacement(0, + G4ThreeVector(-257.28489 *mm,0.*cm,0.*cm), + "ThirdMonitorLayer1", + logicThirdMonitorLayer1, + physiTreatmentRoom, + false, + 0); + + solidThirdMonitorLayer2 = new G4Box("ThirdMonitorLayer2", + 0.000011*mm, + 10*cm, + 10*cm); + + logicThirdMonitorLayer2 = new G4LogicalVolume(solidThirdMonitorLayer2, + Cu, + "ThirdMonitorLayer2"); + + physiThirdMonitorLayer2 = new G4PVPlacement(0, + G4ThreeVector(-4.500011*mm,0.*cm,0.*cm), + "ThirdMonitorLayer2", + logicThirdMonitorLayer2, + physiThirdMonitorLayer1, + false, + 0); + + solidThirdMonitorLayer3 = new G4Box("ThirdMonitorLayer3", + 4.5*mm, + 10*cm, + 10*cm); + + logicThirdMonitorLayer3 = new G4LogicalVolume(solidThirdMonitorLayer3, + Air, + "ThirdMonitorLayer3"); + + physiThirdMonitorLayer3 = new G4PVPlacement(0, + G4ThreeVector(0.*mm,0.*cm,0.*cm), + "MonitorLayer3", + logicThirdMonitorLayer3, + physiThirdMonitorLayer1, + false, + 0); + + solidThirdMonitorLayer4 = new G4Box("ThirdMonitorLayer4", + 0.000011*mm, + 10*cm, + 10*cm); + + logicThirdMonitorLayer4 = new G4LogicalVolume(solidThirdMonitorLayer4, + Cu, + "ThirdMonitorLayer4"); + + physiThirdMonitorLayer4 = new G4PVPlacement(0, + G4ThreeVector(4.500011*mm,0.*cm,0.*cm), + "ThirdMonitorLayer4", + logicThirdMonitorLayer4, + physiSecondMonitorLayer1, + false, + 0); + + // *************** + // NOZZLE SUPPORT + // *************** + + G4double NozzleSupport_x = 29.5 *mm; + G4double NozzleSupport_y = 180. *mm; + G4double NozzleSupport_z = 180. *mm; + + G4double NozzleSupportPosition_x = 647.59 *mm; + G4double NozzleSupportPosition_y = 0. *mm; + G4double NozzleSupportPosition_z = 0. *mm; + + solidNozzleSupport = new G4Box("NozzlSupport", + NozzleSupport_x, + NozzleSupport_y, + NozzleSupport_z); + + logicNozzleSupport = new G4LogicalVolume(solidNozzleSupport, + PMMA, + "NozzleSupport"); + + physiNozzleSupport = new G4PVPlacement(0, + G4ThreeVector(NozzleSupportPosition_x, + NozzleSupportPosition_y, + NozzleSupportPosition_z), + "NozzleSupport", + logicNozzleSupport, + physiTreatmentRoom, + false, + 0); + + // ************************* + // HOLE OF THE BOX SUPPORT + // It rapresents the nozzle + // in which will be inserted + // an air cilindrer + // ************************* + + G4double innerRadiusHoleNozzleSupport = 18. *mm; + G4double outerRadiusHoleNozzleSupport = 21.5 *mm; + G4double hightHoleNozzleSupport = 185. *mm; + G4double startAngleHoleNozzleSupport = 0. *deg; + G4double spanningAngleHoleNozzleSupport = 360. *deg; + + G4double HoleNozzleSupportPosition_x = 773.09 *mm; + G4double HoleNozzleSupportPosition_y = 0. *mm; + G4double HoleNozzleSupportPosition_z = 0. *mm; + + solidHoleNozzleSupport = new G4Tubs("HoleNozzleSupport", + innerRadiusHoleNozzleSupport, + outerRadiusHoleNozzleSupport, + hightHoleNozzleSupport, + startAngleHoleNozzleSupport, + spanningAngleHoleNozzleSupport); + + logicHoleNozzleSupport = new G4LogicalVolume(solidHoleNozzleSupport, + Brass, + "HoleNozzleSupport", + 0, + 0, + 0); + + physiHoleNozzleSupport = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector(HoleNozzleSupportPosition_x, + HoleNozzleSupportPosition_y, + HoleNozzleSupportPosition_z)), + "HoleNozzleSupport", + logicHoleNozzleSupport, + physiTreatmentRoom, + false, + 0); + + // ********************************************* + // Second Hole of the BOX SUPPORT + // it is a block of air into the BoxNozzle + // + // ********************************************* + + G4double innerRadiusSecondHoleNozzleSupport = 0. *mm; + G4double outerRadiusSecondHoleNozzleSupport = 18. *mm; + G4double hightSecondHoleNozzleSupport = 29.5 *mm; + G4double startAngleSecondHoleNozzleSupport = 0. *deg; + G4double spanningAngleSecondHoleNozzleSupport = 360. *deg; + + solidSecondHoleNozzleSupport = new G4Tubs("SecondHoleNozzleSupport", + innerRadiusSecondHoleNozzleSupport, + outerRadiusSecondHoleNozzleSupport, + hightSecondHoleNozzleSupport, + startAngleSecondHoleNozzleSupport, + spanningAngleSecondHoleNozzleSupport); + + logicSecondHoleNozzleSupport = new G4LogicalVolume(solidSecondHoleNozzleSupport, + Air, + "SecondHoleNozzleSupport", + 0, + 0, + 0); + + physiSecondHoleNozzleSupport = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector()), + "SecondHoleNozzleSupport", + logicSecondHoleNozzleSupport, + physiNozzleSupport, + false, + 0); + + //****************************** + // FINAL COLLIMATOR 25 mm + //***************************** + + G4double innerRadiusFinalCollimator = 12.5 *mm; + G4double outerRadiusFinalCollimator = 21.5 *mm; + G4double hightFinalCollimator = 3.5 *mm; + G4double startAngleFinalCollimator = 0. *deg; + G4double spanningAngleFinalCollimator = 360. *deg; + + G4double FinalCollimatorPosition_x = 961.59 *mm; + G4double FinalCollimatorPosition_y = 0. *mm; + G4double FinalCollimatorPosition_z = 0. *mm; + + + solidFinalCollimator = new G4Tubs("FinalCollimator", + innerRadiusFinalCollimator, + outerRadiusFinalCollimator, + hightFinalCollimator, + startAngleFinalCollimator, + spanningAngleFinalCollimator); + + logicFinalCollimator = new G4LogicalVolume(solidFinalCollimator, + Brass, + "FinalCollimator", + 0, + 0, + 0); + + physiFinalCollimator = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector(FinalCollimatorPosition_x, + FinalCollimatorPosition_y, + FinalCollimatorPosition_z)), + "FinalCollimator", + logicFinalCollimator, + physiTreatmentRoom, + false, + 0); + + + + + + // --------------------------------------------------------------------------- + // + // Modulator + // + G4double innerRadiusOfTheTube = 2.5*cm; + G4double outerRadiusOfTheTube = 9.5*cm; + G4double hightOfTheTube = 0.03*cm; + + + //------------------------------ + // Mother volume of modulator + //------------------------------ + + G4ThreeVector positionMotherMod = G4ThreeVector(-1011.91 *mm, 30 *mm, 50 *mm); + solidMotherMod = new G4Box("MotherMod",5 *cm, 5 *cm,2 *cm); + logicMotherMod = new G4LogicalVolume(solidMotherMod, Mod0Mater,"MotherMod",0,0,0); + physiMotherMod = new G4PVPlacement(G4Transform3D(rm,positionMotherMod), // rotation + logicMotherMod, // its logical volume + "MotherMod", // its name + logicTreatmentRoom, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Volume Madre 1/4 del Modulatore + //---------------------------------------------------------- + + G4double hightOfTheTube0 = 0.54*cm; + G4double startAngleOfTheTube0 = 45*deg; + G4double spanningAngleOfTheTube0 = 90*deg; + + + G4ThreeVector positionMod0 = G4ThreeVector(0*cm,0*cm,0*cm); + solidMod0 = new G4Tubs("Mod0", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube0, + startAngleOfTheTube0, + spanningAngleOfTheTube0); + + logicMod0 = new G4LogicalVolume(solidMod0, Mod0Mater, "Mod0",0,0,0); + + + + G4RotationMatrix rm2; + phi = 4 *deg; + G4double angle = 90 *deg; + for (G4int j = 0; j < 4 ; j ++) + + { + rm2.rotateZ(phi); + + physiMod0 = new G4PVPlacement(G4Transform3D(rm2, positionMod0), + logicMod0, // its logical volume + "Mod0", // its name + logicMotherMod, // its mother volume + false, // no boolean operations + j); // no particular field + + + phi = phi + angle; + + } + + + //---------------------------------------------------------- + //Prima fetta Modulatore + //---------------------------------------------------------- + + + G4double startAngleOfTheTube1 = 54.267*deg; + G4double spanningAngleOfTheTube1 = 71.466*deg; + + + G4ThreeVector positionMod1 = G4ThreeVector(0*cm,0*cm,0.51*cm); + solidMod1 = new G4Tubs("Mod1", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube1, + spanningAngleOfTheTube1); + + logicMod1 = new G4LogicalVolume(solidMod1, ModMater, "Mod1",0,0,0); + physiMod1 = new G4PVPlacement(0, // no rotation + positionMod1, // at (x,y,z) + logicMod1, // its logical volume + "Mod1", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Seconda fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube2 = 57.714*deg; + G4double spanningAngleOfTheTube2 = 64.572*deg; + + + + G4ThreeVector positionMod2 = G4ThreeVector(0*cm,0*cm,0.45*cm); + solidMod2 = new G4Tubs("Mod2", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube2, + spanningAngleOfTheTube2); + + logicMod2 = new G4LogicalVolume(solidMod2, ModMater, "Mod2",0,0,0); + physiMod2 = new G4PVPlacement(0, // no rotation + positionMod2, // at (x,y,z) + logicMod2, // its logical volume + "Mod2", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Terza fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube3 = 60.478*deg; + G4double spanningAngleOfTheTube3 = 59.044*deg; + + + + G4ThreeVector positionMod3 = G4ThreeVector(0*cm,0*cm,0.39*cm); + solidMod3 = new G4Tubs("Mod3", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube3, + spanningAngleOfTheTube3); + + logicMod3 = new G4LogicalVolume(solidMod3, ModMater, "Mod3",0,0,0); + physiMod3 = new G4PVPlacement(0, // no rotation + positionMod3, // at (x,y,z) + logicMod3, // its logical volume + "Mod3", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Quarta fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube4 = 62.668*deg; + G4double spanningAngleOfTheTube4 = 54.664*deg; + + + G4ThreeVector positionMod4 = G4ThreeVector(0*cm,0*cm,0.33*cm); + solidMod4 = new G4Tubs("Mod4", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube4, + spanningAngleOfTheTube4); + + logicMod4 = new G4LogicalVolume(solidMod4, ModMater, "Mod4",0,0,0); + physiMod4 = new G4PVPlacement(0, // no rotation + positionMod4, // at (x,y,z) + logicMod4, // its logical volume + "Mod4", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Quinta fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube5 = 64.814*deg; + G4double spanningAngleOfTheTube5 = 50.372*deg; + + + G4ThreeVector positionMod5 = G4ThreeVector(0*cm,0*cm,0.27*cm); + solidMod5 = new G4Tubs("Mod5", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube5, + spanningAngleOfTheTube5); + + logicMod5 = new G4LogicalVolume(solidMod5, ModMater, "Mod5",0,0,0); + physiMod5 = new G4PVPlacement(0, // no rotation + positionMod5, // at (x,y,z) + logicMod5, // its logical volume + "Mod5", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Sesta fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube6 = 66.706*deg; + G4double spanningAngleOfTheTube6 = 46.588*deg; + + + G4ThreeVector positionMod6 = G4ThreeVector(0*cm,0*cm,0.21*cm); + solidMod6 = new G4Tubs("Mod6", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube6, + spanningAngleOfTheTube6); + + logicMod6 = new G4LogicalVolume(solidMod6, ModMater, "Mod6",0,0,0); + physiMod6 = new G4PVPlacement(0, // no rotation + positionMod6, // at (x,y,z) + logicMod6, // its logical volume + "Mod6", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Settima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube7 = 68.648*deg; + G4double spanningAngleOfTheTube7 = 42.704*deg; + + + + G4ThreeVector positionMod7 = G4ThreeVector(0*cm,0*cm,0.15*cm); + solidMod7 = new G4Tubs("Mod7", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube7, + spanningAngleOfTheTube7); + + logicMod7 = new G4LogicalVolume(solidMod7, ModMater, "Mod7",0,0,0); + physiMod7 = new G4PVPlacement(0, // no rotation + positionMod7, // at (x,y,z) + logicMod7, // its logical volume + "Mod7", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + + //---------------------------------------------------------- + //Ottava fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube8 = 70.472*deg; + G4double spanningAngleOfTheTube8 = 39.056*deg; + + + G4ThreeVector positionMod8 = G4ThreeVector(0*cm,0*cm,0.09*cm); + solidMod8 = new G4Tubs("Mod8", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube8, + spanningAngleOfTheTube8); + + logicMod8 = new G4LogicalVolume(solidMod8, ModMater, "Mod8",0,0,0); + physiMod8 = new G4PVPlacement(0, // no rotation + positionMod8, // at (x,y,z) + logicMod8, // its logical volume + "Mod8", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + + + //---------------------------------------------------------- + //Nona fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube9 = 72.288*deg; + G4double spanningAngleOfTheTube9 = 35.424*deg; + + + G4ThreeVector positionMod9 = G4ThreeVector(0*cm,0*cm,0.03*cm); + solidMod9 = new G4Tubs("Mod9", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube9, + spanningAngleOfTheTube9); + + logicMod9 = new G4LogicalVolume(solidMod9, ModMater, "Mod9",0,0,0); + physiMod9 = new G4PVPlacement(0, // no rotation + positionMod9, // at (x,y,z) + logicMod9, // its logical volume + "Mod9", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Decima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube10 = 74.061*deg; + G4double spanningAngleOfTheTube10 = 31.878*deg; + + + G4ThreeVector positionMod10 = G4ThreeVector(0*cm,0*cm,-0.03*cm); + solidMod10 = new G4Tubs("Mod10", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube10, + spanningAngleOfTheTube10); + + logicMod10 = new G4LogicalVolume(solidMod10, ModMater, "Mod10",0,0,0); + physiMod10 = new G4PVPlacement(0, // no rotation + positionMod10, // at (x,y,z) + logicMod10, // its logical volume + "Mod10", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //---------------------------------------------------------- + // Undicesima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube11 = 75.793*deg; + G4double spanningAngleOfTheTube11 = 28.414*deg; + + + G4ThreeVector positionMod11 = G4ThreeVector(0*cm,0*cm,-0.09*cm); + solidMod11 = new G4Tubs("Mod11", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube11, + spanningAngleOfTheTube11); + + logicMod11 = new G4LogicalVolume(solidMod11, ModMater, "Mod11",0,0,0); + physiMod11 = new G4PVPlacement(0, // no rotation + positionMod11, // at (x,y,z) + logicMod11, // its logical volume + "Mod11", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //---------------------------------------------------------- + //Dodicesima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube12 = 77.579*deg; + G4double spanningAngleOfTheTube12 = 24.842*deg; + + + + G4ThreeVector positionMod12 = G4ThreeVector(0*cm,0*cm,-0.15*cm); + solidMod12 = new G4Tubs("Mod12", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube12, + spanningAngleOfTheTube12); + + logicMod12 = new G4LogicalVolume(solidMod12, ModMater, "Mod12",0,0,0); + physiMod12 = new G4PVPlacement(0, // no rotation + positionMod12, // at (x,y,z) + logicMod12, // its logical volume + "Mod12", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Tredicesima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube13 = 79.273*deg; + G4double spanningAngleOfTheTube13 = 21.454*deg; + + + G4ThreeVector positionMod13 = G4ThreeVector(0*cm,0*cm,-0.21*cm); + solidMod13 = new G4Tubs("Mod13", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube13, + spanningAngleOfTheTube13); + + logicMod13 = new G4LogicalVolume(solidMod13, ModMater, "Mod13",0,0,0); + physiMod13 = new G4PVPlacement(0, // no rotation + positionMod13, // at (x,y,z) + logicMod13, // its logical volume + "Mod13", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //---------------------------------------------------------- + //Quat. fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube14 = 81.014*deg; + G4double spanningAngleOfTheTube14 = 17.972*deg; + + + G4ThreeVector positionMod14 = G4ThreeVector(0*cm,0*cm,-0.27*cm); + solidMod14 = new G4Tubs("Mod14", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube14, + spanningAngleOfTheTube14); + + logicMod14 = new G4LogicalVolume(solidMod14, ModMater, "Mod14",0,0,0); + physiMod14 = new G4PVPlacement(0, // no rotation + positionMod14, // at (x,y,z) + logicMod14, // its logical volume + "Mod14", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + + //---------------------------------------------------------- + //Quindicesima fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube15 = 82.695*deg; + G4double spanningAngleOfTheTube15 = 14.61*deg; + + + G4ThreeVector positionMod15 = G4ThreeVector(0*cm,0*cm,-0.33*cm); + solidMod15 = new G4Tubs("Mod15", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube15, + spanningAngleOfTheTube15); + + logicMod15 = new G4LogicalVolume(solidMod15, ModMater, "Mod15",0,0,0); + physiMod15 = new G4PVPlacement(0, // no rotation + positionMod15, // at (x,y,z) + logicMod15, // its logical volume + "Mod15", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //---------------------------------------------------------- + //Sedic. fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube16 = 84.425*deg; + G4double spanningAngleOfTheTube16 = 11.15*deg; + + + G4ThreeVector positionMod16 = G4ThreeVector(0*cm,0*cm,-0.39*cm); + solidMod16 = new G4Tubs("Mod16", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube16, + spanningAngleOfTheTube16); + + logicMod16 = new G4LogicalVolume(solidMod16, ModMater, "Mod16",0,0,0); + physiMod16 = new G4PVPlacement(0, // no rotation + positionMod16, // at (x,y,z) + logicMod16, // its logical volume + "Mod16", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //---------------------------------------------------------- + //Dicias. fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube17 = 86.203*deg; + G4double spanningAngleOfTheTube17 = 7.594*deg; + + + + G4ThreeVector positionMod17 = G4ThreeVector(0*cm,0*cm,-0.45*cm); + solidMod17 = new G4Tubs("Mod17", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube17, + spanningAngleOfTheTube17); + + logicMod17 = new G4LogicalVolume(solidMod17, ModMater, "Mod17",0,0,0); + physiMod17 = new G4PVPlacement(0, // no rotation + positionMod17, // at (x,y,z) + logicMod17, // its logical volume + "Mod17", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + //---------------------------------------------------------- + //Diciot. fetta Modulatore + //---------------------------------------------------------- + + G4double startAngleOfTheTube18 = 87.910*deg; + G4double spanningAngleOfTheTube18 = 4.18*deg; + + + + G4ThreeVector positionMod18 = G4ThreeVector(0*cm,0*cm,-0.51*cm); + solidMod18 = new G4Tubs("Mod18", + innerRadiusOfTheTube, + outerRadiusOfTheTube, + hightOfTheTube, + startAngleOfTheTube18, + spanningAngleOfTheTube18); + + logicMod18 = new G4LogicalVolume(solidMod18, ModMater, "Mod18",0,0,0); + physiMod18 = new G4PVPlacement(0, // no rotation + positionMod18, // at (x,y,z) + logicMod18, // its logical volume + "Mod18", // its name + logicMod0, // its mother volume + false, // no boolean operations + 0); // no particular field + + //******************************** + // WATER PHANTOM + // is a cube full of water + // in wich it is possible + // insert the detectors for + // depth and lateral dose profiles + // reconstruction + //******************************** + + G4double WaterPhantomDimension = 200. *mm; + G4double WaterPhantomPosition_x = 1248.59 *mm; + G4double WaterPhantomPosition_y = 0.0 *mm; + G4double WaterPhantomPosition_z = 0.0 *mm; + + G4Box* WaterPhantom = new G4Box("WaterPhantom", + WaterPhantomDimension, + WaterPhantomDimension, + WaterPhantomDimension); + + logicWaterPhantom = new G4LogicalVolume(WaterPhantom, + Water, + "WaterPhantom"); + physiWaterPhantom = new G4PVPlacement(0, + G4ThreeVector(WaterPhantomPosition_x, + WaterPhantomPosition_y, + WaterPhantomPosition_z), + "WaterPhantom", + logicWaterPhantom, + physiTreatmentRoom, + false, + 0); + + // ************************* + // DOSEMETER + // It is a detector placed + // inside the water phantom + // ************************* + + G4int NbOfLayer = 20000; //Number of the layer of the dosimeter + + G4double innerRadiusDosemeter = 0. *mm; + G4double outerRadiusDosemeter = 3. *mm; + G4double hightDosemeter = 0.001 *mm; + G4double startAngleDosemeter = 0. *deg; + G4double spanningAngleDosemeter = 360. *deg; + + G4double DosemeterPosition_x = (- WaterPhantomDimension + hightDosemeter); + + solidDosemeter = new G4Tubs("Dosemeter", + innerRadiusDosemeter, + outerRadiusDosemeter, + hightDosemeter, + startAngleDosemeter, + spanningAngleDosemeter); + + logicDosemeter = new G4LogicalVolume(solidDosemeter, + Water, + "Dosemeter", + 0, + 0, + 0); + + if (NbOfLayer != 0) + { + + for (G4int j = 0; j < NbOfLayer; j ++) + + { + + physiDosemeter = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector(DosemeterPosition_x, + 0., + 0.)), + "Dosemeter", + logicDosemeter, + physiWaterPhantom, + false, + j); + + DosemeterPosition_x = DosemeterPosition_x + hightDosemeter*2.; + + } + } + else + { + physiDosemeter = new G4PVPlacement(G4Transform3D(rm, + G4ThreeVector(DosemeterPosition_x, + 0., + 0.)), + "Dosemeter", + logicDosemeter, + physiWaterPhantom, + false, + 0); + } + + + // ************** + // Cut by Region + // ************** + G4Region* aRegion = new G4Region("Dosemeter"); + logicDosemeter->SetRegion(aRegion); + aRegion->AddRootLogicalVolume(logicDosemeter); + + // ******************************* + // Sensitive Detectors: Dosimeter + // ******************************* + + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + + if(!calorimeterSD) + { + calorimeterSD = new HadrontherapyCalorimeterSD("CalorSD",this); + SDman->AddNewDetector( calorimeterSD ); + } + if (logicDosemeter) + logicDosemeter->SetSensitiveDetector(calorimeterSD); + + // ************************* + // Visualization attributes + // ************************* + + G4VisAttributes * yellow = new G4VisAttributes( G4Colour(1., 1., 0. )); + yellow-> SetVisibility(true); + yellow-> SetForceSolid(true); + + G4VisAttributes * gray = new G4VisAttributes( G4Colour(0.5, 0.5, 0.5 )); + gray-> SetVisibility(true); + gray-> SetForceSolid(true); + + G4VisAttributes * red = new G4VisAttributes( G4Colour(1. ,0. ,0.)); + red-> SetVisibility(true); + red-> SetForceSolid(true); + + G4VisAttributes * blue = new G4VisAttributes( G4Colour(0. ,0. ,1.)); + blue -> SetVisibility(true); + blue -> SetForceSolid(true); + + G4VisAttributes * green = new G4VisAttributes( G4Colour(0. ,1. ,0.)); + green -> SetVisibility(true); + green -> SetForceSolid(true); + + G4VisAttributes * white = new G4VisAttributes( G4Colour()); + white -> SetVisibility(true); + white -> SetForceSolid(true); + + G4VisAttributes * brawn = new G4VisAttributes( G4Colour(0.8, 0.5, 0.35)); + brawn -> SetVisibility(true); + brawn -> SetForceSolid(true); + + logicTreatmentRoom->SetVisAttributes (G4VisAttributes::Invisible); + logicBeamLineSupport -> SetVisAttributes(gray); + logicBeamLineCover -> SetVisAttributes(blue); + logicBeamLineCover2 -> SetVisAttributes(blue); + logicFirstCollimatorModulatorBox -> SetVisAttributes(blue); + logicHoleFirstCollimatorModulatorBox ->SetVisAttributes (white); + logicSecondCollimatorModulatorBox -> SetVisAttributes(blue); + logicFirstMonitorLayer1 -> SetVisAttributes(brawn); + logicSecondMonitorLayer1 -> SetVisAttributes(brawn); + logicThirdMonitorLayer1 -> SetVisAttributes(brawn); + logicNozzleSupport -> SetVisAttributes(white); + logicHoleNozzleSupport -> SetVisAttributes(yellow); + logicFinalCollimator -> SetVisAttributes(red); + //logicWaterPhantom -> SetVisAttributes(red); + logicDosemeter -> SetVisAttributes(G4VisAttributes::Invisible); + logicFirstCollimator -> SetVisAttributes(white); + logicSecondCollimator -> SetVisAttributes(white); + logicMotherMod -> SetVisAttributes( G4VisAttributes::Invisible ); + logicMod0 -> SetVisAttributes ( G4VisAttributes::Invisible ); + logicMod1 -> SetVisAttributes(red); + logicMod2 -> SetVisAttributes(red); + logicMod3 -> SetVisAttributes(red); + logicMod4 -> SetVisAttributes(red); + logicMod5 -> SetVisAttributes(red); + logicMod6 -> SetVisAttributes(red); + logicMod7 -> SetVisAttributes(red); + logicMod8 -> SetVisAttributes(red); + logicMod9 -> SetVisAttributes(red); + logicMod10 -> SetVisAttributes(red); + logicMod11 -> SetVisAttributes(red); + logicMod12 -> SetVisAttributes(red); + logicMod13 -> SetVisAttributes(red); + logicMod14 -> SetVisAttributes(red); + logicMod15 -> SetVisAttributes(red); + logicMod16 -> SetVisAttributes(red); + logicMod17 -> SetVisAttributes(red); + logicMod18 -> SetVisAttributes(red); + + // ********************************* + // always return the physical World + // ********************************* + + return physiTreatmentRoom; +} + +// -------------------------------------------------------------- +void HadrontherapyDetectorConstruction::SetModulatorAngle(G4double val) +{ + // change Gap thickness and recompute the calorimeter parameters + + ModulatorAngle = val; + delete physiMotherMod; + + G4double alpha = 90 *deg; + G4RotationMatrix rm3; + rm3.rotateY(alpha); + rm3.rotateX(ModulatorAngle); + G4ThreeVector positionMotherMod = G4ThreeVector(-1011.91 *mm, 30 *mm, 50 *mm); + + physiMotherMod = new G4PVPlacement(G4Transform3D(rm3,positionMotherMod), // rotation + logicMotherMod, // its logical volume + "MotherMod", // its name + logicTreatmentRoom, // its mother volume + false, // no boolean operations + 0); // no particular field + + G4cout << "MODULATOR HAS BEEN ROTATED OF " << ModulatorAngle << " GRADIENTS" << G4endl; + + + + + + G4RunManager::GetRunManager()-> GeometryHasBeenModified(); + +} +// -------------------------------------------------------------- + + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyDetectorMessenger.cc b/examples/advanced/hadrontherapy/src/HadrontherapyDetectorMessenger.cc new file mode 100755 index 0000000000..17aded8579 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyDetectorMessenger.cc @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyDetectorMessenger.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo, Francesco Di Rosa +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyDetectorMessenger.hh" +#include "HadrontherapyDetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithoutParameter.hh" + +// ----------------------------------------------------------------------------- +HadrontherapyDetectorMessenger::HadrontherapyDetectorMessenger( + HadrontherapyDetectorConstruction* HadrontherapyDet) + :HadrontherapyDetector(HadrontherapyDet) +{ + HadronDir = new G4UIdirectory("/modulator/"); + HadronDir->SetGuidance("Command to rotate the modulator wheel"); + + detDir = new G4UIdirectory("/modulator/angle/"); + detDir->SetGuidance("Modulator angle control"); + + ModulatorAngleCmd = new G4UIcmdWithADoubleAndUnit("/modulator/angle/modAngle",this); + ModulatorAngleCmd->SetGuidance("Set Modulator Angle"); + ModulatorAngleCmd->SetParameterName("Size",false); + ModulatorAngleCmd->SetRange("Size>=0."); + ModulatorAngleCmd->SetUnitCategory("Angle"); + ModulatorAngleCmd->AvailableForStates(G4State_PreInit,G4State_Idle); +} + +// ------------------------------------------------------------------------------- +HadrontherapyDetectorMessenger::~HadrontherapyDetectorMessenger() +{ + + delete ModulatorAngleCmd; + delete detDir; + delete HadronDir; +} +// -------------------------------------------------------------------------------- +void HadrontherapyDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + + if( command == ModulatorAngleCmd ) + { HadrontherapyDetector->SetModulatorAngle(ModulatorAngleCmd->GetNewDoubleValue(newValue));} + +} +// ------------------------------------------------------------------------------------ diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyEventAction.cc b/examples/advanced/hadrontherapy/src/HadrontherapyEventAction.cc new file mode 100755 index 0000000000..6b9696ef65 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyEventAction.cc @@ -0,0 +1,110 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyEventAction.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyEventAction.hh" +#include "HadrontherapyRunAction.hh" +#include "HadrontherapyHit.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4HCofThisEvent.hh" +#include "G4VHitsCollection.hh" +#include "G4SDManager.hh" +#include "G4UImanager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "G4UnitsTable.hh" +#include "HadrontherapyCalorimeterSD.hh" + +// ------------------------------------------------------------------- +HadrontherapyEventAction::HadrontherapyEventAction(HadrontherapyRunAction* runAction) + :calorimeterCollID(-1), eventMessenger(NULL), verboselevel(0) +{ + p_Run = runAction; +} + +// -------------------------------------------------------------------- +HadrontherapyEventAction::~HadrontherapyEventAction() +{ +} + +// -------------------------------------------------------------------- +void HadrontherapyEventAction::BeginOfEventAction(const G4Event* evt) +{ + event_id = evt->GetEventID(); + if (calorimeterCollID==-1) + { + G4SDManager * SDman = G4SDManager::GetSDMpointer(); + calorimeterCollID = SDman->GetCollectionID("CalCollection"); + } + + nstep = 0. ; + for (G4int slice = 0; slice < 20000; slice ++) //slice dependence + { + energyDep[slice]=0; + } +} + +// --------------------------------------------------------------------- +void HadrontherapyEventAction::EndOfEventAction(const G4Event* evt) +{ + if (calorimeterCollID < 0) return; + + G4HCofThisEvent* HCE = evt->GetHCofThisEvent(); + HadrontherapyHitsCollection* CHC = NULL; + if(HCE) + CHC = (HadrontherapyHitsCollection*)(HCE->GetHC(calorimeterCollID)); + + if(CHC) + { + G4int HitCount = CHC->entries(); + + for (G4int h=0; h < HitCount; h++) + { + G4int j=((*CHC)[h])->GetSliceID(); + energyDep[j]+=((*CHC)[h]->GetEdep()); + p_Run->EnergyTotSlice(j,energyDep[j]); + } + } +} +G4int HadrontherapyEventAction::Trasporto() +{ + G4int var = event_id; + return var; +} + + + + + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyHit.cc b/examples/advanced/hadrontherapy/src/HadrontherapyHit.cc new file mode 100755 index 0000000000..dea4ae4ad3 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyHit.cc @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyHit.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyHit.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4LogicalVolume.hh" + +G4Allocator HadrontherapyHitAllocator; + +// ----------------------------------------------------------------- +HadrontherapyHit::HadrontherapyHit(G4int j) + :slice(j) +{ + m_Edep = 0; +} + +// ---------------------------------------------------------------- +HadrontherapyHit::~HadrontherapyHit() +{ +} + +// ---------------------------------------------------------------- +HadrontherapyHit::HadrontherapyHit(const HadrontherapyHit &right):G4VHit() +{ + slice = right.slice; + m_Edep = right.m_Edep; +} + +// ----------------------------------------------------------------- +const HadrontherapyHit& HadrontherapyHit::operator=(const HadrontherapyHit &right) +{ + m_Edep = right.m_Edep; + slice = right.slice; + return *this; +} + +// ----------------------------------------------------------------- +int HadrontherapyHit::operator==(const HadrontherapyHit &right) const +{ + return (slice==right.slice); +} + +// ---------------------------------------------------------------- +void HadrontherapyHit::Draw() +{ +} + +// ---------------------------------------------------------------- +void HadrontherapyHit::Print() +{ +} diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyPhysicsList.cc b/examples/advanced/hadrontherapy/src/HadrontherapyPhysicsList.cc new file mode 100755 index 0000000000..e6f86e9a3d --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyPhysicsList.cc @@ -0,0 +1,475 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyPhysicsList.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "globals.hh" +#include "HadrontherapyPhysicsList.hh" +#include "HadrontherapyDetectorConstruction.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleWithCuts.hh" +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" +#include "G4Material.hh" +#include "G4VeLowEnergyLoss.hh" +#include "G4EnergyLossTables.hh" +#include "G4ios.hh" +#include + +// --------------------------------------------------------------------- +HadrontherapyPhysicsList::HadrontherapyPhysicsList(HadrontherapyDetectorConstruction* p) + :G4VUserPhysicsList() +{ + pDet = p; + + currentDefaultCut = defaultCutValue = 10 *mm; + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForProton = defaultCutValue; + SetVerboseLevel(1); +} + +// ---------------------------------------------------------------------- +HadrontherapyPhysicsList::~HadrontherapyPhysicsList() +{ +} + +// ----------------------------------------------------------------------- +void HadrontherapyPhysicsList::ConstructParticle() +{ + // In this method, static member functions should be called + // for all particles which you want to use. + // This ensures that objects of these particle types will be + // created in the program. + + ConstructBosons(); + ConstructLeptons(); + ConstructMesons(); + ConstructBarions(); + ConstructIons(); +} + +// ----------------------------------------------------------------------- +void HadrontherapyPhysicsList::ConstructBosons() +{ + // ******* + // gamma + // ******* + G4Gamma::GammaDefinition(); + + // **************** + // optical photons + // **************** + G4OpticalPhoton::OpticalPhotonDefinition(); +} + +// ------------------------------------------------------------------------ +void HadrontherapyPhysicsList::ConstructLeptons() +{ + // ******* + // leptons + // ******* + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); +} + +// ------------------------------------------------------------------------ +void HadrontherapyPhysicsList::ConstructMesons() +{ + // ******** + // mesons + // ******** + G4PionPlus::PionPlusDefinition(); + G4PionMinus::PionMinusDefinition(); + G4PionZero::PionZeroDefinition(); + G4KaonPlus::KaonPlusDefinition(); + G4KaonMinus::KaonMinusDefinition(); +} + +// ------------------------------------------------------------------------ +void HadrontherapyPhysicsList::ConstructBarions() +{ + // ********** + // barions + // ********** + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4AntiNeutron::AntiNeutronDefinition(); +} + +// ----------------------------------------------------------------------- +void HadrontherapyPhysicsList::ConstructIons() +{ + // ****** + // ions + // ****** + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4He3::He3Definition(); + G4Alpha::AlphaDefinition(); + G4GenericIon::GenericIonDefinition(); +} + +// ----------------------------------------------------------------------- +void HadrontherapyPhysicsList::ConstructProcess() +{ + AddTransportation(); + ConstructEM(); + ConstructHad(); + ConstructGeneral(); +} + +// ----------------------------------------------------------------------- +// Electromagnetic processes valid for all charged particles +// ----------------------------------------------------------------------- +#include "G4MultipleScattering.hh" +// >>> gamma << +#include "G4LowEnergyRayleigh.hh" +#include "G4LowEnergyPhotoElectric.hh" +#include "G4LowEnergyCompton.hh" +#include "G4LowEnergyGammaConversion.hh" + +// >>> e- <<< +#include "G4LowEnergyIonisation.hh" +#include "G4LowEnergyBremsstrahlung.hh" + +// >>> e+ <<< +#include "G4eplusAnnihilation.hh" +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" + +// >>> Alpha and generic Ions, deuteron, triton, He3 <<< +#include "G4hLowEnergyIonisation.hh" +// hLowEnergyIonisation uses Ziegler 1988 as the default +#include "G4EnergyLossTables.hh" + +// >>> muon <<<< +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4MuonMinusCaptureAtRest.hh" + +// >>> Standard process for gamma <<< +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4PhotoElectricEffect.hh" + +// >>> Standard processes for hadro ionisation <<< +#include "G4hIonisation.hh" + +// ------------------------------------------------------------------------------ +void HadrontherapyPhysicsList::ConstructEM() +{ + G4int LowEnergy = 1; + // to active the Low Energy processes make LowEnergy =1; + + // *********** + // processes + // *********** + G4MultipleScattering* aMultipleScattering = new G4MultipleScattering(); + G4LowEnergyPhotoElectric* lowePhot = new G4LowEnergyPhotoElectric(); + G4LowEnergyIonisation* loweIon = new G4LowEnergyIonisation(); + G4LowEnergyBremsstrahlung* loweBrem = new G4LowEnergyBremsstrahlung(); + G4hLowEnergyIonisation* ahadronLowEIon = new G4hLowEnergyIonisation(); + + if (LowEnergy == 1) + { + ahadronLowEIon -> SetNuclearStoppingPowerModel("ICRU_R49") ; // ICRU49 models for nuclear SP + ahadronLowEIon -> SetNuclearStoppingOn() ; + + // setting tables explicitly for electronic stopping power + ahadronLowEIon -> SetElectronicStoppingPowerModel(G4GenericIon::GenericIonDefinition(), + "ICRU_R49p") ; // ICRU49 models for elettronic SP + ahadronLowEIon -> SetElectronicStoppingPowerModel(G4Proton::ProtonDefinition(), + "ICRU_R49p") ; + // Switch off the Barkas and Bloch corrections + ahadronLowEIon -> SetBarkasOff(); + } + + theParticleIterator -> reset(); + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + G4String particleType = particle->GetParticleType(); + G4double charge = particle->GetPDGCharge(); + + if (particleName == "gamma") + { + // >>> gamma <<< + + if (LowEnergy == 1) { + // Low Energy processes + pmanager->AddDiscreteProcess(new G4LowEnergyRayleigh()); + pmanager->AddDiscreteProcess(lowePhot); + pmanager->AddDiscreteProcess(new G4LowEnergyCompton()); + pmanager->AddDiscreteProcess(new G4LowEnergyGammaConversion()); + } + + else { + // Standard processes + pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); + pmanager->AddDiscreteProcess(new G4ComptonScattering); + pmanager->AddDiscreteProcess(new G4GammaConversion); + } + } + + else if (particleName == "e-") + + { + // >>> electron <<< + + if (LowEnergy == 1) { + // Low energy process + pmanager->AddProcess(aMultipleScattering, -1, 1, 1); + pmanager->AddProcess(loweIon, -1, 2, 2); + pmanager->AddProcess(loweBrem, -1,-1, 3); + } + + else { + // Standard processes + pmanager->AddProcess(aMultipleScattering, -1, 1, 1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + } + } + + else if (particleName == "e+") + { + // >>> positron <<< + + // Standard processes + pmanager->AddProcess(aMultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + + } + else if( particleName == "mu+" || + particleName == "mu-" ) + { + // >>> muon <<< + pmanager->AddProcess(aMultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); + + } + else if ( + particleName == "proton" + || particleName == "antiproton" + || particleName == "pi+" + || particleName == "pi-" + || particleName == "kaon+" + || particleName == "kaon-" + ) + { + + if (LowEnergy == 1) { + pmanager->AddProcess(aMultipleScattering, -1,1,1); + pmanager->AddProcess(ahadronLowEIon, -1,2,2); + } + else { + pmanager->AddProcess(aMultipleScattering, -1,1,1); + pmanager->AddProcess(new G4hIonisation, -1,2,2); + } + } + + else if ((!particle->IsShortLived()) && + (charge != 0.0) ) + { + //all others charged particles except geantino + + if (LowEnergy == 1) { + pmanager->AddProcess(aMultipleScattering,-1,1,1); + pmanager->AddProcess(ahadronLowEIon, -1,2,2); + + } + else { + pmanager->AddProcess(aMultipleScattering,-1,1,1); + pmanager->AddProcess(new G4hIonisation(),-1, 2,2); + } + + } + } +} + +// ---------------------------------------------------------------------- +#include "G4Decay.hh" +void HadrontherapyPhysicsList::ConstructGeneral() +{ + G4Decay* theDecayProcess = new G4Decay(); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + //add decay process + if (theDecayProcess->IsApplicable(*particle)) { + pmanager ->AddProcess(theDecayProcess); + // set ordering for PostStepDoIt and AtRestDoIt + pmanager ->SetProcessOrdering(theDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(theDecayProcess, idxAtRest); + } + } +} + +// ---------------------------------------------------------------------- +#include "G4ProtonInelasticProcess.hh" +#include "G4HadronElasticProcess.hh" +#include "G4LElastic.hh" +#include "G4LEProtonInelastic.hh" +#include "G4HEProtonInelastic.hh" + +void HadrontherapyPhysicsList:: ConstructHad() +{ + G4int Hadronic = 1; + // to activate the hadronic processes make Hadronic =1 + + if(Hadronic == 1) + { + G4HadronElasticProcess* theElasticProcess = new G4HadronElasticProcess; + G4LElastic* theElasticModel = new G4LElastic; + theElasticProcess->RegisterMe(theElasticModel); + + theParticleIterator->reset(); + while ((*theParticleIterator)()) + { + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "proton") + { + pmanager->AddDiscreteProcess(theElasticProcess); + G4ProtonInelasticProcess* theInelasticProcess = new G4ProtonInelasticProcess("inelastic"); + G4LEProtonInelastic* theLEInelasticModel = new G4LEProtonInelastic; + theInelasticProcess->RegisterMe(theLEInelasticModel); + G4HEProtonInelastic* theHEInelasticModel = new G4HEProtonInelastic; + theInelasticProcess->RegisterMe(theHEInelasticModel); + pmanager->AddDiscreteProcess(theInelasticProcess); + } + } + } +} +#include "G4Region.hh" +#include "G4RegionStore.hh" +void HadrontherapyPhysicsList::SetCuts() +{ + // reactualise cutValues + if (currentDefaultCut != defaultCutValue) + { + if(cutForGamma == currentDefaultCut) cutForGamma = defaultCutValue; + if(cutForElectron == currentDefaultCut) cutForElectron = defaultCutValue; + if(cutForProton == currentDefaultCut) cutForProton = defaultCutValue; + currentDefaultCut = defaultCutValue; + } + + // set cut values for gamma at first and for e- second and next for e+, + // because some processes for e+/e- need cut values for gamma + SetCutValue(cutForGamma,"gamma"); + SetCutValue(cutForElectron,"e-"); + SetCutValue(cutForElectron,"e+"); + + + // Cut per region + // in region dosemeter we need a very accurate precision + G4Region* region; + G4String regName; + G4ProductionCuts* cuts; + + regName = "Dosemeter"; + region = G4RegionStore::GetInstance()->GetRegion(regName); + cuts = new G4ProductionCuts; + cuts->SetProductionCut(0.02*mm,G4ProductionCuts::GetIndex("gamma")); + cuts->SetProductionCut(0.02*mm,G4ProductionCuts::GetIndex("e-")); + cuts->SetProductionCut(0.02*mm,G4ProductionCuts::GetIndex("e+")); + region->SetProductionCuts(cuts); + + // SetCutValueForOthers(defaultCutValue); + + if (verboseLevel >0){ + G4cout << "HadrontherapyPhysicsList::SetCuts:"; + G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + + if (verboseLevel>0) DumpCutValuesTable(); +} + +// --------------------------------------------------------------------------- +void HadrontherapyPhysicsList::SetGammaCut(G4double val) +{ + ResetCuts(); + cutForGamma = val; +} + +// --------------------------------------------------------------------------- +void HadrontherapyPhysicsList::SetElectronCut(G4double val) +{ + ResetCuts(); + cutForElectron = val; +} + +// --------------------------------------------------------------------------- +void HadrontherapyPhysicsList::SetProtonCut(G4double val) +{ + ResetCuts(); + cutForProton = val; +} + +// --------------------------------------------------------------------------- +void HadrontherapyPhysicsList::GetRange(G4double val) +{ + G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable(); + G4Material* currMat = pDet->GetDosemeterMaterial(); + + G4ParticleDefinition* part; + G4double cut; + part = theParticleTable->FindParticle("e-"); + cut = G4EnergyLossTables::GetRange(part,val,currMat); + G4cout << "material : " << currMat->GetName() << G4endl; + G4cout << "particle : " << part->GetParticleName() << G4endl; + G4cout << "energy : " << G4BestUnit(val,"Energy") << G4endl; + G4cout << "range : " << G4BestUnit(cut,"Length") << G4endl; +} + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyPrimaryGenerationAction.cc b/examples/advanced/hadrontherapy/src/HadrontherapyPrimaryGenerationAction.cc new file mode 100755 index 0000000000..d09701ae61 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyPrimaryGenerationAction.cc @@ -0,0 +1,138 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyPrimaryGeneratorAction.cc,v 1.0 +// +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// -------------------------------------------------------------- + +#include "HadrontherapyPrimaryGeneratorAction.hh" +#include "HadrontherapyDetectorConstruction.hh" +//#include "HadrontherapyPrimaryGeneratorMessenger.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "Randomize.hh" +// ------------------------------------------------------------------------- +HadrontherapyPrimaryGeneratorAction::HadrontherapyPrimaryGeneratorAction( + HadrontherapyDetectorConstruction* HadrontherapyDC) + :HadrontherapyDetector(HadrontherapyDC) + + +{ + particleGun = new G4ParticleGun(); + SetDefaultKinematic(); + + //create a messenger for this class + //gunMessenger = new HadrontherapyPrimaryGeneratorMessenger(this); +} + +// ------------------------------------------------------------------------- +HadrontherapyPrimaryGeneratorAction::~HadrontherapyPrimaryGeneratorAction() +{ + delete particleGun; + //delete gunMessenger; +} + +// ------------------------------------------------------------------------ +void HadrontherapyPrimaryGeneratorAction::SetDefaultKinematic() +{ + // **************************** + // default particle kinematic + // **************************** + + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4ParticleDefinition* particle = particleTable->FindParticle("proton"); + particleGun -> SetParticleDefinition(particle); + particleGun -> SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.)); + particleGun -> SetParticleEnergy(63.4 *MeV); + particleGun -> SetParticlePosition(G4ThreeVector( -200.0 *cm, 0.0 *cm,0.0 *cm )); +} + +// ------------------------------------------------------------------------- +void HadrontherapyPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + // **************************************** + // Set the beam angular apread + // and spot size + // beam spot size + // **************************************** + + G4double X0 = -2000 *mm; + G4double Y0 = 0.0 *cm; + G4double Z0 = 0.0 *cm; + + G4double sigmaY = 1.0 *mm ; + G4double sigmaZ = 1.0 *mm ; + + G4double x = X0; + G4double y = Y0; + G4double z = Z0; + + if ( sigmaY > 0.0 ) + { + y += G4RandGauss::shoot( 0., sigmaY ); + } + + if ( sigmaZ > 0.0 ) + { + z += G4RandGauss::shoot( Z0, sigmaZ ); + } + + particleGun -> SetParticlePosition(G4ThreeVector( x , y , z ) ); + + // ******************************************** + // Set the beam energy and energy spread + // ******************************************** + + G4double meanKineticEnergy = 63.4 *MeV; + G4double sigmaK = 300.0 *keV; + G4double kineticEnergy = G4RandGauss::shoot ( meanKineticEnergy, sigmaK ); + + particleGun -> SetParticleEnergy ( kineticEnergy ); + particleGun -> GeneratePrimaryVertex( anEvent ); + + G4double momentumY = 0.0; + G4double momentumZ = 0.0; + G4double sigmaMomentumY = 0.0001; + G4double sigmaMomentumZ = 0.0001; + + if ( sigmaMomentumY > 0.0 ) + { + momentumY += G4RandGauss::shoot( 0., sigmaMomentumY ); + } + if ( sigmaMomentumZ > 0.0 ) + { + momentumZ += G4RandGauss::shoot( 0., sigmaMomentumZ ); + } + + particleGun -> SetParticleMomentumDirection(G4ThreeVector(1.,momentumY,momentumZ)); +} + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyRunAction.cc b/examples/advanced/hadrontherapy/src/HadrontherapyRunAction.cc new file mode 100755 index 0000000000..58f91f93d2 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyRunAction.cc @@ -0,0 +1,99 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapyRunAction.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyRunAction.hh" +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include +#include "Randomize.hh" + +// --------------------------------------------------------------- +HadrontherapyRunAction::HadrontherapyRunAction() +:NbOfLayer(20000) +{ +} + +// --------------------------------------------------------------- +HadrontherapyRunAction::~HadrontherapyRunAction() +{ +} + +// --------------------------------------------------------------- +void HadrontherapyRunAction::BeginOfRunAction(const G4Run* aRun) +{ + for (G4int i=0; i < 50000; i++) + { + energy[i] = 0.0; + }; + + +G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; + +// save Rndm status +G4RunManager::GetRunManager() -> SetRandomNumberStore(true); +HepRandom::showEngineStatus(); +} + +// --------------------------------------------------------------------- +void HadrontherapyRunAction::EndOfRunAction(const G4Run*) +{ + // WRITE ASCII FILE FOR THE REGISTRATION OF THE BRAGG PEAK + // The a two column file (piccoXX.dat) is registered. The first column represents + // the ionization chamber position (in mm of water); the second + // is the energy deposited for each position of the chamber + + for (G4int i = 0; i < 20000; i++) { + +G4double depth = 0; +depth = i*0.002; //the number represents the thickness of the ionization chamber (in mm ofwater) + + std::ofstream pmtfile("BraggPeak.out", std::ios::app); + if(pmtfile.is_open()) + + { + pmtfile << depth << '\t' << energy[i] << '\t' << G4endl; + } + } + + + // show Rndm status + HepRandom::showEngineStatus(); +} + +// ----------------------------------------------------------------------------- +void HadrontherapyRunAction::EnergyTotSlice(G4int slice, G4double energy_dep) +{ + energy[ slice ] = energy [ slice ] + energy_dep; +} diff --git a/examples/advanced/hadrontherapy/src/HadrontherapySteppingAction.cc b/examples/advanced/hadrontherapy/src/HadrontherapySteppingAction.cc new file mode 100755 index 0000000000..6cf87473a4 --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapySteppingAction.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HadrontherapySteppingAction.cc,v 1.0 +// -------------------------------------------------------------- +// GEANT 4 - Hadrontherapy example +// -------------------------------------------------------------- +// Code developed by: +// +// G.A.P. Cirrone, G. Russo +// Laboratori Nazionali del Sud - INFN, Catania, Italy +// +// -------------------------------------------------------------- +#include "HadrontherapyDetectorConstruction.hh" +#include "G4EnergyLossTables.hh" +#include "G4SteppingManager.hh" +#include "G4TrackVector.hh" +#include "HadrontherapySteppingAction.hh" +#include "HadrontherapyPrimaryGeneratorAction.hh" +#include "HadrontherapyEventAction.hh" +#include "HadrontherapyRunAction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4ios.hh" +#include +#include "G4UImanager.hh" + +// ----------------------------------------------------------------- +HadrontherapySteppingAction::HadrontherapySteppingAction(HadrontherapyEventAction* EA) +{ + eventaction = EA; +} + +// ---------------------------------------------------------------- +HadrontherapySteppingAction::~HadrontherapySteppingAction() +{ +} + +// ----------------------------------------------------------------- +void HadrontherapySteppingAction::UserSteppingAction(const G4Step* aStep) +{ + event_id = eventaction -> Trasporto(); + //the function Trasporto takes the event's number from EventAction Class + +G4double x = aStep -> GetPostStepPoint() -> GetPosition().x(); +G4double y = aStep -> GetPostStepPoint() -> GetPosition().y(); +G4double z = aStep -> GetPostStepPoint() -> GetPosition().z(); + +G4Track * theTrack = aStep -> GetTrack(); +G4double TrackID = theTrack -> GetTrackID(); +G4double KEnergy = theTrack -> GetKineticEnergy(); + +G4double thicknessPlane = 1 *mm; +G4double xPlane = 1048.59 *mm; + + +//------------------------------------------------------------ +// The PLANE that simulate radiochromic film +// Particles that interact within this "software plane" are registered; + + if (event_id == 0) {Controllo = 0;} + + if (x >= xPlane & x <= (xPlane+thicknessPlane) & Controllo != event_id & TrackID == 1) + { + Controllo = event_id; +// ---------------------------------------------------------- +// WRITE ASCII FILES +// Properties of the particles interacting with the plane +// are registered in two different files. Exactly +// Number of event and kinetic energy are registered in the disEnXX.dat file; +// Coordinates of the particles are registered in the disAngXX.dat file; + + std::ofstream pmtfile("energyDistribution.out", std::ios::app); + if(pmtfile.is_open()) + + { + pmtfile << KEnergy << '\t' << " " << event_id << '\t' << G4endl; + } + + std::ofstream pmtfile2("angularDistribution.out", std::ios::app); + if(pmtfile2.is_open()) + + { + pmtfile2 << x/mm << '\t' <<" " << y/mm << '\t' <<" " << z/mm << '\t' << G4endl; + } + } +} + + + + + diff --git a/examples/advanced/hadrontherapy/src/HadrontherapyVisManager.cc b/examples/advanced/hadrontherapy/src/HadrontherapyVisManager.cc new file mode 100755 index 0000000000..d69ac2cbdd --- /dev/null +++ b/examples/advanced/hadrontherapy/src/HadrontherapyVisManager.cc @@ -0,0 +1,144 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: HadrontherapyVisManager.cc +// +// +// John Allison 24th January 1998. + +#ifdef G4VIS_USE + +#include "HadrontherapyVisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4HepRep.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPACS +#include "G4Wo.hh" +#include "G4Xo.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +HadrontherapyVisManager::HadrontherapyVisManager () {} + +void HadrontherapyVisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4HepRep); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + + #ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); + #endif + +#ifdef G4VIS_USE_OPACS + RegisterGraphicsSystem (new G4Wo); + RegisterGraphicsSystem (new G4Xo); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} +#endif diff --git a/examples/advanced/hadrontherapy/visualisation.mac b/examples/advanced/hadrontherapy/visualisation.mac new file mode 100755 index 0000000000..a79465b7f1 --- /dev/null +++ b/examples/advanced/hadrontherapy/visualisation.mac @@ -0,0 +1,32 @@ + +#*********************** +# visulisation.mac +# +#*********************** + +/process/activate Transportation all +/hits/activate +/hits/verbose 0 + +/gun/particle proton + + +/tracking/verbose 0 +/run/initialize +/vis/scene/create +/vis/open OGLIX + +/vis/viewer/set/viewpointThetaPhi 40 160 deg + +/vis/scene/endOfEventAction accumulate +/tracking/storeTrajectory 1 +/vis/scene/add/trajectories + +/vis/viewer/zoom 1.1 +##### Rotation of the modulator +#/modulator/angle/modAngle 45 deg +#/vis/viewer/refresh +####### +/run/beamOn 50 + + diff --git a/examples/advanced/lAr_calorimeter/History b/examples/advanced/lAr_calorimeter/History index ae59fb245a..9c99564945 100644 --- a/examples/advanced/lAr_calorimeter/History +++ b/examples/advanced/lAr_calorimeter/History @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -$Id: History,v 1.6 2004/01/28 17:58:58 ribon Exp $ +$Id: History,v 1.8 2004/05/28 11:05:41 ribon Exp $ ------------------------------------------------------------------- ========================================================= @@ -9,6 +9,12 @@ $Id: History,v 1.6 2004/01/28 17:58:58 ribon Exp $ Category History file --------------------- +28.05.04 - A.Ribon (lAr_calorimeter-V06-01-01) + Now PI light is used. + +18.05.04 - A.Ribon (lAr_calorimeter-V06-01-00) + Ported to PI. Only the setup is changed, no changes in the code. + 28.01.2004 - A.Ribon (lAr_calorimeter-V06-00-01) Clean up. Fixes for g++ 3.2 . New Physics Lists. diff --git a/examples/advanced/lAr_calorimeter/README b/examples/advanced/lAr_calorimeter/README index 871ab67262..20c716de5c 100644 --- a/examples/advanced/lAr_calorimeter/README +++ b/examples/advanced/lAr_calorimeter/README @@ -99,24 +99,16 @@ Note that histograms are disabled via the flag G4ANALYSIS_USE in GNUmakefile. - 7. Using the Anaphe implementation of the AIDA 3.0 histograms: - --------------------------------------------------------------- + 7. Using the PI implementation of the AIDA histograms: + ------------------------------------------------------ - In order to use the new Anaphe implementation of the AIDA interfaces, - prepare some environment variables by source-ing one of the following - startup scripts. + In order to setup the proper environmental variables, needed for + running AIDA / PI , run the script: - # This example has been developed and tested in the platform - # Linux Red-Hat 7.3 with compilers gcc-2.95.2 and gcc-3.2 - # (the setup below refers to gcc-2.95.2) + --- For c-shell : source setupAidaPi.csh + + --- For bash-shell : . setupAidaPi.sh + + Notice that you need g++ 3.2 or 3.23. + - o Set up the environment variable: G4ANALYSIS_USE 1 - o setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/specific/redhat73/gcc-2.95.2/5.0.6/bin - - o source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/install/sharedstart.csh or .ch - o ln -s /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.6/scripts/* ~/bin/. - (This has to be made only once) - - After this, you will have access to the last 'aida-config' command which - is used in the GNUmakefile. - diff --git a/examples/advanced/lAr_calorimeter/setupAidaPi.csh b/examples/advanced/lAr_calorimeter/setupAidaPi.csh new file mode 100755 index 0000000000..943e9e63fe --- /dev/null +++ b/examples/advanced/lAr_calorimeter/setupAidaPi.csh @@ -0,0 +1,11 @@ +#------------------------------------------------------------------ +# C-shell script to be run before building/executing this example. +#------------------------------------------------------------------ +# +# --- Geant4 specific --- +setenv G4ANALYSIS_USE 1 +# +# --- Aida / PI --- +eval `aida-config --runtime csh` +# + diff --git a/examples/advanced/lAr_calorimeter/setupAidaPi.sh b/examples/advanced/lAr_calorimeter/setupAidaPi.sh new file mode 100755 index 0000000000..cf277fbe5f --- /dev/null +++ b/examples/advanced/lAr_calorimeter/setupAidaPi.sh @@ -0,0 +1,12 @@ +#------------------------------------------------------------------ +# Bash-shell script to be run before building/executing this example. +#------------------------------------------------------------------ +# +# --- Geant4 specific --- +export G4ANALYSIS_USE=1 +# +# --- Aida / PI --- +eval `aida-config --runtime sh` +# + + diff --git a/examples/advanced/medical_linac/G4History.macro b/examples/advanced/medical_linac/G4History.macro new file mode 100644 index 0000000000..3e9284a801 --- /dev/null +++ b/examples/advanced/medical_linac/G4History.macro @@ -0,0 +1,11 @@ +/run/verbose 2 +/run/initialize +/tracking/storeTrajectory 1 +/Jaws/X1/DistanceFromAxis -15. cm +/Jaws/X2/DistanceFromAxis 15. cm +/Jaws/Y1/DistanceFromAxis -15. cm +/Jaws/Y2/DistanceFromAxis 15. cm +/Jaws/update +/energy 6.0 MeV +/sourceType 0.127 MeV +/run/beamOn 1000 diff --git a/examples/advanced/medical_linac/GNUmakefile b/examples/advanced/medical_linac/GNUmakefile new file mode 100644 index 0000000000..27ab60b70d --- /dev/null +++ b/examples/advanced/medical_linac/GNUmakefile @@ -0,0 +1,31 @@ +# -------------------------------------------------------------- +# $Id: GNUmakefile,v 1.1 2004/03/18 14:08:38 mpiergen Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := MedLinac + +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all +all: lib bin +include $(G4INSTALL)/config/architecture.gmk +include $(G4INSTALL)/config/binmake.gmk + + +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` + LOADLIBS += `aida-config --lib` +endif + +ifdef G4STORE_DATA + CPPFLAGS += -DG4STORE_DATA +endif + diff --git a/examples/advanced/medical_linac/History b/examples/advanced/medical_linac/History new file mode 100644 index 0000000000..0f85c1fa28 --- /dev/null +++ b/examples/advanced/medical_linac/History @@ -0,0 +1,35 @@ +$Id: History,v 1.4 2004/05/21 10:51:48 mpiergen Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + 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 * + ---------------------------------------------------------- +21.05.2004 Michela Piergentili, tag medical_linac-V06-01-03 + modified documentation + +21.05.2004 Michela Piergentili, tag medical_linac-V06-01-02 + added README + +14.05.2004 Michela Piergentili, tag medical_linac-V06-01-01 + decorator design iteration implemented, bug fixed in + MedLinacPhantomSD, cut per region introduced for the + first collimator + +02.04.2004 Michela Piergentili, tag medical_linac-V06-01-00 + geometry completed, bug fixed in DetectorConstruction + +18.03.2004 Michela Piergentili, tag medical_linac-V06-00-00 + First created + diff --git a/examples/advanced/medical_linac/MedLinac.cc b/examples/advanced/medical_linac/MedLinac.cc new file mode 100644 index 0000000000..d0bfb05eaa --- /dev/null +++ b/examples/advanced/medical_linac/MedLinac.cc @@ -0,0 +1,154 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinac.cc,v 1.3 2004/05/14 18:25:38 mpiergen Exp $ +// +// -------------------------------------------------------------- +// GEANT 4 - medical_linac +// +// Code developed by: M. Piergentili + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" +#include "globals.hh" +#include "G4SDManager.hh" +#include "G4UImessenger.hh" +#include "Randomize.hh" + + +#include "MedLinacDetectorMessenger.hh" +#include "MedLinacDetectorConstruction.hh" +#include "MedLinacPhysicsList.hh" +#include "MedLinacPhantomSD.hh" +#include "MedLinacPhantomHit.hh" +#include "MedLinacPrimaryGeneratorAction.hh" +#include "MedLinacEventAction.hh" +#include "MedLinacRunAction.hh" +#include "G4SDManager.hh" + + +#ifdef G4UI_USE_XM +#include "G4UIXm.hh" +#endif + +#ifdef G4VIS_USE +#include "MedLinacVisManager.hh" +#endif + +int main(int argc ,char ** argv) +{ + +//choose the Random engine + HepRandom::setTheEngine(new RanecuEngine); + G4int seed = time(0); + HepRandom :: setTheSeed(seed); + + // Construct the default run manager + G4RunManager* runManager = new G4RunManager; + G4String sensitiveDetectorName = "Phantom"; + MedLinacDetectorConstruction* pDetectorConstruction = MedLinacDetectorConstruction::GetInstance(sensitiveDetectorName); + + + // set mandatory initialization classes + runManager->SetUserInitialization(pDetectorConstruction); + runManager->SetUserInitialization(new MedLinacPhysicsList); + + +#ifdef G4VIS_USE + // Visualization manager + G4VisManager* visManager = new MedLinacVisManager; + visManager->Initialize(); +#endif + + + // output environment variables: +#ifdef G4ANALYSIS_USE + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " Using AIDA 3.0 analysis " << G4endl; +# else + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " G4ANALYSIS_USE environment variable not set, NO ANALYSIS " + << G4endl; +#endif + + + + + G4UIsession* session = 0; + if (argc == 1) // Define UI session for interactive mode. + { + session = new G4UIterminal(); + } + + // set mandatory user action class + + runManager->SetUserAction(new MedLinacPrimaryGeneratorAction); + //MedLinacEventAction *pMedLinacEventAction = new MedLinacEventAction(sensitiveDetectorName); + MedLinacEventAction *pMedLinacEventAction = new MedLinacEventAction(); + runManager->SetUserAction(pMedLinacEventAction); + + MedLinacRunAction *pRunAction = new MedLinacRunAction(sensitiveDetectorName); + + runManager->SetUserAction(pRunAction); + + + + // Initialize G4 kernel + runManager->Initialize(); + + // get the pointer to the UI manager + G4UImanager* UI = G4UImanager::GetUIpointer(); + + if (session) // Define UI session for interactive mode. + { + G4cout<<" UI session starts ..."<< G4endl; + session->SessionStart(); + delete session; + } + + else // Batch mode + { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI->ApplyCommand(command+fileName); + } + + + + + + //job termination + +#ifdef G4VIS_USE + delete visManager; +#endif + + delete runManager; + + return 0; +} + + diff --git a/examples/advanced/medical_linac/README b/examples/advanced/medical_linac/README new file mode 100644 index 0000000000..42ddf40e4e --- /dev/null +++ b/examples/advanced/medical_linac/README @@ -0,0 +1,181 @@ +$Id: README,v 1.2 2004/05/21 11:52:32 mpiergen Exp $ +------------------------------------------------------------------- + + + ========================================================= + Geant4 - Medical Linac example + ========================================================= + + README + --------------------- + + +------------------------------------------------------------------------ +----> Introduction. + +Medical_Linac is an example of application of Geant4 in a medical physics +envinronment. It simulates energy deposit in a Phantom filled with water +for a typical linac used for intensity modulated radiation therapy. +The experimental set-up is very similar to one used in clinical practice. + +------------------------------------------------------------------------ +----> 1.Experimental set-up. + +The elements simulated are: + +1-The point source of electrons (the distribution of the electron energy + and the electron radial intensity was assumed Gaussian in shape) + (the beam is along the z axis) +2-The primary collimator +3-The target +4-The vacuum window +5-The flattening filter +6-The ion chamber +7-The mirror +8-The secondary movable collimators (jaws) +9-The light field reticle +10-The phantom (filled with water) + +The objects (2) and (3) are in a box filled with vacuum. +The world volume is filled with air. +The distance between the upper surface of the target and the upper surface +of the phantom (SSD) is 100 cm. + +------------------------------------------------------------------------ +----> 2.Setting up the environment variables + +compiler = gcc-3.2.3 + +setenv G4SYSTEM Linux-g++ + +setenv G4INSTALL points to the installation directory of GEANT4; + +setenv G4LIB point to the compiled libraries of GEANT4; + +setenv G4WORKDIR points to the work directory; + +setenv CLHEP_BASE_DIR points to the installation directory of CHLEP; + +setenv G4LEDATA points to the low energy electromagnetic libraries - G4EMLOW2.3 + +setup for analysis: AIDA 3.2.1, PI 1.2.1 + +Users can download the analysis tools from: + +http://aida.freehep.org/ +http://www.cern.ch/PI + +#------------------------------------------ + + - Setup for Visualization + + IMPORTANT: be sure that your Geant4 installation has been done + with the proper visualization drivers; for details please see the + file geant4/source/visualization/README. + + To use the visualization drivers set the following variables in + your local environment: + + setenv G4VIS_USE_OPENGLX 1 # OpenGL visualization + setenv G4VIS_USE_DAWNFILE 1 # DAWN file + setenv G4VIS_USE_VRMLFILE 1 # VRML file + setenv G4VRMLFILE_VIEWER vrmlview # If installed + +------------------------------------------------------------------------ +----> 3.How to run the example. + +- batch mode: + +OpenGL visualization: + $G4WORDIR/bin/Linux-g++/MedLinac vis.mac + +or DAWN file: + $G4WORDIR/bin/Linux-g++/MedLinac dawnvis.mac + +or VRML file: + $G4WORDIR/bin/Linux-g++/MedLinac vrmlvis.mac + +or without visualization: + $G4WORDIR/bin/Linux-g++/MedLinac macro.mac + +- Interative mode: + 3) $G4WORDIR/bin/Linux-g++/MedLinac + +-->possible different configurations for interactive mode: + +The user can select the position of the secondary collimators (the jaws) +to obtain the desired field at isocenter: +idle>/Jaws/X1/DistanceFromAxis -20. cm +idle>/Jaws/X2/DistanceFromAxis 20. cm +idle>/Jaws/Y1/DistanceFromAxis -20. cm +idle>/Jaws/Y2/DistanceFromAxis 20. cm +idle>/Jaws/update + +The user can select the mean energy ad the standard deviation of the electrons: +idle>/energy 6.0 MeV +idle>/sourceType 0.127 MeV + +idle>/run/beamOn [NumberOfEvents] ...and then +idle>exit + +----------------------------------------------------------------------- +----> 4. The physics + +The electromagnetic physic uses the LowEnergy library, +specifically provided from GEANT4 to treat low energy processes. +The default cut in range value is 0.1 mm, a bigger cut is associated to the first collimator. + +------------------------------------------------------------------------ +----> 5. Simulation output + + The analysis part of Medical_Linac is based on the AIDA interfaces and their + implementation in Anaphe + The actual analysis produces some histograms; the histograms are saved at + the end of the run in the file "medlinac.hbk". + + It contains: + 1) 2Dhistogram with the distribution of energy in the phantom (plane xz) + 2) 1Dhistogram with the primary particle energy + + 3) 2Dhistogram with the distribution of energy )at a depth in the phantom + of 15 mm (ZThickness = 1. cm ) + + 4) 1Dhistogram with the distribution of energy along the z axis + (Y and X Thickness = 5. mm), from which the user can calculate the PDD + + 5) 1Dhistogram with the distribution of energy along the x axis + (Y and Z Thickness = 5. mm) at a depth in the phantom of 15 mm, + from which the user can calculate the flatness + + 6) 1Dhistogram with the distribution of energy along the x axis + (Y and Z Thickness = 5. mm) at a depth in the phantom of 50 mm, + from which the user can calculate the flatness + + 7) 1Dhistogram with the distribution of energy along the x axis + (Y and Z Thickness = 5. mm) at a depth in the phantom of 100 mm, + from which the user can calculate the flatness + + 8) 1Dhistogram with the distribution of energy along the x axis + (Y and Z Thickness = 5. mm) at a depth in the phantom of 200 mm, + from which the user can calculate the flatness + + Units: the energy deposit is in MeV; + x, y, z in mm for histograms + + To fill histograms from (4) to (8) I suggest you to select NumberOfEvents>500000 + + Please note that in a multiple run session, the last run always override the + hbook file. + + To use analisys remember to set G4ANALYSIS_USE. + +------------------------------------------------------------------------ +----> 6. Future plans +In next future I will put in this example the multi leaf collimator +------------------------------------------------------------------------ + +for comments, advices, doubts and questions: Michela.Piergentili@ge.infn.it + +last modified: Michela Piergentili 06/05/2004 + + diff --git a/examples/advanced/medical_linac/dawnvis.mac b/examples/advanced/medical_linac/dawnvis.mac new file mode 100644 index 0000000000..76137b1c99 --- /dev/null +++ b/examples/advanced/medical_linac/dawnvis.mac @@ -0,0 +1,36 @@ + +/control/verbose 2 +/control/saveHistory +/run/verbose 2 + + +/vis/scene/create +#/vis/open OGLIX +/vis/open DAWNFILE +#/vis/open VRML2FILE +/vis/drawVolume +/vis/viewer/update +/vis/viewer/set/viewpointThetaPhi 90 0 deg +/vis/viewer/zoom 1 + +/vis/viewer/flush +# +# draw scene/ +# +# +# for drawing the tracks +/run/initialize +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate + +/Jaws/X1/DistanceFromAxis -15. cm +/Jaws/X2/DistanceFromAxis 15. cm +/Jaws/Y1/DistanceFromAxis -15. cm +/Jaws/Y2/DistanceFromAxis 15. cm +/Jaws/update + +/energy 6.0 MeV +/sourceType 0.127 MeV +/vis/viewer/update +/run/beamOn 1000 + diff --git a/examples/advanced/medical_linac/include/MedLinacAnalysisManager.hh b/examples/advanced/medical_linac/include/MedLinacAnalysisManager.hh new file mode 100644 index 0000000000..4a3c9d7838 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacAnalysisManager.hh @@ -0,0 +1,96 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacAnalysisManager.hh,v 1.3 2004/05/14 18:25:39 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +// the class Analysis creates and managed histograms +// +#ifdef G4ANALYSIS_USE +#ifndef G4PROCESSTESTANALYSIS_HH +#define G4PROCESSTESTANALYSIS_HH + +#include "globals.hh" +#include +#include "G4ThreeVector.hh" +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" +#include "AIDA/IAnalysisFactory.h" + +namespace AIDA{ + class ITree; + class IHistogramFactory; + class IAnalysisFactory; + class ITreeFactory; +}; + +class MedLinacAnalysisManager +{ +private: + MedLinacAnalysisManager(); + +public: + + ~MedLinacAnalysisManager(); + static MedLinacAnalysisManager* getInstance(); + void book(); + void FillHistogram1WithEnergy(G4double,G4double,G4float); + void FillHistogram3WithEnergy(G4double,G4double,G4float); + void FillHistogram4WithEnergy(G4double,G4float); + void FillHistogram5WithEnergy(G4double,G4float); + void FillHistogram6WithEnergy(G4double,G4float); + void FillHistogram7WithEnergy(G4double,G4float); + void FillHistogram8WithEnergy(G4double,G4float); + void PrimaryParticleEnergySpectrum(G4double); + void finish(); + +private: + + G4double xx,zz,yy; + G4float en; + G4double x,y,z; + static MedLinacAnalysisManager* instance; + +private: + + AIDA::IAnalysisFactory* aFact; + AIDA::ITree* theTree; + AIDA::IHistogramFactory *histFact; + AIDA::ITreeFactory *treeFact; + AIDA::IHistogram2D *h1; + AIDA::IHistogram1D *h2; + AIDA::IHistogram2D *h3; + AIDA::IHistogram1D *h4; + AIDA::IHistogram1D *h5; + AIDA::IHistogram1D *h6; + AIDA::IHistogram1D *h7; + AIDA::IHistogram1D *h8; +}; + +#endif +#endif + + + diff --git a/examples/advanced/medical_linac/include/MedLinacDecorator.hh b/examples/advanced/medical_linac/include/MedLinacDecorator.hh new file mode 100644 index 0000000000..2fe0f47660 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacDecorator.hh @@ -0,0 +1,49 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDecorator.hh,v 1.1 2004/05/14 18:25:39 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#ifndef MedLinacDecorator_h +#define MedLinacDecorator_h 1 + +#include "MedLinacVGeometryComponent.hh" + +class G4VPhysicalVolume; +class MedLinacVGeometryComponent; + +class MedLinacDecorator: public MedLinacVGeometryComponent +{ +public: + MedLinacDecorator(MedLinacVGeometryComponent*); + virtual ~MedLinacDecorator(); + + virtual void ConstructComponent(G4VPhysicalVolume*, G4VPhysicalVolume*)=0; + virtual void DestroyComponent()=0; + +private: + MedLinacVGeometryComponent* component; +}; +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacDetectorConstruction.hh b/examples/advanced/medical_linac/include/MedLinacDetectorConstruction.hh new file mode 100644 index 0000000000..d1ed56f29c --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacDetectorConstruction.hh @@ -0,0 +1,151 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDetectorConstruction.hh,v 1.3 2004/05/14 18:25:39 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +#ifndef MedLinacDetectorConstruction_H +#define MedLinacDetectorConstruction_H 1 +#include "MedLinacDetectorMessenger.hh" + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" +#include "G4VisAttributes.hh" + +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Material; +class G4VPhysicalVolume; +class MedLinacDetectorMessenger; +class MedLinacVGeometryComponent; +class MedLinacPhantomSD; +class MedLinacPhantomROGeometry; +class MedLinacVoxelParameterisation; +class MedLinacDecorator; + +//#include "PhysicalConstants.hh" + +class MedLinacDetectorConstruction : public G4VUserDetectorConstruction +{ + public: + MedLinacDetectorConstruction(); + ~MedLinacDetectorConstruction(); + +public: + + void SetJawX1Pos_x (G4double); + void SetJawX2Pos_x (G4double); + void SetJawY1Pos_y (G4double); + void SetJawY2Pos_y (G4double); + + G4VPhysicalVolume* Construct(); + + void UpdateGeometry(); + void ConstructVolume(); + void ConstructSensitiveDetector(); + //void SetPhantomMaterial(G4String); + + const G4int GetNumVoxelX() {return numberOfVoxelsAlongX;} + const G4int GetNumVoxelY() {return numberOfVoxelsAlongY;} + const G4int GetNumVoxelZ() {return numberOfVoxelsAlongZ;} + //const G4double GetDimX() {return PhantomDimensionX;} + //const G4double GetDimy() {return PhantomDimensionY;} + //const G4double GetBoxDim_Z() {return PhantomDimensionZ;} + const G4double VoxelWidth_X(){return phantomDim_x/numberOfVoxelsAlongX;} + const G4double VoxelWidth_Y(){return phantomDim_y/numberOfVoxelsAlongY;} + const G4double VoxelWidth_Z(){return phantomDim_z/numberOfVoxelsAlongZ;} + void ComputeDimVoxel() {dimVoxel = phantomDim_x/numberOfVoxelsAlongX;} + + static MedLinacDetectorConstruction* GetInstance(G4String); + + + public: + + void PrintParameters(); + + G4double GetJawX1Pos_x() {return fieldX1;}; + G4double GetJawX2Pos_x() {return fieldX2;}; + G4double GetJawY1Pos_y() {return fieldY1;}; + G4double GetJawY2Pos_y() {return fieldY2;}; + + private: + + G4double fieldX1; + G4double fieldX2; + G4double fieldY1; + G4double fieldY2; + + G4VPhysicalVolume* ConstructGeom(); + MedLinacVGeometryComponent* pHead; + MedLinacDetectorMessenger* detectorMessenger; + MedLinacDecorator* decorator; + //MedLinacDecorator* decorator1; + //MedLinacDecorator* decorator2; + MedLinacDetectorConstruction(G4String); + + static MedLinacDetectorConstruction* instance; + + MedLinacPhantomSD* phantomSD;//pointer to sensitive detector + MedLinacPhantomROGeometry* phantomROGeometry;//pointer to ROGeometry + + G4double phantomDim_x; //Phantom XDimension + G4double phantomDim_y; //Phantom YDimension + G4double phantomDim_z; //Phantom ZDimension + + + G4int numberOfVoxelsAlongX; //Number of voxels along x axis + G4int numberOfVoxelsAlongY; //Number of voxels along y axis + G4int numberOfVoxelsAlongZ; //Number of voxels along z axis + G4String sensitiveDetectorName; + G4double dimVoxel; + // Logical volumes + // + G4LogicalVolume* experimentalHall_log; + G4LogicalVolume* vacuumBlock_log; + G4LogicalVolume* JawY1_log; + G4LogicalVolume* JawY2_log; + G4LogicalVolume* JawX1_log; + G4LogicalVolume* JawX2_log; + G4LogicalVolume* Phantom_log; + + // Physical volumes + // + G4VPhysicalVolume* experimentalHall_phys; + G4VPhysicalVolume* vacuumBlock_phys; + G4VPhysicalVolume* JawY1_phys; + G4VPhysicalVolume* JawY2_phys; + G4VPhysicalVolume* JawX1_phys; + G4VPhysicalVolume* JawX2_phys; + G4VPhysicalVolume* Phantom_phys; + //Vis + // + G4VisAttributes* simpleH2OVisAtt; + G4VisAttributes* simpleLeadSVisAtt; + G4VisAttributes* simpleWorldVisAtt; + +}; + +#endif + diff --git a/examples/advanced/medical_linac/include/MedLinacDetectorMessenger.hh b/examples/advanced/medical_linac/include/MedLinacDetectorMessenger.hh new file mode 100644 index 0000000000..46da86206d --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacDetectorMessenger.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDetectorMessenger.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#ifndef MedLinacDetectorMessenger_h +#define MedLinacDetectorMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class MedLinacDetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +//**************************************************************************** + +class MedLinacDetectorMessenger: public G4UImessenger +{ + public: + MedLinacDetectorMessenger(MedLinacDetectorConstruction* ); + ~MedLinacDetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + MedLinacDetectorConstruction* MedLinacDetector; + + G4UIdirectory* MedLinacDir; + G4UIdirectory* X1Dir; + G4UIdirectory* X2Dir; + G4UIdirectory* Y1Dir; + G4UIdirectory* Y2Dir; + G4UIcmdWithADoubleAndUnit* JawX1PosCmd; + G4UIcmdWithADoubleAndUnit* JawX2PosCmd; + G4UIcmdWithADoubleAndUnit* JawY1PosCmd; + G4UIcmdWithADoubleAndUnit* JawY2PosCmd; + G4UIcmdWithoutParameter* UpdateCmd; +}; + +//**************************************************************************** +#endif + diff --git a/examples/advanced/medical_linac/include/MedLinacDummySD.hh b/examples/advanced/medical_linac/include/MedLinacDummySD.hh new file mode 100644 index 0000000000..f9b3ed3f4e --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacDummySD.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +// Dummy sensitive used only to flag sensitivity in cells of RO geometry. + +#ifndef MedLinacDummySD_h +#define MedLinacDummySD_h 1 + +#include "G4VSensitiveDetector.hh" +class G4Step; + +class MedLinacDummySD : public G4VSensitiveDetector +{ +public: + MedLinacDummySD(); + ~MedLinacDummySD() {}; + + void Initialize(G4HCofThisEvent* ) {}; + G4bool ProcessHits(G4Step* ,G4TouchableHistory*) {return false;} + void EndOfEvent(G4HCofThisEvent*) {}; + void clear() {}; + void DrawAll() {}; + void PrintAll() {}; +}; + +MedLinacDummySD::MedLinacDummySD() : G4VSensitiveDetector("dummySD") +{} +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacEventAction.hh b/examples/advanced/medical_linac/include/MedLinacEventAction.hh new file mode 100644 index 0000000000..04d7acd09f --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacEventAction.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacEventAction.hh,v 1.3 2004/05/14 18:25:39 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// + +#ifndef MedLinacEventAction_h +#define MedLinacEventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" + +//class G4Event; +//class MedLinacDetectorConstruction; +//class MedLinacAnalysisManager; + +//********************************************************************* + +class MedLinacEventAction : public G4UserEventAction +{ + public: + MedLinacEventAction(); + ~MedLinacEventAction(); + + public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + +private: + G4String drawFlag; //Visualisation flag + }; + +//********************************************************************* + +#endif + + diff --git a/examples/advanced/medical_linac/include/MedLinacHead.hh b/examples/advanced/medical_linac/include/MedLinacHead.hh new file mode 100644 index 0000000000..b72630d9cb --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacHead.hh @@ -0,0 +1,84 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacHead.hh,v 1.1 2004/05/14 18:25:39 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// +#ifndef MedLinacHead_h +#define MedLinacHead_h 1 + +class MedLinacVGeometryComponent; +class G4VPhysicalVolume; +class G4LogicalVolume; +class G4Region; +class G4Material; +class G4VisAttributes; +class MedLinacHead: public MedLinacVGeometryComponent +{ +public: + MedLinacHead(); + ~MedLinacHead(); + void ConstructComponent(G4VPhysicalVolume*,G4VPhysicalVolume*); + void DestroyComponent(); + + private: + G4LogicalVolume* windowUp_log; + G4LogicalVolume* UpperCollimator_log; + G4LogicalVolume* collim_log; + G4LogicalVolume* tracker_log; + G4LogicalVolume* CylMinusCone_log; + G4LogicalVolume* windowLow_log; + G4LogicalVolume* Window_log; + G4LogicalVolume* SignalPlate_log; + G4LogicalVolume* Mirror_log; + G4LogicalVolume* reticle_log; + + G4VPhysicalVolume* windowUp_phys; + G4VPhysicalVolume* UpperCollimator_phys; + G4VPhysicalVolume* CylMinusCone_phys; + G4VPhysicalVolume* windowLow_phys; + G4VPhysicalVolume* Window1_phys; + G4VPhysicalVolume* SignalPlate1_phys; + G4VPhysicalVolume* SignalPlate2_phys; + G4VPhysicalVolume* Window2_phys; + G4VPhysicalVolume* SignalPlate3_phys; + G4VPhysicalVolume* SignalPlate4_phys; + G4VPhysicalVolume* Window3_phys; + G4VPhysicalVolume* Mirror_phys; + G4VPhysicalVolume* reticle_phys; + + G4Region* aLowerCollRegion; + G4Region* aUpperCollRegion; + + + G4VisAttributes* simpleLeadWVisAtt; + G4VisAttributes* simpleLeadSVisAtt; + G4VisAttributes* simpleAlVisAtt; + G4VisAttributes* simpleCopperSVisAtt; + G4VisAttributes* simpleMylarVisAtt; + G4VisAttributes* simpleKaptonVisAtt; + G4VisAttributes* simpleWorldVisAtt; +}; +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacPhantomHit.hh b/examples/advanced/medical_linac/include/MedLinacPhantomHit.hh new file mode 100644 index 0000000000..b4017b037c --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPhantomHit.hh @@ -0,0 +1,123 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPhantomHit.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// It manages the hits and the enrgy deposit in the phantom associated with +// each hit ... + +#ifndef MedLinacPhantomHit_h +#define MedLinacPhantomHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" + +class MedLinacPhantomHit : public G4VHit +{ +public: + MedLinacPhantomHit(G4LogicalVolume* ,G4int ,G4int ,G4int ); + ~MedLinacPhantomHit(); + MedLinacPhantomHit(const MedLinacPhantomHit &right); + const MedLinacPhantomHit& operator = (const MedLinacPhantomHit &right); + int operator == (const MedLinacPhantomHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + +private: + const G4LogicalVolume* logicalVolume;// Logical volume where the hit happened + G4int xHitPosition; // Hit x coordinate + G4int zHitPosition; // Hit z coordinate + G4int yHitPosition; // Hit y coordinate + G4ThreeVector hitPosition; //position of the hit + G4RotationMatrix rotation; // rotation of the logical volume + G4double energyDeposit; // energy deposit associated with the hit + +public: + //... + // Set Hit position + inline void SetCellID(G4int XID,G4int YID,G4int ZID) + {xHitPosition = XID; zHitPosition = ZID; yHitPosition = YID; } + + inline G4int GetXID() // Get hit x coordinate + {return xHitPosition;} + + inline G4int GetZID() // Get hit z coordinate + {return zHitPosition;} + + inline G4int GetYID() // Get hit y coordinate + {return yHitPosition;} + + inline void SetEdep(G4double edep) //Set hit energy deposit + {energyDeposit = edep;} + + inline void AddEdep(G4double edep) // Add energy deposit + {energyDeposit += edep;} + + inline G4double GetEdep() // Get energy deposit + {return energyDeposit;} + + inline void SetPos(G4ThreeVector xyz) // Set hit position + {hitPosition = xyz;} + + inline G4ThreeVector GetPos() // Get hit position + {return hitPosition;} + + inline void SetRot(G4RotationMatrix rmat) //set rotation + {rotation = rmat;} + + inline G4RotationMatrix GetRot() //get rotation + {return rotation;} + + //... + // It returns the logical volume where the hit happened + inline const G4LogicalVolume * GetLogicalVolume() + {return logicalVolume;} +}; + +typedef G4THitsCollection MedLinacPhantomHitsCollection; +extern G4Allocator MedLinacPhantomHitAllocator; + +inline void* MedLinacPhantomHit::operator new(size_t) +{ + void *aHit; + aHit = (void *) MedLinacPhantomHitAllocator.MallocSingle(); + return aHit; +} + +inline void MedLinacPhantomHit::operator delete(void *aHit) +{ + MedLinacPhantomHitAllocator.FreeSingle((MedLinacPhantomHit*) aHit); +} +#endif + + diff --git a/examples/advanced/medical_linac/include/MedLinacPhantomROGeometry.hh b/examples/advanced/medical_linac/include/MedLinacPhantomROGeometry.hh new file mode 100644 index 0000000000..eb79c71623 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPhantomROGeometry.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPhantomROGeometry.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +//The phantom is devided in voxels. the dimension of the voxel is 1mm +// +#ifndef MedLinacPhantomROGeometry_h +#define MedLinacPhantomROGeometry_h + +#include "G4VReadOutGeometry.hh" + +class MedLinacPhantomROGeometry : public G4VReadOutGeometry +{ +public: + MedLinacPhantomROGeometry(G4String aString, + G4double phantomDim_x, + G4double phantomDim_y, + G4double phantomDim_z, + G4int numberOfVoxelsX, + G4int numberOfVoxelsY, + G4int numberOfVoxelsZ); + ~MedLinacPhantomROGeometry(); +private: + G4VPhysicalVolume* Build(); + +private: + const G4double PhantomDimensionX; + const G4double PhantomDimensionY; + const G4double PhantomDimensionZ; + const G4int NumberOfVoxelsAlongX; + const G4int NumberOfVoxelsAlongY; + const G4int NumberOfVoxelsAlongZ; + G4VPhysicalVolume *ROPhantomYDivisionPhys; +}; +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacPhantomSD.hh b/examples/advanced/medical_linac/include/MedLinacPhantomSD.hh new file mode 100644 index 0000000000..5e31cad5d6 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPhantomSD.hh @@ -0,0 +1,54 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +//// $Id: MedLinacPhantomSD.hh,v 1.4 2004/06/18 09:17:38 gunter Exp $ +// +// +// Code developed by: M. Piergentili +// +#ifndef MedLinacPhantomSD_h +#define MedLinacPhantomSD_h 1 + +#include "G4VSensitiveDetector.hh" +#include "MedLinacPhantomHit.hh" + +class G4Step; +class G4HCofThisEvent; +class G4TouchableHistory; + +class MedLinacPhantomSD : public G4VSensitiveDetector +{ +public: + MedLinacPhantomSD(G4String name); + ~MedLinacPhantomSD(); + + void Initialize(G4HCofThisEvent*); + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist); + void EndOfEvent(G4HCofThisEvent*HCE); + void clear(); + void DrawAll(); + void PrintAll(); + +}; +#endif + + diff --git a/examples/advanced/medical_linac/include/MedLinacPhysicsList.hh b/examples/advanced/medical_linac/include/MedLinacPhysicsList.hh new file mode 100644 index 0000000000..9d13c7f824 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPhysicsList.hh @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +//// $Id: MedLinacPhysicsList.hh,v 1.4 2004/06/18 09:17:39 gunter Exp $ +// +// +// Code developed by: M. Piergentili + + + +#ifndef MedLinacPhysicsList_h +#define MedLinacPhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +class G4ProductionCuts; +class G4LowEnergyPhotoElectric; +class G4LowEnergyIonisation; +class G4LowEnergyBremsstrahlung; + +class MedLinacPhysicsList: public G4VUserPhysicsList +{ + public: + MedLinacPhysicsList(); + ~MedLinacPhysicsList(); + + protected: + // Construct particle and physics process + void ConstructParticle(); + void ConstructProcess(); + void SetCuts(); + + //private: + + //G4double cutForGamma; + //G4double cutForElectron; + //G4double cutForPositron; + +protected: + // these methods Construct particles + void ConstructBosons(); + void ConstructLeptons(); + + protected: + // these methods Construct physics processes and register them + //void ConstructGeneral(); + void ConstructEM(); + + // private: + + G4LowEnergyIonisation* loweIon; + G4LowEnergyPhotoElectric* lowePhot; + G4LowEnergyBremsstrahlung* loweBrem; +}; + +#endif + + + + + + + diff --git a/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorAction.hh b/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorAction.hh new file mode 100644 index 0000000000..c145e099dc --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorAction.hh @@ -0,0 +1,61 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPrimaryGeneratorAction.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#ifndef MedLinacPrimaryGeneratorAction_h +#define MedLinacPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" +#include + +class G4ParticleGun; +class G4Run; +class G4Event; +class MedLinacDetectorConstruction; +class MedLinacPrimaryGeneratorMessenger; +class MedLinacAnalysisManager; + +class MedLinacPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + MedLinacPrimaryGeneratorAction(); + ~MedLinacPrimaryGeneratorAction(); + + public: + void GeneratePrimaries(G4Event* anEvent); + void SetEnergy(G4double val){ pEnergy = val;} + void SetSourceType(G4double val) { sigma = val;} + private: + G4ParticleGun* particleGun; //pointer a to G4 class + MedLinacPrimaryGeneratorMessenger* gunMessenger;//messenger of this class + G4double pEnergy; + G4double sigma; +}; + +#endif + + diff --git a/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorMessenger.hh b/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorMessenger.hh new file mode 100644 index 0000000000..305ca14e71 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacPrimaryGeneratorMessenger.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPrimaryGeneratorMessenger.hh,v 1.3 2004/06/18 09:17:40 gunter Exp $ +// +// +// Code developed by: M. Piergentili + +#ifndef MedLinacPrimaryGeneratorMessenger_h +#define MedLinacPrimaryGeneratorMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class MedLinacPrimaryGeneratorAction; +class G4UIdirectory; +class G4UIcmdWithADoubleAndUnit; + +//********************************************************************** + +class MedLinacPrimaryGeneratorMessenger: public G4UImessenger +{ + public: + + MedLinacPrimaryGeneratorMessenger(MedLinacPrimaryGeneratorAction*); + ~MedLinacPrimaryGeneratorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + MedLinacPrimaryGeneratorAction* MedLinacAction; + G4UIcmdWithADoubleAndUnit* EnergyCmd; + G4UIcmdWithADoubleAndUnit* SourceTypeCmd; +}; + +//********************************************************************** + +#endif + diff --git a/examples/advanced/medical_linac/include/MedLinacRunAction.hh b/examples/advanced/medical_linac/include/MedLinacRunAction.hh new file mode 100644 index 0000000000..9260ad01b0 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacRunAction.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacRunAction.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#ifndef MedLinacRunAction_h +#define MedLinacRunAction_h 1 + +#include "G4UserRunAction.hh" +#include "G4RunManager.hh" +#include "globals.hh" + +//******************************************************************** + +class G4Run; +class MedLinacAnalysisManager; +class MedLinacDetectorConstruction; + +class MedLinacRunAction : public G4UserRunAction +{ + public: + MedLinacRunAction(G4String); + ~MedLinacRunAction(); + + public: + void BeginOfRunAction(const G4Run* aRun); + void EndOfRunAction(const G4Run* aRun); +private: + + G4String sensitiveDetectorName; + MedLinacDetectorConstruction* detector; + +}; + +//******************************************************************** + +#endif + + + + + diff --git a/examples/advanced/medical_linac/include/MedLinacTargetAndFilterDecorator.hh b/examples/advanced/medical_linac/include/MedLinacTargetAndFilterDecorator.hh new file mode 100644 index 0000000000..3b5b25a0ae --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacTargetAndFilterDecorator.hh @@ -0,0 +1,110 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacTargetAndFilterDecorator.hh,v 1.1 2004/05/14 18:25:39 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// + + +#ifndef MedLinacTargetAndFilterDecorator_h +#define MedLinacTargetAndFilterDecorator_h 1 + +#include "MedLinacDecorator.hh" +#include "MedLinacVGeometryComponent.hh" +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class G4VisAttributes; +class MedLinacVGeometryComponent; +class MedLinacDecorator; + +class MedLinacTargetAndFilterDecorator: public MedLinacDecorator +{ +public: + MedLinacTargetAndFilterDecorator(MedLinacVGeometryComponent*); + ~MedLinacTargetAndFilterDecorator(); + void ConstructComponent(G4VPhysicalVolume*,G4VPhysicalVolume*); + void DestroyComponent(); + +private: + void ConstructTargetAndFilter(G4VPhysicalVolume*,G4VPhysicalVolume*); + G4LogicalVolume* targetA_log; + G4LogicalVolume* targetB_log; + G4LogicalVolume* layer1_log; + G4LogicalVolume* layer2_log; + G4LogicalVolume* layer3_log; + G4LogicalVolume* layer4_log; + G4LogicalVolume* layer5_log; + G4LogicalVolume* layer6_log; + G4LogicalVolume* layer7_log; + G4LogicalVolume* layer8_log; + G4LogicalVolume* layer9_log; + G4LogicalVolume* layer10_log; + G4LogicalVolume* layer11_log; + G4LogicalVolume* layer12_log; + G4LogicalVolume* layer13_log; + G4LogicalVolume* layer14_log; + G4LogicalVolume* layer15_log; + G4LogicalVolume* layer16_log; + G4LogicalVolume* layer17_log; + G4LogicalVolume* layer18_log; + G4LogicalVolume* layer19_log; + G4LogicalVolume* layer20A_log; + G4LogicalVolume* cone20_log; + G4LogicalVolume* layer20_log; + G4LogicalVolume* layer21_log; + + G4VPhysicalVolume* targetA_phys; + G4VPhysicalVolume* targetB_phys; + G4VPhysicalVolume* layer1_phys; + G4VPhysicalVolume* layer2_phys; + G4VPhysicalVolume* layer3_phys; + G4VPhysicalVolume* layer4_phys; + G4VPhysicalVolume* layer5_phys; + G4VPhysicalVolume* layer6_phys; + G4VPhysicalVolume* layer7_phys; + G4VPhysicalVolume* layer8_phys; + G4VPhysicalVolume* layer9_phys; + G4VPhysicalVolume* layer10_phys; + G4VPhysicalVolume* layer11_phys; + G4VPhysicalVolume* layer12_phys; + G4VPhysicalVolume* layer13_phys; + G4VPhysicalVolume* layer14_phys; + G4VPhysicalVolume* layer15_phys; + G4VPhysicalVolume* layer16_phys; + G4VPhysicalVolume* layer17_phys; + G4VPhysicalVolume* layer18_phys; + G4VPhysicalVolume* layer19_phys; + G4VPhysicalVolume* layer20_phys; + G4VPhysicalVolume* layer21_phys; + + + G4VisAttributes* simpleLeadSVisAtt; + G4VisAttributes* simpleAlSVisAtt; + G4VisAttributes* simpleWorldVisAtt; + //MedLinacVGeometryComponent* component; +}; +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacVGeometryComponent.hh b/examples/advanced/medical_linac/include/MedLinacVGeometryComponent.hh new file mode 100644 index 0000000000..954d1d77e4 --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacVGeometryComponent.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacVGeometryComponent.hh,v 1.1 2004/05/14 18:25:39 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// + +#ifndef MedLinacVGeometryComponent_h +#define MedLinacVGeometryComponent_h 1 + +#include "globals.hh" + +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Material; +class G4VisAttributes; +class MedLinacVGeometryComponent +{ +public: + MedLinacVGeometryComponent(); + virtual ~MedLinacVGeometryComponent(); + + virtual void ConstructComponent(G4VPhysicalVolume*,G4VPhysicalVolume*)=0; + virtual void DestroyComponent()=0; +}; +#endif diff --git a/examples/advanced/medical_linac/include/MedLinacVisManager.hh b/examples/advanced/medical_linac/include/MedLinacVisManager.hh new file mode 100644 index 0000000000..bcab820f9e --- /dev/null +++ b/examples/advanced/medical_linac/include/MedLinacVisManager.hh @@ -0,0 +1,56 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacVisManager.hh,v 1.2 2004/04/02 17:48:41 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +//********************************************************************* + +#ifndef MedLinacVisManager_h +#define MedLinacVisManager_h 1 + +#ifdef G4VIS_USE + +#include "G4VisManager.hh" + +//********************************************************************* + +class MedLinacVisManager: public G4VisManager { + +public: + + MedLinacVisManager (); + +private: + + void RegisterGraphicsSystems (); + +}; + +//********************************************************************* + +#endif + +#endif diff --git a/examples/advanced/medical_linac/macro.mac b/examples/advanced/medical_linac/macro.mac new file mode 100644 index 0000000000..07b65a25d1 --- /dev/null +++ b/examples/advanced/medical_linac/macro.mac @@ -0,0 +1,17 @@ + +/control/verbose 2 +/control/saveHistory +/run/verbose 2 + +/run/initialize +/tracking/storeTrajectory 1 + +/Jaws/X1/DistanceFromAxis -15. cm +/Jaws/X2/DistanceFromAxis 15. cm +/Jaws/Y1/DistanceFromAxis -15. cm +/Jaws/Y2/DistanceFromAxis 15. cm +/Jaws/update + +/energy 6.0 MeV +/sourceType 0.127 MeV +/run/beamOn 1000 diff --git a/examples/advanced/medical_linac/src/MedLinacAnalysisManager.cc b/examples/advanced/medical_linac/src/MedLinacAnalysisManager.cc new file mode 100644 index 0000000000..d4e9b4ac43 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacAnalysisManager.cc @@ -0,0 +1,208 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacAnalysisManager.cc,v 1.4 2004/06/18 09:17:41 gunter Exp $ +// +// +// Code developed by: M. Piergentili +// +// +#ifdef G4ANALYSIS_USE +#include +#include +#include "MedLinacAnalysisManager.hh" + +#include "G4ios.hh" + +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" + +#include "AIDA/IManagedObject.h" +#include "AIDA/IAnalysisFactory.h" +#include "AIDA/IHistogramFactory.h" +#include "AIDA/ITupleFactory.h" +#include "AIDA/ITreeFactory.h" +#include "AIDA/ITree.h" + +MedLinacAnalysisManager* MedLinacAnalysisManager::instance = 0; + +MedLinacAnalysisManager::MedLinacAnalysisManager(): + aFact(0), theTree(0), histFact(0),h1(0),h2(0),h3(0),h4(0),h5(0),h6(0),h7(0),h8(0) + +{ + //build up the factories + aFact = AIDA_createAnalysisFactory(); + + AIDA::ITreeFactory *treeFact = aFact->createTreeFactory(); + + //parameters for the TreeFactory + + std::string fileName = "MedLinac.hbk"; + theTree = treeFact->create(fileName,"hbook",false, true); + + delete treeFact; + + histFact = aFact->createHistogramFactory( *theTree ); + +} +MedLinacAnalysisManager::~MedLinacAnalysisManager() +{ + delete histFact; + histFact = 0; + + delete theTree; + histFact = 0; + + delete aFact; + aFact = 0; +} + +MedLinacAnalysisManager* MedLinacAnalysisManager::getInstance() +{ + if (instance == 0) instance = new MedLinacAnalysisManager; + return instance; +} + +void MedLinacAnalysisManager::book() +{ + //creating a 2D histogram ... + h1 = histFact->createHistogram2D("10","Energy, pos x z", //histoID,histo name + 340 ,-170.,170., //bins'number,xmin,xmax + 340,-170.,170. );//bins'number,zmin,zmax + + + + //creating a 1D histogram ... + h2 = histFact->createHistogram1D("20","Initial Energy", //histoID,histo name + 500,3.0,9.0); //bins' number, xmin, xmax + + + + + //creating an other 2D histogram ... + h3 = histFact->createHistogram2D("30","Energy, pos x y", //histoID,histo name + 340 ,-170.,170., //bins'number,xmin,xmax + 340,-170.,170. );//bins'number,ymin,ymax + + //creating an other 1D histogram ... + h4 = histFact->createHistogram1D("40","PDD", //histoID,histo name + 300,-150.0,150.0); //bins' number, zmin, zmax + //creating an other 1D histogram ... + h5 = histFact->createHistogram1D("50","Flatness at build-up depth", //histoID,histo name + 300,-150.0,150.0); //bins' number, zmin, zmax + + //creating an other 1D histogram ... + h6 = histFact->createHistogram1D("60","Flatness 50mm depth", //histoID,histo name + 300,-150.0,150.0); //bins' number, zmin, zmax + //creating an other 1D histogram ... + h7 = histFact->createHistogram1D("70","Flatness 100mm depth", //histoID,histo name + 300,-150.0,150.0); //bins' number, zmin, zmax + //creating an other 1D histogram ... + h8 = histFact->createHistogram1D("80","Flatness 200mm depth", //histoID,histo name + 300,-150.0,150.0); //bins' number, zmin, zmax + + + + + +} + +void MedLinacAnalysisManager::FillHistogram1WithEnergy(G4double x, + G4double z, + G4float energyDeposit) +{ + //2DHistrogram: energy deposit in a voxel which center is fixed in position (x,z) + h1->fill(x,z,energyDeposit); +} + +//Units: the energy deposit is in MeV; x, y, z in mm for histograms + +void MedLinacAnalysisManager::PrimaryParticleEnergySpectrum(G4double pEnergy) +{ + //1DHistogram: energy spectrum of primary particles + h2->fill(pEnergy/MeV); +} +void MedLinacAnalysisManager::FillHistogram3WithEnergy(G4double x, + G4double y, + G4float energyDeposit) +{ + //2DHistrogram: energy deposit in a voxel which center is fixed in position (x,y) + h3->fill(x,y,energyDeposit); +} + + +void MedLinacAnalysisManager::FillHistogram4WithEnergy(G4double z, + G4float energyDeposit) +{ + //1DHistrogram: energy deposit in a voxel which center is fixed in position (0,0,z) + h4->fill(z,energyDeposit); +} + +void MedLinacAnalysisManager::FillHistogram5WithEnergy(G4double x, + G4float energyDeposit) +{ + //1DHistrogram: energy deposit in a voxel which center is fixed in position (x,0,135mm) + h5->fill(x,energyDeposit); +} + +void MedLinacAnalysisManager::FillHistogram6WithEnergy(G4double x, + G4float energyDeposit) +{ + //1DHistrogram: energy deposit in a voxel which center is fixed in position (x,0,100mm) + h6->fill(x,energyDeposit); +} + +void MedLinacAnalysisManager::FillHistogram7WithEnergy(G4double x, + G4float energyDeposit) +{ + //1DHistrogram: energy deposit in a voxel which center is fixed in position (x,0,50mm) + h7->fill(x,energyDeposit); +} + +void MedLinacAnalysisManager::FillHistogram8WithEnergy(G4double x, + G4float energyDeposit) +{ + //1DHistrogram: energy deposit in a voxel which center is fixed in position (x,0,-50mm) + h8->fill(x,energyDeposit); +} + + +void MedLinacAnalysisManager::finish() +{ + // write all histograms to file ... + theTree->commit(); + + // close (will again commit) ... + theTree->close(); +} +#endif + + + + + + + + + + + diff --git a/examples/advanced/medical_linac/src/MedLinacDecorator.cc b/examples/advanced/medical_linac/src/MedLinacDecorator.cc new file mode 100644 index 0000000000..d63d53d27c --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacDecorator.cc @@ -0,0 +1,45 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDecorator.cc,v 1.1 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#include "MedLinacVGeometryComponent.hh" +#include "MedLinacDecorator.hh" + +MedLinacDecorator::MedLinacDecorator(MedLinacVGeometryComponent* geoComponent) + : component(geoComponent) +{ +} + +MedLinacDecorator::~MedLinacDecorator() +{;} + +void MedLinacDecorator::ConstructComponent(G4VPhysicalVolume*,G4VPhysicalVolume*) +{;} + +void MedLinacDecorator::DestroyComponent() +{;} + diff --git a/examples/advanced/medical_linac/src/MedLinacDetectorConstruction.cc b/examples/advanced/medical_linac/src/MedLinacDetectorConstruction.cc new file mode 100644 index 0000000000..7c5fe82772 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacDetectorConstruction.cc @@ -0,0 +1,460 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDetectorConstruction.cc,v 1.4 2004/05/14 18:25:40 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// +//------------------------------ beam line along z axis--------------------- + +#include "MedLinacDetectorMessenger.hh" +#include "MedLinacDetectorConstruction.hh" +#include "MedLinacPhantomROGeometry.hh" +#include "MedLinacPhantomSD.hh" +#include "MedLinacVGeometryComponent.hh" +#include "MedLinacHead.hh" +#include "MedLinacDecorator.hh" +#include "MedLinacTargetAndFilterDecorator.hh" +#include "G4CSGSolid.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" +#include "G4Material.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4MaterialTable.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4Box.hh" +#include "G4Cons.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "G4PVParameterised.hh" +#include "globals.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "Randomize.hh" +#include "G4TransportationManager.hh" +#include "G4UserLimits.hh" +#include "G4GeometryManager.hh" +#include "G4BooleanSolid.hh" +#include "G4SubtractionSolid.hh" +#include "G4VSolid.hh" +#include "G4Region.hh" + +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" +#include "G4RegionStore.hh" + +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +#include "G4ios.hh" + +MedLinacDetectorConstruction::MedLinacDetectorConstruction(G4String SDName) + : phantomSD(0),phantomROGeometry(0), + experimentalHall_log(0),vacuumBlock_log(0), + JawY1_log(0),JawY2_log(0), + JawX1_log(0),JawX2_log(0), + Phantom_log(0), + experimentalHall_phys(0),vacuumBlock_phys(0), + JawY1_phys(0), JawY2_phys(0), + JawX1_phys(0), JawX2_phys(0), + Phantom_phys(0) +{ + numberOfVoxelsAlongX=300; + numberOfVoxelsAlongY=300; + numberOfVoxelsAlongZ=300; + + ComputeDimVoxel(); + + sensitiveDetectorName = SDName; + + // default parameter values + + fieldX1 = -10.*cm; + fieldX2 = 10.*cm; + fieldY1 = -10.*cm; + fieldY2 = 10.*cm; + + + detectorMessenger = new MedLinacDetectorMessenger(this); + pHead = new MedLinacHead(); + decorator = new MedLinacTargetAndFilterDecorator(pHead); +} + +MedLinacDetectorConstruction* MedLinacDetectorConstruction::instance = 0; + +MedLinacDetectorConstruction* MedLinacDetectorConstruction::GetInstance(G4String SDName) +{ + if (instance == 0) + { + instance = new MedLinacDetectorConstruction(SDName); + + } + return instance; +} + +MedLinacDetectorConstruction::~MedLinacDetectorConstruction() +{ + delete detectorMessenger; + delete pHead; + delete decorator; + //delete decorator1; + //delete decorator2; +} + +G4VPhysicalVolume* MedLinacDetectorConstruction::Construct() +{ + return ConstructGeom(); +} + +G4VPhysicalVolume* MedLinacDetectorConstruction::ConstructGeom () +{ + + // Cleanup old geometry + + G4GeometryManager::GetInstance()->OpenGeometry(); + G4PhysicalVolumeStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4SolidStore::GetInstance()->Clean(); + + // materials + + G4double a; // atomic mass + G4double z; // atomic number + G4double density; + G4int ncomponents; + G4int natoms; + G4String name; + G4String symbol; + G4double fractionmass; + G4double massOfMole; + G4double pressure; + G4double temperature; + + a = 14.00674*g/mole; + G4Element* elN = new G4Element(name="Nitrogen" ,symbol="N", z=7., a); + + a = 16.00*g/mole; + G4Element* elO = new G4Element(name="Oxygen",symbol="O", z=8., a); + + a = 1.00794*g/mole; + G4Element* elH = new G4Element(name="Hydrogen",symbol="H", z=1., a); + + density = 1.290*mg/cm3; + G4Material* Air = new G4Material(name="Air",density, ncomponents=2); + Air->AddElement(elN, fractionmass=70*perCent); + Air->AddElement(elO, fractionmass=30*perCent); + + density = 1.000*g/cm3; + G4Material* H2O = new G4Material(name="Water",density, ncomponents=2); + H2O->AddElement(elH, natoms=2); + H2O->AddElement(elO, natoms=1); + + a = 207.19*g/mole; + density = 11.35*g/cm3; + G4Material* Pb = new G4Material(name="Lead", z=82., a, density); + + massOfMole = 1.008*g/mole; + density = 1.e-25*g/cm3; + temperature = 2.73*kelvin; + pressure = 3.e-18*pascal; + G4Material* Vacuum = new G4Material("interGalactic", z=1.,massOfMole, + density, kStateGas,temperature, pressure); + + //------------------------------ beam line along z axis------------------ + + //---------jaws position-------- + + //----1Y------------------------ + + G4double thetaY1 = atan(-fieldY1/(100.*cm));// in rad + G4double JawY1Pos_y = -((3.9*cm+28.*cm)*sin(thetaY1)+5.*cm*cos(thetaY1)); + G4double JawY1Pos_z =115.*cm-((3.9*cm+28.*cm)*cos(thetaY1))+5.*cm*sin(thetaY1); + //----2Y------------------------- + G4double thetaY2 = atan(fieldY2/(100.*cm)); // in rad + G4double JawY2Pos_y = (3.9*cm+28.*cm)*sin(thetaY2)+5.*cm*cos(thetaY2); + G4double JawY2Pos_z = 115.*cm-(3.9*cm+28.*cm)*cos(thetaY2)+5.*cm*sin(thetaY2); + //----1X------------------------- + G4double thetaX1 = atan(-fieldX1/(100.*cm)); + G4double JawX1Pos_x = -((36.7*cm+3.9*cm)*sin(thetaX1)+5.*cm*cos(thetaX1)); + G4double JawX1Pos_z =115.*cm-(36.7*cm+3.9*cm)*cos(thetaX1)+5.*cm*sin(thetaX1); + //----2X------------------------- + G4double thetaX2 = atan(fieldX2/(100.*cm)); + G4double JawX2Pos_x = (36.7*cm+3.9*cm)*sin(thetaX2)+5.*cm*cos(thetaX2); + G4double JawX2Pos_z = 115.*cm-(36.7*cm+3.9*cm)*cos(thetaX2)+5.*cm*sin(thetaX2); + //---------rotation jaw1Y-------- + + G4RotationMatrix* rotatejaw1Y=new G4RotationMatrix(); + rotatejaw1Y->rotateX(thetaY1); + +//---------rotation jaw2Y-------- + + G4RotationMatrix* rotatejaw2Y=new G4RotationMatrix(); + rotatejaw2Y->rotateX(-thetaY2); + + //---------rotation jaw1X-------- + + G4RotationMatrix* rotatejaw1X=new G4RotationMatrix(); + rotatejaw1X->rotateY(-thetaX1); + + //---------rotation jaw2X-------- + + G4RotationMatrix* rotatejaw2X=new G4RotationMatrix(); + rotatejaw2X->rotateY(thetaX2); + + //---------------colors---------- + + G4Colour white (1.0, 1.0, 1.0); + G4Colour magenta (1.0, 0.0, 1.0); + G4Colour lblue (0.20, .50, .85); + + //------------------------------------------------------ volumes + + //------------------------------ beam line along z axis-------SSD=100cm-------------- + + //------------------------------ experimental hall (world volume) + G4double expHall_x = 3.0*m; + G4double expHall_y = 3.0*m; + G4double expHall_z = 3.0*m; + G4Box* experimentalHall_box + = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z); + experimentalHall_log = new G4LogicalVolume(experimentalHall_box, + Air,"expHall_log",0,0,0); + experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(), + "expHall",experimentalHall_log,0,false,0); + + + + //------------------------vacuum box------------------------ + + G4double vacudim_x = 9.*cm; + G4double vacudim_y = 9.*cm; + G4double vacudim_z = 8.755*cm; + G4Box* vacuumBlock_box = new G4Box("vacuumBlock_box",vacudim_x, + vacudim_y,vacudim_z); + vacuumBlock_log = new G4LogicalVolume(vacuumBlock_box, + Vacuum,"vacuumBlock_log",0,0,0); + G4double vacublockPos_x = 0.0*m; + G4double vacublockPos_y = 0.0*m; + G4double vacublockPos_z = 114.755*cm; + vacuumBlock_phys = new G4PVPlacement(0, + G4ThreeVector(vacublockPos_x,vacublockPos_y,vacublockPos_z), + "vacuBlock",vacuumBlock_log,experimentalHall_phys,false,0); + + + //----------------Jaw Y1 collimator--------------- + + G4double JawY1Dim_x = 10.0*cm; + G4double JawY1Dim_y = 5.0*cm; + G4double JawY1Dim_z = 2.5*cm; + G4Box* JawY1 = new G4Box("JawY1",JawY1Dim_x, + JawY1Dim_y,JawY1Dim_z); + JawY1_log = new G4LogicalVolume(JawY1, + Pb,"JawY1_log",0,0,0); + + + + G4double JawY1Pos_x = 0.0*cm; + JawY1_phys = new G4PVPlacement(rotatejaw1Y, + G4ThreeVector(JawY1Pos_x,JawY1Pos_y,JawY1Pos_z), + "JawY1",JawY1_log,experimentalHall_phys,false,0); + + //----------------Jaw Y2 collimator--------------- + + G4double JawY2Dim_x = 10.0*cm; + G4double JawY2Dim_y = 5.0*cm; + G4double JawY2Dim_z = 2.5*cm; + G4Box* JawY2 = new G4Box("JawY2",JawY2Dim_x, + JawY2Dim_y,JawY2Dim_z); + JawY2_log = new G4LogicalVolume(JawY2, + Pb,"JawY1_log",0,0,0); + G4double JawY2Pos_x = 0.0*cm; + JawY2_phys = new G4PVPlacement(rotatejaw2Y, + G4ThreeVector(JawY2Pos_x,JawY2Pos_y,JawY2Pos_z), + "JawY2",JawY2_log,experimentalHall_phys,false,0); + + + //----------------Jaw X1 collimator--------------- + + G4double JawX1Dim_x = 5.0*cm; + G4double JawX1Dim_y = 10.0*cm; + G4double JawX1Dim_z = 2.5*cm; + G4Box* JawX1 = new G4Box("JawX1",JawX1Dim_x, + JawX1Dim_y,JawX1Dim_z); + JawX1_log = new G4LogicalVolume(JawX1, + Pb,"JawX1_log",0,0,0); + + G4double JawX1Pos_y = 0.0*cm; + JawX1_phys = new G4PVPlacement(rotatejaw1X, + G4ThreeVector(JawX1Pos_x,JawX1Pos_y,JawX1Pos_z), + "JawX1",JawX1_log,experimentalHall_phys,false,0); + + //----------------Jaw X2 collimator--------------- + + G4double JawX2Dim_x = 5.0*cm; + G4double JawX2Dim_y = 10.0*cm; + G4double JawX2Dim_z = 2.5*cm; + G4Box* JawX2 = new G4Box("JawX2",JawX2Dim_x, + JawX2Dim_y,JawX2Dim_z); + JawX2_log = new G4LogicalVolume(JawX2, + Pb,"JawX1_log",0,0,0); + G4double JawX2Pos_y = 0.0*cm; + JawX2_phys = new G4PVPlacement(rotatejaw2X, + G4ThreeVector(JawX2Pos_x,JawX2Pos_y,JawX2Pos_z), + "JawX2",JawX2_log,experimentalHall_phys,false,0); + + //----------------Phantom--------- + phantomDim_x = 15.*cm; + phantomDim_y = 15.*cm; + phantomDim_z = 15.*cm; + G4Box* Phantom = new G4Box("Phantom",phantomDim_x, + phantomDim_y,phantomDim_z); + Phantom_log = new G4LogicalVolume(Phantom, + H2O,"Phantom_log",0,0,0); + G4double PhantomPos_x = 0.0*m; + G4double PhantomPos_y = 0.0*m; + G4double PhantomPos_z = 0.0*cm; + Phantom_phys = new G4PVPlacement(0, + G4ThreeVector(PhantomPos_x,PhantomPos_y,PhantomPos_z), + "Phantom_phys",Phantom_log,experimentalHall_phys,false,0); + + PrintParameters(); + +//--------- Visualization attributes ------------------------------- + + + + G4VisAttributes* simpleH2OVisAtt= new G4VisAttributes(lblue); + simpleH2OVisAtt->SetVisibility(true); + simpleH2OVisAtt->SetForceSolid(true); + Phantom_log->SetVisAttributes(simpleH2OVisAtt); + + G4VisAttributes* simpleVacuumWVisAtt= new G4VisAttributes(white); + simpleVacuumWVisAtt->SetVisibility(true); + simpleVacuumWVisAtt->SetForceWireframe(true); + vacuumBlock_log->SetVisAttributes(simpleVacuumWVisAtt); + + G4VisAttributes* simpleLeadSVisAtt= new G4VisAttributes(magenta); + simpleLeadSVisAtt->SetVisibility(true); + simpleLeadSVisAtt->SetForceSolid(true); + JawY1_log->SetVisAttributes(simpleLeadSVisAtt); + JawY2_log->SetVisAttributes(simpleLeadSVisAtt); + JawX1_log->SetVisAttributes(simpleLeadSVisAtt); + JawX2_log->SetVisAttributes(simpleLeadSVisAtt); + + + G4VisAttributes* simpleWorldVisAtt= new G4VisAttributes(white); + simpleWorldVisAtt->SetVisibility(false); + experimentalHall_log ->SetVisAttributes(simpleWorldVisAtt); + + //if you want not to see phantom, jaws e vacuum ...: + + //Phantom_log->SetVisAttributes(simpleWorldVisAtt); + //JawY1_log->SetVisAttributes(simpleWorldVisAtt); + //JawY2_log->SetVisAttributes(simpleWorldVisAtt); + //JawX1_log->SetVisAttributes(simpleWorldVisAtt); + //JawX2_log->SetVisAttributes(simpleWorldVisAtt); + vacuumBlock_log->SetVisAttributes(simpleWorldVisAtt); + + // Sets a max Step length in the detector + G4double maxStep = 0.1*mm; + Phantom_log->SetUserLimits(new G4UserLimits(maxStep)); + + ConstructVolume(); + + ConstructSensitiveDetector(); + return experimentalHall_phys; +} + +void MedLinacDetectorConstruction::PrintParameters() +{ + G4cout <<"jaws1 x position "<< fieldX1/cm << " cm "<DefineWorldVolume(ConstructGeom()); +} + +void MedLinacDetectorConstruction::ConstructVolume() +{ + pHead ->ConstructComponent(experimentalHall_phys,vacuumBlock_phys); + decorator ->ConstructComponent( experimentalHall_phys,vacuumBlock_phys); +} + +void MedLinacDetectorConstruction::ConstructSensitiveDetector() +// Sensitive Detector and ReadOut geometry definition +{ + G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); + + if(!phantomSD) + { + phantomSD = new MedLinacPhantomSD (sensitiveDetectorName); + + pSDManager->AddNewDetector(phantomSD); + } + + G4String ROGeometryName = "PhantomROGeometry"; + phantomROGeometry = new MedLinacPhantomROGeometry (ROGeometryName, phantomDim_x,phantomDim_y,phantomDim_z, + numberOfVoxelsAlongX,numberOfVoxelsAlongY,numberOfVoxelsAlongZ); + + phantomROGeometry->BuildROGeometry(); + phantomSD->SetROgeometry(phantomROGeometry); + + Phantom_log->SetSensitiveDetector(phantomSD); +} diff --git a/examples/advanced/medical_linac/src/MedLinacDetectorMessenger.cc b/examples/advanced/medical_linac/src/MedLinacDetectorMessenger.cc new file mode 100644 index 0000000000..c3a69111d0 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacDetectorMessenger.cc @@ -0,0 +1,136 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacDetectorMessenger.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// Code developed by: M. Piergentili + +#include "MedLinacDetectorMessenger.hh" + +#include "MedLinacDetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithoutParameter.hh" + +//********************************************************************* + +MedLinacDetectorMessenger::MedLinacDetectorMessenger( + MedLinacDetectorConstruction* MedLinacDet) +:MedLinacDetector(MedLinacDet) +{ + + MedLinacDir = new G4UIdirectory("/Jaws/"); + MedLinacDir->SetGuidance("jaws position"); + + X1Dir = new G4UIdirectory("/Jaws/X1/"); + X2Dir = new G4UIdirectory("/Jaws/X2/"); + Y1Dir = new G4UIdirectory("/Jaws/Y1/"); + Y2Dir = new G4UIdirectory("/Jaws/Y2/"); + + + JawX1PosCmd = new G4UIcmdWithADoubleAndUnit("/Jaws/X1/DistanceFromAxis",this); + JawX1PosCmd->SetGuidance("Set jawsx1 position (negative)"); + JawX1PosCmd->SetParameterName("JawsX1Pos_x",false); + JawX1PosCmd->SetRange("JawsX1Pos_x<=0. && JawsX1Pos_x>-1000."); + JawX1PosCmd->SetDefaultUnit( "cm" ); + JawX1PosCmd->SetUnitCategory("Length"); + JawX1PosCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + JawX2PosCmd = new G4UIcmdWithADoubleAndUnit("/Jaws/X2/DistanceFromAxis",this); + JawX2PosCmd->SetGuidance("Set jawsx2 position (positive)"); + JawX2PosCmd->SetParameterName("JawsX2Pos_x",false); + JawX2PosCmd->SetRange("JawsX2Pos_x>=0. && JawsX2Pos_x<1000."); + JawX2PosCmd->SetDefaultUnit( "cm" ); + JawX2PosCmd->SetUnitCategory("Length"); + JawX2PosCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + JawY1PosCmd = new G4UIcmdWithADoubleAndUnit("/Jaws/Y1/DistanceFromAxis",this); + JawY1PosCmd->SetGuidance("Set jawsy1 position (negative)"); + JawY1PosCmd->SetParameterName("JawsY1Pos_y",false); + JawY1PosCmd->SetRange("JawsY1Pos_y<=0. && JawsY1Pos_y>-1000."); + JawY1PosCmd->SetDefaultUnit( "cm" ); + JawY1PosCmd->SetUnitCategory("Length"); + JawY1PosCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + JawY2PosCmd = new G4UIcmdWithADoubleAndUnit("/Jaws/Y2/DistanceFromAxis",this); + JawY2PosCmd->SetGuidance("Set jawsy2 position (positive)"); + JawY2PosCmd->SetParameterName("JawsY2Pos_y",false); + JawY2PosCmd->SetRange("JawsY2Pos_y>=0. && JawsY2Pos_y<1000."); + JawY2PosCmd->SetDefaultUnit( "cm" ); + JawY2PosCmd->SetUnitCategory("Length"); + JawY2PosCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + + UpdateCmd = new G4UIcmdWithoutParameter("/Jaws/update",this); + UpdateCmd->SetGuidance("Update geometry."); + UpdateCmd->SetGuidance("This command MUST be applied before \"beamOn\" "); + UpdateCmd->SetGuidance("if you changed geometrical value(s)."); + UpdateCmd->AvailableForStates(G4State_Idle); + + + +} + +//**************************************************************************** +MedLinacDetectorMessenger::~MedLinacDetectorMessenger() +{ + delete JawX1PosCmd; + delete JawX2PosCmd; + delete JawY1PosCmd; + delete JawY2PosCmd; + delete UpdateCmd; + + delete MedLinacDir; + + delete X1Dir; + delete X2Dir ; + delete Y1Dir; + delete Y2Dir; +} + +//**************************************************************************** + +void MedLinacDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if( command == JawX1PosCmd ) + { MedLinacDetector->SetJawX1Pos_x(JawX1PosCmd->GetNewDoubleValue(newValue));} + + if( command == JawX2PosCmd ) + { MedLinacDetector->SetJawX2Pos_x(JawX2PosCmd->GetNewDoubleValue(newValue));} + + if( command == JawY1PosCmd ) + { MedLinacDetector->SetJawY1Pos_y(JawY1PosCmd->GetNewDoubleValue(newValue));} + + if( command == JawY2PosCmd ) + { MedLinacDetector->SetJawY2Pos_y(JawY2PosCmd->GetNewDoubleValue(newValue));} + + + if( command == UpdateCmd ) + { MedLinacDetector->UpdateGeometry(); } + + +} + +//**************************************************************************** diff --git a/examples/advanced/medical_linac/src/MedLinacEventAction.cc b/examples/advanced/medical_linac/src/MedLinacEventAction.cc new file mode 100644 index 0000000000..4f0c7e8efe --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacEventAction.cc @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacEventAction.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// + +#include "MedLinacEventAction.hh" +#include "MedLinacPhantomHit.hh" +#include "MedLinacPhantomSD.hh" +#include "MedLinacDetectorConstruction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4HCofThisEvent.hh" +#include "G4VHitsCollection.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4SDManager.hh" +#include "G4UImanager.hh" +#include "G4ios.hh" + +#ifdef G4ANALYSIS_USE +#include"MedLinacAnalysisManager.hh" +#endif + + + // Retrieve information about the energy deposit in the phantom ... + +MedLinacEventAction::MedLinacEventAction() : + drawFlag("all" ) +{ + } + + +MedLinacEventAction::~MedLinacEventAction() +{ + } + +void MedLinacEventAction::BeginOfEventAction(const G4Event*) +{ +} + + +void MedLinacEventAction::EndOfEventAction(const G4Event* evt) +{ + // extract the trajectories and draw them ... + + if (G4VVisManager::GetConcreteInstance()) + { + G4TrajectoryContainer * trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + + for (G4int i=0; iGetTrajectoryContainer()))[i]); + if(drawFlag == "all") trj->DrawTrajectory(50); + else if((drawFlag == "charged")&&(trj->GetCharge() != 0.)) + trj->DrawTrajectory(50); + else if ((drawFlag == "neutral")&&(trj->GetCharge() == 0.)) + trj->DrawTrajectory(50); + } + } + } + + + + diff --git a/examples/advanced/medical_linac/src/MedLinacHead.cc b/examples/advanced/medical_linac/src/MedLinacHead.cc new file mode 100644 index 0000000000..93857083d2 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacHead.cc @@ -0,0 +1,457 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacHead.cc,v 1.1 2004/05/14 18:25:40 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// +//------------------------------ beam line along z axis--------------------- + +#include "MedLinacDetectorMessenger.hh" +#include "MedLinacDetectorConstruction.hh" +#include "MedLinacPhantomROGeometry.hh" +#include "MedLinacPhantomSD.hh" +#include "MedLinacVGeometryComponent.hh" +#include "MedLinacHead.hh" + +#include "G4CSGSolid.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" +#include "G4Material.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4MaterialTable.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4Box.hh" +#include "G4Cons.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "G4PVParameterised.hh" +#include "globals.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "Randomize.hh" +#include "G4TransportationManager.hh" +#include "G4UserLimits.hh" +#include "G4GeometryManager.hh" +#include "G4BooleanSolid.hh" +#include "G4SubtractionSolid.hh" +#include "G4VSolid.hh" +#include "G4Region.hh" + +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" +#include "G4RegionStore.hh" + +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +#include "G4ios.hh" + +MedLinacHead::MedLinacHead() + : windowUp_log(0), UpperCollimator_log(0), + collim_log(0), tracker_log(0), + CylMinusCone_log(0),windowLow_log(0), + Window_log(0),SignalPlate_log(0), + Mirror_log(0),reticle_log(0), + windowUp_phys(0), UpperCollimator_phys(0), + CylMinusCone_phys(0), windowLow_phys(0), + Window1_phys(0), SignalPlate1_phys(0), + SignalPlate2_phys(0), Window2_phys(0), + SignalPlate3_phys(0), SignalPlate4_phys(0), + Window3_phys(0),Mirror_phys(0), + reticle_phys(0), aLowerCollRegion(0),aUpperCollRegion(0) + +{ + aLowerCollRegion = new G4Region("PrimaryCollimatorLow"); + aUpperCollRegion = new G4Region("PrimaryCollimatorUp"); +} + +MedLinacHead::~MedLinacHead() +{;} + + +void MedLinacHead::ConstructComponent(G4VPhysicalVolume* world,G4VPhysicalVolume* vacuumBlock) +{ + + // materials + + G4double a; // atomic mass + G4double z; // atomic number + G4double density; + G4int ncomponents; + G4String name; + G4String symbol; + G4double fractionmass; + G4double massOfMole; + G4double temperature; + G4double pressure; + + a = 14.00674*g/mole; + G4Element* elN = new G4Element(name="Nitrogen" ,symbol="N", z=7., a); + + a = 16.00*g/mole; + G4Element* elO = new G4Element(name="Oxygen",symbol="O", z=8., a); + + a = 1.00794*g/mole; + G4Element* elH = new G4Element(name="Hydrogen",symbol="H", z=1., a); + + a = 12.011*g/mole; + G4Element* elC = new G4Element(name="Carbon",symbol="C", z=6. , a ); + + a = 49.29*g/mole; + density = 2.6989*g/cm3; + G4Material* Al = new G4Material(name="Aluminium", z=13., a, density); + + density = 1.290*mg/cm3; + G4Material* Air = new G4Material(name="Air",density, ncomponents=2); + Air->AddElement(elN, fractionmass=70*perCent); + Air->AddElement(elO, fractionmass=30*perCent); + + a = 207.19*g/mole; + density = 11.35*g/cm3; + G4Material* Pb = new G4Material(name="Lead", z=82., a, density); + + density = 1.848*g/cm3; + a = 9.012182*g/mole; + G4Material* Be = new G4Material(name="Beryllium" , z=4., a, density); + + + density = 1.39*g/cm3; + G4Material* Mylar = new G4Material(name="Mylar",density , ncomponents=3, kStateUndefined, 273.15*kelvin, 1.0*atmosphere ); + Mylar->AddElement( elH, 4 ); + Mylar->AddElement( elC, 5 ); + Mylar->AddElement( elO, 2 ); + + density = 1.42*g/cm3; + G4Material* Kapton = new G4Material(name="Kapton",density , ncomponents=4); + Kapton->AddElement( elH, 02.6362 *perCent); + Kapton->AddElement( elC, 69.1133 *perCent); + Kapton->AddElement( elN, 07.3270 *perCent); + Kapton->AddElement( elO, 20.9235 *perCent); + + + massOfMole = 1.008*g/mole; + density = 1.e-25*g/cm3; + temperature = 2.73*kelvin; + pressure = 3.e-18*pascal; + G4Material* Vacuum = new G4Material("interGalactic", z=1.,massOfMole, + density, kStateGas,temperature, pressure); + + + + //------------------------------ beam line along z axis-------SSD=100cm----------- + + //---------rotation matrix first collimator-------- + + G4RotationMatrix* rotateMatrix=new G4RotationMatrix(); + rotateMatrix->rotateX(180.0*deg); + + //---------rotation Mirror-------- + + G4RotationMatrix* rotateMirror=new G4RotationMatrix(); + rotateMirror->rotateY(35.0*deg); + + //---------------colors---------- + + G4Colour white (1.0, 1.0, 1.0); + G4Colour grey (0.5, 0.5, 0.5); + //G4Colour lgrey (.75, .75, .75); + G4Colour red (1.0, 0.0, 0.0); + //G4Colour blue (0.0, 0.0, 1.0); + G4Colour cyan (0.0, 1.0, 1.0); + G4Colour magenta (1.0, 0.0, 1.0); + G4Colour yellow (1.0, 1.0, 0.0); + //G4Colour lblue (0.20, .50, .85); + + //------------------------------------------------------ volumes + + //------------------------------ experimental hall (world volume) + //------------------------------ beam line along z axis--------------------- + //--------------------window upper------------------- + + G4double windowUpDim_x = 4.*cm; + G4double windowUpDim_y = 4.*cm; + G4double windowUpDim_z = 0.0125*cm; + G4Box* windowUp_box = new G4Box("windowUp_box",windowUpDim_x,windowUpDim_y,windowUpDim_z); + windowUp_log = new G4LogicalVolume(windowUp_box,Be,"windowUp_log",0,0,0); + G4double windowUpPos_x = 0.0*m; + G4double windowUpPos_y = 0.0*m; + G4double windowUpPos_z = 123.5225*cm; + windowUp_phys = new G4PVPlacement(0, + G4ThreeVector(windowUpPos_x,windowUpPos_y,windowUpPos_z), + "windowUp",windowUp_log,world,false,0); + + + //-------------------- the first collimator upper---------------- + + + G4double innerRadiusOfTheTubeEx = 1.0*cm; + G4double outerRadiusOfTheTubeEx = 8.*cm; + G4double hightOfTheTubeEx = 3.0*cm; + G4double startAngleOfTheTubeEx = 0.*deg; + G4double spanningAngleOfTheTubeEx = 360.*deg; + G4Tubs* UpperCollimator = new G4Tubs("UpperCollimator",innerRadiusOfTheTubeEx, + outerRadiusOfTheTubeEx,hightOfTheTubeEx, + startAngleOfTheTubeEx,spanningAngleOfTheTubeEx); + UpperCollimator_log = new G4LogicalVolume(UpperCollimator,Pb,"UpperCollimator_log",0,0,0); + + G4double UpperCollimatorPosX = 0.*cm; + G4double UpperCollimatorPosY = 0.*cm; + G4double UpperCollimatorPosZ = 2.6*cm; + + UpperCollimator_phys = new G4PVPlacement(0, + G4ThreeVector(UpperCollimatorPosX,UpperCollimatorPosY, + UpperCollimatorPosZ),"UpperCollimator", + UpperCollimator_log,vacuumBlock,false,0); + //-------------------- the first collimator lower---------------- + + G4double pRmin1 = 0.*cm; + G4double pRmax1 = 0.6*cm; + G4double pRmin2 = 0.*cm; + G4double pRmax2 = 3.0*cm; + G4double hightOfTheCone =2.9*cm; + G4double startAngleOfTheCone = 0.*deg; + G4double spanningAngleOfTheCone = 360.*deg; + + G4Cons* collim_cone = new G4Cons("collim_cone",pRmin1,pRmax1,pRmin2, + pRmax2,hightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + collim_log = new G4LogicalVolume(collim_cone,Vacuum,"collim_log",0,0,0); + + + G4double innerRadiusOfTheTube = 0.*cm; + G4double outerRadiusOfTheTube = 8.*cm; + G4double hightOfTheTube = 2.8*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,Pb,"tracker_log",0,0,0); + + + G4SubtractionSolid* CylMinusCone = new G4SubtractionSolid("Cyl-Cone", + tracker_tube,collim_cone); + CylMinusCone_log = new G4LogicalVolume(CylMinusCone,Pb,"CylminusCone_log",0,0,0); + G4double CminusCPos_x = 0.*cm; + G4double CminusCPos_y = 0.*cm; + G4double CminusCPos_z = -3.5*cm; + CylMinusCone_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(CminusCPos_x,CminusCPos_y,CminusCPos_z), + "CylMinusCone",CylMinusCone_log,vacuumBlock,false,0); + + //------------------window lower------------------- + + + G4double windowLowDim_x = 4.*cm; + G4double windowLowDim_y = 4.*cm; + G4double windowLowDim_z = 0.01*cm; + G4Box* windowLow_box = new G4Box("windowLow_box",windowLowDim_x,windowLowDim_y,windowLowDim_z); + + windowLow_log = new G4LogicalVolume(windowLow_box,Be,"windowLow_log",0,0,0); + + G4double windowLowPos_x = 0.0*m; + G4double windowLowPos_y = 0.0*m; + G4double windowLowPos_z = 105.9873*cm; + + windowLow_phys = new G4PVPlacement(0, + G4ThreeVector(windowLowPos_x,windowLowPos_y,windowLowPos_z), + "windowLow",windowLow_log,world,false,0); + + + //---------------Ion chamber------------------------ + + G4double innerRadiusOfTheIonChamber = 0.*cm; + G4double outerRadiusOfTheIonChamber = 7.0*cm; + G4double hightOfTheWindows = 0.0125*cm; + G4double hightOfTheSignalPlates = 0.002*cm; + G4double startAngleOfTheIonChamber = 0.*deg; + G4double spanningAngleOfTheIonChamber = 360.*deg; + G4double IonChamberPos_x = 0.0*cm; + G4double IonChamberPos_y = 0.0*cm; + + + G4Tubs* Window = new G4Tubs("Window",innerRadiusOfTheIonChamber, + outerRadiusOfTheIonChamber,hightOfTheWindows, + startAngleOfTheIonChamber,spanningAngleOfTheIonChamber); + + Window_log = new G4LogicalVolume(Window,Kapton,"Window_log",0,0,0); + + + G4Tubs* SignalPlate = new G4Tubs("SignalPlate",innerRadiusOfTheIonChamber, + outerRadiusOfTheIonChamber,hightOfTheSignalPlates, + startAngleOfTheIonChamber,spanningAngleOfTheIonChamber); + + SignalPlate_log = new G4LogicalVolume(SignalPlate ,Kapton,"SignalPlate_log",0,0,0); + + //-----Ion chamber----window 1--------------------- + + G4double Window1Pos_z = 100.165*cm; + Window1_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,Window1Pos_z), + "Window",Window_log,world,false,0); + + //------Ion chamber---Signal Plate 1--------------------- + + G4double SignalPlate1Pos_z = 99.927*cm; + SignalPlate1_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,SignalPlate1Pos_z), + "SignalPlate",SignalPlate_log,world,false,0); + + //------Ion chamber---Signal Plate 2--------------------- + + G4double SignalPlate2Pos_z = 99.688*cm; + SignalPlate2_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,SignalPlate2Pos_z), + "SignalPlate",SignalPlate_log,world,false,0); + + //------Ion chamber---window 2--------------------- + + G4double Window2Pos_z = 99.45*cm; + Window2_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,Window2Pos_z), + "Window",Window_log,world,false,0); + + //------Ion chamber---Signal Plate 3--------------------- + + G4double SignalPlate3Pos_z = 99.212*cm; + SignalPlate3_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,SignalPlate3Pos_z), + "SignalPlate",SignalPlate_log,world,false,0); + + //------Ion chamber---Signal Plate 4--------------------- + + G4double SignalPlate4Pos_z = 98.973*cm; + SignalPlate4_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,SignalPlate4Pos_z), + "SignalPlate",SignalPlate_log,world,false,0); + + //------Ion chamber---window 3--------------------- + + G4double Window3Pos_z = 98.735*cm; + Window3_phys = new G4PVPlacement(0, + G4ThreeVector(IonChamberPos_x,IonChamberPos_y,Window3Pos_z), + "Window",Window_log,world,false,0); + + + //----------------Mirror--------------------------- + + G4double innerRadiusOfTheMirror = 0.*cm; + G4double outerRadiusOfTheMirror = 6.*cm; + G4double hightOfTheMirror = 0.003*cm; + G4double startAngleOfTheMirror = 0.*deg; + G4double spanningAngleOfTheMirror = 360.*deg; + G4Tubs* Mirror = new G4Tubs("Mirror",innerRadiusOfTheMirror, + outerRadiusOfTheMirror,hightOfTheMirror, + startAngleOfTheMirror,spanningAngleOfTheMirror); + + Mirror_log = new G4LogicalVolume(Mirror,Al,"Mirror_log",0,0,0); + G4double MirrorPos_x = 0.0*cm; + G4double MirrorPos_y = 0.0*cm; + G4double MirrorPos_z = 95.0*cm; + Mirror_phys = new G4PVPlacement(rotateMirror, + G4ThreeVector(MirrorPos_x,MirrorPos_y,MirrorPos_z), + "Mirror",Mirror_log,world,false,0); + + //----------------Light Field Reticle + + G4double reticleDim_x = 15.0*cm; + G4double reticleDim_y = 15.0*cm; + G4double reticleDim_z = 0.002*cm; + G4Box* reticle = new G4Box("reticle",reticleDim_x, + reticleDim_y,reticleDim_z); + reticle_log = new G4LogicalVolume(reticle, + Mylar,"reticle_log",0,0,0); + + G4double reticlePos_x = 0.0*cm; + G4double reticlePos_y = 0.0*cm; + G4double reticlePos_z = 65.5*cm; + reticle_phys = new G4PVPlacement(0, + G4ThreeVector(reticlePos_x,reticlePos_y,reticlePos_z), + "reticle",reticle_log,world,false,0); + + // Cuts by Regions + CylMinusCone_log->SetRegion(aLowerCollRegion); + aLowerCollRegion->AddRootLogicalVolume(CylMinusCone_log); + + UpperCollimator_log->SetRegion(aUpperCollRegion); + aUpperCollRegion->AddRootLogicalVolume(UpperCollimator_log); + +//--------- Visualization attributes ------------------------------- + + G4VisAttributes* simpleLeadWVisAtt= new G4VisAttributes(magenta); + simpleLeadWVisAtt->SetVisibility(true); + simpleLeadWVisAtt->SetForceWireframe(true); + collim_log->SetVisAttributes(simpleLeadWVisAtt); + CylMinusCone_log->SetVisAttributes(simpleLeadWVisAtt); + UpperCollimator_log->SetVisAttributes(simpleLeadWVisAtt); + + G4VisAttributes* simpleCopperSVisAtt= new G4VisAttributes(cyan); + simpleCopperSVisAtt->SetVisibility(true); + simpleCopperSVisAtt->SetForceSolid(true); + + G4VisAttributes* simpleBerylliumSVisAtt= new G4VisAttributes(red); + simpleBerylliumSVisAtt->SetVisibility(true); + simpleBerylliumSVisAtt->SetForceSolid(true); + windowUp_log->SetVisAttributes(simpleBerylliumSVisAtt); + windowLow_log->SetVisAttributes(simpleBerylliumSVisAtt); + + G4VisAttributes* simpleMylarVisAtt= new G4VisAttributes(grey); + simpleMylarVisAtt->SetVisibility(true); + simpleMylarVisAtt->SetForceSolid(true); + reticle_log->SetVisAttributes(simpleMylarVisAtt); + + G4VisAttributes* simpleAlVisAtt= new G4VisAttributes(white); + simpleAlVisAtt->SetVisibility(true); + simpleAlVisAtt->SetForceSolid(true); + Mirror_log->SetVisAttributes(simpleAlVisAtt); + + G4VisAttributes* simpleKaptonVisAtt= new G4VisAttributes(yellow); + simpleKaptonVisAtt->SetVisibility(true); + simpleKaptonVisAtt->SetForceSolid(true); + Window_log->SetVisAttributes(simpleKaptonVisAtt); + SignalPlate_log->SetVisAttributes(simpleKaptonVisAtt); + + //if you want not to see mirror ...: + + //G4VisAttributes* simpleWorldVisAtt= new G4VisAttributes(white); + //simpleWorldVisAtt->SetVisibility(false); + //Mirror_log->SetVisAttributes(simpleWorldVisAtt); + //CylMinusCone_log->SetVisAttributes(simpleWorldVisAtt); + //UpperCollimator_log->SetVisAttributes(simpleWorldVisAtt); + //windowUp_log->SetVisAttributes(simpleWorldVisAtt); + //windowLow_log->SetVisAttributes(simpleWorldVisAtt); + //Window_log->SetVisAttributes(simpleWorldVisAtt); + //SignalPlate_log->SetVisAttributes(simpleWorldVisAtt); + //reticle_log->SetVisAttributes(simpleWorldVisAtt); + + } + +void MedLinacHead::DestroyComponent() +{;} diff --git a/examples/advanced/medical_linac/src/MedLinacPhantomHit.cc b/examples/advanced/medical_linac/src/MedLinacPhantomHit.cc new file mode 100644 index 0000000000..90bb03b677 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPhantomHit.cc @@ -0,0 +1,85 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPhantomHit.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +// +#include "MedLinacPhantomHit.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4LogicalVolume.hh" + +G4Allocator MedLinacPhantomHitAllocator; + +MedLinacPhantomHit::MedLinacPhantomHit(G4LogicalVolume* logVol,G4int XID,G4int YID,G4int ZID) + :logicalVolume(logVol),xHitPosition(XID),zHitPosition(ZID),yHitPosition(YID) +{ + energyDeposit = 0; + + } + +MedLinacPhantomHit::~MedLinacPhantomHit() +{ +} + +MedLinacPhantomHit::MedLinacPhantomHit(const MedLinacPhantomHit &right) + : G4VHit() +{ + xHitPosition = right.xHitPosition; + zHitPosition = right.zHitPosition; + yHitPosition = right.yHitPosition; + energyDeposit = right.energyDeposit; + hitPosition = right.hitPosition; + rotation = right.rotation; + logicalVolume = right.logicalVolume; + + } + +const MedLinacPhantomHit& MedLinacPhantomHit::operator=(const MedLinacPhantomHit &right) +{ + xHitPosition = right.xHitPosition; + zHitPosition = right.zHitPosition; + yHitPosition = right.yHitPosition; + energyDeposit = right.energyDeposit; + hitPosition = right.hitPosition; + rotation = right.rotation; + logicalVolume = right.logicalVolume; + return *this; +} + +int MedLinacPhantomHit::operator==(const MedLinacPhantomHit &right) const +{ + return((xHitPosition==right.xHitPosition)&&(zHitPosition==right.zHitPosition)&&(yHitPosition==right.yHitPosition)); +} + +void MedLinacPhantomHit::Draw() +{ +} + +void MedLinacPhantomHit::Print() +{ +} diff --git a/examples/advanced/medical_linac/src/MedLinacPhantomROGeometry.cc b/examples/advanced/medical_linac/src/MedLinacPhantomROGeometry.cc new file mode 100644 index 0000000000..103425331e --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPhantomROGeometry.cc @@ -0,0 +1,198 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPhantomROGeometry.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +#include "MedLinacPhantomROGeometry.hh" +#include "MedLinacDummySD.hh" + +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4PVReplica.hh" +#include "G4SDManager.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4SubtractionSolid.hh" +#include "G4ThreeVector.hh" +#include "G4Material.hh" + +MedLinacPhantomROGeometry::MedLinacPhantomROGeometry(G4String aString, + G4double phantomDim_x, + G4double phantomDim_y, + G4double phantomDim_z, + G4int numberOfVoxelsX, + G4int numberOfVoxelsY, + G4int numberOfVoxelsZ): + G4VReadOutGeometry(aString), + PhantomDimensionX(phantomDim_x), + PhantomDimensionY(phantomDim_y), + PhantomDimensionZ(phantomDim_z), + NumberOfVoxelsAlongX(numberOfVoxelsX), + NumberOfVoxelsAlongY(numberOfVoxelsY), + NumberOfVoxelsAlongZ(numberOfVoxelsZ) +{} +MedLinacPhantomROGeometry::~MedLinacPhantomROGeometry() +{ +} + +G4VPhysicalVolume* MedLinacPhantomROGeometry::Build() +{ + + G4cout << " MedLinacPhantomROGeometry::Build()-----------------------" << G4endl; + + //G4Material* dummyMat = new G4Material(name="dummyMat", 1., 1.*g/mole, 1.*g/cm3); + G4double a; // atomic mass + G4double z; // atomic number + G4int natoms; + G4String name; + G4String symbol; + a = 16.00*g/mole; + G4Element* elO = new G4Element(name="Oxygen",symbol="O", z=8., a); + + a = 1.00794*g/mole; + G4Element* elH = new G4Element(name="Hydrogen",symbol="H", z=1., a); + + G4double density; + G4int ncomponents; + density = 1.000*g/cm3; + G4Material* H2O = new G4Material(name="Water",density, ncomponents=2); + H2O->AddElement(elH, natoms=2); + H2O->AddElement(elO, natoms=1); + + G4double expHall_x = 3.0*m; + G4double expHall_y = 3.0*m; + G4double expHall_z = 3.0*m; + + // variables for x division ... + G4double halfXVoxelDimensionX = PhantomDimensionX/NumberOfVoxelsAlongX; + G4double halfXVoxelDimensionZ = PhantomDimensionZ; + G4double voxelXThickness = 2*halfXVoxelDimensionX; + + // variables for y division ... + G4double halfZVoxelDimensionX = PhantomDimensionX; + G4double halfZVoxelDimensionZ = PhantomDimensionZ/NumberOfVoxelsAlongZ; + G4double voxelZThickness = 2*halfZVoxelDimensionZ; + + + + // world volume of ROGeometry ... + G4Box *ROWorld = new G4Box("ROWorld", + expHall_x, + expHall_y, + expHall_z); + + G4LogicalVolume *ROWorldLog = new G4LogicalVolume(ROWorld, + H2O, + "ROWorldLog", + 0,0,0); + + G4VPhysicalVolume *ROWorldPhys = new G4PVPlacement(0, + G4ThreeVector(), + "ROWorldPhys", + ROWorldLog, + 0,false,0); + + // phantom ROGeometry ... + G4Box *ROPhantom = new G4Box("ROPhantom", + PhantomDimensionX, + PhantomDimensionY, + PhantomDimensionZ); + + G4LogicalVolume *ROPhantomLog = new G4LogicalVolume(ROPhantom, + H2O, + "ROPhantomLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomPhys = new G4PVPlacement(0, + G4ThreeVector(), + "PhantomPhys", + ROPhantomLog, + ROWorldPhys, + false,0); + + // ROGeomtry: Voxel division + + // X division first... + G4Box *ROPhantomXDivision = new G4Box("ROPhantomXDivision", + halfXVoxelDimensionX, + halfXVoxelDimensionZ, + halfXVoxelDimensionZ); + + G4LogicalVolume *ROPhantomXDivisionLog = new G4LogicalVolume(ROPhantomXDivision, + H2O, + "ROPhantomXDivisionLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomXDivisionPhys = new G4PVReplica("ROPhantomXDivisionPhys", + ROPhantomXDivisionLog, + ROPhantomPhys, + kXAxis, + NumberOfVoxelsAlongX, + voxelXThickness); + // ...then Z division + + G4Box *ROPhantomZDivision = new G4Box("ROPhantomZDivision", + halfZVoxelDimensionX, + halfZVoxelDimensionX, + halfZVoxelDimensionZ); + + G4LogicalVolume *ROPhantomZDivisionLog = new G4LogicalVolume(ROPhantomZDivision, + H2O, + "ROPhantomZDivisionLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomZDivisionPhys = new G4PVReplica("ROPhantomZDivisionPhys", + ROPhantomZDivisionLog, + ROPhantomXDivisionPhys, + kZAxis, + NumberOfVoxelsAlongZ, + voxelZThickness); + // ...then Y division + + G4Box *ROPhantomYDivision = new G4Box("ROPhantomYDivision", + halfZVoxelDimensionX, + halfZVoxelDimensionX, + halfZVoxelDimensionX); + + G4LogicalVolume *ROPhantomYDivisionLog = new G4LogicalVolume(ROPhantomYDivision, + H2O, + "ROPhantomYDivisionLog", + 0,0,0); + + ROPhantomYDivisionPhys = new G4PVReplica("ROPhantomYDivisionPhys", + ROPhantomYDivisionLog, + ROPhantomZDivisionPhys, + kYAxis, + NumberOfVoxelsAlongZ, + voxelZThickness); + MedLinacDummySD *dummySD = new MedLinacDummySD; + ROPhantomYDivisionLog->SetSensitiveDetector(dummySD); + + return ROWorldPhys; +} + + + diff --git a/examples/advanced/medical_linac/src/MedLinacPhantomSD.cc b/examples/advanced/medical_linac/src/MedLinacPhantomSD.cc new file mode 100644 index 0000000000..1ae1adbaeb --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPhantomSD.cc @@ -0,0 +1,174 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +//// $Id: MedLinacPhantomSD.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +// +// +#include "MedLinacPhantomSD.hh" +#include "MedLinacPhantomHit.hh" +#include "MedLinacAnalysisManager.hh" +#include "MedLinacDetectorConstruction.hh" +#include "G4Track.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4Step.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" +#include "G4SDManager.hh" +#include "G4ParticleDefinition.hh" + +//.... + +MedLinacPhantomSD::MedLinacPhantomSD(G4String name):G4VSensitiveDetector(name) +{ +} + +MedLinacPhantomSD::~MedLinacPhantomSD() +{ +} + +void MedLinacPhantomSD::Initialize(G4HCofThisEvent*) +{ +} + +G4bool MedLinacPhantomSD::ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist) +{ + if(!ROhist) + return false; + + if(aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName() != "Phantom_phys") + return false; + + G4double energyDep = aStep->GetTotalEnergyDeposit(); + if(energyDep == 0.) + return false; + + // Read Voxel indexes: i is the x index, k is the z index + G4int k = ROhist->GetReplicaNumber(1); + G4int i = ROhist->GetReplicaNumber(2); + G4int j = ROhist->GetReplicaNumber(); + + + G4int numberOfVoxelZ = 300; + G4double voxelWidthZ = 1. *mm; + + G4double x; + G4double y; + G4double z; + x = (-numberOfVoxelZ+1+2*i)*voxelWidthZ/2; + y = (- numberOfVoxelZ+1+2*j)*voxelWidthZ/2; + z = (- numberOfVoxelZ+1+2*k)*voxelWidthZ/2; + + if(energyDep != 0) + { +#ifdef G4ANALYSIS_USE + MedLinacAnalysisManager* analysis = + MedLinacAnalysisManager::getInstance(); + //2Dhistogram with the distribution of energy at depth=15 mm in the phantom + //(x,y,energy) (YThickness = 1. cm) + if(energyDep != 0) + { + if (z<140.*mm){if (z> 130.*mm) + {analysis->FillHistogram3WithEnergy(x,y,energyDep/MeV);} + } + } + if(energyDep != 0) + { + analysis->FillHistogram1WithEnergy(x,z,energyDep/MeV); + } +//**** PDD in isocenter (Y and X Thickness = 5. mm) ********************** + if(energyDep != 0) + { + if (y<2.5*mm){if (y> -2.5*mm) + { + if(x<2.5*mm){if (x> -2.5*mm) + {analysis->FillHistogram4WithEnergy(z,energyDep/MeV);} + }}}} +//***** flatness along x ***** Depth=build-up for 6MV photon beam (15 mm)* + if(energyDep != 0) + { + if (z<137.5*mm){if (z> 132.5*mm) + { if (y<2.5*mm){if (y> -2.5*mm) + {analysis->FillHistogram5WithEnergy(x,energyDep/MeV);} + } + } + } + } +//***** flatness along x ***** Depth=50mm********************************* + if(energyDep != 0) + { + if (z<102.5*mm){if (z> 97.5*mm) + { if (y<2.5*mm){if (y> -2.5*mm) + {analysis->FillHistogram6WithEnergy(x,energyDep/MeV);} + } + } + } + } +//***** flatness along x ***** Depth=100 mm******************************** + if(energyDep != 0) + { + if (z<52.5*mm){if (z> 47.5*mm) + { if (y<2.5*mm){if (y> -2.5*mm) + {analysis->FillHistogram7WithEnergy(x,energyDep/MeV);} + } + } + } + } +//***** flatness along x ***** Depth=200 mm******************************** + if(energyDep != 0) + { + if (z<-47.5*mm){if (z> -52.5*mm) + { if (y<2.5*mm){if (y> -2.5*mm) + {analysis->FillHistogram8WithEnergy(x,energyDep/MeV);} + } + } + } + } +//************************************************************************** +#endif + + } + return true; +} + +void MedLinacPhantomSD::EndOfEvent(G4HCofThisEvent*) +{ +} + +void MedLinacPhantomSD::clear() +{ +} + +void MedLinacPhantomSD::DrawAll() +{ +} + +void MedLinacPhantomSD::PrintAll() +{ +} + + + diff --git a/examples/advanced/medical_linac/src/MedLinacPhysicsList.cc b/examples/advanced/medical_linac/src/MedLinacPhysicsList.cc new file mode 100644 index 0000000000..f7b83851f1 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPhysicsList.cc @@ -0,0 +1,202 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPhysicsList.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +#include "globals.hh" +#include "MedLinacPhysicsList.hh" + +#include "G4ParticleDefinition.hh" +#include "G4ParticleWithCuts.hh" +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" +#include "G4Material.hh" +#include "G4ios.hh" +#include +#include "G4UnitsTable.hh" +#include "G4Region.hh" +#include "G4RegionStore.hh" +#include "G4ProductionCuts.hh" +#include "G4ProductionCutsTable.hh" + +MedLinacPhysicsList::MedLinacPhysicsList(): G4VUserPhysicsList() +{ + defaultCutValue = 0.1*mm; + //cutForGamma = defaultCutValue; + //cutForElectron = defaultCutValue; + //cutForPositron = defaultCutValue; + SetVerboseLevel(1); +} + +MedLinacPhysicsList::~MedLinacPhysicsList() +{;} + +void MedLinacPhysicsList::ConstructParticle() +{ + // In this method, static member functions should be called + // for all particles which you want to use. + // This ensures that objects of these particle types will be + // created in the program. + + ConstructBosons(); + ConstructLeptons(); +} +void MedLinacPhysicsList::ConstructBosons() +{ + // gamma + G4Gamma::GammaDefinition(); +} + +void MedLinacPhysicsList::ConstructLeptons() +{ + // leptons + // e+/- + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); +} + +void MedLinacPhysicsList::ConstructProcess() +{ + // Define transportation process + + AddTransportation(); + ConstructEM(); + //ConstructGeneral(); +} + +//**************************************************************** + +//#include "G4ComptonScattering.hh" +//#include "G4GammaConversion.hh" +//#include "G4PhotoElectricEffect.hh" + +#include "G4LowEnergyPhotoElectric.hh" +#include "G4LowEnergyCompton.hh" +#include "G4LowEnergyGammaConversion.hh" +#include "G4LowEnergyRayleigh.hh" + +#include "G4MultipleScattering.hh" + +#include "G4LowEnergyIonisation.hh" +#include "G4LowEnergyBremsstrahlung.hh" +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + + +//******************************************************************** + +void MedLinacPhysicsList::ConstructEM() +{ + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + if (particleName == "gamma") { + // gamma + + lowePhot = new G4LowEnergyPhotoElectric("LowEnPhotoElec"); + pmanager->AddDiscreteProcess(new G4LowEnergyRayleigh); + pmanager->AddDiscreteProcess(lowePhot); + pmanager->AddDiscreteProcess(new G4LowEnergyCompton); + pmanager->AddDiscreteProcess(new G4LowEnergyGammaConversion); + //pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); + //pmanager->AddDiscreteProcess(new G4ComptonScattering); + //pmanager->AddDiscreteProcess(new G4GammaConversion); + + } else if (particleName == "e-") { + //electron + + loweIon = new G4LowEnergyIonisation("LowEnergyIoni"); + loweBrem = new G4LowEnergyBremsstrahlung("LowEnBrem"); + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(loweIon, -1, 2,2); + pmanager->AddProcess(loweBrem, -1,-1,3); + + + //pmanager->AddProcess(new G4eIonisation, -1, 2,2); + //pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + + } else if (particleName == "e+") { + //positron + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + } + } +} + + +//****************************************************************** + +void MedLinacPhysicsList::SetCuts() +{ + // uppress error messages even in case e/gamma/proton do not exist + G4int temp = GetVerboseLevel(); + SetVerboseLevel(1); + + // " G4VUserPhysicsList::SetCutsWithDefault" method sets + // the default cut value for all particle types + + SetCutsWithDefault(); + + //SetCutValue(cutForGamma, "gamma"); + //SetCutValue(cutForElectron, "e-"); + //SetCutValue(cutForPositron, "e+"); + + // Retrieve verbose level + SetVerboseLevel(temp); + + // Production thresholds for detector regions + + G4String regName = "PrimaryCollimatorLow"; + G4double cutValue = 8.*cm; + G4Region* reg = G4RegionStore::GetInstance()->GetRegion(regName); + G4ProductionCuts* cuts = new G4ProductionCuts; + cuts->SetProductionCut(cutValue); + reg->SetProductionCuts(cuts); + + G4String regName1 = "PrimaryCollimatorUp"; + G4double cutValue1 = 8.*cm; + G4Region* reg1 = G4RegionStore::GetInstance()->GetRegion(regName1); + G4ProductionCuts* cuts1 = new G4ProductionCuts; + cuts1->SetProductionCut(cutValue1); + reg1->SetProductionCuts(cuts1); + + + + if (verboseLevel >0){ + G4cout << "MedLinac::SetCuts: default cut length : " + << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + +} + diff --git a/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorAction.cc b/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorAction.cc new file mode 100644 index 0000000000..c2cf000185 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorAction.cc @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPrimaryGeneratorAction.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +#include "MedLinacPrimaryGeneratorAction.hh" +#include "MedLinacPrimaryGeneratorMessenger.hh" + +#ifdef G4ANALYSIS_USE +#include "MedLinacAnalysisManager.hh" +#endif +#include "MedLinacDetectorConstruction.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "globals.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4IonTable.hh" + +MedLinacPrimaryGeneratorAction::MedLinacPrimaryGeneratorAction() + :pEnergy(99.0*MeV),sigma(12.7*MeV) +{ + G4int n_particle = 1; + particleGun = new G4ParticleGun(n_particle); + //create a messenger for this class + gunMessenger = new MedLinacPrimaryGeneratorMessenger(this); + + // default particle kinematic + + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4String particleName; + + particleGun->SetParticleDefinition(particleTable->FindParticle(particleName="e-")); + particleGun->SetParticleEnergy(pEnergy); + particleGun->SetParticlePosition(G4ThreeVector(0.0*cm, 0.0*cm, 123.0*cm)); + +} + +MedLinacPrimaryGeneratorAction::~MedLinacPrimaryGeneratorAction() +{ + delete particleGun; + delete gunMessenger; +} + +void MedLinacPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + G4double energy; + +#ifdef G4ANALYSIS_USE + MedLinacAnalysisManager* analysis = MedLinacAnalysisManager::getInstance(); +#endif + + G4double cosTheta = RandGauss::shoot(-1.,0.00003); + G4double phi = twopi * G4UniformRand(); + + G4double sinTheta = sqrt(1. - cosTheta*cosTheta); + G4double ux = sinTheta*cos(phi); + G4double uy = sinTheta*sin(phi); + G4double uz = cosTheta; + + particleGun->SetParticleMomentumDirection(G4ThreeVector(ux,uy,uz)); + + energy=pEnergy; + energy = RandGauss::shoot(pEnergy,sigma); + particleGun->SetParticleEnergy(energy); + + + //1D Histogram of primary particle energy ... +#ifdef G4ANALYSIS_USE + analysis->PrimaryParticleEnergySpectrum(energy); +#endif + particleGun->GeneratePrimaryVertex(anEvent); +} + + + diff --git a/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorMessenger.cc b/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorMessenger.cc new file mode 100644 index 0000000000..7685433e57 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacPrimaryGeneratorMessenger.cc @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacPrimaryGeneratorMessenger.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili +// +#include "MedLinacPrimaryGeneratorMessenger.hh" + +#include "MedLinacPrimaryGeneratorAction.hh" +#include "MedLinacRunAction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" + +MedLinacPrimaryGeneratorMessenger::MedLinacPrimaryGeneratorMessenger(MedLinacPrimaryGeneratorAction* MedLinacGun) + :MedLinacAction(MedLinacGun) + +{ + EnergyCmd = new G4UIcmdWithADoubleAndUnit("/energy",this); + EnergyCmd->SetGuidance("Select the energy (and unit) of the primary particles"); + EnergyCmd->SetGuidance("Type particle Energy"); + EnergyCmd->SetParameterName("energy",true,true); + EnergyCmd->SetDefaultValue(1.); + EnergyCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + SourceTypeCmd = new G4UIcmdWithADoubleAndUnit("/sourceType",this); + SourceTypeCmd->SetGuidance("Select the standard deviation of the energy."); + SourceTypeCmd->SetParameterName("standard deviation",true); + SourceTypeCmd->SetDefaultValue(1.); + SourceTypeCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + +} + +void MedLinacPrimaryGeneratorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if( command == EnergyCmd ) + { + G4double newEnergy = EnergyCmd->GetNewDoubleValue(newValue); + MedLinacAction->SetEnergy(newEnergy); + G4cout << "Energy "<< newEnergy << G4endl; + } + + if( command == SourceTypeCmd ) + { + G4double newSourceType = SourceTypeCmd->GetNewDoubleValue(newValue); + MedLinacAction->SetSourceType(newSourceType); + + G4cout << " standard deviation"<< newSourceType << G4endl; + } +} + + +MedLinacPrimaryGeneratorMessenger::~MedLinacPrimaryGeneratorMessenger() +{ + delete EnergyCmd; + delete SourceTypeCmd; +} diff --git a/examples/advanced/medical_linac/src/MedLinacRunAction.cc b/examples/advanced/medical_linac/src/MedLinacRunAction.cc new file mode 100644 index 0000000000..b80c4eae15 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacRunAction.cc @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacRunAction.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + +#include "MedLinacRunAction.hh" +#include "MedLinacEventAction.hh" + +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "MedLinacDetectorConstruction.hh" +#include "G4SDManager.hh" +#include "G4Timer.hh" + +#ifdef G4ANALYSIS_USE +#include "MedLinacAnalysisManager.hh" +#endif + + +MedLinacRunAction::MedLinacRunAction(G4String SDName) +{ + + sensitiveDetectorName = SDName; + detector = MedLinacDetectorConstruction::GetInstance(sensitiveDetectorName); +} + + +MedLinacRunAction::~MedLinacRunAction() +{ + delete detector; +} + +void MedLinacRunAction::BeginOfRunAction(const G4Run* aRun) +{ +#ifdef G4ANALYSIS_USE + MedLinacAnalysisManager* analysis = MedLinacAnalysisManager::getInstance(); + analysis->book(); +#endif + + + G4cout << "Run " << aRun->GetRunID() << " start." << G4endl; + +} + +void MedLinacRunAction::EndOfRunAction(const G4Run* aRun) +{ + +#ifdef G4ANALYSIS_USE + MedLinacAnalysisManager* analysis = MedLinacAnalysisManager::getInstance(); +#endif + G4cout << "number of event = " << aRun->GetNumberOfEvent() << G4endl; + +#ifdef G4ANALYSIS_USE + analysis->finish(); +#endif + + +} + + + diff --git a/examples/advanced/medical_linac/src/MedLinacTargetAndFilterDecorator.cc b/examples/advanced/medical_linac/src/MedLinacTargetAndFilterDecorator.cc new file mode 100644 index 0000000000..792c10fe28 --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacTargetAndFilterDecorator.cc @@ -0,0 +1,535 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacTargetAndFilterDecorator.cc,v 1.1 2004/05/14 18:25:40 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// +#include "MedLinacVGeometryComponent.hh" +#include "G4Material.hh" +#include "MedLinacTargetAndFilterDecorator.hh" +#include "MedLinacDecorator.hh" + +#include "globals.hh" +#include "G4LogicalVolume.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4Material.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4MaterialTable.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4Box.hh" +#include "G4Cons.hh" +#include "G4Tubs.hh" +#include "G4ThreeVector.hh" +#include "G4VisAttributes.hh" +#include "G4GeometryManager.hh" +#include "G4BooleanSolid.hh" +#include "G4SubtractionSolid.hh" +#include "G4VSolid.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" +#include "G4Colour.hh" + +#include "G4ios.hh" +MedLinacTargetAndFilterDecorator::MedLinacTargetAndFilterDecorator(MedLinacVGeometryComponent* comp) + : MedLinacDecorator(comp) +{ + +} +MedLinacTargetAndFilterDecorator::~MedLinacTargetAndFilterDecorator() +{ + ; +} +void MedLinacTargetAndFilterDecorator::ConstructComponent(G4VPhysicalVolume* world, G4VPhysicalVolume* vacuumBlock) +{ + MedLinacDecorator::ConstructComponent(world,vacuumBlock); + ConstructTargetAndFilter(world,vacuumBlock); +} + +void MedLinacTargetAndFilterDecorator::DestroyComponent() +{ + ; +} +void MedLinacTargetAndFilterDecorator::ConstructTargetAndFilter(G4VPhysicalVolume* world, G4VPhysicalVolume* vacuumBlock) +{ + + // materials + + G4double a; // atomic mass + G4double z; // atomic number + G4double density; + G4String symbol; + G4String name; + G4double fractionmass; + G4int ncomponents; + + a = 14.00674*g/mole; + G4Element* elN = new G4Element(name="Nitrogen" ,symbol="N", z=7., a); + + a = 16.00*g/mole; + G4Element* elO = new G4Element(name="Oxygen",symbol="O", z=8., a); + + a = 49.29*g/mole; + density = 2.6989*g/cm3; + G4Material* Al = new G4Material(name="Aluminium", z=13., a, density); + + a = 207.19*g/mole; + density = 11.35*g/cm3; + G4Material* Pb = new G4Material(name="Lead", z=82., a, density); +; + density = 1.290*mg/cm3; + G4Material* Air = new G4Material(name="Air",density, ncomponents=2); + Air->AddElement(elN, fractionmass=70*perCent); + Air->AddElement(elO, fractionmass=30*perCent); + + // colors + G4Colour cyan (0.0, 1.0, 1.0); + G4Colour magenta (1.0, 0.0, 1.0); + + //---------rotation matrix filter-------- + + G4RotationMatrix* rotateMatrix=new G4RotationMatrix(); + rotateMatrix->rotateX(180.0*deg); + + + // volumes + // beam line along z axis +//------------------------target 6MV------------------------ + + G4double targetADim_x = 0.6*cm; + G4double targetADim_y = 0.6*cm; + G4double targetADim_z = 0.04445*cm; + G4Box* targetA_box = new G4Box("targetA_box",targetADim_x,targetADim_y,targetADim_z); + targetA_log = new G4LogicalVolume(targetA_box,Pb,"targetA_log",0,0,0); + G4double targetAPos_x = 0.0*m; + G4double targetAPos_y = 0.0*m; + G4double targetAPos_z = 0.20055*cm; + targetA_phys = new G4PVPlacement(0, + G4ThreeVector(targetAPos_x,targetAPos_y,targetAPos_z), + "targetA",targetA_log,vacuumBlock,false,0); + + G4double targetBDim_x = 0.6*cm; + G4double targetBDim_y = 0.6*cm; + G4double targetBDim_z = 0.0787*cm; + G4Box* targetB_box = new G4Box("targetB_box",targetBDim_x,targetBDim_y,targetBDim_z); + targetB_log = new G4LogicalVolume(targetB_box,Al,"targetB_log",0,0,0); + G4double targetBPos_x = 0.0*m; + G4double targetBPos_y = 0.0*m; + G4double targetBPos_z = 0.0773*cm; + targetB_phys = new G4PVPlacement(0, + G4ThreeVector(targetBPos_x,targetBPos_y,targetBPos_z), + "targetB",targetB_log,vacuumBlock,false,0); + + //--------------Flattening Filter--------------- + G4double layerRmin1 = 0.*cm; + G4double layerRmin2 = 0.*cm; + G4double layerPos_x = 0.0*m; + G4double layerPos_y = 0.0*m; + + //-----------layer1----------------------------- + G4double layer1Rmax1 = 0.00000001*cm; + G4double layer1Rmax2 = 0.025*cm; + G4double layer1HightOfTheCone = 0.006*cm; + G4double startAngleOfTheCone = 0.*deg; + G4double spanningAngleOfTheCone = 360.*deg; + G4Cons* layer1 = new G4Cons("layer1",layerRmin1,layer1Rmax1,layerRmin2, + layer1Rmax2,layer1HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer1_log = new G4LogicalVolume(layer1,Al,"layer1_log",0,0,0); + + G4double layer1Pos_z = 103.404*cm; + layer1_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer1Pos_z), + "layer1",layer1_log,world,false,0); + + //-----------layer2----------------------------- + G4double layer2Rmax1 = 0.025*cm; + G4double layer2Rmax2 = 0.051*cm; + G4double layer2HightOfTheCone = 0.0065*cm; + G4Cons* layer2 = new G4Cons("layer2",layerRmin1,layer2Rmax1,layerRmin2, + layer2Rmax2,layer2HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer2_log = new G4LogicalVolume(layer2,Al,"layer2_log",0,0,0); + + G4double layer2Pos_z = 103.3888*cm; + layer2_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer2Pos_z), + "layer2",layer2_log,world,false,0); + //-----------layer3----------------------------- + G4double layer3Rmax1 = 0.051*cm; + G4double layer3Rmax2 = 0.077*cm; + G4double layer3HightOfTheCone = 0.0075*cm; + G4Cons* layer3 = new G4Cons("layer3",layerRmin1,layer3Rmax1,layerRmin2, + layer3Rmax2,layer3HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer3_log = new G4LogicalVolume(layer3,Al,"layer3_log",0,0,0); + + G4double layer3Pos_z = 103.3748*cm; + layer3_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer3Pos_z), + "layer3",layer3_log,world,false,0); + + //-----------layer4----------------------------- + G4double layer4Rmax1 = 0.077*cm; + G4double layer4Rmax2 = 0.103*cm; + G4double layer4HightOfTheCone = 0.009*cm; + G4Cons* layer4 = new G4Cons("layer4",layerRmin1,layer4Rmax1,layerRmin2, + layer4Rmax2,layer4HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer4_log = new G4LogicalVolume(layer4,Al,"layer4_log",0,0,0); + + G4double layer4Pos_z = 103.3583*cm; + layer4_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer4Pos_z), + "layer4",layer4_log,world,false,0); + //-----------layer5----------------------------- + G4double layer5Rmax1 = 0.103*cm; + G4double layer5Rmax2 = 0.154*cm; + G4double layer5HightOfTheCone = 0.022*cm; + G4Cons* layer5 = new G4Cons("layer5",layerRmin1,layer5Rmax1,layerRmin2, + layer5Rmax2,layer5HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer5_log = new G4LogicalVolume(layer5,Al,"layer5_log",0,0,0); + + G4double layer5Pos_z = 103.3273*cm; + layer5_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer5Pos_z), + "layer5",layer5_log,world,false,0); + + //-----------layer6----------------------------- + G4double layer6Rmax1 = 0.154*cm; + G4double layer6Rmax2 = 0.205*cm; + G4double layer6HightOfTheCone = 0.024*cm; + G4Cons* layer6 = new G4Cons("layer6",layerRmin1,layer6Rmax1,layerRmin2, + layer6Rmax2,layer6HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer6_log = new G4LogicalVolume(layer6,Al,"layer6_log",0,0,0); + + G4double layer6Pos_z = 103.2813*cm; + layer6_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer6Pos_z), + "layer6",layer6_log,world,false,0); + + //-----------layer7----------------------------- + G4double layer7Rmax1 = 0.205*cm; + G4double layer7Rmax2 = 0.256*cm; + G4double layer7HightOfTheCone = 0.023*cm; + G4Cons* layer7 = new G4Cons("layer7",layerRmin1,layer7Rmax1,layerRmin2, + layer7Rmax2,layer7HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer7_log = new G4LogicalVolume(layer7,Al,"layer7_log",0,0,0); + + G4double layer7Pos_z = 103.2343*cm; + layer7_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer7Pos_z), + "layer7",layer7_log,world,false,0); + + //-----------layer8----------------------------- + G4double layer8Rmax1 = 0.256*cm; + G4double layer8Rmax2 = 0.307*cm; + G4double layer8HightOfTheCone = 0.023*cm; + G4Cons* layer8 = new G4Cons("layer8",layerRmin1,layer8Rmax1,layerRmin2, + layer8Rmax2,layer8HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer8_log = new G4LogicalVolume(layer8,Al,"layer8_log",0,0,0); + + G4double layer8Pos_z = 103.1883*cm; + layer8_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer8Pos_z), + "layer8",layer8_log,world,false,0); + + //-----------layer9----------------------------- + G4double layer9Rmax1 = 0.307*cm; + G4double layer9Rmax2 = 0.358*cm; + G4double layer9HightOfTheCone = 0.0225*cm; + G4Cons* layer9 = new G4Cons("layer9",layerRmin1,layer9Rmax1,layerRmin2, + layer9Rmax2,layer9HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer9_log = new G4LogicalVolume(layer9,Al,"layer9_log",0,0,0); + + G4double layer9Pos_z = 103.1428*cm; + layer9_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer9Pos_z), + "layer9",layer9_log,world,false,0); + + //-----------layer10----------------------------- + G4double layer10Rmax1 = 0.358*cm; + G4double layer10Rmax2 = 0.409*cm; + G4double layer10HightOfTheCone = 0.022*cm; + G4Cons* layer10 = new G4Cons("layer10",layerRmin1,layer10Rmax1,layerRmin2, + layer10Rmax2,layer10HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer10_log = new G4LogicalVolume(layer10,Al,"layer10_log",0,0,0); + + G4double layer10Pos_z = 103.0983*cm; + layer10_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer10Pos_z), + "layer10",layer10_log,world,false,0); + //-----------layer11----------------------------- + G4double layer11Rmax1 = 0.409*cm; + G4double layer11Rmax2 = 0.510*cm; + G4double layer11HightOfTheCone = 0.0425*cm; + G4Cons* layer11 = new G4Cons("layer11",layerRmin1,layer11Rmax1,layerRmin2, + layer11Rmax2,layer11HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer11_log = new G4LogicalVolume(layer11,Al,"layer11_log",0,0,0); + + G4double layer11Pos_z = 103.0338*cm; + layer11_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer11Pos_z), + "layer11",layer11_log,world,false,0); + + //-----------layer12----------------------------- + G4double layer12Rmax1 = 0.510*cm; + G4double layer12Rmax2 = 0.620*cm; + G4double layer12HightOfTheCone = 0.0395*cm; + G4Cons* layer12 = new G4Cons("layer12",layerRmin1,layer12Rmax1,layerRmin2, + layer12Rmax2,layer12HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer12_log = new G4LogicalVolume(layer12,Al,"layer12_log",0,0,0); + + G4double layer12Pos_z = 102.9518*cm; + layer12_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer12Pos_z), + "layer12",layer12_log,world,false,0); + + //-----------layer13----------------------------- + G4double layer13Rmax1 = 0.620*cm; + G4double layer13Rmax2 = 0.730*cm; + G4double layer13HightOfTheCone = 0.038*cm; + G4Cons* layer13 = new G4Cons("layer13",layerRmin1,layer13Rmax1,layerRmin2, + layer13Rmax2,layer13HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer13_log = new G4LogicalVolume(layer13,Al,"layer13_log",0,0,0); + + G4double layer13Pos_z = 102.8743*cm; + layer13_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer13Pos_z), + "layer13",layer13_log,world,false,0); + //-----------layer14----------------------------- + G4double layer14Rmax1 = 0.730*cm; + G4double layer14Rmax2 = 0.840*cm; + G4double layer14HightOfTheCone = 0.0335*cm; + G4Cons* layer14 = new G4Cons("layer14",layerRmin1,layer14Rmax1,layerRmin2, + layer14Rmax2,layer14HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer14_log = new G4LogicalVolume(layer14,Al,"layer14_log",0,0,0); + + G4double layer14Pos_z = 102.8028*cm; + layer14_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer14Pos_z), + "layer14",layer14_log,world,false,0); + + //-----------layer15----------------------------- + G4double layer15Rmax1 = 0.840*cm; + G4double layer15Rmax2 = 0.950*cm; + G4double layer15HightOfTheCone = 0.0325*cm; + G4Cons* layer15 = new G4Cons("layer15",layerRmin1,layer15Rmax1,layerRmin2, + layer15Rmax2,layer15HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer15_log = new G4LogicalVolume(layer15,Al,"layer15_log",0,0,0); + + G4double layer15Pos_z = 102.7368*cm; + layer15_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer15Pos_z), + "layer15",layer15_log,world,false,0); + //-----------layer16----------------------------- + G4double layer16Rmax1 = 0.950*cm; + G4double layer16Rmax2 = 1.050*cm; + G4double layer16HightOfTheCone = 0.028*cm; + G4Cons* layer16 = new G4Cons("layer16",layerRmin1,layer16Rmax1,layerRmin2, + layer16Rmax2,layer16HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer16_log = new G4LogicalVolume(layer16,Al,"layer16_log",0,0,0); + + G4double layer16Pos_z = 102.6763*cm; + layer16_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer16Pos_z), + "layer16",layer16_log,world,false,0); + + //-----------layer17----------------------------- + G4double layer17Rmax1 = 1.050*cm; + G4double layer17Rmax2 = 1.150*cm; + G4double layer17HightOfTheCone = 0.0275*cm; + G4Cons* layer17 = new G4Cons("layer17",layerRmin1,layer17Rmax1,layerRmin2, + layer17Rmax2,layer17HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer17_log = new G4LogicalVolume(layer17,Al,"layer17_log",0,0,0); + + G4double layer17Pos_z = 102.56208*cm; + layer17_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer17Pos_z), + "layer17",layer17_log,world,false,0); + + //-----------layer18----------------------------- + G4double layer18Rmax1 = 1.150*cm; + G4double layer18Rmax2 = 1.215*cm; + G4double layer18HightOfTheCone = 0.019*cm; + G4Cons* layer18 = new G4Cons("layer18",layerRmin1,layer18Rmax1,layerRmin2, + layer18Rmax2,layer18HightOfTheCone,startAngleOfTheCone, + spanningAngleOfTheCone); + + layer18_log = new G4LogicalVolume(layer18,Al,"layer18_log",0,0,0); + + G4double layer18Pos_z = 102.4743*cm; + layer18_phys = new G4PVPlacement(rotateMatrix, + G4ThreeVector(layerPos_x,layerPos_y,layer18Pos_z), + "layer18",layer18_log,world,false,0); + //-----------layer19----------------------------- + G4double innerRadiusOfTheLayer19 = 0.0*cm; + G4double outerRadiusOfTheLayer19 = 1.335*cm; + G4double hightOfTheLayer19 = 0.040*cm; + G4double startAngleOfTheLayer19 = 0.*deg; + G4double spanningAngleOfTheLayer19 = 360.*deg; + G4Tubs* layer19 = new G4Tubs("layer19",innerRadiusOfTheLayer19, + outerRadiusOfTheLayer19,hightOfTheLayer19, + startAngleOfTheLayer19,spanningAngleOfTheLayer19); + layer19_log = new G4LogicalVolume(layer19,Al,"layer19_log",0,0,0); + + G4double layer19PosX = 0.*cm; + G4double layer19PosY = 0.*cm; + G4double layer19PosZ = 102.4153*cm; + + layer19_phys = new G4PVPlacement(0, + G4ThreeVector(layer19PosX,layer19PosY, + layer19PosZ),"layer19", + layer19_log,world,false,0); + //-----------layer20----------------------------- + G4double innerRadiusOfTheLayer20A = 1.300*cm; + G4double outerRadiusOfTheLayer20A = 1.335*cm; + G4double hightOfTheLayer20A = 0.0225*cm; + G4double startAngleOfTheLayer20A = 0.*deg; + G4double spanningAngleOfTheLayer20A = 360.*deg; + G4Tubs* layer20A = new G4Tubs("layer20A",innerRadiusOfTheLayer20A, + outerRadiusOfTheLayer20A,hightOfTheLayer20A, + startAngleOfTheLayer20A,spanningAngleOfTheLayer20A); + layer20A_log = new G4LogicalVolume(layer20A,Al,"layer20A_log",0,0,0); + + G4double cone20Rmin1 = 0.*cm; + G4double cone20Rmax1 = 1.335*cm; + G4double cone20Rmin2 = 0.*cm; + G4double cone20Rmax2 = 1.301*cm; + G4double hightOfThecone20 =0.0225*cm; + G4double startAngleOfThecone20 = 0.*deg; + G4double spanningAngleOfThecone20 = 360.*deg; + + G4Cons* cone20 = new G4Cons("cone20",cone20Rmin1,cone20Rmax1,cone20Rmin2, + cone20Rmax2,hightOfThecone20,startAngleOfThecone20, + spanningAngleOfThecone20); + cone20_log = new G4LogicalVolume(cone20,Air,"cone20_log",0,0,0); + + G4SubtractionSolid* layer20 = new G4SubtractionSolid("layer20",layer20A,cone20); + layer20_log = new G4LogicalVolume(layer20,Al,"layer20_log",0,0,0); + + G4double layer20PosX = 0.*cm; + G4double layer20PosY = 0.*cm; + G4double layer20PosZ = 102.4778*cm; + layer20_phys = new G4PVPlacement(0, + G4ThreeVector(layer20PosX,layer20PosY, + layer20PosZ),"layer20", + layer20_log,world,false,0); + + //-----------layer21----------------------------- + G4double innerRadiusOfTheLayer21 = 1.335*cm; + G4double outerRadiusOfTheLayer21 = 1.600*cm; + G4double hightOfTheLayer21 = 0.0625*cm; + G4double startAngleOfTheLayer21 = 0.*deg; + G4double spanningAngleOfTheLayer21 = 360.*deg; + G4Tubs* layer21 = new G4Tubs("layer21",innerRadiusOfTheLayer21, + outerRadiusOfTheLayer21,hightOfTheLayer21, + startAngleOfTheLayer21,spanningAngleOfTheLayer21); + layer21_log = new G4LogicalVolume(layer21,Al,"layer21_log",0,0,0); + + G4double layer21PosX = 0.*cm; + G4double layer21PosY = 0.*cm; + G4double layer21PosZ = 102.4378*cm; + + layer21_phys = new G4PVPlacement(0, + G4ThreeVector(layer21PosX,layer21PosY, + layer21PosZ),"layer19", + layer21_log,world,false,0); + + // Visualization attributes + + G4VisAttributes* simpleAlSVisAtt= new G4VisAttributes(cyan); + simpleAlSVisAtt->SetVisibility(true); + simpleAlSVisAtt->SetForceSolid(true); + targetB_log->SetVisAttributes(simpleAlSVisAtt); + layer1_log->SetVisAttributes(simpleAlSVisAtt); + layer2_log->SetVisAttributes(simpleAlSVisAtt); + layer3_log->SetVisAttributes(simpleAlSVisAtt); + layer4_log->SetVisAttributes(simpleAlSVisAtt); + layer5_log->SetVisAttributes(simpleAlSVisAtt); + layer6_log->SetVisAttributes(simpleAlSVisAtt); + layer7_log->SetVisAttributes(simpleAlSVisAtt); + layer8_log->SetVisAttributes(simpleAlSVisAtt); + layer9_log->SetVisAttributes(simpleAlSVisAtt); + layer10_log->SetVisAttributes(simpleAlSVisAtt); + layer11_log->SetVisAttributes(simpleAlSVisAtt); + layer12_log->SetVisAttributes(simpleAlSVisAtt); + layer13_log->SetVisAttributes(simpleAlSVisAtt); + layer14_log->SetVisAttributes(simpleAlSVisAtt); + layer15_log->SetVisAttributes(simpleAlSVisAtt); + layer16_log->SetVisAttributes(simpleAlSVisAtt); + layer17_log->SetVisAttributes(simpleAlSVisAtt); + layer18_log->SetVisAttributes(simpleAlSVisAtt); + layer19_log->SetVisAttributes(simpleAlSVisAtt); + layer20_log->SetVisAttributes(simpleAlSVisAtt); + layer21_log->SetVisAttributes(simpleAlSVisAtt); + + G4VisAttributes* simpleLeadSVisAtt= new G4VisAttributes(magenta); + simpleLeadSVisAtt->SetVisibility(true); + simpleLeadSVisAtt->SetForceSolid(true); + targetA_log->SetVisAttributes(simpleLeadSVisAtt); + + + + + + + +} diff --git a/examples/advanced/medical_linac/src/MedLinacVGeometryComponent.cc b/examples/advanced/medical_linac/src/MedLinacVGeometryComponent.cc new file mode 100644 index 0000000000..3537c137fe --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacVGeometryComponent.cc @@ -0,0 +1,35 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MedLinacVGeometryComponent.cc,v 1.1 2004/05/14 18:25:40 mpiergen Exp $ +// +// Code developed by: M. Piergentili +// +// + +#include"MedLinacVGeometryComponent.hh" + +MedLinacVGeometryComponent::MedLinacVGeometryComponent() +{;} +MedLinacVGeometryComponent::~MedLinacVGeometryComponent() +{;} diff --git a/examples/advanced/medical_linac/src/MedLinacVisManager.cc b/examples/advanced/medical_linac/src/MedLinacVisManager.cc new file mode 100644 index 0000000000..a486ffe1de --- /dev/null +++ b/examples/advanced/medical_linac/src/MedLinacVisManager.cc @@ -0,0 +1,100 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MedLinacVisManager.cc,v 1.3 2004/05/14 18:25:40 mpiergen Exp $ +// +// +// Code developed by: M. Piergentili + + +#ifdef G4VIS_USE + +#include "MedLinacVisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +//************************************************************* + +MedLinacVisManager::MedLinacVisManager () {} + +//************************************************************* + +void MedLinacVisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} + +#endif + diff --git a/examples/advanced/medical_linac/vis.mac b/examples/advanced/medical_linac/vis.mac new file mode 100644 index 0000000000..0ed788260d --- /dev/null +++ b/examples/advanced/medical_linac/vis.mac @@ -0,0 +1,33 @@ + +/control/verbose 2 +/control/saveHistory +/run/verbose 2 + + +/vis/scene/create +/vis/open OGLIX +/vis/drawVolume +/vis/viewer/update +/vis/viewer/set/viewpointThetaPhi 70 20 deg +/vis/viewer/zoom 1 + +/vis/viewer/flush +# +# draw scene/ +# +# +# for drawing the tracks +/run/initialize +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate + +/Jaws/X1/DistanceFromAxis -15. cm +/Jaws/X2/DistanceFromAxis 15. cm +/Jaws/Y1/DistanceFromAxis -15. cm +/Jaws/Y2/DistanceFromAxis 15. cm +/Jaws/update + +/energy 6.0 MeV +/sourceType 0.127 MeV +/vis/viewer/update +/run/beamOn 1000 diff --git a/examples/advanced/medical_linac/vrmlvis.mac b/examples/advanced/medical_linac/vrmlvis.mac new file mode 100644 index 0000000000..11312cd5aa --- /dev/null +++ b/examples/advanced/medical_linac/vrmlvis.mac @@ -0,0 +1,33 @@ + +/control/verbose 2 +/control/saveHistory +/run/verbose 2 + + +/vis/scene/create +/vis/open VRML2FILE +/vis/drawVolume +/vis/viewer/update +/vis/viewer/set/viewpointThetaPhi 60 30 deg +/vis/viewer/zoom 1 + +/vis/viewer/flush +# +# draw scene/ +# +# +# for drawing the tracks +/run/initialize +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate + +/Jaws/X1/DistanceFromAxis -15. cm +/Jaws/X2/DistanceFromAxis 15. cm +/Jaws/Y1/DistanceFromAxis -15. cm +/Jaws/Y2/DistanceFromAxis 15. cm +/Jaws/update + +/energy 6.0 MeV +/sourceType 0.127 MeV +/vis/viewer/update +/run/beamOn 1000 diff --git a/examples/advanced/purging_magnet/GNUmakefile b/examples/advanced/purging_magnet/GNUmakefile new file mode 100644 index 0000000000..396eb5e7ee --- /dev/null +++ b/examples/advanced/purging_magnet/GNUmakefile @@ -0,0 +1,26 @@ +# -------------------------------------------------------------- +# $Id: GNUmakefile,v 1.1 2003/12/09 14:12:53 sussi Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := PurgMag + +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all +all: lib bin + +include $(G4INSTALL)/config/binmake.gmk + +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` + LOADLIBS += `aida-config --lib` +endif + diff --git a/examples/advanced/purging_magnet/History b/examples/advanced/purging_magnet/History new file mode 100644 index 0000000000..b01714934a --- /dev/null +++ b/examples/advanced/purging_magnet/History @@ -0,0 +1,29 @@ +------------------------------------------------------------------- +$Id: History,v 1.4 2004/06/10 10:25:16 gcosmo Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - Purging Magnet example + ========================================================= + + Category History file + --------------------- + +10.06.2004 - G. Cosmo purtag-V06-01-02 + Leave out the field-map file, now provided through web in compressed format: + http://cern.ch/geant4/source/source/PurgMag3D.TABLE.gz + Updated README and tagged. + +27.05.2004 . S. Larsson purtag-V06-01-01 + Migration to PI - Setup in README updated + Tagged + +25.05.2004 - J. Apostolakis purtag-V06-01-00 + Tagged + +24.05.2004 - J. Apostolakis + Modified README file + +09.12.2003 - S. Larsson + Example commited + diff --git a/examples/advanced/purging_magnet/MacroTesting.mac b/examples/advanced/purging_magnet/MacroTesting.mac new file mode 100644 index 0000000000..ca581f9da2 --- /dev/null +++ b/examples/advanced/purging_magnet/MacroTesting.mac @@ -0,0 +1,13 @@ +/control/verbose 1 +/run/verbose 0 +/event/verbose 0 +/run/initialize +/run/beamOn 5000 + + + + + + + + diff --git a/examples/advanced/purging_magnet/PurgMag.cc b/examples/advanced/purging_magnet/PurgMag.cc new file mode 100644 index 0000000000..3380e51186 --- /dev/null +++ b/examples/advanced/purging_magnet/PurgMag.cc @@ -0,0 +1,137 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ********************* +// * * +// * PurgMag.cc * +// * * +// ********************* +// +// $Id: PurgMag.cc,v 1.2 2004/06/18 09:17:42 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Comments: Main program for the Purgin Magnet example. +// + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "Randomize.hh" + +#ifdef G4VIS_USE +#include "PurgMagVisManager.hh" +#endif + +#include "PurgMagDetectorConstruction.hh" +#include "PurgMagPhysicsList.hh" +#include "PurgMagPrimaryGeneratorAction.hh" +#include "PurgMagRunAction.hh" +#include "PurgMagEventAction.hh" +#include "PurgMagTrackingAction.hh" +#include "PurgMagSteppingAction.hh" +#include "PurgMagSteppingVerbose.hh" + +int main(int argc,char** argv) { + + //choose the Random engine + HepRandom::setTheEngine(new RanecuEngine); + + //PurgMag Verbose output class + G4VSteppingVerbose::SetInstance(new PurgMagSteppingVerbose); + + // Construct the default run manager + G4RunManager * runManager = new G4RunManager; + + // set mandatory initialization classes + PurgMagDetectorConstruction* detector = new PurgMagDetectorConstruction; + runManager->SetUserInitialization(detector); + runManager->SetUserInitialization(new PurgMagPhysicsList); + + runManager->SetUserAction(new PurgMagPrimaryGeneratorAction(detector)); + +#ifdef G4VIS_USE + // visualization manager + G4VisManager* visManager = new PurgMagVisManager; + visManager->Initialize(); +#endif + +// output environment variables: +#ifdef G4ANALYSIS_USE + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " Using AIDA 3.0 analysis " << G4endl; +# else + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " G4ANALYSIS_USE environment variable not set, NO ANALYSIS " + << G4endl; +#endif + + // set user action classes + PurgMagRunAction* RunAct = new PurgMagRunAction(detector); + runManager->SetUserAction(RunAct); + runManager->SetUserAction(new PurgMagEventAction(RunAct)); + runManager->SetUserAction(new PurgMagTrackingAction(RunAct)); + runManager->SetUserAction(new PurgMagSteppingAction(RunAct,detector)); + + //Initialize G4 kernel + runManager->Initialize(); + + // get the pointer to the User Interface manager + G4UImanager* UI = G4UImanager::GetUIpointer(); + + + if (argc==1) // Define UI session for interactive mode. + { + // G4UIterminal is a (dumb) terminal. + G4UIsession * session = new G4UIterminal; + UI->ApplyCommand("/control/execute vis.mac"); + session->SessionStart(); + delete session; + } + else // Batch mode + { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI->ApplyCommand(command+fileName); + } + + + // For bg jobs with 100000 events. + /* + int numberOfEvent = 100000; + runManager->BeamOn(numberOfEvent); + */ + + + // job termination +#ifdef G4VIS_USE + delete visManager; +#endif + delete runManager; + + return 0; +} + diff --git a/examples/advanced/purging_magnet/PurgMag.pdf b/examples/advanced/purging_magnet/PurgMag.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed57bac8b9756b2624c6e46353998e83c9d5589e GIT binary patch literal 179475 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 giK!i1q0jwN^zu?{(&3KMn>l`!k^J0||= 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" prompt: + +idle> run/beamOn NumberOfEvents +idle> exit + +- Simulation histogram output is stored in purgmag.hbk + +1)Ntuple with position, energy and momentum for electrons +2)Ntuple with position, energy and momentum for photons + (not needed in this example, will be used in further development) +3)Ntuple with position, energy and momentum for positrons + (not needed in this example, will be used in further development) + +A default vizualisation macro (vis.mac) is pre-loaded before interactive runs. +Executing it + osmachine.3% $G4WORKDIR/bin/Linux-g++/PurgMag +runs vis.mac before giving you an interactive prompt. + + +3. Detector description +----------------------- + +Simply a measurement volume. All particles entering the volume are scored. + + +4. Physics processes +-------------------- + +This example uses the standard Electromagnetic processes. + + +5. Particle Generator +---------------------- + +The PurgMagPrimaryGeneratorAction sets the initial state of tracks to + +-electrons 50MeV +-Start position (0, 0, 15cm) +-Momentum direction (0, 0, -1) + + +6. Geometry and materials +-------------------------- + +The world consists of Vacuum to minimize interactions of the electrons +with the medium. The purging magnet is implemented as a 3D field grid +of field values and geometerically as a pole gap made of iron. The +measurement volume also contains vacuum. + +The field is interpolated using a simple linear interpolation in two +dimensions (z and rho). + +7. Comparison +-------------- + +The design of the magnetic field was made with the OPERA 3D package +which is an electromagnetic finite element and finite difference +analysis software. The deviation in the y-direction (ey in Ntuple 1) +has also been calculated in the OPERA 3D module TOSCA for comparison. + +TOSCA: deviation y-direction: 35.112 cm +GEANT4: deviation y-direction: 35.170 cm (updated after PurgMag.pdf) + +**************************************************************** +* * +* More information about the setup and geometry in PurgMag.pdf * +* * +**************************************************************** diff --git a/examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh b/examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh new file mode 100644 index 0000000000..75b360886c --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagAnalysisManager.hh @@ -0,0 +1,100 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ************************************ +// * * +// * PurgMagAnalysisManager.hh * +// * * +// ************************************ +// +// $Id: PurgMagAnalysisManager.hh,v 1.2 2004/06/18 09:17:43 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifdef G4ANALYSIS_USE +#ifndef G4PROCESSTESTANALYSIS_HH +#define G4PROCESSTESTANALYSIS_HH + +#include "globals.hh" +#include +#include "G4ThreeVector.hh" +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" +#include "AIDA/IAnalysisFactory.h" + +namespace AIDA +{ + class ITree; + class IHistogramFactory; + class IAnalysisFactory; + class ITupleFactory; + class ITuple; + class ITreeFactory; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +class PurgMagAnalysisManager + +{ +public: + + ~PurgMagAnalysisManager(); + + void book(); + + void finish(); + + static PurgMagAnalysisManager* getInstance(); + + void fill_Tuple_Electrons(G4double,G4double,G4double,G4double,G4double,G4double,G4double); + void fill_Tuple_Gamma(G4double,G4double,G4double,G4double,G4double,G4double,G4double); + void fill_Tuple_Positrons(G4double,G4double,G4double,G4double,G4double,G4double,G4double); + +private: + + G4double ex,ey,ez,ee,epx,epy,epz,gx,gy,gz,ge,gpx,gpy,gpz,px,py,pz,pe,ppx,ppy,ppz; + + static PurgMagAnalysisManager* instance; + +private: + PurgMagAnalysisManager(); + +private: + + AIDA::IAnalysisFactory* aFact; + AIDA::ITree* theTree; + AIDA::IHistogramFactory *histFact; + AIDA::ITupleFactory *tupFact; + AIDA::ITreeFactory *treeFact; + AIDA::ITuple *ntuple1; + AIDA::ITuple *ntuple2; + AIDA::ITuple *ntuple3; +}; + +#endif +#endif + + + diff --git a/examples/advanced/purging_magnet/include/PurgMagDetectorConstruction.hh b/examples/advanced/purging_magnet/include/PurgMagDetectorConstruction.hh new file mode 100644 index 0000000000..8b4dca575b --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagDetectorConstruction.hh @@ -0,0 +1,149 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ***************************************** +// * * +// * PurgMagDetectorConstruction.hh * +// * * +// ***************************************** +// +// $Id: PurgMagDetectorConstruction.hh,v 1.2 2004/06/18 09:17:44 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagDetectorConstruction_h +#define PurgMagDetectorConstruction_h 1 + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" + + +class G4Box; +class G4Trd; +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Material; +class G4UniformMagField; +class PurgMagTabulatedField3D; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagDetectorConstruction : public G4VUserDetectorConstruction +{ +public: + PurgMagDetectorConstruction(); + ~PurgMagDetectorConstruction(); + +public: + + G4VPhysicalVolume* Construct(); + +public: + + void PrintDetectorParameters(); + + G4double GetWorldSizeXY() {return WorldSizeXY;}; + G4double GetWorldSizeZ() {return WorldSizeZ;}; + + G4double GetMeasureVolumeSizeXY() {return MeasureVolumeSizeXY;}; + G4double GetMeasureVolumeSizeZ() {return MeasureVolumeSizeZ;}; + + G4double GetGapSizeX1() {return GapSizeX1;}; + G4double GetGapSizeX2() {return GapSizeX2;}; + G4double GetGapSizeY1() {return GapSizeY1;}; + G4double GetGapSizeY2() {return GapSizeY2;}; + G4double GetGapSizeZ() {return GapSizeZ;}; + + G4Material* GetWorldMaterial() {return WorldMaterial;}; + G4Material* GetGapMaterial() {return GapMaterial;}; + + const G4VPhysicalVolume* GetWorld() {return physiWorld;}; + const G4VPhysicalVolume* GetMeasureVolume() {return physiMeasureVolume;}; + const G4VPhysicalVolume* GetGap1() {return physiGap1;}; + const G4VPhysicalVolume* GetGap2() {return physiGap2;}; + +private: + + + + G4double WorldSizeXY; + G4double WorldSizeZ; + + G4double MeasureVolumeSizeXY; + G4double MeasureVolumeSizeZ; + G4double MeasureVolumePosition; + + G4double GapSizeX1; + G4double GapSizeX2; + G4double GapSizeY1; + G4double GapSizeY2; + G4double GapSizeZ; + G4double Gap1PosX; + G4double Gap1PosY; + G4double Gap1PosZ; + G4double Gap2PosX; + G4double Gap2PosY; + G4double Gap2PosZ; + + G4double SSD; + G4double zOffset; + + G4VPhysicalVolume* physiWorld; + G4LogicalVolume* logicWorld; + G4Box* solidWorld; + + + G4VPhysicalVolume* physiGap1; + G4LogicalVolume* logicGap1; + G4Trd* solidGap1; + + + G4VPhysicalVolume* physiGap2; + G4LogicalVolume* logicGap2; + G4Trd* solidGap2; + + G4VPhysicalVolume* physiMeasureVolume; + G4LogicalVolume* logicMeasureVolume; + G4Box* solidMeasureVolume; + + G4Material* WorldMaterial; + G4Material* GapMaterial; + + + +private: + + void DefineMaterials(); + G4VPhysicalVolume* ConstructCalorimeter(); +}; + + +#endif + + diff --git a/examples/advanced/purging_magnet/include/PurgMagEventAction.hh b/examples/advanced/purging_magnet/include/PurgMagEventAction.hh new file mode 100644 index 0000000000..17fbac9572 --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagEventAction.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************** +// * * +// * PurgMagEventAction.hh * +// * * +// ******************************** +// +// $Id: PurgMagEventAction.hh,v 1.2 2004/06/18 09:17:45 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagEventAction_h +#define PurgMagEventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" + +class PurgMagRunAction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagEventAction : public G4UserEventAction +{ + public: + + PurgMagEventAction(PurgMagRunAction*); + ~PurgMagEventAction(); + + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + + void SetDrawFlag (G4String val) {drawFlag = val;}; + void SetPrintModulo(G4int val) {printModulo = val;}; + + private: + + PurgMagRunAction* PurgMagRun; + G4String drawFlag; + G4int printModulo; +}; + +#endif + + diff --git a/examples/advanced/purging_magnet/include/PurgMagPhysicsList.hh b/examples/advanced/purging_magnet/include/PurgMagPhysicsList.hh new file mode 100644 index 0000000000..5f36110aa3 --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagPhysicsList.hh @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************** +// * * +// * PurgMagPhysicsList.hh * +// * * +// ******************************** +// +// +// $Id: PurgMagPhysicsList.hh,v 1.2 2004/06/18 09:17:46 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagPhysicsList_h +#define PurgMagPhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class G4GammaConversion; +class G4ComptonScattering; +class G4PhotoElectricEffect; + +class G4eIonisation; +class G4eBremsstrahlung; + + +class PurgMagPhysicsList: public G4VUserPhysicsList +{ +public: + PurgMagPhysicsList(); + ~PurgMagPhysicsList(); + +protected: + // Construct particle and physics + void ConstructParticle(); + void ConstructProcess(); + + void SetCuts(); + +public: + // Set Cuts + void SetGammaCut(G4double); + void SetElectronCut(G4double); + void SetPositronCut(G4double); + void SetProtonCut(G4double); + + void SetGammaLowLimit(G4double); + void SetElectronLowLimit(G4double); + void SetPositronLowLimit(G4double); + void SetProtonLowLimit(G4double); + void SetGEPLowLimit(G4double); + + void SetGELowLimit(G4double); + +private: + + G4double cutForGamma; + G4double cutForElectron; + G4double cutForPositron; + G4double cutForProton; + +protected: + // these methods Construct particles + void ConstructBosons(); + void ConstructLeptons(); + void ConstructBarions(); + +protected: + // these methods Construct physics processes and register them + void ConstructGeneral(); + void ConstructEM(); + +private: + +}; +#endif + + + diff --git a/examples/advanced/purging_magnet/include/PurgMagPrimaryGeneratorAction.hh b/examples/advanced/purging_magnet/include/PurgMagPrimaryGeneratorAction.hh new file mode 100644 index 0000000000..1cef976dbe --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagPrimaryGeneratorAction.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// Code developed by: +// S.Larsson +// +// ******************************************** +// * * +// * PurgMagPrimaryGeneratorAction.hh * +// * * +// ******************************************** +// +// $Id: PurgMagPrimaryGeneratorAction.hh,v 1.2 2004/06/18 09:17:47 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagPrimaryGeneratorAction_h +#define PurgMagPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class G4ParticleGun; +class G4Event; +class PurgMagDetectorConstruction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ +public: + PurgMagPrimaryGeneratorAction(PurgMagDetectorConstruction*); + ~PurgMagPrimaryGeneratorAction(); + +public: + void GeneratePrimaries(G4Event*); + void SetRndmVertex(G4bool val) { rndmVertex = val;} + +private: + G4ParticleGun* particleGun; + PurgMagDetectorConstruction* PurgMagDetector; + + G4bool rndmVertex; +}; + +#endif + + diff --git a/examples/advanced/purging_magnet/include/PurgMagRunAction.hh b/examples/advanced/purging_magnet/include/PurgMagRunAction.hh new file mode 100644 index 0000000000..5fb3d449c8 --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagRunAction.hh @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ****************************** +// * * +// * PurgMagRunAction.hh * +// * * +// ****************************** +// +// $Id: PurgMagRunAction.hh,v 1.2 2004/06/18 09:17:49 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifndef PurgMagRunAction_h +#define PurgMagRunAction_h 1 + +#include "PurgMagDetectorConstruction.hh" + +#include "G4UserRunAction.hh" +#include "globals.hh" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class G4Run; + +class PurgMagRunAction : public G4UserRunAction +{ +public: + + PurgMagRunAction(PurgMagDetectorConstruction*); + ~PurgMagRunAction(); + + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + + void SetRndmFreq(G4int val) {saveRndm = val;} + G4int GetRndmFreq() {return saveRndm;} + + +private: + + PurgMagDetectorConstruction* Detector; + G4int saveRndm; + +}; + +#endif + + + + + + + + + + + + + diff --git a/examples/advanced/purging_magnet/include/PurgMagSteppingAction.hh b/examples/advanced/purging_magnet/include/PurgMagSteppingAction.hh new file mode 100644 index 0000000000..0ca97cd37d --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagSteppingAction.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// *********************************** +// * * +// * PurgMagSteppingAction.hh * +// * * +// *********************************** +// +// $Id: PurgMagSteppingAction.hh,v 1.2 2004/06/18 09:17:50 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagSteppingAction_h +#define PurgMagSteppingAction_h 1 + +#include "G4UserSteppingAction.hh" +#include "G4VPVParameterisation.hh" +#include "G4PVParameterised.hh" +#include "G4Tubs.hh" + + +class PurgMagRunAction; +class PurgMagDetectorConstruction; +class PurgMagAnalysisManager; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagSteppingAction : public G4UserSteppingAction +{ +public: + PurgMagSteppingAction(PurgMagRunAction*,PurgMagDetectorConstruction*); + ~PurgMagSteppingAction(); + + void UserSteppingAction(const G4Step*); + +private: + PurgMagRunAction* PurgMagRun; + PurgMagDetectorConstruction* Detector; + +}; + +#endif + + + + diff --git a/examples/advanced/purging_magnet/include/PurgMagSteppingVerbose.hh b/examples/advanced/purging_magnet/include/PurgMagSteppingVerbose.hh new file mode 100644 index 0000000000..f27c33d7d0 --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagSteppingVerbose.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************************************************** +// Code developed by: +// S.Larsson +// +// ************************************ +// * * +// * PurgMagSteppingVerbose.hh * +// * * +// ************************************ +// +// $Id: PurgMagSteppingVerbose.hh,v 1.2 2004/06/18 09:17:51 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +class PurgMagSteppingVerbose; + +#ifndef PurgMagSteppingVerbose_h +#define PurgMagSteppingVerbose_h 1 + +#include "G4SteppingVerbose.hh" + +class PurgMagSteppingVerbose : public G4SteppingVerbose { + +public: + + //Constructor/Destructor + PurgMagSteppingVerbose(); + ~PurgMagSteppingVerbose(); + + void StepInfo(); + void TrackingStarted(); + +}; + +#endif diff --git a/examples/advanced/purging_magnet/include/PurgMagTabulatedField3D.hh b/examples/advanced/purging_magnet/include/PurgMagTabulatedField3D.hh new file mode 100644 index 0000000000..4f8dce211b --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagTabulatedField3D.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson and J. Generowicz. +// +// ************************************* +// * * +// * PurgMagTabulatedField3D.hh * +// * * +// ************************************* +// +// $Id: PurgMagTabulatedField3D.hh,v 1.2 2004/06/18 09:17:52 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "globals.hh" +#include "G4MagneticField.hh" +#include "G4ios.hh" + +#include +#include +#include + +using namespace std; + +class PurgMagTabulatedField3D +#ifndef STANDALONE + : public G4MagneticField +#endif +{ + + // Storage space for the table + vector< vector< vector< double > > > xField; + vector< vector< vector< double > > > yField; + vector< vector< vector< double > > > zField; + // The dimensions of the table + int nx,ny,nz; + // The physical limits of the defined region + double minx, maxx, miny, maxy, minz, maxz; + // The physical extent of the defined region + double dx, dy, dz; + double fZoffset; + bool invertX, invertY, invertZ; + +public: + PurgMagTabulatedField3D(const char* filename, double zOffset ); + void GetFieldValue( const double Point[4], + double *Bfield ) const; +}; + diff --git a/examples/advanced/purging_magnet/include/PurgMagTrackingAction.hh b/examples/advanced/purging_magnet/include/PurgMagTrackingAction.hh new file mode 100644 index 0000000000..87ee2d8eb4 --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagTrackingAction.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ********************************** +// * * +// * PurgMagTrackingAction.hh * +// * * +// ********************************** +// +// $Id: PurgMagTrackingAction.hh,v 1.2 2004/06/18 09:17:53 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifndef PurgMagTrackingAction_h +#define PurgMagTrackingAction_h 1 + +#include "G4UserTrackingAction.hh" + +class PurgMagRunAction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagTrackingAction : public G4UserTrackingAction +{ + + public: + PurgMagTrackingAction(PurgMagRunAction*); + ~PurgMagTrackingAction() {}; + + void PostUserTrackingAction(const G4Track*); + + private: + PurgMagRunAction* PurgMagRun; +}; + +#endif diff --git a/examples/advanced/purging_magnet/include/PurgMagVisManager.hh b/examples/advanced/purging_magnet/include/PurgMagVisManager.hh new file mode 100644 index 0000000000..c47744018d --- /dev/null +++ b/examples/advanced/purging_magnet/include/PurgMagVisManager.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************* +// * * +// * PurgMagVisManager.hh * +// * * +// ******************************* +// +// $Id: PurgMagVisManager.hh,v 1.2 2004/06/18 09:17:54 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +// Example Visualization Manager implementing virtual function +// RegisterGraphicsSystems. Exploits C-pre-processor variables +// G4VIS_USE_DAWN, etc., which are set by the GNUmakefiles if +// environment variables of the same name are set. + +// So all you have to do is set environment variables and compile and +// instantiate this in your main(). + +// Alternatively, you can implement an empty function here and just +// register the systems you want in your main(), e.g.: +// G4VisManager* myVisManager = new MyVisManager; +// myVisManager -> RegisterGraphicsSystem (new MyGraphicsSystem); + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#ifndef PurgMagVisManager_h +#define PurgMagVisManager_h 1 + +#include "G4VisManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +class PurgMagVisManager: public G4VisManager { + +public: + + PurgMagVisManager (); + +private: + + void RegisterGraphicsSystems (); + +}; + +#endif diff --git a/examples/advanced/purging_magnet/src/PurgMagAnalysisManager.cc b/examples/advanced/purging_magnet/src/PurgMagAnalysisManager.cc new file mode 100644 index 0000000000..9481aa4c33 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagAnalysisManager.cc @@ -0,0 +1,242 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ************************************ +// * * +// * PurgMagAnalysisManager.cc * +// * * +// ************************************ +// +// $Id: PurgMagAnalysisManager.cc,v 1.2 2004/06/18 09:17:55 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#ifdef G4ANALYSIS_USE +#include +#include +#include "PurgMagAnalysisManager.hh" + +#include "G4ios.hh" + +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" + +#include "AIDA/IManagedObject.h" +#include "AIDA/IAnalysisFactory.h" +#include "AIDA/IHistogramFactory.h" +#include "AIDA/ITupleFactory.h" +#include "AIDA/ITreeFactory.h" +#include "AIDA/ITree.h" +#include "AIDA/ITuple.h" + +PurgMagAnalysisManager* PurgMagAnalysisManager::instance = 0; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagAnalysisManager::PurgMagAnalysisManager() : + aFact(0), theTree(0), tupFact(0) + + +{ + // Build the factories + aFact = AIDA_createAnalysisFactory(); + + AIDA::ITreeFactory *treeFact = aFact->createTreeFactory(); + + + // Parameters for the TreeFactory + + std::string fileName="purgmag.hbk"; + theTree = treeFact->create(fileName,"hbook",false, true); + + delete treeFact; + + tupFact = aFact->createTupleFactory ( *theTree ); +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagAnalysisManager::~PurgMagAnalysisManager() +{ + delete tupFact; + tupFact=0; + + delete histFact; + histFact=0; + + delete theTree; + histFact=0; + + delete aFact; + aFact = 0; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagAnalysisManager* PurgMagAnalysisManager::getInstance() +{ + if (instance == 0) instance = new PurgMagAnalysisManager; + return instance; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagAnalysisManager::book() +{ + + // N-tuple + std::string options = ""; + + // Electrons + std::string columnNames1 = "double ex; double ey; double ez; double ee; double epx; double epy; double epz"; + if (tupFact) ntuple1 = tupFact->create("1","1",columnNames1, options); + // check for non-zero ... + if (ntuple1) G4cout<<"N-tuple 1 is non-zero"<create("2","2",columnNames2, options); + // check for non-zero ... + if (ntuple2) G4cout<<"N-tuple 2 is non-zero"<create("3","3",columnNames3, options); + // check for non-zero ... + if (ntuple3) G4cout<<"N-tuple 3 is non-zero"<findColumn( "ex" ); + int iey = ntuple1->findColumn( "ey" ); + int iez = ntuple1->findColumn( "ez" ); + int iee = ntuple1->findColumn( "ee" ); + int iepx = ntuple1->findColumn( "epx" ); + int iepy = ntuple1->findColumn( "epy" ); + int iepz = ntuple1->findColumn( "epz" ); + ntuple1->fill(iex, ex); // fill ( int column, double value ) + ntuple1->fill(iey, ey); + ntuple1->fill(iez, ez); + ntuple1->fill(iee, ee); + ntuple1->fill(iepx, epx); + ntuple1->fill(iepy, epy); + ntuple1->fill(iepz, epz); + + ntuple1->addRow(); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +// This function fills a N-tuple with position, energy and momentum of +// photons entering the measurement volume. +void PurgMagAnalysisManager::fill_Tuple_Gamma(G4double gx, G4double gy, G4double gz, // Position + G4double ge, // Energy + G4double gpx, G4double gpy, G4double gpz) // Momentum +{ + + if (ntuple2 == 0) { + G4cout << "N-tuple 2 is zero" << "\n"; + return; + } + + int igx = ntuple2->findColumn( "gx" ); + int igy = ntuple2->findColumn( "gy" ); + int igz = ntuple2->findColumn( "gz" ); + int ige = ntuple2->findColumn( "ge" ); + int igpx = ntuple2->findColumn( "gpx" ); + int igpy = ntuple2->findColumn( "gpy" ); + int igpz = ntuple2->findColumn( "gpz" ); + ntuple2->fill(igx, gx); // fill ( int column, double value ) + ntuple2->fill(igy, gy); + ntuple2->fill(igz, gz); + ntuple2->fill(ige, ge); + ntuple2->fill(igpx, gpx); + ntuple2->fill(igpy, gpy); + ntuple2->fill(igpz, gpz); + + ntuple2->addRow(); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +// This function fills a N-tuple with position, energy and momentum of +// positrons entering the measurement volume. +void PurgMagAnalysisManager::fill_Tuple_Positrons(G4double px, G4double py, G4double pz, // Position + G4double pe, // Energy + G4double ppx, G4double ppy, G4double ppz) // Momentum +{ + + if (ntuple3 == 0) { + G4cout << "N-tuple 3 is zero" << "\n"; + return; + } + + int ipx = ntuple3->findColumn( "px" ); + int ipy = ntuple3->findColumn( "py" ); + int ipz = ntuple3->findColumn( "pz" ); + int ipe = ntuple3->findColumn( "pe" ); + int ippx = ntuple3->findColumn( "ppx" ); + int ippy = ntuple3->findColumn( "ppy" ); + int ippz = ntuple3->findColumn( "ppz" ); + ntuple3->fill(ipx, px); // fill ( int column, double value ) + ntuple3->fill(ipy, py); + ntuple3->fill(ipz, pz); + ntuple3->fill(ipe, pe); + ntuple3->fill(ippx, ppx); + ntuple3->fill(ippy, ppy); + ntuple3->fill(ippz, ppz); + + ntuple3->addRow(); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void PurgMagAnalysisManager::finish() +{ + // Writes all histograms to file + theTree->commit(); + + // Close (will again commit) + theTree->close(); +} +#endif + diff --git a/examples/advanced/purging_magnet/src/PurgMagDetectorConstruction.cc b/examples/advanced/purging_magnet/src/PurgMagDetectorConstruction.cc new file mode 100644 index 0000000000..472c6407f0 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagDetectorConstruction.cc @@ -0,0 +1,440 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ***************************************** +// * * +// * PurgMagDetectorConstruction.cc * +// * * +// ***************************************** +// +// $Id: PurgMagDetectorConstruction.cc,v 1.2 2004/06/18 09:17:56 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "PurgMagDetectorConstruction.hh" +#include "PurgMagTabulatedField3D.hh" +#include "G4ThreeVector.hh" +#include "globals.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Trd.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4PVReplica.hh" +#include "G4PVParameterised.hh" +#include "G4Mag_UsualEqRhs.hh" +#include "G4FieldManager.hh" +#include "G4TransportationManager.hh" +#include "G4EqMagElectricField.hh" + +#include "G4ChordFinder.hh" +#include "G4UniformMagField.hh" +#include "G4ExplicitEuler.hh" +#include "G4ImplicitEuler.hh" +#include "G4SimpleRunge.hh" +#include "G4SimpleHeum.hh" +#include "G4ClassicalRK4.hh" +#include "G4HelixExplicitEuler.hh" +#include "G4HelixImplicitEuler.hh" +#include "G4HelixSimpleRunge.hh" +#include "G4CashKarpRKF45.hh" +#include "G4RKG3_Stepper.hh" + +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +// Possibility to turn off (0) magnetic field and measurement volume. +#define GAP 1 // Magnet geometric volume +#define MAG 1 // Magnetic field grid +#define MEASUREVOL 1 // Volume for measurement + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagDetectorConstruction::PurgMagDetectorConstruction() + + :physiWorld(NULL), logicWorld(NULL), solidWorld(NULL), + physiGap1(NULL), logicGap1(NULL), solidGap1(NULL), + physiGap2(NULL), logicGap2(NULL), solidGap2(NULL), + physiMeasureVolume(NULL), logicMeasureVolume(NULL), solidMeasureVolume(NULL), + WorldMaterial(NULL), + GapMaterial(NULL) + +{ + WorldSizeXY=WorldSizeZ=0; + GapSizeX1=GapSizeX2=GapSizeY1=GapSizeY2=GapSizeZ=0; + MeasureVolumeSizeXY=MeasureVolumeSizeZ=0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagDetectorConstruction::~PurgMagDetectorConstruction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4VPhysicalVolume* PurgMagDetectorConstruction::Construct() + +{ + DefineMaterials(); + return ConstructCalorimeter(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagDetectorConstruction::DefineMaterials() +{ + //This function illustrates the possible ways to define materials. + //Density and mass per mole taken from Physics Handbook for Science + //and engineering, sixth edition. This is a general material list + //with extra materials for other examples. + + G4String name, symbol; + G4double density; + + G4int ncomponents, natoms; + G4double fractionmass; + G4double temperature, pressure; + + // Define Elements + // Example: G4Element* Notation = new G4Element ("Element", "Notation", z, a); + G4Element* H = new G4Element ("Hydrogen", "H", 1. , 1.01*g/mole); + G4Element* N = new G4Element ("Nitrogen", "N", 7., 14.01*g/mole); + G4Element* O = new G4Element ("Oxygen" , "O", 8. , 16.00*g/mole); + G4Element* Ar = new G4Element ("Argon" , "Ar", 18., 39.948*g/mole ); + + + // Define Material + // Example: G4Material* Notation = new G4Material("Material", z, a, density); + /* Not used in this setup, will be used in further development. + G4Material* He = new G4Material("Helium", 2., 4.00*g/mole, 0.178*mg/cm3); + G4Material* Be = new G4Material("Beryllium", 4., 9.01*g/mole, 1.848*g/cm3); + G4Material* W = new G4Material("Tungsten", 74., 183.85*g/mole, 19.30*g/cm3); + G4Material* Cu = new G4Material("Copper", 29., 63.55*g/mole, 8.96*g/cm3); + */ + G4Material* Fe = new G4Material("Iron", 26., 55.84*g/mole, 7.87*g/cm3); + + // Define materials from elements. + + // Case 1: chemical molecule + // Water + density = 1.000*g/cm3; + G4Material* H2O = new G4Material(name="H2O" , density, ncomponents=2); + H2O->AddElement(H, natoms=2); + H2O->AddElement(O, natoms=1); + + // Case 2: mixture by fractional mass. + // Air + density = 1.290*mg/cm3; + G4Material* Air = new G4Material(name="Air" , density, ncomponents=2); + Air->AddElement(N, fractionmass=0.7); + Air->AddElement(O, fractionmass=0.3); + + // Vacuum + density = 1.e-5*g/cm3; + pressure = 2.e-2*bar; + temperature = STP_Temperature; //from PhysicalConstants.h + G4Material* vacuum = new G4Material(name="vacuum", density, ncomponents=1, + kStateGas,temperature,pressure); + vacuum->AddMaterial(Air, fractionmass=1.); + + + // Laboratory vacuum: Dry air (average composition) + density = 1.7836*mg/cm3 ; // STP + G4Material* Argon = new G4Material(name="Argon", density, ncomponents=1); + Argon->AddElement(Ar, 1); + + density = 1.25053*mg/cm3 ; // STP + G4Material* Nitrogen = new G4Material(name="N2", density, ncomponents=1); + Nitrogen->AddElement(N, 2); + + density = 1.4289*mg/cm3 ; // STP + G4Material* Oxygen = new G4Material(name="O2", density, ncomponents=1); + Oxygen->AddElement(O, 2); + + + density = 1.2928*mg/cm3 ; // STP + density *= 1.0e-8 ; // pumped vacuum + + temperature = STP_Temperature; + pressure = 1.0e-8*STP_Pressure; + + G4Material* LaboratoryVacuum = new G4Material(name="LaboratoryVacuum", + density,ncomponents=3, + kStateGas,temperature,pressure); + LaboratoryVacuum->AddMaterial( Nitrogen, fractionmass = 0.7557 ) ; + LaboratoryVacuum->AddMaterial( Oxygen, fractionmass = 0.2315 ) ; + LaboratoryVacuum->AddMaterial( Argon, fractionmass = 0.0128 ) ; + + + G4cout << G4endl << *(G4Material::GetMaterialTable()) << G4endl; + + + // Default materials in setup. + WorldMaterial = LaboratoryVacuum; + GapMaterial = Fe; + + + G4cout << "end material"<< endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4VPhysicalVolume* PurgMagDetectorConstruction::ConstructCalorimeter() +{ + // Complete the parameters definition + + //The World + WorldSizeXY = 300.*cm; // Cube + WorldSizeZ = 300.*cm; + + //Measurement volume + MeasureVolumeSizeXY = 280.*cm; // Cubic slice + MeasureVolumeSizeZ = 1.*cm; + + // Position of measurement volume. + // SSD is Source to Surface Distance. Source in origo and measurements 50 cm + // below in the z-direction (symbolizin a patient at SSD = 50 cm) + + SSD = 50.*cm; + MeasureVolumePosition = -(SSD + MeasureVolumeSizeZ/2); + + + // Geometric definition of the gap of the purging magnet. Approximation of + // the shape of the pole gap. + + GapSizeY1 = 10.*cm; // length along x at the surface positioned at -dz + GapSizeY2 = 10.*cm; // length along x at the surface positioned at +dz + GapSizeX1 = 10.*cm; // length along y at the surface positioned at -dz + GapSizeX2 = 18.37*cm; // length along y at the surface positioned at +dz + GapSizeZ = 11.5*cm; // length along z axis + + Gap1PosY = 0.*cm; + Gap1PosX = -9.55*cm; + Gap1PosZ = -6.89*cm; + + Gap2PosY = 0.*cm; + Gap2PosX = 9.55*cm; + Gap2PosZ = -6.89*cm; + + + // Coordinate correction for field grif. + // Gap opening at z = -11.4 mm. + // In field grid coordonates gap at z = -0.007m in field from z = 0.0m to + // z = 0.087m. + // -> zOffset = -11.4-(-7) = 4.4 mm + + zOffset = 4.4*mm; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +// +// Magnetic Field - Purging magnet +// +#if MAG + + static G4bool fieldIsInitialized = false; + if(!fieldIsInitialized) + { + G4FieldManager *pFieldMgr; + // G4MagIntegratorStepper *pStepper; + + //Field grid in A9.TABLE. File must be in accessible from run urn directory. + G4MagneticField* PurgMagField= new PurgMagTabulatedField3D("PurgMag3D.TABLE", zOffset); + + pFieldMgr=G4TransportationManager::GetTransportationManager()->GetFieldManager(); + + G4cout<< "DeltaStep "<GetDeltaOneStep()/mm <<"mm" <SetChordFinder( pChordFinder ); + + pFieldMgr->SetDetectorField(PurgMagField); + + fieldIsInitialized = true; + } +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +// Some out prints of the setup. + + G4cout << "\n-----------------------------------------------------------" + << "\n Geometry and materials" + << "\n-----------------------------------------------------------" + << "\n ---> World:" + << "\n ---> " << WorldMaterial->GetName() << " in World" + << "\n ---> " << "WorldSizeXY: " << G4BestUnit(WorldSizeXY,"Length") + << "\n ---> " << "WorldSizeZ: " << G4BestUnit(WorldSizeZ,"Length"); + +#if GAP + G4cout << "\n-----------------------------------------------------------" + << "\n ---> Purging Magnet:" + << "\n ---> " << "Gap made of "<< GapMaterial->GetName() + << "\n ---> " << "GapSizeY1: " << G4BestUnit(GapSizeY1,"Length") + << "\n ---> " << "GapSizeY2: " << G4BestUnit(GapSizeY2,"Length") + << "\n ---> " << "GapSizeX1: " << G4BestUnit(GapSizeX1,"Length") + << "\n ---> " << "GapSizeX2: " << G4BestUnit(GapSizeX2,"Length"); +#endif + +#if MEASUREVOL + G4cout << "\n-----------------------------------------------------------" + << "\n ---> Measurement Volume:" + << "\n ---> " << WorldMaterial->GetName() << " in Measurement volume" + << "\n ---> " << "MeasureVolumeXY: " << G4BestUnit(MeasureVolumeSizeXY,"Length") + << "\n ---> " << "MeasureVolumeZ: " << G4BestUnit(MeasureVolumeSizeZ,"Length") + << "\n ---> " << "At SSD = " << G4BestUnit(MeasureVolumePosition,"Length"); +#endif + + G4cout << "\n-----------------------------------------------------------\n"; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + // + // World + // + + + solidWorld = new G4Box("World", //its name + WorldSizeXY/2,WorldSizeXY/2,WorldSizeZ/2); //its size + + + logicWorld = new G4LogicalVolume(solidWorld, //its solid + WorldMaterial, //its material + "World"); //its name + + physiWorld = new G4PVPlacement(0, //no rotation + G4ThreeVector(), //at (0,0,0) + "World", //its name + logicWorld, //its logical volume + NULL, //its mother volume + false, //no boolean operation + 0); //copy number + + // Visualization attributes + G4VisAttributes* simpleWorldVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White + simpleWorldVisAtt->SetVisibility(true); + logicWorld->SetVisAttributes(simpleWorldVisAtt); + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + // + // Measurement Volume + // + +#if MEASUREVOL + + solidMeasureVolume = new G4Box("MeasureVolume", //its name + MeasureVolumeSizeXY/2,MeasureVolumeSizeXY/2,MeasureVolumeSizeZ/2); //its size + + logicMeasureVolume = new G4LogicalVolume(solidMeasureVolume, //its solid + WorldMaterial, //its material + "MeasureVolume"); //its name + + physiMeasureVolume = new G4PVPlacement(0, //no rotation + G4ThreeVector(0.,0.,MeasureVolumePosition), //at (0,0,0) + "MeasureVolume", //its name + logicMeasureVolume, //its logical volume + physiWorld, //its mother volume + false, //no boolean operation + 0); //copy number + + // Visualization attributes + G4VisAttributes* simpleMeasureVolumeVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White + simpleMeasureVolumeVisAtt->SetVisibility(true); + simpleMeasureVolumeVisAtt->SetForceSolid(true); + logicMeasureVolume->SetVisAttributes(simpleMeasureVolumeVisAtt); + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + // + //Gap cone. Opening 20 deg. Two separate trapezoids. Iron. + // + +#if GAP + + //Gap part 1, placed in negative x-direction. + + solidGap1 = new G4Trd("Gap1", + GapSizeX1/2, // Half-length along x at the surface positioned at -dz + GapSizeX2/2, // Half-length along x at the surface positioned at +dz + GapSizeY1/2, // Half-length along y at the surface positioned at -dz + GapSizeY2/2, // Half-length along y at the surface positioned at +dz + GapSizeZ/2 ); // Half-length along z axis + + logicGap1 = new G4LogicalVolume(solidGap1, //its solid + GapMaterial, //its material + "Gap1"); //its name + + physiGap1 = new G4PVPlacement(0, //90 deg rotation + G4ThreeVector(Gap1PosX,Gap1PosY,Gap1PosZ), //position + "Gap1", //its name + logicGap1, //its logical volume + physiWorld, //its mother volume + false, //no boolean operation + 0); //copy number + + //Gap part 2, placed in positive x-direction. + + solidGap2 = new G4Trd("Gap2", + GapSizeX1/2, // Half-length along x at the surface positioned at -dz + GapSizeX2/2, // Half-length along x at the surface positioned at +dz + GapSizeY1/2, // Half-length along y at the surface positioned at -dz + GapSizeY2/2, // Half-length along y at the surface positioned at +dz + GapSizeZ/2 ); // Half-length along z axis + + logicGap2 = new G4LogicalVolume(solidGap2, //its solid + GapMaterial, //its material + "Gap2"); //its name + + physiGap2 = new G4PVPlacement(0, //no rotation + G4ThreeVector(Gap2PosX,Gap2PosY,Gap2PosZ), //position + "Gap2", //its name + logicGap2, //its logical volume + physiWorld, //its mother volume + false, //no boolean operation + 0); //copy number + + // Visualization attributes + G4VisAttributes* simpleGap1VisAtt= new G4VisAttributes(G4Colour(0.0,0.0,1.0)); //yellow + simpleGap1VisAtt->SetVisibility(true); + simpleGap1VisAtt->SetForceSolid(true); + logicGap1->SetVisAttributes(simpleGap1VisAtt); + + G4VisAttributes* simpleGap2VisAtt= new G4VisAttributes(G4Colour(0.0,0.0,1.0)); //yellow + simpleGap2VisAtt->SetVisibility(true); + simpleGap2VisAtt->SetForceSolid(true); + logicGap2->SetVisAttributes(simpleGap2VisAtt); + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + return physiWorld; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + diff --git a/examples/advanced/purging_magnet/src/PurgMagEventAction.cc b/examples/advanced/purging_magnet/src/PurgMagEventAction.cc new file mode 100644 index 0000000000..e3ecd72233 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagEventAction.cc @@ -0,0 +1,126 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************** +// * * +// * PurgMagEventAction.cc * +// * * +// ******************************** +// +// $Id: PurgMagEventAction.cc,v 1.2 2004/06/18 09:17:57 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "PurgMagEventAction.hh" + +#include "PurgMagRunAction.hh" + +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "Randomize.hh" + +#ifdef G4ANALYSIS_USE +#include"PurgMagAnalysisManager.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagEventAction::PurgMagEventAction(PurgMagRunAction* run) + :PurgMagRun(run),drawFlag("all"),printModulo(10000) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagEventAction::~PurgMagEventAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagEventAction::BeginOfEventAction(const G4Event* evt) +{ + G4int evtNb = evt->GetEventID(); + if (evtNb%printModulo == 0) + G4cout << "\n---> Begin Of Event: " << evtNb << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagEventAction::EndOfEventAction(const G4Event* evt) +{ + if (G4VVisManager::GetConcreteInstance()) + { + G4TrajectoryContainer * trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + + for (G4int i=0; iGetTrajectoryContainer()))[i]); + if (drawFlag == "all") + { + trj->DrawTrajectory(50); + } + else if ((drawFlag == "charged")&&(trj->GetCharge() != 0.)) + { + trj->DrawTrajectory(50); + } + } + //save rndm status + if (PurgMagRun->GetRndmFreq() == 2) + { + HepRandom::saveEngineStatus("endOfEvent.rndm"); + G4int evtNb = evt->GetEventID(); + if (evtNb%printModulo == 0) + { + G4cout << "\n---> End of Event: " << evtNb << G4endl; + HepRandom::showEngineStatus(); + } + } + } +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + + + + + + + + + + + + + + + + diff --git a/examples/advanced/purging_magnet/src/PurgMagPhysicsList.cc b/examples/advanced/purging_magnet/src/PurgMagPhysicsList.cc new file mode 100644 index 0000000000..aff14e2616 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagPhysicsList.cc @@ -0,0 +1,327 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************** +// * * +// * PurgMagPhysicsList.cc * +// * * +// ******************************** +// +// +// $Id: PurgMagPhysicsList.cc,v 1.2 2004/06/18 09:17:58 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "PurgMagPhysicsList.hh" + +#include "G4ParticleDefinition.hh" +#include "G4ParticleWithCuts.hh" +#include "G4ProcessManager.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" +#include "G4Material.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagPhysicsList::PurgMagPhysicsList(): G4VUserPhysicsList() +{ + defaultCutValue = 1*micrometer; + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForPositron = defaultCutValue; + cutForProton = defaultCutValue; + + SetVerboseLevel(1); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagPhysicsList::~PurgMagPhysicsList() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructParticle() +{ + // In this method, static member functions should be called + // for all particles which you want to use. + // This ensures that objects of these particle types will be + // created in the program. + + ConstructBosons(); + ConstructLeptons(); + ConstructBarions(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructBosons() +{ + + // gamma + G4Gamma::GammaDefinition(); + + // optical photon + G4OpticalPhoton::OpticalPhotonDefinition(); +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructLeptons() +{ + // leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructBarions() +{ + // barions + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructProcess() +{ + AddTransportation(); + ConstructEM(); + ConstructGeneral(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "G4MultipleScattering.hh" +// Bosons +#include "G4PhotoElectricEffect.hh" +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +// Leptons +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructEM() +{ + theParticleIterator->reset(); + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "gamma") { + //gamma + pmanager->AddDiscreteProcess(new G4GammaConversion); + pmanager->AddDiscreteProcess(new G4ComptonScattering); + pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); + + } else if (particleName == "e-") { + //electron + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + + } else if (particleName == "e+") { + //positron + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + + } else if (particleName == "proton") { + //proton + pmanager->AddProcess(new G4MultipleScattering, -1,1,1); + + } else if (particleName == "anti_proton") { + //antiproton + pmanager->AddProcess(new G4MultipleScattering, -1,1,1); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::ConstructGeneral() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetCuts() +{ + if (verboseLevel >0){ + G4cout << "PurgMagPhysicsList::SetCuts:"; + G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + + // set cut values for gamma at first and for e- second and next for e+, + // because some processes for e+/e- need cut values for gamma + SetCutValue(cutForGamma, "gamma"); + SetCutValue(cutForElectron, "e-"); + SetCutValue(cutForPositron, "e+"); + + // set cut values for proton and anti_proton before all other hadrons + // because some processes for hadrons need cut values for proton/anti_proton + SetCutValue(cutForProton, "proton"); + SetCutValue(cutForProton, "anti_proton"); + + SetCutValueForOthers(defaultCutValue); + + if (verboseLevel>0) DumpCutValuesTable(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetGammaLowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + G4cout << "PurgMagPhysicsList::SetCuts:"; + G4cout << "Gamma cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + // G4Gamma::SetEnergyRange(lowcut,1e5); + SetGELowLimit(lowcut); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetElectronLowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + + G4cout << "PurgMagPhysicsList::SetCuts:"; + G4cout << "Electron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + // G4Electron::SetEnergyRange(lowcut,1e5); + SetGELowLimit(lowcut); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetPositronLowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + + G4cout << "PurgMagPhysicsList::SetCuts:"; + G4cout << "Positron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + G4cerr << "PurgMagPhysicsList::SetPositronLowLimit: Not currently able to set Positron LowLimit." << G4endl; + G4Exception("Positron Low Limit: not implemented in PurgMagPhysicsList"); + // + // G4Positron::SetEnergyRange(lowcut,1e5); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetProtonLowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + + G4cout << "PurgMagPhysicsList::SetCuts:"; + G4cout << "Proton cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + G4cerr << "PurgMagPhysicsList::SetProtonLowLimit: Not currently able to set Proton LowLimit." << G4endl; + G4Exception("Proton Low Limit: not implemented in PurgMagPhysicsList"); + // + // G4Proton::SetEnergyRange(lowcut,1e5); + // G4AntiProton::SetEnergyRange(lowcut,1e5); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetGEPLowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + G4cout << "PurgMagPhysicsList::SetGEPLowLimit:"; + G4cout << "Gamma and Electron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + // G4Gamma::SetEnergyRange(lowcut,1e5); + // G4Electron::SetEnergyRange(lowcut,1e5); + // G4Positron::SetEnergyRange(lowcut,1e5); + this->SetGELowLimit(lowcut); + + G4cerr << " SetGEPLowLimit : Uncertain whether setting Positron low limit " << G4endl; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void PurgMagPhysicsList::SetGELowLimit(G4double lowcut) +{ + if (verboseLevel >0){ + G4cout << "PurgMagPhysicsList::SetGELowLimit:"; + G4cout << "Gamma and Electron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + } + + G4ProductionCutsTable::GetProductionCutsTable()->SetEnergyRange(lowcut,1e5); +} +void PurgMagPhysicsList::SetGammaCut(G4double val) +{ + ResetCuts(); + cutForGamma = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetElectronCut(G4double val) +{ + // ResetCuts(); + cutForElectron = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetPositronCut(G4double val) +{ + // ResetCuts(); + cutForPositron = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPhysicsList::SetProtonCut(G4double val) +{ + //ResetCuts(); + cutForProton = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + + + + + diff --git a/examples/advanced/purging_magnet/src/PurgMagPrimaryGeneratorAction.cc b/examples/advanced/purging_magnet/src/PurgMagPrimaryGeneratorAction.cc new file mode 100644 index 0000000000..39987ad3f1 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagPrimaryGeneratorAction.cc @@ -0,0 +1,104 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************************** +// * * +// * PurgMagPrimaryGeneratorAction.cc * +// * * +// ******************************************** +// +// $Id: PurgMagPrimaryGeneratorAction.cc,v 1.2 2004/06/18 09:17:59 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "PurgMagPrimaryGeneratorAction.hh" + +#include "PurgMagDetectorConstruction.hh" + +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "Randomize.hh" +#include "G4UnitsTable.hh" + +//Print position of primaries. +#define POSITION 0 + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagPrimaryGeneratorAction::PurgMagPrimaryGeneratorAction(PurgMagDetectorConstruction* PurgMagDC) + :PurgMagDetector(PurgMagDC),rndmVertex(false) +{ + //default kinematic + G4int n_particle = 1; + particleGun = new G4ParticleGun(n_particle); + + G4ParticleDefinition* particle + = + + G4ParticleTable::GetParticleTable()->FindParticle("e-"); + particleGun->SetParticleDefinition(particle); + particleGun->SetParticleEnergy(50.*MeV); + + //Momentum Direction + particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,-1.)); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagPrimaryGeneratorAction::~PurgMagPrimaryGeneratorAction() +{ + delete particleGun; + } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + //this function is called at the begining of event + //Start position of primaries + G4double z0 = 15.*cm; + G4double x0 = 0.*cm; + G4double y0 = 0.*cm; + particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); + particleGun->GeneratePrimaryVertex(anEvent); + +#if POSITION + G4cout << "\n----Particle Gun--------------------------------------------\n"; + G4cout << "\n ---> SetParticlePosition(G4ThreeVector(x0,y0,z0)) "; + G4cout << "\n ---> x0 = " << x0 << " "<< G4BestUnit(x0,"Length"); + G4cout << "\n ---> y0 = " << y0 << " "<< G4BestUnit(y0,"Length"); + G4cout << "\n ---> z0 = " << z0 << " "<< G4BestUnit(z0,"Length"); + G4cout << "\n-----------------------------------------------------------\n"; +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + diff --git a/examples/advanced/purging_magnet/src/PurgMagRunAction.cc b/examples/advanced/purging_magnet/src/PurgMagRunAction.cc new file mode 100644 index 0000000000..c378dee038 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagRunAction.cc @@ -0,0 +1,132 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ****************************** +// * * +// * PurgMagRunAction.cc * +// * * +// ****************************** +// +// $Id: PurgMagRunAction.cc,v 1.2 2004/06/18 09:18:00 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "PurgMagRunAction.hh" + +#include "G4SteppingManager.hh" + +#include "G4Run.hh" +#include "G4Material.hh" +#include "G4UImanager.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "G4UnitsTable.hh" + +#include "Randomize.hh" +#include + +#ifdef G4ANALYSIS_USE +#include "PurgMagAnalysisManager.hh" +#endif + +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagRunAction::PurgMagRunAction(PurgMagDetectorConstruction* det) +:Detector(det) +{ + saveRndm = 1; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagRunAction::~PurgMagRunAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagRunAction::BeginOfRunAction(const G4Run* aRun) +{ + +#ifdef G4ANALYSIS_USE +PurgMagAnalysisManager* analysis = PurgMagAnalysisManager::getInstance(); + analysis->book(); +#endif + + G4cout << "---> Run " << aRun->GetRunID() << " start." << G4endl; + + + // save Rndm status + if (saveRndm > 0) + { HepRandom::showEngineStatus(); + HepRandom::saveEngineStatus("beginOfRun.rndm"); + } + + + //Drawing + // + if (G4VVisManager::GetConcreteInstance()) + { + G4UImanager* UI = G4UImanager::GetUIpointer(); + UI->ApplyCommand("/vis/scene/notifyHandlers"); + } +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagRunAction::EndOfRunAction(const G4Run* aRun) +{ + +#ifdef G4ANALYSIS_USE + PurgMagAnalysisManager* analysis = PurgMagAnalysisManager::getInstance(); +#endif + + G4cout << "number of event = " << aRun->GetNumberOfEvent() << G4endl; + +#ifdef G4ANALYSIS_USE + analysis->finish(); +#endif + + //drawing + if (G4VVisManager::GetConcreteInstance()) + G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); + + // save Rndm status + if (saveRndm == 1) + { HepRandom::showEngineStatus(); + HepRandom::saveEngineStatus("endOfRun.rndm"); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + + + + + + diff --git a/examples/advanced/purging_magnet/src/PurgMagSteppingAction.cc b/examples/advanced/purging_magnet/src/PurgMagSteppingAction.cc new file mode 100644 index 0000000000..c4c1656da2 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagSteppingAction.cc @@ -0,0 +1,166 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// *********************************** +// * * +// * PurgMagSteppingAction.cc * +// * * +// *********************************** +// +// $Id: PurgMagSteppingAction.cc,v 1.2 2004/06/18 09:18:01 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "PurgMagSteppingAction.hh" +#include "PurgMagRunAction.hh" +#include "PurgMagDetectorConstruction.hh" + +#include "G4SteppingManager.hh" +#include "G4VTouchable.hh" +#include "G4VPhysicalVolume.hh" + +#ifdef G4ANALYSIS_USE +#include"PurgMagAnalysisManager.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagSteppingAction::PurgMagSteppingAction(PurgMagRunAction* run,PurgMagDetectorConstruction* det) +:PurgMagRun(run),Detector(det) +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagSteppingAction::~PurgMagSteppingAction() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagSteppingAction::UserSteppingAction(const G4Step* aStep) + +{ + G4double gx, gy, gz, ge, gpx, gpy, gpz, ex, ey, ez, ee, epx, epy, epz, px, py, pz, pe, ppx, ppy, ppz; + + //Collection at SSD in N-tuples. Electrons and photons separated + //Prestep point in World, next volume MeasureVolume, process transportation + + if ((aStep->GetPreStepPoint()->GetPhysicalVolume() == Detector->GetWorld())&& + (aStep->GetTrack()->GetNextVolume() == Detector->GetMeasureVolume())&& + //(aStep->GetTrack()->GetMomentumDirection().z()>0.)&& // only particles with positive momentum + (aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName() == "Transportation")) + { + + // Electrons + if (aStep->GetTrack()->GetDynamicParticle()->GetDefinition()->GetParticleName() == "e-") + { + +#ifdef G4ANALYSIS_USE + PurgMagAnalysisManager* analysis = PurgMagAnalysisManager::getInstance(); +#endif + +#ifdef G4ANALYSIS_USE + + // Position + ex = (aStep->GetTrack()->GetPosition().x())/cm; + ey = (aStep->GetTrack()->GetPosition().y())/cm; + ez = (aStep->GetTrack()->GetPosition().z())/cm; + + // Energy + ee = (aStep->GetTrack()->GetKineticEnergy())/MeV; + + // Momentum + epx = aStep->GetTrack()->GetMomentum().x(); + epy = aStep->GetTrack()->GetMomentum().y(); + epz = aStep->GetTrack()->GetMomentum().z(); + + // Fill N-tuple electrons + analysis->fill_Tuple_Electrons(ex, ey, ez, ee, epx, epy, epz); + +#endif + } + + + // Photons + if (aStep->GetTrack()->GetDynamicParticle()->GetDefinition()->GetParticleName() == "gamma") + { + +#ifdef G4ANALYSIS_USE + PurgMagAnalysisManager* analysis = PurgMagAnalysisManager::getInstance(); +#endif + +#ifdef G4ANALYSIS_USE + + // Position + gx = (aStep->GetTrack()->GetPosition().x())/cm; + gy = (aStep->GetTrack()->GetPosition().y())/cm; + gz = (aStep->GetTrack()->GetPosition().z())/cm; + + // Energy + ge = (aStep->GetTrack()->GetKineticEnergy())/MeV; + + // Momentum + gpx = aStep->GetTrack()->GetMomentum().x(); + gpy = aStep->GetTrack()->GetMomentum().y(); + gpz = aStep->GetTrack()->GetMomentum().z(); + + // Fill N-tuple photons + analysis->fill_Tuple_Gamma(gx, gy, gz, ge, gpx, gpy, gpz); +#endif + } + + + // Positrons + if (aStep->GetTrack()->GetDynamicParticle()->GetDefinition()->GetParticleName() == "e+") + { + +#ifdef G4ANALYSIS_USE + PurgMagAnalysisManager* analysis = PurgMagAnalysisManager::getInstance(); +#endif + +#ifdef G4ANALYSIS_USE + + // Position + px = (aStep->GetTrack()->GetPosition().x())/cm; + py = (aStep->GetTrack()->GetPosition().y())/cm; + pz = (aStep->GetTrack()->GetPosition().z())/cm; + + // Energy + pe = (aStep->GetTrack()->GetKineticEnergy())/MeV; + + // Momentum + ppx = aStep->GetTrack()->GetMomentum().x(); + ppy = aStep->GetTrack()->GetMomentum().y(); + ppz = aStep->GetTrack()->GetMomentum().z(); + + // Fill Ntuple positrons + analysis->fill_Tuple_Positrons(px, py, pz, pe, ppx, ppy, ppz); + +#endif + } + } +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/purging_magnet/src/PurgMagSteppingVerbose.cc b/examples/advanced/purging_magnet/src/PurgMagSteppingVerbose.cc new file mode 100644 index 0000000000..908430dd1e --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagSteppingVerbose.cc @@ -0,0 +1,180 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ************************************ +// * * +// * PurgMagSteppingVerbose.cc * +// * * +// ************************************ +// +// $Id: PurgMagSteppingVerbose.cc,v 1.2 2004/06/18 09:18:02 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "PurgMagSteppingVerbose.hh" +#include "G4SteppingManager.hh" + +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagSteppingVerbose::PurgMagSteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagSteppingVerbose::~PurgMagSteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagSteppingVerbose::StepInfo() +{ + CopyState(); + + G4int prec = G4cout.precision(3); + + if( verboseLevel >= 1 ){ + if( verboseLevel >= 4 ) VerboseTrack(); + if( verboseLevel >= 3 ){ + G4cout << G4endl; + G4cout << std::setw( 5) << "#Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "NextVolu" + << std::setw(10) << "Process" << G4endl; + } + + G4cout << std::setw( 5) << fTrack->GetCurrentStepNumber() << " " + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw( 6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw( 6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetTrackLength(),"Length"); + + // if( fStepStatus != fWorldBoundary){ + if( fTrack->GetNextVolume() != 0 ) { + G4cout << std::setw(10) << fTrack->GetNextVolume()->GetName(); + } else { + G4cout << std::setw(10) << "OutOfWorld"; + } + + if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != NULL){ + G4cout << std::setw(10) << fStep->GetPostStepPoint()->GetProcessDefinedStep() + ->GetProcessName(); + } else { + G4cout << "User Limit"; + } + + G4cout << G4endl; + + if( verboseLevel == 2 ){ + G4int tN2ndariesTot = fN2ndariesAtRestDoIt + + fN2ndariesAlongStepDoIt + + fN2ndariesPostStepDoIt; + if(tN2ndariesTot>0){ + G4cout << " :----- List of 2ndaries - " + << "#SpawnInStep=" << std::setw(3) << tN2ndariesTot + << "(Rest=" << std::setw(2) << fN2ndariesAtRestDoIt + << ",Along=" << std::setw(2) << fN2ndariesAlongStepDoIt + << ",Post=" << std::setw(2) << fN2ndariesPostStepDoIt + << "), " + << "#SpawnTotal=" << std::setw(3) << (*fSecondary).size() + << " ---------------" + << G4endl; + + for(size_t lp1=(*fSecondary).size()-tN2ndariesTot; + lp1<(*fSecondary).size(); lp1++){ + G4cout << " : " + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().x(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().y(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().z(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetKineticEnergy(),"Energy") + << std::setw(10) + << (*fSecondary)[lp1]->GetDefinition()->GetParticleName(); + G4cout << G4endl; + } + + G4cout << " :-----------------------------" + << "----------------------------------" + << "-- EndOf2ndaries Info ---------------" + << G4endl; + } + } + + } + G4cout.precision(prec); + G4cout<< "exit PurgMagSteppingVerbose::StepInfo " < 0 ){ + + G4cout << std::setw( 5) << "Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "NextVolu" + << std::setw(10) << "Process" << G4endl; + + G4cout << std::setw( 5) << fTrack->GetCurrentStepNumber() << " " + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw( 6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw( 6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw( 6) << G4BestUnit(fTrack->GetTrackLength(),"Length"); + + if(fTrack->GetNextVolume()){ + G4cout << std::setw(10) << fTrack->GetNextVolume()->GetName() << " "; + } else { + G4cout << std::setw(10) << "OutOfWorld" << " "; + } + G4cout << std::setw(10) << "initStep" << G4endl; + } + G4cout.precision(prec); + G4cout<< "exit PurgMagSteppingVerbose::TrackingStarted() " < " "Reading the field grid from " << filename << " ... " << endl; + ifstream file( filename ); // Open the file for reading. + + // Ignore first blank line + char buffer[256]; + file.getline(buffer,256); + + // Read table dimensions + file >> nx >> ny >> nz; // Note dodgy order + + G4cout << " [ Number of values x,y,z: " + << nx << " " << ny << " " << nz << " ] " + << endl; + + // Set up storage space for table + xField.resize( nx ); + yField.resize( nx ); + zField.resize( nx ); + int ix, iy, iz; + for (ix=0; ix> xval >> yval >> zval >> bx >> by >> bz >> permeability; + if ( ix==0 && iy==0 && iz==0 ) { + minx = xval * lenUnit; + miny = yval * lenUnit; + minz = zval * lenUnit; + } + xField[ix][iy][iz] = bx * fieldUnit; + yField[ix][iy][iz] = by * fieldUnit; + zField[ix][iy][iz] = bz * fieldUnit; + } + } + } + file.close(); + + maxx = xval * lenUnit; + maxy = yval * lenUnit; + maxz = zval * lenUnit; + + G4cout << "\n ---> ... done reading " << endl; + + // G4cout << " Read values of field from file " << filename << endl; + G4cout << " ---> assumed the order: x, y, z, Bx, By, Bz " + << "\n ---> Min values x,y,z: " + << minx/cm << " " << miny/cm << " " << minz/cm << " cm " + << "\n ---> Max values x,y,z: " + << maxx/cm << " " << maxy/cm << " " << maxz/cm << " cm " + << "\n ---> The field will be offset by " << zOffset/cm << " cm " << endl; + + // Should really check that the limits are not the wrong way around. + if (maxx < minx) {swap(maxx,minx); invertX = true;} + if (maxy < miny) {swap(maxy,miny); invertY = true;} + if (maxz < minz) {swap(maxz,minz); invertZ = true;} + G4cout << "\nAfter reordering if neccesary" + << "\n ---> Min values x,y,z: " + << minx/cm << " " << miny/cm << " " << minz/cm << " cm " + << " \n ---> Max values x,y,z: " + << maxx/cm << " " << maxy/cm << " " << maxz/cm << " cm "; + + dx = maxx - minx; + dy = maxy - miny; + dz = maxz - minz; + G4cout << "\n ---> Dif values x,y,z (range): " + << dx/cm << " " << dy/cm << " " << dz/cm << " cm in z " + << "\n-----------------------------------------------------------" << endl; +} + +void PurgMagTabulatedField3D::GetFieldValue(const double point[4], + double *Bfield ) const +{ + + double x = point[0]; + double y = point[1]; + double z = point[2] + fZoffset; + + // Check that the point is within the defined region + if ( x>=minx && x<=maxx && + y>=miny && y<=maxy && + z>=minz && z<=maxz ) { + + // Position of given point within region, normalized to the range + // [0,1] + double xfraction = (x - minx) / dx; + double yfraction = (y - miny) / dy; + double zfraction = (z - minz) / dz; + + if (invertX) { xfraction = 1 - xfraction;} + if (invertY) { yfraction = 1 - yfraction;} + if (invertZ) { zfraction = 1 - zfraction;} + + // Need addresses of these to pass to modf below. + // modf uses its second argument as an OUTPUT argument. + double xdindex, ydindex, zdindex; + + // Position of the point within the cuboid defined by the + // nearest surrounding tabulated points + double xlocal = ( modf(xfraction*(nx-1), &xdindex)); + double ylocal = ( modf(yfraction*(ny-1), &ydindex)); + double zlocal = ( modf(zfraction*(nz-1), &zdindex)); + + // The indices of the nearest tabulated point whose coordinates + // are all less than those of the given point + int xindex = static_cast(xdindex); + int yindex = static_cast(ydindex); + int zindex = static_cast(zdindex); + + +#ifdef DEBUG_INTERPOLATING_FIELD + G4cout << "Local x,y,z: " << xlocal << " " << ylocal << " " << zlocal << endl; + G4cout << "Index x,y,z: " << xindex << " " << yindex << " " << zindex << endl; + double valx0z0, mulx0z0, valx1z0, mulx1z0; + double valx0z1, mulx0z1, valx1z1, mulx1z1; + valx0z0= table[xindex ][0][zindex]; mulx0z0= (1-xlocal) * (1-zlocal); + valx1z0= table[xindex+1][0][zindex]; mulx1z0= xlocal * (1-zlocal); + valx0z1= table[xindex ][0][zindex+1]; mulx0z1= (1-xlocal) * zlocal; + valx1z1= table[xindex+1][0][zindex+1]; mulx1z1= xlocal * zlocal; +#endif + + // Full 3-dimensional version + Bfield[0] = + xField[xindex ][yindex ][zindex ] * (1-xlocal) * (1-ylocal) * (1-zlocal) + + xField[xindex ][yindex ][zindex+1] * (1-xlocal) * (1-ylocal) * zlocal + + xField[xindex ][yindex+1][zindex ] * (1-xlocal) * ylocal * (1-zlocal) + + xField[xindex ][yindex+1][zindex+1] * (1-xlocal) * ylocal * zlocal + + xField[xindex+1][yindex ][zindex ] * xlocal * (1-ylocal) * (1-zlocal) + + xField[xindex+1][yindex ][zindex+1] * xlocal * (1-ylocal) * zlocal + + xField[xindex+1][yindex+1][zindex ] * xlocal * ylocal * (1-zlocal) + + xField[xindex+1][yindex+1][zindex+1] * xlocal * ylocal * zlocal ; + Bfield[1] = + yField[xindex ][yindex ][zindex ] * (1-xlocal) * (1-ylocal) * (1-zlocal) + + yField[xindex ][yindex ][zindex+1] * (1-xlocal) * (1-ylocal) * zlocal + + yField[xindex ][yindex+1][zindex ] * (1-xlocal) * ylocal * (1-zlocal) + + yField[xindex ][yindex+1][zindex+1] * (1-xlocal) * ylocal * zlocal + + yField[xindex+1][yindex ][zindex ] * xlocal * (1-ylocal) * (1-zlocal) + + yField[xindex+1][yindex ][zindex+1] * xlocal * (1-ylocal) * zlocal + + yField[xindex+1][yindex+1][zindex ] * xlocal * ylocal * (1-zlocal) + + yField[xindex+1][yindex+1][zindex+1] * xlocal * ylocal * zlocal ; + Bfield[2] = + zField[xindex ][yindex ][zindex ] * (1-xlocal) * (1-ylocal) * (1-zlocal) + + zField[xindex ][yindex ][zindex+1] * (1-xlocal) * (1-ylocal) * zlocal + + zField[xindex ][yindex+1][zindex ] * (1-xlocal) * ylocal * (1-zlocal) + + zField[xindex ][yindex+1][zindex+1] * (1-xlocal) * ylocal * zlocal + + zField[xindex+1][yindex ][zindex ] * xlocal * (1-ylocal) * (1-zlocal) + + zField[xindex+1][yindex ][zindex+1] * xlocal * (1-ylocal) * zlocal + + zField[xindex+1][yindex+1][zindex ] * xlocal * ylocal * (1-zlocal) + + zField[xindex+1][yindex+1][zindex+1] * xlocal * ylocal * zlocal ; + + } else { + Bfield[0] = 0.0; + Bfield[1] = 0.0; + Bfield[2] = 0.0; + } +} + diff --git a/examples/advanced/purging_magnet/src/PurgMagTrackingAction.cc b/examples/advanced/purging_magnet/src/PurgMagTrackingAction.cc new file mode 100644 index 0000000000..8c954f9aa0 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagTrackingAction.cc @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// *********************************** +// * * +// * PurgMagTrackingAction.cc * +// * * +// *********************************** +// +// $Id: PurgMagTrackingAction.cc,v 1.2 2004/06/18 09:18:04 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "PurgMagTrackingAction.hh" +#include "PurgMagRunAction.hh" + +#include "G4TrackingManager.hh" +#include "G4Track.hh" + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +PurgMagTrackingAction::PurgMagTrackingAction(PurgMagRunAction* run) +:PurgMagRun(run) +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagTrackingAction::PostUserTrackingAction(const G4Track*) +{ +} + + + + + + + + + + diff --git a/examples/advanced/purging_magnet/src/PurgMagVisManager.cc b/examples/advanced/purging_magnet/src/PurgMagVisManager.cc new file mode 100644 index 0000000000..ef1a8d8806 --- /dev/null +++ b/examples/advanced/purging_magnet/src/PurgMagVisManager.cc @@ -0,0 +1,162 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Larsson +// +// ******************************* +// * * +// * PurgMagVisManager.cc * +// * * +// ******************************* +// +// $Id: PurgMagVisManager.cc,v 1.2 2004/06/18 09:18:05 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifdef G4VIS_USE + +#include "PurgMagVisManager.hh" + +// Supported drivers... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_DAWNFILE +#include "G4DAWNFILE.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + + +/*#ifdef G4VIS_USE_OPACS +#include "G4Wo.hh" +#include "G4Xo.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +#ifdef G4VIS_USE_VRMLFILE +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" +#endif + +#ifdef G4VIS_USE_RAYTRACER +#include "G4RayTracer.hh" +#endif +*/ +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +PurgMagVisManager::PurgMagVisManager () {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void PurgMagVisManager::RegisterGraphicsSystems () { + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_DAWNFILE + RegisterGraphicsSystem (new G4DAWNFILE); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + + /* +#ifdef G4VIS_USE_OPACS + RegisterGraphicsSystem (new G4Wo); + RegisterGraphicsSystem (new G4Xo); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + +#ifdef G4VIS_USE_VRMLFILE + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); +#endif + +#ifdef G4VIS_USE_RAYTRACER + RegisterGraphicsSystem (new G4RayTracer); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } + */ +} + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/purging_magnet/vis.mac b/examples/advanced/purging_magnet/vis.mac new file mode 100644 index 0000000000..d90c7b09d7 --- /dev/null +++ b/examples/advanced/purging_magnet/vis.mac @@ -0,0 +1,47 @@ +# +# Macro file for the initialization phase of "PurgMag.cc" +# +# Sets some default verbose +# and initializes the visualization. +# +#/control/verbose 2 +#/run/verbose 2 +# +# Create empty scene ("world" is default) +/vis/scene/create +# +# Add volume to scene +/vis/scene/add/volume +# +# Create a scene handler for a specific graphics system +# Edit the next line(s) to choose another graphic system +# +#/vis/sceneHandler/create DAWN +#/vis/sceneHandler/create DAWNFILE +/vis/sceneHandler/create OGLIX +#/vis/sceneHandler/create VRML2FILE +# +# Create a viewer +/vis/viewer/create +# +# viewpoint : (theta,phi) = (#*deg, #*deg), +# zoom factor: # +# coordinate axes: +# x-axis:red, y-axis:green, z-axis:blue +/vis/viewer/reset +/vis/viewer/set/viewpointThetaPhi 90 0 +/vis/viewer/zoom 1.5 +#/vis/draw/axes 0 0 0 500 +#/vis/draw/text 0 0 0 mm 5 -120 -200 Assorbitore.0 +# +# +# Draw scene +/vis/scene/notifyHandlers +# for drawing the tracks +# if too many tracks cause core dump => storeTrajectory 0 +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate + + + + diff --git a/examples/advanced/radioprotection/GNUmakefile b/examples/advanced/radioprotection/GNUmakefile new file mode 100644 index 0000000000..b338138b22 --- /dev/null +++ b/examples/advanced/radioprotection/GNUmakefile @@ -0,0 +1,24 @@ +# $Id: GNUmakefile,v 1.5 2004/01/30 12:11:20 guatelli Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := remsim +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all +all: lib bin + +include $(G4INSTALL)/config/binmake.gmk +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` + LOADLIBS += `aida-config --lib` +endif + + diff --git a/examples/advanced/radioprotection/History b/examples/advanced/radioprotection/History new file mode 100644 index 0000000000..0e3835a716 --- /dev/null +++ b/examples/advanced/radioprotection/History @@ -0,0 +1,16 @@ +------------------------------------------------------------------- +$Id: History,v 1.4 2004/05/22 12:57:03 guatelli Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - radiprotection example + ========================================================= + + Category History file + --------------------- +05.2005 - +05.2005 - Design iteration with Decorator Design pattern + +01.2004 - S.Guatelli + First implementation + diff --git a/examples/advanced/radioprotection/README b/examples/advanced/radioprotection/README new file mode 100644 index 0000000000..d0ca92972d --- /dev/null +++ b/examples/advanced/radioprotection/README @@ -0,0 +1,249 @@ + + ========================================================= + Geant4 - Radioprotection example + ========================================================= + + README + --------------------- + +0. INTRODUCTION + +The Radioprotection example derives from a Geant4 application + ( look www.ge.infn.it/geant4/space/remsim for more details ) whose scope +is to evaluate the dose in astronauts, in vehicle concepts and +Moon surface habitat configurations, in a defined interplanetary space +radiation environment. + +1. GEOMETRY + +The user can calculate the dose in the astronaut (phantom) in the +following set-ups: + +- Vehicle configuration + + | ||sh| | | | | + |S||ie| |SPE | | | +----> |I||ld| |she | |phantom| +beam |H||in| |lter| | | + | ||g | | | | | + +---------------------------------------> + Z axis + +- The SIH is the Simplified Inflatable Habitat. + +- The shielding is a layer of water, its scope it to protect the astronaut + from Galactic Cosmic Rays (GCR). The user can add, delete this element + in the geometrical configuration, change its thickness through UI comands. + +- The SPE shelter is a water layer (thickness = 75.cm along Z axis), its scope + it to protect the astronaut from Solar Particle Events (SPE). + The user can add, delete this element in the geometrical configuration + through UI comands. + +- The phantom is the astronaut model; the energy deposit is collected in this + geometrical component. The phantom is a box of water, + it is 30. cm wide along Z axis, it is voxelised in 30 slices along Z axis. + The energy deposit of primary and secondary particles is collected in + each voxel. + +- Moon Habitat configuration + _______________________________ + | | + / |Moon Surface | + / | | + | x | _________ | + |<->|| _____ | | +---->| || |Phan | | <---shelter | +beam | || |thom | | | + | || |_____| | | + \ ||_________| | + \ | | + pyramid | + log| | + |______________________________| + +-------------------------------------------> + Z axis + +- The astronaut/phantom is set in the astronaut habitat (shelter). + +- The pyramid log is made of moon soil and protects the astronaut from + GCR and SPE. The user can add, delete this element in the geometrical + configuration, change its thickness (x) through UI comands. + +- The phantom is the astronaut model; the energy deposit is collected in this + geometrical component. The phantom is a box of water, + it is 30. cm wide along Z axis, it is voxelised in 30 slices along Z axis. + The energy deposit of primary and secondary particles is collected in + each voxel. + +1.1 UI + +- The user can change the geometry set-up with the following UI commands: +/configuration/choose vehicle -> choose the Vehicle configuration +/configuration/choose moon -> choose the Moon Habitat configuration +The user can not switch between these two configurations interactively. + +- The user can select in the vehicle configuration: +/configuration/AddShielding On -> set the shielding water layer +/configuration/AddShielding Off -> destroy the shielding water layer +/shielding/thickness 30.cm -> set the thickness of the shielding layer +/configuration/AddSPE On -> set the SPE shelter +/configuration/AddSPE Off -> destroy the SPE shelter + +- The user can select in the Moon surface habitat configuration: +/configuration/AddRoof On -> set the pyramid log +/configuration/AddRoof Off -> destroy the pyramid log +/roof/thickness 1. m -> set the height (x) of the pyramid log + +2. PHYSICS LIST + +The user can select the physics processes to activate interactively as +shown in the macro vis.mac. +The example is provided of: +- Low Energy electromagnetic processes for photons, e- +- Standard electromagnetic processes for e+ +- Low Energy or Standard electromagnetic processes with ICRU parameterisation + for p, alpha and ions +- Muon electromagnetic processes +- Decay +- Hadronic processes for p and alpha particles as primary particles. + +3. PRIMARY PARTICLES + +The user can select different set-ups to generate primary particles: + +- "Basic": monochromatic particle beam (default configuration) + +- "Interplanetary": particle beam with energy derived from a given + energy spectrum. + +- "Moon": particles generated with energy derived from a given + energy spectrum; The primary vertex is generated on a given hemisphere. + +The default configuration is Basic. + +The energy spectrum is written is ASCII file: +first column: energy in MeV +second column: flux +The final two rows must look as follows: +-1 -1 +-2 -2 + +The flux is used as probability of generating a particle with a particular +energy. The sum of the fluxes is normalised to 1 in the RunAction. + +Examples of ASCII files -- + +- Galactic Cosmic Rays fluxes (envelope of CREME96 1977 and CREME86 1975 solar +minimum spectra): + +p: gcrZ=1.txt +alpha: gcrZ=2.txt +carbon ion: gcrZ=6.txt +oxygen ion: gcrZ=8.txt +silicon ion: gcrZ=14.txt +iron ion: gcrZ=26.txt + +- Solar Particle Events (envelope of CREME96 October 1989 and +August 1972 spectra) + +p: speZ=1.txt +alpha: speZ=2.txt + +3.1 UI +The user can define primary particles with the following command: +/gun/particle proton +/gun/particle alpha +/gun/particle IonC12 +/gun/particle IonO16 +/gun/particle IonSi28 +/gun/particle IonFe52 + +The user can select interactively the configuration with the following +UI commands: +/gun/generator Basic +/gun/generator Interplanetary +/gun/generator Moon + +In the Basic configuration, the user can change interactively the +energy of primary particles: +example: /gun/energy 1.MeV + +4. STEPPING + +Available UI command: + +/step/hadronicVerbose On -> print the hadronic processes undertaken by + particles during the run + +/step/hadronicVerbose Off -> switch off the verbose level + +5. ANALYSIS + +if ANALYSIS_USE = 1 in the variable environment, the output of +the simulation is remsim.hbk + +The file contains histograms: + - 10 (1) Energy Deposit (MeV)in the phantom (astronaut) versus + the depth along Z axis + + - 20 (1) Initial energy (MeV) of primary particles + + - 30 (1) Energy Deposit (MeV) in the phantom given by secondaries + versus the depth along Z axis + + - 40 (1) Initial energy (MeV) of primaries reaching the phantom + + - 50 (1) Initial energy (MeV) of primaries ougoing the phantom + + - 60 (1) Energy (MeV) of primaries reaching the phantom + + - 70 (1) Energy (MeV) of primaries outgoing the phantom + +6.SET-UP + +- a standard Geant4 example GNUmakefile is provided + +setup with: +compiler = gcc-3.2.3 +G4SYSTEM = linux-g++ + +The following environment variables need to be set for the physics packages: +G4LEDATA points to low energy data base - G4EMLOW2.3 +G4LEVELGAMMADATA points to PhotoEvaporation data +G4RADIOACTIVEDATA points to Radioactive Decay data +NeutronHPCrossSections points to neutron data - G4NDL3.7 + +Setup for analysis: AIDA 3.2.1, PI 1.2.1 + +Users can download the analysis tools from: + +http://aida.freehep.org/ +http://www.cern.ch/PI +7. HOW TO RUN THE EXAMPLE + +example macros are provided: + +- vehicle1.mac, vehicle2.mac are examples of simulation in the + vehicle configuration +- moon.mac is an example of simulation in the Moon habitat configuration + +- batch mode: + $G4WORDIR/bin/Linux-g++/remsim vehicle1.mac + $G4WORDIR/bin/Linux-g++/remsim vehicle2.mac + $G4WORDIR/bin/Linux-g++/Brachy moon.mac + +- Interative mode: + $G4WORDIR/bin/Linux-g++/remsim + -> the vis.mac is loaded automatically | + +------------------------------------------------------------------------ +Author : Susanna Guatelli + +for comments, advices, doubts and questions: guatelli@ge.infn.it + +last modified: Susanna Guatelli 27/5/2004 + + diff --git a/examples/advanced/radioprotection/gcrZ=1.txt b/examples/advanced/radioprotection/gcrZ=1.txt new file mode 100644 index 0000000000..706ecd26e1 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=1.txt @@ -0,0 +1,837 @@ +1.0023 4271.974565 +1.0162 4268.700197 +1.0304 4265.269509 +1.0447 4261.725529 +1.0592 4258.038604 +1.0739 4254.203028 +1.0888 4250.212715 +1.104 4246.114704 +1.1193 4242.089408 +1.1349 4238.13283 +1.1506 4234.294698 +1.1666 4230.525274 +1.1828 4226.848085 +1.1993 4223.240179 +1.2159 4219.744131 +1.2328 4216.316672 +1.25 4212.958127 +1.2674 4209.687492 +1.285 4206.503538 +1.3028 4203.404892 +1.3209 4200.373395 +1.3393 4197.408985 +1.3579 4194.526896 +1.3768 4191.710801 +1.3959 4188.974731 +1.4153 4186.303331 +1.435 4183.696194 +1.4549 4181.165571 +1.4751 4178.697732 +1.4956 4176.292009 +1.5164 4173.94767 +1.5375 4171.664066 +1.5589 4169.440467 +1.5805 4167.286069 +1.6025 4165.180109 +1.6248 4163.131715 +1.6473 4161.14881 +1.6702 4159.212858 +1.6934 4157.331758 +1.717 4155.496796 +1.7408 4153.722549 +1.765 4151.993109 +1.7896 4150.308072 +1.8144 4148.680108 +1.8397 4147.088771 +1.8652 4145.552171 +1.8911 4144.057187 +1.9174 4142.603265 +1.9441 4141.189821 +1.9711 4139.821308 +1.9985 4138.491791 +2.0263 4137.200618 +2.0544 4135.951563 +2.083 4134.734649 +2.1119 4133.557698 +2.1413 4132.412266 +2.171 4131.305422 +2.2012 4130.228966 +2.2318 4129.185899 +2.2628 4128.175489 +2.2942 4127.19698 +2.3261 4126.246637 +2.3585 4125.323986 +2.3912 4124.433989 +2.4245 4123.567851 +2.4582 4122.730259 +2.4923 4121.92045 +2.527 4121.133144 +2.5621 4120.372365 +2.5977 4119.635301 +2.6338 4118.921409 +2.6704 4118.230144 +2.7075 4117.560965 +2.7451 4116.913338 +2.7833 4116.285073 +2.822 4115.677335 +2.8612 4115.089582 +2.9009 4114.521291 +2.9412 4113.970551 +2.9821 4113.436962 +3.0236 4112.920124 +3.0656 4112.420823 +3.1082 4111.937414 +3.1514 4111.469483 +3.1952 4111.016627 +3.2396 4110.578445 +3.2846 4110.154543 +3.3303 4109.743626 +3.3765 4109.347101 +3.4235 4108.962043 +3.471 4108.590566 +3.5193 4108.229979 +3.5682 4107.881471 +3.6178 4107.543993 +3.6681 4107.217244 +3.719 4106.901548 +3.7707 4106.595366 +3.8231 4106.299026 +3.8762 4106.01224 +3.9301 4105.734209 +3.9847 4105.465085 +4.0401 4105.204119 +4.0963 4104.951193 +4.1532 4104.706509 +4.2109 4104.469392 +4.2694 4104.239621 +4.3288 4104.016603 +4.3889 4103.800874 +4.4499 4103.591501 +4.5118 4103.388307 +4.5745 4103.191432 +4.638 4103.000668 +4.7025 4102.815246 +4.7678 4102.635573 +4.8341 4102.460934 +4.9013 4102.291436 +4.9694 4102.12692 +5.0385 4101.966996 +5.1085 4101.811752 +5.1795 4101.660822 +5.2515 4101.514072 +5.3244 4101.371569 +5.3984 4101.232796 +5.4735 4101.097644 +5.5495 4100.966347 +5.6266 4100.838439 +5.7048 4100.713818 +5.7841 4100.592383 +5.8645 4100.47403 +5.946 4100.358659 +6.0286 4100.246172 +6.1124 4100.136339 +6.1974 4100.029078 +6.2835 4099.924429 +6.3708 4099.822186 +6.4594 4099.722158 +6.5491 4099.624488 +6.6401 4099.528883 +6.7324 4099.435274 +6.826 4099.343594 +6.9209 4099.253776 +7.017 4099.165848 +7.1146 4099.079473 +7.2134 4098.994859 +7.3137 4098.911688 +7.4153 4098.83007 +7.5184 4098.749792 +7.6229 4098.67088 +7.7288 4098.59328 +7.8362 4098.516871 +7.9451 4098.441605 +8.0555 4098.367435 +8.1675 4098.294251 +8.281 4098.222019 +8.3961 4098.150631 +8.5128 4098.080106 +8.6311 4098.010401 +8.751 4097.941477 +8.8726 4097.873239 +8.9959 4097.80565 +9.1209 4097.738674 +9.2477 4097.672223 +9.3762 4097.606314 +9.5065 4097.540864 +9.6386 4097.475837 +9.7726 4097.411154 +9.9084 4097.34683 +10.046 4097.282833 +10.186 4097.218856 +10.327 4097.155506 +10.471 4097.091853 +10.616 4097.028753 +10.764 4096.965306 +10.913 4096.902339 +11.065 4096.838978 +11.219 4096.775614 +11.375 4096.712219 +11.533 4096.648761 +11.693 4096.58521 +11.856 4096.521143 +12.02 4096.457315 +12.187 4096.392916 +12.357 4096.327922 +12.529 4096.262688 +12.703 4096.197181 +12.879 4096.13137 +13.058 4096.064849 +13.24 4095.997592 +13.424 4095.929936 +13.61 4095.861847 +13.799 4095.792928 +13.991 4095.723146 +14.186 4095.65247 +14.383 4095.581228 +14.583 4095.509022 +14.785 4095.436178 +14.991 4095.36194 +15.199 4095.286989 +15.41 4095.210929 +15.625 4095.133361 +15.842 4095.054965 +16.062 4094.975339 +16.285 4094.894442 +16.511 4094.81223 +16.741 4094.728297 +16.973 4094.643325 +17.209 4094.556535 +17.449 4094.467877 +17.691 4094.37804 +17.937 4094.286234 +18.186 4094.192778 +18.439 4094.097241 +18.695 4093.99962 +18.955 4093.899464 +19.218 4093.797423 +19.485 4093.693049 +19.756 4093.586276 +20.031 4093.477037 +20.309 4093.365663 +20.591 4093.251687 +20.878 4093.134628 +21.168 4093.015228 +21.462 4092.893001 +21.76 4092.767871 +22.063 4092.639333 +22.369 4092.508154 +22.68 4092.373391 +22.995 4092.235389 +23.315 4092.093615 +23.639 4091.948416 +23.967 4091.799703 +24.3 4091.646924 +24.638 4091.489968 +24.981 4091.328729 +25.328 4091.16357 +25.68 4090.993906 +26.037 4090.819622 +26.398 4090.641093 +26.765 4090.457208 +27.137 4090.268336 +27.514 4090.074353 +27.897 4089.874607 +28.284 4089.670008 +28.678 4089.458834 +29.076 4089.242548 +29.48 4089.019923 +29.89 4088.790805 +30.305 4088.555599 +30.726 4088.313587 +31.153 4088.064605 +31.586 4087.808485 +32.025 4087.545054 +32.47 4087.274144 +32.922 4086.994962 +33.379 4086.708563 +33.843 4086.413517 +34.313 4086.11027 +34.79 4085.79798 +35.274 4085.476441 +35.764 4085.146117 +36.261 4084.806133 +36.765 4084.456275 +37.276 4084.096325 +37.794 4083.726065 +38.319 4083.345273 +38.852 4082.952989 +39.392 4082.549708 +39.939 4082.135205 +40.494 4081.708481 +41.057 4081.269283 +41.628 4080.817353 +42.206 4080.353233 +42.793 4079.875055 +43.387 4079.384183 +43.99 4078.878696 +44.602 4078.358302 +45.221 4077.824436 +45.85 4077.274227 +46.487 4076.708131 +47.133 4076.124932 +47.788 4075.525311 +48.452 4074.90896 +49.126 4074.274634 +49.808 4073.623912 +50.501 4072.953609 +51.202 4072.266302 +51.914 4071.558728 +52.635 4070.832537 +53.367 4070.085372 +54.109 4069.317902 +54.861 4068.529788 +55.623 4067.720687 +56.396 4066.889181 +57.18 4066.034901 +57.974 4065.158585 +58.78 4064.257653 +59.597 4063.332835 +60.425 4062.383777 +61.265 4061.408938 +62.116 4060.4091 +62.98 4059.381519 +63.855 4058.328126 +64.742 4057.247383 +65.642 4056.137656 +66.554 4054.999761 +67.479 4053.832082 +68.417 4052.634132 +69.368 4051.405526 +70.332 4050.145879 +71.309 4048.854752 +72.3 4047.530364 +73.305 4046.1723 +74.324 4044.780142 +75.357 4043.353415 +76.404 4041.891698 +77.466 4040.393163 +78.543 4038.857361 +79.634 4037.285284 +80.741 4035.673603 +81.863 4034.023374 +83.001 4032.332664 +84.154 4030.602432 +85.324 4028.829265 +86.509 4027.015717 +87.712 4025.156706 +88.931 4023.254886 +90.166 4021.309854 +91.42 4019.316439 +92.69 4017.278896 +93.978 4015.193514 +95.284 4013.05984 +96.608 4010.877421 +97.951 4008.644147 +99.312 4006.361219 +100.69 4004.029808 +102.09 4001.640971 +103.51 3999.197676 +104.95 3996.699434 +106.41 3994.145759 +107.89 3991.536168 +109.39 3988.87018 +110.91 3986.147408 +112.45 3983.367381 +114.01 3980.529632 +115.59 3977.633788 +117.2 3974.660927 +118.83 3971.628923 +120.48 3968.537421 +122.16 3965.367203 +123.85 3962.155569 +125.57 3958.864177 +127.32 3955.492434 +129.09 3952.059055 +130.88 3948.563619 +132.7 3944.984693 +134.55 3941.321777 +136.42 3937.595605 +138.31 3933.805891 +140.23 3929.932176 +142.18 3925.973827 +144.16 3921.930444 +146.16 3917.822069 +148.19 3913.62779 +150.25 3909.347125 +152.34 3904.979605 +154.46 3900.524769 +156.6 3896.003297 +158.78 3891.372617 +160.99 3886.65356 +163.23 3881.845714 +165.49 3876.97025 +167.79 3871.983764 +170.13 3866.885799 +172.49 3861.7197 +174.89 3856.441338 +177.32 3851.072404 +179.78 3845.612859 +182.28 3840.040246 +184.81 3834.376468 +187.38 3828.598909 +189.99 3822.707415 +192.63 3816.724521 +195.3 3810.650305 +198.02 3804.439035 +200.77 3798.136331 +203.56 3791.719331 +206.39 3785.188037 +209.26 3778.542481 +212.16 3771.805947 +215.11 3764.932233 +218.1 3757.944686 +221.13 3750.843623 +224.21 3743.6059 +227.32 3736.278725 +230.48 3728.815397 +233.69 3721.21626 +236.93 3713.529149 +240.23 3705.683366 +243.56 3697.75094 +246.95 3689.660968 +250.38 3681.461733 +253.86 3673.130169 +257.39 3664.666924 +260.97 3656.073098 +264.59 3647.373469 +268.27 3638.520759 +272 3629.540262 +275.78 3620.43308 +279.61 3611.200147 +283.5 3601.818546 +287.44 3592.313867 +291.43 3582.687424 +295.48 3572.916222 +299.59 3563.001679 +303.75 3552.969631 +307.97 3542.7975 +312.25 3532.486895 +316.59 3522.039484 +320.99 3511.457 +325.45 3500.741237 +329.98 3489.870052 +334.56 3478.893624 +339.21 3467.766011 +343.92 3456.512962 +348.7 3445.112734 +353.55 3433.567587 +358.46 3421.903612 +363.45 3410.075703 +368.5 3398.133741 +373.62 3386.056275 +378.81 3373.845918 +384.07 3361.505353 +389.41 3349.013638 +394.82 3336.397058 +400.31 3323.634949 +405.87 3310.753597 +411.51 3297.732627 +417.23 3284.574983 +423.03 3271.283674 +428.91 3257.861442 +434.87 3244.311769 +440.92 3230.615583 +447.04 3216.821455 +453.26 3202.864879 +459.56 3188.794364 +465.94 3174.613411 +472.42 3160.280979 +478.98 3145.844781 +485.64 3131.264725 +492.39 3116.566432 +499.23 3101.753574 +506.17 3086.808752 +513.2 3071.757434 +520.34 3056.560515 +527.57 3041.264746 +534.9 3025.853091 +542.33 3010.32987 +549.87 2994.678715 +557.51 2978.924099 +565.26 2963.050046 +573.11 2947.081752 +581.08 2930.982552 +589.16 2914.777304 +597.34 2898.490964 +605.64 2882.087882 +614.06 2865.573041 +622.6 2848.95149 +631.25 2832.24715 +640.02 2815.445716 +648.91 2798.551893 +657.93 2781.552102 +667.08 2764.451461 +676.35 2747.273132 +685.75 2730.004157 +695.28 2712.649789 +704.94 2695.214768 +714.74 2677.687101 +724.67 2660.089651 +734.74 2642.409702 +744.95 2624.653032 +755.3 2606.824872 +765.8 2588.914025 +776.44 2570.943011 +787.23 2552.900432 +798.17 2534.79197 +809.27 2516.606951 +820.51 2498.383876 +831.92 2480.079383 +843.48 2461.731669 +855.2 2443.33083 +867.09 2424.866819 +879.14 2406.360821 +891.35 2387.81902 +903.74 2369.216891 +916.3 2350.575464 +929.03 2331.901318 +941.95 2313.17058 +955.04 2294.418435 +968.31 2275.636575 +981.77 2256.817207 +995.41 2237.980674 +1009.2 2219.173286 +1023.3 2200.18471 +1037.5 2181.303964 +1051.9 2162.40238 +1066.5 2143.486766 +1081.3 2124.56393 +1096.4 2105.513657 +1111.6 2086.593305 +1127.1 2067.560661 +1142.7 2048.66715 +1158.6 2029.675435 +1174.7 2010.713297 +1191 1991.786471 +1207.6 1972.785144 +1224.4 1953.830678 +1241.4 1934.928663 +1258.6 1916.084257 +1276.1 1897.19453 +1293.9 1878.267661 +1311.8 1859.52121 +1330.1 1840.647212 +1348.6 1821.859685 +1367.3 1803.163131 +1386.3 1784.463573 +1405.6 1765.768391 +1425.1 1747.179972 +1444.9 1728.607394 +1465 1710.057607 +1485.3 1691.629297 +1506 1673.147571 +1526.9 1654.79745 +1548.1 1636.495993 +1569.7 1618.16457 +1591.5 1599.978917 +1613.6 1581.860056 +1636 1563.81363 +1658.7 1545.845167 +1681.8 1527.882312 +1705.2 1510.009498 +1728.9 1492.231743 +1752.9 1474.553805 +1777.3 1456.908274 +1802 1439.373299 +1827 1421.953243 +1852.4 1404.5841 +1878.1 1387.339497 +1904.2 1370.15756 +1930.7 1353.044629 +1957.5 1336.070051 +1984.7 1319.175098 +2012.3 1302.365435 +2040.3 1285.646551 +2068.6 1269.082285 +2097.4 1252.560704 +2126.5 1236.201339 +2156.1 1219.896519 +2186.1 1203.707049 +2216.4 1187.690022 +2247.2 1171.743938 +2278.5 1155.874823 +2310.1 1140.187935 +2342.2 1124.587656 +2374.8 1109.079168 +2407.8 1093.714351 +2441.3 1078.450746 +2475.2 1063.337821 +2509.6 1048.334691 +2544.5 1033.445609 +2579.8 1018.716526 +2615.7 1004.067988 +2652 989.5853955 +2688.9 975.1925044 +2726.2 960.9706671 +2764.1 946.8469479 +2802.5 932.8625799 +2841.5 918.9846444 +2881 905.2522126 +2921 891.6679526 +2961.6 878.2009225 +3002.8 864.8546872 +3044.5 851.6641849 +3086.8 838.6003269 +3129.7 825.6664166 +3173.2 812.8652693 +3217.3 800.1994516 +3262 787.671282 +3307.4 775.255744 +3353.3 763.0098879 +3399.9 750.8824709 +3447.2 738.8764065 +3495.1 727.0190849 +3543.6 715.3121912 +3592.9 703.709843 +3642.8 692.2612485 +3693.5 680.9229667 +3744.8 669.7416444 +3796.8 658.6965844 +3849.6 647.768806 +3903.1 636.9807048 +3957.3 626.3334942 +4012.3 615.809643 +4068.1 605.4112153 +4124.6 595.1578355 +4181.9 585.0324098 +4240.1 575.0193471 +4299 565.1544217 +4358.7 555.4215456 +4419.3 545.8060679 +4480.7 536.3252632 +4543 526.9644857 +4606.1 517.7396601 +4670.1 508.6375481 +4735.1 499.6454968 +4800.9 490.7917285 +4867.6 482.063083 +4935.2 473.4603746 +5003.8 464.9722051 +5073.3 456.6116504 +5143.9 448.3554393 +5215.3 440.2390711 +5287.8 432.228818 +5361.3 424.3368033 +5435.8 416.8606235 +5511.4 410.2626016 +5588 403.7605622 +5665.6 397.3543764 +5744.3 391.0359003 +5824.2 384.7977725 +5905.1 378.6558272 +5987.2 372.5949741 +6070.4 366.6229022 +6154.8 360.7326192 +6240.3 354.9311892 +6327 349.2118053 +6414.9 343.5746301 +6504.1 338.0135754 +6594.5 332.5350961 +6686.1 327.1390517 +6779 321.8195713 +6873.3 316.5713392 +6968.8 311.4055587 +7065.6 306.316565 +7163.8 301.2992149 +7263.4 296.3537486 +7364.3 291.4850651 +7466.7 286.6835642 +7570.4 281.9585965 +7675.6 277.3009319 +7782.3 272.7107586 +7890.5 268.1881736 +8000.1 263.7371925 +8111.3 259.349626 +8224 255.0294526 +8338.3 250.7727892 +8454.2 246.5796739 +8571.7 242.450067 +8690.8 238.3838572 +8811.6 234.377596 +8934.1 230.431323 +9058.2 226.548088 +9184.1 222.7215302 +9311.7 218.9546574 +9441.2 215.2415896 +9572.4 211.5880218 +9705.4 207.9909401 +9840.3 204.447591 +9977 200.9604921 +10116 197.5171553 +10256 194.1491364 +10399 190.8083353 +10543 187.5414758 +10690 184.3030762 +10838 181.1370789 +10989 178.0004853 +11142 174.9147424 +11297 171.8795395 +11454 168.8945258 +11613 165.9593139 +11774 163.0734826 +11938 160.2194282 +12104 157.4148203 +12272 154.6591092 +12442 151.9517243 +12615 149.2768375 +12791 146.6351759 +12968 144.0560934 +13149 141.4958002 +13331 138.9966552 +13517 136.5172994 +13704 134.0975619 +13895 131.6983839 +14088 129.3452004 +14284 127.0255126 +14482 124.7508345 +14684 122.4983299 +14888 120.2904129 +15095 118.1158281 +15304 115.9846425 +15517 113.8764402 +15733 111.8015094 +15951 109.7689359 +16173 107.7599383 +16398 105.7838147 +16626 103.8403676 +16857 101.9293723 +17091 100.0505795 +17329 98.19603891 +17569 96.3810402 +17814 94.58289655 +18061 92.82361469 +18312 91.08856895 +18567 89.37798647 +18825 87.69846179 +19086 86.04956217 +19351 84.42480618 +19620 82.82428228 +19893 81.24804213 +20170 79.696103 +20450 78.17380674 +20734 76.6754345 +21022 75.20092782 +21314 73.75020212 +21611 72.31839868 +21911 70.91502711 +22215 69.53504105 +22524 68.17393007 +22837 66.83610391 +23154 65.52134768 +23476 64.22546733 +23803 62.94857444 +24133 61.69821439 +24469 60.4629044 +24809 59.25003733 +25154 58.05589404 +25503 56.8837725 +25858 55.72692233 +26217 54.59181335 +26581 53.47506961 +26951 52.3736726 +27325 51.29347222 +27705 50.22856614 +28090 49.18174632 +28480 48.15285888 +28876 47.13921614 +29277 46.14331347 +29684 45.16258374 +30097 44.19703729 +30515 43.24889894 +30939 42.31577213 +31369 41.39761663 +31805 40.4943759 +32247 39.60597827 +32695 38.73233819 +33150 37.8714933 +33610 37.02711699 +34077 36.19541269 +34551 35.37640661 +35031 34.57175831 +35518 33.77970881 +36012 33.00023783 +36512 32.23481848 +37020 31.48034077 +37534 30.73971746 +38056 30.00999417 +38585 29.29255046 +39121 28.58729292 +39664 27.89411918 +40216 27.21047845 +40775 26.53883863 +41341 25.87906851 +41916 25.22880283 +42498 24.59026064 +43089 23.96119189 +43688 23.34264508 +44295 22.73454571 +44910 22.13681122 +45535 21.54749375 +46167 20.96936659 +46809 20.39961832 +47460 19.83914306 +48119 19.28871934 +48788 18.74662384 +49466 18.21364368 +50153 17.68971043 +50850 17.17402005 +51557 16.66655655 +52274 16.16729446 +53000 15.67686506 +53737 15.19387513 +54483 14.71958724 +55241 14.25206575 +56008 13.7931268 +56787 13.34093171 +57576 12.89661874 +58376 12.45956805 +59187 12.02974211 +60010 11.60659022 +60844 11.19059894 +61689 10.78171108 +62547 10.37893951 +63416 9.983197609 +64297 9.593976703 +65191 9.210816461 +66097 8.834120632 +67015 8.463839209 +67947 8.099146525 +68891 7.740800716 +69848 7.388374121 +70819 7.041479028 +71803 6.700447654 +72801 6.364902452 +73813 6.034822641 +74839 5.710181868 +75879 5.390948647 +76933 5.077086776 +78002 4.768271138 +79086 4.464482768 +80186 4.165429738 +81300 3.871626891 +82430 3.582512918 +83575 3.29831779 +84737 3.018525604 +85914 2.743594367 +87108 2.473028548 +88319 2.206816474 +89546 1.945151767 +90791 1.687587076 +92053 1.434313992 +93332 1.185303792 +94629 0.940338253 +95944 0.699398765 +97277 0.462462852 +98629 0.229334614 +100000 0. +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/gcrZ=14.txt b/examples/advanced/radioprotection/gcrZ=14.txt new file mode 100644 index 0000000000..853f832667 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=14.txt @@ -0,0 +1,837 @@ +1.0023 1.694862563 +1.0162 1.694829508 +1.0304 1.694795751 +1.0447 1.694761779 +1.0592 1.694727364 +1.0739 1.694692515 +1.0888 1.694657243 +1.104 1.694621323 +1.1193 1.694585238 +1.1349 1.694548526 +1.1506 1.694511669 +1.1666 1.694474209 +1.1828 1.694436393 +1.1993 1.694397998 +1.2159 1.694359503 +1.2328 1.694320455 +1.25 1.694280868 +1.2674 1.694240985 +1.285 1.69420082 +1.3028 1.694160383 +1.3209 1.694119461 +1.3393 1.69407807 +1.3579 1.694036448 +1.3768 1.693994385 +1.3959 1.693952119 +1.4153 1.693909441 +1.435 1.693866368 +1.4549 1.693823133 +1.4751 1.693779531 +1.4956 1.69373558 +1.5164 1.693691295 +1.5375 1.693646693 +1.5589 1.693601789 +1.5805 1.693556806 +1.6025 1.693511346 +1.6248 1.693465631 +1.6473 1.693419881 +1.6702 1.693373704 +1.6934 1.69332732 +1.717 1.693280547 +1.7408 1.693233796 +1.765 1.693186689 +1.7896 1.693139247 +1.8144 1.693091868 +1.8397 1.693043997 +1.8652 1.692996218 +1.8911 1.69294817 +1.9174 1.692899872 +1.9441 1.692851341 +1.9711 1.692802776 +1.9985 1.692754011 +2.0263 1.692705064 +2.0544 1.692656125 +2.083 1.692606864 +2.1119 1.692557639 +2.1413 1.692508128 +2.171 1.692458683 +2.2012 1.692408985 +2.2318 1.692359218 +2.2628 1.692309395 +2.2942 1.69225953 +2.3261 1.692209481 +2.3585 1.692159266 +2.3912 1.692109209 +2.4245 1.692058864 +2.4582 1.692008551 +2.4923 1.691958281 +2.527 1.691907775 +2.5621 1.691857341 +2.5977 1.691806846 +2.6338 1.691756305 +2.6704 1.691705733 +2.7075 1.691655142 +2.7451 1.691604545 +2.7833 1.691553824 +2.822 1.691503124 +2.8612 1.691452457 +2.9009 1.691401834 +2.9412 1.69135114 +2.9821 1.69130039 +3.0236 1.691249597 +3.0656 1.691198894 +3.1082 1.691148172 +3.1514 1.691097442 +3.1952 1.691046717 +3.2396 1.690996006 +3.2846 1.69094532 +3.3303 1.69089456 +3.3765 1.690843955 +3.4235 1.690793189 +3.471 1.690742595 +3.5193 1.690691865 +3.5682 1.690641218 +3.6178 1.69059056 +3.6681 1.690539902 +3.719 1.69048935 +3.7707 1.690438715 +3.8231 1.690388106 +3.8762 1.69033753 +3.9301 1.6902869 +3.9847 1.69023632 +4.0401 1.690185704 +4.0963 1.69013506 +4.1532 1.690084487 +4.2109 1.690033901 +4.2694 1.68998331 +4.3288 1.689932635 +4.3889 1.689882053 +4.4499 1.689831401 +4.5118 1.689780688 +4.5745 1.689730002 +4.638 1.689679347 +4.7025 1.689628569 +4.7678 1.689577833 +4.8341 1.689526987 +4.9013 1.689476116 +4.9694 1.689425223 +5.0385 1.68937424 +5.1085 1.689323243 +5.1795 1.689272166 +5.2515 1.689221012 +5.3244 1.689169855 +5.3984 1.68911856 +5.4735 1.689067132 +5.5495 1.689015711 +5.6266 1.688964164 +5.7048 1.688912494 +5.7841 1.688860706 +5.8645 1.688808803 +5.946 1.688756787 +6.0286 1.68870466 +6.1124 1.688652363 +6.1974 1.688599897 +6.2835 1.688547326 +6.3708 1.688494591 +6.4594 1.688441633 +6.5491 1.688388574 +6.6401 1.688335295 +6.7324 1.688281798 +6.826 1.688228085 +6.9209 1.688174156 +7.017 1.688120069 +7.1146 1.688065654 +7.2134 1.68801108 +7.3137 1.68795618 +7.4153 1.687901064 +7.5184 1.687845623 +7.6229 1.68778991 +7.7288 1.687733924 +7.8362 1.68767761 +7.9451 1.687620968 +8.0555 1.687563996 +8.1675 1.687506641 +8.281 1.687448952 +8.3961 1.687390875 +8.5128 1.687332408 +8.6311 1.687273549 +8.751 1.687214294 +8.8726 1.68715459 +8.9959 1.687094434 +9.1209 1.687033822 +9.2477 1.686972701 +9.3762 1.686911115 +9.5065 1.686849012 +9.6386 1.686786386 +9.7726 1.686723184 +9.9084 1.686659448 +10.046 1.686595172 +10.186 1.68653007 +10.327 1.686464785 +10.471 1.686398384 +10.616 1.686331782 +10.764 1.686264053 +10.913 1.686196103 +11.065 1.68612701 +11.219 1.686057224 +11.375 1.685986732 +11.533 1.685915526 +11.693 1.685843593 +11.856 1.685770474 +12.02 1.685697055 +12.187 1.685622427 +12.357 1.685546579 +12.529 1.685469946 +12.703 1.685392513 +12.879 1.685314265 +13.058 1.685234743 +13.24 1.685153933 +13.424 1.685072262 +13.61 1.684989715 +13.799 1.68490583 +13.991 1.68482059 +14.186 1.684733975 +14.383 1.684646412 +14.583 1.684557435 +14.785 1.68446747 +14.991 1.684375604 +15.199 1.684282706 +15.41 1.684188308 +15.625 1.684091937 +15.842 1.683994464 +16.062 1.683895416 +16.285 1.683794767 +16.511 1.68369249 +16.741 1.683588102 +16.973 1.683482481 +17.209 1.683374689 +17.449 1.683264689 +17.691 1.683153368 +17.937 1.683039772 +18.186 1.682924329 +18.439 1.682806538 +18.695 1.682686828 +18.955 1.682564691 +19.218 1.68244056 +19.485 1.68231392 +19.756 1.682184728 +20.031 1.682052937 +20.309 1.681918982 +20.591 1.681782339 +20.878 1.681642469 +21.168 1.681500295 +21.462 1.68135528 +21.76 1.681207372 +22.063 1.681056015 +22.369 1.680902152 +22.68 1.680744723 +22.995 1.68058417 +23.315 1.68041992 +23.639 1.68025242 +23.967 1.68008161 +24.3 1.679906901 +24.638 1.679728217 +24.981 1.679545481 +25.328 1.679359155 +25.68 1.679168627 +26.037 1.678973817 +26.398 1.678775195 +26.765 1.678571574 +27.137 1.678363418 +27.514 1.67815064 +27.897 1.677932578 +28.284 1.677710281 +28.678 1.677481926 +29.076 1.677249152 +29.48 1.677010692 +29.89 1.676766436 +30.305 1.676516872 +30.726 1.676261293 +31.153 1.675999579 +31.586 1.675731611 +32.025 1.675457268 +32.47 1.675176426 +32.922 1.674888321 +33.379 1.674594101 +33.843 1.674292348 +34.313 1.673983576 +34.79 1.673666983 +35.274 1.673342418 +35.764 1.673010406 +36.261 1.672670122 +36.765 1.672321407 +37.276 1.6719641 +37.794 1.671598039 +38.319 1.671223058 +38.852 1.670838267 +39.392 1.670444207 +39.939 1.67004071 +40.494 1.669626854 +41.057 1.669202444 +41.628 1.668767281 +42.206 1.66832194 +42.793 1.667864678 +43.387 1.667396851 +43.99 1.666916678 +44.602 1.666423928 +45.221 1.665920004 +45.85 1.665402242 +46.487 1.664872052 +47.133 1.664328378 +47.788 1.663770981 +48.452 1.663199621 +49.126 1.662613182 +49.808 1.662013163 +50.501 1.661396668 +51.202 1.660766109 +51.914 1.660118528 +52.635 1.659455472 +53.367 1.658774828 +54.109 1.658077237 +54.861 1.657362425 +55.623 1.656630118 +56.396 1.655879067 +57.18 1.655108969 +57.974 1.654320517 +58.78 1.653511423 +59.597 1.652682373 +60.425 1.651833067 +61.265 1.650962163 +62.116 1.650070386 +62.98 1.649155311 +63.855 1.648218729 +64.742 1.647259264 +65.642 1.646275495 +66.554 1.645268182 +67.479 1.644235886 +68.417 1.643178263 +69.368 1.64209497 +70.332 1.64098567 +71.309 1.639850029 +72.3 1.63868654 +73.305 1.637494843 +74.324 1.636274587 +75.357 1.635025423 +76.404 1.633747012 +77.466 1.632437781 +78.543 1.631097367 +79.634 1.629726679 +80.741 1.628322855 +81.863 1.626886809 +83.001 1.625416913 +84.154 1.62391412 +85.324 1.622375477 +86.509 1.620803279 +87.712 1.619193203 +88.931 1.617547577 +90.166 1.615866097 +91.42 1.614144337 +92.69 1.612386087 +93.978 1.610588278 +95.284 1.608750591 +96.608 1.606872721 +97.951 1.604952942 +99.312 1.602992393 +100.69 1.600992271 +102.09 1.598945028 +103.51 1.596853265 +104.95 1.59471671 +106.41 1.592535109 +107.89 1.590308229 +109.39 1.588035855 +110.91 1.585717791 +112.45 1.583353863 +114.01 1.580943916 +115.59 1.578487817 +117.2 1.575969766 +118.83 1.573405174 +120.48 1.570793976 +122.16 1.56812017 +123.85 1.565415565 +125.57 1.562648162 +127.32 1.559817733 +129.09 1.556940382 +130.88 1.554016188 +132.7 1.551028802 +134.55 1.547978122 +136.42 1.544880684 +138.31 1.54173667 +140.23 1.538529545 +142.18 1.53525934 +144.16 1.53192612 +146.16 1.528546912 +148.19 1.525105044 +150.25 1.521600684 +152.34 1.518034033 +154.46 1.51440533 +156.6 1.510732037 +158.78 1.506980132 +160.99 1.503167102 +163.23 1.499293325 +165.49 1.495376565 +167.79 1.491382605 +170.13 1.48731183 +172.49 1.483199547 +174.89 1.479011461 +177.32 1.47476557 +179.78 1.470462492 +182.28 1.466085359 +184.81 1.461652341 +187.38 1.457146617 +189.99 1.452568913 +192.63 1.447937542 +195.3 1.443253318 +198.02 1.438482 +200.77 1.433659556 +203.56 1.428769363 +206.39 1.423812386 +209.26 1.418789625 +212.16 1.413719591 +215.11 1.40856839 +218.1 1.403354623 +221.13 1.398079433 +224.21 1.392726629 +227.32 1.387332176 +230.48 1.381862622 +233.69 1.376319351 +236.93 1.370738193 +240.23 1.365068867 +243.56 1.359364328 +246.95 1.353574637 +250.38 1.347735509 +253.86 1.341831426 +257.39 1.33586401 +260.97 1.329834909 +264.59 1.323762543 +268.27 1.317615061 +272 1.311411 +275.78 1.305152105 +279.61 1.298840142 +283.5 1.292460535 +287.44 1.286031608 +291.43 1.279555176 +295.48 1.273016966 +299.59 1.266419088 +303.75 1.259779581 +307.97 1.253084484 +312.25 1.24633595 +316.59 1.239536143 +320.99 1.232687236 +325.45 1.225791408 +329.98 1.218835542 +334.56 1.211852534 +339.21 1.204814081 +343.92 1.197737668 +348.7 1.190610623 +353.55 1.183435468 +358.46 1.17622934 +363.45 1.168965404 +368.5 1.16167528 +373.62 1.154346849 +378.81 1.146982596 +384.07 1.139584993 +389.41 1.13214262 +394.82 1.124672045 +400.31 1.117162068 +405.87 1.109628961 +411.51 1.102061741 +417.23 1.094463148 +423.03 1.086835898 +428.91 1.079182677 +434.87 1.071506141 +440.92 1.06379624 +447.04 1.056081049 +453.26 1.048325507 +459.56 1.040557482 +465.94 1.032779446 +472.42 1.024969863 +478.98 1.017155644 +485.64 1.009315723 +492.39 1.001464794 +499.23 0.993605522 +506.17 0.985729239 +513.2 0.977850066 +520.34 0.969948513 +527.57 0.962049587 +534.9 0.954144964 +542.33 0.946237397 +549.87 0.938319147 +557.51 0.930403557 +565.26 0.922483041 +573.11 0.914570529 +581.08 0.907688015 +589.16 0.901613742 +597.34 0.895525908 +605.64 0.889411381 +614.06 0.883272068 +622.6 0.877109931 +631.25 0.870934026 +640.02 0.864739007 +648.91 0.858526749 +657.93 0.852292264 +667.08 0.846037585 +676.35 0.83977145 +685.75 0.833489002 +695.28 0.827192167 +704.94 0.820882921 +714.74 0.814556789 +724.67 0.808222221 +734.74 0.801874833 +744.95 0.795516634 +755.3 0.78914963 +765.8 0.782769743 +776.44 0.776385121 +787.23 0.769991827 +798.17 0.763591936 +809.27 0.757181672 +820.51 0.750774641 +831.92 0.7443558 +843.48 0.737938521 +855.2 0.731519354 +867.09 0.725094928 +879.14 0.718672739 +891.35 0.712254791 +903.74 0.705832635 +916.3 0.69941365 +929.03 0.692999938 +941.95 0.686583585 +955.04 0.68017659 +968.31 0.673776107 +981.77 0.667379488 +995.41 0.660993482 +1009.2 0.654633906 +1023.3 0.64822963 +1037.5 0.64187824 +1051.9 0.635536505 +1066.5 0.629206507 +1081.3 0.622890215 +1096.4 0.616547649 +1111.6 0.610264725 +1127.1 0.603960735 +1142.7 0.597718871 +1158.6 0.59146083 +1174.7 0.585228496 +1191 0.579023526 +1207.6 0.572810113 +1224.4 0.566628002 +1241.4 0.560478745 +1258.6 0.554363857 +1276.1 0.548249882 +1293.9 0.542139485 +1311.8 0.536102625 +1330.1 0.530039981 +1348.6 0.524020326 +1367.3 0.518044947 +1386.3 0.512083612 +1405.6 0.506138459 +1425.1 0.500242029 +1444.9 0.494365662 +1465 0.488511326 +1485.3 0.482709743 +1506 0.476905608 +1526.9 0.471156796 +1548.1 0.465437248 +1569.7 0.459722185 +1591.5 0.454066143 +1613.6 0.448444472 +1636 0.442858673 +1658.7 0.437310186 +1681.8 0.431776564 +1705.2 0.42628356 +1728.9 0.42083256 +1752.9 0.415424754 +1777.3 0.410039198 +1802 0.404699768 +1827 0.399407468 +1852.4 0.394142512 +1878.1 0.388927089 +1904.2 0.383742148 +1930.7 0.378589435 +1957.5 0.373489649 +1984.7 0.368424792 +2012.3 0.363396382 +2040.3 0.358405865 +2068.6 0.353472043 +2097.4 0.348561341 +2126.5 0.343709083 +2156.1 0.338883062 +2186.1 0.334101017 +2216.4 0.32937952 +2247.2 0.324688318 +2278.5 0.320029125 +2310.1 0.31543266 +2342.2 0.31087052 +2374.8 0.306345102 +2407.8 0.301871366 +2441.3 0.297435598 +2475.2 0.293051734 +2509.6 0.288707651 +2544.5 0.284404577 +2579.8 0.280155498 +2615.7 0.275937203 +2652 0.271774037 +2688.9 0.267643881 +2726.2 0.263569885 +2764.1 0.259530885 +2802.5 0.255538424 +2841.5 0.251582968 +2881 0.247675418 +2921 0.243816225 +2961.6 0.239996423 +3002.8 0.236216849 +3044.5 0.232487221 +3086.8 0.228799079 +3129.7 0.225153099 +3173.2 0.221549898 +3217.3 0.21799001 +3262 0.214473933 +3307.4 0.210994476 +3353.3 0.207567357 +3399.9 0.204178004 +3447.2 0.200827109 +3495.1 0.197522174 +3543.6 0.194263436 +3592.9 0.191037973 +3642.8 0.187859331 +3693.5 0.184715205 +3744.8 0.18161838 +3796.8 0.178562989 +3849.6 0.175543596 +3903.1 0.17256634 +3957.3 0.169631407 +4012.3 0.166733672 +4068.1 0.163873551 +4124.6 0.161056365 +4181.9 0.158277309 +4240.1 0.155531941 +4299 0.152829924 +4358.7 0.150166762 +4419.3 0.147538264 +4480.7 0.144948995 +4543 0.142394923 +4606.1 0.139880292 +4670.1 0.13740126 +4735.1 0.134954244 +4800.9 0.132546916 +4867.6 0.130175658 +4935.2 0.127840542 +5003.8 0.125538256 +5073.3 0.123272263 +5143.9 0.121036209 +5215.3 0.118839684 +5287.8 0.116673477 +5361.3 0.1145407 +5435.8 0.112441405 +5511.4 0.110372885 +5588 0.108337918 +5665.6 0.106336443 +5744.3 0.104365923 +5824.2 0.10242398 +5905.1 0.10051546 +5987.2 0.098635657 +6070.4 0.096818831 +6154.8 0.095315604 +6240.3 0.093835958 +6327 0.092378099 +6414.9 0.090942011 +6504.1 0.089526087 +6594.5 0.088131919 +6686.1 0.086759418 +6779 0.08540704 +6873.3 0.084073387 +6968.8 0.082761258 +7065.6 0.081469168 +7163.8 0.080195767 +7263.4 0.078941075 +7364.3 0.077706294 +7466.7 0.076488948 +7570.4 0.07529137 +7675.6 0.074111185 +7782.3 0.072948403 +7890.5 0.071803017 +8000.1 0.070676008 +8111.3 0.069565272 +8224 0.068471786 +8338.3 0.067394537 +8454.2 0.066333505 +8571.7 0.065288655 +8690.8 0.06425993 +8811.6 0.063246435 +8934.1 0.062248153 +9058.2 0.061265834 +9184.1 0.060297847 +9311.7 0.059344929 +9441.2 0.058405575 +9572.4 0.057481204 +9705.4 0.056571036 +9840.3 0.055674355 +9977 0.054791783 +10116 0.053920141 +10256 0.053067403 +10399 0.052221375 +10543 0.051393877 +10690 0.050573373 +10838 0.049770986 +10989 0.048975806 +11142 0.048193256 +11297 0.047423248 +11454 0.046665684 +11613 0.045920458 +11774 0.045187453 +11938 0.044462191 +12104 0.04374915 +12272 0.043048188 +12442 0.042359154 +12615 0.041678012 +12791 0.04100494 +12968 0.040347413 +13149 0.039694263 +13331 0.039056292 +13517 0.038422939 +13704 0.037804376 +13895 0.037190615 +14088 0.03658816 +14284 0.035993809 +14482 0.035410513 +14684 0.034832414 +14888 0.034265261 +15095 0.033706167 +15304 0.033157721 +15517 0.03261467 +15733 0.032079661 +15951 0.031555041 +16173 0.031035965 +16398 0.030524834 +16626 0.0300216 +16857 0.029526208 +17091 0.029038598 +17329 0.028556709 +17569 0.028084517 +17814 0.027616125 +18061 0.027157267 +18312 0.026704136 +18567 0.026256792 +18825 0.025816965 +19086 0.02538455 +19351 0.024957854 +19620 0.024536904 +19893 0.024121716 +20170 0.0237123 +20450 0.023310073 +20734 0.022913534 +21022 0.022522672 +21314 0.022137473 +21611 0.02175665 +21911 0.021382741 +22215 0.021014412 +22524 0.020650465 +22837 0.020292086 +23154 0.019939227 +23476 0.01959077 +23803 0.01924675 +24133 0.018909212 +24469 0.018575064 +24809 0.018246312 +25154 0.01792196 +25503 0.017602913 +25858 0.017287342 +26217 0.016977021 +26581 0.016671039 +26951 0.016368575 +27325 0.016071246 +27705 0.01577744 +28090 0.015487934 +28480 0.015202697 +28876 0.014920994 +29277 0.01464353 +29684 0.014369598 +30097 0.01409921 +30515 0.013833002 +30939 0.013570312 +31369 0.013311139 +31805 0.013055478 +32247 0.012803319 +32695 0.012554649 +33150 0.012308921 +33610 0.012067193 +34077 0.011828394 +34551 0.011592538 +35031 0.011360117 +35518 0.011130632 +36012 0.01090409 +36512 0.01068093 +37020 0.010460259 +37534 0.010242938 +38056 0.010028114 +38585 0.009816204 +39121 0.009607192 +39664 0.009401063 +40216 0.009197066 +40775 0.008995951 +41341 0.008797691 +41916 0.008601588 +42498 0.008408322 +43089 0.008217226 +43688 0.008028628 +44295 0.007842519 +44910 0.007658888 +45535 0.007477146 +46167 0.007298161 +46809 0.007121077 +47460 0.006946181 +48119 0.006773731 +48788 0.006603199 +49466 0.006434844 +50153 0.006268659 +50850 0.006104401 +51557 0.005942076 +52274 0.005781687 +53000 0.005623453 +53737 0.005466935 +54483 0.005312555 +55241 0.005159697 +56008 0.005008965 +56787 0.00485977 +57576 0.004712498 +58376 0.004566957 +59187 0.004423149 +60010 0.0042809 +60844 0.004140387 +61689 0.004001603 +62547 0.003864227 +63416 0.003728581 +64297 0.003594505 +65191 0.003461852 +66097 0.003330775 +67015 0.003201269 +67947 0.003073058 +68891 0.002946421 +69848 0.00282122 +70819 0.002697329 +71803 0.00257488 +72801 0.00245375 +73813 0.002333943 +74839 0.002215462 +75879 0.002098309 +76933 0.001982484 +78002 0.001867878 +79086 0.001754498 +80186 0.001642246 +81300 0.001531327 +82430 0.001421543 +83575 0.001312994 +84737 0.001205496 +85914 0.001099235 +87108 0.000994034 +88319 0.0008899 +89546 0.000786921 +90791 0.000684933 +92053 0.000584024 +93332 0.000484195 +94629 0.000385372 +95944 0.000287559 +97277 0.000190759 +98629 9.49038E-05 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/gcrZ=2.txt b/examples/advanced/radioprotection/gcrZ=2.txt new file mode 100644 index 0000000000..3abe784c44 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=2.txt @@ -0,0 +1,837 @@ +1.0023 402.5346665 +1.0162 402.3545875 +1.0304 402.1673722 +1.0447 401.975492 +1.0592 401.7774513 +1.0739 401.5730699 +1.0888 401.3621637 +1.104 401.1462158 +1.1193 400.932982 +1.1349 400.721595 +1.1506 400.514784 +1.1666 400.3099184 +1.1828 400.1083045 +1.1993 399.908735 +1.2159 399.7136256 +1.2328 399.5206118 +1.25 399.3297506 +1.2674 399.1421739 +1.285 398.9578674 +1.3028 398.7768143 +1.3209 398.5980083 +1.3393 398.4214863 +1.3579 398.2482123 +1.3768 398.0772578 +1.3959 397.9095276 +1.4153 397.7441402 +1.435 397.581116 +1.4549 397.4212757 +1.4751 397.2638065 +1.4956 397.1087207 +1.5164 396.9560274 +1.5375 396.8057324 +1.5589 396.6578399 +1.5805 396.5130214 +1.6025 396.369936 +1.6248 396.2292514 +1.6473 396.0915731 +1.6702 395.95567 +1.6934 395.8221459 +1.717 395.6904314 +1.7408 395.5616296 +1.765 395.4346441 +1.7896 395.309492 +1.8144 395.1871725 +1.8397 395.0661999 +1.8652 394.948004 +1.8911 394.8316355 +1.9174 394.7170977 +1.9441 394.604395 +1.9711 394.4939362 +1.9985 394.3852976 +2.0263 394.2784762 +2.0544 394.1738386 +2.083 394.070615 +2.1119 393.9695191 +2.1413 393.8698591 +2.171 393.7723021 +2.2012 393.6761799 +2.2318 393.5818056 +2.2628 393.4891637 +2.2942 393.3982388 +2.3261 393.3087329 +2.3585 393.2206446 +2.3912 393.1344991 +2.4245 393.0494938 +2.4582 392.9661337 +2.4923 392.8843959 +2.527 392.8037918 +2.5621 392.7247793 +2.5977 392.6471162 +2.6338 392.5707888 +2.6704 392.4957865 +2.7075 392.4220955 +2.7451 392.3497009 +2.7833 392.2784025 +2.822 392.2083761 +2.8612 392.1396066 +2.9009 392.072076 +2.9412 392.0055987 +2.9821 391.9401683 +3.0236 391.8757754 +3.0656 391.8125604 +3.1082 391.7503578 +3.1514 391.6891545 +3.1952 391.6289371 +3.2396 391.5696922 +3.2846 391.5114062 +3.3303 391.4539399 +3.3765 391.3975292 +3.4235 391.3417955 +3.471 391.2870828 +3.5193 391.2330312 +3.5682 391.1798545 +3.6178 391.1274299 +3.6681 391.0757454 +3.719 391.0248887 +3.7707 390.9746474 +3.8231 390.9251083 +3.8762 390.8762578 +3.9301 390.8279923 +3.9847 390.7803893 +4.0401 390.7333497 +4.0963 390.6868626 +4.1532 390.6409976 +4.2109 390.5956605 +4.2694 390.5508399 +4.3288 390.506449 +4.3889 390.4626245 +4.4499 390.419208 +4.5118 390.3761895 +4.5745 390.3336266 +4.638 390.2915062 +4.7025 390.249614 +4.7678 390.2080684 +4.8341 390.1668027 +4.9013 390.1258687 +4.9694 390.0852545 +5.0385 390.0448895 +5.1085 390.004821 +5.1795 389.9649807 +5.2515 389.9253576 +5.3244 389.8859949 +5.3984 389.8467736 +5.4735 389.8076844 +5.5495 389.7688202 +5.6266 389.7300665 +5.7048 389.6914133 +5.7841 389.6528506 +5.8645 389.6143678 +5.946 389.5759541 +6.0286 389.5375981 +6.1124 389.4992429 +6.1974 389.4608789 +6.2835 389.4225403 +6.3708 389.3841713 +6.4594 389.3457186 +6.5491 389.3072577 +6.6401 389.2686921 +6.7324 389.2300118 +6.826 389.1912065 +6.9209 389.1522661 +7.017 389.11322 +7.1146 389.073936 +7.2134 389.0345246 +7.3137 388.9948558 +7.4153 388.9549981 +7.5184 388.9148633 +7.6229 388.8744797 +7.7288 388.8338358 +7.8362 388.7928829 +7.9451 388.7516111 +8.0555 388.7100101 +8.1675 388.6680316 +8.281 388.6257024 +8.3961 388.5829743 +8.5128 388.5398368 +8.6311 388.4962799 +8.751 388.4522932 +8.8726 388.407829 +8.9959 388.3628765 +9.1209 388.3174256 +9.2477 388.2714296 +9.3762 388.2249137 +9.5065 388.1778317 +9.6386 388.1301736 +9.7726 388.0818926 +9.9084 388.0330137 +10.046 387.9835273 +10.186 387.9332076 +10.327 387.882547 +10.471 387.8308169 +10.616 387.7787259 +10.764 387.7255452 +10.913 387.6719838 +11.065 387.6173124 +11.219 387.561881 +11.375 387.5056804 +11.533 387.4487011 +11.693 387.3909334 +11.856 387.3319663 +12.02 387.2725148 +12.187 387.2118856 +12.357 387.1500695 +12.529 387.0874213 +12.703 387.0239326 +12.879 386.9595967 +13.058 386.8940396 +13.24 386.827253 +13.424 386.7595982 +13.61 386.6910689 +13.799 386.6212898 +13.991 386.550254 +14.186 386.4779547 +14.383 386.4047586 +14.583 386.3302904 +14.785 386.2549172 +14.991 386.1778891 +15.199 386.0999506 +15.41 386.0207241 +15.625 385.9398314 +15.842 385.8580239 +16.062 385.7749235 +16.285 385.6905297 +16.511 385.6048445 +16.741 385.5174881 +16.973 385.4292213 +17.209 385.3392875 +17.449 385.2476886 +17.691 385.1551915 +17.937 385.0610381 +18.186 384.9656177 +18.439 384.8685524 +18.695 384.7702331 +18.955 384.6702849 +19.218 384.5691033 +19.485 384.4663137 +19.756 384.3619265 +20.031 384.2559559 +20.309 384.1488004 +20.591 384.0400886 +20.878 383.9294509 +21.168 383.8176767 +21.462 383.704398 +21.76 383.5896346 +22.063 383.4730223 +22.369 383.3553505 +22.68 383.2358739 +22.995 383.1150019 +23.315 382.9923751 +23.639 382.8684037 +23.967 382.7431148 +24.3 382.6161535 +24.638 382.4875501 +24.981 382.3573343 +25.328 382.2259172 +25.68 382.0929545 +26.037 381.9584789 +26.398 381.8228992 +26.765 381.6854987 +27.137 381.5466883 +27.514 381.4065064 +27.897 381.2646198 +28.284 381.1218033 +28.678 380.976988 +29.076 380.8313181 +29.48 380.684098 +29.89 380.5353657 +30.305 380.3855211 +30.726 380.2342436 +31.153 380.0815712 +31.586 379.9275404 +32.025 379.7721904 +32.47 379.6155591 +32.922 379.457332 +33.379 379.2982428 +33.843 379.1376265 +34.313 378.975863 +34.79 378.8126008 +35.274 378.6478694 +35.764 378.4820765 +36.261 378.3149095 +36.765 378.1463937 +37.276 377.9765511 +37.794 377.8054035 +38.319 377.6329665 +38.852 377.4589285 +39.392 377.2836295 +39.939 377.1070741 +40.494 376.9289481 +41.057 376.749258 +41.628 376.5680062 +42.206 376.3855062 +42.793 376.2011163 +43.387 376.0154565 +43.99 375.8278922 +44.602 375.6384081 +45.221 375.4476038 +45.85 375.2545309 +46.487 375.0597788 +47.133 374.8630106 +47.788 374.664194 +48.452 374.4632947 +49.126 374.2599704 +49.808 374.0547819 +50.501 373.8467819 +51.202 373.6368282 +51.914 373.4239689 +52.635 373.2087464 +53.367 372.9905139 +54.109 372.7695135 +54.861 372.545686 +55.623 372.3189696 +56.396 372.0890072 +57.18 371.8557362 +57.974 371.6193894 +58.78 371.3793084 +59.597 371.1357254 +60.425 370.8885771 +61.265 370.6374992 +62.116 370.3827272 +62.98 370.1236013 +63.855 369.8606531 +64.742 369.5935173 +65.642 369.321835 +66.554 369.0458485 +67.479 368.765194 +68.417 368.4798132 +69.368 368.1896569 +70.332 367.8946695 +71.309 367.594794 +72.3 367.2896755 +73.305 366.9792642 +74.324 366.6635151 +75.357 366.3423884 +76.404 366.015844 +77.466 365.6835283 +78.543 365.345398 +79.634 365.0017368 +80.741 364.6518835 +81.863 364.296122 +83.001 363.9341029 +84.154 363.5661186 +85.324 363.1915112 +86.509 362.8108952 +87.712 362.4232871 +88.931 362.0293111 +90.166 361.6289498 +91.42 361.2212176 +92.69 360.8070782 +93.978 360.3858694 +95.284 359.9575801 +96.608 359.5222002 +97.951 359.0793987 +99.312 358.6294963 +100.69 358.1728254 +102.09 357.7077286 +103.51 357.2348689 +104.95 356.7542481 +106.41 356.2658689 +107.89 355.7697444 +109.39 355.2658806 +110.91 354.7542934 +112.45 354.2350008 +114.01 353.7080133 +115.59 353.173352 +117.2 352.6276594 +118.83 352.0743351 +120.48 351.5133866 +122.16 350.941447 +123.85 350.3653742 +125.57 349.7783928 +127.32 349.1805294 +129.09 348.5752327 +130.88 347.9625614 +132.7 347.3391404 +134.55 346.7050071 +136.42 346.063642 +138.31 345.4151022 +140.23 344.7560142 +142.18 344.0864373 +144.16 343.406434 +146.16 342.7195045 +148.19 342.0222944 +150.25 341.3148755 +152.34 340.5973226 +154.46 339.8697259 +156.6 339.1355973 +158.78 338.3881603 +160.99 337.6309458 +163.23 336.8640448 +165.49 336.0909723 +167.79 335.3049973 +170.13 334.5062278 +172.49 333.7015946 +174.89 332.8843862 +177.32 332.0581224 +179.78 331.2229309 +182.28 330.3755534 +184.81 329.5194912 +187.38 328.6514904 +189.99 327.7717058 +192.63 326.8836302 +195.3 325.9873973 +198.02 325.0764455 +200.77 324.1576286 +203.56 323.2277572 +206.39 322.2869951 +209.26 321.3355105 +212.16 320.3767647 +215.11 319.4043046 +218.1 318.4216156 +221.13 317.4288816 +224.21 316.4230067 +227.32 315.4106963 +230.48 314.3856176 +233.69 313.3479923 +236.93 312.3044701 +240.23 311.2455892 +243.56 310.1811797 +246.95 309.101841 +250.38 308.0141648 +253.86 306.9151956 +257.39 305.8051659 +260.97 304.6843127 +264.59 303.5559731 +268.27 302.4141372 +272 301.2621705 +275.78 300.1003044 +279.61 298.9287735 +283.5 297.7447946 +287.44 296.551669 +291.43 295.3496197 +295.48 294.1358984 +299.59 292.9108133 +303.75 291.6775938 +307.97 290.4335515 +312.25 289.1789829 +316.59 287.9141637 +320.99 286.6393726 +325.45 285.3549171 +329.98 284.0582465 +334.56 282.7553487 +339.21 281.4408263 +343.92 280.1178461 +348.7 278.7839166 +353.55 277.4393766 +358.46 276.0873222 +363.45 274.7225921 +368.5 273.3510058 +373.62 271.970152 +378.81 270.580357 +384.07 269.1819794 +389.41 267.7727427 +394.82 266.3556405 +400.31 264.9284107 +405.87 263.4940447 +411.51 262.050326 +417.23 260.5976405 +423.03 259.1363769 +428.91 257.6669266 +434.87 256.189684 +440.92 254.7025532 +447.04 253.2108843 +453.26 251.7077886 +459.56 250.198474 +465.94 248.6833468 +472.42 247.1581087 +478.98 245.6278837 +485.64 244.088463 +492.39 242.5426 +499.23 240.9907168 +506.17 239.4308703 +513.2 237.8657515 +520.34 236.2914975 +527.57 234.7129897 +534.9 233.1284966 +542.33 231.5384933 +549.87 229.9412951 +557.51 228.3394755 +565.26 226.7314823 +573.11 225.1198478 +581.08 223.5009456 +589.16 221.8773544 +597.34 220.2515426 +605.64 218.619968 +614.06 216.9831537 +622.6 215.3416718 +631.25 213.6979469 +640.02 212.0505813 +648.91 210.4000995 +657.93 208.7451392 +667.08 207.0862144 +676.35 205.4256817 +685.75 203.7622929 +695.28 202.0965585 +704.94 200.4290421 +714.74 198.7585463 +724.67 197.0872454 +734.74 195.4140368 +744.95 193.7394641 +755.3 192.0640682 +765.8 190.3867903 +776.44 188.7097854 +787.23 187.0320321 +798.17 185.3540412 +809.27 183.6748054 +820.51 181.9979155 +831.92 180.3194788 +843.48 178.6429724 +855.2 176.9674549 +867.09 175.2920409 +879.14 173.6187478 +891.35 171.9480901 +903.74 170.277881 +916.3 168.6100323 +929.03 166.9450819 +941.95 165.2809859 +955.04 163.6208107 +968.31 161.9638256 +981.77 160.3093527 +995.41 158.6591855 +1009.2 157.0174343 +1023.3 155.3656933 +1037.5 153.7291089 +1051.9 152.096533 +1066.5 150.468499 +1081.3 148.8455314 +1096.4 147.2173456 +1111.6 145.6060042 +1127.1 143.9907919 +1142.7 142.3930106 +1158.6 140.7926343 +1174.7 139.2003443 +1191 137.6165605 +1207.6 136.0321573 +1224.4 134.4572488 +1241.4 132.8922127 +1258.6 131.3374256 +1276.1 129.7843693 +1293.9 128.2337156 +1311.8 126.7032208 +1330.1 125.167704 +1348.6 123.6445735 +1367.3 122.1341054 +1386.3 120.6286513 +1405.6 119.1287798 +1425.1 117.6426526 +1444.9 116.1630352 +1465 114.6904479 +1485.3 113.2325643 +1506 111.775496 +1526.9 110.3337806 +1548.1 108.9008217 +1569.7 107.4704227 +1591.5 106.0562365 +1613.6 104.6520451 +1636 103.258223 +1658.7 101.8751148 +1681.8 100.4970953 +1705.2 99.13059205 +1728.9 97.77590953 +1752.9 96.43333513 +1777.3 95.09767913 +1802 93.77480147 +1827 92.46493709 +1852.4 91.16319344 +1878.1 89.87502399 +1904.2 88.59572466 +1930.7 87.32570951 +1957.5 86.07004107 +1984.7 84.82428379 +2012.3 83.58878842 +2040.3 82.36388432 +2068.6 81.15415412 +2097.4 79.95135164 +2126.5 78.76411384 +2156.1 77.58454274 +2186.1 76.41695924 +2216.4 75.26538426 +2247.2 74.12243399 +2278.5 72.9885015 +2310.1 71.87101016 +2342.2 70.76304335 +2374.8 69.66518619 +2407.8 68.58103059 +2441.3 67.50722326 +2475.2 66.44714314 +2509.6 65.39783392 +2544.5 64.35954147 +2579.8 63.33539052 +2615.7 62.31977952 +2652 61.31854656 +2688.9 60.32633139 +2726.2 59.34866855 +2764.1 58.38047136 +2802.5 57.42449568 +2841.5 56.47842978 +2881 55.54485518 +2921 54.62386618 +2961.6 53.71329446 +3002.8 52.81331136 +3044.5 51.92621579 +3086.8 51.04997341 +3129.7 50.18471151 +3173.2 49.33055965 +3217.3 48.48762563 +3262 47.65599554 +3307.4 46.83394909 +3353.3 46.02517732 +3399.9 45.22623081 +3447.2 44.43725853 +3495.1 43.65998164 +3543.6 42.89444187 +3592.9 42.13759197 +3642.8 41.39256252 +3693.5 40.65646189 +3744.8 39.93226877 +3796.8 39.21858567 +3849.6 38.51414259 +3903.1 37.82032516 +3957.3 37.1371572 +4012.3 36.46344982 +4068.1 35.79925824 +4124.6 35.14579167 +4181.9 34.50191844 +4240.1 33.86659546 +4299 33.24203812 +4358.7 32.62717767 +4419.3 32.02102799 +4480.7 31.42462415 +4543 30.83702052 +4606.1 30.25917454 +4670.1 29.6901803 +4735.1 29.12920024 +4800.9 28.57797456 +4867.6 28.03564719 +4935.2 27.50221864 +5003.8 26.97691774 +5073.3 26.46051832 +5143.9 25.95155445 +5215.3 25.45218195 +5287.8 24.96028613 +5361.3 24.47656646 +5435.8 24.00101452 +5511.4 23.53299476 +5588 23.07312092 +5665.6 22.62136573 +5744.3 22.17713099 +5824.2 21.73986405 +5905.1 21.31064708 +5987.2 20.8883996 +6070.4 20.47363158 +6154.8 20.06582429 +6240.3 19.66543997 +6327 19.27198908 +6414.9 18.88545521 +6504.1 18.50538605 +6594.5 18.13219044 +6686.1 17.76583899 +6779 17.40590653 +6873.3 17.05199627 +6968.8 16.70483396 +7065.6 16.36401665 +7163.8 16.02917355 +7263.4 15.70028912 +7364.3 15.37766541 +7466.7 15.06063782 +7570.4 14.7497937 +7675.6 14.44450067 +7782.3 14.14473849 +7890.5 13.85048021 +8000.1 13.56196204 +8111.3 13.27863112 +8224 13.00071911 +8338.3 12.72794445 +8454.2 12.46028151 +8571.7 12.19769986 +8690.8 11.94016457 +8811.6 11.68743436 +8934.1 11.43948027 +9058.2 11.1964723 +9184.1 10.95798245 +9311.7 10.72416694 +9441.2 10.49464373 +9572.4 10.26973445 +9705.4 10.04922644 +9840.3 9.832929465 +9977 9.620969963 +10116 9.412557533 +10256 9.209584833 +10399 9.009120283 +10543 8.813944123 +10690 8.621320101 +10838 8.433836291 +10989 8.248925088 +11142 8.067810956 +11297 7.890455771 +11454 7.716822641 +11613 7.546867223 +11774 7.380545127 +11938 7.216813923 +12104 7.056659322 +12272 6.900033048 +12442 6.746886168 +12615 6.596297929 +12791 6.448276737 +12968 6.304453396 +13149 6.162363961 +13331 6.02433689 +13517 5.894993343 +13704 5.781579779 +13895 5.669327749 +14088 5.559422061 +14284 5.451272038 +14482 5.345407696 +14684 5.240760762 +14888 5.138367147 +15095 5.037698026 +15304 4.939212729 +15517 4.841962301 +15733 4.746417081 +15951 4.652988768 +16173 4.560808528 +16398 4.470298609 +16626 4.381444422 +16857 4.294230176 +17091 4.208638995 +17329 4.124304161 +17569 4.041915532 +17814 3.960438679 +18061 3.880866256 +18312 3.802531266 +18567 3.725440233 +18825 3.649885762 +19086 3.575843004 +19351 3.503016346 +19620 3.431405934 +19893 3.361010217 +20170 3.291826066 +20450 3.224087037 +20734 3.157534081 +21022 3.092160712 +21314 3.027959278 +21611 2.964711424 +21911 2.902833312 +22215 2.842097939 +22524 2.782303433 +22837 2.72364015 +23154 2.666094761 +23476 2.609480296 +23803 2.553798703 +24133 2.499375138 +24469 2.44570636 +24809 2.393110604 +25154 2.341423162 +25503 2.290783387 +25858 2.240896627 +26217 2.192038891 +26581 2.144061478 +26951 2.096832063 +27325 2.050598497 +27705 2.005105132 +28090 1.960468578 +28480 1.916679268 +28876 1.87362013 +29277 1.831394487 +29684 1.789890801 +30097 1.749107106 +30515 1.709134686 +30939 1.669869813 +31369 1.631308379 +31805 1.593445584 +32247 1.556276 +32695 1.519793622 +33150 1.483914308 +33610 1.448788745 +34077 1.414256574 +34551 1.380316899 +35031 1.347036289 +35518 1.314339784 +36012 1.282224533 +36512 1.250749035 +37020 1.219783377 +37534 1.1894451 +38056 1.159611158 +38585 1.130336109 +39121 1.101614126 +39664 1.073439037 +40216 1.045705454 +40775 1.018511791 +41341 0.991850739 +41916 0.965625004 +42498 0.939922374 +43089 0.914650563 +43688 0.889850105 +44295 0.8655163 +44910 0.841644138 +45535 0.818154346 +46167 0.795155879 +46809 0.772535302 +47460 0.750326734 +48119 0.728559442 +48788 0.707163786 +49466 0.686169449 +50153 0.665572257 +50850 0.645339213 +51557 0.625468389 +52274 0.605957483 +53000 0.586829781 +53737 0.568029639 +54483 0.549604906 +55241 0.531479156 +56008 0.513721581 +56787 0.496259806 +57576 0.479136632 +58376 0.462326948 +59187 0.445828155 +60010 0.429618019 +60844 0.413714087 +61689 0.39811302 +62547 0.382776115 +63416 0.367737118 +64297 0.352975606 +65191 0.338473136 +66097 0.324244004 +67015 0.310285289 +67947 0.296564927 +68891 0.283110503 +69848 0.26990498 +70819 0.256932936 +71803 0.244205901 +72801 0.231708891 +73813 0.21944028 +74839 0.207398232 +75879 0.195580727 +76933 0.183985575 +78002 0.17259995 +79086 0.161422371 +80186 0.150441347 +81300 0.139675001 +82430 0.129101984 +83575 0.118729959 +84737 0.108539377 +85914 0.098546201 +87108 0.088731701 +88319 0.079094789 +89546 0.069641782 +90791 0.060355854 +92053 0.05124327 +93332 0.042302332 +94629 0.033524566 +95944 0.024908686 +97277 0.016453271 +98629 0.008150735 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/gcrZ=26.txt b/examples/advanced/radioprotection/gcrZ=26.txt new file mode 100644 index 0000000000..9b135f56c5 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=26.txt @@ -0,0 +1,837 @@ +1.0023 1.106254902 +1.0162 1.106038585 +1.0304 1.105813484 +1.0447 1.105582547 +1.0592 1.105343961 +1.0739 1.105097503 +1.0888 1.104842928 +1.104 1.10458189 +1.1193 1.104323587 +1.1349 1.104066901 +1.1506 1.103815152 +1.1666 1.103565151 +1.1828 1.103318517 +1.1993 1.103073787 +1.2159 1.102833931 +1.2328 1.102596066 +1.25 1.102360279 +1.2674 1.102127983 +1.285 1.101899179 +1.3028 1.101673856 +1.3209 1.101450782 +1.3393 1.101230019 +1.3579 1.101012782 +1.3768 1.100797923 +1.3959 1.100586594 +1.4153 1.100377703 +1.435 1.10017129 +1.4549 1.09996841 +1.4751 1.099768047 +1.4956 1.099570232 +1.5164 1.09937499 +1.5375 1.099182344 +1.5589 1.098992313 +1.5805 1.098805777 +1.6025 1.098621024 +1.6248 1.098438927 +1.6473 1.09826029 +1.6702 1.098083531 +1.6934 1.097909447 +1.717 1.097737309 +1.7408 1.097568574 +1.765 1.097401821 +1.7896 1.097237063 +1.8144 1.097075629 +1.8397 1.096915598 +1.8652 1.096758874 +1.8911 1.096604212 +1.9174 1.096451632 +1.9441 1.096301148 +1.9711 1.096153323 +1.9985 1.096007603 +2.0263 1.095863998 +2.0544 1.095723018 +2.083 1.095583661 +2.1119 1.095446904 +2.1413 1.095311801 +2.171 1.09517927 +2.2012 1.095048412 +2.2318 1.094919669 +2.2628 1.094793034 +2.2942 1.094668496 +2.3261 1.094545661 +2.3585 1.09442454 +2.3912 1.094305865 +2.4245 1.094188542 +2.4582 1.094073283 +2.4923 1.093960069 +2.527 1.093848237 +2.5621 1.09373843 +2.5977 1.093630324 +2.6338 1.093523915 +2.6704 1.093419197 +2.7075 1.093316163 +2.7451 1.093214804 +2.7833 1.093114851 +2.822 1.093016559 +2.8612 1.092919917 +2.9009 1.092824911 +2.9412 1.092731296 +2.9821 1.092639072 +3.0236 1.092548235 +3.0656 1.092458991 +3.1082 1.092371118 +3.1514 1.092284607 +3.1952 1.092199452 +3.2396 1.092115645 +3.2846 1.092033176 +3.3303 1.091951855 +3.3765 1.091872027 +3.4235 1.091793168 +3.471 1.09171577 +3.5193 1.091639334 +3.5682 1.091564176 +3.6178 1.09149013 +3.6681 1.091417184 +3.719 1.091345473 +3.7707 1.091274707 +3.8231 1.091205019 +3.8762 1.091136397 +3.9301 1.091068703 +3.9847 1.091002058 +4.0401 1.090936329 +4.0963 1.090871392 +4.1532 1.090807352 +4.2109 1.090744204 +4.2694 1.09068194 +4.3288 1.090620447 +4.3889 1.090559922 +4.4499 1.090500154 +4.5118 1.090441139 +4.5745 1.090382963 +4.638 1.090325614 +4.7025 1.090268905 +4.7678 1.090213004 +4.8341 1.090157732 +4.9013 1.090103166 +4.9694 1.090049296 +5.0385 1.089996036 +5.1085 1.089943456 +5.1795 1.089891471 +5.2515 1.089840076 +5.3244 1.089789332 +5.3984 1.089739092 +5.4735 1.089689351 +5.5495 1.089640234 +5.6266 1.089591602 +5.7048 1.089543449 +5.7841 1.089495769 +5.8645 1.089448554 +5.946 1.089401797 +6.0286 1.089355491 +6.1124 1.089309572 +6.1974 1.089264035 +6.2835 1.089218926 +6.3708 1.089174184 +6.4594 1.089129753 +6.5491 1.089085726 +6.6401 1.089041996 +6.7324 1.088998558 +6.826 1.088955406 +6.9209 1.088912534 +7.017 1.088869978 +7.1146 1.088827599 +7.2134 1.088785522 +7.3137 1.088743611 +7.4153 1.088701943 +7.5184 1.088660431 +7.6229 1.088619107 +7.7288 1.088577964 +7.8362 1.088536957 +7.9451 1.088496079 +8.0555 1.088455323 +8.1675 1.088414645 +8.281 1.088374075 +8.3961 1.08833357 +8.5128 1.088293124 +8.6311 1.088252728 +8.751 1.088212375 +8.8726 1.088172024 +8.9959 1.088131668 +9.1209 1.088091299 +9.2477 1.088050877 +9.3762 1.088010426 +9.5065 1.087969908 +9.6386 1.087929314 +9.7726 1.087888605 +9.9084 1.087847802 +10.046 1.087806898 +10.186 1.087765705 +10.327 1.087724557 +10.471 1.08768286 +10.616 1.087641253 +10.764 1.087599151 +10.913 1.087557115 +11.065 1.087514569 +11.219 1.087471785 +11.375 1.08742875 +11.533 1.087385455 +11.693 1.087341885 +11.856 1.08729776 +12.02 1.087253606 +12.187 1.087208874 +12.357 1.087163552 +12.529 1.087117895 +12.703 1.087071887 +12.879 1.087025514 +13.058 1.086978499 +13.24 1.086930828 +13.424 1.086882747 +13.61 1.08683424 +13.799 1.086785031 +13.991 1.086735104 +14.186 1.08668444 +14.383 1.086633281 +14.583 1.086581352 +14.785 1.086528893 +14.991 1.086475364 +15.199 1.086421266 +15.41 1.086366316 +15.625 1.086310234 +15.842 1.086253519 +16.062 1.086195888 +16.285 1.086137318 +16.511 1.086077786 +16.741 1.086017001 +16.973 1.085955469 +17.209 1.085892633 +17.449 1.085828464 +17.691 1.08576347 +17.937 1.085697086 +18.186 1.085629552 +18.439 1.085560565 +18.695 1.085490368 +18.955 1.085418656 +19.218 1.08534567 +19.485 1.0852711 +19.756 1.085194909 +20.031 1.085117063 +20.309 1.085037808 +20.591 1.084956822 +20.878 1.084873778 +21.168 1.084789214 +21.462 1.084702799 +21.76 1.084614492 +22.063 1.084523953 +22.369 1.084431734 +22.68 1.084337191 +22.995 1.08424058 +23.315 1.084141546 +23.639 1.08404035 +23.967 1.083936946 +24.3 1.083830969 +24.638 1.083722362 +24.981 1.083611074 +25.328 1.083497376 +25.68 1.083380887 +26.037 1.083261548 +26.398 1.08313964 +26.765 1.083014428 +27.137 1.082886193 +27.514 1.082754875 +27.897 1.082620062 +28.284 1.082482397 +28.678 1.082340746 +29.076 1.082196122 +29.48 1.082047736 +29.89 1.081895517 +30.305 1.081739702 +30.726 1.081579848 +31.153 1.081415948 +31.586 1.081247927 +32.025 1.081075715 +32.47 1.080899238 +32.922 1.08071802 +33.379 1.08053279 +33.843 1.08034266 +34.313 1.080147961 +34.79 1.079948204 +35.274 1.079743303 +35.764 1.079533602 +36.261 1.079318594 +36.765 1.079098192 +37.276 1.078872317 +37.794 1.078640882 +38.319 1.078403801 +38.852 1.078160536 +39.392 1.077911456 +39.939 1.077656477 +40.494 1.077395044 +41.057 1.077127061 +41.628 1.076852437 +42.206 1.076571568 +42.793 1.076283389 +43.387 1.075988792 +43.99 1.075686694 +44.602 1.075376994 +45.221 1.075060615 +45.85 1.074735933 +46.487 1.074403879 +47.133 1.074063838 +47.788 1.073715716 +48.452 1.073359417 +49.126 1.072994302 +49.808 1.072621364 +50.501 1.072238859 +51.202 1.071848348 +51.914 1.071448066 +52.635 1.071039038 +53.367 1.070620032 +54.109 1.070191517 +54.861 1.069753401 +55.623 1.069305585 +56.396 1.068847385 +57.18 1.068378702 +57.974 1.067900036 +58.78 1.067410086 +59.597 1.066909358 +60.425 1.066397755 +61.265 1.06587457 +62.116 1.065340329 +62.98 1.064793675 +63.855 1.06423578 +64.742 1.063665919 +65.642 1.063083354 +66.554 1.062488637 +67.479 1.061881028 +68.417 1.061260436 +69.368 1.060626764 +70.332 1.05997993 +71.309 1.05931985 +72.3 1.058645764 +73.305 1.057957584 +74.324 1.057255224 +75.357 1.056538605 +76.404 1.05580765 +77.466 1.055061582 +78.543 1.05430032 +79.634 1.053524501 +80.741 1.052732632 +81.863 1.051925356 +83.001 1.051101889 +84.154 1.050262888 +85.324 1.049406827 +86.509 1.048535116 +87.712 1.047645496 +88.931 1.046739382 +90.166 1.045816724 +91.42 1.044875227 +92.69 1.043917103 +93.978 1.042940799 +95.284 1.041946271 +96.608 1.040933491 +97.951 1.039901659 +99.312 1.038851506 +100.69 1.037783791 +102.09 1.036694618 +103.51 1.035585509 +104.95 1.034456448 +106.41 1.033307382 +107.89 1.032138304 +109.39 1.030949261 +110.91 1.029740257 +112.45 1.028511307 +114.01 1.027262432 +115.59 1.025993657 +117.2 1.024696959 +118.83 1.023380404 +120.48 1.022044033 +122.16 1.02067977 +123.85 1.019303928 +125.57 1.01790028 +127.32 1.016468849 +129.09 1.015017883 +130.88 1.013547466 +132.7 1.012049443 +134.55 1.010523877 +136.42 1.008979097 +138.31 1.00741521 +140.23 1.005824048 +142.18 1.004205714 +144.16 1.002560308 +146.16 1.000896247 +148.19 0.999205345 +150.25 0.997487737 +152.34 0.995743541 +154.46 0.993972907 +156.6 0.992184351 +158.78 0.99036131 +160.99 0.988512306 +163.23 0.986637506 +165.49 0.984745473 +167.79 0.982819661 +170.13 0.980860264 +172.49 0.978884227 +174.89 0.976875016 +177.32 0.974841221 +179.78 0.972783067 +182.28 0.970692439 +184.81 0.968577945 +187.38 0.966431469 +189.99 0.96425328 +192.63 0.962051998 +195.3 0.959827897 +198.02 0.957564617 +200.77 0.955279094 +203.56 0.952963311 +206.39 0.950617598 +209.26 0.948242277 +212.16 0.945845963 +215.11 0.943412472 +218.1 0.940950403 +221.13 0.938460135 +224.21 0.935933839 +227.32 0.933388283 +230.48 0.930807471 +233.69 0.92819184 +236.93 0.925558098 +240.23 0.922882263 +243.56 0.92018909 +246.95 0.91745478 +250.38 0.914695937 +253.86 0.911904963 +257.39 0.909082352 +260.97 0.906228612 +264.59 0.903352187 +268.27 0.900437693 +272 0.897493595 +275.78 0.894520443 +279.61 0.891518776 +283.5 0.888481314 +287.44 0.885416432 +291.43 0.882324701 +295.48 0.879198983 +299.59 0.876039885 +303.75 0.872855726 +307.97 0.869639473 +312.25 0.866391765 +316.59 0.863113277 +320.99 0.859804695 +325.45 0.856466716 +329.98 0.853092549 +334.56 0.849697783 +339.21 0.846268325 +343.92 0.8428123 +348.7 0.839323107 +353.55 0.835801557 +358.46 0.832255696 +363.45 0.828671859 +368.5 0.825065227 +373.62 0.821429476 +378.81 0.817765443 +384.07 0.81407395 +389.41 0.810348881 +394.82 0.806598126 +400.31 0.802815645 +405.87 0.799009232 +411.51 0.795172958 +417.23 0.791307758 +423.03 0.787414612 +428.91 0.783494512 +434.87 0.779548424 +440.92 0.775570787 +447.04 0.771575736 +453.26 0.767544449 +459.56 0.76349098 +465.94 0.759416597 +472.42 0.755309614 +478.98 0.7511838 +485.64 0.747027682 +492.39 0.742848701 +499.23 0.738647982 +506.17 0.734420486 +513.2 0.730173456 +520.34 0.725896058 +527.57 0.721601536 +534.9 0.717285084 +542.33 0.712947896 +549.87 0.708585429 +557.51 0.70420473 +565.26 0.699801331 +573.11 0.695382189 +581.08 0.69093738 +589.16 0.686473828 +597.34 0.681998307 +605.64 0.67750118 +614.06 0.672983867 +622.6 0.668447792 +631.25 0.663899596 +640.02 0.659335403 +648.91 0.654756604 +657.93 0.650159446 +667.08 0.645545383 +676.35 0.640920911 +685.75 0.636282502 +695.28 0.631631565 +704.94 0.626969506 +714.74 0.62229302 +724.67 0.617608398 +734.74 0.61291239 +744.95 0.608206455 +755.3 0.603492113 +765.8 0.59876638 +776.44 0.59403527 +787.23 0.589295843 +798.17 0.584549598 +809.27 0.579793806 +820.51 0.575038524 +831.92 0.570272599 +843.48 0.565506035 +855.2 0.560736171 +867.09 0.555960564 +879.14 0.551184785 +891.35 0.546410324 +903.74 0.541630949 +916.3 0.53685208 +929.03 0.532075357 +941.95 0.52729487 +955.04 0.522519524 +968.31 0.51774726 +981.77 0.51297609 +995.41 0.508211076 +1009.2 0.503463992 +1023.3 0.498681702 +1037.5 0.493937184 +1051.9 0.489198126 +1066.5 0.484466033 +1081.3 0.479742472 +1096.4 0.474997486 +1111.6 0.470295366 +1127.1 0.465575751 +1142.7 0.460900946 +1158.6 0.456212398 +1174.7 0.451541341 +1191 0.44688902 +1207.6 0.442228673 +1224.4 0.437590135 +1241.4 0.432974575 +1258.6 0.428383143 +1276.1 0.423790718 +1293.9 0.419199195 +1311.8 0.414661232 +1330.1 0.410102253 +1348.6 0.405573976 +1367.3 0.40107728 +1386.3 0.3965894 +1405.6 0.392112113 +1425.1 0.387669833 +1444.9 0.383241068 +1465 0.378827374 +1485.3 0.374451704 +1506 0.370072536 +1526.9 0.365733618 +1548.1 0.361415067 +1569.7 0.357098247 +1591.5 0.352824439 +1613.6 0.348574924 +1636 0.344350928 +1658.7 0.340153636 +1681.8 0.335966062 +1705.2 0.331807659 +1728.9 0.327679345 +1752.9 0.323582263 +1777.3 0.319500655 +1802 0.315452374 +1827 0.311438156 +1852.4 0.307443104 +1878.1 0.303484212 +1904.2 0.299546994 +1930.7 0.295632633 +1957.5 0.291757018 +1984.7 0.287906606 +2012.3 0.284082412 +2040.3 0.280285549 +2068.6 0.276530344 +2097.4 0.272791262 +2126.5 0.26909522 +2156.1 0.265417709 +2186.1 0.261773129 +2216.4 0.258174163 +2247.2 0.254596902 +2278.5 0.251042576 +2310.1 0.247534585 +2342.2 0.244051341 +2374.8 0.240593919 +2407.8 0.237173714 +2441.3 0.233781086 +2475.2 0.230426856 +2509.6 0.227101779 +2544.5 0.223806675 +2579.8 0.220551545 +2615.7 0.217318661 +2652 0.214126734 +2688.9 0.210958813 +2726.2 0.207832668 +2764.1 0.204732096 +2802.5 0.201665979 +2841.5 0.198626988 +2881 0.195623533 +2921 0.192656004 +2961.6 0.189717498 +3002.8 0.186808698 +3044.5 0.183937105 +3086.8 0.181096237 +3129.7 0.178286633 +3173.2 0.17550877 +3217.3 0.17276311 +3262 0.170050083 +3307.4 0.16736414 +3353.3 0.164717447 +3399.9 0.162098772 +3447.2 0.159508645 +3495.1 0.156952921 +3543.6 0.154431808 +3592.9 0.1519353 +3642.8 0.149473942 +3693.5 0.147038222 +3744.8 0.14463804 +3796.8 0.142268913 +3849.6 0.139926639 +3903.1 0.137615976 +3957.3 0.135337097 +4012.3 0.133086062 +4068.1 0.130863245 +4124.6 0.128672808 +4181.9 0.126511023 +4240.1 0.12437445 +4299 0.122270635 +4358.7 0.120196087 +4419.3 0.118147549 +4480.7 0.116128633 +4543 0.114136221 +4606.1 0.112173628 +4670.1 0.110237875 +4735.1 0.108326218 +4800.9 0.106444684 +4867.6 0.104590455 +4935.2 0.102763604 +5003.8 0.100961559 +5073.3 0.099187065 +5143.9 0.097435147 +5215.3 0.095713341 +5287.8 0.09401445 +5361.3 0.092340982 +5435.8 0.090692981 +5511.4 0.08906829 +5588 0.087469148 +5665.6 0.085895579 +5744.3 0.08434559 +5824.2 0.082817267 +5905.1 0.081314473 +5987.2 0.079833526 +6070.4 0.07837632 +6154.8 0.076941142 +6240.3 0.075529638 +6327 0.074140149 +6414.9 0.072772721 +6504.1 0.071425795 +6594.5 0.070100876 +6686.1 0.068797979 +6779 0.067515692 +6873.3 0.066252687 +6968.8 0.065011609 +7065.6 0.063791041 +7163.8 0.062589748 +7263.4 0.061407753 +7364.3 0.060246179 +7466.7 0.059102723 +7570.4 0.057979574 +7675.6 0.056874518 +7782.3 0.055787548 +7890.5 0.054718645 +8000.1 0.053668731 +8111.3 0.052635845 +8224 0.051620882 +8338.3 0.050622892 +8454.2 0.049641842 +8571.7 0.048677677 +8690.8 0.047730338 +8811.6 0.046798984 +8934.1 0.045883578 +9058.2 0.044984795 +9184.1 0.044101129 +9311.7 0.043233228 +9441.2 0.042379686 +9572.4 0.041541774 +9705.4 0.040718765 +9840.3 0.039909977 +9977 0.03911595 +10116 0.03833378 +10256 0.037570616 +10399 0.036815519 +10543 0.036078997 +10690 0.035350755 +10838 0.034640629 +10989 0.033938935 +11142 0.03325039 +11297 0.032574894 +11454 0.031912339 +11613 0.031262609 +11774 0.030625582 +11938 0.029997308 +12104 0.029381608 +12272 0.028778341 +12442 0.028238472 +12615 0.027756525 +12791 0.02728033 +12968 0.026815184 +13149 0.026353192 +13331 0.025902003 +13517 0.025454154 +13704 0.025016845 +13895 0.02458302 +14088 0.024157283 +14284 0.023737378 +14482 0.023325393 +14684 0.022917198 +14888 0.022516857 +15095 0.022122337 +15304 0.021735468 +15517 0.021352551 +15733 0.020975456 +15951 0.020605842 +16173 0.020240297 +16398 0.019880519 +16626 0.019526475 +16857 0.019178131 +17091 0.018835446 +17329 0.018496976 +17569 0.018165515 +17814 0.017836926 +18061 0.017515235 +18312 0.017197774 +18567 0.016884588 +18825 0.016576889 +19086 0.016274605 +19351 0.015976552 +19620 0.015682751 +19893 0.015393216 +20170 0.015107955 +20450 0.014827954 +20734 0.014552169 +21022 0.014280592 +21314 0.014013214 +21611 0.013749142 +21911 0.013490136 +22215 0.013235271 +22524 0.012983716 +22837 0.012736293 +23154 0.012492966 +23476 0.012252963 +23803 0.01201631 +24133 0.011784409 +24469 0.011555137 +24809 0.011329868 +25154 0.011107918 +25503 0.010889904 +25858 0.010674574 +26217 0.010463138 +26581 0.010254971 +26951 0.010049514 +27325 0.009847864 +27705 0.009648922 +28090 0.009453215 +28480 0.009260717 +28876 0.009070931 +29277 0.008884327 +29684 0.008700429 +30097 0.008519242 +30515 0.008341187 +30939 0.00816582 +31369 0.007993136 +31805 0.007823128 +32247 0.007655787 +32695 0.0074911 +33150 0.007328702 +33610 0.007169288 +34077 0.007012146 +34551 0.006857285 +35031 0.006705021 +35518 0.006555025 +36012 0.006407297 +36512 0.00626212 +37020 0.006118907 +37534 0.005978215 +38056 0.005839485 +38585 0.005702983 +39121 0.005568695 +39664 0.005436604 +40216 0.005306227 +40775 0.005178039 +41341 0.005052016 +41916 0.004927712 +42498 0.004805552 +43089 0.004685109 +43688 0.004566587 +44295 0.004449974 +44910 0.004335258 +45535 0.004222067 +46167 0.004110937 +46809 0.004001331 +47460 0.003893422 +48119 0.003787364 +48788 0.003682828 +49466 0.003579966 +50153 0.00347877 +50850 0.003379085 +51557 0.003280913 +52274 0.003184249 +53000 0.003089218 +53737 0.002995554 +54483 0.002903504 +55241 0.002812693 +56008 0.002723477 +56787 0.002635502 +57576 0.002548989 +58376 0.002463822 +59187 0.002379995 +60010 0.002297403 +60844 0.002216142 +61689 0.002136204 +62547 0.002057398 +63416 0.001979904 +64297 0.001903625 +65191 0.001828473 +66097 0.001754529 +67015 0.001681784 +67947 0.001610079 +68891 0.001539564 +69848 0.001470157 +70819 0.001401784 +71803 0.001334512 +72801 0.001268268 +73813 0.001203049 +74839 0.001138853 +75879 0.001075674 +76933 0.001013507 +78002 0.00095229 +79086 0.00089202 +80186 0.000832641 +81300 0.000774256 +82430 0.000716756 +83575 0.000660188 +84737 0.00060445 +85914 0.000549636 +87108 0.000495648 +88319 0.000442485 +89546 0.000390186 +90791 0.000338665 +92053 0.000287961 +93332 0.000238069 +94629 0.000188948 +95944 0.000140593 +97277 9.30031E-05 +98629 4.61393E-05 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/gcrZ=6.txt b/examples/advanced/radioprotection/gcrZ=6.txt new file mode 100644 index 0000000000..a1fab27e15 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=6.txt @@ -0,0 +1,837 @@ +1.0023 10.99455176 +1.0162 10.99433472 +1.0304 10.99411308 +1.0447 10.99389002 +1.0592 10.99366405 +1.0739 10.99343524 +1.0888 10.99320365 +1.104 10.9929678 +1.1193 10.99273087 +1.1349 10.99248983 +1.1506 10.99224783 +1.1666 10.99200187 +1.1828 10.99175357 +1.1993 10.99150148 +1.2159 10.99124873 +1.2328 10.99099234 +1.25 10.99073241 +1.2674 10.99047055 +1.285 10.99020683 +1.3028 10.98994133 +1.3209 10.98967264 +1.3393 10.98940087 +1.3579 10.98912759 +1.3768 10.98885141 +1.3959 10.98857389 +1.4153 10.98829368 +1.435 10.98801087 +1.4549 10.98772699 +1.4751 10.9874407 +1.4956 10.98715213 +1.5164 10.98686136 +1.5375 10.9865685 +1.5589 10.98627367 +1.5805 10.98597832 +1.6025 10.98567983 +1.6248 10.98537967 +1.6473 10.98507928 +1.6702 10.98477609 +1.6934 10.98447154 +1.717 10.98416444 +1.7408 10.98385748 +1.765 10.98354818 +1.7896 10.98323667 +1.8144 10.98292559 +1.8397 10.98261128 +1.8652 10.98229757 +1.8911 10.98198209 +1.9174 10.98166497 +1.9441 10.98134632 +1.9711 10.98102745 +1.9985 10.98070727 +2.0263 10.98038589 +2.0544 10.98006456 +2.083 10.97974111 +2.1119 10.97941791 +2.1413 10.97909283 +2.171 10.97876818 +2.2012 10.97844187 +2.2318 10.9781151 +2.2628 10.97778797 +2.2942 10.97746056 +2.3261 10.97713195 +2.3585 10.97680225 +2.3912 10.97647357 +2.4245 10.97614301 +2.4582 10.97581267 +2.4923 10.9754826 +2.527 10.97515099 +2.5621 10.97481984 +2.5977 10.9744883 +2.6338 10.97415646 +2.6704 10.9738244 +2.7075 10.97349223 +2.7451 10.97316002 +2.7833 10.97282699 +2.822 10.9724941 +2.8612 10.97216143 +2.9009 10.97182904 +2.9412 10.97149619 +2.9821 10.97116297 +3.0236 10.97082947 +3.0656 10.97049656 +3.1082 10.97016353 +3.1514 10.96983044 +3.1952 10.96949738 +3.2396 10.96916442 +3.2846 10.96883163 +3.3303 10.96849834 +3.3765 10.96816608 +3.4235 10.96783275 +3.471 10.96750056 +3.5193 10.96716747 +3.5682 10.96683493 +3.6178 10.96650232 +3.6681 10.9661697 +3.719 10.96583778 +3.7707 10.96550532 +3.8231 10.96517303 +3.8762 10.96484095 +3.9301 10.96450853 +3.9847 10.96417642 +4.0401 10.96384408 +4.0963 10.96351156 +4.1532 10.96317951 +4.2109 10.96284737 +4.2694 10.96251519 +4.3288 10.96218246 +4.3889 10.96185035 +4.4499 10.96151778 +4.5118 10.9611848 +4.5745 10.960852 +4.638 10.96051941 +4.7025 10.96018601 +4.7678 10.95985288 +4.8341 10.95951903 +4.9013 10.95918502 +4.9694 10.95885086 +5.0385 10.95851611 +5.1085 10.95818128 +5.1795 10.95784591 +5.2515 10.95751003 +5.3244 10.95717415 +5.3984 10.95683735 +5.4735 10.95649968 +5.5495 10.95616206 +5.6266 10.9558236 +5.7048 10.95548435 +5.7841 10.95514431 +5.8645 10.95480352 +5.946 10.95446199 +6.0286 10.95411974 +6.1124 10.95377636 +6.1974 10.95343187 +6.2835 10.9530867 +6.3708 10.95274045 +6.4594 10.95239273 +6.5491 10.95204435 +6.6401 10.95169453 +6.7324 10.95134327 +6.826 10.9509906 +6.9209 10.95063651 +7.017 10.95028138 +7.1146 10.9499241 +7.2134 10.94956578 +7.3137 10.94920531 +7.4153 10.94884343 +7.5184 10.94847941 +7.6229 10.9481136 +7.7288 10.947746 +7.8362 10.94737625 +7.9451 10.94700435 +8.0555 10.94663028 +8.1675 10.94625369 +8.281 10.94587491 +8.3961 10.94549359 +8.5128 10.9451097 +8.6311 10.94472324 +8.751 10.94433418 +8.8726 10.94394217 +8.9959 10.94354719 +9.1209 10.94314922 +9.2477 10.94274791 +9.3762 10.94234354 +9.5065 10.94193578 +9.6386 10.94152459 +9.7726 10.94110961 +9.9084 10.94069113 +10.046 10.9402691 +10.186 10.93984165 +10.327 10.939413 +10.471 10.93897702 +10.616 10.93853972 +10.764 10.93809501 +10.913 10.93764886 +11.065 10.93719521 +11.219 10.936737 +11.375 10.93627416 +11.533 10.93580663 +11.693 10.93533433 +11.856 10.93485424 +12.02 10.93437217 +12.187 10.93388218 +12.357 10.93338417 +12.529 10.93288101 +12.703 10.93237259 +12.879 10.93185882 +13.058 10.93133669 +13.24 10.9308061 +13.424 10.93026987 +13.61 10.92972787 +13.799 10.92917709 +13.991 10.92861742 +14.186 10.92804872 +14.383 10.92747379 +14.583 10.92688958 +14.785 10.92629888 +14.991 10.92569569 +15.199 10.92508574 +15.41 10.92446593 +15.625 10.92383317 +15.842 10.92319318 +16.062 10.92254284 +16.285 10.92188199 +16.511 10.92121045 +16.741 10.92052505 +16.973 10.91983156 +17.209 10.91912381 +17.449 10.91840157 +17.691 10.91767064 +17.937 10.91692479 +18.186 10.91616681 +18.439 10.91539341 +18.695 10.9146074 +18.955 10.91380547 +19.218 10.91299044 +19.485 10.91215894 +19.756 10.91131068 +20.031 10.91044535 +20.309 10.90956583 +20.591 10.90866864 +20.878 10.90775027 +21.168 10.90681678 +21.462 10.90586463 +21.76 10.90489348 +22.063 10.90389969 +22.369 10.90288945 +22.68 10.90185578 +22.995 10.90080161 +23.315 10.89972317 +23.639 10.89862339 +23.967 10.89750187 +24.3 10.89635475 +24.638 10.89518153 +24.981 10.89398171 +25.328 10.89275832 +25.68 10.89150734 +26.037 10.89022824 +26.398 10.88892411 +26.765 10.88758716 +27.137 10.88622044 +27.514 10.88482336 +27.897 10.88339159 +28.284 10.88193202 +28.678 10.88043267 +29.076 10.8789043 +29.48 10.87733861 +29.89 10.87573485 +30.305 10.87409625 +30.726 10.87241814 +31.153 10.87069976 +31.586 10.86894032 +32.025 10.86713902 +32.47 10.86529505 +32.922 10.86340338 +33.379 10.86147157 +33.843 10.8594903 +34.313 10.85746294 +34.79 10.85538423 +35.274 10.85325318 +35.764 10.85107323 +36.261 10.84883897 +36.765 10.84654935 +37.276 10.84420332 +37.794 10.8417998 +38.319 10.83933773 +38.852 10.83681124 +39.392 10.83422389 +39.939 10.83157457 +40.494 10.82885725 +41.057 10.82607063 +41.628 10.8232134 +42.206 10.82028935 +42.793 10.81728703 +43.387 10.81421533 +43.99 10.81106257 +44.602 10.80782724 +45.221 10.80451854 +45.85 10.80111898 +46.487 10.79763782 +47.133 10.79406812 +47.788 10.79040832 +48.452 10.78665684 +49.126 10.78280636 +49.808 10.77886671 +50.501 10.77481888 +51.202 10.77067871 +51.914 10.76642677 +52.635 10.76207323 +53.367 10.75760421 +54.109 10.75302391 +54.861 10.74833054 +55.623 10.74352231 +56.396 10.73859101 +57.18 10.73353463 +57.974 10.72835776 +58.78 10.72304535 +59.597 10.71760191 +60.425 10.71202547 +61.265 10.70630723 +62.116 10.70045193 +62.98 10.69444366 +63.855 10.68829418 +64.742 10.68199446 +65.642 10.67553515 +66.554 10.66892126 +67.479 10.66214333 +68.417 10.65519911 +69.368 10.64808635 +70.332 10.64080282 +71.309 10.63334635 +72.3 10.62570702 +73.305 10.61788249 +74.324 10.60987044 +75.357 10.60166859 +76.404 10.5932747 +77.466 10.58467846 +78.543 10.57587747 +79.634 10.5668777 +80.741 10.55766037 +81.863 10.54823147 +83.001 10.53858031 +84.154 10.52871316 +85.324 10.51861063 +86.509 10.50828778 +87.712 10.49771622 +88.931 10.48691124 +90.166 10.47587085 +91.42 10.46456599 +92.69 10.45302154 +93.978 10.44121735 +95.284 10.42915133 +96.608 10.41682147 +97.951 10.40421645 +99.312 10.39134373 +100.69 10.37821118 +102.09 10.36476923 +103.51 10.35103498 +104.95 10.33700663 +106.41 10.32268251 +107.89 10.3080611 +109.39 10.29314097 +110.91 10.27792085 +112.45 10.2623996 +114.01 10.24657619 +115.59 10.23044975 +117.2 10.21391654 +118.83 10.19707775 +120.48 10.17993295 +122.16 10.16237708 +123.85 10.14461898 +125.57 10.12644856 +127.32 10.10786432 +129.09 10.08897199 +130.88 10.0697721 +132.7 10.0501573 +134.55 10.03012692 +136.42 10.00978953 +138.31 9.989146321 +140.23 9.968088743 +142.18 9.946616986 +144.16 9.92473148 +146.16 9.902544024 +148.19 9.879945153 +150.25 9.85693596 +152.34 9.833517776 +154.46 9.809692166 +156.6 9.785573783 +158.78 9.760939249 +160.99 9.735903369 +163.23 9.710468638 +165.49 9.684751678 +167.79 9.65852784 +170.13 9.631799639 +172.49 9.604798905 +174.89 9.577300459 +177.32 9.549422471 +179.78 9.521168998 +182.28 9.492429294 +184.81 9.463322653 +187.38 9.433738633 +189.99 9.403681998 +192.63 9.373272998 +195.3 9.342516971 +198.02 9.311189097 +200.77 9.279525529 +203.56 9.247417139 +206.39 9.214870248 +209.26 9.181891428 +212.16 9.148602218 +215.11 9.114780078 +218.1 9.08054714 +221.13 9.045910899 +224.21 9.010765062 +227.32 8.975345759 +230.48 8.939433354 +233.69 8.903036925 +236.93 8.866391745 +240.23 8.829167658 +243.56 8.791712369 +246.95 8.753697985 +250.38 8.715359 +253.86 8.676593534 +257.39 8.637412225 +260.97 8.597825908 +264.59 8.557955508 +268.27 8.517591917 +272 8.476856826 +275.78 8.435761706 +279.61 8.39431815 +283.5 8.35243045 +287.44 8.310218917 +291.43 8.267695475 +295.48 8.224766411 +299.59 8.181445566 +303.75 8.137851395 +307.97 8.09389223 +312.25 8.049582202 +316.59 8.00493552 +320.99 7.959966452 +325.45 7.91468931 +329.98 7.869017964 +334.56 7.823168413 +339.21 7.776954807 +343.92 7.730491965 +348.7 7.683696681 +353.55 7.636585511 +358.46 7.589270982 +363.45 7.541576885 +368.5 7.493710845 +373.62 7.445593284 +378.81 7.397240522 +384.07 7.348668786 +389.41 7.299803101 +394.82 7.250752237 +400.31 7.201442675 +405.87 7.151981236 +411.51 7.102587703 +417.23 7.06402056 +423.03 7.025210498 +428.91 6.986167724 +434.87 6.946902529 +440.92 6.907360274 +447.04 6.867682141 +453.26 6.827683996 +459.56 6.787505761 +465.94 6.747158131 +472.42 6.706526101 +478.98 6.665746632 +485.64 6.624707029 +492.39 6.583480392 +499.23 6.542078094 +506.17 6.500449198 +513.2 6.458665672 +520.34 6.41662371 +527.57 6.374453398 +534.9 6.332108647 +542.33 6.289601896 +549.87 6.24688855 +557.51 6.20403791 +565.26 6.161007023 +573.11 6.117864601 +581.08 6.074513619 +589.16 6.031021948 +597.34 5.98745625 +605.64 5.943723446 +614.06 5.899837669 +622.6 5.855812582 +631.25 5.811713325 +640.02 5.767502527 +648.91 5.723193878 +657.93 5.678751797 +667.08 5.634191114 +676.35 5.589574256 +685.75 5.544866798 +695.28 5.500083542 +704.94 5.45523873 +714.74 5.410300732 +724.67 5.365329599 +734.74 5.320294193 +744.95 5.275209768 +755.3 5.230090962 +765.8 5.184908727 +776.44 5.139721179 +787.23 5.094500882 +798.17 5.049262122 +809.27 5.003978923 +820.51 4.958747618 +831.92 4.913462041 +843.48 4.868217241 +855.2 4.822988443 +867.09 4.777752402 +879.14 4.732562402 +891.35 4.687432319 +903.74 4.642303757 +916.3 4.597228367 +929.03 4.552220688 +941.95 4.507225464 +955.04 4.462326894 +968.31 4.41750528 +981.77 4.37274156 +995.41 4.328083518 +1009.2 4.28364245 +1023.3 4.23892148 +1037.5 4.19460186 +1051.9 4.150381692 +1066.5 4.106276041 +1081.3 4.062298063 +1096.4 4.018169257 +1111.6 3.974488485 +1127.1 3.930694243 +1142.7 3.887363761 +1158.6 3.843954256 +1174.7 3.800755984 +1191 3.757781197 +1207.6 3.714781927 +1224.4 3.672031597 +1241.4 3.629541627 +1258.6 3.587323195 +1276.1 3.545144213 +1293.9 3.503023094 +1311.8 3.461442424 +1330.1 3.419718607 +1348.6 3.378324903 +1367.3 3.337268632 +1386.3 3.296341397 +1405.6 3.255559194 +1425.1 3.215144859 +1444.9 3.174901161 +1465 3.134842866 +1485.3 3.095178544 +1506 3.055530126 +1526.9 3.016294191 +1548.1 2.977291067 +1569.7 2.938351883 +1591.5 2.899849377 +1613.6 2.86161378 +1636 2.823655132 +1658.7 2.785983006 +1681.8 2.748444005 +1705.2 2.71121402 +1728.9 2.674301211 +1752.9 2.637713271 +1777.3 2.60130963 +1802 2.565250902 +1827 2.529543402 +1852.4 2.494051792 +1878.1 2.458925674 +1904.2 2.424037739 +1930.7 2.38939833 +1957.5 2.355146523 +1984.7 2.321162367 +2012.3 2.287454487 +2040.3 2.254032497 +2068.6 2.221022104 +2097.4 2.188196706 +2126.5 2.155792379 +2156.1 2.123594114 +2186.1 2.091719909 +2216.4 2.060279788 +2247.2 2.029072288 +2278.5 1.99810795 +2310.1 1.967589618 +2342.2 1.937328731 +2374.8 1.907341792 +2407.8 1.877726751 +2441.3 1.848391504 +2475.2 1.819428963 +2509.6 1.790758644 +2544.5 1.762387012 +2579.8 1.734399398 +2615.7 1.706642667 +2652 1.679276732 +2688.9 1.652155675 +2726.2 1.625430803 +2764.1 1.598962722 +2802.5 1.572826626 +2841.5 1.546959613 +2881 1.52143258 +2921 1.49624781 +2961.6 1.471346165 +3002.8 1.446732492 +3044.5 1.42246942 +3086.8 1.398501542 +3129.7 1.374832829 +3173.2 1.351466652 +3217.3 1.328406034 +3262 1.305653667 +3307.4 1.283162382 +3353.3 1.261033327 +3399.9 1.239171822 +3447.2 1.217581631 +3495.1 1.196310834 +3543.6 1.175360349 +3592.9 1.154646264 +3642.8 1.134255365 +3693.5 1.114108072 +3744.8 1.094285752 +3796.8 1.074750288 +3849.6 1.055466223 +3903.1 1.036472225 +3957.3 1.017769174 +4012.3 0.999323893 +4068.1 0.981138115 +4124.6 0.963245624 +4181.9 0.945615417 +4240.1 0.928218637 +4299 0.911115888 +4358.7 0.894277906 +4419.3 0.877678096 +4480.7 0.861344591 +4543 0.845251333 +4606.1 0.829424906 +4670.1 0.813840474 +4735.1 0.798474864 +4800.9 0.783376051 +4867.6 0.768520594 +4935.2 0.753908194 +5003.8 0.73951787 +5073.3 0.725371145 +5143.9 0.71142798 +5215.3 0.697747222 +5287.8 0.684270904 +5361.3 0.671018229 +5435.8 0.657988775 +5511.4 0.645165125 +5588 0.632564732 +5665.6 0.620186698 +5744.3 0.608014228 +5824.2 0.596032424 +5905.1 0.584270939 +5987.2 0.572699909 +6070.4 0.561333603 +6154.8 0.550158115 +6240.3 0.539185536 +6327 0.52840244 +6414.9 0.517808732 +6504.1 0.507392092 +6594.5 0.497163832 +6686.1 0.487122928 +6779 0.477257731 +6873.3 0.467557489 +6968.8 0.458042086 +7065.6 0.448700501 +7163.8 0.439522511 +7263.4 0.430507697 +7364.3 0.421664264 +7466.7 0.412973988 +7570.4 0.404453099 +7675.6 0.396084247 +7782.3 0.387866877 +7890.5 0.379800391 +8000.1 0.371891255 +8111.3 0.364124144 +8224 0.356505379 +8338.3 0.349027407 +8454.2 0.341689468 +8571.7 0.335116501 +8690.8 0.328977817 +8811.6 0.322940272 +8934.1 0.317003582 +9058.2 0.311171979 +9184.1 0.305435565 +9311.7 0.299798521 +9441.2 0.294251728 +9572.4 0.288803375 +9705.4 0.283448638 +9840.3 0.278183112 +9977 0.273010231 +10116 0.267911202 +10256 0.262932412 +10399 0.258002478 +10543 0.253190075 +10690 0.248427925 +10838 0.243780372 +10989 0.239184018 +11142 0.234670094 +11297 0.230237869 +11454 0.225886554 +11613 0.221615309 +11774 0.217423251 +11938 0.213284603 +12104 0.209224784 +12272 0.205242726 +12442 0.201337338 +12615 0.197485581 +12791 0.193688352 +12968 0.189987582 +13149 0.186320223 +13331 0.182746745 +13517 0.179207798 +13704 0.175760025 +13895 0.172347564 +14088 0.169006431 +14284 0.16571867 +14482 0.162500394 +14684 0.159319127 +14888 0.156206361 +15095 0.15314602 +15304 0.150152067 +15517 0.147195654 +15733 0.144291079 +15951 0.141450859 +16173 0.138648579 +16398 0.135897078 +16626 0.13319591 +16857 0.130544597 +17091 0.127942625 +17329 0.125378846 +17569 0.122874232 +17814 0.120397336 +18061 0.117978334 +18312 0.11559695 +18567 0.113253383 +18825 0.110956527 +19086 0.108705627 +19351 0.106491697 +19620 0.10431474 +19893 0.102174711 +20170 0.100071512 +20450 0.098012246 +20734 0.095989036 +21022 0.094001686 +21314 0.092049962 +21611 0.090127227 +21911 0.088246133 +22215 0.086399777 +22524 0.084582024 +22837 0.082798661 +23154 0.081049281 +23476 0.079328201 +23803 0.077635481 +24133 0.075981004 +24469 0.074349473 +24809 0.072750562 +25154 0.071179264 +25503 0.069639815 +25858 0.068123257 +26217 0.066637982 +26581 0.065179469 +26951 0.063743695 +27325 0.062338194 +27705 0.060955196 +28090 0.059598245 +28480 0.05826705 +28876 0.056958052 +29277 0.055674392 +29684 0.05441268 +30097 0.053172856 +30515 0.051957694 +30939 0.050764042 +31369 0.049591775 +31805 0.048440746 +32247 0.04731079 +32695 0.046201726 +33150 0.045110995 +33610 0.044043178 +34077 0.0429934 +34551 0.041961634 +35031 0.040949903 +35518 0.039955929 +36012 0.038979626 +36512 0.038022771 +37020 0.037081415 +37534 0.036159131 +38056 0.035252179 +38585 0.034362218 +39121 0.033489069 +39664 0.032632547 +40216 0.031789446 +40775 0.030962758 +41341 0.030152262 +41916 0.029355 +42498 0.02857364 +43089 0.027805377 +43688 0.027051443 +44295 0.026311696 +44910 0.025585982 +45535 0.024871892 +46167 0.024172739 +46809 0.023485073 +47460 0.022809933 +48119 0.022148207 +48788 0.021497779 +49466 0.020859551 +50153 0.020233397 +50850 0.019618312 +51557 0.019014239 +52274 0.018421107 +53000 0.017839625 +53737 0.017268101 +54483 0.016707989 +55241 0.016156966 +56008 0.015617136 +56787 0.015086298 +57576 0.014565754 +58376 0.014054739 +59187 0.013553176 +60010 0.013060388 +60844 0.012576908 +61689 0.012102636 +62547 0.011636394 +63416 0.011179208 +64297 0.010730458 +65191 0.010289583 +66097 0.009857018 +67015 0.009432673 +67947 0.009015574 +68891 0.008606559 +69848 0.008205111 +70819 0.007810761 +71803 0.007423859 +72801 0.00704395 +73813 0.006670984 +74839 0.006304906 +75879 0.005945654 +76933 0.005593161 +78002 0.005247038 +79086 0.00490724 +80186 0.004573417 +81300 0.00424612 +82430 0.0039247 +83575 0.003609391 +84737 0.003299597 +85914 0.002995804 +87108 0.002697444 +88319 0.002404482 +89546 0.00211711 +90791 0.001834818 +92053 0.001557795 +93332 0.001285991 +94629 0.001019147 +95944 0.000757224 +97277 0.000500179 +98629 0.000247782 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/gcrZ=8.txt b/examples/advanced/radioprotection/gcrZ=8.txt new file mode 100644 index 0000000000..ee6e72e006 --- /dev/null +++ b/examples/advanced/radioprotection/gcrZ=8.txt @@ -0,0 +1,837 @@ +1.0023 11.05592056 +1.0162 11.0557178 +1.0304 11.05551074 +1.0447 11.05530236 +1.0592 11.05509126 +1.0739 11.0548775 +1.0888 11.05466115 +1.104 11.05444082 +1.1193 11.05421947 +1.1349 11.05399429 +1.1506 11.05376821 +1.1666 11.05353844 +1.1828 11.05330647 +1.1993 11.05307097 +1.2159 11.05283484 +1.2328 11.05259532 +1.25 11.0523525 +1.2674 11.05210786 +1.285 11.05186149 +1.3028 11.05161345 +1.3209 11.05136244 +1.3393 11.05110855 +1.3579 11.05085325 +1.3768 11.05059524 +1.3959 11.05033598 +1.4153 11.0500742 +1.435 11.04981 +1.4549 11.04954479 +1.4751 11.04927735 +1.4956 11.04900775 +1.5164 11.04873611 +1.5375 11.04846252 +1.5589 11.04818709 +1.5805 11.04791117 +1.6025 11.04763232 +1.6248 11.04735191 +1.6473 11.04707128 +1.6702 11.04678804 +1.6934 11.04650352 +1.717 11.04621662 +1.7408 11.04592986 +1.765 11.04564091 +1.7896 11.0453499 +1.8144 11.04505928 +1.8397 11.04476449 +1.8652 11.04446064 +1.8911 11.04413752 +1.9174 11.04379415 +1.9441 11.04342953 +1.9711 11.04304407 +1.9985 11.04263538 +2.0263 11.04220238 +2.0544 11.0417456 +2.083 11.04126067 +2.1119 11.04074982 +2.1413 11.04020832 +2.171 11.03963866 +2.2012 11.03903577 +2.2318 11.0384003 +2.2628 11.03773096 +2.2942 11.03702649 +2.3261 11.03628322 +2.3585 11.03549958 +2.3912 11.03467908 +2.4245 11.03381272 +2.4582 11.03290409 +2.4923 11.03195185 +2.527 11.03094877 +2.5621 11.02989899 +2.5977 11.02879801 +2.6338 11.02764419 +2.6704 11.02643587 +2.7075 11.02517142 +2.7451 11.0238492 +2.7833 11.0224639 +2.822 11.02101738 +2.8612 11.01950804 +2.9009 11.01793432 +2.9412 11.01629053 +2.9821 11.01457483 +3.0236 11.01278537 +3.0656 11.01092487 +3.1082 11.0089873 +3.1514 11.00697096 +3.1952 11.00487419 +3.2396 11.00269538 +3.2846 11.00043299 +3.3303 10.99808031 +3.3765 10.99564622 +3.4235 10.9931134 +3.471 10.99049655 +3.5193 10.98777778 +3.5682 10.98496689 +3.6178 10.98205694 +3.6681 10.97904666 +3.719 10.97594103 +3.7707 10.9727268 +3.8231 10.96940906 +3.8762 10.96598698 +3.9301 10.96245323 +3.9847 10.95881362 +4.0401 10.95506086 +4.0963 10.9511943 +4.1532 10.94722049 +4.2109 10.94313225 +4.2694 10.93892935 +4.3288 10.93460444 +4.3889 10.93017216 +4.4499 10.92561806 +4.5118 10.92094227 +4.5745 10.91615283 +4.638 10.9112505 +4.7025 10.90622051 +4.7678 10.90107934 +4.8341 10.89581228 +4.9013 10.89042841 +4.9694 10.88492912 +5.0385 10.87930785 +5.1085 10.8735744 +5.1795 10.86772246 +5.2515 10.86175401 +5.3244 10.85567954 +5.3984 10.84948476 +5.4735 10.84317207 +5.5495 10.83676099 +5.6266 10.83023754 +5.7048 10.8236047 +5.7841 10.81686563 +5.8645 10.81002368 +5.946 10.80308234 +6.0286 10.7960453 +6.1124 10.78890787 +6.1974 10.78167402 +6.2835 10.77435642 +6.3708 10.76695083 +6.4594 10.75945323 +6.5491 10.75188513 +6.6401 10.74423432 +6.7324 10.7365057 +6.826 10.7287043 +6.9209 10.72083522 +7.017 10.71291191 +7.1146 10.70491502 +7.2134 10.69687456 +7.3137 10.68877164 +7.4153 10.6806281 +7.5184 10.67243361 +7.6229 10.664202 +7.7288 10.65593903 +7.8362 10.64764283 +7.9451 10.63931942 +8.0555 10.63097483 +8.1675 10.62260767 +8.281 10.61423153 +8.3961 10.60584512 +8.5128 10.59745464 +8.6311 10.58906621 +8.751 10.58068591 +8.8726 10.57231286 +8.9959 10.56395328 +9.1209 10.55561326 +9.2477 10.54729229 +9.3762 10.53900296 +9.5065 10.53074473 +9.6386 10.52252353 +9.7726 10.51433908 +9.9084 10.50620329 +10.046 10.49812159 +10.186 10.49006508 +10.327 10.48211902 +10.471 10.47417631 +10.616 10.46635264 +10.764 10.45854527 +10.913 10.45086465 +11.065 10.44321241 +11.219 10.43564519 +11.375 10.42816724 +11.533 10.42078255 +11.693 10.41349489 +11.856 10.40626399 +12.02 10.39918183 +12.187 10.39216502 +12.357 10.38521977 +12.529 10.37839115 +12.703 10.37168133 +12.879 10.36509226 +13.058 10.35858986 +13.24 10.35217885 +13.424 10.34589725 +13.61 10.33974595 +13.799 10.33369412 +13.991 10.32774528 +14.186 10.32190266 +14.383 10.31619761 +14.583 10.3106023 +14.785 10.30514563 +14.991 10.2997756 +15.199 10.29454616 +15.41 10.28943228 +15.625 10.28441231 +15.842 10.27953392 +16.062 10.27477404 +16.285 10.27013315 +16.511 10.26561149 +16.741 10.26119024 +16.973 10.25690763 +17.209 10.25272627 +17.449 10.2486477 +17.691 10.24470504 +17.937 10.24086464 +18.186 10.23714189 +18.439 10.2335214 +18.695 10.23001685 +18.955 10.22661373 +19.218 10.22332415 +19.485 10.22013444 +19.756 10.2170441 +20.031 10.21405246 +20.309 10.21116879 +20.591 10.20838098 +20.878 10.20567869 +21.168 10.2030795 +21.462 10.20057234 +21.76 10.19815569 +22.063 10.19582042 +22.369 10.19358021 +22.68 10.19141857 +22.995 10.18934109 +23.315 10.1873397 +23.639 10.18541909 +23.967 10.18357714 +24.3 10.18180652 +24.638 10.18010589 +24.981 10.17847382 +25.328 10.17691317 +25.68 10.17541751 +26.037 10.17398524 +26.398 10.17261836 +26.765 10.17130763 +27.137 10.17002172 +27.514 10.16871656 +27.897 10.16737899 +28.284 10.16601544 +28.678 10.16461473 +29.076 10.16318691 +29.48 10.16172423 +29.89 10.16022598 +30.305 10.15869518 +30.726 10.15712748 +31.153 10.15552215 +31.586 10.15387845 +32.025 10.15219566 +32.47 10.150473 +32.922 10.14870579 +33.379 10.14690107 +33.843 10.14505015 +34.313 10.14315617 +34.79 10.14121422 +35.274 10.13922337 +35.764 10.13718683 +36.261 10.13509956 +36.765 10.13296057 +37.276 10.13076889 +37.794 10.1285235 +38.319 10.1262234 +38.852 10.12386313 +39.392 10.121446 +39.939 10.11897098 +40.494 10.11643243 +41.057 10.11382914 +41.628 10.11115989 +42.206 10.10842821 +42.793 10.10562341 +43.387 10.10275379 +43.99 10.09980846 +44.602 10.09678597 +45.221 10.09369495 +45.85 10.09051905 +46.487 10.08726691 +47.133 10.08393206 +47.788 10.08051304 +48.452 10.07700836 +49.126 10.0734112 +49.808 10.06973074 +50.501 10.06594922 +51.202 10.06208142 +51.914 10.05810922 +52.635 10.0540421 +53.367 10.04986709 +54.109 10.04558813 +54.861 10.04120353 +55.623 10.03671163 +56.396 10.03210476 +57.18 10.02738104 +57.974 10.02254475 +58.78 10.01758184 +59.597 10.01249652 +60.425 10.00728695 +61.265 10.00194491 +62.116 9.996474831 +62.98 9.990861841 +63.855 9.985116934 +64.742 9.979231662 +65.642 9.973197316 +66.554 9.967018544 +67.479 9.960686536 +68.417 9.954199171 +69.368 9.947554351 +70.332 9.940750004 +71.309 9.933784088 +72.3 9.926647349 +73.305 9.91933759 +74.324 9.911852648 +75.357 9.904190393 +76.404 9.896348736 +77.466 9.888318031 +78.543 9.880096056 +79.634 9.871688375 +80.741 9.86307745 +81.863 9.854268873 +83.001 9.845252662 +84.154 9.836034666 +85.324 9.826596773 +86.509 9.816953053 +87.712 9.807076992 +88.931 9.796982868 +90.166 9.786668823 +91.42 9.776107705 +92.69 9.765322757 +93.978 9.754295161 +95.284 9.743022956 +96.608 9.73150427 +97.951 9.719728523 +99.312 9.707702692 +100.69 9.695434127 +102.09 9.682876522 +103.51 9.670045837 +104.95 9.656940402 +106.41 9.643558663 +107.89 9.629899182 +109.39 9.615960643 +110.91 9.601741849 +112.45 9.587241728 +114.01 9.572459332 +115.59 9.557393843 +117.2 9.54194835 +118.83 9.526217375 +120.48 9.510200523 +122.16 9.493799638 +123.85 9.47720984 +125.57 9.460234839 +127.32 9.442873245 +129.09 9.425223835 +130.88 9.407287096 +132.7 9.388962737 +134.55 9.370250146 +136.42 9.351250743 +138.31 9.331965642 +140.23 9.312293431 +142.18 9.292234289 +144.16 9.27178862 +146.16 9.251060864 +148.19 9.229948761 +150.25 9.208453331 +152.34 9.186575817 +154.46 9.164317681 +156.6 9.141786035 +158.78 9.118772193 +160.99 9.095383411 +163.23 9.071622017 +165.49 9.047596963 +167.79 9.023098377 +170.13 8.99812861 +172.49 8.97290424 +174.89 8.947214902 +177.32 8.921170993 +179.78 8.894776301 +182.28 8.867927367 +184.81 8.840735637 +187.38 8.813097934 +189.99 8.785018709 +192.63 8.756610301 +195.3 8.727877696 +198.02 8.698610867 +200.77 8.669030428 +203.56 8.639034433 +206.39 8.608628785 +209.26 8.577819624 +212.16 8.546720493 +215.11 8.515123494 +218.1 8.483142723 +221.13 8.450785182 +224.21 8.417951571 +227.32 8.384862486 +230.48 8.351312738 +233.69 8.317310812 +236.93 8.283076498 +240.23 8.248301365 +243.56 8.21331024 +246.95 8.177796802 +250.38 8.141980119 +253.86 8.105765012 +257.39 8.069161421 +260.97 8.032179467 +264.59 7.99493212 +268.27 7.957224028 +272 7.919168877 +275.78 7.880777383 +279.61 7.842060377 +283.5 7.802928447 +287.44 7.763493988 +291.43 7.723768142 +295.48 7.683663358 +299.59 7.643192568 +303.75 7.602466434 +307.97 7.56139932 +312.25 7.520004426 +316.59 7.478295025 +320.99 7.436284449 +325.45 7.393986066 +329.98 7.351319414 +334.56 7.308486281 +339.21 7.275489252 +343.92 7.242850777 +348.7 7.209928969 +353.55 7.176731968 +358.46 7.143336026 +363.45 7.109613444 +368.5 7.075707517 +373.62 7.041558589 +378.81 7.007175254 +384.07 6.972565901 +389.41 6.937673353 +394.82 6.902571961 +400.31 6.867205628 +405.87 6.831647635 +411.51 6.795843293 +417.23 6.759802102 +423.03 6.72353331 +428.91 6.687046235 +434.87 6.650350261 +440.92 6.613394109 +447.04 6.576309479 +453.26 6.538924682 +459.56 6.501370587 +465.94 6.463656573 +472.42 6.425674846 +478.98 6.387553128 +485.64 6.349185751 +492.39 6.310641445 +499.23 6.271930893 +506.17 6.23300596 +513.2 6.193933975 +520.34 6.154617655 +527.57 6.115178239 +534.9 6.075572655 +542.33 6.035812106 +549.87 5.995854837 +557.51 5.955766077 +565.26 5.915504749 +573.11 5.875134672 +581.08 5.834565419 +589.16 5.793860884 +597.34 5.75308295 +605.64 5.712143491 +614.06 5.671056101 +622.6 5.629833927 +631.25 5.588537378 +640.02 5.547130853 +648.91 5.505627021 +657.93 5.463992393 +667.08 5.422241217 +676.35 5.380431802 +685.75 5.338531702 +695.28 5.296554625 +704.94 5.25451317 +714.74 5.212377457 +724.67 5.170204102 +734.74 5.127963649 +744.95 5.085670179 +755.3 5.043337152 +765.8 5.000937601 +776.44 4.95852579 +787.23 4.91607507 +798.17 4.873599098 +809.27 4.831073139 +820.51 4.788587962 +831.92 4.746044123 +843.48 4.703529911 +855.2 4.661021646 +867.09 4.618497745 +879.14 4.576008571 +891.35 4.533566734 +903.74 4.49111689 +916.3 4.448707862 +929.03 4.40635286 +941.95 4.363999388 +955.04 4.321726902 +968.31 4.279517122 +981.77 4.237352326 +995.41 4.195276984 +1009.2 4.153395479 +1023.3 4.111238911 +1037.5 4.069449624 +1051.9 4.027743264 +1066.5 3.986133447 +1081.3 3.944633581 +1096.4 3.902981024 +1111.6 3.86174046 +1127.1 3.820381112 +1142.7 3.779448311 +1158.6 3.738429571 +1174.7 3.697598441 +1191 3.656965842 +1207.6 3.616298415 +1224.4 3.575854893 +1241.4 3.53564543 +1258.6 3.49567994 +1276.1 3.455739865 +1293.9 3.415842812 +1311.8 3.37644518 +1330.1 3.336898469 +1348.6 3.297651412 +1367.3 3.258712309 +1386.3 3.219882674 +1405.6 3.181177923 +1425.1 3.142809869 +1444.9 3.104590424 +1465 3.066532733 +1485.3 3.028836394 +1506 2.991142367 +1526.9 2.953826827 +1548.1 2.916719248 +1569.7 2.879660452 +1591.5 2.843004352 +1613.6 2.806588469 +1636 2.770422717 +1658.7 2.734516595 +1681.8 2.698724242 +1705.2 2.663212461 +1728.9 2.627990824 +1752.9 2.593067164 +1777.3 2.558305033 +1802 2.523856869 +1827 2.489730619 +1852.4 2.455798823 +1878.1 2.422202177 +1904.2 2.388819494 +1930.7 2.355662694 +1957.5 2.32286405 +1984.7 2.290306262 +2012.3 2.257999703 +2040.3 2.225954102 +2068.6 2.194288467 +2097.4 2.162787704 +2126.5 2.131678138 +2156.1 2.100752968 +2186.1 2.070125766 +2216.4 2.039902607 +2247.2 2.009889824 +2278.5 1.980097662 +2310.1 1.950721497 +2342.2 1.921580057 +2374.8 1.892689513 +2407.8 1.864144282 +2441.3 1.835855953 +2475.2 1.807914429 +2509.6 1.780242011 +2544.5 1.752845057 +2579.8 1.725806149 +2615.7 1.698977917 +2652 1.672515135 +2688.9 1.646276514 +2726.2 1.620408899 +2764.1 1.59477765 +2802.5 1.569455643 +2841.5 1.544382027 +2881 1.519625856 +2921 1.495189736 +2961.6 1.471016455 +3002.8 1.447111113 +3044.5 1.423534757 +3086.8 1.400233802 +3129.7 1.377212117 +3173.2 1.354473254 +3217.3 1.332020455 +3262 1.309856418 +3307.4 1.287935528 +3353.3 1.266356756 +3399.9 1.245027936 +3447.2 1.223952865 +3495.1 1.203178659 +3543.6 1.182706445 +3592.9 1.162454708 +3642.8 1.142508543 +3693.5 1.122790375 +3744.8 1.103380135 +3796.8 1.084240547 +3849.6 1.065337196 +3903.1 1.046708349 +3957.3 1.028354969 +4012.3 1.010244597 +4068.1 0.992379669 +4124.6 0.974793535 +4181.9 0.957455572 +4240.1 0.940337555 +4299 0.92349965 +4358.7 0.906913632 +4419.3 0.890553208 +4480.7 0.874446361 +4543 0.858567679 +4606.1 0.842943709 +4670.1 0.827549901 +4735.1 0.812363691 +4800.9 0.797432865 +4867.6 0.782734269 +4935.2 0.768268022 +5003.8 0.754013782 +5073.3 0.739992939 +5143.9 0.726165876 +5215.3 0.71259104 +5287.8 0.699211437 +5361.3 0.686046246 +5435.8 0.673095613 +5511.4 0.660342384 +5588 0.647803213 +5665.6 0.635478277 +5744.3 0.623351512 +5824.2 0.61140784 +5905.1 0.599676592 +5987.2 0.588128693 +6070.4 0.576778653 +6154.8 0.565612385 +6240.3 0.554642757 +6327 0.543856171 +6414.9 0.533252355 +6504.1 0.522819456 +6594.5 0.512569208 +6686.1 0.502500916 +6779 0.49260292 +6873.3 0.482864559 +6968.8 0.47330605 +7065.6 0.463916542 +7163.8 0.454685926 +7263.4 0.445613957 +7364.3 0.436709083 +7466.7 0.427953156 +7570.4 0.419362682 +7675.6 0.410920335 +7782.3 0.402625783 +7890.5 0.394478542 +8000.1 0.386485338 +8111.3 0.378630948 +8224 0.370921848 +8338.3 0.363350551 +8454.2 0.355916513 +8571.7 0.34861902 +8690.8 0.341457326 +8811.6 0.334424778 +8934.1 0.327520776 +9058.2 0.320750163 +9184.1 0.314101274 +9311.7 0.307578681 +9441.2 0.301171629 +9572.4 0.294889363 +9705.4 0.288726166 +9840.3 0.282676755 +9977 0.27674486 +10116 0.270908497 +10256 0.26522085 +10399 0.259600113 +10543 0.254124218 +10690 0.248716393 +10838 0.243449469 +10989 0.23825143 +11142 0.233156973 +11297 0.228165082 +11454 0.223274795 +11613 0.218485039 +11774 0.213794634 +11938 0.209174312 +12104 0.204651986 +12272 0.20022645 +12442 0.195896418 +12615 0.191636004 +12791 0.187445615 +12968 0.183371358 +13149 0.179343552 +13331 0.175428386 +13517 0.171560646 +13704 0.167801895 +13895 0.164091018 +14088 0.160466796 +14284 0.156909534 +14482 0.153437222 +14684 0.150014398 +14888 0.146673811 +15095 0.143398243 +15304 0.140273642 +15517 0.137511729 +15733 0.134798245 +15951 0.132144881 +16173 0.129526962 +16398 0.12695648 +16626 0.124433022 +16857 0.121956137 +17091 0.119525347 +17329 0.117130238 +17569 0.114790401 +17814 0.112476458 +18061 0.110216602 +18312 0.107991888 +18567 0.105802503 +18825 0.103656756 +19086 0.101553941 +19351 0.099485664 +19620 0.097451929 +19893 0.09545269 +20170 0.09348786 +20450 0.091564072 +20734 0.089673968 +21022 0.087817364 +21314 0.085994043 +21611 0.084197804 +21911 0.082440466 +22215 0.080715581 +22524 0.079017418 +22837 0.07735138 +23154 0.075717091 +23476 0.07410924 +23803 0.072527883 +24133 0.070982254 +24469 0.069458061 +24809 0.067964341 +25154 0.066496418 +25503 0.065058248 +25858 0.063641464 +26217 0.062253905 +26581 0.060891346 +26951 0.059550031 +27325 0.058236997 +27705 0.056944986 +28090 0.055677308 +28480 0.054433691 +28876 0.053210812 +29277 0.052011603 +29684 0.050832899 +30097 0.049674642 +30515 0.048539425 +30939 0.047424303 +31369 0.046329158 +31805 0.045253855 +32247 0.044198238 +32695 0.043162139 +33150 0.042143166 +33610 0.0411456 +34077 0.040164887 +34551 0.039201 +35031 0.038255831 +35518 0.03732725 +36012 0.036415177 +36512 0.035521273 +37020 0.034641848 +37534 0.033780241 +38056 0.032932957 +38585 0.032101545 +39121 0.031285841 +39664 0.030485669 +40216 0.029698035 +40775 0.028925735 +41341 0.028168561 +41916 0.02742375 +42498 0.026693795 +43089 0.025976076 +43688 0.025271743 +44295 0.024580663 +44910 0.023902694 +45535 0.023235583 +46167 0.022582427 +46809 0.021940003 +47460 0.021309279 +48119 0.020691088 +48788 0.020083452 +49466 0.019487212 +50153 0.018902252 +50850 0.018327634 +51557 0.017763302 +52274 0.017209193 +53000 0.016665966 +53737 0.016132042 +54483 0.015608779 +55241 0.015094008 +56008 0.014589693 +56787 0.014093778 +57576 0.01360748 +58376 0.013130085 +59187 0.01266152 +60010 0.012201152 +60844 0.01174948 +61689 0.01130641 +62547 0.010870842 +63416 0.010443734 +64297 0.010024507 +65191 0.009612637 +66097 0.00920853 +67015 0.008812102 +67947 0.008422444 +68891 0.008040338 +69848 0.007665301 +70819 0.007296895 +71803 0.006935448 +72801 0.006580533 +73813 0.006232104 +74839 0.00589011 +75879 0.005554493 +76933 0.00522519 +78002 0.004901839 +79086 0.004584395 +80186 0.004272534 +81300 0.00396677 +82430 0.003666496 +83575 0.003371931 +84737 0.003082518 +85914 0.002798712 +87108 0.00251998 +88319 0.002246292 +89546 0.001977827 +90791 0.001714106 +92053 0.001455309 +93332 0.001201386 +94629 0.000952098 +95944 0.000707407 +97277 0.000467273 +98629 0.000231481 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/include/G4IonC12.hh b/examples/advanced/radioprotection/include/G4IonC12.hh new file mode 100644 index 0000000000..4270bdc5ce --- /dev/null +++ b/examples/advanced/radioprotection/include/G4IonC12.hh @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonC12.hh,v 1.1 2004/05/14 12:29:32 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ------------------------------------------------------------ +// GEANT 4 class header file +// +// History: first implementation, based on object model of +// 4-th April 1996, G.Cosmo +// **************************************************************** +// Added particle definitions, H.Kurashige, 19 April 1996 +// Revised, G.Cosmo, 6 June 1996 +// Added not static GetEnergyCuts() and GetLengthCuts(), G.Cosmo, 11 July 1996 +// ---------------------------------------------------------------- + +// Class Description: +// The new ion C12+ is defined as G4VIon. +// Each class inheriting from G4VIon +// corresponds to a particle type; one and only one +// instance for each class is guaranteed. +// Class Description - end + + +#ifndef G4IonC12_h +#define G4IonC12_h 1 + +#include "globals.hh" +#include "G4ios.hh" +#include "G4VIon.hh" + +// ###################################################################### +// ### IonC12 ### +// ###################################################################### + +class G4IonC12 : public G4VIon +{ + private: + static G4IonC12 theIonC12; + +public: // Without description + + G4IonC12( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable + ); + virtual ~G4IonC12(); + + static G4IonC12* IonC12Definition(); + static G4IonC12* IonC12(); + +}; + +#endif diff --git a/examples/advanced/radioprotection/include/G4IonFe52.hh b/examples/advanced/radioprotection/include/G4IonFe52.hh new file mode 100644 index 0000000000..1654283b74 --- /dev/null +++ b/examples/advanced/radioprotection/include/G4IonFe52.hh @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonFe52.hh,v 1.1 2004/05/14 12:29:32 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ------------------------------------------------------------ +// GEANT 4 class header file +// +// History: first implementation, based on object model of +// 4-th April 1996, G.Cosmo +// **************************************************************** +// Added particle definitions, H.Kurashige, 19 April 1996 +// Revised, G.Cosmo, 6 June 1996 +// Added not static GetEnergyCuts() and GetLengthCuts(), G.Cosmo, 11 July 1996 +// ---------------------------------------------------------------- + +// Class Description: +// The new ion Fe52+ is defined as G4VIon. +// Each class inheriting from G4VIon +// corresponds to a particle type; one and only one +// instance for each class is guaranteed. +// Class Description - end + + +#ifndef G4IonFe52_h +#define G4IonFe52_h 1 + +#include "globals.hh" +#include "G4ios.hh" +#include "G4VIon.hh" + +// ###################################################################### +// ### IonFe52 ### +// ###################################################################### + +class G4IonFe52 : public G4VIon +{ + private: + static G4IonFe52 theIonFe52; + +public: // Without description + + G4IonFe52( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable + ); + virtual ~G4IonFe52(); + + static G4IonFe52* IonFe52Definition(); + static G4IonFe52* IonFe52(); + +}; + +#endif diff --git a/examples/advanced/radioprotection/include/G4IonO16.hh b/examples/advanced/radioprotection/include/G4IonO16.hh new file mode 100644 index 0000000000..c9cd2a0368 --- /dev/null +++ b/examples/advanced/radioprotection/include/G4IonO16.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef G4IonO16_h +#define G4IonO16_h 1 + +#include "globals.hh" +#include "G4ios.hh" +#include "G4VIon.hh" + +// ###################################################################### +// ### IonO16 ### +// ###################################################################### + +class G4IonO16 : public G4VIon +{ + private: + static G4IonO16 theIonO16; + +public: + + G4IonO16( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable + ); + virtual ~G4IonO16(); + + static G4IonO16* IonO16Definition(); + static G4IonO16* IonO16(); +}; + +#endif diff --git a/examples/advanced/radioprotection/include/G4IonSi28.hh b/examples/advanced/radioprotection/include/G4IonSi28.hh new file mode 100644 index 0000000000..530be85d36 --- /dev/null +++ b/examples/advanced/radioprotection/include/G4IonSi28.hh @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonSi28.hh,v 1.1 2004/05/14 12:29:32 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ------------------------------------------------------------ +// GEANT 4 class header file +// +// History: first implementation, based on object model of +// 4-th April 1996, G.Cosmo +// **************************************************************** +// Added particle definitions, H.Kurashige, 19 April 1996 +// Revised, G.Cosmo, 6 June 1996 +// Added not static GetEnergyCuts() and GetLengthCuts(), G.Cosmo, 11 July 1996 +// ---------------------------------------------------------------- + +// Class Description: +// The new ion Si28+ is defined as G4VIon. +// Each class inheriting from G4VIon +// corresponds to a particle type; one and only one +// instance for each class is guaranteed. +// Class Description - end + + +#ifndef G4IonSi28_h +#define G4IonSi28_h 1 + +#include "globals.hh" +#include "G4ios.hh" +#include "G4VIon.hh" + +// ###################################################################### +// ### IonSi28 ### +// ###################################################################### + +class G4IonSi28 : public G4VIon +{ + private: + static G4IonSi28 theIonSi28; + +public: // Without description + + G4IonSi28( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable + ); + virtual ~G4IonSi28(); + + static G4IonSi28* IonSi28Definition(); + static G4IonSi28* IonSi28(); + +}; + +#endif diff --git a/examples/advanced/radioprotection/include/RemSimAnalysisManager.hh b/examples/advanced/radioprotection/include/RemSimAnalysisManager.hh new file mode 100644 index 0000000000..6d6521ed5e --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimAnalysisManager.hh @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ********************************** +// * * +// * RemSimAnalysisManager.hh * +// * * +// ********************************** +// +// $Id: RemSimAnalysisManager.hh,v 1.5 2004/05/22 12:57:04 guatelli Exp $ +// +// Author: Susanna Guatelli (guatelli@ge.infn.it) +// + +#ifdef G4ANALYSIS_USE +#ifndef REMSIMANALYSISMANAGER_HH +#define REMSIMANALYSISMANAGER_HH + +#include "globals.hh" +#include +#include "G4ThreeVector.hh" +# include + +namespace AIDA +{ + class ITree; + class IHistogramFactory; + class IAnalysisFactory; + class IDataPoint; + class ITupleFactory; + class ITuple; + class ITreeFactory; +}; + +class RemSimAnalysisManager { + +public: + + ~RemSimAnalysisManager(); + static RemSimAnalysisManager* getInstance(); + void book(); // booking the hbook file + + void energyDepositStore(G4int, G4double); + // Collect the energy deposit in the phantom + + void primaryParticleEnergyDistribution(G4double); + // Initail energy of primary particles + + void SecondaryEnergyDeposit(G4int, G4double); + // Energy deposit given by secondary particles in the phantom + + void PrimaryInitialEnergyIn(G4double); + // Initial energy of primary particles impinging on the phantom + + void PrimaryInitialEnergyOut(G4double); + // Initial energy of primary particles outgoing the phantom + + void PrimaryEnergyIn(G4double); + // Energy of primary particles impinging on the phantom + + void PrimaryEnergyOut(G4double); + // Energy of primary particles outgoing the phantom + + void finish(); + +private: + + static RemSimAnalysisManager* instance; + RemSimAnalysisManager(); + + AIDA::IAnalysisFactory* aFact; + AIDA::ITreeFactory* treeFact; + AIDA::ITree* theTree; + + AIDA::IDataPointSetFactory * dataPointFactory; + AIDA::IHistogramFactory* histogramFactory; + + AIDA::IDataPointSet * dataPoint; + AIDA::IHistogram1D* energyDeposit; + AIDA::IHistogram1D* primary; + AIDA::IHistogram1D* secondaryDeposit; + AIDA::IHistogram1D* primaryInitialE; + AIDA::IHistogram1D* primaryInitialEout; + AIDA::IHistogram1D* initialE; + AIDA::IHistogram1D* initialEout; +}; +#endif +#endif + + + + diff --git a/examples/advanced/radioprotection/include/RemSimAstronautDecorator.hh b/examples/advanced/radioprotection/include/RemSimAstronautDecorator.hh new file mode 100644 index 0000000000..3710d0e186 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimAstronautDecorator.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ********************************** +// * * +// * RemSimAstronautDecorator.hh * +// * * +// ********************************** +// +// $Id: RemSimAstronautDecorator.hh,v 1.6 2004/05/22 12:57:04 guatelli Exp $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it + +#ifndef RemSimAstronautDecorator_h +#define RemSimAstronautDecorator_h 1 + +#include "RemSimDecorator.hh" +#include "RemSimVGeometryComponent.hh" +#include "globals.hh" +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class RemSimVGeometryComponent; +class RemSimDecorator; +class G4VPhysicalVolume; +class G4VisAttributes; + +class RemSimAstronautDecorator: public RemSimDecorator +{ +public: + RemSimAstronautDecorator(RemSimVGeometryComponent*); + ~RemSimAstronautDecorator(); + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + void ChangeThickness(G4double); + void PrintDetectorParameters(); + G4VPhysicalVolume* GetShelter(){return 0;}; + void ChangeMother(G4VPhysicalVolume*); + +private: + void ConstructAstronaut(G4VPhysicalVolume*); + G4Box* phantom; + G4LogicalVolume* phantomLog; + G4VPhysicalVolume* phantomPhys; + G4VPhysicalVolume* motherAstronaut; + G4bool flag; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimBasicGenerator.hh b/examples/advanced/radioprotection/include/RemSimBasicGenerator.hh new file mode 100644 index 0000000000..cea5005adf --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimBasicGenerator.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ********************************** +// * * +// * RemSimBasicGenerator.hh * +// * * +// ********************************** +// +// $Id: RemSimBasicGenerator.hh,v 1.7 2004/05/27 10:33:11 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it + +#ifndef RemSimBasicGenerator_h +#define RemSimBasicGenerator_h 1 + +#include "RemSimVPrimaryGeneratorFactory.hh" +#include "globals.hh" +#include "G4DataVector.hh" +class G4ParticleGun; +class G4Event; +class RemSimRunAction; + +class RemSimBasicGenerator : public RemSimVPrimaryGeneratorFactory +{ +public: + RemSimBasicGenerator(); + ~RemSimBasicGenerator(); + +public: + void GeneratePrimaries(G4Event* anEvent); + G4double GetInitialEnergy(); + void SetMoon(G4bool){;}; + +private: + G4ParticleGun* particleGun; + G4String randomDirection; + G4String spectrum; + G4double energy; + RemSimRunAction* run; +}; +#endif + + diff --git a/examples/advanced/radioprotection/include/RemSimDecay.hh b/examples/advanced/radioprotection/include/RemSimDecay.hh new file mode 100644 index 0000000000..94021aad84 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimDecay.hh @@ -0,0 +1,56 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ************************ +// * * +// * RemSimDecay.hh * +// * * +// ************************ +// +// $Id: RemSimDecay.hh,v 1.2 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef REMSIMDECAY_HH +#define REMSIMDECAY_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" +#include "G4Decay.hh" + +class RemSimDecay : public G4VPhysicsConstructor { + +public: + + RemSimDecay(const G4String& name = "decay"); + + virtual ~RemSimDecay(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + + virtual void ConstructProcess(); +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimDecorator.hh b/examples/advanced/radioprotection/include/RemSimDecorator.hh new file mode 100644 index 0000000000..b31aeaa367 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimDecorator.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// *************************** +// * * +// * RemSimDecorator.hh * +// * * +// *************************** +// +// $Id: RemSimDecorator.hh,v 1.7 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimDecorator_h +#define RemSimDecorator_h 1 + +#include "RemSimVGeometryComponent.hh" + +class G4VPhysicalVolume; +class RemSimVGeometryComponent; + +class RemSimDecorator: public RemSimVGeometryComponent +{ +public: + RemSimDecorator(RemSimVGeometryComponent*); + ~RemSimDecorator(); + + virtual void ConstructComponent(G4VPhysicalVolume*); + virtual void DestroyComponent(); + virtual void ChangeThickness(G4double) = 0; + virtual void ChangeMother(G4VPhysicalVolume*) = 0; + +private: + RemSimVGeometryComponent* component; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimDetectorConstruction.hh b/examples/advanced/radioprotection/include/RemSimDetectorConstruction.hh new file mode 100644 index 0000000000..ac2bc5a928 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimDetectorConstruction.hh @@ -0,0 +1,85 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ************************************** +// * * +// * RemSimDetectorConstruction.hh * +// * * +// ************************************** +// +// $Id: RemSimDetectorConstruction.hh,v 1.10 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimDetectorConstruction_H +#define RemSimDetectorConstruction_H 1 + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" + +class G4LogicalVolume; +class G4VPhysicalVolume; +class RemSimMaterial; +class RemSimDetectorMessenger; +class G4Box; +class G4VisAttributes; +class RemSimVGeometryComponent; +class RemSimDecorator; +class RemSimDetectorConstruction : public G4VUserDetectorConstruction +{ +public: + + RemSimDetectorConstruction(); + ~RemSimDetectorConstruction(); + + G4VPhysicalVolume* Construct(); + + void ConstructVolume(); + void AddShielding(G4String); + void AddShelterSPE(G4String); + void AddHabitatRoof(G4String); + void ChangeShieldingThickness(G4double); + void ChangeRoofThickness(G4double); + void ChooseConfiguration(G4String); + +private: + + G4LogicalVolume* experimentalHall_log; + G4VPhysicalVolume* experimentalHall_phys; + G4VPhysicalVolume* phantomPhys; + G4VPhysicalVolume* detectorPhys; + RemSimMaterial* pMaterial; + RemSimVGeometryComponent* pVehicle; + RemSimVGeometryComponent* pMoon; + RemSimDetectorMessenger* messenger; + G4String decoratorValue; + G4String astronautValue; + RemSimDecorator* decorator; + RemSimDecorator* decoratorSPE; + RemSimDecorator* decorator1; + RemSimDecorator* decoratorRoof; + G4bool moon; + G4bool flag; +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimDetectorMessenger.hh b/examples/advanced/radioprotection/include/RemSimDetectorMessenger.hh new file mode 100644 index 0000000000..fb42d3b87f --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimDetectorMessenger.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ***************************************** +// * * +// * RemSimDetectrorMessenger.hh * +// * * +// ***************************************** +// +// $Id: RemSimDetectorMessenger.hh,v 1.8 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +#ifndef RemSimDetectorMessenger_h +#define RemSimDetectorMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class RemSimDetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithADoubleAndUnit; +class RemSimDetectorMessenger: public G4UImessenger +{ +public: + RemSimDetectorMessenger(RemSimDetectorConstruction* ); + ~RemSimDetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + RemSimDetectorConstruction* detector;//pointer to detector + G4UIdirectory* vehicleDir; // control the geometry configuration + G4UIcmdWithAString* vehicleCmd; //change set-up configuration + G4UIcmdWithAString* shieldingCmd;//add the shielding layer + G4UIcmdWithAString* SPECmd; //add the SPE shelter + G4UIcmdWithAString* roofCmd; // add the roof to the moon habitat + G4UIdirectory* shieldingDir;//control the shielding parameters + G4UIcmdWithADoubleAndUnit* thicknessCmd; //change the thickness of the + // shielding + + G4UIdirectory* roofDir; // control the roof height + G4UIcmdWithADoubleAndUnit* thicknessRoofCmd;//change the thickness of the + // roof +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimDummySD.hh b/examples/advanced/radioprotection/include/RemSimDummySD.hh new file mode 100644 index 0000000000..2f158565a9 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimDummySD.hh @@ -0,0 +1,50 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Dummy sensitive used only to flag sensitivity +// in cells of RO geometry. +// + +#ifndef RemSimDummySD_h +#define RemSimDummySD_h 1 + +#include "G4VSensitiveDetector.hh" +class G4Step; + +class RemSimDummySD : public G4VSensitiveDetector +{ +public: + RemSimDummySD(); + ~RemSimDummySD() {} + + void Initialize(G4HCofThisEvent*) {} + G4bool ProcessHits(G4Step*,G4TouchableHistory*) {return false;} + void EndOfEvent(G4HCofThisEvent*) {} + void clear() {} + void DrawAll() {} + void PrintAll() {} +}; +RemSimDummySD::RemSimDummySD() + : G4VSensitiveDetector("dummySD") +{} +#endif diff --git a/examples/advanced/radioprotection/include/RemSimElectronEEDL.hh b/examples/advanced/radioprotection/include/RemSimElectronEEDL.hh new file mode 100644 index 0000000000..60da254ebe --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimElectronEEDL.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimElectronEEDL.hh,v 1.3 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it + +#ifndef REMSIMELECTRONEEDL_HH +#define REMSIMELECTRONEEDL_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimElectronEEDL : public G4VPhysicsConstructor { + +public: + + RemSimElectronEEDL(const G4String& name = "electron-eedl"); + + virtual ~RemSimElectronEEDL(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + + virtual void ConstructProcess(); +}; + +#endif + + + + + + + + diff --git a/source/visualization/OpenInventor/include/G4SoWindow.hh b/examples/advanced/radioprotection/include/RemSimEventAction.hh similarity index 66% rename from source/visualization/OpenInventor/include/G4SoWindow.hh rename to examples/advanced/radioprotection/include/RemSimEventAction.hh index 9afd2c488e..c63d3ddc22 100644 --- a/source/visualization/OpenInventor/include/G4SoWindow.hh +++ b/examples/advanced/radioprotection/include/RemSimEventAction.hh @@ -20,40 +20,40 @@ // * statement, and all its terms. * // ******************************************************************** // -#ifndef G4SOWINDOW_h -#define G4SOWINDOW_h +// +// ********************************** +// * * +// * RemSimEventAction.hh * +// * * +// ********************************** +// +// $Id: RemSimEventAction.hh,v 1.4 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author : Susanna Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimEventAction_h +#define RemSimEventAction_h 1 -#include -#include +#include "G4UserEventAction.hh" +#include "globals.hh" -class SbDict; - -class G4SoWindow { +class G4Event; +class RemSimEventAction : public G4UserEventAction +{ public: - G4SoWindow(const char*,SbBool=FALSE); - virtual ~G4SoWindow(); - Widget getWidget() const; - void show(); - void hide(); - void setTitle(const char*); - void setSize(const SbVec2s&); - SbVec2s getSize(); - void setWMClose(SbBool); - SbBool getWMClose() const; - static void clearClass(); -protected: - void registerWidget(Widget); - void unregisterWidget(Widget); - static G4SoWindow* getWindow(Widget); + RemSimEventAction(); + ~RemSimEventAction(); + +public: + void BeginOfEventAction(const G4Event*); + G4int GetEventNo() const {return evtNo;}; + void EndOfEventAction(const G4Event*); + private: - Widget fWidget; - SbBool fWMClose; - static SbDict* fWidgetDictionary; -#ifdef HEPVisXt - static void widgetDestroyedCB(Widget,XtPointer,XtPointer); -public: - static void closeWindow(Widget,XEvent*,char**,Cardinal*); -#endif + G4int evtNo; }; - #endif + + diff --git a/examples/advanced/radioprotection/include/RemSimHadronicPhysics.hh b/examples/advanced/radioprotection/include/RemSimHadronicPhysics.hh new file mode 100644 index 0000000000..eeb86069ae --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimHadronicPhysics.hh @@ -0,0 +1,116 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ************************************** +// * * +// * RemSimHadronicPhysics.hh * +// * * +// ************************************** +// +// $Id: RemSimHadronicPhysics.hh,v 1.2 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author : Susanna Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimHadronicPhysics_h +#define RemSimHadronicPhysics_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +#include "G4QGSParticipants.hh" +#include "G4QGSModel.hh" + +class G4ProtonInelasticCrossSection; +class G4NeutronInelasticCrossSection; +class G4PiNuclearCrossSection; +class G4TripathiCrossSection; +class G4IonsShenCrossSection; + +class G4LElastic; +class G4CascadeInterface; +class G4BinaryLightIonReaction; +class G4LEProtonInelastic; +class G4LENeutronInelastic; +class G4LEPionPlusInelastic; +class G4LEPionMinusInelastic; +class G4LEAlphaInelastic; +class G4LFission; +class G4LCapture; + +class G4TheoFSGenerator; +class G4GeneratorPrecompoundInterface; +class G4ExcitationHandler; +class G4PreCompoundModel; +class G4QGSMFragmentation; +class G4ExcitedStringDecay; + +class RemSimHadronicPhysics: public G4VPhysicsConstructor +{ + public: + RemSimHadronicPhysics(const G4String& name = "hadronic"); + virtual ~RemSimHadronicPhysics(); + + protected: + // Construct particle and physics + void ConstructParticle(){}; + void ConstructProcess(); + + private: + + G4ProtonInelasticCrossSection* proton_XC; + G4NeutronInelasticCrossSection* neutron_XC; + G4PiNuclearCrossSection* pion_XC; + + G4TripathiCrossSection* tripathi; + G4IonsShenCrossSection* shen; + + G4LElastic* elastic_model; + G4CascadeInterface* bertini_model; + G4BinaryLightIonReaction* binary_ion_model; + + G4LEProtonInelastic* LEP_proton_model; + G4LENeutronInelastic* LEP_neutron_model; + G4LEPionPlusInelastic* LEP_pip_model; + G4LEPionMinusInelastic* LEP_pim_model; + G4LEAlphaInelastic* LEP_alpha_model; + G4LFission* nfission_model; + G4LCapture* ncapture_model; + + G4TheoFSGenerator* QGSP_model; + G4GeneratorPrecompoundInterface* theCascade; + G4ExcitationHandler* theHandler; + G4PreCompoundModel* thePreEquilib; + G4QGSMFragmentation* theFragmentation; + G4ExcitedStringDecay* theStringDecay; + G4QGSModel theStringModel; +}; +#endif + + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimHit.hh b/examples/advanced/radioprotection/include/RemSimHit.hh new file mode 100644 index 0000000000..9e2e16baba --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimHit.hh @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef RemSimHit_h +#define RemSimHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" + +class RemSimHit : public G4VHit +{ +public: + + RemSimHit(); + ~RemSimHit(); + RemSimHit(const RemSimHit &right); + const RemSimHit& operator=(const RemSimHit &right); + G4int operator==(const RemSimHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + +private: + G4double edep; + G4int xID; + G4int yID; + G4int zID; + G4ThreeVector position; + +public: + inline void SetEdep(G4double de) + { edep = de; } + inline G4double GetEdep() + { return edep; } + inline void SetIndexes(G4int i) + {zID = i;} + + inline G4int GetIndexZ(){return zID;} + + inline void SetPosition(G4ThreeVector xyz) + { position = xyz; } + + inline G4ThreeVector GetPosition(){ return position; } +}; + +typedef G4THitsCollection RemSimHitsCollection; + +extern G4Allocator RemSimHitAllocator; + +inline void* RemSimHit::operator new(size_t) +{ + void *aHit; + aHit = (void *) RemSimHitAllocator.MallocSingle(); + return aHit; +} + +inline void RemSimHit::operator delete(void *aHit) +{ + RemSimHitAllocator.FreeSingle((RemSimHit*) aHit); +} + +#endif diff --git a/examples/advanced/radioprotection/include/RemSimInterplanetarySpaceConfiguration.hh b/examples/advanced/radioprotection/include/RemSimInterplanetarySpaceConfiguration.hh new file mode 100644 index 0000000000..eb700401fa --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimInterplanetarySpaceConfiguration.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimInterplanetarySpaceConfiguration.hh,v 1.7 2004/05/27 10:33:11 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author : Susanna Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimInterplanetarySpaceConfiguration_h +#define RemSimInterplanetarySpaceConfiguration_h 1 + +#include "RemSimVPrimaryGeneratorFactory.hh" +#include "globals.hh" +#include "G4DataVector.hh" +class G4ParticleGun; +class G4Event; +class RemSimRunAction; + +class RemSimInterplanetarySpaceConfiguration : +public RemSimVPrimaryGeneratorFactory +{ + +public: + RemSimInterplanetarySpaceConfiguration(); + ~RemSimInterplanetarySpaceConfiguration(); + +public: + void GeneratePrimaries(G4Event* anEvent); + void MoonConfiguration(); + G4double GetInitialEnergy(); + void SetMoon(G4bool); + +private: + G4ParticleGun* particleGun; + G4String spectrum; + G4double energy; + RemSimRunAction* run; + G4bool moon; +}; +#endif + + diff --git a/examples/advanced/radioprotection/include/RemSimIonICRU.hh b/examples/advanced/radioprotection/include/RemSimIonICRU.hh new file mode 100644 index 0000000000..034c9856b9 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimIonICRU.hh @@ -0,0 +1,42 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef REMSIMPROTONICRU_HH +#define REMSIMPROTONICRU_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimIonICRU : public G4VPhysicsConstructor { + +public: + + RemSimIonICRU(const G4String& name = "ion-ICRU"); + + virtual ~RemSimIonICRU(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + virtual void ConstructProcess(); +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimIonStandard.hh b/examples/advanced/radioprotection/include/RemSimIonStandard.hh new file mode 100644 index 0000000000..e9a632ea9c --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimIonStandard.hh @@ -0,0 +1,42 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef REMSIMPROTONStandard_HH +#define REMSIMPROTONStandard_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimIonStandard : public G4VPhysicsConstructor { + +public: + + RemSimIonStandard(const G4String& name = "ion-standard"); + + virtual ~RemSimIonStandard(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + virtual void ConstructProcess(); +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimMaterial.hh b/examples/advanced/radioprotection/include/RemSimMaterial.hh new file mode 100644 index 0000000000..4cb747d51c --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimMaterial.hh @@ -0,0 +1,75 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimMaterial.hh,v 1.5 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyMaterial.hh * +// * * +// ********************************** +// +//Code developed by: Susanna Guatelli, guatelli@ge.infn.it +// +//This class manages the elements and materials needed by the simulation +// set-up ... +// +#ifndef RemSimMaterial_H +#define RemSimMaterial_H 1 +#include "globals.hh" +class G4Material; + +class RemSimMaterial +{ +public: + RemSimMaterial(); + ~ RemSimMaterial(); + +public: + void DefineMaterials(); + G4Material* GetMaterial(G4String); //returns the material + +private: + G4Material* matPb; + G4Material* matAir; + G4Material* matH2O; + G4Material* Al; + G4Material* nylon; + G4Material* mylar; + G4Material* beta; + G4Material* nextel; + G4Material* kevlar; + G4Material* vacuum; + G4Material* betaCloth; + G4Material* eterogeneousNextel; + G4Material* kevlarVacuum; + G4Material* polyethylene; + G4Material* polyacrylate; + G4Material* evoh; + G4Material* nomex; + G4Material* nomexAir; + G4Material* kevlarAir; + G4Material* moon; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimMoonHabitat.hh b/examples/advanced/radioprotection/include/RemSimMoonHabitat.hh new file mode 100644 index 0000000000..f9abff5381 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimMoonHabitat.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ************************************** +// * * +// * RemSimMoonHabitat.hh * +// * * +// ************************************** +// +// $Id: RemSimMoonHabitat.hh,v 1.3 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimMoonHabitat_h +#define RemSimMoonHabitat_h 1 + +class RemSimVGeometryComponent; +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class G4VisAttributes; +class RemSimMoonHabitat: public RemSimVGeometryComponent +{ +public: + RemSimMoonHabitat(); + ~RemSimMoonHabitat(); + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + G4VPhysicalVolume* GetShelter(); + +private: + RemSimMaterial* pMaterial; + G4VPhysicalVolume* shelterPhys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimMuonStandard.hh b/examples/advanced/radioprotection/include/RemSimMuonStandard.hh new file mode 100644 index 0000000000..9cc8be1dc1 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimMuonStandard.hh @@ -0,0 +1,49 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimMuonStandard.hh,v 1.2 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// + +#ifndef REMSIMMUONSTANDARD_HH +#define REMSIMMUONSTANDARD_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimMuonStandard : public G4VPhysicsConstructor { + +public: + + RemSimMuonStandard(const G4String& name = "muon-standard"); + + virtual ~RemSimMuonStandard(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + + virtual void ConstructProcess(); +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimParticles.hh b/examples/advanced/radioprotection/include/RemSimParticles.hh new file mode 100644 index 0000000000..dc2b2db0d9 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimParticles.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimParticles.hh,v 1.4 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// + +#ifndef REMSIMPARTICLES_HH +#define REMSIMPARTICLES_HH 1 + +#include "globals.hh" +#include "G4VPhysicsConstructor.hh" + +class RemSimParticles : public G4VPhysicsConstructor { +public: + + RemSimParticles(const G4String& name = "particles"); + + virtual ~RemSimParticles(); + + virtual void ConstructParticle(); + + // This method is dummy + virtual void ConstructProcess() {}; +}; +#endif + + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimPhotonEPDL.hh b/examples/advanced/radioprotection/include/RemSimPhotonEPDL.hh new file mode 100644 index 0000000000..a4d224f65c --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPhotonEPDL.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimPhotonEPDL.hh,v 1.3 2004/05/22 12:57:04 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef REMSIMPHOTONEPDL_HH +#define REMSIMPHOTONEPDL_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimPhotonEPDL : public G4VPhysicsConstructor { + +public: + + RemSimPhotonEPDL(const G4String& name = "photon-epdl"); + + virtual ~RemSimPhotonEPDL(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + + virtual void ConstructProcess(); +}; + +#endif + + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimPhysicsList.hh b/examples/advanced/radioprotection/include/RemSimPhysicsList.hh new file mode 100644 index 0000000000..f9c6de99d9 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPhysicsList.hh @@ -0,0 +1,66 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPhysicsList.hh,v 1.5 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it + +#ifndef REMSIMPHYSICSLIST_HH +#define REMSIMPHYSICSLIST_HH 1 + +#include "G4VModularPhysicsList.hh" +#include "globals.hh" + +class RemSimPhysicsListMessenger; + +class RemSimPhysicsList: public G4VModularPhysicsList { +public: + + RemSimPhysicsList(); + + virtual ~RemSimPhysicsList(); + + //register the threshold of production of secondaries + virtual void SetCuts(); + + // Register PhysicsList chunks + void AddPhysicsList(const G4String& name); + +private: + G4bool electronIsRegistered; + G4bool positronIsRegistered; + G4bool photonIsRegistered; + G4bool ionIsRegistered; + G4bool hadronicIsRegistered; + G4bool decayIsRegistered; + G4bool muonIsRegistered; + RemSimPhysicsListMessenger* messenger; +}; +#endif + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimPhysicsListMessenger.hh b/examples/advanced/radioprotection/include/RemSimPhysicsListMessenger.hh new file mode 100644 index 0000000000..c73c439142 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPhysicsListMessenger.hh @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPhysicsListMessenger.hh,v 1.3 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it + +#ifndef RemSimPhysicsListMessenger_h +#define RemSimPhysicsListMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class RemSimPhysicsList; +class G4UIdirectory; +class G4UIcmdWithAString; + +class RemSimPhysicsListMessenger: public G4UImessenger +{ +public: + RemSimPhysicsListMessenger(RemSimPhysicsList*); + ~RemSimPhysicsListMessenger(); + void SetNewValue(G4UIcommand*, G4String); + +private: + RemSimPhysicsList* RemSimList; + G4UIdirectory* EnDir; + G4UIcmdWithAString* physicsListCmd; +}; + +#endif + + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimPositronStandard.hh b/examples/advanced/radioprotection/include/RemSimPositronStandard.hh new file mode 100644 index 0000000000..0479616c0e --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPositronStandard.hh @@ -0,0 +1,56 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimPositronStandard.hh,v 1.3 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it + +#ifndef REMSIMPOSITRONSTANDARD_HH +#define REMSIMPOSITRONSTANDARD_HH 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +class RemSimPositronStandard : public G4VPhysicsConstructor { + +public: + + RemSimPositronStandard(const G4String& name = "positron-standard"); + + virtual ~RemSimPositronStandard(); + + // This method is dummy for physics + virtual void ConstructParticle() {}; + + virtual void ConstructProcess(); +}; +#endif + + + + + + + + diff --git a/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorAction.hh b/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorAction.hh new file mode 100644 index 0000000000..e246c992d0 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorAction.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimPrimaryGeneratorAction.hh,v 1.8 2004/05/27 10:33:11 guatelli Exp $// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimPrimaryGeneratorAction_h +#define RemSimPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class G4ParticleGun; +class G4Event; +class RemSimVPrimaryGeneratorFactory; +class RemSimPrimaryGeneratorMessenger; +class RemSimPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ +public: + RemSimPrimaryGeneratorAction(); + ~RemSimPrimaryGeneratorAction(); + +public: + G4double GetInitialEnergy(); + void GeneratePrimaries(G4Event* anEvent); + void SelectPrimaries(G4String value); + +private: + G4String value; + RemSimVPrimaryGeneratorFactory* primaryFactory1; + RemSimVPrimaryGeneratorFactory* primaryFactory2; + RemSimPrimaryGeneratorMessenger* messenger; +}; +#endif + + diff --git a/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorMessenger.hh b/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorMessenger.hh new file mode 100644 index 0000000000..d99d208e4d --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimPrimaryGeneratorMessenger.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ************************************************ +// * * +// * RemSimPrimaryGeneratorMessenger.hh * +// * * +// ************************************************ +// +// $Id: RemSimPrimaryGeneratorMessenger.hh,v 1.4 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//Code developed by: S.Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimPrimaryGeneratorMessenger_h +#define RemSimPrimaryGeneratorMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class RemSimPrimaryGeneratorAction; +class RemSimRunAction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +class RemSimPrimaryGeneratorMessenger: public G4UImessenger +{ +public: + RemSimPrimaryGeneratorMessenger(RemSimPrimaryGeneratorAction* ); + ~RemSimPrimaryGeneratorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + RemSimPrimaryGeneratorAction* primary;//pointer to detector + G4UIdirectory* gunDir; + G4UIcmdWithAString* fluxCmd; //change vehicle +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimROGeometry.hh b/examples/advanced/radioprotection/include/RemSimROGeometry.hh new file mode 100644 index 0000000000..36a66bb27b --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimROGeometry.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimROGeometry.hh,v 1.5 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ************************************ +// * * +// * RemSimROGeometry.hh * +// * * +// ************************************ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimROGeometry_h +#define RemSimROGeometry_h + +#include "G4VReadOutGeometry.hh" + +class RemSimROGeometry : public G4VReadOutGeometry +{ +public: + RemSimROGeometry( G4double phantomDimX, + G4double phantomDimY, + G4double phantomDimZ, + G4int numberOfVoxelsZ, + G4double trans); + + ~RemSimROGeometry(); + +private: + G4VPhysicalVolume* Build(); + +private: + const G4double astronautDimensionX; + const G4double astronautDimensionY; + const G4double astronautDimensionZ; + const G4int numberOfVoxelsAlongZ; + const G4double translation; + G4VPhysicalVolume *ROAstronautZDivisionPhys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimRoofDecorator.hh b/examples/advanced/radioprotection/include/RemSimRoofDecorator.hh new file mode 100644 index 0000000000..85103eeb72 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimRoofDecorator.hh @@ -0,0 +1,75 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ************************************ +// * * +// * RemSimRoofDecorator.hh * +// * * +// ************************************ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// +// $Id: RemSimRoofDecorator.hh,v 1.3 2004/06/18 09:18:06 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifndef RemSimRoofDecorator_h +#define RemSimRoofDecorator_h 1 + +#include "RemSimDecorator.hh" +#include "RemSimVGeometryComponent.hh" +#include "globals.hh" +class G4VPhysicalVolume; +class G4Trd; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class RemSimVGeometryComponent; +class RemSimDecorator; +class G4VPhysicalVolume; +class G4VisAttributes; + +class RemSimRoofDecorator: public RemSimDecorator +{ +public: + RemSimRoofDecorator(RemSimVGeometryComponent*); + ~RemSimRoofDecorator(); + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + void ChangeThickness(G4double); + void PrintDetectorParameters(); + G4VPhysicalVolume* GetShelter(){return 0;}; + void ChangeMother(G4VPhysicalVolume*){;}; + +private: + + void ConstructRoof(G4VPhysicalVolume*); + + RemSimMaterial* pMaterial; + G4String shieldingMaterial; + G4VisAttributes* roofVisAtt; + G4Trd* roof; + G4LogicalVolume* roofLog; + G4VPhysicalVolume* roofPhys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimRunAction.hh b/examples/advanced/radioprotection/include/RemSimRunAction.hh new file mode 100644 index 0000000000..0643b86770 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimRunAction.hh @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimRunAction.hh,v 1.7 2004/05/27 10:13:54 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// ******************************************** +// * * +// * RemSimRunAction.hh * +// * * +// ******************************************** +// +#ifndef RemSimRunAction_h +#define RemSimRunAction_h 1 + +#include "G4UserRunAction.hh" +#include "G4RunManager.hh" +#include "globals.hh" + +class G4Run; +class RemSimAnalysisManager; +class RemSimRunMessenger; + +class RemSimRunAction : public G4UserRunAction +{ +public: + RemSimRunAction(); + ~RemSimRunAction(); + +public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run* ); + void Read(G4String); + void ReadData(G4double, G4String); + + G4DataVector* GetPrimaryParticleEnergy(); + G4DataVector* GetPrimaryParticleEnergyDistribution(); + G4double GetPrimaryParticleEnergyDistributionSum(); + G4int GetRunID() {return runID;}; + G4bool GetFile(); + +private: + G4DataVector* energies; + G4DataVector* data; + G4int runID; + RemSimRunMessenger* messenger; + G4String file; +}; +#endif + + + diff --git a/examples/advanced/radioprotection/include/RemSimRunMessenger.hh b/examples/advanced/radioprotection/include/RemSimRunMessenger.hh new file mode 100644 index 0000000000..d47699ba35 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimRunMessenger.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ***************************************** +// * * +// * RemSimDetectrorMessenger.hh * +// * * +// ***************************************** +// +// $Id: RemSimRunMessenger.hh,v 1.2 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimRunMessenger_h +#define RemSimRunMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class RemSimRunAction; +class RemSimRunAction; +class G4UIdirectory; +class G4UIcmdWithAString; + +class RemSimRunMessenger: public G4UImessenger +{ +public: + RemSimRunMessenger(RemSimRunAction* ); + ~RemSimRunMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + RemSimRunAction* run; + G4UIdirectory* runDir; + G4UIcmdWithAString* readFileCmd; //change data.txt +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimSensitiveDetector.hh b/examples/advanced/radioprotection/include/RemSimSensitiveDetector.hh new file mode 100644 index 0000000000..5e6ed5703c --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimSensitiveDetector.hh @@ -0,0 +1,52 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimSensitiveDetector.hh,v 1.2 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimSensitiveDetector_h +#define RemSimSensitiveDetector_h 1 + +#include "G4VSensitiveDetector.hh" +#include "RemSimHit.hh" +class G4Step; +class G4HCofThisEvent; +class G4TouchableHistory; + +class RemSimSensitiveDetector : public G4VSensitiveDetector +{ + + public: + RemSimSensitiveDetector (G4String name); + ~RemSimSensitiveDetector(); + + void Initialize(G4HCofThisEvent*HCE); + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*); + void EndOfEvent(G4HCofThisEvent*HCE); + + private: + RemSimHitsCollection *trackerCollection; +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimShelterSPEDecorator.hh b/examples/advanced/radioprotection/include/RemSimShelterSPEDecorator.hh new file mode 100644 index 0000000000..9051744f20 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimShelterSPEDecorator.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimShelterSPEDecorator.hh,v 1.2 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimShelterSPEDecorator_h +#define RemSimShelterSPEDecorator_h 1 + +#include "RemSimDecorator.hh" +#include "RemSimVGeometryComponent.hh" +#include "globals.hh" +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class RemSimVGeometryComponent; +class RemSimDecorator; +class G4VPhysicalVolume; +class G4VisAttributes; + +class RemSimShelterSPEDecorator: public RemSimDecorator +{ +public: + RemSimShelterSPEDecorator(RemSimVGeometryComponent*); + ~RemSimShelterSPEDecorator(); + + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + void ChangeThickness(G4double); + void PrintDetectorParameters(); + G4VPhysicalVolume* GetShelter(){return 0;}; + void ChangeMother(G4VPhysicalVolume*){;}; + +private: + void ConstructShelterSPE(G4VPhysicalVolume*); + + G4double shelterSPEX; + G4double shelterSPEY; + G4double shelterSPEZ; + G4double translation; + RemSimMaterial* pMaterial; + G4String shelterSPEMaterial; + G4VisAttributes* shelterSPEVisAtt; + G4Box* shelterSPE; + G4LogicalVolume* shelterSPELog; + G4VPhysicalVolume* shelterSPEPhys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimShieldingDecorator.hh b/examples/advanced/radioprotection/include/RemSimShieldingDecorator.hh new file mode 100644 index 0000000000..6f501eec50 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimShieldingDecorator.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimShieldingDecorator.hh,v 1.4 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimShieldingDecorator_h +#define RemSimShieldingDecorator_h 1 + +#include "RemSimDecorator.hh" +#include "RemSimVGeometryComponent.hh" +#include "globals.hh" +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class RemSimVGeometryComponent; +class RemSimDecorator; +class G4VPhysicalVolume; +class G4VisAttributes; + +class RemSimShieldingDecorator: public RemSimDecorator +{ +public: + RemSimShieldingDecorator(RemSimVGeometryComponent*); + ~RemSimShieldingDecorator(); + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + void ChangeThickness(G4double); + void PrintDetectorParameters(); + G4VPhysicalVolume* GetShelter(){return 0;}; + void ChangeMother(G4VPhysicalVolume*){;}; + +private: + void ConstructShielding(G4VPhysicalVolume*); + + G4double shieldingX; + G4double shieldingY; + G4double shieldingZ; + G4double translation; + RemSimMaterial* pMaterial; + G4String shieldingMaterial; + G4VisAttributes* shieldingVisAtt; + G4Box* shielding; + G4LogicalVolume* shieldingLog; + G4VPhysicalVolume* shieldingPhys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimSteppingAction.hh b/examples/advanced/radioprotection/include/RemSimSteppingAction.hh new file mode 100644 index 0000000000..7582cf668b --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimSteppingAction.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimSteppingAction.hh,v 1.3 2004/05/17 10:34:57 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli (guatelli@ge.infn.it) +// +// History: +// ----------- +// 27 May 2003 S.Guatelli first code review +// 17 May 2003 S. Guatelli 1st implementation +// +// ------------------------------------------------------------------- + +#ifndef RemSimSteppingAction_h +#define RemSimSteppingAction_h 1 + +#include "G4UserSteppingAction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4ios.hh" +#include "globals.hh" + +class G4Step; +class RemSimPrimaryGeneratorAction; +class RemSimSteppingActionMessenger; + +class RemSimSteppingAction : public G4UserSteppingAction +{ +public: + + RemSimSteppingAction(RemSimPrimaryGeneratorAction*); + + ~RemSimSteppingAction(); + + void UserSteppingAction(const G4Step* aStep); + void SetHadronicAnalysis(G4String); + +private: + RemSimPrimaryGeneratorAction* primaryAction; + G4String hadronic; + RemSimSteppingActionMessenger* messenger; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimSteppingActionMessenger.hh b/examples/advanced/radioprotection/include/RemSimSteppingActionMessenger.hh new file mode 100644 index 0000000000..a831b319f6 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimSteppingActionMessenger.hh @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimSteppingActionMessenger.hh,v 1.2 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimSteppingActionMessenger_h +#define RemSimSteppingActionMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" +#include "G4UIcommand.hh" + +class RemSimSteppingAction; +class G4UIdirectory; +class G4UIcmdWithAString; + +class RemSimSteppingActionMessenger: public G4UImessenger +{ +public: + RemSimSteppingActionMessenger(RemSimSteppingAction*); + ~RemSimSteppingActionMessenger(); + void SetNewValue(G4UIcommand*, G4String); + +private: + RemSimSteppingAction* steppingAction; + G4UIdirectory* stepDirectory; + G4UIcmdWithAString* hadronicCmd; +}; +#endif + diff --git a/examples/advanced/radioprotection/include/RemSimVGeometryComponent.hh b/examples/advanced/radioprotection/include/RemSimVGeometryComponent.hh new file mode 100644 index 0000000000..dd28e51c34 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimVGeometryComponent.hh @@ -0,0 +1,44 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimVGeometryComponent.hh,v 1.5 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimVGeometryComponent_h +#define RemSimVGeometryComponent_h 1 + +#include "globals.hh" + +class G4VPhysicalVolume; +class RemSimVGeometryComponent +{ +public: + RemSimVGeometryComponent(); + virtual ~RemSimVGeometryComponent(); + + virtual void ConstructComponent(G4VPhysicalVolume*) = 0; + virtual void DestroyComponent() = 0; + virtual G4VPhysicalVolume* GetShelter() = 0; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimVPrimaryGeneratorFactory.hh b/examples/advanced/radioprotection/include/RemSimVPrimaryGeneratorFactory.hh new file mode 100644 index 0000000000..fdb65bdc4b --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimVPrimaryGeneratorFactory.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimVPrimaryGeneratorFactory.hh,v 1.7 2004/05/27 10:33:11 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#ifndef RemSimVPrimaryGeneratorFactory_h +#define RemSimVPrimaryGeneratorFactory_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "globals.hh" + +class RemSimVPrimaryGeneratorFactory : public G4VUserPrimaryGeneratorAction +{ +public: + RemSimVPrimaryGeneratorFactory(); + virtual ~RemSimVPrimaryGeneratorFactory(); + +public: + virtual void GeneratePrimaries(G4Event* anEvent)=0; + virtual G4double GetInitialEnergy()=0; + virtual void SetMoon(G4bool)=0; // Set moon configuration +}; +#endif + + diff --git a/examples/advanced/radioprotection/include/RemSimVehicle1.hh b/examples/advanced/radioprotection/include/RemSimVehicle1.hh new file mode 100644 index 0000000000..9e71e3a3ab --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimVehicle1.hh @@ -0,0 +1,80 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimVehicle1.hh,v 1.7 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// + +#ifndef RemSimVehicle1_h +#define RemSimVehicle1_h 1 + +class RemSimVGeometryComponent; +class G4VPhysicalVolume; +class G4Box; +class G4LogicalVolume; +class G4Material; +class RemSimMaterial; +class G4VisAttributes; +class RemSimVehicle1: public RemSimVGeometryComponent +{ +public: + RemSimVehicle1(); + ~RemSimVehicle1(); + void ConstructComponent(G4VPhysicalVolume*); + void DestroyComponent(); + G4VPhysicalVolume* GetShelter(){return 0;}; + +private: + RemSimMaterial* pMaterial; + G4VPhysicalVolume* layervacuumPhys; + G4VPhysicalVolume* layer1Phys; + G4VPhysicalVolume* layer2Phys; + G4VPhysicalVolume* layer3Phys; + G4VPhysicalVolume* layer4Phys; + G4VPhysicalVolume* layer5Phys; + G4VPhysicalVolume* layer6Phys; + G4VPhysicalVolume* layer7Phys; + G4VPhysicalVolume* layer8Phys; + G4VPhysicalVolume* layer9Phys; + G4VPhysicalVolume* layer10Phys; + G4VPhysicalVolume* layer11Phys; + G4VPhysicalVolume* layer12Phys; + G4VPhysicalVolume* layer13Phys; + G4VPhysicalVolume* layer14Phys; + G4VPhysicalVolume* layer15Phys; + G4VPhysicalVolume* layerPhys; + G4VPhysicalVolume* layer16Phys; + G4VPhysicalVolume* layer17Phys; + G4VPhysicalVolume* layer18Phys; + G4VPhysicalVolume* layer19Phys; + G4VPhysicalVolume* layer20Phys; + G4VPhysicalVolume* layer21Phys; + G4VPhysicalVolume* layer22Phys; + G4VPhysicalVolume* layer23Phys; + G4VPhysicalVolume* layer24Phys; + G4VPhysicalVolume* layer25Phys; + G4VPhysicalVolume* layer26Phys; + G4VPhysicalVolume* layer27Phys; +}; +#endif diff --git a/examples/advanced/radioprotection/include/RemSimVisManager.hh b/examples/advanced/radioprotection/include/RemSimVisManager.hh new file mode 100644 index 0000000000..b92b1b5d28 --- /dev/null +++ b/examples/advanced/radioprotection/include/RemSimVisManager.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimVisManager.hh,v 1.4 2004/05/22 12:57:05 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// Example Visualization Manager implementing virtual function +// RegisterGraphicsSystems. Exploits C-pre-processor variables +// G4VIS_USE_DAWN, etc., which are set by the GNUmakefiles if +// environment variables of the same name are set. + +// So all you have to do is set environment variables and compile and +// instantiate this in your main(). + +// Alternatively, you can implement an empty function here and just +// register the systems you want in your main(), e.g.: +// G4VisManager* myVisManager = new MyVisManager; +// myVisManager -> RegisterGraphicsSystem (new MyGraphicsSystem); + +#ifndef RemSimVisManager_h +#define RemSimVisManager_h 1 + +#ifdef G4VIS_USE + +#include "G4VisManager.hh" + +class RemSimVisManager: public G4VisManager { + +public: + + RemSimVisManager (); + +private: + + void RegisterGraphicsSystems (); + +}; +#endif +#endif diff --git a/examples/advanced/radioprotection/moon.mac b/examples/advanced/radioprotection/moon.mac new file mode 100644 index 0000000000..fb36856a7a --- /dev/null +++ b/examples/advanced/radioprotection/moon.mac @@ -0,0 +1,31 @@ +#Example of Moon Habitat configuration +###################################### +# Activate e.m. physics +/physics/addPhysics photon-epdl +/physics/addPhysics electron-eedl +/physics/addPhysics positron-standard +# +#Standard process for p, alpha and ions +#/physics/addPhysics ion-standard +# +#LowEnergy process for p, alpha and ions +/physics/addPhysics ion-ICRU +# Activate hadronic physics +#/physics/addPhysics hadronic +#/physics/addPhysics muon-standard +#/physics/addPhysics decay +# Sets some default verbose +# +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +#/tracking/verbose 1 +/run/initialize +/gun/particle proton +#/gun/generator Moon +/gun/energy 1. GeV +/configuration/choose moon +/configuration/AddRoof On +#/configuration/AddRoof Off +/roof/thickness 1. m +/run/beamOn 100 diff --git a/examples/advanced/radioprotection/remsim.cc b/examples/advanced/radioprotection/remsim.cc new file mode 100644 index 0000000000..0827bcbc59 --- /dev/null +++ b/examples/advanced/radioprotection/remsim.cc @@ -0,0 +1,124 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: remsim.cc,v 1.7 2004/05/27 08:36:50 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "RemSimDetectorConstruction.hh" +#include "RemSimPhysicsList.hh" +#include "RemSimPrimaryGeneratorAction.hh" +#include "RemSimEventAction.hh" +#include "RemSimRunAction.hh" +#include "RemSimSteppingAction.hh" +#ifdef G4VIS_USE +#include "RemSimVisManager.hh" +#endif +#ifdef G4ANALYSIS_USE +#include "RemSimAnalysisManager.hh" +#endif + +int main(int argc,char** argv) +{ + // Construct the default run manager + G4RunManager* runManager = new G4RunManager; + + // HepRandom :: setTheSeed(0); + // Set mandatory initialization classes + + // Geometry + RemSimDetectorConstruction* detector = new RemSimDetectorConstruction(); + runManager -> SetUserInitialization(detector); + + // Physics + runManager->SetUserInitialization(new RemSimPhysicsList); + + // Set mandatory user action class + + // Primary particles + RemSimPrimaryGeneratorAction* primary = new RemSimPrimaryGeneratorAction(); + runManager -> SetUserAction(primary); + + // Set optional user action class + RemSimEventAction* event = new RemSimEventAction(); + runManager -> SetUserAction(event); + + RemSimRunAction* run = new RemSimRunAction(); + runManager -> SetUserAction(run); + + runManager -> SetUserAction(new RemSimSteppingAction(primary)); + +#ifdef G4VIS_USE + // Visualisation + G4VisManager* visManager = new RemSimVisManager; + visManager -> Initialize(); +#endif + + // Analysis +#ifdef G4ANALYSIS_USE + RemSimAnalysisManager* analysis = RemSimAnalysisManager::getInstance(); + analysis -> book(); +#endif + + // get the pointer to the UI manager and set verbosities + G4UImanager* UI = G4UImanager::GetUIpointer(); + + if(argc == 1) + // Define (G)UI terminal for interactive mode + { + // G4UIterminal is a (dumb) terminal. + G4UIsession * session = 0; +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif + + UI -> ApplyCommand("/control/execute vis.mac"); + session -> SessionStart(); + delete session; + } + else + // Batch mode + { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI -> ApplyCommand(command+fileName); + } + +#ifdef G4ANALYSIS_USE + analysis -> finish(); +#endif + +#ifdef G4VIS_USE + delete visManager; +#endif + + // job termination + delete runManager; + return 0; +} + + diff --git a/examples/advanced/radioprotection/speZ=1.txt b/examples/advanced/radioprotection/speZ=1.txt new file mode 100644 index 0000000000..b236c6fe0c --- /dev/null +++ b/examples/advanced/radioprotection/speZ=1.txt @@ -0,0 +1,837 @@ +1.0023 2329084.825 +1.0162 2315943.759 +1.0304 2302694.459 +1.0447 2289526.714 +1.0592 2276350.174 +1.0739 2263168.017 +1.0888 2249983.199 +1.104 2236711.29 +1.1193 2223529.727 +1.1349 2210268.926 +1.1506 2197101.881 +1.1666 2183863.442 +1.1828 2170639.984 +1.1993 2157353.587 +1.2159 2144167.836 +1.2328 2130926.322 +1.25 2117633.582 +1.2674 2104370.28 +1.285 2091138.478 +1.3028 2077940.527 +1.3209 2064705.599 +1.3393 2051437.574 +1.3579 2038211.714 +1.3768 2024959.981 +1.3959 2011755.292 +1.4153 1998531.423 +1.435 1985291.971 +1.4549 1972106.893 +1.4751 1958912.602 +1.4956 1945712.622 +1.5164 1932510.602 +1.5375 1919309.671 +1.5589 1906113.077 +1.5805 1892984.979 +1.6025 1879806.888 +1.6248 1866642.791 +1.6473 1853553.751 +1.6702 1840426.22 +1.6934 1827321.316 +1.717 1814186.245 +1.7408 1801135.097 +1.765 1788060.637 +1.7896 1774967.072 +1.8144 1761963.622 +1.8397 1748896.198 +1.8652 1735922.615 +1.8911 1722943.365 +1.9174 1709962.398 +1.9441 1696983.566 +1.9711 1684058.217 +1.9985 1671141.114 +2.0263 1658235.806 +2.0544 1645391.163 +2.083 1632519.108 +2.1119 1619712.907 +2.1413 1606887.081 +2.171 1594131.938 +2.2012 1581364.221 +2.2318 1568629.72 +2.2628 1555931.496 +2.2942 1543272.202 +2.3261 1530614.715 +2.3585 1517962.748 +2.3912 1505396.749 +2.4245 1492804.631 +2.4582 1480265.739 +2.4923 1467782.479 +2.527 1455284.778 +2.5621 1442847.702 +2.5977 1430438.507 +2.6338 1418060.359 +2.6704 1405716.313 +2.7075 1393409.322 +2.7451 1381141.839 +2.7833 1368884.894 +2.822 1356673.733 +2.8612 1344510.867 +2.9009 1332399.106 +2.9412 1320310.347 +2.9821 1308248.207 +3.0236 1296216.189 +3.0656 1284245.758 +3.1082 1272310.76 +3.1514 1260414.349 +3.1952 1248559.569 +3.2396 1236748.895 +3.2846 1224985.6 +3.3303 1213246.706 +3.3765 1201585.712 +3.4235 1189929.808 +3.471 1178356.194 +3.5193 1166794.444 +3.5682 1155295.413 +3.6178 1143838.526 +3.6681 1132426.52 +3.719 1121084.286 +3.7707 1109770.266 +3.8231 1098509.108 +3.8762 1087303.045 +3.9301 1076133.792 +3.9847 1065024.991 +4.0401 1053958.926 +4.0963 1042938.417 +4.1532 1031985.518 +4.2109 1021083.358 +4.2694 1010234.491 +4.3288 999423.2028 +4.3889 988688.3185 +4.4499 977996.4088 +4.5118 967350.3714 +4.5745 956769.9074 +4.638 946257.0716 +4.7025 935781.3181 +4.7678 925377.6336 +4.8341 915016.5908 +4.9013 904716.4315 +4.9694 894479.3375 +5.0385 884292.6921 +5.1085 874173.5956 +5.1795 864109.8194 +5.2515 854103.8153 +5.3244 844171.5271 +5.3984 834287.8926 +5.4735 824455.5754 +5.5495 814702.7623 +5.6266 805005.8146 +5.7048 795367.1427 +5.7841 785788.9402 +5.8645 776273.4269 +5.946 766822.6902 +6.0286 757438.6857 +6.1124 748112.1931 +6.1974 738845.4477 +6.2835 729651.3114 +6.3708 720521.0221 +6.4594 711446.2535 +6.5491 702449.3619 +6.6401 693512.1155 +6.7324 684636.6271 +6.826 675824.9655 +6.9209 667079.0633 +7.017 658409.7383 +7.1146 649791.8787 +7.2134 641253.7937 +7.3137 632771.3383 +7.4153 624363.2603 +7.5184 616014.7007 +7.6229 607735.7043 +7.7288 599527.8019 +7.8362 591384.9192 +7.9451 583308.7655 +8.0555 575300.9117 +8.1675 567355.9261 +8.281 559482.5919 +8.3961 551675.4085 +8.5128 543935.946 +8.6311 536265.7578 +8.751 528666.2644 +8.8726 521132.5576 +8.9959 513666.1982 +9.1209 506268.7393 +9.2477 498935.6896 +9.3762 491674.1203 +9.5065 484479.6607 +9.6386 477353.8557 +9.7726 470292.7161 +9.9084 463302.7806 +10.046 456385.2019 +10.186 449511.4032 +10.327 442750.9309 +10.471 436009.2471 +10.616 429381.2286 +10.764 422776.6906 +10.913 416285.859 +11.065 409822.5818 +11.219 404673.8436 +11.375 402298.6108 +11.533 399907.1366 +11.693 397499.8774 +11.856 395062.3823 +12.02 392625.0177 +12.187 390158.5193 +12.357 387663.6266 +12.529 385155.6183 +12.703 382634.9564 +12.879 380102.103 +13.058 377543.2727 +13.24 374959.2177 +13.424 372364.7449 +13.61 369760.3167 +13.799 367132.5401 +13.991 364482.1739 +14.186 361809.979 +14.383 359130.27 +14.583 356430.0552 +14.785 353723.4455 +14.991 350984.4061 +15.199 348240.2931 +15.41 345478.5215 +15.625 342686.9222 +15.842 339892.227 +16.062 337082.1608 +16.285 334257.4842 +16.511 331418.9566 +16.741 328554.9369 +16.973 325691.0858 +17.209 322803.4688 +17.449 319893.1643 +17.691 316985.174 +17.937 314056.2105 +18.186 311119.0878 +18.439 308162.915 +18.695 305200.2781 +18.955 302220.5019 +19.218 299235.9407 +19.485 296236.1351 +19.756 293222.1388 +20.031 290195.0016 +20.309 287166.6043 +20.591 284126.9203 +20.878 281066.3752 +21.168 278007.3232 +21.462 274940.0616 +21.76 271865.6018 +22.063 268774.8045 +22.369 265689.0662 +22.68 262589.2048 +22.995 259486.3395 +23.315 256371.7624 +23.639 253256.3389 +23.967 250141.0139 +24.3 247017.3993 +24.638 243886.7699 +24.981 240750.3883 +25.328 237618.4709 +25.68 234483.0503 +26.037 231345.3479 +26.398 228215.1822 +26.765 225076.4019 +27.137 221938.912 +27.514 218803.87 +27.897 215664.2775 +28.284 212537.651 +28.678 209401.0326 +29.076 206279.5652 +29.48 203158.6251 +29.89 200039.6067 +30.305 196931.313 +30.726 193827.4268 +31.153 190729.2729 +31.586 187638.1512 +32.025 184555.336 +32.47 181482.0752 +32.922 178412.857 +33.379 175362.4549 +33.843 172318.6827 +34.313 169289.4074 +34.79 166269.4591 +35.274 163260.2526 +35.764 160269.2163 +36.261 157291.4236 +36.765 154328.1868 +37.276 151380.7822 +37.794 148450.4495 +38.319 145538.3912 +38.852 142640.3891 +39.392 139763.1694 +39.939 136907.8173 +40.494 134070.3198 +41.057 131252.0019 +41.628 128454.1439 +42.206 125682.7235 +42.793 122929.3402 +43.387 120204.52 +43.99 117500.1851 +44.602 114817.6903 +45.221 112166.8033 +45.85 109535.7773 +46.487 106934.1788 +47.133 104358.9225 +47.788 101811.1019 +48.452 99291.75637 +49.126 96798.21828 +49.808 94338.81708 +50.501 91903.74649 +51.202 89504.50555 +51.914 87131.72385 +52.635 84793.04252 +53.367 82482.88787 +54.109 80205.40063 +54.861 77961.37359 +55.623 75751.54018 +56.396 73573.79862 +57.18 71429.00788 +57.974 69320.57748 +58.78 67243.92644 +59.597 65202.41528 +60.425 63196.64596 +61.265 61224.84776 +62.116 59289.95559 +62.98 57388.05239 +63.855 55524.10591 +64.742 53696.379 +65.642 51903.34842 +66.554 50147.47733 +67.479 48427.24411 +68.417 46743.08469 +69.368 45095.36778 +70.332 43484.39651 +71.309 41910.41015 +72.3 40372.06244 +73.305 38869.64041 +74.324 37403.36462 +75.357 35973.39118 +76.404 34579.81386 +77.466 33221.41259 +78.543 31898.31274 +79.634 30611.73111 +80.741 29359.31053 +81.863 28142.19629 +83.001 26959.25632 +84.154 25811.42613 +85.324 24696.61831 +86.509 23616.58791 +87.712 22568.45458 +88.931 21553.82115 +90.166 20572.37883 +91.42 19621.55267 +92.69 18703.37632 +93.978 17816.05979 +95.284 16959.31545 +96.608 16132.80865 +97.951 15335.58213 +99.312 14567.85323 +100.69 13829.68359 +102.09 13118.0229 +103.51 12433.59611 +104.95 11775.98809 +106.41 11144.74638 +107.89 10539.3846 +109.39 9959.385575 +110.91 9404.204625 +112.45 8873.272622 +114.01 8365.999036 +115.59 7881.774874 +117.2 7460.178341 +118.83 7228.348495 +120.48 7003.450446 +122.16 6784.025887 +123.85 6572.534707 +125.57 6366.321894 +127.32 6165.337807 +129.09 5970.626904 +130.88 5782.037356 +132.7 5598.407951 +134.55 5419.675918 +136.42 5246.698998 +138.31 5079.327274 +140.23 4916.566863 +142.18 4758.344584 +144.16 4604.587623 +146.16 4455.961339 +148.19 4311.610415 +150.25 4171.458506 +152.34 4035.426113 +154.46 3903.431083 +156.6 3775.986832 +158.78 3651.820836 +160.99 3531.446175 +163.23 3414.777592 +165.49 3302.230056 +167.79 3192.727386 +170.13 3086.228557 +172.49 2983.558865 +174.89 2883.766668 +177.32 2787.205354 +179.78 2693.793547 +182.28 2603.087694 +184.81 2515.384491 +187.38 2430.27369 +189.99 2347.707653 +192.63 2267.938454 +195.3 2190.88675 +198.02 2115.924779 +200.77 2043.552345 +203.56 1973.441421 +206.39 1905.544666 +209.26 1839.811647 +212.16 1776.407643 +215.11 1714.843506 +218.1 1655.287556 +221.13 1597.689558 +224.21 1541.818231 +227.32 1487.986494 +230.48 1435.798478 +233.69 1385.220874 +236.93 1336.520082 +240.23 1289.204045 +243.56 1243.662363 +246.95 1199.443746 +250.38 1156.775461 +253.86 1115.493157 +257.39 1075.562841 +260.97 1036.951034 +264.59 999.7271021 +268.27 963.6521452 +272 928.795793 +275.78 895.1254624 +279.61 862.6086051 +283.5 831.1323546 +287.44 800.7502622 +291.43 771.4307263 +295.48 743.0732417 +299.59 715.6543936 +303.75 689.2140487 +307.97 663.6622519 +312.25 638.975792 +316.59 615.1320815 +320.99 592.1088782 +325.45 569.8835168 +329.98 548.3864809 +334.56 527.6908998 +339.21 507.6849193 +343.92 488.3927786 +348.7 469.7547047 +353.55 451.7539347 +358.46 434.409637 +363.45 417.6347324 +368.5 401.4804357 +373.62 385.8975528 +378.81 370.8705312 +384.07 356.3844696 +389.41 342.3973977 +394.82 328.9223875 +400.31 315.9216842 +405.87 303.4054049 +411.51 291.3384686 +417.23 279.7094854 +423.03 268.50697 +428.91 257.7198867 +434.87 247.3373708 +440.92 237.3321989 +447.04 227.7269406 +453.26 218.4650157 +459.56 209.5676564 +465.94 201.0250067 +472.42 192.8020596 +478.98 184.9160506 +485.64 177.334933 +492.39 170.0628821 +499.23 163.092262 +506.17 156.4058499 +513.2 150.0063124 +520.34 143.8691379 +527.57 138.0052664 +534.9 132.3999236 +542.33 127.0470434 +549.87 121.9337777 +557.51 117.0611991 +565.26 112.4173259 +573.11 108.0026277 +581.08 103.8006211 +589.16 99.81163963 +597.34 96.03498234 +605.64 92.43547515 +614.06 88.97808829 +622.6 85.64880349 +631.25 82.44723778 +640.02 79.3654922 +648.91 76.39957279 +657.93 73.54252946 +667.08 70.79095349 +676.35 68.14424476 +685.75 65.59611129 +695.28 63.14345719 +704.94 60.78310462 +714.74 58.50968573 +724.67 56.32263891 +734.74 54.216913 +744.95 52.18994497 +755.3 50.23911874 +765.8 48.36012541 +776.44 46.55239596 +787.23 44.81191579 +798.17 43.13650084 +809.27 41.52256768 +820.51 39.97095146 +831.92 38.47553858 +843.48 37.03710191 +855.2 35.65252951 +867.09 34.31893295 +879.14 33.03575641 +891.35 31.80130535 +903.74 30.612018 +916.3 29.4674074 +929.03 28.36598794 +941.95 27.30466432 +955.04 26.28376528 +968.31 25.30118581 +981.77 24.35496439 +995.41 23.44458542 +1009.2 22.57074682 +1023.3 21.72245955 +1037.5 20.91136838 +1051.9 20.13047146 +1066.5 19.37878131 +1081.3 18.65532875 +1096.4 17.95454302 +1111.6 17.28480667 +1127.1 16.63640061 +1142.7 16.01682115 +1158.6 15.41727361 +1174.7 14.84089692 +1191 14.286881 +1207.6 13.75119866 +1224.4 13.23648737 +1241.4 12.7420038 +1258.6 12.26700831 +1276.1 11.80816335 +1293.9 11.36506396 +1311.8 10.94202484 +1330.1 10.53140215 +1348.6 10.13727998 +1367.3 9.759048479 +1386.3 9.39419581 +1405.6 9.042329465 +1425.1 8.704801282 +1444.9 8.379416539 +1465 8.065809075 +1485.3 7.765102299 +1506 7.473980389 +1526.9 7.19491389 +1548.1 6.926161446 +1569.7 6.666189701 +1591.5 6.417083294 +1613.6 6.177323253 +1636 5.946600954 +1658.7 5.724616395 +1681.8 5.510146888 +1705.2 5.303880933 +1728.9 5.105538212 +1752.9 4.914844167 +1777.3 4.730779485 +1802 4.553877781 +1827 4.383882915 +1852.4 4.21990427 +1878.1 4.062382268 +1904.2 3.910501169 +1930.7 3.76409275 +1957.5 3.62351657 +1984.7 3.488058335 +2012.3 3.357559075 +2040.3 3.231866672 +2068.6 3.111254629 +2097.4 2.994721077 +2126.5 2.882931066 +2156.1 2.77497312 +2186.1 2.67109119 +2216.4 2.571477607 +2247.2 2.475339865 +2278.5 2.382580676 +2310.1 2.293672422 +2342.2 2.20792851 +2374.8 2.125253705 +2407.8 2.04579621 +2441.3 1.969213972 +2475.2 1.895636354 +2509.6 1.824750103 +2544.5 1.756472947 +2579.8 1.690906278 +2615.7 1.627598065 +2652 1.566822772 +2688.9 1.508168062 +2726.2 1.451876465 +2764.1 1.397572847 +2802.5 1.345336231 +2841.5 1.29496697 +2881 1.246532427 +2921 1.199965692 +2961.6 1.155091437 +3002.8 1.111857663 +3044.5 1.070312647 +3086.8 1.030301363 +3129.7 0.991775049 +3173.2 0.954686163 +3217.3 0.918987802 +3262 0.88463397 +3307.4 0.851506886 +3353.3 0.819709119 +3399.9 0.789059332 +3447.2 0.759523056 +3495.1 0.73112534 +3543.6 0.703826412 +3592.9 0.677480776 +3642.8 0.652163442 +3693.5 0.627741554 +3744.8 0.604280495 +3796.8 0.581702137 +3849.6 0.559935961 +3903.1 0.538996808 +3957.3 0.518856555 +4012.3 0.499452962 +4068.1 0.480763399 +4124.6 0.462796515 +4181.9 0.445496504 +4240.1 0.428813898 +4299 0.412785116 +4358.7 0.397360573 +4419.3 0.38249553 +4480.7 0.36819576 +4543 0.35442004 +4606.1 0.341173316 +4670.1 0.328417275 +4735.1 0.316117259 +4800.9 0.304295688 +4867.6 0.292918544 +4935.2 0.281971161 +5003.8 0.271423806 +5073.3 0.26127859 +5143.9 0.251494111 +5215.3 0.242099366 +5287.8 0.233042449 +5361.3 0.224325002 +5435.8 0.215935874 +5511.4 0.207853504 +5588 0.200078525 +5665.6 0.192600483 +5744.3 0.185399998 +5824.2 0.178459527 +5905.1 0.171787685 +5987.2 0.165359357 +6070.4 0.159174453 +6154.8 0.153217754 +6240.3 0.14748864 +6327 0.141972953 +6414.9 0.136663847 +6504.1 0.131548767 +6594.5 0.126627072 +6686.1 0.121892274 +6779 0.117333211 +6873.3 0.112939548 +6968.8 0.108714996 +7065.6 0.104649595 +7163.8 0.100733996 +7263.4 0.09696341 +7364.3 0.093336811 +7466.7 0.08984249 +7570.4 0.086482887 +7675.6 0.083247069 +7782.3 0.080131078 +7890.5 0.077131139 +8000.1 0.074246093 +8111.3 0.071467007 +8224 0.068792985 +8338.3 0.066218184 +8454.2 0.063739304 +8571.7 0.061353306 +8690.8 0.059057207 +8811.6 0.056846146 +8934.1 0.054717388 +9058.2 0.052669903 +9184.1 0.050697784 +9311.7 0.048800147 +9441.2 0.046971671 +9572.4 0.04521289 +9705.4 0.043520172 +9840.3 0.041890126 +9977 0.040321879 +10116 0.038807906 +10256 0.037360186 +10399 0.035956246 +10543 0.034614 +10690 0.033313111 +10838 0.032069622 +10989 0.030865094 +11142 0.029706347 +11297 0.028591827 +11454 0.027520036 +11613 0.026489507 +11774 0.025498795 +11938 0.024540675 +12104 0.02361992 +12272 0.022735195 +12442 0.02188523 +12615 0.021064031 +12791 0.020270856 +12968 0.019513518 +13149 0.018778238 +13331 0.018076305 +13517 0.017395228 +13704 0.016745124 +13895 0.016114706 +14088 0.015509907 +14284 0.014926777 +14482 0.014367498 +14684 0.01382579 +14888 0.013306386 +15095 0.012805994 +15304 0.012326324 +15517 0.011862207 +15733 0.011415362 +15951 0.010987187 +16173 0.010573211 +16398 0.010174867 +16626 0.00979163 +16857 0.009422991 +17091 0.009068452 +17329 0.008726093 +17569 0.008398321 +17814 0.008080646 +18061 0.00777658 +18312 0.007483219 +18567 0.007200258 +18825 0.006928449 +19086 0.00666739 +19351 0.006415738 +19620 0.00617321 +19893 0.005939526 +20170 0.005714411 +20450 0.005498368 +20734 0.005290322 +21022 0.005090018 +21314 0.004897205 +21611 0.004711012 +21911 0.004532454 +22215 0.004360666 +22524 0.004194884 +22837 0.00403545 +23154 0.003882148 +23476 0.003734306 +23803 0.003591762 +24133 0.003455188 +24469 0.003323165 +24809 0.003196328 +25154 0.003074137 +25503 0.002956781 +25858 0.002843447 +26217 0.002734634 +26581 0.002629885 +26951 0.002528792 +27325 0.002431775 +27705 0.002338187 +28090 0.002248163 +28480 0.002161586 +28876 0.002078126 +29277 0.001997885 +29684 0.001920563 +30097 0.001846071 +30515 0.00177449 +30939 0.001705554 +31369 0.001639179 +31805 0.001575283 +32247 0.001513784 +32695 0.001454603 +33150 0.001397538 +33610 0.001342764 +34077 0.00128997 +34551 0.001239094 +35031 0.001190181 +35518 0.001143065 +36012 0.001097689 +36512 0.001054085 +37020 0.001012024 +37534 0.000971619 +38056 0.000932661 +38585 0.000895178 +39121 0.000859119 +39664 0.000824438 +40216 0.000790966 +40775 0.000758783 +41341 0.000727846 +41916 0.000698007 +42498 0.000669332 +43089 0.000641686 +43688 0.000615084 +44295 0.00058949 +44910 0.000564872 +45535 0.000541118 +46167 0.000518312 +46809 0.000496318 +47460 0.000475144 +48119 0.000454794 +48788 0.000435179 +49466 0.000416306 +50153 0.000398151 +50850 0.000380663 +51557 0.000363821 +52274 0.000347606 +53000 0.000332017 +53737 0.000316992 +54483 0.000302553 +55241 0.000288624 +56008 0.000275243 +56787 0.000262339 +57576 0.000249932 +58376 0.000237987 +59187 0.000226491 +60010 0.000215415 +60844 0.000204758 +61689 0.000194507 +62547 0.000184625 +63416 0.000175123 +64297 0.000165977 +65191 0.000157165 +66097 0.000148687 +67015 0.00014053 +67947 0.000132669 +68891 0.000125109 +69848 0.000117832 +70819 0.000110822 +71803 0.000104078 +72801 9.75845E-05 +73813 9.13325E-05 +74839 8.53147E-05 +75879 7.95233E-05 +76933 7.39508E-05 +78002 6.8585E-05 +79086 6.3419E-05 +80186 5.84421E-05 +81300 5.36567E-05 +82430 4.90481E-05 +83575 4.46146E-05 +84737 4.03428E-05 +85914 3.62346E-05 +87108 3.2278E-05 +88319 2.84681E-05 +89546 2.48031E-05 +90791 2.12725E-05 +92053 1.78747E-05 +93332 1.46052E-05 +94629 1.14575E-05 +95944 8.42761E-06 +97277 5.51157E-06 +98629 2.70357E-06 +100000 0 +-1 -1 +-2 -2 \ No newline at end of file diff --git a/examples/advanced/radioprotection/speZ=2.txt b/examples/advanced/radioprotection/speZ=2.txt new file mode 100644 index 0000000000..036fe4a067 --- /dev/null +++ b/examples/advanced/radioprotection/speZ=2.txt @@ -0,0 +1,844 @@ +Data from: EADS UK. 20.02.2004 + +SPE envelope fluence of worst week Oct 1989 CREME96 (online) and Aug 1972 (code from D Henderyickx) models +Energy. [MeV/nuc] +Integral Flux. [particles/(m2-s-sr-MeV/nuc)] + +Z=2 + +Energy Flux +1.0023 73978.04958 +1.0162 73312.97597 +1.0304 72644.52627 +1.0447 71982.29239 +1.0592 71321.73849 +1.0739 70663.03059 +1.0888 70006.34445 +1.104 69347.50091 +1.1193 68695.30307 +1.1349 68041.36837 +1.1506 67394.235 +1.1666 66745.8079 +1.1828 66100.33603 +1.1993 65454.02391 +1.2159 64814.8387 +1.2328 64175.20666 +1.25 63535.38079 +1.2674 62899.24465 +1.285 62266.89147 +1.3028 61638.44547 +1.3209 61010.53901 +1.3393 60383.37104 +1.3579 59760.51929 +1.3768 59138.77915 +1.3959 58521.57853 +1.4153 57905.81775 +1.435 57291.67935 +1.4549 56682.42063 +1.4751 56075.11406 +1.4956 55469.92206 +1.5164 54866.99968 +1.5375 54266.51621 +1.5589 53668.63449 +1.5805 53076.25338 +1.6025 52484.01519 +1.6248 51894.80523 +1.6473 51311.35297 +1.6702 50728.60204 +1.6934 50149.26898 +1.717 49571.02052 +1.7408 48998.89198 +1.765 48428.17946 +1.7896 47859.07083 +1.8144 47296.30944 +1.8397 46733.2156 +1.8652 46176.61395 +1.8911 45622.23695 +1.9174 45070.20697 +1.9441 44520.69685 +1.9711 43975.90393 +1.9985 43433.90718 +2.0263 42894.85262 +2.0544 42360.77952 +2.083 41828.0179 +2.1119 41300.4208 +2.1413 40774.45963 +2.171 40253.82839 +2.2012 39735.13254 +2.2318 39220.2357 +2.2628 38709.23857 +2.2942 38202.23818 +2.3261 37697.74329 +2.3585 37195.90587 +2.3912 36699.90999 +2.4245 36205.31268 +2.4582 35715.21988 +2.4923 35229.701 +2.527 34746.03145 +2.5621 34267.11826 +2.5977 33791.68281 +2.6338 33319.83283 +2.6704 32851.67224 +2.7075 32387.30137 +2.7451 31926.80946 +2.7833 31469.08796 +2.822 31015.4437 +2.8612 30565.95171 +2.9009 30120.68808 +2.9412 29678.62935 +2.9821 29239.88657 +3.0236 28804.56265 +3.0656 28373.79099 +3.1082 27946.61883 +3.1514 27523.13464 +3.1952 27103.42811 +3.2396 26687.58154 +3.2846 26275.67446 +3.3303 25866.88467 +3.3765 25463.06632 +3.4235 25061.67956 +3.471 24665.36667 +3.5193 24271.69688 +3.5682 23882.3846 +3.6178 23496.70132 +3.6681 23114.72601 +3.719 22737.27167 +3.7707 22362.9244 +3.8231 21992.49298 +3.8762 21626.03211 +3.9301 21262.92098 +3.9847 20903.90636 +4.0401 20548.39079 +4.0963 20196.44839 +4.1532 19848.75667 +4.2109 19504.74856 +4.2694 19164.48758 +4.3288 18827.46271 +4.3889 18494.85796 +4.4499 18165.61453 +4.5118 17839.80064 +4.5745 17517.98999 +4.638 17200.21617 +4.7025 16885.53696 +4.7678 16574.97982 +4.8341 16267.6446 +4.9013 15964.04411 +4.9694 15664.21533 +5.0385 15367.7664 +5.1085 15075.16783 +5.1795 14786.0433 +5.2515 14500.43098 +5.3244 14218.76304 +5.3984 13940.30575 +5.4735 13665.10357 +5.5495 13393.92247 +5.6266 13126.07517 +5.7048 12861.6002 +5.7841 12600.53711 +5.8645 12342.91867 +5.946 12088.77087 +6.0286 11838.11295 +6.1124 11590.67925 +6.1974 11346.50933 +6.2835 11105.90668 +6.3708 10868.61023 +6.4594 10654.43396 +6.5491 10618.43067 +6.6401 10582.02992 +6.7324 10545.23662 +6.826 10508.05575 +6.9209 10470.49232 +7.017 10432.59073 +7.1146 10394.23797 +7.2134 10355.55727 +7.3137 10316.43654 +7.4153 10276.95944 +7.5184 10237.05392 +7.6229 10196.76466 +7.7288 10156.09739 +7.8362 10115.01975 +7.9451 10073.53803 +8.0555 10031.65859 +8.1675 9989.350104 +8.281 9946.657022 +8.3961 9903.548436 +8.5128 9860.031341 +8.6311 9816.112776 +8.751 9771.799819 +8.8726 9727.062884 +8.9959 9681.909639 +9.1209 9636.347795 +9.2477 9590.348918 +9.3762 9543.957342 +9.5065 9497.145066 +9.6386 9449.920496 +9.7726 9402.256603 +9.9084 9354.197718 +10.046 9305.752371 +10.186 9256.71954 +10.327 9207.597605 +10.471 9157.699562 +10.616 9107.728233 +10.764 9057.004207 +10.913 9006.222815 +11.065 8954.71235 +11.219 8902.824559 +11.375 8850.569437 +11.533 8797.957004 +11.693 8744.997303 +11.856 8691.372411 +12.02 8637.75039 +12.187 8583.487424 +12.357 8528.599786 +12.529 8473.423602 +12.703 8417.96904 +12.879 8362.246266 +13.058 8305.951999 +13.24 8249.102789 +13.424 8192.024388 +13.61 8134.726968 +13.799 8076.915883 +13.991 8018.607825 +14.186 7959.819537 +14.383 7900.86594 +14.583 7841.461214 +14.785 7781.915801 +14.991 7721.656935 +15.199 7661.286448 +15.41 7600.527472 +15.625 7539.112289 +15.842 7477.628994 +16.062 7415.807537 +16.285 7353.664653 +16.511 7291.217045 +16.741 7228.208613 +16.973 7165.203889 +17.209 7101.676314 +17.449 7037.649615 +17.691 6973.673828 +17.937 6909.236631 +18.186 6844.619931 +18.439 6779.58413 +18.695 6714.406118 +18.955 6648.851043 +19.218 6583.190695 +19.485 6517.194971 +19.756 6450.887054 +20.031 6384.290035 +20.309 6317.665295 +20.591 6250.792247 +20.878 6183.460254 +21.168 6116.161111 +21.462 6048.681356 +21.76 5981.04324 +22.063 5913.045699 +22.369 5845.159457 +22.68 5776.962506 +22.995 5708.699469 +23.315 5640.178773 +23.639 5571.639455 +23.967 5503.102305 +24.3 5434.382785 +24.638 5365.508937 +24.981 5296.508542 +25.328 5227.606359 +25.68 5158.627106 +26.037 5089.597655 +26.398 5020.734008 +26.765 4951.680843 +27.137 4882.656064 +27.514 4813.68514 +27.897 4744.614104 +28.284 4675.828323 +28.678 4606.822716 +29.076 4538.150435 +29.48 4469.489753 +29.89 4400.871347 +30.305 4332.488886 +30.726 4264.20339 +31.153 4196.044003 +31.586 4128.039326 +32.025 4060.217392 +32.47 3992.605655 +32.922 3925.082855 +33.379 3857.974009 +33.843 3791.01102 +34.313 3724.366962 +34.79 3657.928101 +35.274 3591.725557 +35.764 3525.922758 +36.261 3460.411319 +36.765 3395.22011 +37.276 3330.377209 +37.794 3265.90989 +38.319 3201.844606 +38.852 3138.088559 +39.392 3074.789726 +39.939 3011.971982 +40.494 2949.547036 +41.057 2887.544042 +41.628 2825.991167 +42.206 2765.019916 +42.793 2704.445483 +43.387 2644.499441 +43.99 2585.004072 +44.602 2525.989188 +45.221 2467.669673 +45.85 2409.787101 +46.487 2352.551933 +47.133 2295.896294 +47.788 2239.844241 +48.452 2184.41864 +49.126 2129.560802 +49.808 2075.453976 +50.501 2021.882423 +51.202 1969.099122 +51.914 1916.897925 +52.635 1865.446935 +53.367 1814.623533 +54.109 1764.518814 +54.861 1715.150219 +55.623 1666.533884 +56.396 1618.62357 +57.18 1571.438173 +57.974 1525.052705 +58.78 1479.366382 +59.597 1434.453136 +60.425 1390.326211 +61.265 1346.946651 +62.116 1304.379023 +62.98 1262.537153 +63.855 1221.53033 +64.742 1181.320338 +65.642 1141.873665 +66.554 1103.244501 +67.479 1065.39937 +68.417 1028.347863 +69.368 992.0980913 +70.332 956.6567233 +71.309 922.0290233 +72.3 888.1853736 +73.305 855.1320889 +74.324 822.8740216 +75.357 791.414606 +76.404 760.7559049 +77.466 730.8710771 +78.543 701.7628803 +79.634 673.4580843 +80.741 645.9048316 +81.863 619.1283184 +83.001 593.1036391 +84.154 567.8513749 +85.324 543.3256029 +86.509 519.564934 +87.712 496.5060008 +88.931 474.1840652 +90.166 452.5923343 +91.42 431.6741587 +92.69 411.4742791 +93.978 391.9533154 +95.284 373.10494 +96.608 354.9217904 +97.951 337.3828069 +99.312 320.492771 +100.69 304.2530391 +102.09 288.5965038 +103.51 273.5391145 +104.95 259.0717379 +106.41 245.1844205 +107.89 231.8664611 +109.39 219.1064826 +110.91 206.8925018 +112.45 195.2119977 +114.01 184.0519788 +115.59 173.3990472 +117.2 163.1778732 +118.83 153.4433462 +120.48 144.1806847 +122.16 135.3238834 +123.85 126.9632223 +125.57 118.9843291 +127.32 111.3806997 +129.09 104.1843168 +130.88 97.37937548 +132.7 90.91592626 +134.55 84.78544352 +136.42 79.008689 +138.31 73.56998125 +140.23 68.42814721 +142.18 63.57366697 +144.16 58.99675026 +146.16 54.708039 +148.19 50.6736925 +150.25 46.88374568 +152.34 43.32817502 +154.46 39.99694662 +156.6 36.89398021 +158.78 33.98041227 +160.99 31.26152232 +163.23 28.72763986 +165.49 26.37922324 +167.79 24.18624901 +170.13 22.14213517 +172.49 20.25548778 +174.89 18.50164636 +177.32 16.88054216 +179.78 15.38405247 +182.28 13.99908256 +184.81 12.7243833 +187.38 11.54830838 +189.99 10.46512604 +192.63 9.472811597 +195.3 8.564887881 +198.02 7.729386798 +200.77 6.967496284 +203.56 6.271232637 +206.39 5.636033147 +209.26 5.057531854 +212.16 4.533274954 +215.11 4.055702322 +218.1 3.622968375 +221.13 3.231524671 +224.21 2.876941196 +227.32 2.558366975 +230.48 2.270781105 +233.69 2.011723457 +236.93 1.780203431 +240.23 1.571765238 +243.56 1.386162262 +246.95 1.2197116 +250.38 1.071629594 +253.86 0.93975105 +257.39 0.822548504 +260.97 0.71860592 +264.59 0.626851292 +268.27 0.582864058 +272 0.561002582 +275.78 0.539970801 +279.61 0.519741009 +283.5 0.500235494 +287.44 0.481480447 +291.43 0.463450071 +295.48 0.446076237 +299.59 0.429338747 +303.75 0.413256119 +307.97 0.397768199 +312.25 0.38285631 +316.59 0.368501782 +320.99 0.354686053 +325.45 0.341391681 +329.98 0.32857327 +334.56 0.31627028 +339.21 0.304412302 +343.92 0.293010137 +348.7 0.282024971 +353.55 0.271443605 +358.46 0.261274259 +363.45 0.251463274 +368.5 0.242037506 +373.62 0.232965381 +378.81 0.224235311 +384.07 0.215835944 +389.41 0.207741019 +394.82 0.199955618 +400.31 0.192455512 +405.87 0.185244751 +411.51 0.17830095 +417.23 0.171615597 +423.03 0.165180336 +428.91 0.158986958 +434.87 0.153027447 +440.92 0.147284544 +447.04 0.141769632 +453.26 0.136448658 +459.56 0.131332399 +465.94 0.126413772 +472.42 0.121671264 +478.98 0.117113546 +485.64 0.112720818 +492.39 0.108494375 +499.23 0.104428648 +506.17 0.100512536 +513.2 0.096746722 +520.34 0.093115878 +527.57 0.089625585 +534.9 0.086266352 +542.33 0.083033845 +549.87 0.079919685 +557.51 0.076924162 +565.26 0.074039555 +573.11 0.071265861 +581.08 0.068592475 +589.16 0.066019567 +597.34 0.063546839 +605.64 0.061164977 +614.06 0.058871176 +622.6 0.056662612 +631.25 0.054538922 +640.02 0.0524949 +648.91 0.050527964 +657.93 0.048633375 +667.08 0.04680888 +676.35 0.045054138 +685.75 0.043364966 +695.28 0.04173923 +704.94 0.040174835 +714.74 0.038668211 +724.67 0.037218972 +734.74 0.03582378 +744.95 0.034480893 +755.3 0.033188588 +765.8 0.031944004 +776.44 0.030746742 +787.23 0.029594128 +798.17 0.028484718 +809.27 0.027416132 +820.51 0.026388918 +831.92 0.025399025 +843.48 0.024446939 +855.2 0.023530589 +867.09 0.022648068 +879.14 0.021799 +891.35 0.020982259 +903.74 0.020195481 +916.3 0.019438335 +929.03 0.018709837 +941.95 0.018007939 +955.04 0.017332849 +968.31 0.016683164 +981.77 0.016057578 +995.41 0.015455752 +1009.2 0.014878143 +1023.3 0.014317487 +1037.5 0.013781474 +1051.9 0.013265454 +1066.5 0.012768784 +1081.3 0.012290839 +1096.4 0.011827917 +1111.6 0.01138554 +1127.1 0.010957301 +1142.7 0.010548146 +1158.6 0.010152245 +1174.7 0.00977168 +1191 0.009405918 +1207.6 0.009052307 +1224.4 0.008712578 +1241.4 0.008386223 +1258.6 0.008072765 +1276.1 0.007770002 +1293.9 0.007477656 +1311.8 0.007198569 +1330.1 0.006927706 +1348.6 0.00666776 +1367.3 0.006418321 +1386.3 0.006177725 +1405.6 0.005945717 +1425.1 0.005723185 +1444.9 0.005508682 +1465 0.005301966 +1485.3 0.005103774 +1506 0.004911921 +1526.9 0.004728031 +1548.1 0.004550954 +1569.7 0.00437968 +1591.5 0.00421558 +1613.6 0.004057653 +1636 0.003905697 +1658.7 0.00375951 +1681.8 0.003618287 +1705.2 0.003482481 +1728.9 0.003351904 +1752.9 0.003226375 +1777.3 0.003105222 +1802 0.002988797 +1827 0.002876931 +1852.4 0.002769033 +1878.1 0.002665394 +1904.2 0.002565477 +1930.7 0.002469171 +1957.5 0.002376711 +1984.7 0.002287627 +2012.3 0.002201815 +2040.3 0.002119169 +2068.6 0.002039871 +2097.4 0.001963264 +2126.5 0.001889782 +2156.1 0.001818824 +2186.1 0.001750551 +2216.4 0.001685092 +2247.2 0.001621926 +2278.5 0.001560987 +2310.1 0.001502582 +2342.2 0.00144626 +2374.8 0.00139196 +2407.8 0.001339779 +2441.3 0.001289493 +2475.2 0.001241184 +2509.6 0.001194648 +2544.5 0.001149829 +2579.8 0.001106793 +2615.7 0.001065244 +2652 0.001025362 +2688.9 0.000986875 +2726.2 0.000949942 +2764.1 0.000914318 +2802.5 0.000880053 +2841.5 0.000847016 +2881 0.000815251 +2921 0.000784715 +2961.6 0.000755292 +3002.8 0.000726947 +3044.5 0.000699711 +3086.8 0.000673485 +3129.7 0.000648234 +3173.2 0.000623928 +3217.3 0.000600536 +3262 0.000578026 +3307.4 0.000556323 +3353.3 0.000535493 +3399.9 0.000515418 +3447.2 0.000496073 +3495.1 0.000477476 +3543.6 0.000459601 +3592.9 0.000442351 +3642.8 0.000425776 +3693.5 0.000409789 +3744.8 0.000394433 +3796.8 0.000379656 +3849.6 0.000365413 +3903.1 0.000351712 +3957.3 0.000338534 +4012.3 0.000325841 +4068.1 0.000313615 +4124.6 0.000301864 +4181.9 0.00029055 +4240.1 0.000279641 +4299 0.00026916 +4358.7 0.000259075 +4419.3 0.000249357 +4480.7 0.00024001 +4543 0.000231006 +4606.1 0.000222349 +4670.1 0.000214014 +4735.1 0.000205977 +4800.9 0.000198254 +4867.6 0.000190822 +4935.2 0.000183671 +5003.8 0.000176783 +5073.3 0.000170157 +5143.9 0.000163768 +5215.3 0.000157634 +5287.8 0.000151721 +5361.3 0.000146031 +5435.8 0.000140555 +5511.4 0.00013528 +5588 0.000130207 +5665.6 0.000125327 +5744.3 0.000120629 +5824.2 0.000116102 +5905.1 0.000111749 +5987.2 0.000107557 +6070.4 0.000103523 +6154.8 9.96387E-05 +6240.3 9.59032E-05 +6327 9.23072E-05 +6414.9 8.88461E-05 +6504.1 8.55119E-05 +6594.5 8.23041E-05 +6686.1 7.92184E-05 +6779 7.62475E-05 +6873.3 7.33847E-05 +6968.8 7.06325E-05 +7065.6 6.79842E-05 +7163.8 6.54337E-05 +7263.4 6.2978E-05 +7364.3 6.06163E-05 +7466.7 5.83411E-05 +7570.4 5.61536E-05 +7675.6 5.40469E-05 +7782.3 5.20186E-05 +7890.5 5.00659E-05 +8000.1 4.81883E-05 +8111.3 4.63798E-05 +8224 4.46398E-05 +8338.3 4.29645E-05 +8454.2 4.13519E-05 +8571.7 3.97999E-05 +8690.8 3.83065E-05 +8811.6 3.68685E-05 +8934.1 3.54842E-05 +9058.2 3.41529E-05 +9184.1 3.28708E-05 +9311.7 3.16372E-05 +9441.2 3.04487E-05 +9572.4 2.93056E-05 +9705.4 2.82055E-05 +9840.3 2.71463E-05 +9977 2.61273E-05 +10116 2.51438E-05 +10256 2.42033E-05 +10399 2.32914E-05 +10543 2.24196E-05 +10690 2.15748E-05 +10838 2.07674E-05 +10989 1.99853E-05 +11142 1.9233E-05 +11297 1.85096E-05 +11454 1.78139E-05 +11613 1.71451E-05 +11774 1.65021E-05 +11938 1.58805E-05 +12104 1.52831E-05 +12272 1.47091E-05 +12442 1.41578E-05 +12615 1.36252E-05 +12791 1.31107E-05 +12968 1.26196E-05 +13149 1.21429E-05 +13331 1.16878E-05 +13517 1.12463E-05 +13704 1.08249E-05 +13895 1.04163E-05 +14088 1.00243E-05 +14284 9.64645E-06 +14482 9.28407E-06 +14684 8.9331E-06 +14888 8.59663E-06 +15095 8.27252E-06 +15304 7.96185E-06 +15517 7.66129E-06 +15733 7.37194E-06 +15951 7.09472E-06 +16173 6.82672E-06 +16398 6.56886E-06 +16626 6.3208E-06 +16857 6.08222E-06 +17091 5.8528E-06 +17329 5.63127E-06 +17569 5.41921E-06 +17814 5.2137E-06 +18061 5.01701E-06 +18312 4.82727E-06 +18567 4.64427E-06 +18825 4.4685E-06 +19086 4.2997E-06 +19351 4.13701E-06 +19620 3.98022E-06 +19893 3.82918E-06 +20170 3.68368E-06 +20450 3.54406E-06 +20734 3.40962E-06 +21022 3.2802E-06 +21314 3.15563E-06 +21611 3.03536E-06 +21911 2.92002E-06 +22215 2.80907E-06 +22524 2.70201E-06 +22837 2.59906E-06 +23154 2.50008E-06 +23476 2.40464E-06 +23803 2.31262E-06 +24133 2.22447E-06 +24469 2.13927E-06 +24809 2.05741E-06 +25154 1.97857E-06 +25503 1.90286E-06 +25858 1.82974E-06 +26217 1.75955E-06 +26581 1.69199E-06 +26951 1.62679E-06 +27325 1.56423E-06 +27705 1.50389E-06 +28090 1.44585E-06 +28480 1.39004E-06 +28876 1.33624E-06 +29277 1.28452E-06 +29684 1.23469E-06 +30097 1.18669E-06 +30515 1.14057E-06 +30939 1.09616E-06 +31369 1.0534E-06 +31805 1.01225E-06 +32247 9.72637E-07 +32695 9.34526E-07 +33150 8.97781E-07 +33610 8.62515E-07 +34077 8.28527E-07 +34551 7.95777E-07 +35031 7.64294E-07 +35518 7.3397E-07 +36012 7.0477E-07 +36512 6.76713E-07 +37020 6.49652E-07 +37534 6.23659E-07 +38056 5.98599E-07 +38585 5.74491E-07 +39121 5.51301E-07 +39664 5.28999E-07 +40216 5.07477E-07 +40775 4.86787E-07 +41341 4.66899E-07 +41916 4.47719E-07 +42498 4.29289E-07 +43089 4.11523E-07 +43688 3.94428E-07 +44295 3.77984E-07 +44910 3.62168E-07 +45535 3.46908E-07 +46167 3.3226E-07 +46809 3.18134E-07 +47460 3.04536E-07 +48119 2.91469E-07 +48788 2.78876E-07 +49466 2.6676E-07 +50153 2.55105E-07 +50850 2.4388E-07 +51557 2.33072E-07 +52274 2.22666E-07 +53000 2.12663E-07 +53737 2.03023E-07 +54483 1.9376E-07 +55241 1.84825E-07 +56008 1.76243E-07 +56787 1.67968E-07 +57576 1.60011E-07 +58376 1.52352E-07 +59187 1.44982E-07 +60010 1.37882E-07 +60844 1.31051E-07 +61689 1.24481E-07 +62547 1.18148E-07 +63416 1.12059E-07 +64297 1.06199E-07 +65191 1.00553E-07 +66097 9.51222E-08 +67015 8.9898E-08 +67947 8.48629E-08 +68891 8.00214E-08 +69848 7.53621E-08 +70819 7.08742E-08 +71803 6.65567E-08 +72801 6.23997E-08 +73813 5.83981E-08 +74839 5.45467E-08 +75879 5.08406E-08 +76933 4.72749E-08 +78002 4.38419E-08 +79086 4.05371E-08 +80186 3.73535E-08 +81300 3.42929E-08 +82430 3.13456E-08 +83575 2.85105E-08 +84737 2.57791E-08 +85914 2.31526E-08 +87108 2.06232E-08 +88319 1.8188E-08 +89546 1.58455E-08 +90791 1.35892E-08 +92053 1.1418E-08 +93332 9.32904E-09 +94629 7.31806E-09 +95944 5.38252E-09 +97277 3.51992E-09 +98629 1.72652E-09 +100000 0 diff --git a/examples/advanced/radioprotection/src/G4IonC12.cc b/examples/advanced/radioprotection/src/G4IonC12.cc new file mode 100644 index 0000000000..88ec54b39a --- /dev/null +++ b/examples/advanced/radioprotection/src/G4IonC12.cc @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonC12.cc,v 1.1 2004/05/14 12:29:33 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ---------------------------------------------------------------------- +// GEANT 4 class implementation file +// +// History: first implementation, based on object model of +// 4th April 1996, G.Cosmo +// ********************************************************************** +// ---------------------------------------------------------------------- + +#include +#include + +#include "G4IonC12.hh" + +// ###################################################################### +// ### IonC12 ### +// ###################################################################### + +G4IonC12::G4IonC12( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable ) + : G4VIon( aName,mass,width,charge,iSpin,iParity, + iConjugation,iIsospin,iIsospin3,gParity,pType, + lepton,baryon,encoding,stable,lifetime,decaytable ) +{ +} + +G4IonC12::~G4IonC12() +{ +} + +// ...................................................................... +// ... static member definitions ... +// ...................................................................... +// +// 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 + +G4IonC12 G4IonC12::theIonC12( + "IonC12", 11.1749*GeV, 0.0*MeV, +6.0*eplus, + 0, +1, 0, + 0, 0, 0, + "static_nucleus", 0, +12, 0, + true, -1.0, 0 +); + +G4IonC12* G4IonC12::IonC12Definition(){return &theIonC12;} +G4IonC12* G4IonC12::IonC12(){return &theIonC12;} + + diff --git a/examples/advanced/radioprotection/src/G4IonFe52.cc b/examples/advanced/radioprotection/src/G4IonFe52.cc new file mode 100644 index 0000000000..eeafe59e0b --- /dev/null +++ b/examples/advanced/radioprotection/src/G4IonFe52.cc @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonFe52.cc,v 1.1 2004/05/14 12:29:33 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ---------------------------------------------------------------------- +// GEANT 4 class implementation file +// +// History: first implementation, based on object model of +// 4th April 1996, G.Cosmo +// ********************************************************************** +// ---------------------------------------------------------------------- + +#include +#include + +#include "G4IonFe52.hh" + +// ###################################################################### +// ### IonFe52 ### +// ###################################################################### + +G4IonFe52::G4IonFe52( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable ) + : G4VIon( aName,mass,width,charge,iSpin,iParity, + iConjugation,iIsospin,iIsospin3,gParity,pType, + lepton,baryon,encoding,stable,lifetime,decaytable ) +{ +} + +G4IonFe52::~G4IonFe52() +{ +} + +// ...................................................................... +// ... static member definitions ... +// ...................................................................... +// +// 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 + +G4IonFe52 G4IonFe52::theIonFe52( + "IonFe52", 48.3761*GeV, 0.0*MeV, +26.0*eplus, + 0, +1, 0, + 0, 0, 0, + "static_nucleus", 0, +52, 0, + true, -1.0, 0 +); + +G4IonFe52* G4IonFe52::IonFe52Definition(){return &theIonFe52;} +G4IonFe52* G4IonFe52::IonFe52(){return &theIonFe52;} + + diff --git a/examples/advanced/radioprotection/src/G4IonO16.cc b/examples/advanced/radioprotection/src/G4IonO16.cc new file mode 100644 index 0000000000..7d4024f05b --- /dev/null +++ b/examples/advanced/radioprotection/src/G4IonO16.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include +#include + +#include "G4IonO16.hh" + +// ###################################################################### +// ### IonO16 ### +// ###################################################################### + +G4IonO16::G4IonO16( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable ) + : G4VIon( aName,mass,width,charge,iSpin,iParity, + iConjugation,iIsospin,iIsospin3,gParity,pType, + lepton,baryon,encoding,stable,lifetime,decaytable ) +{ +} + +G4IonO16::~G4IonO16() +{ +} + +// ...................................................................... +// ... static member definitions ... +// ...................................................................... +// +// 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 + +G4IonO16 G4IonO16::theIonO16( + "IonO16", 14.8951*GeV, 0.0*MeV, +8.0*eplus, + 0, +1, 0, + 0, 0, 0, + "static_nucleus", 0, +16, 0, + true, -1.0, 0 +); + +G4IonO16* G4IonO16::IonO16Definition(){return &theIonO16;} +G4IonO16* G4IonO16::IonO16(){return &theIonO16;} + + diff --git a/examples/advanced/radioprotection/src/G4IonSi28.cc b/examples/advanced/radioprotection/src/G4IonSi28.cc new file mode 100644 index 0000000000..945f16c622 --- /dev/null +++ b/examples/advanced/radioprotection/src/G4IonSi28.cc @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4IonSi28.cc,v 1.1 2004/05/14 12:29:33 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ---------------------------------------------------------------------- +// GEANT 4 class implementation file +// +// History: first implementation, based on object model of +// 4th April 1996, G.Cosmo +// ********************************************************************** +// ---------------------------------------------------------------------- + +#include +#include + +#include "G4IonSi28.hh" + +// ###################################################################### +// ### IonSi28 ### +// ###################################################################### + +G4IonSi28::G4IonSi28( + const G4String& aName, G4double mass, + G4double width, G4double charge, + G4int iSpin, G4int iParity, + G4int iConjugation, G4int iIsospin, + G4int iIsospin3, G4int gParity, + const G4String& pType, G4int lepton, + G4int baryon, G4int encoding, + G4bool stable, G4double lifetime, + G4DecayTable *decaytable ) + : G4VIon( aName,mass,width,charge,iSpin,iParity, + iConjugation,iIsospin,iIsospin3,gParity,pType, + lepton,baryon,encoding,stable,lifetime,decaytable ) +{ +} + +G4IonSi28::~G4IonSi28() +{ +} + +// ...................................................................... +// ... static member definitions ... +// ...................................................................... +// +// 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 + +G4IonSi28 G4IonSi28::theIonSi28( + "IonSi28", 26.0532*GeV, 0.0*MeV, +14.0*eplus, + 0, +1, 0, + 0, 0, 0, + "static_nucleus", 0, +28, 0, + true, -1.0, 0 +); + +G4IonSi28* G4IonSi28::IonSi28Definition(){return &theIonSi28;} +G4IonSi28* G4IonSi28::IonSi28(){return &theIonSi28;} + + diff --git a/examples/advanced/radioprotection/src/RemSimAnalysisManager.cc b/examples/advanced/radioprotection/src/RemSimAnalysisManager.cc new file mode 100644 index 0000000000..8f7ad73160 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimAnalysisManager.cc @@ -0,0 +1,198 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************* +// * * +// * RemSimAnalysisManager.cc * +// * * +// ******************************* +// +// $Id: RemSimAnalysisManager.cc,v 1.5 2004/05/22 12:57:06 guatelli Exp $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#ifdef G4ANALYSIS_USE +#include +#include +#include "RemSimAnalysisManager.hh" + +#include "G4ios.hh" +#include +#include "G4RunManager.hh" + + +RemSimAnalysisManager* RemSimAnalysisManager::instance = 0; + +RemSimAnalysisManager::RemSimAnalysisManager() + : aFact(0), treeFact(0), theTree(0), dataPointFactory(0), + histogramFactory(0), dataPoint(0), energyDeposit(0), + primary(0), secondaryDeposit(0), primaryInitialE(0), + primaryInitialEout(0), initialE(0), + initialEout(0) +{ + aFact = AIDA_createAnalysisFactory(); + treeFact = aFact -> createTreeFactory(); +} + +RemSimAnalysisManager::~RemSimAnalysisManager() +{ + delete initialEout; + initialEout = 0; + + delete initialE; + initialE = 0; + + delete primaryInitialEout; + primaryInitialEout = 0; + + delete primaryInitialE; + primaryInitialE = 0; + + delete secondaryDeposit; + secondaryDeposit = 0; + + delete primary; + primary = 0; + + delete energyDeposit; + energyDeposit = 0; + + delete dataPoint; + dataPoint = 0; + + delete histogramFactory; + histogramFactory = 0; + + delete dataPointFactory; + dataPointFactory = 0; + + delete theTree; + theTree = 0; + + delete treeFact; + treeFact = 0; + + delete aFact; + aFact = 0; +} + +RemSimAnalysisManager* RemSimAnalysisManager::getInstance() +{ + if (instance == 0) instance = new RemSimAnalysisManager; + return instance; +} + +void RemSimAnalysisManager::book() +{ + // Define the hbook file + theTree = treeFact -> create("remsim.hbk","hbook",false, true); + + // Create histogram factory + histogramFactory = aFact -> createHistogramFactory(*theTree); + + // Histograms + + energyDeposit = histogramFactory -> createHistogram1D("10", + "Energy Deposit", + 30,// number of bins + 0.,//xmin + 30.);//xmax + + primary = histogramFactory -> createHistogram1D("20", + "Initial energy of primary particles", + 200000,0.,100000.); + + secondaryDeposit = histogramFactory -> createHistogram1D("30", + "EnergyDeposit given by secondaries", + 30,0.,30.); + + primaryInitialE = histogramFactory -> createHistogram1D("40", + "Initial energy of primaries reaching the phantom", + 200000,0.,100000.); + + + primaryInitialEout = histogramFactory -> createHistogram1D("50", + "Initial energy of primaries ougoing the phantom", + 200000,0.,100000.); + + initialE = histogramFactory -> createHistogram1D("60", + "Energy of primaries reaching the phantom", + 200000,0.,100000.); + + + initialEout = histogramFactory -> createHistogram1D("70", + "Energy of primaries outgoing the phantom", + 200000,0.,100000.); +} + +void RemSimAnalysisManager::energyDepositStore(G4int layer, G4double eDep) +{ + energyDeposit -> fill(layer,eDep); +} + +void RemSimAnalysisManager::primaryParticleEnergyDistribution(G4double energy) +{ + primary -> fill(energy); +} + +void RemSimAnalysisManager::SecondaryEnergyDeposit(G4int i, G4double EnergyDep) +{ + secondaryDeposit -> fill(i,EnergyDep); +} + +void RemSimAnalysisManager::PrimaryInitialEnergyIn(G4double EnergyDep) +{ + primaryInitialE -> fill(EnergyDep); +} + +void RemSimAnalysisManager::PrimaryInitialEnergyOut(G4double EnergyDep) +{ + primaryInitialEout -> fill(EnergyDep); +} + +void RemSimAnalysisManager::PrimaryEnergyIn(G4double EnergyDep) +{ + initialE -> fill(EnergyDep); +} + +void RemSimAnalysisManager::PrimaryEnergyOut(G4double EnergyDep) +{ + initialEout -> fill(EnergyDep); +} + +void RemSimAnalysisManager::finish() +{ + theTree -> commit(); + theTree -> close(); +} +#endif + + + + + + + + + + + diff --git a/examples/advanced/radioprotection/src/RemSimAstronautDecorator.cc b/examples/advanced/radioprotection/src/RemSimAstronautDecorator.cc new file mode 100644 index 0000000000..6945f94935 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimAstronautDecorator.cc @@ -0,0 +1,162 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ********************************** +// * * +// * RemSimAstronautDecorator.cc * +// * * +// ********************************** +// +// $Id: RemSimAstronautDecorator.cc,v 1.5 2004/05/22 12:57:06 guatelli Exp $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it + +#include "RemSimVGeometryComponent.hh" +#include "RemSimMaterial.hh" +#include "G4Material.hh" +#include "G4MaterialTable.hh" +#include "RemSimAstronautDecorator.hh" +#include "RemSimDecorator.hh" +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "RemSimSensitiveDetector.hh" +#include "RemSimROGeometry.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4UserLimits.hh" + +RemSimAstronautDecorator::RemSimAstronautDecorator(RemSimVGeometryComponent* comp) + : RemSimDecorator(comp), phantom(0), phantomLog(0), phantomPhys(0) +{ + motherAstronaut = 0; + flag = false; +} +RemSimAstronautDecorator::~RemSimAstronautDecorator() +{ +} +void RemSimAstronautDecorator::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + RemSimDecorator::ConstructComponent(motherVolume); + if (flag == false) ConstructAstronaut(motherVolume); + else ConstructAstronaut(motherAstronaut); +} + +void RemSimAstronautDecorator::DestroyComponent() +{ + +} + +void RemSimAstronautDecorator::ConstructAstronaut(G4VPhysicalVolume* motherVolume) +{ + // Astronaut definition: Box of water + // The Astronaut is the sensitive detector + + RemSimMaterial* pMaterial = new RemSimMaterial(); + + G4Material* water = pMaterial -> GetMaterial("Water"); + delete pMaterial; + + // Phantom sizes + G4double phantomX = 3. *m; + G4double phantomY = 3. *m; + G4double phantomZ = 30. *cm; + + phantom = new G4Box("phantom",phantomX/2.,phantomY/2.,phantomZ/2.); + + phantomLog = new G4LogicalVolume(phantom, + water, + "phantom", + 0,0,0); + + phantomPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,0.), + "phantom",phantomLog, + motherVolume,false,0); + + G4cout << "The mother volume of the phantom is: " + << motherVolume -> GetName() + << G4endl; + + // Visualisation attributes + G4Colour lblue (0.0, 0.0,.75); + G4VisAttributes* phantomVisAtt = new G4VisAttributes(lblue); + phantomVisAtt -> SetVisibility(true); + phantomVisAtt -> SetForceSolid(true); + phantomLog -> SetVisAttributes(phantomVisAtt); + + //Sensitive Detector + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + + G4String sensitiveDetectorName = "AstronautSD"; + + RemSimSensitiveDetector* sensitiveDetector = new + RemSimSensitiveDetector(sensitiveDetectorName); + G4int VoxelNbAlongZ = 30; + + G4double translation = 0; + + if (flag == true) + { + G4double thickShelter = 4.5 *m; + translation = 0.5*m + thickShelter/2.; + } + + RemSimROGeometry* ROGeometry = new RemSimROGeometry(phantomX, + phantomY, + phantomZ, + VoxelNbAlongZ, + translation); + ROGeometry -> BuildROGeometry(); + sensitiveDetector -> SetROgeometry(ROGeometry); + SDman->AddNewDetector(sensitiveDetector); + phantomLog -> SetSensitiveDetector(sensitiveDetector); + + // Set max step allowd to particles in the phantom + phantomLog -> SetUserLimits(new G4UserLimits(0.1*cm)); +} + +void RemSimAstronautDecorator::ChangeThickness(G4double) +{ + G4cout << "It is not possible to change the sizes of the Astronaut" + << G4endl; +} + +void RemSimAstronautDecorator::PrintDetectorParameters() +{ + G4cout << "-----------------------------------------------------------------------" + << G4endl + << "the astronaut is a box whose thickness is: " << G4endl + << ((phantom -> GetZHalfLength())*2.)/cm + << " cm along the Z axis" + << G4endl + << "material of the astronaut: " + << phantomLog -> GetMaterial() -> GetName() < SetParticleDefinition(particleTable->FindParticle(particleName)); + particleGun -> SetParticlePosition(G4ThreeVector(0., 0., -25.*m)); + G4ThreeVector v(0.0,0.0,1.0); + particleGun -> SetParticleEnergy(100.*MeV); + particleGun -> SetParticleMomentumDirection(v); +} + +RemSimBasicGenerator::~RemSimBasicGenerator() +{ + delete particleGun; +} + +void RemSimBasicGenerator::GeneratePrimaries(G4Event* anEvent) +{ + +#ifdef G4ANALYSIS_USE + G4double energy = particleGun -> GetParticleEnergy(); + RemSimAnalysisManager* analysis = RemSimAnalysisManager::getInstance(); + analysis -> primaryParticleEnergyDistribution(energy/MeV); +#endif + particleGun -> GeneratePrimaryVertex(anEvent); +} + +G4double RemSimBasicGenerator:: GetInitialEnergy() +{ + G4double primaryParticleEnergy = particleGun -> GetParticleEnergy(); + return primaryParticleEnergy; +} diff --git a/examples/advanced/radioprotection/src/RemSimDecay.cc b/examples/advanced/radioprotection/src/RemSimDecay.cc new file mode 100644 index 0000000000..8471f4e8c0 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimDecay.cc @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// *********************** +// * * +// * RemSimDecay.cc * +// * * +// *********************** +// +// $Id: RemSimDecay.cc,v 1.2 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// + +#include "RemSimDecay.hh" +#include "G4ProcessManager.hh" +#include "globals.hh" +#include "G4ios.hh" + +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +RemSimDecay::RemSimDecay(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimDecay::~RemSimDecay() +{ } + +void RemSimDecay::ConstructProcess() +{ + // Add Decay Process + G4Decay* theDecayProcess = new G4Decay(); + theParticleIterator -> reset(); + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* pmanager = particle -> GetProcessManager(); + + if (theDecayProcess -> IsApplicable(*particle)) + { + pmanager -> AddProcess(theDecayProcess); + // set ordering for PostStepDoIt and AtRestDoIt + pmanager -> SetProcessOrdering(theDecayProcess, idxPostStep); + pmanager -> SetProcessOrdering(theDecayProcess, idxAtRest); + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimDecorator.cc b/examples/advanced/radioprotection/src/RemSimDecorator.cc new file mode 100644 index 0000000000..0aec88013d --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimDecorator.cc @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// *************************** +// * * +// * RemSimDecorator.cc * +// * * +// *************************** +// +// $Id: RemSimDecorator.cc,v 1.5 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimVGeometryComponent.hh" +#include "RemSimDecorator.hh" + +RemSimDecorator::RemSimDecorator(RemSimVGeometryComponent* geoComponent) + : component(geoComponent) +{ +} + +RemSimDecorator::~RemSimDecorator() +{;} + +void RemSimDecorator::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + component -> ConstructComponent(motherVolume) ; + } + +void RemSimDecorator::DestroyComponent() +{ + component -> DestroyComponent(); +} + diff --git a/examples/advanced/radioprotection/src/RemSimDetectorConstruction.cc b/examples/advanced/radioprotection/src/RemSimDetectorConstruction.cc new file mode 100644 index 0000000000..3e9489d4e9 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimDetectorConstruction.cc @@ -0,0 +1,274 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ************************************** +// * * +// * RemSimDetectorConstruction.cc * +// * * +// ************************************** +// +// $Id: RemSimDetectorConstruction.cc,v 1.13 2004/05/27 08:36:51 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimDetectorConstruction.hh" +#include "RemSimMaterial.hh" +#include "RemSimDetectorMessenger.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "globals.hh" +#include "G4RunManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4UserLimits.hh" +#include "RemSimVGeometryComponent.hh" +#include "RemSimVehicle1.hh" +#include "RemSimMoonHabitat.hh" +#include "G4VisAttributes.hh" +#include "RemSimSensitiveDetector.hh" +#include "G4SDManager.hh" +#include "RemSimROGeometry.hh" +#include "RemSimDecorator.hh" +#include "RemSimShieldingDecorator.hh" +#include "RemSimShelterSPEDecorator.hh" +#include "RemSimAstronautDecorator.hh" +#include "RemSimRoofDecorator.hh" + +RemSimDetectorConstruction::RemSimDetectorConstruction() + : experimentalHall_log(0), experimentalHall_phys(0), + phantomPhys(0), detectorPhys(0) +{ + pMaterial = new RemSimMaterial(); + + pVehicle = new RemSimVehicle1(); + pMoon = new RemSimMoonHabitat(); + + messenger = new RemSimDetectorMessenger(this); + decoratorValue ="Nothing"; + astronautValue ="On"; + decorator = 0; //pointing to shielding + decoratorSPE = 0; //pointing to SPE shelter + decorator1 = 0; //pointing to the phantom/astronaut + decoratorRoof = 0; //pointing to the roof of the Moon Habitat + moon = false; // moon = true: moon configuration selected + // moon = false: vehicle configuration selected + flag = false; // flag = true : the geometry configuration (vehicle/moon) + // has been chosen + // flag = false : the geometry configuration (vehicle/moon) + // has not been chosen} +} + +RemSimDetectorConstruction::~RemSimDetectorConstruction() +{ + delete decoratorRoof; + delete decorator1; + delete decoratorSPE; + delete decorator; + delete messenger; + delete pMoon; + delete pVehicle; + delete pMaterial; +} + +G4VPhysicalVolume* RemSimDetectorConstruction::Construct() +{ + pMaterial -> DefineMaterials(); + G4Material* vacuum = pMaterial -> GetMaterial("Galactic"); + + // World definition + + G4double expHall_x = 30.0*m; + G4double expHall_y = 30.0*m; + G4double expHall_z = 30.0*m; + + G4Box* experimentalHall_box + = new G4Box("world",expHall_x,expHall_y,expHall_z); + experimentalHall_log = new G4LogicalVolume(experimentalHall_box, + vacuum,"world",0,0,0); + + experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(),"world", + experimentalHall_log,0, + false,0); + return experimentalHall_phys; +} +void RemSimDetectorConstruction::ConstructVolume() +{ + if (moon == true) + { + pMoon -> ConstructComponent(experimentalHall_phys); + decorator1 = new RemSimAstronautDecorator(pMoon); + G4VPhysicalVolume* shelter = pMoon -> GetShelter(); + decorator1 -> ChangeMother(shelter); + decorator1 -> ConstructComponent(experimentalHall_phys); + } + else + { + pVehicle -> ConstructComponent(experimentalHall_phys); + decorator1 = new RemSimAstronautDecorator(pVehicle); + decorator1 -> ConstructComponent(experimentalHall_phys); + } +} + +void RemSimDetectorConstruction::AddShielding(G4String value) +{ + if (moon == false) + { + decoratorValue = value; + + if (decoratorValue == "On") + { + if (decorator == 0) + { + decorator = new RemSimShieldingDecorator(pVehicle); + decorator -> ConstructComponent(experimentalHall_phys); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + } + else G4cout<<" The shielding alread exists!"< DestroyComponent(); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + decorator = 0; + } + + else G4cout<<" The shielding does not exist!"< ConstructComponent(experimentalHall_phys); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + } + else G4cout<<" The SPE shelter alread exists!"< DestroyComponent(); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + decoratorSPE = 0; + } + + else G4cout<<" The SPE shelter does not exist!"< ConstructComponent(experimentalHall_phys); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + } + else G4cout<<" The roof alread exists!"< DestroyComponent(); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + decoratorRoof = 0; + } + + else G4cout<<" The roof does not exist!"< ChangeThickness(thick); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + } + else G4cout<<" Define the shielding before!"<< G4endl; + } +} + +void RemSimDetectorConstruction::ChangeRoofThickness(G4double thick) +{ + if (moon == true) + { + if (decoratorRoof != 0) + { + decoratorRoof -> ChangeThickness(thick); + G4RunManager::GetRunManager() -> DefineWorldVolume(experimentalHall_phys); + } + else G4cout<<" Define the roof before!"<< G4endl; + } + + else G4cout<<"The roof can be selected in moon habitat configuration"< DefineWorldVolume(experimentalHall_phys); + flag = true; + } + else + G4cout<< "The configurations vehicle/moon can not be switched" << G4endl; +} + diff --git a/examples/advanced/radioprotection/src/RemSimDetectorMessenger.cc b/examples/advanced/radioprotection/src/RemSimDetectorMessenger.cc new file mode 100644 index 0000000000..b55ebc4865 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimDetectorMessenger.cc @@ -0,0 +1,131 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: +// S.Guatelli +// +// ********************************* +// * * +// * RemSimDetectorMessenger.cc * +// * * +// ********************************* +// +// +// $Id: RemSimDetectorMessenger.cc,v 1.9 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +#include "RemSimDetectorMessenger.hh" +#include "RemSimDetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" + +RemSimDetectorMessenger::RemSimDetectorMessenger( RemSimDetectorConstruction* Det): detector(Det) +{ + vehicleDir = new G4UIdirectory("/configuration/"); + vehicleDir -> SetGuidance("geometry control."); + + vehicleCmd = new G4UIcmdWithAString("/configuration/choose",this); + vehicleCmd -> SetGuidance("Assign the geometrical set-up to G4RunManager."); + vehicleCmd -> SetParameterName("choice",true); + vehicleCmd -> SetCandidates("vehicle moon"); + vehicleCmd -> AvailableForStates(G4State_Idle); + + shieldingCmd = new G4UIcmdWithAString("/configuration/AddShielding",this); + shieldingCmd -> SetGuidance("Add shielding layer in vehicle configuration."); + shieldingCmd -> SetParameterName("choice",true); + shieldingCmd -> SetCandidates("On Off"); + shieldingCmd -> AvailableForStates(G4State_PreInit,G4State_Idle); + + SPECmd = new G4UIcmdWithAString("/configuration/AddSPE",this); + SPECmd -> SetGuidance("Add SPE shelter in vehicle configuration."); + SPECmd -> SetParameterName("choice",true); + SPECmd -> SetCandidates("On Off"); + SPECmd -> AvailableForStates(G4State_PreInit,G4State_Idle); + + roofCmd = new G4UIcmdWithAString("/configuration/AddRoof",this); + roofCmd -> SetGuidance("Add the Roof to the moon habitat."); + roofCmd -> SetParameterName("choice",true); + roofCmd -> SetCandidates("On Off"); + roofCmd -> AvailableForStates(G4State_Idle); + + + // Fix the parameters of the shielding: material and thickness + shieldingDir = new G4UIdirectory("/shielding/"); + shieldingDir -> SetGuidance("shielding control."); + + thicknessCmd = new G4UIcmdWithADoubleAndUnit("/shielding/thickness",this); + thicknessCmd -> SetGuidance("Set the thickness of the shielding."); + thicknessCmd -> SetParameterName("Size",true); + thicknessCmd -> SetRange("Size>=0."); + thicknessCmd -> SetUnitCategory("Length"); + thicknessCmd -> AvailableForStates(G4State_Idle); + + roofDir = new G4UIdirectory("/roof/"); + roofDir -> SetGuidance("Roof control."); + thicknessRoofCmd = new G4UIcmdWithADoubleAndUnit("/roof/thickness",this); + thicknessRoofCmd -> SetGuidance("Set the thickness of the Roof."); + thicknessRoofCmd -> SetParameterName("Size",true); + thicknessRoofCmd -> SetRange("Size>=0."); + thicknessRoofCmd -> SetUnitCategory("Length"); + thicknessRoofCmd -> AvailableForStates(G4State_Idle); +} + +RemSimDetectorMessenger::~RemSimDetectorMessenger() +{ + delete thicknessRoofCmd; + delete roofDir; + delete thicknessCmd; + delete shieldingDir; + delete roofCmd; + delete SPECmd; + delete shieldingCmd; + delete vehicleCmd; + delete vehicleDir; +} + +void RemSimDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if(command == vehicleCmd) + detector -> ChooseConfiguration(newValue); + + if(command == shieldingCmd) + detector -> AddShielding(newValue); + + if(command == SPECmd) + detector -> AddShelterSPE(newValue); + + if(command == roofCmd) + detector -> AddHabitatRoof(newValue); + + if(command == thicknessCmd) + detector -> ChangeShieldingThickness + (thicknessCmd -> GetNewDoubleValue(newValue)); + + if(command == thicknessRoofCmd) + detector -> ChangeRoofThickness + (thicknessRoofCmd -> GetNewDoubleValue(newValue)); +} + diff --git a/examples/advanced/radioprotection/src/RemSimElectronEEDL.cc b/examples/advanced/radioprotection/src/RemSimElectronEEDL.cc new file mode 100644 index 0000000000..ff000f0f25 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimElectronEEDL.cc @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimElectronEEDL.cc,v 1.3 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelloi@ge.infn.it + +#include "RemSimElectronEEDL.hh" +#include "G4ProcessManager.hh" +#include "G4ParticleDefinition.hh" +#include "G4MultipleScattering.hh" +#include "G4LowEnergyIonisation.hh" +#include "G4LowEnergyBremsstrahlung.hh" + +RemSimElectronEEDL::RemSimElectronEEDL(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimElectronEEDL::~RemSimElectronEEDL() +{ } + +void RemSimElectronEEDL::ConstructProcess() +{ + // Add EEDL processes for electrons + + theParticleIterator->reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* manager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + + if (particleName == "e-") + { + manager -> AddProcess(new G4MultipleScattering, -1, 1,1); + manager -> AddProcess(new G4LowEnergyIonisation, -1, 2,2); + manager -> AddProcess(new G4LowEnergyBremsstrahlung,-1,-1,3); + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimEventAction.cc b/examples/advanced/radioprotection/src/RemSimEventAction.cc new file mode 100644 index 0000000000..14de8c5a09 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimEventAction.cc @@ -0,0 +1,72 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ********************************** +// * * +// * RemSimEventAction.cc * +// * * +// ********************************** +// +// +// $Id: RemSimEventAction.cc,v 1.7 2004/05/27 12:31:31 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author : Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimEventAction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "Randomize.hh" +#include "CLHEP/Random/RandEngine.h" +RemSimEventAction::RemSimEventAction():evtNo(-1) +{} + +RemSimEventAction::~RemSimEventAction() +{} + +void RemSimEventAction::BeginOfEventAction(const G4Event* evt) +{ + evtNo = evt -> GetEventID(); + G4int printModul = 500; + if (evtNo%printModul == 0) + G4cout << "\n---> Begin Of Event: " << evtNo << G4endl; +} + +void RemSimEventAction::EndOfEventAction(const G4Event* evt) +{ + G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories =0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + + if (G4VVisManager::GetConcreteInstance()) + { + for (G4int i=0; iGetTrajectoryContainer()))[i]); + trj->DrawTrajectory(50); + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimHadronicPhysics.cc b/examples/advanced/radioprotection/src/RemSimHadronicPhysics.cc new file mode 100644 index 0000000000..897ef71e29 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimHadronicPhysics.cc @@ -0,0 +1,271 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ************************************** +// * * +// * RemSimHadronicPhysics.cc * +// * * +// ************************************** +// +// $Id: RemSimHadronicPhysics.cc,v 1.2 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author : Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimHadronicPhysics.hh" +#include "G4BinaryLightIonReaction.hh" +#include "G4TripathiCrossSection.hh" +#include "G4IonsShenCrossSection.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" +#include "G4Material.hh" +#include "G4ios.hh" + +#include "G4ProtonInelasticCrossSection.hh" +#include "G4NeutronInelasticCrossSection.hh" +#include "G4PiNuclearCrossSection.hh" +#include "G4LElastic.hh" +#include "G4CascadeInterface.hh" +#include "G4LEProtonInelastic.hh" +#include "G4LENeutronInelastic.hh" +#include "G4LEPionPlusInelastic.hh" +#include "G4LEPionMinusInelastic.hh" +#include "G4LEAlphaInelastic.hh" +#include "G4LFission.hh" +#include "G4LCapture.hh" +#include "G4TheoFSGenerator.hh" +#include "G4GeneratorPrecompoundInterface.hh" +#include "G4ExcitationHandler.hh" +#include "G4PreCompoundModel.hh" +#include "G4QGSMFragmentation.hh" +#include "G4ExcitedStringDecay.hh" + +RemSimHadronicPhysics::RemSimHadronicPhysics(const G4String& name): +G4VPhysicsConstructor(name) +{ + // Hadronic cross sections + + proton_XC = new G4ProtonInelasticCrossSection(); + neutron_XC = new G4NeutronInelasticCrossSection(); + pion_XC = new G4PiNuclearCrossSection(); + + // Hadronic cross sections for alpha particles + tripathi = new G4TripathiCrossSection(); + shen = new G4IonsShenCrossSection(); + + // Hadronic models + + elastic_model = new G4LElastic(); + bertini_model = new G4CascadeInterface(); + binary_ion_model = new G4BinaryLightIonReaction(); + + LEP_proton_model = new G4LEProtonInelastic(); + LEP_neutron_model = new G4LENeutronInelastic(); + LEP_pip_model = new G4LEPionPlusInelastic(); + LEP_pim_model = new G4LEPionMinusInelastic(); + LEP_alpha_model = new G4LEAlphaInelastic(); + nfission_model = new G4LFission(); + ncapture_model = new G4LCapture(); + + QGSP_model = new G4TheoFSGenerator(); + theCascade = new G4GeneratorPrecompoundInterface(); + theHandler = new G4ExcitationHandler(); + thePreEquilib = new G4PreCompoundModel(theHandler); + theCascade -> SetDeExcitation(thePreEquilib); + QGSP_model -> SetTransport(theCascade); + theFragmentation = new G4QGSMFragmentation(); + theStringDecay = new G4ExcitedStringDecay(theFragmentation); + theStringModel.SetFragmentationModel(theStringDecay); + QGSP_model -> SetHighEnergyGenerator(&theStringModel); + +} +RemSimHadronicPhysics::~RemSimHadronicPhysics() +{} + +#include "G4HadronElasticProcess.hh" +#include "G4HadronFissionProcess.hh" +#include "G4HadronCaptureProcess.hh" +#include "G4ProtonInelasticProcess.hh" +#include "G4NeutronInelasticProcess.hh" +#include "G4PionPlusInelasticProcess.hh" +#include "G4PionMinusInelasticProcess.hh" +#include "G4AlphaInelasticProcess.hh" + +void RemSimHadronicPhysics::ConstructProcess() +{ + // Set model energy regions + // 0 - 3.2 GeV: Bertini cascade model for p, n, pi+, pi- + + bertini_model -> SetMaxEnergy(3.2*GeV); + + // 80 MeV - 20 GeV for light ions + + binary_ion_model -> SetMinEnergy(80*MeV); + binary_ion_model -> SetMaxEnergy(110.*GeV); + + // 2.8 - 25 GeV: LEP models for p, n, pi+, pi- + + LEP_proton_model -> SetMinEnergy(2.8*GeV); + LEP_proton_model -> SetMaxEnergy(25*GeV); + LEP_neutron_model -> SetMinEnergy(2.8*GeV); + LEP_neutron_model -> SetMaxEnergy(25*GeV); + LEP_pip_model -> SetMinEnergy(2.8*GeV); + LEP_pip_model -> SetMaxEnergy(25*GeV); + LEP_pim_model -> SetMinEnergy(2.8*GeV); + LEP_pim_model -> SetMaxEnergy(25*GeV); + nfission_model -> SetMinEnergy(0*TeV); + nfission_model -> SetMaxEnergy(100*TeV); + ncapture_model -> SetMinEnergy(0*TeV); + ncapture_model -> SetMaxEnergy(100*TeV); + + // Up to 100 MeV for alphas + LEP_alpha_model -> SetMaxEnergy(100.*MeV); + + // 15 GeV - 100 TeV: QGSP model for p, n, pi+, pi- + + QGSP_model -> SetMinEnergy(15*GeV); + QGSP_model -> SetMaxEnergy(100*TeV); + + // ****************************************** + // * register models, processes to proton * + // ****************************************** + + G4ParticleDefinition* proton = G4Proton::ProtonDefinition(); + G4ProcessManager* protMan = proton -> GetProcessManager(); + + // Elastic process + + G4HadronElasticProcess* protelProc = new G4HadronElasticProcess(); + protelProc -> RegisterMe(elastic_model); + protMan -> AddDiscreteProcess(protelProc); + + // Inelastic process + + G4ProtonInelasticProcess* protinelProc = new G4ProtonInelasticProcess(); + protinelProc -> AddDataSet(proton_XC); + protinelProc -> RegisterMe(bertini_model); + protinelProc -> RegisterMe(LEP_proton_model); + protinelProc -> RegisterMe(QGSP_model); + protMan -> AddDiscreteProcess(protinelProc); + + // ****************************************** + // * register models, processes to neutron * + // ****************************************** + + G4ParticleDefinition* neutron = G4Neutron::NeutronDefinition(); + G4ProcessManager* neutMan = neutron->GetProcessManager(); + + // Elastic process + + G4HadronElasticProcess* neutelProc = new G4HadronElasticProcess(); + neutelProc -> RegisterMe(elastic_model); + neutMan -> AddDiscreteProcess(neutelProc); + + // Inelastic process + + G4NeutronInelasticProcess* neutinelProc = new G4NeutronInelasticProcess(); + neutinelProc -> AddDataSet(neutron_XC); + neutinelProc -> RegisterMe(bertini_model); + neutinelProc -> RegisterMe(LEP_neutron_model); + neutinelProc -> RegisterMe(QGSP_model); + neutMan -> AddDiscreteProcess(neutinelProc); + + G4HadronCaptureProcess* neutcapProc = new G4HadronCaptureProcess(); + neutcapProc -> RegisterMe(ncapture_model); + neutMan -> AddDiscreteProcess(neutcapProc); + + G4HadronFissionProcess* neutfisProc = new G4HadronFissionProcess(); + neutfisProc -> RegisterMe(nfission_model); + neutMan -> AddDiscreteProcess(neutfisProc); + + // ****************************************** + // * register models, processes to pi+ * + // ****************************************** + + G4ParticleDefinition* piplus = G4PionPlus::PionPlusDefinition(); + G4ProcessManager* pipMan = piplus -> GetProcessManager(); + + // Elastic process + + G4HadronElasticProcess* pipelProc = new G4HadronElasticProcess(); + pipelProc -> RegisterMe(elastic_model); + pipMan -> AddDiscreteProcess(pipelProc); + + // Inelastic process + + G4PionPlusInelasticProcess* pipinelProc = new G4PionPlusInelasticProcess(); + pipinelProc -> AddDataSet(pion_XC); + pipinelProc -> RegisterMe(bertini_model); + pipinelProc -> RegisterMe(LEP_pip_model); + pipinelProc -> RegisterMe(QGSP_model); + pipMan -> AddDiscreteProcess(pipinelProc); + + // ****************************************** + // * register models, processes to pi- * + // ****************************************** + + G4ParticleDefinition* piminus = G4PionMinus::PionMinusDefinition(); + G4ProcessManager* pimMan = piminus -> GetProcessManager(); + + // Elastic process + + G4HadronElasticProcess* pimelProc = new G4HadronElasticProcess(); + pimelProc -> RegisterMe(elastic_model); + pimMan -> AddDiscreteProcess(pimelProc); + + // Inelastic process + + G4PionMinusInelasticProcess* piminelProc = new G4PionMinusInelasticProcess(); + piminelProc -> AddDataSet(pion_XC); + piminelProc -> RegisterMe(bertini_model); + piminelProc -> RegisterMe(LEP_pim_model); + piminelProc -> RegisterMe(QGSP_model); + pimMan -> AddDiscreteProcess(piminelProc); + + // ****************************************** + // * register models, processes to alpha * + // ****************************************** + + G4ParticleDefinition* alpha = G4Alpha::AlphaDefinition(); + G4ProcessManager* alfMan = alpha -> GetProcessManager(); + + // Elastic process + + G4HadronElasticProcess* alfelProc = new G4HadronElasticProcess(); + alfelProc -> RegisterMe(elastic_model); + alfMan -> AddDiscreteProcess(alfelProc); + + // Inelastic process + + G4AlphaInelasticProcess* alfinelProc = new G4AlphaInelasticProcess(); + alfinelProc -> AddDataSet(tripathi); + alfinelProc -> AddDataSet(shen); + alfinelProc -> RegisterMe(LEP_alpha_model); + alfinelProc -> RegisterMe(binary_ion_model); + alfMan -> AddDiscreteProcess(alfinelProc); +} + + + diff --git a/examples/advanced/radioprotection/src/RemSimHit.cc b/examples/advanced/radioprotection/src/RemSimHit.cc new file mode 100644 index 0000000000..c3d180daa6 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimHit.cc @@ -0,0 +1,84 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#include "RemSimHit.hh" +#include "G4VVisManager.hh" +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" +G4Allocator RemSimHitAllocator; + +RemSimHit::RemSimHit() +{;} + +RemSimHit::~RemSimHit() +{;} + +RemSimHit::RemSimHit(const RemSimHit &right) + : G4VHit() +{ + edep = right.edep; + zID = right.zID; + position = right.position; +} + +const RemSimHit& RemSimHit::operator=(const RemSimHit &right) +{ + edep = right.edep; + zID = right.zID; + position = right.position; + return *this; +} + +G4int RemSimHit::operator==(const RemSimHit &right) const +{ + return (this==&right) ? 1 : 0; +} + +void RemSimHit::Draw() +{ + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager) + { + G4Circle circle(position); + circle.SetScreenSize(4.); + circle.SetFillStyle(G4Circle::filled); + G4Colour colour(1.,0.,0.); + G4VisAttributes attribs(colour); + circle.SetVisAttributes(attribs); + pVVisManager->Draw(circle); + } +} + +void RemSimHit::Print() +{ + G4cout<< + "Hit in Astronaut:" + << G4BestUnit(edep, "Energy") + << " in position: " + << G4BestUnit(position, "Length") < +#include + + +RemSimInterplanetarySpaceConfiguration::RemSimInterplanetarySpaceConfiguration() +{ + G4int n_particle = 1; + particleGun = new G4ParticleGun(n_particle); + + run = new RemSimRunAction(); + + moon = false; + + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4String particleName = "proton"; + particleGun -> SetParticleDefinition(particleTable->FindParticle(particleName)); + particleGun -> SetParticlePosition(G4ThreeVector(0., 0., -25.*m)); + G4ThreeVector v(0.0,0.0,1.0); + particleGun -> SetParticleEnergy(1.*MeV); + particleGun -> SetParticleMomentumDirection(v); +} + +RemSimInterplanetarySpaceConfiguration::~RemSimInterplanetarySpaceConfiguration() +{ + delete run; + delete particleGun; +} + +void RemSimInterplanetarySpaceConfiguration::GeneratePrimaries(G4Event* anEvent){ + // Read the ASCII files containing the fluxes of particles in respect + // to the energy in MeV + G4bool value = run -> GetFile(); + if (value == true) + { + G4DataVector* energies = run -> GetPrimaryParticleEnergy(); + G4DataVector* data = run -> GetPrimaryParticleEnergyDistribution(); + G4double sum = run -> GetPrimaryParticleEnergyDistributionSum(); + G4double partSum = 0; + G4int j = 0; + G4double random = sum*G4UniformRand(); + while (partSum SetParticleEnergy((*energies)[j]); + +#ifdef G4ANALYSIS_USE + G4double energy = particleGun -> GetParticleEnergy(); + RemSimAnalysisManager* analysis = RemSimAnalysisManager::getInstance(); + analysis -> primaryParticleEnergyDistribution(energy/MeV); +#endif + + if (moon == true) MoonConfiguration(); + else + { + particleGun -> SetParticlePosition(G4ThreeVector(0., 0., -25.*m)); + G4ThreeVector v(0.0,0.0,1.0); + particleGun -> SetParticleMomentumDirection(v); + + } + + particleGun -> GeneratePrimaryVertex(anEvent); + } + else + { + G4String excep = "Load data file"; + G4Exception(excep); + } +} + +void RemSimInterplanetarySpaceConfiguration:: MoonConfiguration() +{ + //Generate the primary particles on a hemisphere with random direction + //position + G4double radius = 25.* m; + G4double angle = pi * G4UniformRand()*rad; + G4double y0 = radius*cos(angle); + G4double x0 = 0.*m; + G4double z0 = -radius*sin(angle); + + if ( z0 < 0. *m) + { + particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); + } + + //direction + G4double angledir = pi * G4UniformRand()*rad; + if ((angledir> (pi/2.-angle)) && angledir<(3*pi/2.-angle)) + { + G4double a,b,c; + b=cos(angledir); + a=0.; + c=sin(angledir); + G4ThreeVector direction(a,b,c); + particleGun -> SetParticleMomentumDirection(direction); + } +} + +G4double RemSimInterplanetarySpaceConfiguration:: GetInitialEnergy() +{ + G4double primaryParticleEnergy = particleGun -> GetParticleEnergy(); + return primaryParticleEnergy; +} +void RemSimInterplanetarySpaceConfiguration::SetMoon(G4bool value) +{ + moon = value; +} diff --git a/examples/advanced/radioprotection/src/RemSimIonICRU.cc b/examples/advanced/radioprotection/src/RemSimIonICRU.cc new file mode 100644 index 0000000000..45c6f63e32 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimIonICRU.cc @@ -0,0 +1,72 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "RemSimIonICRU.hh" +#include "G4ProcessManager.hh" +#include "G4ParticleDefinition.hh" +#include "G4MultipleScattering.hh" +#include "G4hLowEnergyIonisation.hh" +#include "G4hIonisation.hh" +#include "G4hLowEnergyLoss.hh" + +RemSimIonICRU::RemSimIonICRU(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimIonICRU::~RemSimIonICRU() +{ } + +void RemSimIonICRU::ConstructProcess() +{ + theParticleIterator -> reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* manager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + G4double charge = particle -> GetPDGCharge(); + + if (particleName == "proton" || particleName == "alpha" + || particleName == "GenericIon") + { + G4hLowEnergyIonisation* ionisation = new G4hLowEnergyIonisation(); + G4VProcess* multipleScattering = new G4MultipleScattering(); + manager -> AddProcess(multipleScattering, -1,1,1); + manager -> AddProcess(ionisation, -1,2,2); + } + else if (charge != 0.0) + { + if (particleName != "e+" && particleName != "e-" && + (particleName != "mu+") && (particleName != "mu-")) + { + if((!particle -> IsShortLived()) && + (particle -> GetParticleName() != "chargedgeantino")) + { + G4hLowEnergyIonisation* ionisation = new G4hLowEnergyIonisation(); + G4VProcess* multipleScattering = new G4MultipleScattering(); + manager -> AddProcess(multipleScattering, -1,1,1); + manager -> AddProcess(ionisation, -1,2,2); + } + } + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimIonStandard.cc b/examples/advanced/radioprotection/src/RemSimIonStandard.cc new file mode 100644 index 0000000000..fa8fef81fb --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimIonStandard.cc @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "RemSimIonStandard.hh" +#include "G4ProcessManager.hh" +#include "G4ParticleDefinition.hh" +#include "G4MultipleScattering.hh" +#include "G4hIonisation.hh" + +RemSimIonStandard::RemSimIonStandard(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimIonStandard::~RemSimIonStandard() +{ } + +void RemSimIonStandard::ConstructProcess() +{ + theParticleIterator -> reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* manager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + G4double charge = particle -> GetPDGCharge(); + + if (particleName == "proton" || particleName == "alpha" + || particleName == "GenericIon") + { + G4hIonisation* ionisation = new G4hIonisation(); + G4VProcess* multipleScattering = new G4MultipleScattering(); + manager -> AddProcess(multipleScattering, -1,1,1); + manager -> AddProcess(ionisation, -1,2,2); + } + else if (charge != 0.0) + { + if (particleName != "e+" && particleName != "e-" && + (particleName != "mu+") && (particleName != "mu-")) + { + if((!particle -> IsShortLived()) && + (particle -> GetParticleName() != "chargedgeantino")) + { + G4hIonisation* ionisation = new G4hIonisation(); + G4VProcess* multipleScattering = new G4MultipleScattering(); + manager -> AddProcess(multipleScattering, -1,1,1); + manager -> AddProcess(ionisation, -1,2,2); + } + } + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimMaterial.cc b/examples/advanced/radioprotection/src/RemSimMaterial.cc new file mode 100644 index 0000000000..008e7a6f3b --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimMaterial.cc @@ -0,0 +1,250 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * RemSimMaterial.cc * +// * * +// ******************************* +// +// $Id: RemSimMaterial.cc,v 1.5 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "G4MaterialPropertiesTable.hh" +#include "G4MaterialPropertyVector.hh" +#include "globals.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "RemSimMaterial.hh" + +RemSimMaterial::RemSimMaterial(): + matPb(0), matAir(0), matH2O(0), Al(0), nylon(0), mylar(0), + beta(0), nextel(0), kevlar(0), + vacuum(0), betaCloth(0), eterogeneousNextel(0), kevlarVacuum(0), + polyethylene(0), polyacrylate(0), evoh(0), nomex(0), nomexAir(0), + kevlarAir(0), moon(0) +{;} + +RemSimMaterial::~RemSimMaterial() +{ + delete moon; + delete kevlarAir; + delete nomexAir; + delete nomex; + delete evoh; + delete polyacrylate; + delete polyethylene; + delete kevlarVacuum; + delete eterogeneousNextel; + delete betaCloth; + delete vacuum; + delete kevlar; + delete nextel; + delete beta; + delete mylar; + delete nylon; + delete Al; + delete matH2O; + delete matAir; + delete matPb; +} + +void RemSimMaterial::DefineMaterials() +{ + // Define required materials + + G4double A; // atomic mass + G4double Z; // atomic number + G4double d; // density + + // General elements + + A = 1.01*g/mole; + G4Element* elH = new G4Element ("Hydrogen","H",Z = 1.,A); + + A = 10.811*g/mole; + G4Element* elB = new G4Element ("Boro","B",Z = 5.,A); + + A = 14.01*g/mole; + G4Element* elN = new G4Element("Nitrogen","N",Z = 7.,A); + + A = 16.00*g/mole; + + G4Element* elO = new G4Element("Oxygen","O",Z = 8.,A); + + A=26.98*g/mole; + G4Element* elAl = new G4Element("Aluminum","Al", Z = 13.,A); + + A = 12.011*g/mole; + G4Element* elC = new G4Element("Carbon","C",Z = 6.,A); + + A = 24.305*g/mole; + G4Element* elMg = new G4Element("Magnesium","Mg",Z = 12.,A); + + A = 35.453*g/mole; + G4Element* elCl = new G4Element("Chlorine","Cl",Z = 17.,A); + + A = 40.08*g/mole; + G4Element* elCa = new G4Element("Calcium","Ca",Z = 20.,A); + + A = 28.09*g/mole; + G4Element* elSi = new G4Element("Silicon","Si",Z = 14.,A); + + A = 55.85*g/mole; + G4Element* elFe = new G4Element("Iron","Fe",Z = 26.,A); + + //Lead material + A = 207.19*g/mole; + Z = 82; + d = 11.35*g/cm3; + matPb = new G4Material("Lead",Z,A,d); + + // Air material + G4double airDensity = 1.290*mg/cm3; + G4Material* matAir = new G4Material("Air",airDensity,2); + matAir -> AddElement(elN,0.7); + matAir -> AddElement(elO,0.3); + + // Water + d = 1.000*g/cm3; + matH2O = new G4Material("Water",d,2); + matH2O -> AddElement(elH,2); + matH2O -> AddElement(elO,1); + matH2O -> GetIonisation() -> SetMeanExcitationEnergy(75.0*eV); + + Al = new G4Material("Aluminium", Z= 13., A= 26.98*g/mole, d = 2.7*g/cm3); + + //nylon (alenia spazio) + d = 1.14 *g/cm3; + nylon = new G4Material("nylon",d,4); + nylon -> AddElement(elH,0.108); + nylon -> AddElement(elC,0.68); + nylon -> AddElement(elN,0.099); + nylon -> AddElement(elO,0.113); + + //mylar (alenia spazio) + d= 1.4 *g/cm3; + mylar = new G4Material("mylar",d,3); + mylar -> AddElement(elH,0.042); + mylar -> AddElement(elC,0.625); + mylar -> AddElement(elO,0.333); + + //beta cloth + G4double betaDensity = 2.3 *g/cm3; + beta = new G4Material("beta",betaDensity,2); + beta -> AddElement(elO,0.53); + beta -> AddElement(elSi,0.47); + + G4double nextelDensity = 2.7 * g/cm3; + nextel = new G4Material("nextel",nextelDensity,4); + nextel -> AddElement(elB,0.04); + nextel -> AddElement(elO,0.52); + nextel -> AddElement(elAl,0.33); + nextel -> AddElement(elSi,0.11); + + //kevlar + G4double kevlarDensity = 1.44 *g/cm3; + kevlar = new G4Material("kevlar",d,4); + kevlar -> AddElement(elH,0.04); + kevlar -> AddElement(elC,0.71); + kevlar -> AddElement(elO,0.12); + kevlar -> AddElement(elN,0.13); + + //vacuum + G4double vacuumDensity = 1.e-25 *g/cm3; + G4double pressure = 3.e-18*pascal; + G4double temperature = 2.73*kelvin; + vacuum = new G4Material("Galactic", Z=1., A=1.01*g/mole, + vacuumDensity,kStateGas,temperature,pressure); + + d = (vacuumDensity*0.44)+ (betaDensity*0.56); + betaCloth = new G4Material("betacloth",d,2); + betaCloth -> AddMaterial (beta, 0.56); + betaCloth -> AddMaterial (vacuum,0.44); + + d = (vacuumDensity*0.73)+ (nextelDensity*0.27); + eterogeneousNextel = new G4Material("Nextel312AF62",d,2); + eterogeneousNextel -> AddMaterial (vacuum, 0.73); + eterogeneousNextel -> AddMaterial (nextel, 0.27); + + d = (vacuumDensity*0.44)+ (kevlarDensity*0.56); + kevlarVacuum = new G4Material("kevlarVacuum",d,2); + kevlarVacuum -> AddMaterial (vacuum, 0.44); + kevlarVacuum -> AddMaterial (kevlar, 0.56); + + d = 0.94 * g/cm3; + polyethylene = new G4Material("polyethylene",d,2); + polyethylene -> AddElement(elH,0.14); + polyethylene -> AddElement(elC,0.86); + + d = 1.19 * g/cm3; + polyacrylate = new G4Material("polyacrylate",d,3); + polyacrylate -> AddElement(elH,0.08); + polyacrylate -> AddElement(elC,0.60); + polyacrylate -> AddElement(elO,0.32); + + d = 1.17 * g/cm3; + evoh = new G4Material("evoh",d,3); + evoh -> AddElement(elH,0.11); + evoh -> AddElement(elC,0.67); + evoh -> AddElement(elO,0.22); + + G4double nomexDensity = 0.98 * g/cm3; + nomex = new G4Material("nomex",nomexDensity,5); + nomex -> AddElement(elH,0.04); + nomex -> AddElement(elC,0.54); + nomex -> AddElement(elN,0.09); + nomex -> AddElement(elO,0.10); + nomex -> AddElement(elCl,0.23); + + d = 0.45*(nomexDensity)+ 0.55*(airDensity); + nomexAir = new G4Material("nomexAir",d,2); + nomexAir -> AddMaterial(nomex,0.45); + nomexAir -> AddMaterial(matAir,0.55); + + d =0.56*(kevlarDensity)+ 0.44*(airDensity); + kevlarAir = new G4Material("kevlarAir",d,2); + kevlarAir -> AddMaterial(kevlar,0.56); + kevlarAir -> AddMaterial(matAir,0.44); + + d = 1.5*g/cm3; + moon = new G4Material("moon",d,6); + moon -> AddElement(elO,0.45); + moon -> AddElement(elMg,0.05); + moon -> AddElement(elAl,0.13); + moon -> AddElement(elSi,0.21); + moon -> AddElement(elCa,0.10); + moon -> AddElement(elFe,0.06); +} + +G4Material* RemSimMaterial::GetMaterial(G4String material) +{ + G4Material* pttoMaterial = G4Material::GetMaterial(material); + return pttoMaterial; +} diff --git a/examples/advanced/radioprotection/src/RemSimMoonHabitat.cc b/examples/advanced/radioprotection/src/RemSimMoonHabitat.cc new file mode 100644 index 0000000000..233cb38cfd --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimMoonHabitat.cc @@ -0,0 +1,115 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ************************************** +// * * +// * RemSimMoonHabitat.cc * +// * * +// ************************************** +// +// $Id: RemSimMoonHabitat.cc,v 1.4 2004/05/22 12:57:06 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimVGeometryComponent.hh" +#include "RemSimMaterial.hh" +#include "G4Material.hh" +#include "RemSimMoonHabitat.hh" +#include "G4Box.hh" +#include "G4Trd.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4UserLimits.hh" +#include "RemSimDecorator.hh" +#include "RemSimAstronautDecorator.hh" + +RemSimMoonHabitat::RemSimMoonHabitat() +{ + pMaterial = new RemSimMaterial(); + shelterPhys = 0; +} +RemSimMoonHabitat::~RemSimMoonHabitat() +{ + delete pMaterial; +} +void RemSimMoonHabitat::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + pMaterial -> DefineMaterials(); + + G4Material* moonMaterial = pMaterial->GetMaterial("moon"); + G4Material* air = pMaterial -> GetMaterial("Air"); + + // Moon Surface definition + G4double sizeX = 30.*m; + G4double sizeY = 30.*m; + G4double sizeZ = 15.*m; + + G4Box* moon = new G4Box("moon",sizeX,sizeY,sizeZ); + + G4LogicalVolume* moonLogical = new G4LogicalVolume(moon, + moonMaterial, + "moon",0,0,0); + + G4VPhysicalVolume* moonPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,sizeZ), "moon",moonLogical, + motherVolume, + false,0); + + G4double thick = 4.5 *m; + G4Box* shelter = new G4Box("shelter",5.*m,5.*m,thick/2.); + G4LogicalVolume* shelterLog = new G4LogicalVolume(shelter, + air, + "shelter", + 0,0,0); + + G4double translation = - sizeZ + thick/2. + 0.5 *m; + + shelterPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,translation), + "shelter",shelterLog, + moonPhys,false,0); + + G4Colour red (1.0,0.0,0.0); + G4Colour blue (0.,0.,1.); + + G4VisAttributes* moonVisAtt = new G4VisAttributes(red); + moonVisAtt -> SetVisibility(true); + moonVisAtt -> SetForceWireframe(true); + moonLogical -> SetVisAttributes(moonVisAtt); + + G4VisAttributes* shelterVisAtt = new G4VisAttributes(blue); + shelterVisAtt -> SetVisibility(true); + shelterVisAtt -> SetForceWireframe(true); + shelterLog -> SetVisAttributes(shelterVisAtt); +} + +void RemSimMoonHabitat::DestroyComponent() +{} + +G4VPhysicalVolume* RemSimMoonHabitat::GetShelter() +{ + return shelterPhys; +} diff --git a/examples/advanced/radioprotection/src/RemSimMuonStandard.cc b/examples/advanced/radioprotection/src/RemSimMuonStandard.cc new file mode 100644 index 0000000000..791372f03d --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimMuonStandard.cc @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimMuonStandard.cc,v 1.3 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimMuonStandard.hh" +#include "G4ProcessManager.hh" + +//muon: +#include "G4hIonisation.hh" +#include "G4MultipleScattering.hh" +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4MuonMinusCaptureAtRest.hh" + +RemSimMuonStandard::RemSimMuonStandard(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimMuonStandard::~RemSimMuonStandard() +{ } + +void RemSimMuonStandard::ConstructProcess() +{ + // Add standard processes for muons + + theParticleIterator -> reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + + if(( particleName == "mu+")|| (particleName == "mu-" )) + {//muon + G4VProcess* aMultipleScattering = new G4MultipleScattering(); + G4VProcess* aBremsstrahlung = new G4MuBremsstrahlung(); + G4VProcess* aPairProduction = new G4MuPairProduction(); + G4VProcess* anIonisation = new G4MuIonisation(); + // + // add processes + pmanager -> AddProcess(anIonisation); + pmanager -> AddProcess(aMultipleScattering); + pmanager -> AddProcess(aBremsstrahlung); + pmanager -> AddProcess(aPairProduction); + // + // set ordering for AlongStepDoIt + pmanager -> SetProcessOrdering(aMultipleScattering, idxAlongStep,1); + pmanager -> SetProcessOrdering(anIonisation, idxAlongStep,2); + pmanager -> SetProcessOrdering(aBremsstrahlung, idxAlongStep,3); + pmanager -> SetProcessOrdering(aPairProduction, idxAlongStep,4); + // + // set ordering for PostStepDoIt + pmanager -> SetProcessOrdering(aMultipleScattering, idxPostStep,1); + pmanager -> SetProcessOrdering(anIonisation, idxPostStep,2); + pmanager -> SetProcessOrdering(aBremsstrahlung, idxPostStep,3); + pmanager -> SetProcessOrdering(aPairProduction, idxPostStep,4); + + if( particleName == "mu-" ) + pmanager -> AddProcess(new G4MuonMinusCaptureAtRest(), 0,-1,-1); + } + } +} diff --git a/examples/extended/electromagnetic/TestEm1/src/PhysListParticles.cc b/examples/advanced/radioprotection/src/RemSimParticles.cc similarity index 52% rename from examples/extended/electromagnetic/TestEm1/src/PhysListParticles.cc rename to examples/advanced/radioprotection/src/RemSimParticles.cc index f72a592d23..01f86fc2f9 100644 --- a/examples/extended/electromagnetic/TestEm1/src/PhysListParticles.cc +++ b/examples/advanced/radioprotection/src/RemSimParticles.cc @@ -20,122 +20,91 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RemSimParticles.cc,v 1.4 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it // -// $Id: PhysListParticles.cc,v 1.1 2003/10/06 10:02:32 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "PhysListParticles.hh" - -// Bosons -#include "G4ChargedGeantino.hh" -#include "G4Geantino.hh" +#include "RemSimParticles.hh" #include "G4Gamma.hh" -#include "G4OpticalPhoton.hh" - -// leptons -#include "G4MuonPlus.hh" -#include "G4MuonMinus.hh" -#include "G4NeutrinoMu.hh" -#include "G4AntiNeutrinoMu.hh" - #include "G4Electron.hh" #include "G4Positron.hh" +#include "G4Proton.hh" +#include "G4Alpha.hh" +#include "G4IonO16.hh" +#include "G4IonC12.hh" +#include "G4IonSi28.hh" +#include "G4IonFe52.hh" +#include "G4MesonConstructor.hh" +#include "G4BaryonConstructor.hh" +#include "G4ShortLivedConstructor.hh" +#include "G4IonConstructor.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" +#include "G4TauMinus.hh" +#include "G4TauPlus.hh" +#include "G4NeutrinoTau.hh" +#include "G4AntiNeutrinoTau.hh" +#include "G4NeutrinoMu.hh" +#include "G4AntiNeutrinoMu.hh" #include "G4NeutrinoE.hh" #include "G4AntiNeutrinoE.hh" - -// Mesons +#include "G4ChargedGeantino.hh" +#include "G4Geantino.hh" #include "G4PionPlus.hh" #include "G4PionMinus.hh" #include "G4PionZero.hh" -#include "G4Eta.hh" -#include "G4EtaPrime.hh" +RemSimParticles::RemSimParticles(const G4String& name) + : G4VPhysicsConstructor(name) +{ } -#include "G4KaonPlus.hh" -#include "G4KaonMinus.hh" -#include "G4KaonZero.hh" -#include "G4AntiKaonZero.hh" -#include "G4KaonZeroLong.hh" -#include "G4KaonZeroShort.hh" - -// Baryons -#include "G4Proton.hh" -#include "G4AntiProton.hh" -#include "G4Neutron.hh" -#include "G4AntiNeutron.hh" - -// Nuclei -#include "G4Alpha.hh" -#include "G4Deuteron.hh" -#include "G4Triton.hh" -#include "G4He3.hh" -#include "G4GenericIon.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListParticles::PhysListParticles(const G4String& name) - : G4VPhysicsConstructor(name) +RemSimParticles::~RemSimParticles() {} -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListParticles::~PhysListParticles() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListParticles::ConstructParticle() +void RemSimParticles::ConstructParticle() { - -// pseudo-particles - G4Geantino::GeantinoDefinition(); - G4ChargedGeantino::ChargedGeantinoDefinition(); - -// gamma G4Gamma::GammaDefinition(); - -// optical photon - G4OpticalPhoton::OpticalPhotonDefinition(); - -// leptons G4Electron::ElectronDefinition(); G4Positron::PositronDefinition(); + G4Proton :: ProtonDefinition(); + G4Alpha :: AlphaDefinition(); + G4IonO16::IonO16Definition(); + G4IonC12::IonC12Definition(); + G4IonSi28::IonSi28Definition(); + G4IonFe52::IonFe52Definition(); + +// Mu G4MuonPlus::MuonPlusDefinition(); G4MuonMinus::MuonMinusDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + +// Tau + G4TauMinus::TauMinusDefinition(); + G4TauPlus::TauPlusDefinition(); + G4NeutrinoTau::NeutrinoTauDefinition(); + G4AntiNeutrinoTau::AntiNeutrinoTauDefinition(); G4NeutrinoE::NeutrinoEDefinition(); G4AntiNeutrinoE::AntiNeutrinoEDefinition(); - G4NeutrinoMu::NeutrinoMuDefinition(); - G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); -// mesons G4PionPlus::PionPlusDefinition(); G4PionMinus::PionMinusDefinition(); G4PionZero::PionZeroDefinition(); - G4Eta::EtaDefinition(); - G4EtaPrime::EtaPrimeDefinition(); - G4KaonPlus::KaonPlusDefinition(); - G4KaonMinus::KaonMinusDefinition(); - G4KaonZero::KaonZeroDefinition(); - G4AntiKaonZero::AntiKaonZeroDefinition(); - G4KaonZeroLong::KaonZeroLongDefinition(); - G4KaonZeroShort::KaonZeroShortDefinition(); + + G4MesonConstructor pMesonConstructor; + pMesonConstructor.ConstructParticle(); -// barions - G4Proton::ProtonDefinition(); - G4AntiProton::AntiProtonDefinition(); - G4Neutron::NeutronDefinition(); - G4AntiNeutron::AntiNeutronDefinition(); + G4BaryonConstructor pBaryonConstructor; + pBaryonConstructor.ConstructParticle(); -// ions - G4Deuteron::DeuteronDefinition(); - G4Triton::TritonDefinition(); - G4He3::He3Definition(); - G4Alpha::AlphaDefinition(); - G4GenericIon::GenericIonDefinition(); + G4ShortLivedConstructor pShortLivedConstructor; + pShortLivedConstructor.ConstructParticle(); + + G4IonConstructor pConstructor; + pConstructor.ConstructParticle(); } - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/advanced/radioprotection/src/RemSimPhotonEPDL.cc b/examples/advanced/radioprotection/src/RemSimPhotonEPDL.cc new file mode 100644 index 0000000000..3af594ce01 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimPhotonEPDL.cc @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPhotonEPDL.cc,v 1.4 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author:Susanna Guatelli, guatelli@ge.infn.it +// +#include "RemSimPhotonEPDL.hh" + +#include "G4ProcessManager.hh" +#include "G4Gamma.hh" +#include "G4ParticleDefinition.hh" +#include "G4LowEnergyCompton.hh" +#include "G4LowEnergyGammaConversion.hh" +#include "G4LowEnergyPhotoElectric.hh" +#include "G4LowEnergyRayleigh.hh" + +RemSimPhotonEPDL::RemSimPhotonEPDL(const G4String& name): + G4VPhysicsConstructor(name) +{ } + +RemSimPhotonEPDL::~RemSimPhotonEPDL() +{ } + +void RemSimPhotonEPDL::ConstructProcess() +{ + // Add EPDL processes for photons + + theParticleIterator -> reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* manager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + + if (particleName == "gamma") + { + manager -> AddDiscreteProcess(new G4LowEnergyPhotoElectric); + manager -> AddDiscreteProcess(new G4LowEnergyCompton); + manager -> AddDiscreteProcess(new G4LowEnergyGammaConversion); + manager -> AddDiscreteProcess(new G4LowEnergyRayleigh); + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimPhysicsList.cc b/examples/advanced/radioprotection/src/RemSimPhysicsList.cc new file mode 100644 index 0000000000..829f2bfce8 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimPhysicsList.cc @@ -0,0 +1,239 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPhysicsList.cc,v 1.6 2004/05/27 13:32:46 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli + +#include "RemSimPhysicsList.hh" +#include "RemSimPhysicsListMessenger.hh" +#include "RemSimParticles.hh" +#include "RemSimPhotonEPDL.hh" +#include "RemSimElectronEEDL.hh" +#include "RemSimPositronStandard.hh" +#include "RemSimIonICRU.hh" +#include "RemSimIonStandard.hh" +#include "RemSimMuonStandard.hh" +#include "RemSimDecay.hh" +#include "RemSimHadronicPhysics.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" +#include "G4VProcess.hh" + +RemSimPhysicsList::RemSimPhysicsList(): G4VModularPhysicsList(), + electronIsRegistered(false), + positronIsRegistered(false), + photonIsRegistered(false), + ionIsRegistered(false), + hadronicIsRegistered(false), + decayIsRegistered(false), + muonIsRegistered(false) +{ + defaultCutValue = 1.* mm; + SetVerboseLevel(1); + + messenger = new RemSimPhysicsListMessenger(this); + + RegisterPhysics( new RemSimParticles("particles") ); +} + + +RemSimPhysicsList::~RemSimPhysicsList() +{ + delete messenger; +} + + +void RemSimPhysicsList::AddPhysicsList(const G4String& name) +{ + + G4cout << "Adding PhysicsList chunk " << name << G4endl; + + // Register LowE-EPDL processes for photons + if (name == "photon-epdl") + { + if (photonIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ---- photon List already existing" + << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimPhotonEPDL(name) ); + photonIsRegistered = true; + } + } + + // Register LowE-EEDL processes for electrons + if (name == "electron-eedl") + { + if (electronIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ---- electron List already existing" << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimElectronEEDL(name) ); + electronIsRegistered = true; + } + } + + // Register standard processes for positrons + if (name == "positron-standard") + { + if (positronIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ---- positron List already existing" << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimPositronStandard(name) ); + positronIsRegistered = true; + } + } + + // Register LowEnergy processes - ICRU Model - for p, alpha, ions. + if (name == "ion-ICRU") + { + if (ionIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ----ion e.m. List already existing" + << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimIonICRU(name) ); + ionIsRegistered = true; + } + } + + if (name == "ion-standard") + { + if (ionIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ----ion e.m. List already existing" + << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimIonStandard(name) ); + ionIsRegistered = true; + } + } + + + // Register hadronic process for p and alpha particle + if (name == "hadronic") + { + if (hadronicIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ---- hadronic physics List already existing" << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimHadronicPhysics(name) ); + hadronicIsRegistered = true; + } + } + +if (name == "muon-standard") + { + if (muonIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered -- muon e.m. List already existing" + << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimMuonStandard(name) ); + muonIsRegistered = true; + } + } + +if (name == "decay") + { + if (decayIsRegistered) + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " cannot be registered ---- decay physics List already existing" << G4endl; + } + else + { + G4cout << "RemSimPhysicsList::AddPhysicsList: " << name + << " is registered" << G4endl; + RegisterPhysics( new RemSimDecay(name) ); + decayIsRegistered = true; + } + } + + if (electronIsRegistered && positronIsRegistered && photonIsRegistered && + ionIsRegistered) + { + G4cout << "The electromagnetic processes are registered" << G4endl; + + + if (muonIsRegistered && decayIsRegistered && hadronicIsRegistered) + { + G4cout << "The hadronic physics is registered for p and alpha (up to 100 GeV), the e.m. physics for muons is registered, the decay is registered" + << G4endl; + } + } +} + +void RemSimPhysicsList::SetCuts() +{ + G4VUserPhysicsList::SetCutsWithDefault(); + if (verboseLevel>0) DumpCutValuesTable(); +} + + + + + + + + + + diff --git a/examples/advanced/radioprotection/src/RemSimPhysicsListMessenger.cc b/examples/advanced/radioprotection/src/RemSimPhysicsListMessenger.cc new file mode 100644 index 0000000000..561afa5924 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimPhysicsListMessenger.cc @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPhysicsListMessenger.cc,v 1.3 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it + +#include "RemSimPhysicsListMessenger.hh" +#include "RemSimPhysicsList.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" + +RemSimPhysicsListMessenger::RemSimPhysicsListMessenger(RemSimPhysicsList * List) +:RemSimList(List) +{ + EnDir = new G4UIdirectory("/physics/"); + EnDir -> SetGuidance("physics commands"); + + physicsListCmd = new G4UIcmdWithAString("/physics/addPhysics",this); + physicsListCmd -> SetGuidance("Add chunks of PhysicsList"); + physicsListCmd -> SetParameterName("choice",false); + physicsListCmd -> AvailableForStates(G4State_PreInit); +} + +RemSimPhysicsListMessenger::~RemSimPhysicsListMessenger() +{ + delete physicsListCmd; + delete EnDir; +} + +void RemSimPhysicsListMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if (command == physicsListCmd) + { RemSimList->AddPhysicsList(newValue); } +} + + + + + + + diff --git a/examples/advanced/radioprotection/src/RemSimPositronStandard.cc b/examples/advanced/radioprotection/src/RemSimPositronStandard.cc new file mode 100644 index 0000000000..213dd99e3f --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimPositronStandard.cc @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimPositronStandard.cc,v 1.3 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Author: Susanna Guatelli, guatelli@ge.infn.it +#include "RemSimPositronStandard.hh" +#include "G4ProcessManager.hh" +#include "G4Gamma.hh" +#include "G4ParticleDefinition.hh" +#include "G4MultipleScattering.hh" +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +RemSimPositronStandard::RemSimPositronStandard(const G4String& name): G4VPhysicsConstructor(name) +{ } + +RemSimPositronStandard::~RemSimPositronStandard() +{ } + +void RemSimPositronStandard::ConstructProcess() +{ + // Add standard processes for positrons + + theParticleIterator -> reset(); + + while( (*theParticleIterator)() ) + { + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* manager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + + if (particleName == "e+") + { + manager -> AddProcess(new G4MultipleScattering, -1, 1,1); + manager -> AddProcess(new G4eIonisation, -1, 2,2); + manager -> AddProcess(new G4eBremsstrahlung, -1,-1,3); + manager -> AddProcess(new G4eplusAnnihilation, 0,-1,4); + } + } +} diff --git a/examples/advanced/radioprotection/src/RemSimPrimaryGeneratorAction.cc b/examples/advanced/radioprotection/src/RemSimPrimaryGeneratorAction.cc new file mode 100644 index 0000000000..d4f9b06585 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimPrimaryGeneratorAction.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimPrimaryGeneratorAction.cc,v 1.8 2004/05/27 10:33:12 guatelli Exp $// Author: Susanna Guatelli, guatelli@ge.infn.it + +#include "RemSimPrimaryGeneratorAction.hh" +#include "RemSimPrimaryGeneratorMessenger.hh" +#include "RemSimBasicGenerator.hh" +#include "RemSimInterplanetarySpaceConfiguration.hh" +#include "RemSimVPrimaryGeneratorFactory.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "globals.hh" + +RemSimPrimaryGeneratorAction::RemSimPrimaryGeneratorAction() +{ + value = "Basic"; + primaryFactory1 = new RemSimBasicGenerator(); + primaryFactory2 = new RemSimInterplanetarySpaceConfiguration(); + messenger = new RemSimPrimaryGeneratorMessenger(this); +} + +RemSimPrimaryGeneratorAction::~RemSimPrimaryGeneratorAction() +{ + delete messenger; + delete primaryFactory2; + delete primaryFactory1; +} + +G4double RemSimPrimaryGeneratorAction::GetInitialEnergy() +{ + G4double initialEnergy = 0.; + + if(value == "Basic") + initialEnergy = primaryFactory1 -> GetInitialEnergy(); + + else if(value == "Interplanetary") + initialEnergy = primaryFactory2 -> GetInitialEnergy(); + + return initialEnergy; +} + +void RemSimPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + if(value == "Basic") + primaryFactory1 -> GeneratePrimaries(anEvent); + + else if(value == "Interplanetary") + { + primaryFactory2 -> SetMoon(false); + primaryFactory2 -> GeneratePrimaries(anEvent); + } + else if(value == "Moon") + { + primaryFactory2 -> SetMoon(true); + primaryFactory2 -> GeneratePrimaries(anEvent); + } +} + + +void RemSimPrimaryGeneratorAction::SelectPrimaries(G4String val) +{ + value = val; + + if(value == "Basic") + G4cout<< "The configuration is the basic generator" <SetGuidance("Select the generation configuration of primary particles."); + + fluxCmd = new G4UIcmdWithAString("/gun/generator",this); + fluxCmd -> SetGuidance("Assign the configuration of generation of primary particles."); + fluxCmd -> SetParameterName("choice",true); + fluxCmd -> SetCandidates("Moon Interplanetary Basic"); + fluxCmd -> AvailableForStates(G4State_PreInit,G4State_Idle); + } + +RemSimPrimaryGeneratorMessenger::~RemSimPrimaryGeneratorMessenger() +{ + delete fluxCmd; + delete gunDir; +} + +void RemSimPrimaryGeneratorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if(command == fluxCmd) primary -> SelectPrimaries(newValue); +} + diff --git a/examples/advanced/radioprotection/src/RemSimROGeometry.cc b/examples/advanced/radioprotection/src/RemSimROGeometry.cc new file mode 100644 index 0000000000..f59229b051 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimROGeometry.cc @@ -0,0 +1,140 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// ************************************ +// * * +// * RemSimROGeometry.cc * +// * * +// ************************************ +// +// $Id: RemSimROGeometry.cc,v 1.5 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "RemSimROGeometry.hh" +#include "RemSimDummySD.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4PVReplica.hh" +#include "G4SDManager.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4SubtractionSolid.hh" +#include "G4ThreeVector.hh" +#include "G4Material.hh" + +RemSimROGeometry::RemSimROGeometry(G4double astronautDimX, + G4double astronautDimY, + G4double astronautDimZ, + G4int numberOfVoxelsZ, + G4double trans): + + astronautDimensionX(astronautDimX), + astronautDimensionY(astronautDimY), + astronautDimensionZ(astronautDimZ), + numberOfVoxelsAlongZ(numberOfVoxelsZ), + translation(trans), + ROAstronautZDivisionPhys(0) +{ +} + +RemSimROGeometry::~RemSimROGeometry() +{ +} + +G4VPhysicalVolume* RemSimROGeometry::Build() +{ + // A dummy material is used to fill the volumes of the readout geometry. + // (It will be allowed to set a NULL pointer in volumes of such virtual + // division in future, since this material is irrelevant for tracking.) + + G4Material* dummyMat = new G4Material(name="dummyMat", 1., 1.*g/mole, 1.*g/cm3); + + G4double worldDimensionX = 30.0*m; + G4double worldDimensionY = 30.0*m; + G4double worldDimensionZ = 30.0*m; + + // world volume of ROGeometry ... + G4Box *ROWorld = new G4Box("ROWorld", + worldDimensionX, + worldDimensionY, + worldDimensionZ); + + G4LogicalVolume *ROWorldLog = new G4LogicalVolume(ROWorld, + dummyMat, + "ROWorldLog", + 0,0,0); + + G4VPhysicalVolume *ROWorldPhys = new G4PVPlacement(0, + G4ThreeVector(), + "ROWorldPhys", + ROWorldLog, + 0,false,0); + + // ROGeometry corresponding to the phantom + G4Box *ROAstronaut = new G4Box("ROAstronaut", + astronautDimensionX/2., + astronautDimensionY/2., + astronautDimensionZ/2.); + + G4LogicalVolume *ROAstronautLog = new G4LogicalVolume(ROAstronaut, + dummyMat, + "ROAstronautLog", + 0,0,0); + + G4VPhysicalVolume *ROAstronautPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,translation), + "AstronautPhys", + ROAstronautLog, + ROWorldPhys, + false,0); + + // Z division ... + G4double voxelSizeZ = astronautDimensionZ/numberOfVoxelsAlongZ; + + G4Box *ROAstronautZDivision = new G4Box("ROAstronautZDivision", + astronautDimensionX/2, + astronautDimensionY/2., + voxelSizeZ/2.); + + G4LogicalVolume *ROAstronautZDivisionLog = new G4LogicalVolume(ROAstronautZDivision, + dummyMat, + "ROAstronautZDivisionLog", + 0,0,0); + + ROAstronautZDivisionPhys = new G4PVReplica("ROAstronautXDivisionPhys", + ROAstronautZDivisionLog, + ROAstronautPhys, + kZAxis, + numberOfVoxelsAlongZ, + voxelSizeZ); + RemSimDummySD *dummySD = new RemSimDummySD; + ROAstronautZDivisionLog -> SetSensitiveDetector(dummySD); + + return ROWorldPhys; +} + + + diff --git a/examples/advanced/radioprotection/src/RemSimRoofDecorator.cc b/examples/advanced/radioprotection/src/RemSimRoofDecorator.cc new file mode 100644 index 0000000000..0f620245ab --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimRoofDecorator.cc @@ -0,0 +1,126 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ************************************ +// * * +// * RemSimRoofDecorator.cc * +// * * +// ************************************ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// +// $Id: RemSimRoofDecorator.cc,v 1.4 2004/06/18 09:18:08 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "RemSimVGeometryComponent.hh" +#include "RemSimMaterial.hh" +#include "G4Material.hh" +#include "G4MaterialTable.hh" +#include "RemSimRoofDecorator.hh" +#include "RemSimDecorator.hh" +#include "G4Trd.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "RemSimSensitiveDetector.hh" +#include "RemSimROGeometry.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4VisAttributes.hh" + +RemSimRoofDecorator::RemSimRoofDecorator(RemSimVGeometryComponent* comp) + : RemSimDecorator(comp) +{ + pMaterial = new RemSimMaterial(); + roofVisAtt = 0; + roof = 0; + roofLog = 0; + roofPhys = 0; +} +RemSimRoofDecorator::~RemSimRoofDecorator() +{ + delete pMaterial; +} +void RemSimRoofDecorator::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + pMaterial -> DefineMaterials(); + RemSimDecorator::ConstructComponent(motherVolume); + ConstructRoof(motherVolume); +} + +void RemSimRoofDecorator::DestroyComponent() +{ + delete roofVisAtt; + roofVisAtt = 0; + + delete roofPhys; + roofPhys = 0; + + delete roofLog; + roofLog = 0; + + delete roof; + roof = 0; +} +void RemSimRoofDecorator::ConstructRoof(G4VPhysicalVolume* motherVolume) +{ + // Geometry definition + pMaterial -> DefineMaterials(); + + G4Material* moonMaterial = pMaterial -> GetMaterial("moon"); + + + roof = new G4Trd("roof",2.25*m,7.*m,5.*m, 8.*m, 1.5 *m); + + roofLog = new G4LogicalVolume(roof, + moonMaterial, + "roof", + 0,0,0); + + roofPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0., - 1.5 *m), + "roof",roofLog, + motherVolume,false,0); + + //Visualisation attributes + G4Colour red (1.0,0.0,0.0); + roofVisAtt = new G4VisAttributes(red); + roofVisAtt -> SetVisibility(true); + roofVisAtt -> SetForceSolid(true); + roofLog -> SetVisAttributes(roofVisAtt); + PrintDetectorParameters(); +} + +void RemSimRoofDecorator::ChangeThickness(G4double thick) +{ + PrintDetectorParameters(); + roof -> SetZHalfLength(thick/2.); + roofPhys -> SetTranslation(G4ThreeVector + (0.,0., - thick/2.)); +} + +void RemSimRoofDecorator::PrintDetectorParameters() +{ + ; +} diff --git a/examples/advanced/radioprotection/src/RemSimRunAction.cc b/examples/advanced/radioprotection/src/RemSimRunAction.cc new file mode 100644 index 0000000000..3b30cfb961 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimRunAction.cc @@ -0,0 +1,167 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ******************************* +// * * +// * RemSimRunAction.cc * +// * * +// ******************************* +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// $Id: RemSimRunAction.cc,v 1.9 2004/06/18 09:18:09 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "RemSimRunAction.hh" +#include "RemSimDetectorConstruction.hh" +#include "RemSimPrimaryGeneratorAction.hh" +#ifdef G4ANALYSIS_USE +#include "RemSimAnalysisManager.hh" +#endif +#include "RemSimRunMessenger.hh" +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4ios.hh" +#include "RemSimRunAction.hh" +#include +#include + +RemSimRunAction::RemSimRunAction() +{ + //Read the input file concerning the generation of primary particles + energies = new G4DataVector; + data = new G4DataVector; + messenger = new RemSimRunMessenger(this); + file = ""; +} + +RemSimRunAction::~RemSimRunAction() +{ + delete messenger; + delete energies; + delete data; + } + +void RemSimRunAction::BeginOfRunAction(const G4Run*) +{ + +} + +void RemSimRunAction::EndOfRunAction(const G4Run* aRun) +{ + G4double numberEvents = aRun -> GetNumberOfEvent(); + G4cout<< "Number of events:" << numberEvents << G4endl; +} + +void RemSimRunAction::Read(G4String name) +{ + file = name; + ReadData(MeV,name); + G4cout << name << " is the input file!" << G4endl; +} + +void RemSimRunAction::ReadData(G4double unitE, G4String fileName) +{ + char nameChar[100] = {""}; + std::ostrstream ost(nameChar, 100, std::ios::out); + + ost << fileName; + + G4String name(nameChar); + + std::ifstream file(fileName); + std::filebuf* lsdp = file.rdbuf(); + + if (! (lsdp->is_open()) ) + { + G4String excep = "RemSimRunAction - data file: not found"; + G4Exception(excep); + } + G4double a = 0; + G4int k = 1; + + do + { + file >> a; + G4int nColumns = 2; + // The file is organized into two columns: + // 1st column is the energy + // 2nd column is the corresponding value + // The file terminates with the pattern: -1 -1 + // -2 -2 + if (a == -1 || a == -2) + { + + } + else + { + if (k%nColumns != 0) + { + G4double e = a * unitE; + energies->push_back(e); + // G4cout<push_back(value); + //G4cout<<" "< size(); + for (size_t i = 0; i < size; i++) + { + sum+=(*data)[i]; + } + return sum; +} + +G4bool RemSimRunAction::GetFile() +{ + if (file == "") return false; + else return true; +} diff --git a/examples/advanced/radioprotection/src/RemSimRunMessenger.cc b/examples/advanced/radioprotection/src/RemSimRunMessenger.cc new file mode 100644 index 0000000000..2b8fa36df8 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimRunMessenger.cc @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +// ********************************* +// * * +// * RemSimRunMessenger.cc * +// * * +// ********************************* +// +// +// $Id: RemSimRunMessenger.cc,v 1.2 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +#include "RemSimRunMessenger.hh" +#include "RemSimRunAction.hh" +#include "RemSimRunAction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" + +RemSimRunMessenger::RemSimRunMessenger( RemSimRunAction* arun): run(arun) +{ + runDir = new G4UIdirectory("/run/"); + runDir->SetGuidance("Select data.txt."); + + readFileCmd = new G4UIcmdWithAString("/run/data",this); + readFileCmd->SetGuidance("Select data.txt/ write the name of the file"); + readFileCmd->SetParameterName("choice",true); + readFileCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + } + +RemSimRunMessenger::~RemSimRunMessenger() +{ + delete readFileCmd; + delete runDir; +} + +void RemSimRunMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if(command == readFileCmd) run -> Read(newValue); +} + diff --git a/examples/advanced/radioprotection/src/RemSimSensitiveDetector.cc b/examples/advanced/radioprotection/src/RemSimSensitiveDetector.cc new file mode 100644 index 0000000000..9aa02d2df7 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimSensitiveDetector.cc @@ -0,0 +1,88 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimSensitiveDetector.cc,v 1.6 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#include "RemSimSensitiveDetector.hh" +#include "RemSimHit.hh" +#include "G4Step.hh" +#include "G4HCofThisEvent.hh" +#include "G4TouchableHistory.hh" +#include "G4ios.hh" +#ifdef G4ANALYSIS_USE +#include "RemSimAnalysisManager.hh" +#endif + +RemSimSensitiveDetector::RemSimSensitiveDetector(G4String name) + :G4VSensitiveDetector(name) +{ + G4String HCname; + collectionName.insert(HCname="trackerCollection"); +} + +RemSimSensitiveDetector::~RemSimSensitiveDetector(){;} + +void RemSimSensitiveDetector::Initialize(G4HCofThisEvent* HCE) +{ + static G4int HCID = -1; + trackerCollection = new RemSimHitsCollection + (SensitiveDetectorName,collectionName[0]); + if(HCID<0) + { HCID = GetCollectionID(0); } + HCE -> AddHitsCollection(HCID,trackerCollection); +} + +G4bool RemSimSensitiveDetector::ProcessHits(G4Step* aStep, + G4TouchableHistory* ROhist) +{ + G4double edep = aStep -> GetTotalEnergyDeposit(); + if(edep==0.) return false; + + G4int i = ROhist -> GetReplicaNumber(); + + RemSimHit* newHit = new RemSimHit(); + newHit -> SetEdep(edep); + newHit -> SetIndexes(i); + newHit->SetPosition(aStep->GetPreStepPoint()->GetPosition()); + trackerCollection -> insert( newHit ); + +#ifdef G4ANALYSIS_USE + RemSimAnalysisManager* analysis = RemSimAnalysisManager::getInstance(); + + // Energy deposit in the phantom + analysis -> energyDepositStore(i,edep/MeV); + + // Energy deposit of secondary particles in the phantom + if(aStep -> GetTrack() -> GetTrackID()!= 1) + analysis -> SecondaryEnergyDeposit(i,edep/MeV); +#endif + + return true; +} + +void RemSimSensitiveDetector::EndOfEvent(G4HCofThisEvent*) +{ +} diff --git a/examples/advanced/radioprotection/src/RemSimShelterSPEDecorator.cc b/examples/advanced/radioprotection/src/RemSimShelterSPEDecorator.cc new file mode 100644 index 0000000000..f1cc96976a --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimShelterSPEDecorator.cc @@ -0,0 +1,122 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimShelterSPEDecorator.cc,v 1.2 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#include "RemSimVGeometryComponent.hh" +#include "RemSimMaterial.hh" +#include "G4Material.hh" +#include "G4MaterialTable.hh" +#include "RemSimShelterSPEDecorator.hh" +#include "RemSimDecorator.hh" +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "RemSimSensitiveDetector.hh" +#include "RemSimROGeometry.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4VisAttributes.hh" + +RemSimShelterSPEDecorator::RemSimShelterSPEDecorator(RemSimVGeometryComponent* comp) + : RemSimDecorator(comp) +{ + shelterSPEX = 5.*m; + shelterSPEY = 5.*m; + shelterSPEZ = 75.*cm; + translation = - 2.* m; + pMaterial = new RemSimMaterial(); + + shelterSPEVisAtt = 0; +} +RemSimShelterSPEDecorator::~RemSimShelterSPEDecorator() +{ + delete pMaterial; +} +void RemSimShelterSPEDecorator::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + pMaterial -> DefineMaterials(); + RemSimDecorator::ConstructComponent(motherVolume); + ConstructShelterSPE(motherVolume); +} + +void RemSimShelterSPEDecorator::DestroyComponent() +{ + delete shelterSPEVisAtt; + shelterSPEVisAtt = 0; + + delete shelterSPEPhys; + shelterSPEPhys = 0; + + delete shelterSPELog; + shelterSPELog = 0; + + delete shelterSPE; + shelterSPE = 0; +} +void RemSimShelterSPEDecorator::ConstructShelterSPE(G4VPhysicalVolume* motherVolume) +{ + // Geometry definition + pMaterial -> DefineMaterials(); + + G4Material* water = pMaterial -> GetMaterial("Water"); + + shelterSPE = new G4Box("shelterSPE",shelterSPEX/2.,shelterSPEY/2.,shelterSPEZ/2.); + + shelterSPELog = new G4LogicalVolume(shelterSPE, water, + "shelterSPELog",0,0,0); + + shelterSPEPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,translation + shelterSPEZ/2.), + "shelterSPEPhys", shelterSPELog, motherVolume,false,0); + + //Visualisation attributes + G4Colour red (1.0,0.0,0.0); + shelterSPEVisAtt = new G4VisAttributes(red); + shelterSPEVisAtt -> SetVisibility(true); + shelterSPEVisAtt -> SetForceSolid(true); + shelterSPELog -> SetVisAttributes(shelterSPEVisAtt); + PrintDetectorParameters(); +} + +void RemSimShelterSPEDecorator::ChangeThickness(G4double) +{ + ; +} + +void RemSimShelterSPEDecorator::PrintDetectorParameters() +{ + G4cout << "-----------------------------------------------------------------------" + << G4endl + << "the shelterSPE is a box whose thickness is: " << G4endl + << ((shelterSPE -> GetZHalfLength())*2.)/cm + << " cm along the Z axis" + << G4endl + << "material of the shelterSPE: " + << shelterSPELog -> GetMaterial() -> GetName() < DefineMaterials(); + RemSimDecorator::ConstructComponent(motherVolume); + ConstructShielding(motherVolume); +} + +void RemSimShieldingDecorator::DestroyComponent() +{ + delete shieldingVisAtt; + shieldingVisAtt = 0; + + delete shieldingPhys; + shieldingPhys = 0; + + delete shieldingLog; + shieldingLog = 0; + + delete shielding; + shielding = 0; +} +void RemSimShieldingDecorator::ConstructShielding(G4VPhysicalVolume* motherVolume) +{ + // Geometry definition + pMaterial -> DefineMaterials(); + + G4Material* water = pMaterial -> GetMaterial("Water"); + + shielding = new G4Box("shielding",shieldingX/2.,shieldingY/2.,shieldingZ/2.); + + shieldingLog = new G4LogicalVolume(shielding, water, + "shieldingLog",0,0,0); + + shieldingPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,translation + shieldingZ/2.), + "shieldingPhys", shieldingLog, motherVolume,false,0); + + //Visualisation attributes + G4Colour red (1.0,0.0,0.0); + shieldingVisAtt = new G4VisAttributes(red); + shieldingVisAtt -> SetVisibility(true); + shieldingVisAtt -> SetForceSolid(true); + shieldingLog -> SetVisAttributes(shieldingVisAtt); + PrintDetectorParameters(); +} + +void RemSimShieldingDecorator::ChangeThickness(G4double thick) +{ + PrintDetectorParameters(); + shielding -> SetZHalfLength(thick/2.); + shieldingPhys -> SetTranslation(G4ThreeVector + (0.,0.,translation + thick/2.)); +} + +void RemSimShieldingDecorator::PrintDetectorParameters() +{ + G4cout << "-----------------------------------------------------------------------" + << G4endl + << "the shielding is a box whose thickness is: " << G4endl + << ((shielding -> GetZHalfLength())*2.)/cm + << " cm along the Z axis" + << G4endl + << "material of the shielding: " + << shieldingLog -> GetMaterial() -> GetName() < GetPreStepPoint()-> + GetPhysicalVolume()-> GetName(); + + // Store in histograms useful information concerning primary particles + +#ifdef G4ANALYSIS_USE + RemSimAnalysisManager* analysis = RemSimAnalysisManager::getInstance(); + + G4VPhysicalVolume* volume = aStep -> GetPostStepPoint() -> GetPhysicalVolume(); + + G4String particleName = (aStep -> GetTrack() -> GetDynamicParticle() + -> GetDefinition() -> GetParticleName()); + + if(oldVolumeName != "phantom") + { + if (volume) + { + G4String volumeName = volume -> GetName(); + if (volumeName == "phantom") + { + G4double initialEnergy = primaryAction -> GetInitialEnergy(); + G4double particleEnergy = aStep -> GetTrack() -> GetKineticEnergy(); + if ( particleName == "proton" || + particleName == "alpha" || + particleName == "IonO16" || + particleName == "IonC12" || + particleName == "IonFe52"|| + particleName == "IonSi28") + { + analysis -> PrimaryInitialEnergyIn(initialEnergy); + analysis -> PrimaryEnergyIn(particleEnergy); + } + } + } + } + + if(oldVolumeName == "phantom") + { + if (volume) + { + G4String volumeName = volume -> GetName(); + + if (volumeName != "phantom") + { + G4double initialEnergy = primaryAction -> GetInitialEnergy(); + G4double particleEnergy = aStep->GetTrack() -> GetKineticEnergy(); + + if ( particleName == "proton" || + particleName == "alpha" || + particleName == "IonO16" || + particleName == "IonC12" || + particleName == "IonFe52"|| + particleName == "IonSi28" ) + { + analysis -> PrimaryInitialEnergyOut(initialEnergy); + analysis -> PrimaryEnergyOut(particleEnergy); + } + } + } + } + + //analysis of hadronic physics + if (hadronic == "On") + { + if(aStep -> GetPostStepPoint() -> GetProcessDefinedStep() != NULL) + { + G4String process = aStep -> GetPostStepPoint() -> + GetProcessDefinedStep() ->GetProcessName(); + + if ((process != "Transportation") && + (process != "msc") && + (process != "LowEnergyIoni") && + (process != "LowEnergyBrem") && + (process != "eIoni") && + (process != "hIoni") && + (process != "eBrem") && + (process != "compt") && + (process != "phot") && + (process != "conv") && + (process != "annihil") && + (process != "hLowEIoni") && + (process != "LowEnBrem") && + (process != "LowEnCompton") && + (process != "LowEnPhotoElec") && + (process != "LowEnRayleigh") && + (process != "LowEnConversion")) + G4cout << "Hadronic Process:" << process << G4endl; + } + } +#endif +} +void RemSimSteppingAction::SetHadronicAnalysis(G4String value) +{ + hadronic = value; +} + + + + + + diff --git a/examples/advanced/radioprotection/src/RemSimSteppingActionMessenger.cc b/examples/advanced/radioprotection/src/RemSimSteppingActionMessenger.cc new file mode 100644 index 0000000000..c35a94c172 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimSteppingActionMessenger.cc @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +//$Id: RemSimSteppingActionMessenger.cc,v 1.2 2004/05/22 12:57:07 guatelli Exp $// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// + +#include "RemSimSteppingActionMessenger.hh" +#include "RemSimSteppingAction.hh" + +#include "globals.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" + +RemSimSteppingActionMessenger::RemSimSteppingActionMessenger(RemSimSteppingAction* SA) +:steppingAction(SA) +{ + stepDirectory = new G4UIdirectory("/step/"); + stepDirectory -> SetGuidance("Step control command."); + + hadronicCmd = new G4UIcmdWithAString("/step/hadronicVerbose",this); + hadronicCmd -> SetGuidance("Set the verbose level of hadronic processes"); + hadronicCmd -> SetParameterName("choice", true); + hadronicCmd -> SetCandidates("On Off"); + hadronicCmd -> AvailableForStates(G4State_PreInit,G4State_Idle); +} +RemSimSteppingActionMessenger::~RemSimSteppingActionMessenger() +{ + delete hadronicCmd; + delete stepDirectory; +} + +void RemSimSteppingActionMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if(command == hadronicCmd) steppingAction -> SetHadronicAnalysis(newValue); +} + diff --git a/examples/advanced/radioprotection/src/RemSimVGeometryComponent.cc b/examples/advanced/radioprotection/src/RemSimVGeometryComponent.cc new file mode 100644 index 0000000000..625254910e --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimVGeometryComponent.cc @@ -0,0 +1,34 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimVGeometryComponent.cc,v 1.3 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// + +#include"RemSimVGeometryComponent.hh" + +RemSimVGeometryComponent::RemSimVGeometryComponent() +{;} +RemSimVGeometryComponent::~RemSimVGeometryComponent() +{;} diff --git a/examples/advanced/radioprotection/src/RemSimVPrimaryGeneratorFactory.cc b/examples/advanced/radioprotection/src/RemSimVPrimaryGeneratorFactory.cc new file mode 100644 index 0000000000..bf2f647cd4 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimVPrimaryGeneratorFactory.cc @@ -0,0 +1,35 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimVPrimaryGeneratorFactory.cc,v 1.5 2004/05/22 12:57:07 guatelli Exp $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#include "RemSimVPrimaryGeneratorFactory.hh" + +RemSimVPrimaryGeneratorFactory::RemSimVPrimaryGeneratorFactory() +{ +} + +RemSimVPrimaryGeneratorFactory::~RemSimVPrimaryGeneratorFactory() +{ +} diff --git a/examples/advanced/radioprotection/src/RemSimVehicle1.cc b/examples/advanced/radioprotection/src/RemSimVehicle1.cc new file mode 100644 index 0000000000..cd52097f84 --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimVehicle1.cc @@ -0,0 +1,456 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RemSimVehicle1.cc,v 1.8 2004/05/27 08:36:52 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: S.Guatelli, guatelli@ge.infn.it +// +#include "RemSimVGeometryComponent.hh" +#include "RemSimMaterial.hh" +#include "G4Material.hh" +#include "RemSimVehicle1.hh" +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4UserLimits.hh" + +RemSimVehicle1::RemSimVehicle1(): + layervacuumPhys(0), layer1Phys(0), layer2Phys(0), layer3Phys(0), + layer4Phys(0), layer5Phys(0), layer6Phys(0), layer7Phys(0), layer8Phys(0), + layer9Phys(0), layer10Phys(0), layer11Phys(0), layer12Phys(0), + layer13Phys(0), layer14Phys(0), layer15Phys(0), layerPhys(0), + layer16Phys(0), layer17Phys(0), layer18Phys(0), layer19Phys(0), + layer20Phys(0), layer21Phys(0), layer22Phys(0), layer23Phys(0), + layer24Phys(0), layer25Phys(0), layer26Phys(0), layer27Phys(0) +{ + pMaterial = new RemSimMaterial(); +} +RemSimVehicle1::~RemSimVehicle1() +{ + delete pMaterial; +} +void RemSimVehicle1::ConstructComponent(G4VPhysicalVolume* motherVolume) +{ + + G4double sizeX = 5.*m; + G4double sizeY = 5.*m; + + G4Material* betacloth = pMaterial -> GetMaterial("betacloth"); + + //layer of betacloth + G4double translation = - 5.*m; + + G4double thick = 0.03 *cm; + + G4Box* layer1 = new G4Box("layer1",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer1Log = new G4LogicalVolume(layer1, + betacloth, + "layer1Log", + 0,0,0); + + layer1Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,translation+thick/2.), + "layer1Phys", + layer1Log, + motherVolume, + false, + 0); + + translation = translation + thick; + + thick = 0.01*cm; + + // Mylar layer + G4Material* mylar = pMaterial -> GetMaterial("mylar"); + + G4Box* layer2 = new G4Box("layer2",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer2Log = new G4LogicalVolume(layer2, + mylar, + "layer2Log", + 0,0,0); + + layer2Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer2Phys", + layer2Log, + motherVolume, + false,0); + // Nextel layer + G4Material* nextel = pMaterial -> GetMaterial("Nextel312AF62"); + translation = translation + thick; + thick = 0.1*cm; + + G4Box* layer3 = new G4Box("layer3",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer3Log = new G4LogicalVolume(layer3, + nextel, + "layer3Log", + 0,0,0); + + layer3Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer3Phys", + layer3Log, + motherVolume, + false,0); + + translation = translation + thick; + thick = 10.06*cm; + G4Material* vacuum = pMaterial -> GetMaterial("Galactic") ; + G4Box* layer4 = new G4Box("layer4",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer4Log = new G4LogicalVolume(layer4, + vacuum, + "layer4Log", + 0,0,0); + layer4Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer4Phys", + layer4Log, + motherVolume, + false,0); + // Nextel layer + thick = 0.1*cm; + translation = translation + 10.06*cm; + layer5Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer5Phys", + layer3Log, + motherVolume, + false,0); + //Vacuum layer + translation = translation + thick; + thick = 10.06 * cm; + + layer6Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer6Phys", + layer4Log, + motherVolume, + false,0); + // Nextel layer + translation = translation + thick; + thick = 0.2*cm; + + layer7Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+ translation), + "layer7Phys", + layer3Log, + motherVolume, + false,0); + // mylar layer + translation = translation + thick; + thick = 0.20 *cm; + + G4Box* layer8 = new G4Box("layer8",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer8Log = new G4LogicalVolume(layer8, + mylar, + "layer8Log", + 0,0,0); + + layer8Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer8Phys", + layer8Log, + motherVolume, + false,0); + + //Vacuum layer + translation = translation + thick; + thick = 10.06 * cm; + + layer9Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer6Phys", + layer4Log, + motherVolume, + false,0); + // mylar layer + translation = translation + thick; + thick = 0.2 *cm; + + G4Box* layer10 = new G4Box("layer10",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer10Log = new G4LogicalVolume(layer10, + mylar, + "layer10Log", + 0,0,0); + + layer10Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer10Phys", + layer10Log, + motherVolume, + false,0); + //Redundant Bladder + //Polyethylene + G4Material* polyethilene = pMaterial -> GetMaterial("polyethylene"); + translation = translation + thick; + thick = 0.0028*cm; + + G4Box* layer11 = new G4Box("layer11", sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer11Log = new G4LogicalVolume(layer11, + polyethilene, + "layer11Log", + 0,0,0); + + layer11Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer11Phys", + layer11Log, + motherVolume, + false,0); + //ployacrylate + translation = translation + thick; + thick = 0.0028*cm; + + G4Material* polyacrylate = pMaterial ->GetMaterial("polyacrylate"); + G4LogicalVolume* layer12Log = new G4LogicalVolume(layer11, + polyacrylate, + "layer12Log", + 0,0,0); + + layer12Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer12Phys", + layer12Log, + motherVolume, + false,0); + + //evoh layer + translation = translation + thick; + thick = 0.0028*cm; + G4Material* evoh = pMaterial ->GetMaterial("evoh"); + G4LogicalVolume* layer13Log = new G4LogicalVolume(layer11, + evoh, + "layer13Log", + 0,0,0); + + layer13Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer13Phys", + layer13Log, + motherVolume, + false,0); + //polyacrylate + translation = translation + thick; + thick = 0.0028*cm; + + layer14Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer14Phys", + layer12Log, + motherVolume, + false,0); + //polyethilene + translation = translation + thick; + thick = 0.0028*cm; + + layer15Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer15Phys", + layer11Log, + motherVolume, + false,0); + //kevlar layer + translation = translation + thick; + thick = 0.026*cm; + + G4Material* kevlarAir = pMaterial -> GetMaterial("kevlarAir"); + + G4Box* layer = new G4Box("layer",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layerLog = new G4LogicalVolume(layer, + kevlarAir, + "layerLog", + 0,0,0); + + layerPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layerPhys", + layerLog, + motherVolume, + false,0); + //polyethilene layer + translation = translation + thick; + thick = 0.0028*cm; + + layer16Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer16Phys", + layer11Log, + motherVolume, + false,0); + //polyacrylate layer + translation = translation + thick; + thick = 0.0028*cm; + + layer17Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer17Phys", + layer12Log, + motherVolume, + false,0); + //evoh + translation = translation + thick; + thick = 0.0028*cm; + + layer18Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer18Phys", + layer13Log, + motherVolume, + false,0); + //polyacrylate layer + translation = translation + thick; + thick = 0.0028*cm; + layer19Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer19Phys", + layer12Log, + motherVolume, + false,0); + //polyethilene layer + translation = translation + thick; + thick = 0.0028*cm; + + layer20Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer20Phys", + layer11Log, + motherVolume, + false,0); + //kevlar layer + translation = translation + thick; + thick = 0.026*cm; + + layer21Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer21Phys", + layerLog, + motherVolume, + false,0); + //polyethilene layer + translation = translation + thick; + thick = 0.0028*cm; + + layer22Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer22Phys", + layer11Log, + motherVolume, + false,0); + //polyacrylate layer + translation = translation + thick; + thick = 0.0028*cm; + + layer23Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer23Phys", + layer12Log, + motherVolume, + false,0); + //evoh layer + translation = translation + thick; + thick = 0.0028*cm; + + layer24Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer24Phys", + layer13Log, + motherVolume, + false,0); + //polyacrylate layer + translation = translation + thick; + thick = 0.0028*cm; + + layer25Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer25Phys", + layer12Log, + motherVolume, + false,0); + +//polyethilene layer + translation = translation + thick; + thick = 0.0028*cm; + + layer26Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer26Phys", + layer11Log, + motherVolume, + false,0); + +//nomex layer + translation = translation + thick; + thick = 0.03*cm; + + G4Material* nomex= pMaterial ->GetMaterial("nomexAir"); + + G4Box* layer27 = new G4Box("layer27",sizeX/2.,sizeY/2.,thick/2.); + + G4LogicalVolume* layer27Log = new G4LogicalVolume(layer27, + nomex, + "layer27Log", + 0,0,0); + + layer27Phys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,thick/2.+translation), + "layer27Phys", + layer27Log, + motherVolume, + false,0); + translation = translation + thick; + + G4Colour magenta (1.0, 0.0, 1.0) ; + G4Colour green (0.0,1.0,0.0); + + G4VisAttributes* layer1VisAtt = new G4VisAttributes(green); + layer1VisAtt -> SetVisibility(true); + layer1VisAtt -> SetForceSolid(true); + layer1Log -> SetVisAttributes(layer1VisAtt); + layer3Log -> SetVisAttributes(layer1VisAtt); + layer8Log -> SetVisAttributes(layer1VisAtt); + layer11Log -> SetVisAttributes(layer1VisAtt); + layer13Log -> SetVisAttributes(layer1VisAtt); + + G4VisAttributes* layer2VisAtt = new G4VisAttributes(magenta); + layer2VisAtt -> SetVisibility(true); + layer2VisAtt -> SetForceSolid(true); + layer2Log -> SetVisAttributes(layer2VisAtt); + layer4Log -> SetVisAttributes(layer2VisAtt); + layer10Log -> SetVisAttributes(layer2VisAtt); + layer12Log -> SetVisAttributes(layer2VisAtt); + layer27Log -> SetVisAttributes(layer2VisAtt); +} + +void RemSimVehicle1::DestroyComponent() +{ +} diff --git a/examples/advanced/radioprotection/src/RemSimVisManager.cc b/examples/advanced/radioprotection/src/RemSimVisManager.cc new file mode 100755 index 0000000000..df58321f8d --- /dev/null +++ b/examples/advanced/radioprotection/src/RemSimVisManager.cc @@ -0,0 +1,136 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RemSimVisManager.cc,v 1.4 2004/05/22 12:57:07 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// John Allison 24th January 1998. + +#ifdef G4VIS_USE + +#include "RemSimVisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4HepRep.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +RemSimVisManager::RemSimVisManager () +{} + +void RemSimVisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4HepRep); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} +#endif diff --git a/examples/advanced/radioprotection/vehicle1.mac b/examples/advanced/radioprotection/vehicle1.mac new file mode 100644 index 0000000000..d86204a1a4 --- /dev/null +++ b/examples/advanced/radioprotection/vehicle1.mac @@ -0,0 +1,54 @@ +############################# +############# Activate physics +#### Add e.m. physics +/physics/addPhysics photon-epdl +/physics/addPhysics electron-eedl +/physics/addPhysics positron-standard +# +#Standard process for p, alpha and ions +#/physics/addPhysics ion-standard +# +#LowEnergy process for p, alpha and ions +/physics/addPhysics ion-ICRU +#### Add Hadronic Physics, muon physics and decay +#/physics/addPhysics hadronic +#/physics/addPhysics muon-standard +#/physics/addPhysics decay +############################## +#### Sets some default verbose +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +/run/initialize +################ +## Visualisation +#/vis/scene/create +# --- Choose one the following visualisation tools +#/vis/open OGLIX +#/vis/open DAWNFILE +#/vis/open VRML2FILE +# -------- +#/vis/drawVolume +#/vis/viewer/set/viewpointThetaPhi 90 180 deg +#/vis/viewer/zoom 2 +#/tracking/storeTrajectory 1 +################ +# Generation of primary particles +/gun/generator Basic +/gun/particle proton +/gun/energy 500. MeV +# Geometrical configuration +/configuration/choose vehicle +/configuration/AddShielding On +/configuration/AddSPE On +/shielding/thickness 30. cm +# Number of events +/run/beamOn 2000 + + + + + + + + diff --git a/examples/advanced/radioprotection/vehicle2.mac b/examples/advanced/radioprotection/vehicle2.mac new file mode 100644 index 0000000000..ddaf576576 --- /dev/null +++ b/examples/advanced/radioprotection/vehicle2.mac @@ -0,0 +1,49 @@ +############################# +############# Activate physics +#### Add e.m. physics +/physics/addPhysics photon-epdl +/physics/addPhysics electron-eedl +/physics/addPhysics positron-standard +#/physics/addPhysics ion-standard +/physics/addPhysics ion-ICRU +#### Add Hadronic Physics, muon physics and decay +#/physics/addPhysics hadronic +#/physics/addPhysics muon-standard +#/physics/addPhysics decay +############################## +#### Sets some default verbose +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +/run/initialize +################ +## Visualisation +#/vis/scene/create +# --- Choose one the following visualisation tools +#/vis/open OGLIX +#/vis/open DAWNFILE +#/vis/open VRML2FILE +# -------- +#/vis/drawVolume +#/vis/viewer/set/viewpointThetaPhi 90 180 deg +#/vis/viewer/zoom 2 +#/tracking/storeTrajectory 1 +################ +/run/initialize +# Generation of primary particles +/gun/generator Interplanetary +/gun/particle IonC12 +/run/data gcrZ=6.txt +# Geometry configuration +/configuration/choose vehicle +/configuration/AddShielding On +#/configuration/AddShielding Off +/configuration/AddSPE On +#/configuration/AddSPE Off +/run/beamOn 1000 + + + + + + diff --git a/examples/advanced/radioprotection/vis.mac b/examples/advanced/radioprotection/vis.mac new file mode 100644 index 0000000000..6f09b23775 --- /dev/null +++ b/examples/advanced/radioprotection/vis.mac @@ -0,0 +1,52 @@ +############################# +############# Activate physics +#### Add e.m. physics +/physics/addPhysics photon-epdl +/physics/addPhysics electron-eedl +/physics/addPhysics positron-standard +/physics/addPhysics positron-standard +# +#Standard process for p, alpha and ions +#/physics/addPhysics ion-standard +# +##LowEnergy process for p, alpha and ions +/physics/addPhysics ion-ICRU +#### Add Hadronic Physics, muon physics and decay +/physics/addPhysics hadronic +/physics/addPhysics muon-standard +/physics/addPhysics decay +############################## +#### Sets some default verbose +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +################ +## Visualisation +#/vis/scene/create +# --- Choose one the following visualisation tools +/vis/open OGLIX +#/vis/open DAWNFILE +#/vis/open VRML2FILE +# -------- +/vis/drawVolume +#/vis/viewer/zoom 2 +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate +###################### +/run/initialize +/vis/viewer/set/viewpointThetaPhi 90 180 deg +/gun/particle p +/gun/generator Basic +/gun/energy 100. MeV +/configuration/choose vehicle +/configuration/AddShielding On +/configuration/AddSPE On + + + + + + + + + diff --git a/examples/advanced/underground_physics/DMX.cc b/examples/advanced/underground_physics/DMX.cc index 8b9443a81e..b7d1167d77 100644 --- a/examples/advanced/underground_physics/DMX.cc +++ b/examples/advanced/underground_physics/DMX.cc @@ -100,7 +100,7 @@ int main(int argc,char** argv) { #ifdef G4ANALYSIS_USE G4cout << G4endl << G4endl << G4endl << " User Environment " << G4endl - << " Using AIDA 2.2 analysis " << G4endl; + << " Using AIDA 3.2.1 analysis " << G4endl; #else G4cout << G4endl << G4endl << G4endl << " User Environment " << G4endl diff --git a/examples/advanced/underground_physics/DMX.py b/examples/advanced/underground_physics/DMX.py deleted file mode 100644 index 07a4e87526..0000000000 --- a/examples/advanced/underground_physics/DMX.py +++ /dev/null @@ -1,67 +0,0 @@ -global tree, hf - -tree = tf.create("gamma_2000.his",1,1,"hbook") -tree.thisown=1 -hf = af.createHistogramFactory(tree) - -# ... and load them into memory: -hEsource = tree.findH1D("10") -hDeposit = tree.findH1D("20") -hNuclearDep = tree.findH1D("30") -hNumberPhLow = tree.findH1D("40") -hNumberPhHigh = tree.findH1D("50") -hPhArrivalTime = tree.findH1D("60") - -# set plotter to 3*2 zones -pl.createRegions(3,2) - -# ... and plot the histograms -pl.plot(hEsource ) ; pl.show() ; pl.next() -pl.plot(hDeposit ) ; pl.show() ; pl.next() -pl.plot(hNuclearDep ) ; pl.show() ; pl.next() -pl.plot(hNumberPhLow ) ; pl.show() ; pl.next() -pl.plot(hNumberPhHigh ) ; pl.show() ; pl.next() -pl.plot(hPhArrivalTime) ; pl.show() ; pl.next() - -wait() - -# reset number of zones -pl.createRegions(2,1) - -# helper function -def nplot(tup, col, cut, xmin, xmax, nbins=100): - global hf - h1 = hf.create1D("1000000","temp hist", nbins, xmin, xmax) - colId = tup.findColumn(col) - bNextRow=tup.start() # Looping over the tuple entries - while bNextRow: - h1.fill(tup.getFloat(colId)) - bNextRow=tup.next() # Retrieving the subsequent row - pl.plot(h1) ; pl.show() ; pl.next() - tree.rm("1000000") - return - -# get the primary ntuple from the NtupleManager -nt1 = tree.findTuple("3" ) - -# plot a few quantities using the shortcut -nplot(nt1,"tot_e" ,"",0.,20.) -nplot(nt1,"xe_time","",0.,100.) - -# prompt user for -wait() - -# get the secondaries ntuple and plot a few attributes from it -nt2 = tree.findTuple("2" ) -nplot(nt2, "xpos", "", 0., 50) -nplot(nt2, "zpos", "", 0., 100.) - -pl.write("pmtpos.ps", "ps") - -tree.commit() -tree.close() -del tree - - - - diff --git a/examples/advanced/underground_physics/History b/examples/advanced/underground_physics/History index f3dce706a2..a7c9f0f835 100644 --- a/examples/advanced/underground_physics/History +++ b/examples/advanced/underground_physics/History @@ -8,6 +8,8 @@ $Id: Category History file --------------------- +28.05.2003 - S. Guatelli (DMX-V06-01-00) + Migrated to AIDA 3.2.1 and PI 1.2.1 02.12.2003 - G.Cosmo (DMX-V05-02-01) Migrated to new hadronic processes for release 6.0. diff --git a/examples/advanced/underground_physics/README b/examples/advanced/underground_physics/README index f91f4e5735..59a87f4cc9 100644 --- a/examples/advanced/underground_physics/README +++ b/examples/advanced/underground_physics/README @@ -164,70 +164,22 @@ allow forward compatibility should the GPS change. ANALYSIS: -In order to use the AIDA 3 compliant analysis set the environment variable +In order to use the AIDA 3.2.1 compliant analysis set the environment variable G4ANALYSIS_USE before building. If a previous build exists a gmake clean has to be executed. setenv G4ANALYSIS_USE 1 -To link with anaphe, first execute the anaphe installation script -(example for CERN installation): - -source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/setupAnaphe.csh -setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts - -[Have a look at the Anaphe web page, http://cern.ch/anaphe for more info] - then gmake -The program should then produce hbook histogram files as well as interactively -two summary pages from QPLOTTER - outputing with postscript summary1.ps and -summary2.ps +The program should then produce hbook histogram files -In addition a lizard python script is included for reference: -start lizard: -lizard -exe("DMX.py") - -Subsequent runs will require source of anaphe_start.sh - -source anaphe_start.sh - -before executing DMX - - -NB: When running the program the output histogram file has to be "new" -therefore if it has the same name as an existing file the program will crash. - - -See http://cern.ch/anaphe for more information about ANAPHE/Lizard - -AIDA 2.2 information is available at http://www.aida.org - -Using AIDA 2.2 interfaces three different analysis packages can be utilised: +Using AIDA 3.2.1 interfaces three different analysis packages can be utilised: Java Analysis Studio (JAS) OpenScientist -Anaphe/Lizard - -At cern instead of executing the anaphe script see below: - -[ - AT CERN the following has to be executed in order to pick-up anaphe: - -execute the following lines _before_ gmake, -select the Anaphe version you want to use (4.0.1-sec for RH61 "old" compiler, -4.0.1 for RH61, new compiler (gcc-2.95.2)): -export PATH=$PATH:/afs/cern.ch/sw/lhcxx/specific/redhat61/egcs_1.1.2/4.0.1-sec/bin -source /afs/cern.ch/sw/lhcxx/share/LHCXX/4.0.1-sec/install/sharedstart.sh -(for the new compiler, use (sh derivates): -export PATH=$PATH:/afs/cern.ch/sw/lhcxx/specific/redhat61/gcc-2.95.2/4.0.1/bin -source /afs/cern.ch/sw/lhcxx/share/LHCXX/4.0.1/install/sharedstart.sh) -or, for [t]csh fans (still "old" compiler): - -setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/specific/redhat61/egcs_1.1.2/4.0.1-sec/bin -source /afs/cern.ch/sw/lhcxx/share/LHCXX/4.0.1-sec/install/sharedstart.csh -] +PI +Please for more information look at http://aida.freehep.org SEEDS: @@ -262,9 +214,6 @@ BooleanProcessor: boolean operation failed This is a "feature" of the visualisation of boolean volumes, but does not affect functionality/performance so can be ignored. - - - NB: If using explicit libraries (?) i.e. non-shared then compilation time with neutrons in physics list is very long (>5 minutes) - check this............. diff --git a/examples/advanced/underground_physics/include/DMXAnalysisManager.hh b/examples/advanced/underground_physics/include/DMXAnalysisManager.hh index 58c3f5af22..eb544aa269 100644 --- a/examples/advanced/underground_physics/include/DMXAnalysisManager.hh +++ b/examples/advanced/underground_physics/include/DMXAnalysisManager.hh @@ -53,23 +53,23 @@ #include "AIDA/IHistogram2D.h" #include "AIDA/IHistogram3D.h" -#include "AIDA/IPlotterFactory.h" -#include "AIDA/IPlotterRegion.h" -#include "AIDA/IPlotter.h" +// #include "AIDA/IPlotterFactory.h" +// #include "AIDA/IPlotterRegion.h" +// #include "AIDA/IPlotter.h" #include "AIDA/ITupleFactory.h" #include "AIDA/ITuple.h" #include "AIDA/IManagedObject.h" -# include "AIDA/IFitter.h" -# include "AIDA/IFitResult.h" -# include "AIDA/IFitData.h" -# include "AIDA/IRangeSet.h" -# include "AIDA/IFitParameterSettings.h" -# include "AIDA/IFunctionFactory.h" -# include "AIDA/IFunction.h" -# include "AIDA/IFitFactory.h" +// # include "AIDA/IFitter.h" +// # include "AIDA/IFitResult.h" +// # include "AIDA/IFitData.h" +// # include "AIDA/IRangeSet.h" +// # include "AIDA/IFitParameterSettings.h" +// # include "AIDA/IFunctionFactory.h" +// # include "AIDA/IFunction.h" +// # include "AIDA/IFitFactory.h" namespace AIDA { class IAnalysisFactory; @@ -79,16 +79,15 @@ namespace AIDA { class ITuple; class IHistogram1D; class IHistogram2D; - class IPlotter; - class IFitter; - class IFitResult; - class IFitData; - class IRangeSet; - class IFitParameterSettings; - class IFunctionFactory; - class IFunction; - class IFitFactory; - + //class IPlotter; + // class IFitter; + //class IFitResult; + //class IFitData; + //class IRangeSet; + //class IFitParameterSettings; + //class IFunctionFactory; + //class IFunction; + //class IFitFactory; } @@ -146,8 +145,21 @@ private: // Quantities for the ntuple - G4int event_id; G4double energy_pri; G4double totEnergy; G4int S_hits; G4double firstLXeHitTime; G4int P_hits; G4double aveTimePmtHits; G4String firstparticleName; G4double firstParticleE; G4bool gamma_ev; G4bool neutron_ev; G4bool positron_ev;G4bool electron_ev;G4bool other_ev; long seed1; long seed2; - + G4int event_id; + G4double energy_pri; + G4double totEnergy; + G4int S_hits; + G4double firstLXeHitTime; + G4int P_hits; + G4double aveTimePmtHits; + G4String firstparticleName; + G4double firstParticleE; + G4bool gamma_ev; + G4bool neutron_ev; + G4bool positron_ev; + G4bool electron_ev; + G4bool other_ev; + long seed1; long seed2; G4int i; G4double x; G4double y; G4double z; @@ -161,8 +173,6 @@ private: AIDA::ITree *tree; AIDA::IHistogramFactory *hf; AIDA::ITupleFactory *tpf; - AIDA::IPlotterFactory *pf; - AIDA::IPlotter *plotter; AIDA::ITuple *ntuple1; AIDA::ITuple *ntuple2; AIDA::ITuple *ntuple3; @@ -183,13 +193,12 @@ private: AIDA::IHistogram1D* hPositronEdep; AIDA::IHistogram1D* hOtherEdep; - AIDA::IFunctionFactory *funFact; - AIDA::IFitFactory *fitFact; - AIDA::IFunction *exponFun; - AIDA::IFunction *gaussFun; - AIDA::IFitter *e_fitter; - AIDA::IFitResult *fitResult; - + //AIDA::IFunctionFactory *funFact; + //AIDA::IFitFactory *fitFact; + //AIDA::IFunction *exponFun; + //AIDA::IFunction *gaussFun; + //AIDA::IFitter *e_fitter; + ///AIDA::IFitResult *fitResult; }; #endif #endif diff --git a/examples/advanced/underground_physics/src/DMXAnalysisManager.cc b/examples/advanced/underground_physics/src/DMXAnalysisManager.cc index baf179b380..e22940745d 100644 --- a/examples/advanced/underground_physics/src/DMXAnalysisManager.cc +++ b/examples/advanced/underground_physics/src/DMXAnalysisManager.cc @@ -42,12 +42,12 @@ DMXAnalysisManager* DMXAnalysisManager::instance = 0; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... DMXAnalysisManager::DMXAnalysisManager() : - af(0), tree(0), hf(0), tpf(0), pf(0), - plotter(0), ntuple1(0), ntuple2(0), ntuple3(0), ntuple4(0), + af(0), tree(0), hf(0), tpf(0), + ntuple1(0), ntuple2(0), ntuple3(0), ntuple4(0), hEsourcep(0), hEdepp(0), hEdepRecoil(0), hNumPhLow(0), hNumPhHigh(0), hAvPhArrival(0), hPhArrival(0), hPMTHits(0), h1stPMTHit(0),hGammaEdep(0), - hNeutronEdep(0), hElectronEdep(0), hPositronEdep(0), hOtherEdep(0), - funFact(0),fitFact(0),exponFun(0),gaussFun(0),e_fitter(0),fitResult(0) + hNeutronEdep(0), hElectronEdep(0), hPositronEdep(0), hOtherEdep(0) + //,funFact(0),fitFact(0),exponFun(0),gaussFun(0),e_fitter(0),fitResult(0) { // tree is created and booked inside book() ; @@ -56,9 +56,12 @@ DMXAnalysisManager::DMXAnalysisManager() : //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... DMXAnalysisManager::~DMXAnalysisManager() -{ - Finish(); -} +{ + delete tpf; + delete hf; + delete tree; + delete af; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -70,7 +73,7 @@ DMXAnalysisManager* DMXAnalysisManager::getInstance() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void DMXAnalysisManager::book(G4String histogramfile, G4bool plotevent) +void DMXAnalysisManager::book(G4String histogramfile, G4bool) { // histoManager->selectStore("DMX.his"); @@ -82,7 +85,7 @@ void DMXAnalysisManager::book(G4String histogramfile, G4bool plotevent) //parameters for the TreeFactory - G4bool fileExists = false; + G4bool fileExists = true; G4bool readOnly = false; AIDA::ITreeFactory * tf = af->createTreeFactory(); @@ -102,27 +105,27 @@ void DMXAnalysisManager::book(G4String histogramfile, G4bool plotevent) ntuple1 = tpf->create( "1", "Particle Source Energy", "double energy" ); - assert(ntuple1); + // assert(ntuple1); // ---- secondary ntuple ------ ntuple2 = tpf->create( "2", "Scintillation Hits Info", "float Event,e_prim,tot_e,s_hits,xe_time,num_ph,avphtime,1stpart,1stparte,gamma,neutron,posi,elec,other,seed1,seed2" ); - assert(ntuple2); + //assert(ntuple2); // ---- tertiary ntuple ------ ntuple3 = tpf->create( "3", "PMT Hits Info", "float event, hits, xpos, ypos, zpos" ); - assert(ntuple3); + //assert(ntuple3); // ---- extra ntuple ------ ntuple4 = tpf->create( "4", "Particles energy type", "float energy, NameIdx" ); - assert(ntuple4); + //assert(ntuple4); // Creating an 1-dimensional histogram in the root directory of the tree @@ -161,42 +164,42 @@ void DMXAnalysisManager::book(G4String histogramfile, G4bool plotevent) delete tf; - // Creating the plotter factory - pf = af->createPlotterFactory(); + // // Creating the plotter factory +// pf = af->createPlotterFactory(); - if(pf && plotevent) { - plotter = pf->create(); - if(plotter) { - plotter->show(); - plotter->setParameter("pageTitle","DMX Output Summary"); - } - delete pf; - } +// if(pf && plotevent) { +// plotter = pf->create(); +// if(plotter) { +// plotter->show(); +// plotter->setParameter("pageTitle","DMX Output Summary"); +// } +// delete pf; +// } // create fitting factories .. - G4cout << " creating fit factories " << G4endl; + // G4cout << " creating fit factories " << G4endl; - funFact = af->createFunctionFactory(*tree); - fitFact = af->createFitFactory(); + // funFact = af->createFunctionFactory(*tree); +// fitFact = af->createFitFactory(); - G4cout << " creating Exponential Function " << G4endl; - exponFun = funFact->createFunctionByName("Exponential","E"); - G4cout << " created " << G4endl; + // G4cout << " creating Exponential Function " << G4endl; +// exponFun = funFact->createFunctionByName("Exponential","E"); +// G4cout << " created " << G4endl; - G4cout << " creating Gaussian Function " << G4endl; - gaussFun = funFact->createFunctionByName("Gaussian","G"); - G4cout << " created " << G4endl; +// G4cout << " creating Gaussian Function " << G4endl; +// gaussFun = funFact->createFunctionByName("Gaussian","G"); +// G4cout << " created " << G4endl; // assert(exponFun); - // e_fitter = fitFact->createFitter("Chi2","","printLevel=-1 errorUP=1.0"); - G4cout << " creating fitter " << G4endl; - e_fitter = fitFact->createFitter(); + // // e_fitter = fitFact->createFitter("Chi2","","printLevel=-1 errorUP=1.0"); +// G4cout << " creating fitter " << G4endl; +// e_fitter = fitFact->createFitter(); - // assert(e_fitter); +// // assert(e_fitter); - G4cout << " Created e_fitter " << G4endl; +// G4cout << " Created e_fitter " << G4endl; } @@ -212,25 +215,19 @@ void DMXAnalysisManager::Finish() { // Committing the transaction with the tree - std::cout << "Committing..." << std::endl; + G4cout << "Committing..." << G4endl; // write all histograms to file tree->commit(); - std::cout << "Closing the tree..." << std::endl; + G4cout << "Closing the tree..." << G4endl; // close (will again commit) tree->close(); // extra delete as objects are created in book() method rather than during // initialisation of class - delete pf; - delete tpf; - delete hf; - delete tree; - delete af; - delete plotter; - delete funFact; - delete fitFact; + //delete funFact; + //delete fitFact; } @@ -240,74 +237,74 @@ void DMXAnalysisManager::PulseTimeFit() // created fitter factory then fitter - if(!plotter) plotter = pf->create(); - if(plotter) { - plotter->show(); - plotter->setParameter("pageTitle","DMX Fitting"); - } +// if(!plotter) plotter = pf->create(); +// if(plotter) { +// plotter->show(); +// plotter->setParameter("pageTitle","DMX Fitting"); +// } - G4cout << " Started Pulse Time Fit " << G4endl; - int i; - for (i = 0; i < 2 ; ++i) - G4cout << "\n Fit Parameters: " << i << ":\t" - << exponFun->parameterNames()[i] << G4endl; - // first fit to time histogram: - exponFun->setParameter("amp", 3.); - exponFun->setParameter("slope", -0.03); - G4cout << " parameters set " << G4endl; +// G4cout << " Started Pulse Time Fit " << G4endl; +// int i; +// for (i = 0; i < 2 ; ++i) +// G4cout << "\n Fit Parameters: " << i << ":\t" +// << exponFun->parameterNames()[i] << G4endl; +// // first fit to time histogram: +// exponFun->setParameter("amp", 3.); +// exponFun->setParameter("slope", -0.03); +// G4cout << " parameters set " << G4endl; - fitResult = e_fitter->fit(*hPhArrival,*exponFun); +// fitResult = e_fitter->fit(*hPhArrival,*exponFun); - G4cout << " Fit Completed " << G4endl; - G4cout << " chi2/ndf is: " << fitResult->quality() << " / " - << fitResult->ndf() << G4endl; +// G4cout << " Fit Completed " << G4endl; +// G4cout << " chi2/ndf is: " << fitResult->quality() << " / " +// << fitResult->ndf() << G4endl; - // retrieve fitted parameters and errors and print them +// // retrieve fitted parameters and errors and print them - for (i = 0; i < 2 ; ++i) - G4cout << fitResult->fittedParameterNames()[i] << " = " - << fitResult->fittedParameters()[i] << " +/- " - << fitResult->errors()[i]; +// for (i = 0; i < 2 ; ++i) +// G4cout << fitResult->fittedParameterNames()[i] << " = " +// << fitResult->fittedParameters()[i] << " +/- " +// << fitResult->errors()[i]; - // plot function with its annotation and then histogram +// // plot function with its annotation and then histogram - plotter->currentRegion().plot(*exponFun,"[0,100] annotation"); - plotter->currentRegion().plot(*hPhArrival, "overlay"); - plotter->refresh(); - plotter->writeToFile("ExponentialFit.ps","ps"); +// plotter->currentRegion().plot(*exponFun,"[0,100] annotation"); +// plotter->currentRegion().plot(*hPhArrival, "overlay"); +// plotter->refresh(); +// plotter->writeToFile("ExponentialFit.ps","ps"); - for (i = 0; i < 3 ; ++i) - G4cout << "\n Fit Parameters: " << i << ":\t" - << gaussFun->parameterNames()[i] << G4endl; - // first fit to time histogram: - gaussFun->setParameter("mean", 50.); - gaussFun->setParameter("sigma", 10.); - gaussFun->setParameter("amp", 2.); - G4cout << " parameters set " << G4endl; +// for (i = 0; i < 3 ; ++i) +// G4cout << "\n Fit Parameters: " << i << ":\t" +// << gaussFun->parameterNames()[i] << G4endl; +// // first fit to time histogram: +// gaussFun->setParameter("mean", 50.); +// gaussFun->setParameter("sigma", 10.); +// gaussFun->setParameter("amp", 2.); +// G4cout << " parameters set " << G4endl; - fitResult = e_fitter->fit(*hAvPhArrival,*gaussFun); +// fitResult = e_fitter->fit(*hAvPhArrival,*gaussFun); - G4cout << " Fit Completed " << G4endl; - G4cout << " chi2/ndf is: " << fitResult->quality() << " / " - << fitResult->ndf() << G4endl; +// G4cout << " Fit Completed " << G4endl; +// G4cout << " chi2/ndf is: " << fitResult->quality() << " / " +// << fitResult->ndf() << G4endl; - // retrieve fitted parameters and errors and print them +// // retrieve fitted parameters and errors and print them - for (i = 0; i < 3 ; ++i) - G4cout << fitResult->fittedParameterNames()[i] << " = " - << fitResult->fittedParameters()[i] << " +/- " - << fitResult->errors()[i]; +// for (i = 0; i < 3 ; ++i) +// G4cout << fitResult->fittedParameterNames()[i] << " = " +// << fitResult->fittedParameters()[i] << " +/- " +// << fitResult->errors()[i]; - // plot function with its annotation and then histogram +// // plot function with its annotation and then histogram - plotter->createRegions(1,1); - plotter->currentRegion().plot(*gaussFun,"[0,100] annotation"); - plotter->currentRegion().plot(*hAvPhArrival, "overlay"); - plotter->refresh(); - plotter->writeToFile("TimeConstantFit.ps","ps"); +// plotter->createRegions(1,1); +// plotter->currentRegion().plot(*gaussFun,"[0,100] annotation"); +// plotter->currentRegion().plot(*hAvPhArrival, "overlay"); +// plotter->refresh(); +// plotter->writeToFile("TimeConstantFit.ps","ps"); - G4cout << " Fit finished " << G4endl; +// G4cout << " Fit finished " << G4endl; } @@ -338,28 +335,28 @@ void DMXAnalysisManager::analyseScintHits(G4int event_id, G4double energy_pri, G hAvPhArrival->fill(aveTimePmtHits/ns); - AIDA::ITuple * ntuple = dynamic_cast ( tree->find("2") ); + // AIDA::ITuple * ntuple = dynamic_cast ( tree->find("2") ); // Fill the ntuple - ntuple->fill( ntuple->findColumn( "Event" ), (G4float) event_id ); - ntuple->fill( ntuple->findColumn( "e_prim" ), (G4float) energy_pri/keV ); - ntuple->fill( ntuple->findColumn( "tot_e" ), (G4float) totEnergy ); - ntuple->fill( ntuple->findColumn( "s_hits" ), (G4float) S_hits ); - ntuple->fill( ntuple->findColumn( "xe_time" ), (G4float) firstLXeHitTime ); - ntuple->fill( ntuple->findColumn( "num_ph" ), (G4float) P_hits ); - ntuple->fill( ntuple->findColumn( "avphtime"), (G4float) aveTimePmtHits ); - ntuple->fill( ntuple->findColumn( "1stpart" ), (G4float) firstparticleIndex); - ntuple->fill( ntuple->findColumn( "1stparte"), (G4float) firstParticleE ); - ntuple->fill( ntuple->findColumn( "gamma" ), (G4float) gamma_ev ); - ntuple->fill( ntuple->findColumn( "neutron" ), (G4float) neutron_ev ); - ntuple->fill( ntuple->findColumn( "posi" ), (G4float) positron_ev ); - ntuple->fill( ntuple->findColumn( "elec" ), (G4float) electron_ev ); - ntuple->fill( ntuple->findColumn( "other" ), (G4float) other_ev ); - ntuple->fill( ntuple->findColumn( "seed1" ), (G4float) seed1 ); - ntuple->fill( ntuple->findColumn( "seed2" ), (G4float) seed2 ); + ntuple2->fill( ntuple2->findColumn( "Event" ), (G4float) event_id ); + ntuple2->fill( ntuple2->findColumn( "e_prim" ), (G4float) energy_pri/keV ); + ntuple2->fill( ntuple2->findColumn( "tot_e" ), (G4float) totEnergy ); + ntuple2->fill( ntuple2->findColumn( "s_hits" ), (G4float) S_hits ); + ntuple2->fill( ntuple2->findColumn( "xe_time" ), (G4float) firstLXeHitTime ); + ntuple2->fill( ntuple2->findColumn( "num_ph" ), (G4float) P_hits ); + ntuple2->fill( ntuple2->findColumn( "avphtime"), (G4float) aveTimePmtHits ); + ntuple2->fill( ntuple2->findColumn( "1stpart" ), (G4float) firstparticleIndex); + ntuple2->fill( ntuple2->findColumn( "1stparte"), (G4float) firstParticleE ); + ntuple2->fill( ntuple2->findColumn( "gamma" ), (G4float) gamma_ev ); + ntuple2->fill( ntuple2->findColumn( "neutron" ), (G4float) neutron_ev ); + ntuple2->fill( ntuple2->findColumn( "posi" ), (G4float) positron_ev ); + ntuple2->fill( ntuple2->findColumn( "elec" ), (G4float) electron_ev ); + ntuple2->fill( ntuple2->findColumn( "other" ), (G4float) other_ev ); + ntuple2->fill( ntuple2->findColumn( "seed1" ), (G4float) seed1 ); + ntuple2->fill( ntuple2->findColumn( "seed2" ), (G4float) seed2 ); //Values of attributes are prepared; store them to the nTuple: - ntuple->addRow(); + ntuple2->addRow(); } @@ -374,38 +371,31 @@ void DMXAnalysisManager::analysePMTHits(G4int event, G4int i, G4double x, G4doub h1stPMTHit->fill(x,y); } - AIDA::ITuple * ntuple = dynamic_cast ( tree->find("3") ); + //AIDA::ITuple * ntuple = dynamic_cast ( tree->find("3") ); // Fill the secondaries ntuple - ntuple->fill( ntuple->findColumn( "event" ), (G4float) event ); - ntuple->fill( ntuple->findColumn( "hits" ), (G4float) i ); - ntuple->fill( ntuple->findColumn( "xpos" ), (G4float) x ); - ntuple->fill( ntuple->findColumn( "ypos" ), (G4float) y ); - ntuple->fill( ntuple->findColumn( "zpos" ), (G4float) z ); + ntuple3->fill( ntuple3->findColumn( "event" ), (G4float) event ); + ntuple3->fill( ntuple3->findColumn( "hits" ), (G4float) i ); + ntuple3->fill( ntuple3->findColumn( "xpos" ), (G4float) x ); + ntuple3->fill( ntuple3->findColumn( "ypos" ), (G4float) y ); + ntuple3->fill( ntuple3->findColumn( "zpos" ), (G4float) z ); // NEW: Values of attributes are prepared; store them to the nTuple: - ntuple->addRow(); // check for returning true ... + ntuple3->addRow(); // check for returning true ... } - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - void DMXAnalysisManager::analysePrimaryGenerator(G4double energy) { - AIDA::ITuple * ntuple = dynamic_cast ( tree->find("1") ); + // AIDA::ITuple * ntuple1 = dynamic_cast ( tree->find("1") ); // Fill energy ntple: - ntuple->fill( ntuple->findColumn( "energy" ), energy ); + ntuple1->fill( ntuple1->findColumn( "energy" ), energy ); // NEW: Values of attributes are prepared; store them to the nTuple: - ntuple->addRow(); // check for returning true ... + ntuple1->addRow(); // check for returning true ... } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - void DMXAnalysisManager::analyseParticleSource(G4double energy, G4String name) { @@ -436,24 +426,23 @@ void DMXAnalysisManager::HistTime(G4double time) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void DMXAnalysisManager::PlotHistosInter(G4int flag) +void DMXAnalysisManager::PlotHistosInter(G4int) { - // The plotter is updated only if there are some hits in the event - if(!flag) return; - // Set the plotter ; set the number of regions and attach histograms - // to plot for each region. - // It is done here, since then EndOfRun set regions - // for paper output. - if(plotter) { - plotter->currentRegion().plot(*hNumPhLow); - plotter->refresh(); - } + // // The plotter is updated only if there are some hits in the event +// if(!flag) return; +// // Set the plotter ; set the number of regions and attach histograms +// // to plot for each region. +// // It is done here, since then EndOfRun set regions +// // for paper output. +// if(plotter) { +// plotter->currentRegion().plot(*hNumPhLow); +// plotter->refresh(); +// } } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void DMXAnalysisManager::PlotHistos(G4bool interactive) +void DMXAnalysisManager::PlotHistos(G4bool) { - + /* if(!plotter) plotter = pf->create(); plotter->show(); plotter->setParameter("pageTitle","DMX Output Summary"); @@ -492,12 +481,7 @@ void DMXAnalysisManager::PlotHistos(G4bool interactive) G4cout << "Press to exit" << G4endl; G4cin.get(); } - + */ } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - - #endif diff --git a/examples/advanced/underground_physics/src/DMXEventAction.cc b/examples/advanced/underground_physics/src/DMXEventAction.cc index dfa8080d05..2a85a2615b 100644 --- a/examples/advanced/underground_physics/src/DMXEventAction.cc +++ b/examples/advanced/underground_physics/src/DMXEventAction.cc @@ -255,14 +255,14 @@ void DMXEventAction::EndOfEventAction(const G4Event* evt) { << G4BestUnit(aveTimePmtHits,"Time") << G4endl; G4cout << " Number of PMT hits (photoelectron equivalent): " << P_hits << G4endl; -#ifdef G4ANALYSIS_USE + //#ifdef G4ANALYSIS_USE // plot histograms, interactively: - G4bool plotevent=runAct->Getplotevent(); - if(plotevent) { - DMXAnalysisManager* analysis = DMXAnalysisManager::getInstance(); - analysis->PlotHistosInter(P_hits); - } -#endif + //G4bool plotevent=runAct->Getplotevent(); + //if(plotevent) { + // DMXAnalysisManager* analysis = DMXAnalysisManager::getInstance(); + // analysis->PlotHistosInter(P_hits); + //} + //#endif } // write out (x,y,z) of PMT hits if (savePmtFlag) diff --git a/examples/advanced/underground_physics/src/DMXRunAction.cc b/examples/advanced/underground_physics/src/DMXRunAction.cc index 5f3336064e..8e19dcc44b 100644 --- a/examples/advanced/underground_physics/src/DMXRunAction.cc +++ b/examples/advanced/underground_physics/src/DMXRunAction.cc @@ -94,8 +94,6 @@ void DMXRunAction::BeginOfRunAction(const G4Run* aRun) analysis->book(savehistFile, plotevent); // analysis->PlotHistosInit(); #endif - - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -105,8 +103,8 @@ void DMXRunAction::EndOfRunAction(const G4Run*) #ifdef G4ANALYSIS_USE DMXAnalysisManager* analysis = DMXAnalysisManager::getInstance(); - analysis->PlotHistos(interactplot); - analysis->PulseTimeFit(); + //analysis->PlotHistos(interactplot); + //analysis->PulseTimeFit(); analysis->Finish(); #endif diff --git a/examples/advanced/underground_physics/src/DMXSteppingAction.cc b/examples/advanced/underground_physics/src/DMXSteppingAction.cc index 2ca0e6bac6..bb1388ccd5 100644 --- a/examples/advanced/underground_physics/src/DMXSteppingAction.cc +++ b/examples/advanced/underground_physics/src/DMXSteppingAction.cc @@ -172,5 +172,5 @@ void DMXSteppingAction::UserSteppingAction(const G4Step* fStep) } } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/examples/advanced/xray_fluorescence/G4History.macro b/examples/advanced/xray_fluorescence/G4History.macro index 1bad462408..3705d75ba1 100644 --- a/examples/advanced/xray_fluorescence/G4History.macro +++ b/examples/advanced/xray_fluorescence/G4History.macro @@ -1,29 +1,3 @@ /run/verbose 2 /vis/scene/create -/vis/open OGLIX -/vis/sceneHandler/create OGLIX -/vis/sceneHandler/attach -/vis/viewer/create ! ! 600 -/vis/viewer/refresh -/vis/viewer/flush -/vis/viewer/refresh viewer-0 -/vis/viewer/update viewer-0 -/tracking/storeTrajectory 1 -/vis/viewer/set/viewpointThetaPhi 60 30 -/vis/viewer/refresh -/vis/scene/endOfEventAction accumulate /run/beamOn 100 -/vis/scene/notifyHandlers -/vis/viewer/update -/run/beamOn 100 -/vis/scene/notifyHandlers -/vis/viewer/update -/run/beamOn 100 -/vis/scene/notifyHandlers -/vis/viewer/update -/run/beamOn 100 -/vis/scene/notifyHandlers -/vis/viewer/update -/run/beamOn 1000 -/vis/scene/notifyHandlers -/vis/viewer/update diff --git a/examples/advanced/xray_fluorescence/GNUmakefile b/examples/advanced/xray_fluorescence/GNUmakefile index 07245b1071..2f4397e858 100644 --- a/examples/advanced/xray_fluorescence/GNUmakefile +++ b/examples/advanced/xray_fluorescence/GNUmakefile @@ -1,10 +1,15 @@ -# $Id: GNUmakefile,v 1.15 2003/12/04 11:01:47 guatelli Exp $ +# $Id: GNUmakefile,v 1.17 2004/05/29 10:02:08 mantero Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- +# G4LIB_BUILD_SHARED = 1 + +ifndef G4TARGET name := XrayFluo G4TARGET := $(name) +endif + G4EXLIB := true G4ANALYSIS_USE = 1 @@ -13,23 +18,26 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif -include $(G4INSTALL)/config/architecture.gmk - .PHONY: all visclean -all: lib bin - +all: bin #lib +include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/binmake.gmk -# Copy the XrayFluoAnalysisManage files according to which version -# is selected. +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +# LOADLIBS += `aida-config --lib` +endif + + # As the dependency is checked before "all" is reached, we need # to do some tricks here ... -ifdef G4ANALYSIS_USE - CPPFLAGS += `aida-config --include` - LDFLAGS += `aida-config --lib` - LOADLIBS += `aida-config --lib` -endif +# to make simulation working uncomment the line below +#CPPFLAGS += -I${LHCXX_REL_DIR}/include -I/afs/cern.ch/sw/contrib/AIDA/2.2/cpp +#LOADLIBS += -L/users/mantero/lib -L/users/mantero/lib/gcc-lib/2.96 -L/users/mantero/lib/gcc-lib/i686-pc-linux-gnu/2.95.2 +LOADLIBS += -L/users/mantero/lib -lf2c -L/usr/local/lib/ -lg2c +#LOADLIBS += -L/users/mantero/lib/gcc-lib/i686-pc-linux-gnu/2.95.2 -lg2c visclean: rm -f g4*.prim g4*.eps g4*.wrl diff --git a/examples/advanced/xray_fluorescence/README b/examples/advanced/xray_fluorescence/README index e9d8693cc5..23cf8167b5 100644 --- a/examples/advanced/xray_fluorescence/README +++ b/examples/advanced/xray_fluorescence/README @@ -1,4 +1,4 @@ -$Id: README,v 1.9 2003/12/04 11:01:58 guatelli Exp $ +$Id: README,v 1.11 2004/05/29 10:02:08 mantero Exp $ ------------------------------------------------------------------- ========================================================= @@ -23,6 +23,14 @@ with different shapes of the primary generator. Apart from the sample and the detector there are two diaphragm reproducing those used to collimate the incident beam during the test beam. +Other two geometries are present for the user: an infinte-plane geometry and +a planetary one, with the status of "beta release". The user must select, +at the moment of the execution, which geometry wants to use. +If the program is executed in batch mode, it is possible to specify +geometry from command line. Example: +/path/XrayFluo macro.mac 1 (for test beam Geometry) +/path/XrayFluo macro.mac 2 (for infinite plane Geometry) + The aim of this advanced example is to illustrate the use of particle generation and analysis schemes available in Geant4: @@ -30,7 +38,7 @@ generation and analysis schemes available in Geant4: shows how to use it in order to obtain a beam of circular section or a particle source isotropic in space -_ the example includes the possibility to shoot particles according to a +- the example includes the possibility to shoot particles according to a given energy spectrum: the files B_flare.dat, C_Flare.dat and M_flare.dat store the spectra of photons during solar flares, the files mercury2_flx_solmax.dat and mercury_flx_solmin.dat contain the spectra of @@ -47,31 +55,44 @@ _ the example includes the possibility to shoot particles according to a In order to be able to use any of these packages, prior installation is necessary and a number of environment variables will have to be set. -------------------------------------------------------------------------- -----> 2.SET-UP - | - -example enviroment with the compiler 3.2 - -a standard Geant4 example GNUmakefile is provided | -setup with: | -compiler = gcc-3.2 -G4SYSTEM = linux-g++ | +#set up VRMLview +setenv G4VRMLFILE_MAX_FILE_NUM 100 +setenv G4VRMLFILE_VIEWER vrmlview #if installed +setenv PATH ${PATH}:"/afs/cern.ch/sw/contrib/VRML/bin/Linux" -The following environment variables need to be set: | +#set up OpenGL or Mesa +setenv G4VIS_BUILD_OPENGLX_DRIVER 1 +setenv G4VIS_USE_OPENGLX 1 +setenv OGLHOME /afs/cern.ch/sw/geant4/dev/Mesa/Linux-g++ -G4LEDATA: points to low energy data base - G4EMLOW2.2 | +#set up DAWN +setenv G4VIS_BUILD_DAWN_DRIVER 1 +setenv G4VIS_USE_DAWN 1 +setenv PATH ${PATH}:"/afs/cern.ch/sw/geant4/dev/DAWN/Linux-g++" -setup for analysis with AIDA 3.0/Anaphe 5.0.5 for user with account | -on lxplus: - | -setenv G4ANALYSIS_USE 1 -source /afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/setupAnaphe.csh -setenv PATH ${PATH}:/afs/cern.ch/sw/lhcxx/share/LHCXX/5.0.5/scripts/ | +# flag that we want to use analysis: +setenv G4ANALYSIS_USE 1 - Please take a look to the Anaphe/Lizard web page | - http://anaphe.web.cern.ch/anaphe - for more info -------------------------------------------------------------------------- +#select AIDA implementation: PI 1.2.1 (for cern AFS) + +setenv G4ANALYSIS_BUILD 1 +setenv PI_VERSION 1_2_1 + +setenv PATH ${PATH}:"/afs/cern.ch/sw/geant4/dev/PI/Linux-g++/bin" + +eval `aida-config -r csh` + + +#path to the lowEnergy data base + +setenv G4LEDATA /afs/cern.ch/sw/geant4/dev/data/G4EMLOW2.3 + +#path to Xray_Fluorescence data files, if not set, PWD is assumed: + +setenv XRAYDATA /afs/cern.ch/user/u/username + +1. Run To execute a sample simulation with visualisation of tracks reaching the detector run: @@ -112,15 +133,32 @@ XrayFluoParticleGeneratorAction.cc 6. Analysis -At present the analisys is provided by any AIDA-3.0 compliant analysis system. -In the example the Anaphe toolkit (version 5.0.5) is used. +At present the analisys is provided by any AIDA-3.2.1 compliant analysis system. +In the example the Anaphe toolkit is used. -By setting visPlotter variable in XrayFluoAnalysisManager to true, +AIDA / Anaphe configuration for compilation and link are in GNUmakefile, once +is set the environmente as above: + +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +endif + +To build and execute the example on platforms where there is no +implementation of the analysis system, the environment variables +must not be set. + +It is possible to visualize the outpu of the simulation. In order to do this +is necessary to uncomment all lines in XrayFluoAnalysisManager.cc / .hh regarding plotting; +and the same must be done for plotting refernces in XrayFluoRunManager.cc and XrayFluoEventAction.cc. +And link against other AIDA compliant analysis sistems, such as Anaphe or JAS. + +Finally, by setting visPlotter variable in XrayFluoAnalysisManager to true, it is possible to display the simulated output of the detector while -simulation is in progress. Graph window is updated every 1000 events. +simulation is in progress. Graph window is updated every 100000 events. The example provides also a simple Python file used to display -histograms with Lizard 3.0.0.x +histograms with Lizard 3.0.0.x (from Anaphe) Various commads, with help, are available for Geant4 UI. /analysis/outputFile and /analysis/fileType respectively for @@ -132,5 +170,3 @@ command, /anaysis/update, must be executed. NOTE: if a file named xrayfluo.hbk (default name) is present, it will be deleted, even if /analysis/outputFile command is issued before any run. - ----- Last modified Susanna Guatelli 3/12/2003======= \ No newline at end of file diff --git a/examples/advanced/xray_fluorescence/XrayFluo.cc b/examples/advanced/xray_fluorescence/XrayFluo.cc index ae7a763bc8..184e090c44 100644 --- a/examples/advanced/xray_fluorescence/XrayFluo.cc +++ b/examples/advanced/xray_fluorescence/XrayFluo.cc @@ -31,109 +31,20 @@ // 28 Nov 2001 Elena Guardincerri Created // // ------------------------------------------------------------------- -#include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4UIterminal.hh" -#include "G4UItcsh.hh" -#ifdef G4UI_USE_XM -#include "G4UIXm.hh" -#endif -#include "Randomize.hh" -#ifdef G4VIS_USE -#include "XrayFluoVisManager.hh" -#endif -#include "XrayFluoDetectorConstruction.hh" -#include "XrayFluoPhysicsList.hh" -#include "XrayFluoPrimaryGeneratorAction.hh" -#include "XrayFluoRunAction.hh" -#include "XrayFluoEventAction.hh" -#include "XrayFluoSteppingAction.hh" -#include "XrayFluoSteppingVerbose.hh" -int main(int argc,char** argv) { - // choose the Random engine - HepRandom::setTheEngine(new RanecuEngine); +#include "XrayFluoSimulation.hh" +; +int main(int argc, char* argv[]){ - //XrayFluo Verbose output class - G4VSteppingVerbose::SetInstance(new XrayFluoSteppingVerbose); - - // Construct the default run manager - G4RunManager * runManager = new G4RunManager; + XrayFluoSimulation * simulation = new XrayFluoSimulation(0); - // set mandatory initialization classes - XrayFluoDetectorConstruction* detector = new XrayFluoDetectorConstruction; - runManager->SetUserInitialization(detector); - XrayFluoPhysicsList* list = new XrayFluoPhysicsList(detector); - runManager->SetUserInitialization(list); - - G4UIsession* session=0; - - if (argc==1) // Define UI session for interactive mode. - { - // G4UIterminal is a (dumb) terminal. -#ifdef G4UI_USE_XM - session = new G4UIXm(argc,argv); -#else -#ifdef G4UI_USE_TCSH - session = new G4UIterminal(new G4UItcsh); -#else - session = new G4UIterminal(); -#endif -#endif - } - -#ifdef G4VIS_USE - //visualization manager - G4VisManager* visManager = new XrayFluoVisManager; - visManager->Initialize(); -#endif - - XrayFluoEventAction* eventAction = new XrayFluoEventAction(); - XrayFluoRunAction* runAction = new XrayFluoRunAction(); - XrayFluoSteppingAction* stepAction = new XrayFluoSteppingAction(); + simulation->RunSimulation(argc,argv); - runManager->SetUserAction(new XrayFluoPrimaryGeneratorAction(detector)); - - runManager->SetUserAction(eventAction); - runManager->SetUserAction(runAction); - runManager->SetUserAction(stepAction); - - //Initialize G4 kernel - runManager->Initialize(); - - // get the pointer to the User Interface manager - G4UImanager* UI = G4UImanager::GetUIpointer(); - - if (session) // Define UI session for interactive mode. - { - // G4UIterminal is a (dumb) terminal. - UI->ApplyCommand("/control/execute initInter.mac"); -#ifdef G4UI_USE_XM - // Customize the G4UIXm menubar with a macro file : - UI->ApplyCommand("/control/execute gui.mac"); -#endif - session->SessionStart(); - delete session; - } - else // Batch mode - { - G4String command = "/control/execute "; - G4String fileName = argv[1]; - UI->ApplyCommand(command+fileName); - } - - // job termination - -#ifdef G4VIS_USE - delete visManager; -#endif - - delete runManager; - return 0; + delete simulation; + + return 0; } - - diff --git a/examples/advanced/xray_fluorescence/anaphe.gmk b/examples/advanced/xray_fluorescence/anaphe.gmk new file mode 100644 index 0000000000..73c3da74a9 --- /dev/null +++ b/examples/advanced/xray_fluorescence/anaphe.gmk @@ -0,0 +1,17 @@ + +# Some pieces to include if Anaphe is selected as analysis environment +# be aware that this will be obsolete as soon as Anaphe is implementing +# the AIDA 2.2 interfaces. + +CPPFLAGS += -I$(LHCXX_REL_DIR)/include +LDFLAGS += -L$(LHCXX_REL_DIR)/lib +#LOADLIBS += -L$(LHCXX_REL_DIR)/lib +# general stuff: +LOADLIBS += -lHepUtilities -lAIDA_Annotation +# add for Histograms: +LOADLIBS += -lAIDA_HBook +# add for Ntuples: +LOADLIBS += -lAIDA_Ntuple -lNtupleTag -lNtupleTag_HBook +# ... and finally system stuff and to deal with the "Fortran legacy": +LOADLIBS += -lCHBook -ldl -lg2c + diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisManager.hh b/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisManager.hh index 5f56a8b624..05d36a2d1c 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisManager.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisManager.hh @@ -22,45 +22,34 @@ // // // $Id: XrayFluoAnalysisManager.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- +// 11 Jul 2003 A.Mantero, code cleaning / Plotter-XML addiction +// Sep 2002 A.Mantero, AIDA3.0 Migration +// 06 Dec 2001 A.Pfeiffer updated for singleton // 30 Nov 2001 Guy Barrand : migrate to AIDA-2.2. // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 mgration to AIDA 3.0 (Alfonso.mantero@ge.infn.it) // // ------------------------------------------------------------------- #ifndef G4PROCESSTESTANALYSIS_HH #define G4PROCESSTESTANALYSIS_HH -//#ifndef XrayFluoAnalysisManager_h -//#define XrayFluoAnalysisManager_h 1 - #include "globals.hh" #include #include "G4ThreeVector.hh" #include "XrayFluoDataSet.hh" -#include "AIDA/IHistogram1D.h" -#include "AIDA/IHistogram2D.h" +#include "AIDA/AIDA.h" // Headers for AIDA interfaces #include "XrayFluoAnalysisMessenger.hh" class G4Step; -//class XrayFluoEventAction; - -namespace AIDA { -class IAnalysisFactory; -class IHistogramFactory; -class ITree; -class ITupleFactory; -class ITuple; -}; +class XrayFluoAnalysisMessenger; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - class XrayFluoAnalysisManager { public: @@ -83,18 +72,40 @@ public: //method to call to create an instance of this class static XrayFluoAnalysisManager* getInstance(); - //method intended to chenge the name of the hbook output file + //method to create hbook or xml file for persistency + + void CreatePersistency(G4String fileName,G4String persistencyType, + G4bool readOnly = false, G4bool createNew = true); + + inline void CreatePersistency() {CreatePersistency(outputFileName,persistencyType);} + + //method to chenge the name of the output file void SetOutputFileName(G4String); + //method to chenge the type of the output file + void SetOutputFileType(G4String); + // method used by the messenger + G4bool GetDeletePersistencyFileFlag(); + + // methods used by RunManager and EvenManager to visualize partial results + // void InitializePlotter(); + + // void PlotCurrentResults(); + private: //private constructor in order to create a singleton - - XrayFluoAnalysisManager(); - + G4String outputFileName; + // G4bool visPlotter; + + G4String persistencyType; + + G4bool deletePersistencyFile; + + //Instance for singleton implementation this is the returned static XrayFluoAnalysisManager* instance; //pointer to the analysis messenger @@ -102,13 +113,13 @@ private: //XrayFluoEventAction* pEvent; + // analysis data members + AIDA::IAnalysisFactory* analysisFactory; AIDA::ITree* tree; - - AIDA::IHistogramFactory *histogramFactory; - // ITupleFactory* tupleFactory; - - // ITuple* tuple; + AIDA::IHistogramFactory* histogramFactory; + // AIDA::IPlotterFactory* plotterFactory; + // AIDA::IPlotter* plotter; AIDA::IHistogram1D* histo_1; AIDA::IHistogram1D* histo_2; @@ -119,9 +130,9 @@ private: AIDA::IHistogram1D* histo_7; AIDA::IHistogram1D* histo_8; AIDA::IHistogram1D* histo_9; - AIDA::IHistogram1D* histo_10; - AIDA::IHistogram1D* histo_12; - AIDA::IHistogram1D* histo_11; + //AIDA::IHistogram1D* histo_10; // + //AIDA::IHistogram1D* histo_12; // Created for debuggig purpose + //AIDA::IHistogram1D* histo_11; // }; #endif diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisMessenger.hh b/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisMessenger.hh index 391d3b26e1..9b8bd05b34 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisMessenger.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoAnalysisMessenger.hh @@ -22,10 +22,9 @@ // // // $Id: XrayFluoAnalysisMessenger.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) -// 29 Nov 2002 minor updates (Alfonso.mantero@ge.infn.it) // // History: // ----------- @@ -44,21 +43,22 @@ #include "globals.hh" #include "G4UImessenger.hh" - - +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithoutParameter.hh" +#include "XrayFluoAnalysisManager.hh" +#include "G4UIdirectory.hh" class XrayFluoAnalysisManager; -class G4UIdirectory; -class G4UIcmdWithAString; +//class G4UIdirectory; +//class G4UIcmdWithAString; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -class G4UIcmdWithAString; class XrayFluoAnalysisMessenger: public G4UImessenger { public: - XrayFluoAnalysisMessenger(XrayFluoAnalysisManager* ); + XrayFluoAnalysisMessenger(XrayFluoAnalysisManager*); ~XrayFluoAnalysisMessenger(); void SetNewValue(G4UIcommand*, G4String); @@ -68,8 +68,9 @@ private: //pointer to XrayFluoAnalysisManager XrayFluoAnalysisManager* xrayFluoAnalysis; G4UIdirectory* XrayFluoAnalysisDir; - G4UIcmdWithAString* ouputFileCommand; - + G4UIcmdWithAString* outputFileCommand; + G4UIcmdWithAString* outputFileType; + G4UIcmdWithoutParameter* persistencyUpdateCommand; }; #endif #endif diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoDataSet.hh b/examples/advanced/xray_fluorescence/include/XrayFluoDataSet.hh index 64062dba5c..3b03a2a97f 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoDataSet.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoDataSet.hh @@ -22,7 +22,7 @@ // // // $Id: XrayFluoDataSet.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -62,19 +62,19 @@ public: //find the value corresponding to the energy e in the set //identified by id - G4double FindValue(G4double e, G4int id = 0) const; + G4double FindValue(G4double e, G4int) const; - virtual const G4VEMDataSet* GetComponent(G4int i) const { i = i ; return 0;} + virtual const G4VEMDataSet* GetComponent(G4int) const { return 0;} - virtual void AddComponent(G4VEMDataSet* dataSet) { G4VEMDataSet* dummy; dummy = dataSet;} + virtual void AddComponent(G4VEMDataSet*) { } virtual size_t NumberOfComponents() const { return 0; } void PrintData() const; - const G4DataVector& GetEnergies(G4int i) const { i = i; return *energies; } - const G4DataVector& GetData(G4int i) const { i = i; return *data; } + const G4DataVector& GetEnergies(G4int) const { return *energies; } + const G4DataVector& GetData(G4int) const { return *data; } private: diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoDetectorConstruction.hh b/examples/advanced/xray_fluorescence/include/XrayFluoDetectorConstruction.hh index a952d189d1..e68ab1ccab 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoDetectorConstruction.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoDetectorConstruction.hh @@ -22,29 +22,42 @@ // // // $Id: XrayFluoDetectorConstruction.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created +// Nov 2002 Alfonso Mantero materials added, Material selection implementation +// 16 Jul 2003 Alfonso Mantero Detector type selection added + minor fixes +// 21 Aug 2003 Alfonso Mantero Material Management moved to XrayFluoMaterials // // ------------------------------------------------------------------- -#ifndef XrayFluoDetectorConstruction_h -#define XrayFluoDetectorConstruction_h 1 +#ifndef XrayFluoDetectorConstruction_hh +#define XrayFluoDetectorConstruction_hh 1 +#include "XrayFluoSiLiDetectorType.hh" +#include "XrayFluoHPGeDetectorType.hh" +#include "XrayFluoSD.hh" #include "G4VUserDetectorConstruction.hh" #include "globals.hh" #include "G4RotationMatrix.hh" + +#include "XrayFluoGeometry.hh" + class G4Box; class G4Tubs; +class G4Sphere; class G4LogicalVolume; class G4VPhysicalVolume; class G4Material; class XrayFluoDetectorMessenger; -class XrayFluoHPGeSD; +class XrayFluoMaterials; + +//class XrayFluoSD; +//class XrayFluoVDetectorType; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -52,7 +65,7 @@ class XrayFluoDetectorConstruction : public G4VUserDetectorConstruction { public: - XrayFluoDetectorConstruction(); + ~XrayFluoDetectorConstruction(); public: @@ -61,12 +74,28 @@ public: void UpdateGeometry(); + void SetSampleMaterial(G4String newMaterial); + + void SetDetectorType(G4String type); + + static XrayFluoDetectorConstruction* GetInstance(); + + inline void SetSampleGranularity(G4bool granularity) + {sampleGranularity = granularity;}; + + inline void SetGrainDia(G4double size) + {grainDia = size;}; + + void DeleteGrainObjects(); public: void PrintApparateParameters(); - + + XrayFluoVDetectorType* GetDetectorType(); + + G4double GetWorldSizeZ() {return WorldSizeZ;}; G4double GetWorldSizeXY() {return WorldSizeXY;}; @@ -96,9 +125,16 @@ public: const G4VPhysicalVolume* GetOhmicPos() {return physiOhmicPos;}; const G4VPhysicalVolume* GetOhmicNeg() {return physiOhmicNeg;}; - private: + XrayFluoDetectorConstruction(); + + static XrayFluoDetectorConstruction* instance; + + XrayFluoVDetectorType* detectorType; + + G4bool sampleGranularity; + G4double DeviceSizeX; G4double DeviceSizeY; G4double DeviceThickness; @@ -135,7 +171,13 @@ private: G4LogicalVolume* logicPixel; G4VPhysicalVolume* physiPixel; - //pointers to the materials used + G4Sphere* solidGrain; + G4LogicalVolume* logicGrain; + G4VPhysicalVolume* physiGrain; + + //materials management + XrayFluoMaterials* materials; + G4Material* OhmicPosMaterial; G4Material* OhmicNegMaterial; G4Material* pixelMaterial; @@ -143,29 +185,15 @@ private: G4Material* Dia1Material; G4Material* Dia3Material; G4Material* defaultMaterial; - - G4Material* dolorite; - G4Material* FeMaterial; - G4Material* Al; - G4Material* Si; - G4Material* Cu; - G4Material* matOx; - G4Material* HPGe; - G4Material* materialMg; - G4Material* materialNd; - G4Material* Sn; - G4Material* Ti; - G4Material* U; - - - + //apparate parameters G4double OhmicPosThickness; G4double OhmicNegThickness; G4int PixelCopyNb; + G4int grainCopyNb; G4int NbOfPixels; G4int NbOfPixelRows; G4int NbOfPixelColumns; @@ -185,6 +213,7 @@ private: G4double SampleThickness; G4double SampleSizeXY; + G4double grainDia; G4double SiSizeXY; G4double Dia1Thickness; G4double Dia1SizeXY; @@ -192,7 +221,7 @@ private: G4double Dia3SizeXY; G4double DiaInnerSize; G4double Dia3InnerSize; - G4double DistSi; + // G4double DistSi; public: @@ -232,11 +261,14 @@ private: XrayFluoDetectorMessenger* detectorMessenger; //pointer to the Messenger - XrayFluoHPGeSD* HPGeSD; //pointer to the sensitive detector + XrayFluoSD* HPGeSD; //pointer to the sensitive detector + + G4Region* sampleRegion; + private: - void DefineMaterials(); + void DefineDefaultMaterials(); G4VPhysicalVolume* ConstructApparate(); //calculates some quantities used to construct geometry @@ -251,9 +283,15 @@ inline void XrayFluoDetectorConstruction::ComputeApparateParameters() // Compute derived parameters of the apparate DeviceThickness = PixelThickness+OhmicNegThickness+OhmicPosThickness; - DeviceSizeY =NbOfPixelRows*std::max(ContactSizeXY,PixelSizeXY); - DeviceSizeX =NbOfPixelColumns*std::max(ContactSizeXY,PixelSizeXY); - + + G4cout << "DeviceThickness(cm): "<< DeviceThickness/cm << G4endl; + + DeviceSizeY =(NbOfPixelRows * std::max(ContactSizeXY,PixelSizeXY)); + DeviceSizeX =(NbOfPixelColumns * std::max(ContactSizeXY,PixelSizeXY)); + + G4cout << "DeviceSizeX(cm): "<< DeviceSizeX/cm < > energyMap; + + //std::map > energyMap; //stores the values (second column of the file) of the //response function -std::map > dataMap; + //std::map > dataMap; //read the data for protons and alpha spectra void ReadData(G4double,G4String); //read the data for the response function if the detector - void ReadResponse(const G4String& fileName); + //void ReadResponse(const G4String& fileName); diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoSensorHit.hh b/examples/advanced/xray_fluorescence/include/XrayFluoSensorHit.hh index 6a539eb45c..b826846276 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoSensorHit.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoSensorHit.hh @@ -22,7 +22,7 @@ // // // $Id: XrayFluoSensorHit.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -55,10 +55,10 @@ public: int operator==(const XrayFluoSensorHit&) const; inline void* operator new(size_t); inline void operator delete(void*); - void AddEnergy(G4double de) {EdepTot += de;}; + inline void AddEnergy(G4double de) {EdepTot += de;}; void Draw(); void Print(); - G4double GetEdepTot() { return EdepTot;}; + inline G4double GetEdepTot() { return EdepTot;}; private: diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoSteppingAction.hh b/examples/advanced/xray_fluorescence/include/XrayFluoSteppingAction.hh index 05dfef645d..507eea3b19 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoSteppingAction.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoSteppingAction.hh @@ -22,7 +22,7 @@ // // // $Id: XrayFluoSteppingAction.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -36,8 +36,8 @@ #define XrayFluoSteppingAction_h 1 #include "globals.hh" #include "G4UserSteppingAction.hh" - -class XrayFluoDetectorConstruction; +#include "XrayFluoMercuryDetectorConstruction.hh" +//class XrayFluoMercuryDetectorConstruction; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -46,11 +46,14 @@ class XrayFluoSteppingAction : public G4UserSteppingAction public: XrayFluoSteppingAction(); - ~XrayFluoSteppingAction(); + ~XrayFluoSteppingAction(); + + void UserSteppingAction(const G4Step*); + void SetMercuryFlag(G4bool val) {mercuryFlag=val;}; - void UserSteppingAction(const G4Step*); private: - + + G4bool mercuryFlag; }; diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoSteppingVerbose.hh b/examples/advanced/xray_fluorescence/include/XrayFluoSteppingVerbose.hh index 5ef4de87bc..23ca2ece74 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoSteppingVerbose.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoSteppingVerbose.hh @@ -22,7 +22,7 @@ // // // $Id: XrayFluoSteppingVerbose.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // diff --git a/examples/advanced/xray_fluorescence/include/XrayFluoVisManager.hh b/examples/advanced/xray_fluorescence/include/XrayFluoVisManager.hh index b83ffcafe2..60688fdce8 100644 --- a/examples/advanced/xray_fluorescence/include/XrayFluoVisManager.hh +++ b/examples/advanced/xray_fluorescence/include/XrayFluoVisManager.hh @@ -22,7 +22,7 @@ // // // $Id: XrayFluoVisManager.hh -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // diff --git a/examples/advanced/xray_fluorescence/initInter.mac b/examples/advanced/xray_fluorescence/initInter.mac index 72852516db..a34833c16f 100644 --- a/examples/advanced/xray_fluorescence/initInter.mac +++ b/examples/advanced/xray_fluorescence/initInter.mac @@ -1,5 +1,5 @@ # -# Macro file for the initialization phase of XRay_Fluorescence +# Macro file for the initialization phase of "exampleN03.cc" # when runing in interactive mode # # Sets some default verbose @@ -16,24 +16,25 @@ # (Edit the next line(s) to choose another graphic system) # -/vis/open OGLIX -/vis/viewer/flush +# /vis/open OPACS # # draw scene # -#/vis/drawVolume -#/vis/viewer/update # + +#/vis/viewer/flush + + # for drawing the tracks # (if too many tracks cause core dump => storeTrajectory 0) -/tracking/storeTrajectory 1 -/vis/viewer/set/viewpointThetaPhi 60 30 +#/tracking/storeTrajectory 1 +#/vis/viewer/set/viewpointThetaPhi 60 30 # this is not to redraw every single event -/vis/scene/endOfEventAction accumulate +#/vis/scene/endOfEventAction accumulate diff --git a/examples/advanced/xray_fluorescence/macro.mac b/examples/advanced/xray_fluorescence/macro.mac index 7671f1d066..ed339e5c99 100644 --- a/examples/advanced/xray_fluorescence/macro.mac +++ b/examples/advanced/xray_fluorescence/macro.mac @@ -1,9 +1,12 @@ -/control/verbose 1 + +/lowenergy/lowlimGE 250 eV + +/lowenergy/cutEnergy 250 eV + /gun/randomVert on /gun/particle gamma /gun/energy 6 keV -/run/beamOn 30 - +/run/beamOn 10 diff --git a/examples/advanced/xray_fluorescence/macro1.mac b/examples/advanced/xray_fluorescence/macro1.mac index 3b7ef9869d..b6c61a2d85 100644 --- a/examples/advanced/xray_fluorescence/macro1.mac +++ b/examples/advanced/xray_fluorescence/macro1.mac @@ -1,6 +1,12 @@ + + +/lowenergy/lowlimGE 250 eV + +/lowenergy/cutEnergy 250 eV + # B-flare spectrum /gun/spectrum on /gun/particle gamma -/run/beamOn 10 +/run/beamOn 100 diff --git a/examples/advanced/xray_fluorescence/macro2.mac b/examples/advanced/xray_fluorescence/macro2.mac index 738a3de71e..9708e280fe 100644 --- a/examples/advanced/xray_fluorescence/macro2.mac +++ b/examples/advanced/xray_fluorescence/macro2.mac @@ -1,3 +1,7 @@ +/lowenergy/lowlimGE 250 eV + +/lowenergy/cutEnergy 250 eV + #isotropic source /gun/isoVert on @@ -8,5 +12,5 @@ /gun/particle proton -/run/beamOn 10 +/run/beamOn 100 diff --git a/examples/advanced/xray_fluorescence/macroTest.mac b/examples/advanced/xray_fluorescence/macroTest.mac new file mode 100644 index 0000000000..3759ba3fd5 --- /dev/null +++ b/examples/advanced/xray_fluorescence/macroTest.mac @@ -0,0 +1,9 @@ +/run/beamOn 100 + +/apparate/detector hpge +/analysis/fileType hbk +/analysis/outputFile testhbk +/analysis/update + +/run/beamOn 100 + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisManager.cc b/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisManager.cc index 182f4c1843..8ab5c74b31 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisManager.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisManager.cc @@ -22,35 +22,25 @@ // // // $Id: XrayFluoAnalysisManager.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- +// 11 Jul 2003 A.Mantero, code cleaning / Plotter-XML addiction +// Sep 2002 A.Mantero, AIDA3.0 Migration // 06 Dec 2001 A.Pfeiffer updated for singleton // 30 Nov 2001 Guy Barrand : migrate to AIDA-2.2. // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 Muigration to AIDA 3.0 (Alfonso.mantero@ge.infn.it) - +// // ------------------------------------------------------------------- #include #include "G4VProcess.hh" #include +#include #include "G4ios.hh" -#include "AIDA/IManagedObject.h" -#include "AIDA/IAnalysisFactory.h" -#include "AIDA/ITreeFactory.h" -#include "AIDA/ITree.h" -#include "AIDA/IHistogramFactory.h" -#include "AIDA/IHistogram1D.h" -#include "AIDA/IHistogram2D.h" -#include "AIDA/ITupleFactory.h" -#include "AIDA/ITuple.h" - #include "XrayFluoAnalysisManager.hh" - - #include "G4Step.hh" XrayFluoAnalysisManager* XrayFluoAnalysisManager::instance = 0; @@ -58,48 +48,30 @@ XrayFluoAnalysisManager* XrayFluoAnalysisManager::instance = 0; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoAnalysisManager::XrayFluoAnalysisManager() - :outputFileName("xrayfluo.hbk"),analysisFactory(0), tree(0),histogramFactory(0) + :outputFileName("xrayfluo"), /*visPlotter(false),*/ persistencyType("xml"), + deletePersistencyFile(true), analysisFactory(0), tree(0),histogramFactory(0)//, plotter(0) { - // pEvent=new XrayFluoEventAction(); - + //creating the messenger analisysMessenger = new XrayFluoAnalysisMessenger(this); // Hooking an AIDA compliant analysis system. + // creating Analysis factroy, necessary to create/manage analysis analysisFactory = AIDA_createAnalysisFactory(); - if(analysisFactory) { - AIDA::ITreeFactory* treeFactory = analysisFactory->createTreeFactory(); - if(treeFactory) { - // tree = treeFactory->create(); // Tree in memory. - //porebbe essere qua il memory leak// + // creating persistency - tree = treeFactory->create(outputFileName,"hbook",false,true); + CreatePersistency(outputFileName,persistencyType); - delete treeFactory; // Will not delete the ITree. - histogramFactory = analysisFactory->createHistogramFactory(*tree); - // tupleFactory = analysisFactory->createTupleFactory(*tree); - } +// if(analysisFactory) { + + + +// // Creating the plotter factory +// plotterFactory = analysisFactory->createPlotterFactory(); +// } - /* - // Create and a the plotter : - IPlotterFactory* plotterFactory = - analysisFactory->createPlotterFactory(argc,argv); - if(plotterFactory) { - plotter = plotterFactory->create(); - if(plotter) { - // Map the plotter on screen : - plotter->show(); - // Set the page title : - plotter->setParameter("pageTitle","XrayFluo"); - // Have two plotting regions (one column, two rows). - } - delete plotterFactory; - } - */ - } G4cout << "XrayFluoAnalysisManager created" << G4endl; - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -112,8 +84,10 @@ XrayFluoAnalysisManager::~XrayFluoAnalysisManager() delete analysisFactory; analysisFactory = 0; - // delete tupleFactory; - // tupleFactory=0; + // delete plotterFactory; + // plotterFactory=0; + + delete tree; delete instance; @@ -132,11 +106,39 @@ XrayFluoAnalysisManager* XrayFluoAnalysisManager::getInstance() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void XrayFluoAnalysisManager::CreatePersistency(G4String fileName,G4String persistencyType, + G4bool readOnly, G4bool createNew) +{ + + if (tree) delete tree; + if (histogramFactory) delete histogramFactory; + + AIDA::ITreeFactory* treeFactory = analysisFactory->createTreeFactory(); + if(treeFactory) { + if (persistencyType == "hbook") { + fileName = fileName + ".hbk"; + } + else if (persistencyType == "xml"){ + fileName = fileName + ".xml"; + } + tree = treeFactory->create(fileName,persistencyType,readOnly,createNew); // output file + + delete treeFactory; // Will not delete the ITree. + } + if(analysisFactory) { + + + histogramFactory = analysisFactory->createHistogramFactory(*tree); + + } +} + + void XrayFluoAnalysisManager::book() { // Book histograms - histo_1 = histogramFactory->createHistogram1D("1","Energy Deposit", 100000,0.,10.); //1eV def. + histo_1 = histogramFactory->createHistogram1D("1","Energy Deposit", 500,0.,10.); //20eV def. histo_2 = histogramFactory->createHistogram1D("2","Gamma born in the sample", 100,0.,10.); histo_3 = histogramFactory->createHistogram1D("3","Electrons born in the sample", 100,0.,10.); histo_4 = histogramFactory->createHistogram1D("4","Gammas leaving the sample", 300,0.,10.); @@ -145,15 +147,16 @@ void XrayFluoAnalysisManager::book() histo_7 = histogramFactory->createHistogram1D("7","Spectrum of the incident particles", 100,0.,10.); histo_8 = histogramFactory->createHistogram1D("8","Protons reaching the detector", 100,0.,10.); histo_9 = histogramFactory->createHistogram1D("9","Protons leaving the sample", 100,0.,10.); - histo_10 = histogramFactory->createHistogram1D("10","Photon Origin", 4,0.,3.); - histo_11 = histogramFactory->createHistogram1D("11","Spectrum from LowEnPhotoELectric", 300,0.,10.); - histo_12 = histogramFactory->createHistogram1D("12","Spectrum From the other processes (unknown)", 300,0.,10.); + + // Debugging-purpose Histos + + //histo_10 = histogramFactory->createHistogram1D("10","Photon Origin", 4,0.,3.); + //histo_11 = histogramFactory->createHistogram1D("11","Spectrum from LowEnPhotoELectric", 300,0.,10.); + //histo_12 = histogramFactory->createHistogram1D("12","Spectrum From the other processes (unknown)", 300,0.,10.); // IHistogram2D* histo_20 = histogramFactory-> //create2D("20","Phi, Theta",80 ,-3.14,3.14,80,0.,3.14); - // Create a tuple : - // tuple = tupleFactory->create("XrayFluo","XrayFluo","energy counts"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -161,31 +164,65 @@ void XrayFluoAnalysisManager::book() void XrayFluoAnalysisManager::finish() { +// if(plotter) { +// // Wait for the keyboard return to avoid destroying the plotter window too quickly. +// G4cout << "Press to exit" << G4endl; +// G4cin.get(); +// plotter->hide(); //hide plotter windows, but doesn't delete plotter +// } + if(tree) { - tree->commit(); // Write histos and tuple in file. + tree->commit(); // Write histos in file. tree->close(); } + deletePersistencyFile = false; + } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +// void XrayFluoAnalysisManager::InitializePlotter() +// { + +// // If speciefied (visPlotter=true), +// // a window for the visulizaton of partial results is created +// if(plotterFactory && visPlotter && deletePersistencyFile) +// { +// plotter = plotterFactory->create(); +// // Set the page title : +// plotter->setParameter("pageTitle","XrayFluo"); +// } + +// if(plotter && visPlotter) { +// plotter->show(); // shows plotter window +// } + +// } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +// void XrayFluoAnalysisManager::PlotCurrentResults() +// { +// if(plotter) { +// // Plotting the Detector Energy Deposit - histo_1 +// AIDA::IHistogram1D& histo1p = *histo_1; +// plotter->currentRegion().plot( histo1p, "Detector Energy Deposition" ); +// plotter->refresh(); +// } +// } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +G4bool XrayFluoAnalysisManager::GetDeletePersistencyFileFlag() +{ + return deletePersistencyFile; +} + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void XrayFluoAnalysisManager::analyseStepping(const G4Step* aStep) { - - /* - IHistogram1D* histo_2 =dynamic_cast ( tree->find("2") ); - IHistogram1D* histo_3 =dynamic_cast ( tree->find("3") ); - IHistogram1D* histo_4 =dynamic_cast ( tree->find("4") ); - IHistogram1D* histo_5 =dynamic_cast ( tree->find("5") ); - IHistogram1D* histo_6 =dynamic_cast ( tree->find("6") ); - IHistogram1D* histo_8 =dynamic_cast ( tree->find("8") ); - IHistogram1D* histo_10 =dynamic_cast ( tree->find("10") ); - IHistogram1D* histo_11 =dynamic_cast ( tree->find("11") ); - IHistogram1D* histo_12 =dynamic_cast ( tree->find("12") ); - //IHistogram2D* histo_20=dynamic_cast ( tree->find("20") ); - */ G4double gammaAtTheDetPre=0; G4double protonsAtTheDetPre=0; @@ -197,69 +234,81 @@ void XrayFluoAnalysisManager::analyseStepping(const G4Step* aStep) G4double protonsLeavSam=0; G4double gammaBornInSample=0; G4double eleBornInSample=0; + + // Filling the histograms with data, passing thru stepping. + + + // Select volume from wich the step starts if(aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName()=="Sample"){ - - if(aStep->GetTrack()->GetNextVolume()->GetName() == "World" ) - { - if ((aStep->GetTrack()->GetDynamicParticle() - ->GetDefinition()-> GetParticleName()) == "gamma" ) - - { + // Select volume from wich the step ends + if(aStep->GetTrack()->GetNextVolume()->GetName() == "World" ) { + // Select the particle type + if ((aStep->GetTrack()->GetDynamicParticle() + ->GetDefinition()-> GetParticleName()) == "gamma" ) + + { - if(aStep->GetTrack()->GetCreatorProcess()){ - G4String process = aStep->GetTrack()->GetCreatorProcess()->GetProcessName(); - // G4cout << "Il processo di origine e' " << process << G4endl; - if(histo_10) { - histo_10->fill(1.); - gammaLeavingSample = - (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_11) { - histo_11->fill(gammaLeavingSample/keV); + // Control histos, used for debugging purpose. + + // if(aStep->GetTrack()->GetCreatorProcess()){ + // G4String process = aStep->GetTrack()->GetCreatorProcess()->GetProcessName(); + // G4cout << "Il processo di origine e' " << process << G4endl; + // if(histo_10) { + // histo_10->fill(1.); + // gammaLeavingSample = + // (aStep->GetPreStepPoint()->GetKineticEnergy()); + // if(histo_11) { + // histo_11->fill(gammaLeavingSample/keV); - } - } - } - else { - //G4cout << "Sembra che non ci sia un processo d'origine" << G4endl; - if(histo_10) { - histo_10->fill(2.); + // } + // } + // } + // else { + // //G4cout << "Sembra che non ci sia un processo d'origine" << G4endl; + // if(histo_10) { + // histo_10->fill(2.); - gammaLeavingSample = - (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_12) { - histo_12->fill(gammaLeavingSample/keV); + // gammaLeavingSample = + // (aStep->GetPreStepPoint()->GetKineticEnergy()); + // if(histo_12) { + // histo_12->fill(gammaLeavingSample/keV); - } + // } - } - } + // } + // } + // // + // Filling Histos // + // // - gammaLeavingSample = - (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_4) { - histo_4->fill(gammaLeavingSample/keV); - } - - /* gammaLeavingSamplePhi = - (aStep->GetPreStepPoint()->GetMomentumDirection().phi()); - G4cout << "questo e' Phi: " << gammaLeavingSamplePhi << G4endl; - gammaLeavingSampleTheta = - (aStep->GetPreStepPoint()->GetMomentumDirection().theta()); - G4cout << "questo e' Theta: " << gammaLeavingSampleTheta << G4endl; - if(histo_20) { - // G4cout << "histo_20 esiste" << G4endl; - histo_20->fill(gammaLeavingSamplePhi,gammaLeavingSampleTheta,1.); - } */ - + gammaLeavingSample = + (aStep->GetPreStepPoint()->GetKineticEnergy()); + if(histo_4) { + histo_4->fill(gammaLeavingSample/keV); } - } - } + // Other debugging purpose histos + /* gammaLeavingSamplePhi = + (aStep->GetPreStepPoint()->GetMomentumDirection().phi()); + G4cout << "questo e' Phi: " << gammaLeavingSamplePhi << G4endl; + gammaLeavingSampleTheta = + (aStep->GetPreStepPoint()->GetMomentumDirection().theta()); + G4cout << "questo e' Theta: " << gammaLeavingSampleTheta << G4endl; + if(histo_20) { + // G4cout << "histo_20 esiste" << G4endl; + histo_20->fill(gammaLeavingSamplePhi,gammaLeavingSampleTheta,1.); + } */ + + + } + } + } + if(aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName()=="Sample"){ @@ -278,15 +327,62 @@ void XrayFluoAnalysisManager::analyseStepping(const G4Step* aStep) ->GetDefinition()-> GetParticleName()) == "proton" ) { protonsLeavSam = (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_3) { - histo_3->fill(protonsLeavSam/keV); + if(histo_9) { + histo_9->fill(protonsLeavSam/keV); } } } } + + // electrons from the detector -- Debugging - +// if((aStep->GetTrack()->GetDynamicParticle() +// ->GetDefinition()-> GetParticleName()) == "e-" ){ + +// if(1== (aStep->GetTrack()->GetCurrentStepNumber())){ + +// if(0 != aStep->GetTrack()->GetParentID()){ +// if(aStep->GetTrack()->GetVolume()->GetName() == "HPGeDetector") + +// if(aStep->GetTrack()->GetNextVolume()->GetName() == "World" ){ + +// if(aStep->GetTrack()->GetCreatorProcess()){ +// G4String process = aStep->GetTrack()->GetCreatorProcess()->GetProcessName(); +// G4cout << "Origin Porcess Name: " << process << G4endl; +// if(histo_10) { +// histo_10->fill(1.); +// gammaLeavingSample = +// (aStep->GetPreStepPoint()->GetKineticEnergy()); +// if(histo_11) { +// histo_11->fill(gammaLeavingSample/keV); + +// } +// } +// } +// else { +// G4cout << "No Origin Process Name" << G4endl; +// if(histo_10) { +// histo_10->fill(2.); + +// gammaLeavingSample = +// (aStep->GetPreStepPoint()->GetKineticEnergy()); +// if(histo_12) { +// histo_12->fill(gammaLeavingSample/keV); + +// } + +// } +// } +// } +// } + +// } +// } + + + + if((aStep->GetTrack()->GetDynamicParticle() ->GetDefinition()-> GetParticleName()) == "gamma" ) @@ -324,50 +420,45 @@ void XrayFluoAnalysisManager::analyseStepping(const G4Step* aStep) if(aStep->GetTrack()->GetNextVolume()){ - if(aStep->GetTrack()->GetVolume()->GetName() == "World"){ + //if(aStep->GetTrack()->GetVolume()->GetName() == "World"){ - if(aStep->GetTrack()->GetNextVolume()->GetName() == "HPGeDetector") + if(aStep->GetTrack()->GetNextVolume()->GetName() == "HPGeDetector") - { - if ((aStep->GetTrack()->GetDynamicParticle() - ->GetDefinition()-> GetParticleName()) == "gamma" ) - { - gammaAtTheDetPre = - (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_6) { - histo_6->fill( gammaAtTheDetPre/keV); - } - } - else if ((aStep->GetTrack()->GetDynamicParticle() - ->GetDefinition()-> GetParticleName()) == "proton" ) - { - protonsAtTheDetPre = - (aStep->GetPreStepPoint()->GetKineticEnergy()); - if(histo_8) { - histo_8->fill( protonsAtTheDetPre/keV); - } - } - } - } - } + { + if ((aStep->GetTrack()->GetDynamicParticle() + ->GetDefinition()-> GetParticleName()) == "gamma" ) + { + gammaAtTheDetPre = + (aStep->GetPreStepPoint()->GetKineticEnergy()); + if(histo_6) { + histo_6->fill( gammaAtTheDetPre/keV); + } + } + else if ((aStep->GetTrack()->GetDynamicParticle() + ->GetDefinition()-> GetParticleName()) == "proton" ) + { + protonsAtTheDetPre = + (aStep->GetPreStepPoint()->GetKineticEnergy()); + if(histo_8) { + histo_8->fill( protonsAtTheDetPre/keV); + } + } + } + //} close of if(aStep->GetTrack()->GetVolume()->GetName() == "World"){ } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void XrayFluoAnalysisManager::analyseEnergyDep(G4double energyDep) { - //histo_1 =dynamic_cast ( tree->find("1") ); + + // Filling of Energy Deposition, called by XrayFluoEventAction histo_1->fill(energyDep/keV); - /* - if(tuple) { - tuple->fill(0,energyDep); - tuple->fill(1,1); - tuple->addRow(); - } - */ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -375,16 +466,24 @@ void XrayFluoAnalysisManager::analyseEnergyDep(G4double energyDep) void XrayFluoAnalysisManager::analysePrimaryGenerator(G4double energy) { - // qua si fa uso spropositato di memoria -- attenzione!!// - //histo_7 =dynamic_cast ( tree->find("7") ); + // Filling of energy spectrum histogram of the primary generator + histo_7->fill(energy/keV); } + +// not used -- Created for future development + void XrayFluoAnalysisManager::SetOutputFileName(G4String newName) { outputFileName = newName; +} +void XrayFluoAnalysisManager::SetOutputFileType(G4String newType) +{ + + persistencyType = newType; } @@ -396,5 +495,3 @@ void XrayFluoAnalysisManager::SetOutputFileName(G4String newName) - - diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisMessenger.cc b/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisMessenger.cc index c265cf8d67..7b4c52836d 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisMessenger.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoAnalysisMessenger.cc @@ -22,41 +22,51 @@ // // // $Id: XrayFluoAnalysisMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 minor upgrade (Alfonso.mantero@ge.infn.it) // // ------------------------------------------------------------------- #ifdef G4ANALYSIS_USE #include "XrayFluoAnalysisMessenger.hh" -#include "XrayFluoAnalysisManager.hh" -#include "G4UIdirectory.hh" -#include "G4UIcmdWithAString.hh" + + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoAnalysisMessenger::XrayFluoAnalysisMessenger(XrayFluoAnalysisManager* analysisManager) :xrayFluoAnalysis(analysisManager) - + { XrayFluoAnalysisDir = new G4UIdirectory("/analysis/"); XrayFluoAnalysisDir->SetGuidance("analysis control."); - - ouputFileCommand = new G4UIcmdWithAString("/analysis/outputFile",this); - ouputFileCommand->SetGuidance("specify the name of the output file (lowercase for Hbook)"); - ouputFileCommand->SetGuidance("default: xrayfluo.hbk"); - ouputFileCommand->SetParameterName("choice",true); - ouputFileCommand->SetDefaultValue("xrayfluo.hbk"); - //DrawCmd->SetCandidates("none charged neutral all"); - ouputFileCommand->AvailableForStates(G4State_Idle); + outputFileCommand = new G4UIcmdWithAString("/analysis/outputFile",this); + outputFileCommand->SetGuidance("specify the name of the output file (lowercase if paw will be used)"); + outputFileCommand->SetGuidance("command /analysis/update MUST be used after this command"); + outputFileCommand->SetParameterName("choice",true); + outputFileCommand->SetDefaultValue("xrayfluo.hbk"); + outputFileCommand->AvailableForStates(G4State_Idle); + + outputFileType = new G4UIcmdWithAString("/analysis/fileType",this); + outputFileType->SetGuidance("specify the type of the output file"); + outputFileType->SetGuidance("command /analysis/update MUST be used after this command"); + outputFileType->SetParameterName("choice",true); + outputFileType->SetDefaultValue("hbook"); + outputFileType->SetCandidates("hbook xml"); + outputFileType->AvailableForStates(G4State_Idle); + + persistencyUpdateCommand = new G4UIcmdWithoutParameter("/analysis/update",this); + outputFileCommand->SetGuidance("Update persistency file"); + outputFileCommand->SetGuidance("This command MUST be used after outputFile or outputFileType commands"); + outputFileCommand->AvailableForStates(G4State_Idle); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -72,10 +82,21 @@ XrayFluoAnalysisMessenger::~XrayFluoAnalysisMessenger() void XrayFluoAnalysisMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { -if(command == ouputFileCommand) - {xrayFluoAnalysis->SetOutputFileName(newValue);} + if(command == outputFileCommand) + { + if ((xrayFluoAnalysis->GetDeletePersistencyFileFlag())) remove("xrayfluo.hbk"); + xrayFluoAnalysis->SetOutputFileName(newValue); + } + + else if (command == persistencyUpdateCommand) + {xrayFluoAnalysis->CreatePersistency();} + + else if(command == outputFileType) + { + if (xrayFluoAnalysis->GetDeletePersistencyFileFlag()) remove("xrayfluo.hbk"); + xrayFluoAnalysis->SetOutputFileType(newValue); + } - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoDataSet.cc b/examples/advanced/xray_fluorescence/src/XrayFluoDataSet.cc index 19da6e9de6..be4355a2ef 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoDataSet.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoDataSet.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoDAtaSet.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -47,6 +47,8 @@ XrayFluoDataSet::XrayFluoDataSet(G4int Z, numberOfBins = energies->size(); unit1 = unitE; unit2 = unitData; + + G4cout << "XrayFluo FluoDataSet created" << G4endl; } XrayFluoDataSet:: XrayFluoDataSet(G4int Z, @@ -61,6 +63,9 @@ XrayFluoDataSet:: XrayFluoDataSet(G4int Z, unit2 = unitData; LoadData(dataFile); numberOfBins = energies->size(); + + G4cout << "XrayFluo FluoDataSet created" << G4endl; + } @@ -70,12 +75,12 @@ XrayFluoDataSet::~XrayFluoDataSet() { delete energies; delete data; + G4cout << "XrayFluo FluoDataSet deleted" << G4endl; } -G4double XrayFluoDataSet::FindValue(G4double e, G4int id) const +G4double XrayFluoDataSet::FindValue(G4double e, G4int) const { - id = id; G4double value; G4double e0 = (*energies)[0]; // Protections @@ -133,11 +138,17 @@ void XrayFluoDataSet::LoadData(const G4String& fileName) ost << fileName <<".dat"; G4String name(nameChar); - - char* path = getenv("G4INSTALL"); - - G4String pathString(path); - G4String dirFile = pathString + "/" + name; + + G4String dirFile = name; + + if (!(getenv("XRAYDATA"))) { + + char* path = getenv("PWD"); + + G4String pathString(path); + dirFile = pathString + "/" + name; + } + std::ifstream file(dirFile); std::filebuf* lsdp = file.rdbuf(); @@ -204,3 +215,13 @@ void XrayFluoDataSet::PrintData() const + + + + + + + + + + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoDetectorConstruction.cc b/examples/advanced/xray_fluorescence/src/XrayFluoDetectorConstruction.cc index fe06bde58f..6ab0817bda 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoDetectorConstruction.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoDetectorConstruction.cc @@ -22,23 +22,26 @@ // // // $Id: XrayFluoDetectorConstruction.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V06-02-00 // -// Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) +// Author: Alfonso Mantero (Alfonso.Mantero@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 New materials added (Alfonso.mantero@ge.infn.it) -// +// Nov 2002 Alfonso Mantero materials added, +// Material selection implementation +// 16 Jul 2003 Alfonso Mantero Detector type selection added + minor fixes +// 28 May 2004 Alfonso Mantero sample material selection + bug fixes // ------------------------------------------------------------------- #include "XrayFluoDetectorConstruction.hh" #include "XrayFluoDetectorMessenger.hh" -#include "XrayFluoHPGeSD.hh" +#include "XrayFluoSD.hh" #include "G4Material.hh" #include "G4ThreeVector.hh" #include "G4Box.hh" +#include "G4Sphere.hh" #include "G4Tubs.hh" #include "G4LogicalVolume.hh" #include "G4PVPlacement.hh" @@ -49,11 +52,19 @@ #include "G4Colour.hh" #include "G4ios.hh" #include "G4PVReplica.hh" +#include "G4UserLimits.hh" +#include "XrayFluoMaterials.hh" + + +#include "G4Region.hh" +#include "G4RegionStore.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + XrayFluoDetectorConstruction::XrayFluoDetectorConstruction() - : DeviceSizeX(0),DeviceSizeY(0),DeviceThickness(0), + : detectorType(0),sampleGranularity(false), DeviceSizeX(0), + DeviceSizeY(0),DeviceThickness(0), solidWorld(0),logicWorld(0),physiWorld(0), solidHPGe(0),logicHPGe(0),physiHPGe(0), solidSample (0),logicSample(0),physiSample (0), @@ -65,16 +76,24 @@ XrayFluoDetectorConstruction::XrayFluoDetectorConstruction() OhmicPosMaterial(0), OhmicNegMaterial(0), pixelMaterial(0),sampleMaterial(0), Dia1Material(0),Dia3Material(0), - defaultMaterial(0),matOx(0),U(0),HPGeSD(0) + defaultMaterial(0),HPGeSD(0) { - NbOfPixelRows = 1; - NbOfPixelColumns = 1; + materials = XrayFluoMaterials::GetInstance(); + + DefineDefaultMaterials(); + + NbOfPixelRows = 1; // should be 1 + NbOfPixelColumns = 1; // should be 1 NbOfPixels = NbOfPixelRows*NbOfPixelColumns; - PixelSizeXY = 5 * cm; - PixelThickness = 3.5 * mm; - ContactSizeXY = 0.005*mm; - SampleThickness = 2.5 * mm; + PixelSizeXY = sqrt(40) * mm; // should be sqrt(40) * mm + PixelThickness = 3.5 * mm; //should be 3.5 mm + + G4cout << "PixelThickness(mm): "<< PixelThickness/mm << G4endl; + G4cout << "PixelSizeXY(cm): "<< PixelSizeXY/cm << G4endl; + + ContactSizeXY = sqrt(40) * mm; //should be the same as PixelSizeXY + SampleThickness = 4 * mm; SampleSizeXY = 3. * cm; Dia1Thickness = 1. *mm; Dia3Thickness = 1. *mm; @@ -82,39 +101,91 @@ XrayFluoDetectorConstruction::XrayFluoDetectorConstruction() Dia3SizeXY = 3. *cm; - DiaInnerSize = 2.99 * cm; + DiaInnerSize = 1 * mm; //(Hole in the detector's diaphragm) - OhmicNegThickness = 0.005*mm; - OhmicPosThickness = 0.005*mm; + OhmicNegThickness = 0.005*mm;// 0.005 + OhmicPosThickness = 0.005*mm;// 0.005 ThetaHPGe = 135. * deg; + PhiHPGe = 225. * deg; + + ThetaDia1 = 135. * deg; + PhiDia1 = 90. * deg; + AlphaDia1 = 225. * deg; + + AlphaDia3 = 180. * deg; Dia3Dist = 66.5 * mm; Dia3InnerSize = 1. * mm; - PhiHPGe = 225. * deg; - ThetaDia1 = 135. * deg; ThetaDia3 = 180. * deg; PhiDia3 = 90. * deg; + DistDia = 66.5 * mm; DistDe =DistDia+ (Dia1Thickness +PixelThickness)/2+OhmicPosThickness ; - PhiDia1 = 90. * deg; - AlphaDia1 = 225. * deg; - AlphaDia3 = 180. * deg; + + grainDia = 1 * mm; + + PixelCopyNb=0; + grainCopyNb=0; + G4String defaultDetectorType = "sili"; ComputeApparateParameters(); + SetDetectorType(defaultDetectorType); // create commands for interactive definition of the apparate detectorMessenger = new XrayFluoDetectorMessenger(this); + + G4String regName = "SampleRegion"; + sampleRegion = new G4Region(regName); + G4cout << "XrayFluoDetectorConstruction created" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::instance = 0; + +XrayFluoDetectorConstruction* XrayFluoDetectorConstruction::GetInstance() +{ + if (instance == 0) + { + instance = new XrayFluoDetectorConstruction; + + } + return instance; +} + +void XrayFluoDetectorConstruction::SetDetectorType(G4String type) +{ + + if (type=="sili") + { + detectorType = XrayFluoSiLiDetectorType::GetInstance(); + } + else if (type=="hpge") + { + detectorType = XrayFluoHPGeDetectorType::GetInstance(); + } + else + { + G4String excep = type + "detector type unknown"; + G4Exception(excep); + } +} + +XrayFluoVDetectorType* XrayFluoDetectorConstruction::GetDetectorType() +{ + return detectorType; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + XrayFluoDetectorConstruction::~XrayFluoDetectorConstruction() + { - delete U; - delete matOx; delete detectorMessenger; + delete detectorType; G4cout << "XrayFluoDetectorConstruction deleted" << G4endl; } @@ -122,409 +193,24 @@ XrayFluoDetectorConstruction::~XrayFluoDetectorConstruction() G4VPhysicalVolume* XrayFluoDetectorConstruction::Construct() { - DefineMaterials(); return ConstructApparate(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void XrayFluoDetectorConstruction::DefineMaterials() +void XrayFluoDetectorConstruction::DefineDefaultMaterials() { - //define elements - G4String name, symbol; //a=mass of a mole; - G4double a, z, density; //z=mean number of protons; - G4int natoms,ncomponents; - G4double temperature, pressure; - G4double fractionmass; - // Elements Definitions - //define Niobium - - a = 92.906*g/mole; - G4Element* Nb = new G4Element(name="Niobium" ,symbol="Nb" , z= 41., a); + //define materials of the apparate - //define Zirconium - - a = 91.22*g/mole; - G4Element* Zr = new G4Element(name="Zirconium" ,symbol="Zr" , z= 40., a); + sampleMaterial = materials->GetMaterial("Anorthosite"); + Dia1Material = materials->GetMaterial("Lead"); + Dia3Material = materials->GetMaterial("Lead"); + pixelMaterial = materials->GetMaterial("Silicon"); + OhmicPosMaterial = materials->GetMaterial("Galactic"); + OhmicNegMaterial = materials->GetMaterial("Lead"); + defaultMaterial = materials->GetMaterial("Galactic"); - //define Yttrium - - a = 88.905*g/mole; - G4Element* Y = new G4Element(name="Yttrium" ,symbol="Y" , z= 39., a); - - //define Stronzium - - a = 87.62*g/mole; - G4Element* Sr = new G4Element(name="Stronzium" ,symbol="Sr" , z= 38., a); - - //define Rubidium - - a = 85.47*g/mole; - G4Element* Rb = new G4Element(name="Rubidium" ,symbol="Rb" , z= 37., a); - - //define Zinc - - a = 65.37*g/mole; - G4Element* Zn = new G4Element(name="Zinc" ,symbol="Zn" , z= 30., a); - - //define Nichel - - a = 58.71*g/mole; - G4Element* Ni = new G4Element(name="Nichel" ,symbol="Ni" , z= 28., a); - - //define Scandio - - a = 44.956*g/mole; - G4Element* Sc = new G4Element(name="Scandium" ,symbol="Sc" , z= 21., a); - - //define Vanadium - - a = 50.942*g/mole; - G4Element* V = new G4Element(name="Vanadium" ,symbol="V" , z= 39., a); - - //define Cromium - - a = 51.996*g/mole; - G4Element* Cr = new G4Element(name="Cromium" ,symbol="Cr" , z= 24., a); - - //define Cobalt - - a = 58.933*g/mole; - G4Element* Co = new G4Element(name="Cobalt" ,symbol="Co" , z= 27., a); - - //define Copper - - a = 63.54*g/mole; - G4Element* elCu = new G4Element(name="Copper" ,symbol="Cu" , z= 29., a); - - //define Barium - - a = 137.34*g/mole; - G4Element* Ba = new G4Element(name="Barium" ,symbol="Ba" , z= 56., a); - - //define Cerium - - a = 140.12*g/mole; - G4Element* Ce = new G4Element(name="Cerium" ,symbol="Ce" , z= 58., a); - - //define Neodimuim - - a = 144.24*g/mole; - G4Element* Nd = new G4Element(name="Neodimuim" ,symbol="Nd" , z= 60., a); - - - //Define Zolfo - - a = 32.064*g/mole; - G4Element* elS = new G4Element(name="Zolfo" ,symbol="S" , z= 16., a); - - - - //define carbon - - a = 12.0107*g/mole; - G4Element* C = new G4Element(name="Carbon" ,symbol="C" , z= 6., a); - - //define Nitrogen - - a = 14.01*g/mole; - G4Element* N = new G4Element(name="Nitrogen",symbol="N" , z= 7., a); - - // define Oxigen - a = 15.9994*g/mole; - G4Element* O = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a); - - //define Arsenic - a = 74.9216 * g/mole; - G4Element * As = new G4Element( name="arsenic",symbol="As",z= 33.,a); - - //Define Gallium - a = 69.72* g/mole; - G4Element * Ga = new G4Element(name="gallium",symbol="Ga",z= 31.,a); - - //define Iron - a = 55.847*g/mole; - G4Element* Fe = new G4Element(name="Iron" ,symbol="Fe", z=26., a); - //define hydrogen - - a = 1.01*g/mole; - G4Element* H = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); - - //define germanium - a = 72.61*g/mole; - G4Element* Ge = new G4Element(name="Germanium",symbol="Ge", z= 32.,a); - //define phosporus - - a = 30.97*g/mole; - G4Element* P = new G4Element(name="Phosporus",symbol="P", z= 15., a); - - // define Titanium - a = 47.88*g/mole; - G4Element* elTi = new G4Element(name="Titanium",symbol="Ti" , z= 22., a); - - // define Calcium - a = 40.078*g/mole; - G4Element* Ca = new G4Element(name="Calcium",symbol="Ca" , z= 20., a); - - // define silicon - a = 28.0855*g/mole; - G4Element* elSi = new G4Element(name="Silicon",symbol="Si" , z= 14., a); - - // define Aluminium - a = 26.98154*g/mole; - G4Element* elAl = new G4Element(name="Aluminium",symbol="Al" , z= 13., a); - - // Define Magnesium - a = 24.305*g/mole; - G4Element* Mg = new G4Element(name="Magnesium",symbol="Mg" , z= 12., a); - - // Define Manganese - a = 54.938*g/mole; - G4Element* Mn = new G4Element(name="Manganese",symbol="Mn" , z= 25., a); - - // Define Sodium - a = 22.989*g/mole; - G4Element* Na = new G4Element(name="Sodium",symbol="Na" , z= 11., a); - - // Define Potassium - a = 39.10*g/mole; - G4Element* K = new G4Element(name="Potassium",symbol="K" , z= 19., a); - // Define lead - - a=207.19*g/mole; - G4Element* elPb = new G4Element(name="Lead",symbol="pb", z=82.,a); - - //define Uranium - - a = 238.02891*g/mole; - G4Element* elU = new G4Element(name="Uranium",symbol="U", z=92.,a); - - - G4cout << "Elementi creati" << G4endl; - - - - // Materials Definitions - - // Define dolorite main components - - density = 3*g/cm3; - G4Material* diorite = new G4Material(name="Diorite", density, ncomponents=11); - diorite->AddElement(Fe, fractionmass=0.1750); - diorite->AddElement(elTi, fractionmass=0.0082); - diorite->AddElement(Ca, fractionmass=0.0753); - diorite->AddElement(elSi, fractionmass=0.2188); - diorite->AddElement(elAl, fractionmass=0.0676); - diorite->AddElement(Mg, fractionmass=0.0008); - diorite->AddElement(O , fractionmass=0.4377); - diorite->AddElement(Mn , fractionmass=0.0015); - diorite->AddElement(Na , fractionmass=0.0134); - diorite->AddElement(K , fractionmass=0.0011); - diorite->AddElement(P , fractionmass=0.0006); - - // define traces in dolorite - - density = 3*g/cm3; - G4Material* tracesOfDolorite = new G4Material(name="TracesOfDolorite", density, ncomponents=16); - tracesOfDolorite->AddElement(Nb, natoms=5); - tracesOfDolorite->AddElement(Zr, natoms=91); - tracesOfDolorite->AddElement(Y, natoms=29); - tracesOfDolorite->AddElement(Sr, natoms=140); - tracesOfDolorite->AddElement(Rb, natoms=3); - tracesOfDolorite->AddElement(Ga, natoms=20); - tracesOfDolorite->AddElement(Zn, natoms=99); - tracesOfDolorite->AddElement(Ni, natoms=77); - tracesOfDolorite->AddElement(Sc, natoms=32); - tracesOfDolorite->AddElement(V, natoms=314); - tracesOfDolorite->AddElement(Cr, natoms=130); - tracesOfDolorite->AddElement(Co, natoms=56); - tracesOfDolorite->AddElement(elCu, natoms=119); - tracesOfDolorite->AddElement(Ba, natoms=38); - tracesOfDolorite->AddElement(Ce, natoms=15); - tracesOfDolorite->AddElement(Nd, natoms=9); - - // define dolorite (full) - - density = 3*g/cm3; - dolorite = new G4Material(name="Dolorite", density, ncomponents=2); - dolorite->AddMaterial(tracesOfDolorite, fractionmass=0.0027842352); - dolorite->AddMaterial(diorite, fractionmass=0.9972157648); - - // define mars1 - - density = 3*g/cm3; - G4Material* mars1Main = new G4Material(name="Mars1 Main components", density, ncomponents=11); - mars1Main->AddElement(Fe, fractionmass=0.100916); - mars1Main->AddElement(elTi, fractionmass=0.0186804); - mars1Main->AddElement(Ca, fractionmass=0.0404091); - mars1Main->AddElement(elSi, fractionmass=0.196378); - mars1Main->AddElement(elAl, fractionmass=0.103282); - mars1Main->AddElement(Mg, fractionmass=0.0241622); - mars1Main->AddElement(Mn , fractionmass=0.00184331); - mars1Main->AddElement(Na , fractionmass=0.0177908); - mars1Main->AddElement(K , fractionmass=0.00574498); - mars1Main->AddElement(P , fractionmass=0.00280169); - mars1Main->AddElement(O , fractionmass=0.48799152); - - density = 3*g/cm3; - G4Material* tracesOfMars1 = new G4Material(name="TracesOfMars1", density, ncomponents=17); - tracesOfMars1->AddElement(Nb, natoms=55); - tracesOfMars1->AddElement(Zr, natoms=433); - tracesOfMars1->AddElement(Y, natoms=58); - tracesOfMars1->AddElement(Sr, natoms=968); - tracesOfMars1->AddElement(Rb, natoms=16); - tracesOfMars1->AddElement(Ga, natoms=24); - tracesOfMars1->AddElement(Zn, natoms=109); - tracesOfMars1->AddElement(Ni, natoms=70); - tracesOfMars1->AddElement(Sc, natoms=21); - tracesOfMars1->AddElement(V, natoms=134); - tracesOfMars1->AddElement(Cr, natoms=141); - tracesOfMars1->AddElement(Co, natoms=30); - tracesOfMars1->AddElement(elCu, natoms=19); - tracesOfMars1->AddElement(Ba, natoms=580); - tracesOfMars1->AddElement(elPb, natoms=4); - tracesOfMars1->AddElement(elS, natoms=444); - tracesOfMars1->AddElement(elU, natoms=2); - - - density = 3*g/cm3; - G4Material* mars1 = new G4Material(name="Mars1", density, ncomponents=2); - mars1->AddMaterial(tracesOfMars1, fractionmass=0.0044963163); - mars1->AddMaterial(mars1Main, fractionmass=0.9955036837); - - //define Neodimuim - - density = 6800*kg/m3; - materialNd = new G4Material(name="Neodimuim" ,density , ncomponents=1); - materialNd ->AddElement(Nd,natoms=1); - - // Define Magnesium - density = 1738*kg/m3; - materialMg = new G4Material(name="Magnesium",density , ncomponents=1); - materialMg->AddElement(Mg,natoms=1); - - //define iron - - density = 7.86 * g/cm3; - FeMaterial = new G4Material(name="Iron",density,ncomponents=1); - FeMaterial->AddElement(Fe,natoms=1); - - - - //define gallium arsenide - - density = 5.32 * g/cm3; - G4Material * GaAs = new G4Material(name ="gallium arsenide",density,ncomponents=2); - GaAs->AddElement(Ga,natoms=1); - GaAs->AddElement(As,natoms=1); - - - // define germanium - - density = 5.32 * g/cm3; - HPGe = new G4Material(name="HPGe",density,ncomponents=1); - HPGe ->AddElement(Ge,natoms=1); - - //define silicon - - density = 2.333*g/cm3; - a = 28.0855*g/mole; - Si = new G4Material(name="Silicon",z=14., a,density); - - //define copper - - density = 8.960*g/cm3; - a = 63.55*g/mole; - Cu = new G4Material(name="Copper" , z=29., a, density); - - - - //define Oxigen - density = 1*g/cm3; - a=16*g/mole; - matOx = new G4Material(name="Oxigen", z=8., a, density); - - //define aluminium - - density = 2.700*g/cm3; - a = 26.98*g/mole; - Al = new G4Material(name="Aluminium", z=13., a, density); - - //define titanium - density = 4.54 *g/cm3; - a = 47.867*g/mole; - Ti = new G4Material(name="Titanium",z=22.,a,density); - - - //define Uranium - density = 19050*kg/m3; - a = 238.02891*g/mole; - U = new G4Material(name="Uranium",z=92.,a,density); - - //define Tin - density = 7310*kg/m3; - a = 118.710*g/mole; - Sn = new G4Material(name="Tin",z=50.,a,density); - - //define lead - - density = 11.35*g/cm3; - a=207.19*g/mole; - G4Material* Pb = new G4Material(name="Lead",z=82.,a,density); - - //define scintillator - - density = 1.032*g/cm3; - G4Material* Sci = new G4Material(name="Scintillator", density, ncomponents=2); - Sci->AddElement(C, natoms=9); - Sci->AddElement(H, natoms=10); - - - //define air - - - density = 1.290*mg/cm3; - G4Material* Air = new G4Material(name="Air" , density, ncomponents=2); - Air->AddElement(N, fractionmass=0.7); - Air->AddElement(O, fractionmass=0.3); - - //define vacuum - - density = universe_mean_density; //from PhysicalConstants.h - pressure = 3.e-18*pascal; - temperature = 2.73*kelvin; - G4Material * Vacuum = new G4Material(name="Galactic", z=1., a=1.01*g/mole, density, - kStateGas,temperature,pressure); - - - - - - //define basalt - density = 3.*g/cm3; - G4Material* basalt = new G4Material(name="Basalt", density, ncomponents=7); - basalt->AddElement(Fe, fractionmass=0.1200); - basalt->AddElement(elTi, fractionmass=0.0160); - basalt->AddElement(Ca, fractionmass=0.0750); - basalt->AddElement(elSi, fractionmass=0.2160); - basalt->AddElement(elAl, fractionmass=0.0710); - basalt->AddElement(Mg, fractionmass=0.0590); - basalt->AddElement(O , fractionmass=0.4430); - - // end basalt - - G4cout << *(G4Material::GetMaterialTable()) << G4endl; - - //default materials of the apparate - - sampleMaterial = mars1; - Dia1Material = Pb; - Dia3Material = Pb; - pixelMaterial = HPGe; - OhmicPosMaterial = Cu; - OhmicNegMaterial = Pb; - defaultMaterial = Vacuum; } @@ -534,7 +220,7 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() { // complete the apparate parameters definition - ComputeApparateParameters(); + //ComputeApparateParameters(); //world @@ -564,7 +250,7 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() logicHPGe = new G4LogicalVolume(solidHPGe, //its solid - defaultMaterial, //its material + defaultMaterial, //its material "HPGeDetector"); //its name zRotPhiHPGe.rotateX(PhiHPGe); @@ -572,14 +258,18 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() z = DistDe * cos(ThetaHPGe); y =DistDe * sin(ThetaHPGe); x = 0.*cm; - physiHPGe = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)), "HPGeDetector", //its name + physiHPGe = new G4PVPlacement(G4Transform3D(zRotPhiHPGe,G4ThreeVector(x,y,z)), + "HPGeDetector", //its name logicHPGe, //its logical volume physiWorld, //its mother volume false, //no boolean operation 0); //copy number } - // Pixel + // Pixel + + + for ( G4int j=0; j < NbOfPixelColumns ; j++ ) { for ( G4int i=0; i < NbOfPixelRows ; i++ ) { @@ -590,22 +280,28 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() logicPixel = new G4LogicalVolume(solidPixel, pixelMaterial, //its material - "Pixel"); //its name + "Pixel"); //its name + + /* zRotPhiHPGe.rotateX(PhiHPGe); G4double x,y,z; z = DistDe * cos(ThetaHPGe); y =DistDe * sin(ThetaHPGe); - x = 0.*cm; - + x = 0.*cm;*/ physiPixel = new G4PVPlacement(0, G4ThreeVector(0, - i*PixelSizeXY, + i*PixelSizeXY, j*PixelSizeXY ), "Pixel", logicPixel, //its logical volume physiHPGe, //its mother volume false, //no boolean operation PixelCopyNb);//copy number + + + + + // OhmicNeg @@ -636,7 +332,7 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() if (OhmicPosThickness > 0.) { solidOhmicPos = new G4Box("OhmicPos", //its name - ContactSizeXY/2,ContactSizeXY/2,OhmicPosThickness/2); + PixelSizeXY/2,PixelSizeXY/2,OhmicPosThickness/2); logicOhmicPos = new G4LogicalVolume(solidOhmicPos, //its solid OhmicPosMaterial, //its material @@ -653,34 +349,161 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() PixelCopyNb); } - PixelCopyNb += PixelCopyNb; + + PixelCopyNb += PixelCopyNb; + G4cout << "PixelCopyNb: " << PixelCopyNb << G4endl; } - } + + } + + //Sample - + + if (sampleGranularity) { + solidSample=0; logicSample=0; physiSample=0; - if (SampleThickness > 0.) { solidSample = new G4Box("Sample", //its name SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size logicSample= new G4LogicalVolume(solidSample, //its solid - sampleMaterial, //its material - "Sample"); //its name + defaultMaterial, //its material + "Sample"); //its name physiSample = new G4PVPlacement(0, //no rotation G4ThreeVector(), //at (0,0,0) "Sample", //its name logicSample, //its logical volume - physiWorld, //its mother volume + physiWorld, //its mother volume false, //no boolean operation 0); //copy number } + + + + + G4int nbOfGrainsX = ((G4int)(SampleSizeXY/grainDia)) -1 ; - //Diaphragm1 + // y dim of a max density plane is 2rn-(n-1)ar, wehere a = (1-(sqrt(3)/2)), n is + // number of rows and r the radius of the grain. so the Y-dim of the sample must + // be greater or equal to this. It results that nmust be <= (SampleY-a)/(1-a). + // Max Y shift of the planes superimposing along Z axis is minor (2/sqrt(3)r) + + G4double a = (1.-(sqrt(3.)/2.)); + G4int nbOfGrainsY = (G4int) ( ((SampleSizeXY/(grainDia/2.)) -a)/(2.-a) ) -1; + + // same for the z axis, but a = 2 * (sqrt(3) - sqrt(2))/sqrt(3) + + G4double b = 2. * (sqrt(3.) - sqrt(2.))/sqrt(3.); + G4int nbOfGrainsZ = (G4int) ( ((SampleThickness/(grainDia/2.)) -b)/(2.-b) )-1; + + if (SampleThickness > 0.){ + + solidGrain=0; logicGrain=0; physiGrain=0; + solidGrain = new G4Sphere("Grain",0., + grainDia/2,0., twopi, 0., pi); + + logicGrain = new G4LogicalVolume(solidGrain, + sampleMaterial, //its material + "Grain"); //its name + G4ThreeVector grainPosition; + G4double grainInitPositionX; + G4double grainInitPositionY; + G4double grainInitPositionZ = (-1.*SampleThickness/2.+grainDia/2.); + G4double grainStepX = grainDia; + G4double grainStepY = grainDia*(1.-(0.5-(sqrt(3.)/4.))); + G4double grainStepZ = grainDia*sqrt(2./3.); + + for ( G4int k=0; k < nbOfGrainsZ ; k++ ) { + for ( G4int j=0; j < nbOfGrainsY ; j++ ) { + for ( G4int i=0; i < nbOfGrainsX ; i++ ) { + + // Now we identify the layer and the row where the grain is , to place it in the right position + + + + if (k%3 == 0) { // first or (4-multiple)th layer: structure is ABCABC + grainInitPositionY = (-1.*SampleSizeXY/2.+grainDia/2.); + if (j%2 ==0) { //first or (3-multiple)th row + grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.); + } + + else if ( ((j+1) % 2) == 0 ) { + grainInitPositionX = (-1.*SampleSizeXY/2.+ grainDia); + } + + } + else if ( ((k+2) % 3) == 0 ) { // B-layer + + grainInitPositionY = ( (-1.*SampleSizeXY/2.) + (grainDia/2.)*(1. + (1./sqrt(3.)) ) ); + + if (j%2 ==0) { //first or (3-multiple)th row + grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia); + } + + else if ( (j+1)%2 == 0 ) { + grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2); + } + + } + + else if ( (k+1)%3 == 0 ) { // B-layer + + grainInitPositionY = (-1.*SampleSizeXY/2.+(grainDia/2.)*(1.+2./sqrt(3.)) ); + + if (j%2 ==0) { //first or (3-multiple)th row + grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia/2.); + } + + else if ( (j+1)%2 == 0 ) { + grainInitPositionX = (-1.*SampleSizeXY/2.+grainDia); + } + + } + + physiGrain = new G4PVPlacement(0, + G4ThreeVector( grainInitPositionX + i*grainStepX, + grainInitPositionY + j*grainStepY, + grainInitPositionZ + k*grainStepZ), + "Grain", + logicGrain, //its logical volume + physiSample, //its mother volume + false, //no boolean operation + grainCopyNb);//copy number + + grainCopyNb = grainCopyNb +1; + } + } + } + } + } + else { + + solidSample=0; logicSample=0; physiSample=0; + if (SampleThickness > 0.) + { + solidSample = new G4Box("Sample", //its name + SampleSizeXY/2,SampleSizeXY/2,SampleThickness/2);//size + + logicSample= new G4LogicalVolume(solidSample, //its solid + sampleMaterial, //its material + "Sample"); //its name + + physiSample = new G4PVPlacement(0, //no rotation + G4ThreeVector(), //at (0,0,0) + "Sample", //its name + logicSample, //its logical volume + physiWorld, //its mother volume + false, //no boolean operation + 0); //copy number + + } + } + + //Diaphragm1 solidDia1 = 0; physiDia1 = 0; logicDia1=0; @@ -703,11 +526,12 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() z = DistDia * cos(ThetaDia1); y =DistDia * sin(ThetaDia1); x = 0.*cm; - physiDia1 = new G4PVPlacement(G4Transform3D(zRotPhiDia1,G4ThreeVector(x,y,z)), "Diaphragm1", //its name + physiDia1 = new G4PVPlacement(G4Transform3D(zRotPhiDia1,G4ThreeVector(x,y,z)), + "Diaphragm1", //its name logicDia1, //its logical volume physiWorld, //its mother volume false, //no boolean operation - 0); //copy number + 0); //copy number } //Diaphragm3 @@ -742,9 +566,10 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() G4SDManager* SDman = G4SDManager::GetSDMpointer(); + if(!HPGeSD) { - HPGeSD = new XrayFluoHPGeSD ("HPGeSD",this); + HPGeSD = new XrayFluoSD ("HPGeSD",this); SDman->AddNewDetector(HPGeSD); } @@ -753,29 +578,56 @@ G4VPhysicalVolume* XrayFluoDetectorConstruction::ConstructApparate() { logicPixel->SetSensitiveDetector(HPGeSD); } + + // cut per region + + + logicSample->SetRegion(sampleRegion); + sampleRegion->AddRootLogicalVolume(logicSample); + + // Visualization attributes logicWorld->SetVisAttributes (G4VisAttributes::Invisible); G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); G4VisAttributes * yellow= new G4VisAttributes( G4Colour(255/255. ,255/255. ,51/255. )); + G4VisAttributes * red= new G4VisAttributes( G4Colour(255/255. , 0/255. , 0/255. )); + G4VisAttributes * blue= new G4VisAttributes( G4Colour(0/255. , 0/255. , 255/255. )); + G4VisAttributes * gray= new G4VisAttributes( G4Colour(128/255. , 128/255. , 128/255. )); + G4VisAttributes * lightGray= new G4VisAttributes( G4Colour(178/255. , 178/255. , 178/255. )); yellow->SetVisibility(true); yellow->SetForceSolid(true); + red->SetVisibility(true); + red->SetForceSolid(true); + blue->SetVisibility(true); + gray->SetVisibility(true); + gray->SetForceSolid(true); + lightGray->SetVisibility(true); + lightGray->SetForceSolid(true); simpleBoxVisAtt->SetVisibility(true); - logicPixel->SetVisAttributes(simpleBoxVisAtt); - logicHPGe->SetVisAttributes(G4VisAttributes::Invisible ); + logicPixel->SetVisAttributes(red); //modified!!! + logicHPGe->SetVisAttributes(blue); + logicSample->SetVisAttributes(simpleBoxVisAtt); + + if (sampleGranularity) logicSample->SetVisAttributes(simpleBoxVisAtt); // mandatory - logicDia1->SetVisAttributes(simpleBoxVisAtt); - logicDia3->SetVisAttributes(simpleBoxVisAtt); + logicDia1->SetVisAttributes(lightGray); + logicDia3->SetVisAttributes(lightGray); logicOhmicNeg->SetVisAttributes(yellow); logicOhmicPos->SetVisAttributes(yellow); + + + + if (sampleGranularity) logicGrain->SetVisAttributes(gray); + //always return the physical World - - + PrintApparateParameters(); + return physiWorld; } @@ -794,9 +646,9 @@ void XrayFluoDetectorConstruction::PrintApparateParameters() << SampleSizeXY/cm << " cm" << G4endl - <<" Material: " << sampleMaterial->GetName() + <<" Material: " << logicSample->GetMaterial()->GetName() <GetName() <DefineWorldVolume(ConstructApparate()); } + +void XrayFluoDetectorConstruction::DeleteGrainObjects() +{ + if (sampleGranularity) { + delete solidGrain; + delete logicGrain; + delete physiGrain; + } + +} void XrayFluoDetectorConstruction::SetSampleMaterial(G4String newMaterial) { - if( newMaterial == "dolorite") { - sampleMaterial = dolorite; - } - - else if ( newMaterial == "iron") { - sampleMaterial = FeMaterial; -} - - else if ( newMaterial == "silicon") { - sampleMaterial = Si; -} - - else if ( newMaterial == "aluminium") { - sampleMaterial = Al; -} - - else if ( newMaterial == "copper") { - sampleMaterial = Cu; -} - else if ( newMaterial == "germanium") { - sampleMaterial = HPGe; -} - else if ( newMaterial == "magnesium") { - sampleMaterial = materialMg; -} - - else if ( newMaterial == "neodimium") { - sampleMaterial = materialNd; -} - else if ( newMaterial == "tin") { - sampleMaterial = Sn; -} - else if ( newMaterial == "titanium") { - sampleMaterial = Ti; -} + G4cout << "Material Change in Progress" << newMaterial << G4endl; + sampleMaterial = materials->GetMaterial(newMaterial); + logicSample->SetMaterial(sampleMaterial); + PrintApparateParameters(); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoDetectorMessenger.cc b/examples/advanced/xray_fluorescence/src/XrayFluoDetectorMessenger.cc index 5269338bf4..24ae82188a 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoDetectorMessenger.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoDetectorMessenger.cc @@ -22,14 +22,13 @@ // // // $Id: XrayFluoDetectorMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 change material command added(Alfonso.mantero@ge.infn.it) // // ------------------------------------------------------------------- @@ -39,29 +38,53 @@ #include "G4UIcmdWithAString.hh" #include "G4UIcmdWithADoubleAndUnit.hh" #include "G4UIcmdWithoutParameter.hh" +#include "G4UIcmdWithABool.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoDetectorMessenger::XrayFluoDetectorMessenger(XrayFluoDetectorConstruction * Det) :Detector(Det) { - detDir = new G4UIdirectory("/apparate/"); + detDir = new G4UIdirectory("/apparate/"); detDir->SetGuidance("detector control."); UpdateCmd = new G4UIcmdWithoutParameter("/apparate/update",this); UpdateCmd->SetGuidance("Update apparate geometry."); UpdateCmd->SetGuidance("This command MUST be applied before \"beamOn\" "); - UpdateCmd->SetGuidance("if you changed geometrical value(s)."); + UpdateCmd->SetGuidance("if you changed geometrical value(s): /apparate/GrainDiameter and /apparate/sampleGranularity"); + UpdateCmd->AvailableForStates(G4State_Idle); - sampleCmd = new G4UIcmdWithAString("/apparate/sample",this); + sampleCmd = new G4UIcmdWithAString("/apparate/sampleMaterial",this); sampleCmd->SetGuidance("select a diferent material for the sample"); - sampleCmd->SetGuidance("The command /apparate/update command MUST be applied after this one"); - sampleCmd->SetParameterName("choice",true); - sampleCmd->SetDefaultValue("dolorite"); - sampleCmd->SetCandidates("dolorite iron silicon aluminium titanium tin neodimium magnesium germanium copper mars1"); + sampleCmd->SetParameterName("material",true); + sampleCmd->SetDefaultValue("mars1"); + sampleCmd->SetCandidates("Dolorite Iron Silicon Aluinium Oxigen Titanium Tin Lead Neodimium Magnesium Copper Anorthosite Mars1"); sampleCmd->AvailableForStates(G4State_Idle); + + detectorCmd = new G4UIcmdWithAString("/apparate/detector",this); + detectorCmd->SetGuidance("select a diferent detectorType"); + detectorCmd->SetParameterName("detector",true); + detectorCmd->SetDefaultValue("sili"); + detectorCmd->SetCandidates("sili hpge"); + detectorCmd->AvailableForStates(G4State_Idle); + grainDiaCmd = new G4UIcmdWithADoubleAndUnit( "/apparate/GrainDiameter",this ); + grainDiaCmd->SetGuidance( "Set diameter of grains" ); + grainDiaCmd->SetGuidance( "After this, /apparate/update must be executed before BeamOn" ); + grainDiaCmd->SetGuidance( "Default: 0.5 mm " ); + grainDiaCmd->SetParameterName( "Grain Diameter", true, true ); + grainDiaCmd->SetDefaultUnit( "mm" ); + grainDiaCmd->SetUnitCategory( "Length" ); + grainDiaCmd->AvailableForStates(G4State_Idle); + + granularityFlagCmd= new G4UIcmdWithABool("/apparate/sampleGranularity",this); + granularityFlagCmd->SetGuidance("Set if sample granularity is present"); + granularityFlagCmd->SetGuidance( "After this, /apparate/update must be executed before BeamOn" ); + granularityFlagCmd->SetParameterName("Granularity Flag",true); + granularityFlagCmd->SetDefaultValue(false); + granularityFlagCmd->AvailableForStates(G4State_Idle); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -81,7 +104,25 @@ void XrayFluoDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newVal else if ( command == sampleCmd ) { Detector->SetSampleMaterial(newValue);} - } + + else if ( command == detectorCmd ) + { Detector->SetDetectorType(newValue);} + + else if ( command == grainDiaCmd ) + { + G4double newSize = grainDiaCmd->GetNewDoubleValue(newValue); + Detector->SetGrainDia(newSize); + } + + else if ( command == granularityFlagCmd ) + { + Detector->DeleteGrainObjects(); + G4bool newGranFlag = granularityFlagCmd->GetNewBoolValue(newValue); + Detector->SetSampleGranularity(newGranFlag); + } + +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoEventAction.cc b/examples/advanced/xray_fluorescence/src/XrayFluoEventAction.cc index 29e418ef09..565948918f 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoEventAction.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoEventAction.cc @@ -22,20 +22,23 @@ // // // $Id: XrayFluoEventAction.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created +// 15 Jul 2003 Alfonso Mantero "DetectorType" use integration +// 23 Sep 2003 Alfonso Mantero differnt geometries integration // // ------------------------------------------------------------------- #include "XrayFluoEventAction.hh" #include "XrayFluoSensorHit.hh" #include "XrayFluoEventActionMessenger.hh" -#include "XrayFluoRunAction.hh" + +//#include "XrayFluoRunAction.hh" #include "XrayFluoDataSet.hh" #include "XrayFluoAnalysisManager.hh" @@ -52,45 +55,97 @@ #include "G4ios.hh" #include "G4UnitsTable.hh" #include "Randomize.hh" - +#include //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -XrayFluoEventAction::XrayFluoEventAction() +XrayFluoEventAction::XrayFluoEventAction(XrayFluoDetectorConstruction* det) :drawFlag("all"), HPGeCollID(-1), eventMessenger(0), - printModulo(1) - + printModulo(1), + detectorType(0) { eventMessenger = new XrayFluoEventActionMessenger(this); - runManager = new XrayFluoRunAction(); - + detectorType = det->GetDetectorType(); + + //runManager = new XrayFluoRunAction(); + G4cout << "XrayFluoEventAction created" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +XrayFluoEventAction::XrayFluoEventAction(XrayFluoPlaneDetectorConstruction* det) + :drawFlag("all"), + HPGeCollID(-1), + eventMessenger(0), + printModulo(1), + detectorType(0) +{ + eventMessenger = new XrayFluoEventActionMessenger(this); + detectorType = det->GetDetectorType(); + + //runManager = new XrayFluoRunAction(); + G4cout << "XrayFluoEventAction created" << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +XrayFluoEventAction::XrayFluoEventAction(XrayFluoMercuryDetectorConstruction* det) + :drawFlag("all"), + HPGeCollID(-1), + eventMessenger(0), + printModulo(1), + detectorType(0) +{ + eventMessenger = new XrayFluoEventActionMessenger(this); + detectorType = det->GetDetectorType(); + + //runManager = new XrayFluoRunAction(); + G4cout << "XrayFluoEventAction created" << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoEventAction::~XrayFluoEventAction() { delete eventMessenger; eventMessenger = 0; - delete runManager; - runManager = 0; + //delete runManager; + //runManager = 0; + G4cout << "XrayFluoEventAction deleted" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void XrayFluoEventAction::BeginOfEventAction(const G4Event* evt) { - - if (HPGeCollID==-1 && evt) + + G4int eventNumber = (evt->GetEventID())+1; + if ( eventNumber == 1){ + + G4cout << "# = 100000 events" << G4endl; + G4cout << "1--------+---------+---------+---------+---------5e6"<PlotCurrentResults(); + } + + if (HPGeCollID==-1) + { G4SDManager * SDman = G4SDManager::GetSDMpointer(); HPGeCollID = SDman->GetCollectionID("HPGeCollection"); //the pointer points to the ID number of the sensitive detector } } - + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void XrayFluoEventAction::EndOfEventAction(const G4Event* evt) @@ -98,26 +153,39 @@ void XrayFluoEventAction::EndOfEventAction(const G4Event* evt) // extracted from hits, compute the total energy deposit (and total charged // track length) G4HCofThisEvent* HCE = evt->GetHCofThisEvent(); + + XrayFluoSensorHitsCollection* HPGeHC = 0; G4int n_hit = 0; - G4double totEnergyDetect=0., totEnergy=0, energyD=0.; + G4double totEnergyDetect=0., totEnergy=0., energyD=0.; if (HCE) HPGeHC = (XrayFluoSensorHitsCollection*)(HCE->GetHC(HPGeCollID)); if(HPGeHC) + + { n_hit = HPGeHC->entries(); + + // if (n_hit) {G4cout << "Ecco quante hit ho nel detector "<< n_hit << G4endl;} + for (G4int i=0;iGetEdepTot(); - energyD = ResponseFunction(totEnergy); - XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); - analysis->analyseEnergyDep(energyD); - - totEnergyDetect += energyD; - - + + + energyD = detectorType->ResponseFunction(totEnergy); + // energyD = totEnergy; + // G4cout << "energy deposit: "<< totEnergy << G4endl; + + XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); + analysis->analyseEnergyDep(energyD); + + totEnergyDetect += energyD; + + } } @@ -172,77 +240,5 @@ G4double XrayFluoEventAction::RandomCut(G4double energy) return EdepDetect; }; -G4double XrayFluoEventAction::ResponseFunction(G4double energy) -{ - G4double eMin = 1* keV; - G4double eMax = 10*keV; - G4double value = 0.; - G4double efficiency = 1.; - - const XrayFluoDataSet* dataSet = runManager->GetEfficiencySet(); - G4int id = 0; - - G4double random = G4UniformRand(); - - if (energy>=eMin && energy <=eMax) - { - G4double infEnergy = (G4int)(energy/keV)* keV; - - G4double supEnergy = ((G4int)(energy/keV) + 1)*keV; - - - - G4double infData = runManager->GetInfData(energy, random); - - G4double supData = runManager->GetSupData(energy,random); - - value = (log10(infData)*log10(supEnergy/energy) + - log10(supData)*log10(energy/infEnergy)) / - log10(supEnergy/infEnergy); - value = pow(10,value); - } - else if (energyGetInfData(eMin, random); - G4double supData = runManager->GetSupData(eMin,random); - value = (log10(infData)*log10(supEnergy/eMin) + - log10(supData)*log10(eMin/infEnergy)) / - log10(supEnergy/infEnergy); - value = pow(10,value); - value = value-eMin+ energy; - - - } - else if (energy>eMax) - { - G4double infEnergy = eMax/keV - 1. *keV; - G4double supEnergy = eMax; - - G4double infData = runManager->GetInfData(eMax, random); - G4double supData = runManager->GetSupData(eMax,random); - value = (log10(infData)*log10(supEnergy/eMax) + - log10(supData)*log10(eMax/infEnergy)) / - log10(supEnergy/infEnergy); - value = pow(10,value); - value = value+energy- eMax; - } - G4double RandomNum = G4UniformRand(); - - efficiency = dataSet->FindValue(value,id); - if ( RandomNum>efficiency ) - { - value = 0.; - } - - return value; - -} - - - - diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoEventActionMessenger.cc b/examples/advanced/xray_fluorescence/src/XrayFluoEventActionMessenger.cc index 56c5e4818d..fac9e941f2 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoEventActionMessenger.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoEventActionMessenger.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoEventActionMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoNormalization.cc b/examples/advanced/xray_fluorescence/src/XrayFluoNormalization.cc index 49ee41be38..052a56ef35 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoNormalization.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoNormalization.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoAnalysisMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -49,14 +49,22 @@ const XrayFluoDataSet* XrayFluoNormalization::Normalize(G4double minIntExtreme, { G4VDataSetAlgorithm* interpolation = new G4LogLogInterpolation(); - XrayFluoDataSet* dataSet = - new XrayFluoDataSet(1,fileName,interpolation,keV,1); + char* path = getenv("XRAYDATA"); + G4String dirFile; + if (path) { + G4String pathString(path); + dirFile = pathString + "/" + fileName; + } + else{ dirFile = fileName;} + XrayFluoDataSet* dataSet = + new XrayFluoDataSet(1,dirFile,interpolation,keV,1); + G4double integral = Integrate(minIntExtreme, maxIntExtreme, nBins, dataSet); G4VDataSetAlgorithm* interpolation2 = new G4LogLogInterpolation(); - XrayFluoDataSet* finalDataSet = new XrayFluoDataSet(1,fileName,interpolation2,keV,1/(integral/keV)); + XrayFluoDataSet* finalDataSet = new XrayFluoDataSet(1,dirFile,interpolation2,keV,1/(integral/keV)); return finalDataSet; } diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsList.cc b/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsList.cc index 51b89ed7b7..9e41c5fa23 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsList.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsList.cc @@ -22,40 +22,93 @@ // // // $Id: XrayFluoPhysicsList.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created -// 29 Nov 2002 Auger Effect Added (Alfonso.mantero@ge.infn.it) // // ------------------------------------------------------------------- #include "XrayFluoPhysicsList.hh" #include "XrayFluoPhysicsListMessenger.hh" #include "XrayFluoDetectorConstruction.hh" - +#include "XrayFluoPlaneDetectorConstruction.hh" +#include "XrayFluoMercuryDetectorConstruction.hh" #include "G4ParticleDefinition.hh" #include "G4ParticleWithCuts.hh" #include "G4ProcessManager.hh" #include "G4ParticleTypes.hh" #include "G4ParticleTable.hh" #include "G4ios.hh" -#include "XrayFluoDetectorConstruction.hh" + +#include "G4Region.hh" +#include "G4RegionStore.hh" + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoPhysicsList::XrayFluoPhysicsList(XrayFluoDetectorConstruction* p) -: G4VUserPhysicsList() + : G4VUserPhysicsList(),pDet(0),planeDet(0),mercuryDet(0) + { pDet = p; - defaultCutValue = 0.00001*mm; + + // SetGELowLimit(250*eV); + + defaultCutValue = 0.1*mm; cutForGamma = defaultCutValue; cutForElectron = defaultCutValue; - cutForProton = 0.00001*mm; + cutForProton = 0.001*mm; + SetVerboseLevel(1); + physicsListMessenger = new XrayFluoPhysicsListMessenger(this); + + G4String regName = "SampleRegion"; + G4double cutValue = 0.000001 * mm; + G4Region* reg = G4RegionStore::GetInstance()->GetRegion(regName); + G4ProductionCuts* cuts = new G4ProductionCuts; + cuts->SetProductionCut(cutValue); + reg->SetProductionCuts(cuts); + + + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +XrayFluoPhysicsList::XrayFluoPhysicsList(XrayFluoPlaneDetectorConstruction* p) + : G4VUserPhysicsList(),pDet(0),planeDet(0),mercuryDet(0) +{ + planeDet = p; + + // SetGELowLimit(250*eV); + + defaultCutValue = 0.000001*mm; + + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForProton = 0.001*mm; + SetVerboseLevel(1); + physicsListMessenger = new XrayFluoPhysicsListMessenger(this); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +XrayFluoPhysicsList::XrayFluoPhysicsList(XrayFluoMercuryDetectorConstruction* p) +: G4VUserPhysicsList(),pDet(0),planeDet(0),mercuryDet(0) +{ + mercuryDet = p; + + // SetGELowLimit(250*eV); + + defaultCutValue = 0.000001*mm; + + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForProton = 0.001*mm; SetVerboseLevel(1); physicsListMessenger = new XrayFluoPhysicsListMessenger(this); } @@ -150,38 +203,43 @@ void XrayFluoPhysicsList::ConstructEM() pmanager->AddDiscreteProcess(new G4LowEnergyCompton); LePeprocess = new G4LowEnergyPhotoElectric(); - //LePeprocess->ActivateAuger(false); - //LePeprocess->SetCutForLowEnSecPhotons(10000 * keV); - //LePeprocess->SetCutForLowEnSecElectrons(10000 * keV); + + LePeprocess->ActivateAuger(true); + LePeprocess->SetCutForLowEnSecPhotons(0.250 * keV); + LePeprocess->SetCutForLowEnSecElectrons(0.250 * keV); + pmanager->AddDiscreteProcess(LePeprocess); - pmanager->AddDiscreteProcess(new G4LowEnergyRayleigh); + pmanager->AddDiscreteProcess(new G4LowEnergyRayleigh("Rayleigh")); } else if (particleName == "e-") { //electron pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); - - LeIoprocess = new G4LowEnergyIonisation(); - //LeIoprocess->ActivateAuger(false); - //LeIoprocess->SetCutForLowEnSecPhotons(10000 keV); - //LeIoprocess->SetCutForLowEnSecElectrons(10000 keV); - pmanager->AddProcess(LeIoprocess, -1, 2, 2); + + LeIoprocess = new G4LowEnergyIonisation("IONI"); + LeIoprocess->ActivateAuger(true); + //eIoProcess = new G4eIonisation("stdIONI"); + LeIoprocess->SetCutForLowEnSecPhotons(0.1*keV); + LeIoprocess->SetCutForLowEnSecElectrons(0.1*keV); + pmanager->AddProcess(LeIoprocess, -1, 2, 2); LeBrprocess = new G4LowEnergyBremsstrahlung(); pmanager->AddProcess(LeBrprocess, -1, -1, 3); - - } else if (particleName == "e+") { + + } else if (particleName == "e+") { //positron pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); - } + } else if (particleName == "proton") { //proton + G4hLowEnergyIonisation* hIoni = new G4hLowEnergyIonisation; + hIoni->SetFluorescence(true); pmanager->AddProcess(new G4MultipleScattering,-1,1,1); - pmanager->AddProcess(new G4hLowEnergyIonisation,-1, 2,2); + pmanager->AddProcess(hIoni,-1, 2,2); } else if ( particleName == "alpha" ) { @@ -195,6 +253,47 @@ void XrayFluoPhysicsList::ConstructEM() } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +// void XrayFluoPhysicsList::SetGELowLimit(G4double lowcut) +// { +// if (verboseLevel >0){ +// G4cout << "XrayFluoPhysicsList::SetCuts:"; +// G4cout << "Gamma and Electron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; +// } + +// G4Gamma::SetEnergyRange(lowcut,1e5); +// G4Electron::SetEnergyRange(lowcut,1e5); +// G4Positron::SetEnergyRange(lowcut,1e5); + +// } + +// void XrayFluoPhysicsList::SetGammaLowLimit(G4double lowcut) +// { +// if (verboseLevel >0){ +// G4cout << "XrayFluoPhysicsList::SetCuts:"; +// G4cout << "Gamma cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; +// } + +// G4Gamma::SetEnergyRange(lowcut,1e5); + +// } + +// void XrayFluoPhysicsList::SetElectronLowLimit(G4double lowcut) +// { +// if (verboseLevel >0){ + +// G4cout << "XrayFluoPhysicsList::SetCuts:"; +// G4cout << "Electron cut in energy: " << lowcut*MeV << " (MeV)" << G4endl; + +// } + +// G4Electron::SetEnergyRange(lowcut,1e5); + +// } + + + void XrayFluoPhysicsList::SetGammaCut(G4double val) { ResetCuts(); @@ -203,6 +302,8 @@ void XrayFluoPhysicsList::SetGammaCut(G4double val) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + void XrayFluoPhysicsList::SetElectronCut(G4double val) { ResetCuts(); @@ -215,7 +316,7 @@ void XrayFluoPhysicsList::SetCuts(){ SetCutValue(cutForElectron,"e-"); SetCutValue(cutForElectron,"e+"); SetCutValue(cutForProton, "proton"); - SetCutValue(cutForProton, "alpha"); + //SetCutValueForOthers(cutForProton); if (verboseLevel>0) DumpCutValuesTable(); } @@ -223,7 +324,7 @@ void XrayFluoPhysicsList::SetCuts(){ void XrayFluoPhysicsList::SetLowEnSecPhotCut(G4double cut){ - G4cout<<"Low energy secondary photons cut is now set to: "<SetCutForLowEnSecPhotons(cut); LePeprocess->SetCutForLowEnSecPhotons(cut); @@ -232,7 +333,7 @@ void XrayFluoPhysicsList::SetLowEnSecPhotCut(G4double cut){ void XrayFluoPhysicsList::SetLowEnSecElecCut(G4double cut){ - G4cout<<"Low energy secondary electrons cut is now set to: "<GetSampleMaterial(); + + G4Material* currMat; + + if(pDet){ + currMat = pDet->XrayFluoDetectorConstruction::GetSampleMaterial(); + } + else if(planeDet){ + currMat = planeDet->XrayFluoPlaneDetectorConstruction::GetPlaneMaterial(); + } + + else if(mercuryDet){ + currMat = mercuryDet->GetMercuryMaterial(); + } + G4ParticleDefinition* part; G4double cut; - + part = theXrayFluoParticleTable->FindParticle("e-"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "e-"); - + part = theXrayFluoParticleTable->FindParticle("proton"); cut = G4EnergyLossTables::GetRange(part,val,currMat); SetCutValue(cut, "proton"); +// part = theXrayFluoParticleTable->FindParticle("gamma"); +// cut = G4EnergyLossTables::GetRange(part,val,currMat); +// SetCutValue(cut, "gamma"); + } @@ -280,18 +398,6 @@ void XrayFluoPhysicsList::SetCutsByEnergy(G4double val) - - - - - - - - - - - - diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsListMessenger.cc b/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsListMessenger.cc index e1b9359e4a..931f454c73 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsListMessenger.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoPhysicsListMessenger.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoPhysicsListMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -49,6 +49,27 @@ XrayFluoPhysicsListMessenger::XrayFluoPhysicsListMessenger(XrayFluoPhysicsList * lowEnDir = new G4UIdirectory("/lowenergy/"); lowEnDir->SetGuidance("LowEnergy commands"); +// cutGLowLimCmd = new G4UIcmdWithADoubleAndUnit("/lowenergy/lowlimG",this); +// cutGLowLimCmd->SetGuidance("Set ENERGY low limit for Gamma."); +// cutGLowLimCmd->SetParameterName("energy",true); +// cutGLowLimCmd->SetDefaultValue(1e-3); +// cutGLowLimCmd->SetDefaultUnit("MeV"); +// cutGLowLimCmd->AvailableForStates(G4State_Idle); + +// cutELowLimCmd = new G4UIcmdWithADoubleAndUnit("/lowenergy/lowlimE",this); +// cutELowLimCmd->SetGuidance("Set ENERGY low limit for e-."); +// cutELowLimCmd->SetParameterName("energy",true); +// cutELowLimCmd->SetDefaultValue(1e-3); +// cutELowLimCmd->SetDefaultUnit("MeV"); +// cutELowLimCmd->AvailableForStates(G4State_Idle); + +// cutGELowLimCmd = new G4UIcmdWithADoubleAndUnit("/lowenergy/lowlimGE",this); +// cutGELowLimCmd->SetGuidance("Set ENERGY low limit for e- and Gamma."); +// cutGELowLimCmd->SetParameterName("energy",true); +// cutGELowLimCmd->SetDefaultValue(1e-3); +// cutGELowLimCmd->SetDefaultUnit("MeV"); +// cutGELowLimCmd->AvailableForStates(G4State_Idle); + cutSecPhotCmd = new G4UIcmdWithADoubleAndUnit("/lowenergy/secphotcut",this); cutSecPhotCmd->SetGuidance("Set production threshold for secondary Gamma."); cutSecPhotCmd->SetParameterName("energy",true); @@ -85,7 +106,7 @@ XrayFluoPhysicsListMessenger::XrayFluoPhysicsListMessenger(XrayFluoPhysicsList * cutPCmd->AvailableForStates(G4State_Idle); eCmd = new G4UIcmdWithADoubleAndUnit("/lowenergy/cutEnergy",this); - eCmd->SetGuidance("Set cut values by ENERGY for charged particles."); + eCmd->SetGuidance("Set cut values by ENERGY for all particles."); eCmd->SetParameterName("cutenergy",false); eCmd->SetRange("cutenergy>0."); eCmd->SetUnitCategory("Energy"); @@ -97,6 +118,10 @@ XrayFluoPhysicsListMessenger::XrayFluoPhysicsListMessenger(XrayFluoPhysicsList * XrayFluoPhysicsListMessenger::~XrayFluoPhysicsListMessenger() { + +// delete cutGLowLimCmd; +// delete cutELowLimCmd; +// delete cutGELowLimCmd; delete cutSecElecCmd; delete cutSecPhotCmd; delete cutGCmd; @@ -110,6 +135,15 @@ XrayFluoPhysicsListMessenger::~XrayFluoPhysicsListMessenger() void XrayFluoPhysicsListMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { + // if(command == cutGLowLimCmd) + // { XrayFluoList->SetGammaLowLimit(cutGLowLimCmd->GetNewDoubleValue(newValue));} + + // if(command == cutELowLimCmd) + // { XrayFluoList->SetElectronLowLimit(cutELowLimCmd->GetNewDoubleValue(newValue));} + + // if(command == cutGELowLimCmd) + // { XrayFluoList->SetGELowLimit(cutGELowLimCmd->GetNewDoubleValue(newValue));} + if(command == cutSecPhotCmd) { XrayFluoList->SetLowEnSecPhotCut(cutSecPhotCmd->GetNewDoubleValue(newValue));} @@ -122,10 +156,10 @@ void XrayFluoPhysicsListMessenger::SetNewValue(G4UIcommand* command,G4String new if(command == cutECmd) { XrayFluoList->SetElectronCut(cutECmd->GetNewDoubleValue(newValue));} - if(command == cutPCmd) + if(command == cutPCmd) { XrayFluoList->SetProtonCut(cutPCmd->GetNewDoubleValue(newValue));} - if(command == eCmd) + if(command == eCmd) { XrayFluoList->SetCutsByEnergy(eCmd->GetNewDoubleValue(newValue));} } diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorAction.cc b/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorAction.cc index a7edbf2f81..e2973c1061 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorAction.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorAction.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoPrimaryGeneratorAction.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -47,11 +47,12 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -XrayFluoPrimaryGeneratorAction::XrayFluoPrimaryGeneratorAction( - XrayFluoDetectorConstruction* XrayFluoDC) - :XrayFluoDetector(XrayFluoDC),rndmFlag("off"), - beam("off"),spectrum("off"),isoVert("off") +XrayFluoPrimaryGeneratorAction::XrayFluoPrimaryGeneratorAction(XrayFluoDetectorConstruction* XrayFluoDC) + :rndmFlag("off"),beam("off"),spectrum("off"),isoVert("off") { + + XrayFluoDetector = XrayFluoDC; + G4int n_particle = 1; particleGun = new G4ParticleGun(n_particle); @@ -68,9 +69,12 @@ XrayFluoPrimaryGeneratorAction::XrayFluoPrimaryGeneratorAction( particleGun->SetParticleDefinition(particle); particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.)); - particleGun->SetParticleEnergy(6.*keV); + + particleGun->SetParticleEnergy(10.*keV); G4double position = -0.5*(XrayFluoDetector->GetWorldSizeZ()); particleGun->SetParticlePosition(G4ThreeVector(0.*cm,0.*cm,position)); + + G4cout << "XrayFluoPrimaryGeneratorAction created" << G4endl; } @@ -82,6 +86,9 @@ XrayFluoPrimaryGeneratorAction::~XrayFluoPrimaryGeneratorAction() delete particleGun; delete gunMessenger; delete runManager; + + G4cout << "XrayFluoPrimaryGeneratorAction deleted" << G4endl; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -93,8 +100,8 @@ void XrayFluoPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) G4double z0 = -0.5*(XrayFluoDetector->GetWorldSizeZ()); G4double y0 = 0.*cm, x0 = 0.*cm; if (rndmFlag == "on") - {y0 = (XrayFluoDetector->GetSampleSizeXY())*(G4UniformRand()-0.5); - x0 = (XrayFluoDetector->GetSampleSizeXY())*(G4UniformRand()-0.5); + {y0 = (XrayFluoDetector->GetDia3SizeXY())/sqrt(2.)*(G4UniformRand()-0.5); // it was GetSampleSizeXY(), + x0 = (XrayFluoDetector->GetDia3SizeXY())/sqrt(2.)*(G4UniformRand()-0.5); // not divided by sqrt(2.) } particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); @@ -149,9 +156,9 @@ void XrayFluoPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { G4double random = G4UniformRand(); - G4double randomNum = G4UniformRand()*5.0E6; + G4double randomNum = G4UniformRand(); //*5.0E6; - particleEnergy = random * energyRange; + particleEnergy = (random*energyRange) + minEnergy; if ((dataSet->FindValue(particleEnergy,id)) > randomNum) { @@ -198,3 +205,11 @@ void XrayFluoPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + + + + + + + + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorMessenger.cc b/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorMessenger.cc index bd8f9860ed..043a3520f4 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorMessenger.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoPrimaryGeneratorMessenger.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoPrimarygeneratorMessenger.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -73,6 +73,8 @@ XrayFluoPrimaryGeneratorMessenger::XrayFluoPrimaryGeneratorMessenger(XrayFluoPri isoVert->SetCandidates("on off"); isoVert->AvailableForStates(G4State_PreInit,G4State_Idle); + G4cout << "XrayFluoPrimaryGeneratorMessenger created" << G4endl; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -83,6 +85,9 @@ XrayFluoPrimaryGeneratorMessenger::~XrayFluoPrimaryGeneratorMessenger() delete RndmVert; delete spectrum; delete isoVert; + + G4cout << "XrayFluoPrimaryGeneratorMessenger deleted" << G4endl; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoRunAction.cc b/examples/advanced/xray_fluorescence/src/XrayFluoRunAction.cc index e64106d5f9..446b961376 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoRunAction.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoRunAction.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoRunAction.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -50,7 +50,7 @@ #ifdef G4ANALYSIS_USE XrayFluoRunAction::XrayFluoRunAction() - :dataSet(0),dataGammaSet(0),dataAlphaSet(0),efficiencySet(0) + :dataSet(0),dataGammaSet(0),dataAlphaSet(0) { XrayFluoNormalization normalization; @@ -58,25 +58,28 @@ XrayFluoRunAction::XrayFluoRunAction() data = new G4DataVector; - ReadData(MeV, "/examples/advanced/xray_fluorescence/mercury_flx_solmin"); - ReadResponse("/examples/advanced/xray_fluorescence/response"); + ReadData(MeV,"mercury_flx_solmin"); + //ReadResponse("SILIresponse"); G4double minGamma = 0.*keV; G4double maxGamma = 10. *keV; - G4int nBinsGamma = 100; + G4int nBinsGamma = 5; + dataGammaSet = normalization.Normalize(minGamma, maxGamma, nBinsGamma, - "/examples/advanced/xray_fluorescence/B_flare"); - - G4String fileName = "/examples/advanced/xray_fluorescence/efficienza"; - G4VDataSetAlgorithm* interpolation4 = new G4LogLogInterpolation(); - efficiencySet = new XrayFluoDataSet(1,fileName,interpolation4,keV,1); - delete interpolation4; + "FlatSpectrum"); + + //G4String fileName = "SILIefficiency"; + //G4VDataSetAlgorithm* interpolation4 = new G4LogLogInterpolation(); + //efficiencySet = new XrayFluoDataSet(1,fileName,interpolation4,keV,1); + //delete interpolation4; + G4cout << "XrayFluoRunAction created" << G4endl; } #else XrayFluoRunAction::XrayFluoRunAction() { + G4cout << "XrayFluoRunAction created" << G4endl; } #endif @@ -85,29 +88,35 @@ XrayFluoRunAction::XrayFluoRunAction() XrayFluoRunAction::~XrayFluoRunAction() { - std::map >::iterator pos; + + //std::map >::iterator pos; - for (pos = energyMap.begin(); pos != energyMap.end(); pos++) - { - G4DataVector* dataSet = (*pos).second; - delete dataSet; - dataSet = 0; - } - for (pos = dataMap.begin(); pos != dataMap.end(); pos++) - { - G4DataVector* dataSet = (*pos).second; - delete dataSet; - dataSet = 0; - } + // delete energies; + // delete data; + // G4cout << "energies and data deleted " << G4endl; + + //for (pos = energyMap.begin(); pos != energyMap.end(); pos++) + //{ + // G4DataVector* dataSet = (*pos).second; + // delete dataSet; + // dataSet = 0; + // } + //for (pos = dataMap.begin(); pos != dataMap.end(); pos++) + // { + // G4DataVector* dataSet = (*pos).second; + // delete dataSet; + // dataSet = 0; + // } + G4cout << "XrayFluoRunAction deleted" << G4endl; } #else XrayFluoRunAction::~XrayFluoRunAction() { - + G4cout << "XrayFluoRunAction deleted" << G4endl; } #endif @@ -117,7 +126,6 @@ void XrayFluoRunAction::BeginOfRunAction(const G4Run* aRun) { G4cout << "### Run " << aRun << " start." << G4endl; - if (G4VVisManager::GetConcreteInstance()) { G4UImanager* UI = G4UImanager::GetUIpointer(); @@ -128,25 +136,24 @@ void XrayFluoRunAction::BeginOfRunAction(const G4Run* aRun) // Book histograms and ntuples XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); analysis->book(); + // analysis->InitializePlotter(); #endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void XrayFluoRunAction::EndOfRunAction(const G4Run* aRun ) +void XrayFluoRunAction::EndOfRunAction(const G4Run*) { - if (aRun){ - - XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); - - - // Run ended, update the visualization - if (G4VVisManager::GetConcreteInstance()) { - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); - } - analysis->finish(); + XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); + + // Run ended, update the visualization + if (G4VVisManager::GetConcreteInstance()) { + G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); } +#ifdef G4ANALYSIS_USE + analysis->finish(); +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -164,10 +171,10 @@ const XrayFluoDataSet* XrayFluoRunAction::GetAlphaSet() { return dataAlphaSet; } -const XrayFluoDataSet* XrayFluoRunAction::GetEfficiencySet() -{ - return efficiencySet; -} +//const XrayFluoDataSet* XrayFluoRunAction::GetEfficiencySet() +//{ +// return efficiencySet; +//} G4DataVector* XrayFluoRunAction::GetEnergies() { return energies; @@ -186,89 +193,6 @@ G4double XrayFluoRunAction::GetDataSum() } return sum; } -G4double XrayFluoRunAction::GetInfData(G4double energy, G4double random) -{ - G4double value = 0.; - G4int zMin = 1; - G4int zMax = 10; - - G4int Z = ((G4int)(energy/keV)); - - if (ZzMax) {Z=zMax;} - - if (Z >= zMin && Z <= zMax) - { - std::map >::const_iterator pos; - pos = energyMap.find(Z); - std::map >::const_iterator posData; - posData = dataMap.find(Z); - if (pos!= energyMap.end()) - { - G4DataVector energySet = *((*pos).second); - G4DataVector dataSet = *((*posData).second); - G4int nData = energySet.size(); - - G4double partSum = 0; - G4int index = 0; - - while (random> partSum) - { - partSum += dataSet[index]; - index++; - } - - - if (index >= 0 && index < nData) - { - value = energySet[index]; - - } - - } - } - return value; -} - -G4double XrayFluoRunAction::GetSupData(G4double energy, G4double random) -{ - G4double value = 0.; - G4int zMin = 1; - G4int zMax = 10; - G4int Z = ((G4int)(energy/keV)+1); - - if (ZzMax) {Z=zMax;} - if (Z >= zMin && Z <= zMax) - { - std::map >::const_iterator pos; - pos = energyMap.find(Z); - std::map >::const_iterator posData; - posData = dataMap.find(Z); - if (pos!= energyMap.end()) - { - G4DataVector energySet = *((*pos).second); - G4DataVector dataSet = *((*posData).second); - G4int nData = energySet.size(); - G4double partSum = 0; - G4int index = 0; - - while (random> partSum) - { - partSum += dataSet[index]; - index++; - } - - - if (index >= 0 && index < nData) - { - value = energySet[index]; - } - } - } - return value; -} - void XrayFluoRunAction::ReadData(G4double unitE, G4String fileName) @@ -280,7 +204,7 @@ void XrayFluoRunAction::ReadData(G4double unitE, G4String fileName) G4String name(nameChar); - char* path = getenv("G4INSTALL"); + char* path = getenv("XRAYDATA"); G4String pathString(path); G4String dirFile = pathString + "/" + name; @@ -333,86 +257,15 @@ void XrayFluoRunAction::ReadData(G4double unitE, G4String fileName) file.close(); } -void XrayFluoRunAction::ReadResponse(const G4String& fileName) -{ - char nameChar[100] = {""}; - std::ostrstream ost(nameChar, 100, std::ios::out); - - - ost << fileName<<".dat"; - - G4String name(nameChar); - - char* path = getenv("G4INSTALL"); - - G4String pathString(path); - G4String dirFile = pathString + "/" + name; - std::ifstream file(dirFile); - std::filebuf* lsdp = file.rdbuf(); - - if (! (lsdp->is_open()) ) - { - G4String excep = "XrayFluoRunAction - data file: " + dirFile + " not found"; - G4Exception(excep); - } - G4double a = 0; - G4int k = 1; - G4int s = 0; - - G4int Z = 1; - G4DataVector* energies = new G4DataVector; - G4DataVector* data = new G4DataVector; - - do - { - file >> a; - G4int nColumns = 2; - if (a == -1) - { - if (s == 0) - { - // End of a data set - energyMap[Z] = energies; - dataMap[Z] = data; - // Start of new shell data set - energies = new G4DataVector; - data = new G4DataVector; - Z++; - } - s++; - if (s == nColumns) - { - s = 0; - } - } - else if (a == -2) - { - // End of file; delete the empty vectors - //created when encountering the last -1 -1 row - delete energies; - delete data; - - } - else - { - // 1st column is energy - if(k%nColumns != 0) - { - G4double e = a * keV; - energies->push_back(e); - k++; - } - else if (k%nColumns == 0) - { - // 2nd column is data - - data->push_back(a); - k = 1; - } - } - } while (a != -2); // end of file - file.close(); -} + + + + + + + + + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoSensorHit.cc b/examples/advanced/xray_fluorescence/src/XrayFluoSensorHit.cc index 0ba3ea486c..c990c69d1e 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoSensorHit.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoSensorHit.cc @@ -22,14 +22,14 @@ // // // $Id: XrayFluoSensorHit.cc -// GEANT4 tag $Name: xray_fluo-V03-02-00 +// GEANT4 tag $Name: xray_fluo-V04-01-03 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // // History: // ----------- // 28 Nov 2001 Elena Guardincerri Created -// +// 29 Nov 2002 Alfonso Mantero minor modifications (Alfonso.mantero@ge.infn.it) // ------------------------------------------------------------------- #include "XrayFluoSensorHit.hh" @@ -40,28 +40,30 @@ G4Allocator XrayFluoSensorHitAllocator; XrayFluoSensorHit::XrayFluoSensorHit() { - EdepTot = 0.; - EdepDetect = 0.; - - -} + EdepTot = 0.; + EdepDetect = 0.; + + + // G4cout << "XrayFluoSensorHit created" << G4endl; + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -XrayFluoSensorHit::XrayFluoSensorHit(const XrayFluoSensorHit& right) - :G4VHit(right) +XrayFluoSensorHit::XrayFluoSensorHit(const XrayFluoSensorHit& right): + G4VHit(right) { - EdepTot = right.EdepTot ; + EdepDetect = right.EdepDetect; - + + //G4cout << "XrayFluoSensorHit created" << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoSensorHit::~XrayFluoSensorHit() { - + //G4cout << "XrayFluo SensorHit deleted" << G4endl; } @@ -77,10 +79,8 @@ const XrayFluoSensorHit& XrayFluoSensorHit::operator=(const XrayFluoSensorHit& r //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -int XrayFluoSensorHit::operator==(const XrayFluoSensorHit& right) const +int XrayFluoSensorHit::operator==(const XrayFluoSensorHit&) const { - if(EdepTot == right.EdepTot && EdepDetect == right.EdepDetect) - {return 1;} return 0; } @@ -103,3 +103,4 @@ void XrayFluoSensorHit::Print() + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoSteppingAction.cc b/examples/advanced/xray_fluorescence/src/XrayFluoSteppingAction.cc index 33e1b9799e..d9ad6be39d 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoSteppingAction.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoSteppingAction.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoSteppingAction.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -32,24 +32,31 @@ // // ------------------------------------------------------------------- + + + + #include "XrayFluoSteppingAction.hh" -#include "XrayFluoDetectorConstruction.hh" #include "G4SteppingManager.hh" #include "G4TrackVector.hh" -#include "G4ios.hh" #ifdef G4ANALYSIS_USE #include "XrayFluoAnalysisManager.hh" #endif - +#include "G4ios.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -XrayFluoSteppingAction::XrayFluoSteppingAction() -{ } +XrayFluoSteppingAction::XrayFluoSteppingAction() + :mercuryFlag(false) +{ + G4cout << "XrayFluoSteppingAction created" << G4endl; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... XrayFluoSteppingAction::~XrayFluoSteppingAction() -{ } +{ + G4cout << "XrayFluoSteppingAction deleted" << G4endl; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -59,7 +66,21 @@ void XrayFluoSteppingAction::UserSteppingAction(const G4Step* aStep) XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance(); analysis->analyseStepping(aStep); #endif -} + if (mercuryFlag){ + XrayFluoMercuryDetectorConstruction* detector = XrayFluoMercuryDetectorConstruction::GetInstance(); + + if(aStep->GetTrack()->GetNextVolume()) { + + if(aStep->GetTrack()->GetNextVolume()->GetName() == "DetectorOptic") { + G4ThreeVector particlePosition = aStep->GetPostStepPoint()->GetPosition(); + G4ThreeVector detectorPosition = detector->GetOptic()->GetObjectTranslation(); + G4ThreeVector newDirection = detectorPosition - particlePosition; + aStep->GetPostStepPoint()->SetMomentumDirection(newDirection); + } + } + } +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoSteppingVerbose.cc b/examples/advanced/xray_fluorescence/src/XrayFluoSteppingVerbose.cc index 939cd57f6b..29c9715081 100644 --- a/examples/advanced/xray_fluorescence/src/XrayFluoSteppingVerbose.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoSteppingVerbose.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoSteppingVerbose.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -41,12 +41,18 @@ XrayFluoSteppingVerbose::XrayFluoSteppingVerbose() //////////////////////////////////////////////// { + + G4cout << "XrayFluoSteppingVerbose created" << G4endl; + } ////////////////////////////////////////////////// XrayFluoSteppingVerbose::~XrayFluoSteppingVerbose() ////////////////////////////////////////////////// { + + G4cout << "XrayFluoSteppingVerbose deleted" << G4endl; + } ///////////////////////////////////////// diff --git a/examples/advanced/xray_fluorescence/src/XrayFluoVisManager.cc b/examples/advanced/xray_fluorescence/src/XrayFluoVisManager.cc index 5243883578..db68ec87eb 100755 --- a/examples/advanced/xray_fluorescence/src/XrayFluoVisManager.cc +++ b/examples/advanced/xray_fluorescence/src/XrayFluoVisManager.cc @@ -22,7 +22,7 @@ // // // $Id: XrayFluoVisManager.cc -// GEANT4 tag $Name: xray_fluo-V04-01-03 +// GEANT4 tag $Name: xray_fluo-V03-02-00 // // Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it) // @@ -43,7 +43,6 @@ #include "G4DAWNFILE.hh" #include "G4GAGTree.hh" #include "G4HepRepFile.hh" -#include "G4HepRep.hh" #include "G4RayTracer.hh" #include "G4VRML1File.hh" #include "G4VRML2File.hh" @@ -100,10 +99,9 @@ void XrayFluoVisManager::RegisterGraphicsSystems () { RegisterGraphicsSystem (new G4DAWNFILE); RegisterGraphicsSystem (new G4GAGTree); RegisterGraphicsSystem (new G4HepRepFile); - RegisterGraphicsSystem (new G4HepRep); RegisterGraphicsSystem (new G4RayTracer); - // RegisterGraphicsSystem (new G4VRML1File); - //RegisterGraphicsSystem (new G4VRML2File); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); // Graphics systems needing external packages or libraries... @@ -138,13 +136,13 @@ void XrayFluoVisManager::RegisterGraphicsSystems () { #ifdef G4VIS_USE_OIWIN32 RegisterGraphicsSystem (new G4OpenInventorWin32); #endif - + /* #ifdef G4VIS_USE_VRML RegisterGraphicsSystem (new G4VRML1); RegisterGraphicsSystem (new G4VRML2); #endif - + */ if (fVerbose > 0) { G4cout << "\nYou have successfully chosen to use the following graphics systems." diff --git a/examples/advanced/xray_fluorescence/testhbk.xml b/examples/advanced/xray_fluorescence/testhbk.xml new file mode 100644 index 0000000000000000000000000000000000000000..d8d118436f3596ebf1628243abbb488699e66d7d GIT binary patch literal 1621 zcmV-b2CDfViwFRwT)0301MON{Z`(E$e&4Uq^g5L0{W3Hyur(V7EKSjL8~Ui)iY?TV z3`uFzf4?KSv8fBGq$aj@iyn$br1+7C-}%nrp`Sj#&9~8qw5qeRIEx9wag-Lza+MY9 zv-r2G%O_e3^Mu6DpMCfA`xlo#zj^!WJW8@v5?#H$dUJje#ha$t{kT}P@6dIXrkiw! z%4)r+mzy+C>IFj-k$v;3S;Y|y)O~*d?K;HpI?H$4G*62rX`mt6CCm58Iz5YbS!_)) zUO?APRyXCkN^-J_iX>0l_wYfpIg1x@)MU*TUY!?dwf+>nNOxtOH7!C?6y<*O7OqM2 z=zaR>EPm7W2aIHUGyZJR>-rMF4n4`B@w{lNEUgdic+h^4CdIK4VR+IX@UYkGyq@oL ze%n+@GzWMIX1m^&ADtckC{~j_7ClQPw^<#nvMOCR-5%V=QJ&m(bouBQ{AJKtLX;qa~I~*sR z5+>vxW0Pj*6uOuEs8 z4u~d@7K~xHB_*@a8qw3g13PCGk4*&5 zE%-=P7Ik!r?DyE06e5q_G_8=YLWBT0_mM-`-r5F>a|}XCfg9 z)(=xZYSFq=!ac7!B9syE2-fE{=v!~SeO|*Ps3b&5kv_p>O8qP}W;u~!6g*v%J{X%3 zzm^o8%T9yY+9xc1py29K8QljHGukJ(0cnTUX)s~i@rVYKRMcq3#L$kyV@H7`Wro4y zK(m90vB3IExC1jY(kCgW?c)Hm<0G*)Z5nL&eyDuZ(0%JPm3rt4Vum6CTKS{p|^VnUH2 zS{Y1T8^>_K#j*C-0;!B~9&SlMhl7=W=7|f~Gy4`Y2r%#f>OZSU^h(1czBEJZK>;30h9A)(JEjP`Ti+$b|5r_5AIaE_1|$ z)Xg8Bj{Cd~4G|(I5?C%tm`a*_}Hs8tZ7ACLgk5{lzzplOuS_ z?R>7>?kl!SP<=Tp*xSW+iTJ)^Hmd4R7Tkw-lB0tAu){xIaA(+4aGx)?cLt*ej_%9t zdn0v-cZRxGx&89b^Vh%pe)(6>GDy!NQ$?4Mb&!EM9_U2EcXu`Rg6IqGuBJxuIMeWE z>hUKbvktXSZoleZg-EAZS81}`-0@?THZZrcdZ=Dc58`3j=<@QBWvASeehm~;V~Snv zS`oU*qw>0AMpi7d6-*jBRsgUC``?#n_ZZ4Ux8Y^_zfLzY>Nn04MqU0-l)G1^fbn#$ zKpeRO_2vrvp}|{^8ULy(n>Og4rmFr?JUrK58_yqQ^;B6kZjzmF&hiZ5q1W&SnUD1P T#^}}kiv8K&Een9gG%o-E#<2@M literal 0 HcmV?d00001 diff --git a/examples/advanced/xray_fluorescence/xrayfluo.xml b/examples/advanced/xray_fluorescence/xrayfluo.xml new file mode 100644 index 0000000000000000000000000000000000000000..74f921da33c719148fcc8ffd900f28c86d1cfb22 GIT binary patch literal 1586 zcmV-22F>{&iwFRvT)0301MON}Z`(E$ec!Lp^g4v*_s7t*z}9RSur@{0ZRn$FGqzAm zHYBA@|NXAy#-=5aN@@b_x+p-9h!hX+)w$!P&P@>BBMZZ~z_vq`LJ_awc>i?XS5TkqR(uln5Mqz_-qb7TRs-1A^~{gI7g8xY^DBFh2aZ$eN5S zy88}sMrlNcH2OU&iY$4zsmdfTlV)X;I%}DFZ$fzo2vCboP>bjgw*|-=$95mvf9glj4*1vy@#*op3V?P>a5z#ne zLYfd7kLXE`xFSq3#yn{9$Tqx(V~9vfm69@G9O=VJ#3Uw6yOOjg%%ljhkzBS0+E$yg zPEJvx@F)Q}ViR&iMKISf#3k!XnyW_?X^#7n_C4xR>!?XV>fA-7*4z=K&P7TY${!|3 z)Zw*pXgwaYCKyE&DQz@d#-3p^rbiB#+=EfXx#8L(hFZag zMk9KXAS!^5O88P1VNq>kybS>AwJl~kCWs5JxaP!%CL+ofL4q>^{PKFzjW^2oa2$c$ z8D)4c-auml@kS7Ys3cl>UFilKcV67MaeS&q#1ztsw~iv(HO_f)oN!8@2&{#xIQV2MuNC1sTwGARbglrR0(F90P2u()y zqy*_w0W=-eHZ25X9ODxc>aNMyLAxZPP?;Frhl6ETKujnUCZOkvXx|c$MhrNHC`cDv z%7+#+1fZP3BouHgW(Yu4&6$Fli~7)Fh5&<{qk^`@3;`%ZsiXlhiM>(K(%6s2W6Cmz zI*39JP`>vTds{;8mL2!mmN*@aGpBU~&E@2&)iMWJHdsn8ns96LQ!7fCi!h-iAVfsv z5@1`Ngl@+Km zCn2<$rGi3Q8W}*-Zm~=cA;6I`LPNnu`>qV_DriJhu*TCdmv9=Ea5&^jts>Gy!zxFF zY%?)ajzLsP9#~Tu*OST#ICx44!g`)m6KGtRu3Yw^#S8(1gcLe(reJhLmKazs8WBQ^ zS(q4PxIFgc1Ge3{=j^Xe);9Z)m&-3c{2Lu1u-(olw%hyL@kg8O?b!qEpY6Gu?U0zc zGprzv0fNx7&9P+ZWHf?e@+|Oc)~ej=JCZpTQBsr#H0+5?X}Lk%o*+zTg~b zY?J`8#p4$f4<+}ms{N)vnvh=MtZX)4-SJ~#8<^XsdZ>1e4-#Nm|I3F*mYsBF`7KaP z4JmfDZAIv&NH*6UGxBntFJRKpu>ycK`2W5{yT?!gx(&Xg`Py_NgMI_T4ZHlGC^yL3 zmw#Wp{_W4pe~!KZ!Q<5^@l>O9 http://aida.freehep.org/ +> http://www.cern.ch/PI Sources ------- diff --git a/examples/advanced/xray_telescope/include/XrayTelAnalysis.hh b/examples/advanced/xray_telescope/include/XrayTelAnalysis.hh index 549e00265c..891761f6ab 100644 --- a/examples/advanced/xray_telescope/include/XrayTelAnalysis.hh +++ b/examples/advanced/xray_telescope/include/XrayTelAnalysis.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: XrayTelAnalysis.hh,v 1.7 2003/06/16 16:46:56 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: XrayTelAnalysis.hh,v 1.8 2004/05/28 15:56:58 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Author: A. Pfeiffer (Andreas.Pfeiffer@cern.ch) // (copy of his UserAnalyser class) @@ -108,9 +108,9 @@ private: XrayTelAnalysis(); -#ifdef G4ANALYSIS_USE_PLOTTER - void plotAll(); -#endif +// #ifdef G4ANALYSIS_USE_PLOTTER +// void plotAll(); +// #endif static XrayTelAnalysis* instance; #ifdef G4ANALYSIS_USE @@ -118,10 +118,10 @@ private: AIDA::ITree *tree; AIDA::IHistogramFactory *histoFactory; AIDA::ITupleFactory *tupleFactory; -#ifdef G4ANALYSIS_USE_PLOTTER - AIDA::IPlotterFactory *plotterFactory; - AIDA::IPlotter *plotter; -#endif +// #ifdef G4ANALYSIS_USE_PLOTTER +// AIDA::IPlotterFactory *plotterFactory; +// AIDA::IPlotter *plotter; +// #endif #endif // Quantities for the ntuple G4double eKin; @@ -135,7 +135,11 @@ private: G4String asciiFileName; G4String histFileName; G4String histFileType; - + AIDA::IHistogram1D *h1; + AIDA::IHistogram2D *h2; + AIDA::IHistogram1D *h3; + AIDA::IHistogram2D *h4; + AIDA::ITuple * ntuple; // std::ofstream asciiFile; }; diff --git a/examples/advanced/xray_telescope/src/XrayTelAnalysis.cc b/examples/advanced/xray_telescope/src/XrayTelAnalysis.cc index 9f904133e2..2900c15a14 100644 --- a/examples/advanced/xray_telescope/src/XrayTelAnalysis.cc +++ b/examples/advanced/xray_telescope/src/XrayTelAnalysis.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: XrayTelAnalysis.cc,v 1.10 2003/08/13 13:06:02 santin Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: XrayTelAnalysis.cc,v 1.11 2004/05/28 15:56:59 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Author: A. Pfeiffer (Andreas.Pfeiffer@cern.ch) // (copied from his UserAnalyser class) @@ -51,11 +51,11 @@ XrayTelAnalysis::XrayTelAnalysis() : analysisFactory(0) , tree(0) , histoFactory(0) - , tupleFactory(0) -#ifdef G4ANALYSIS_USE_PLOTTER - , plotterFactory(0) - , plotter(0) -#endif + , tupleFactory(0), h1(0), h2(0), h3(0), h4(0), ntuple(0) +// #ifdef G4ANALYSIS_USE_PLOTTER +// , plotterFactory(0) +// , plotter(0) +// #endif #endif { #ifdef G4ANALYSIS_USE @@ -74,10 +74,10 @@ XrayTelAnalysis::~XrayTelAnalysis() { #ifdef G4ANALYSIS_USE -#ifdef G4ANALYSIS_USE_PLOTTER - if (plotterFactory) delete plotterFactory; - plotterFactory = 0; -#endif +// #ifdef G4ANALYSIS_USE_PLOTTER +// if (plotterFactory) delete plotterFactory; +// plotterFactory = 0; +// #endif if (tupleFactory) delete tupleFactory; tupleFactory = 0; @@ -107,7 +107,7 @@ void XrayTelAnalysis::book() analysisFactory = AIDA_createAnalysisFactory(); if(analysisFactory) { //parameters for the TreeFactory - G4bool fileExists = false; + G4bool fileExists = true; G4bool readOnly = false; AIDA::ITreeFactory* treeFactory = analysisFactory->createTreeFactory(); if(treeFactory) { @@ -125,17 +125,15 @@ void XrayTelAnalysis::book() tupleFactory = analysisFactory->createTupleFactory ( *tree ); // Book histograms - histoFactory->createHistogram1D("1","Energy, all /keV", 100,0.,100.); - histoFactory->createHistogram2D("2","y-z, all /mm", 100,-500.,500.,100,-500.,500.); - histoFactory->createHistogram1D("3","Energy, entering detector /keV", 500,0.,500.); - histoFactory->createHistogram2D("4","y-z, entering detector /mm", 200,-50.,50.,200,-50.,50.); + h1 = histoFactory->createHistogram1D("1","Energy, all /keV", 100,0.,100.); + h2 = histoFactory->createHistogram2D("2","y-z, all /mm", 100,-500.,500.,100,-500.,500.); + h3 = histoFactory->createHistogram1D("3","Energy, entering detector /keV", 500,0.,500.); + h4 = histoFactory->createHistogram2D("4","y-z, entering detector /mm", 200,-50.,50.,200,-50.,50.); // Book ntuples - AIDA::ITuple* ntuple10 = tupleFactory->create( "10", "Track ntuple", + ntuple = tupleFactory->create( "10", "Track ntuple", "double energy,x,y,z,dirx,diry,dirz" ); - assert(ntuple10); - - } + } delete treeFactory; } } @@ -148,11 +146,11 @@ void XrayTelAnalysis::finish() #ifdef G4ANALYSIS_USE if (tree) { // Committing the transaction with the tree - std::cout << "Committing..." << std::endl; + G4cout << "Committing..." << G4endl; // write all histograms to file tree->commit(); - std::cout << "Closing the tree..." << std::endl; + G4cout << "Closing the tree..." << G4endl; // close (will again commit) tree->close(); @@ -161,9 +159,9 @@ void XrayTelAnalysis::finish() // extra delete as objects are created in book() method rather than during // initialisation of class -#ifdef G4ANALYSIS_USE_PLOTTER - if (plotterFactory) delete plotterFactory; -#endif +// #ifdef G4ANALYSIS_USE_PLOTTER +// if (plotterFactory) delete plotterFactory; +// #endif if (tupleFactory) delete tupleFactory; if (histoFactory) delete histoFactory; @@ -185,27 +183,25 @@ void XrayTelAnalysis::analyseStepping(const G4Track& track, G4bool entering) #ifdef G4ANALYSIS_USE // Fill histograms, all tracks - AIDA::IHistogram1D* h1 = dynamic_cast ( tree->find("1") ); + h1->fill(eKin); // fill(x,y,weight) - AIDA::IHistogram2D* h2 = dynamic_cast ( tree->find("2") ); + h2->fill(y,z); // Fill histograms and ntuple, tracks entering the detector if (entering) { // Fill and plot histograms - AIDA::IHistogram1D* h3 = dynamic_cast ( tree->find("3") ); + h3->fill(eKin); - AIDA::IHistogram2D* h4 = dynamic_cast ( tree->find("4") ); + h4->fill(y,z); -#ifdef G4ANALYSIS_USE_PLOTTER - plotAll(); -#endif +// #ifdef G4ANALYSIS_USE_PLOTTER +// plotAll(); +// #endif } // Fill ntuple if (entering) { - - AIDA::ITuple * ntuple = dynamic_cast ( tree->find("10") ); if (ntuple) { // Fill the secondaries ntuple ntuple->fill( ntuple->findColumn( "energy" ), (G4double) eKin ); @@ -255,40 +251,40 @@ void XrayTelAnalysis::analyseStepping(const G4Track& track, G4bool entering) } -#ifdef G4ANALYSIS_USE_PLOTTER -void XrayTelAnalysis::plotAll() -{ - if (!plotter) { - AIDA::IPlotterFactory* plotterFactory = - analysisFactory->createPlotterFactory(); - if(plotterFactory) { - G4cout << "Creating the Plotter" << G4endl; - plotter = plotterFactory->create(); - if(plotter) { - // Map the plotter on screen : - G4cout << "Showing the Plotter on screen" << G4endl; - plotter->show(); - } else { - G4cout << "XrayTelAnalysis::plotAll: WARNING: Plotter not created" << G4endl; - } - delete plotterFactory; - } else { - G4cout << "XrayTelAnalysis::plotAll: WARNING: Plotter Factory not created" << G4endl; - } - } +// #ifdef G4ANALYSIS_USE_PLOTTER +// void XrayTelAnalysis::plotAll() +// { +// if (!plotter) { +// AIDA::IPlotterFactory* plotterFactory = +// analysisFactory->createPlotterFactory(); +// if(plotterFactory) { +// G4cout << "Creating the Plotter" << G4endl; +// plotter = plotterFactory->create(); +// if(plotter) { +// // Map the plotter on screen : +// G4cout << "Showing the Plotter on screen" << G4endl; +// plotter->show(); +// } else { +// G4cout << "XrayTelAnalysis::plotAll: WARNING: Plotter not created" << G4endl; +// } +// delete plotterFactory; +// } else { +// G4cout << "XrayTelAnalysis::plotAll: WARNING: Plotter Factory not created" << G4endl; +// } +// } - if (plotter) { - plotter->createRegions(2,1,0); - AIDA::IHistogram1D* hp = dynamic_cast ( tree->find("3") ); - AIDA::IHistogram1D& h = *hp; - (plotter->currentRegion()).plot(h); - plotter->refresh(); - plotter->setCurrentRegionNumber(1); - AIDA::IHistogram1D* hp2 = dynamic_cast ( tree->find("1") ); - AIDA::IHistogram1D& h2 = *hp2; - (plotter->currentRegion()).plot(h2); - plotter->refresh(); - } -} -#endif +// if (plotter) { +// plotter->createRegions(2,1,0); +// AIDA::IHistogram1D* hp = dynamic_cast ( tree->find("3") ); +// AIDA::IHistogram1D& h = *hp; +// (plotter->currentRegion()).plot(h); +// plotter->refresh(); +// plotter->setCurrentRegionNumber(1); +// AIDA::IHistogram1D* hp2 = dynamic_cast ( tree->find("1") ); +// AIDA::IHistogram1D& h2 = *hp2; +// (plotter->currentRegion()).plot(h2); +// plotter->refresh(); +// } +// } +// #endif diff --git a/examples/advanced/xray_telescope/src/XrayTelPhysicsList.cc b/examples/advanced/xray_telescope/src/XrayTelPhysicsList.cc index 4ccf42fabe..3ba46f7851 100644 --- a/examples/advanced/xray_telescope/src/XrayTelPhysicsList.cc +++ b/examples/advanced/xray_telescope/src/XrayTelPhysicsList.cc @@ -227,7 +227,7 @@ void XrayTelPhysicsList::SetCuts() SetCutValue(cutForProton, "proton"); SetCutValue(cutForProton, "anti_proton"); - SetCutValueForOthers(defaultCutValue); + // SetCutValueForOthers(defaultCutValue); if (verboseLevel >1) { DumpCutValuesTable(); diff --git a/examples/advanced/xray_telescope/src/XrayTelSteppingAction.cc b/examples/advanced/xray_telescope/src/XrayTelSteppingAction.cc index e21f867488..8ec8466e8a 100644 --- a/examples/advanced/xray_telescope/src/XrayTelSteppingAction.cc +++ b/examples/advanced/xray_telescope/src/XrayTelSteppingAction.cc @@ -103,10 +103,11 @@ void XrayTelSteppingAction::UserSteppingAction(const G4Step* step) XrayTelRunAction* runAction = (XrayTelRunAction*) runManager->GetUserRunAction(); runAction->Update(track->GetKineticEnergy()); } - +#ifdef G4ANALYSIS_USE // Do the analysis related to this step XrayTelAnalysis* analysis = XrayTelAnalysis::getInstance(); analysis->analyseStepping(*track,entering); +#endif } diff --git a/examples/advanced/xray_telescope/test.mac b/examples/advanced/xray_telescope/test.mac index 9733e82d83..315192cff2 100644 --- a/examples/advanced/xray_telescope/test.mac +++ b/examples/advanced/xray_telescope/test.mac @@ -12,7 +12,7 @@ /gps/maxtheta 1. deg /gps/energytype Mono /gps/monoenergy 0.5 MeV -/run/beamOn 100000 +/run/beamOn 1000 diff --git a/examples/advanced/xray_telescope/xraytel.out b/examples/advanced/xray_telescope/xraytel.out index e0cb4dedcc..45fedc9682 100644 --- a/examples/advanced/xray_telescope/xraytel.out +++ b/examples/advanced/xray_telescope/xraytel.out @@ -5,3 +5,141 @@ Energy (keV) x (mm) y (mm) z (mm) 36.365 599.484 18.159 -18.523 470.381 599.484 3.447 5.493 451.996 599.484 -19.986 -1.455 +Energy (keV) x (mm) y (mm) z (mm) + + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 +Energy (keV) x (mm) y (mm) z (mm) + + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 + 1000.000 0.000 0.000 -32.500 +Energy (keV) x (mm) y (mm) z (mm) + +Energy (keV) x (mm) y (mm) z (mm) + +Energy (keV) x (mm) y (mm) z (mm) + +Energy (keV) x (mm) y (mm) z (mm) + +Energy (keV) x (mm) y (mm) z (mm) + + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 + 1000.00020267143300.719 0.000 -32.500 +Energy (keV) x (mm) y (mm) z (mm) + +Energy (keV) x (mm) y (mm) z (mm) + diff --git a/examples/extended/analysis/A01/History b/examples/extended/analysis/A01/History index 5c2bbb8ac3..e8a411c53c 100644 --- a/examples/extended/analysis/A01/History +++ b/examples/extended/analysis/A01/History @@ -1,4 +1,4 @@ -$Id: History,v 1.22 2004/02/09 22:21:58 asaim Exp $ +$Id: History,v 1.24 2004/05/27 17:44:45 duns Exp $ ------------------------------------------------------------------- ========================================================= @@ -11,9 +11,15 @@ $Id: History,v 1.22 2004/02/09 22:21:58 asaim Exp $ --------------------------------------------------------------------------- +27th May 2004 Mark Donszelmann (exampleA01-V06-01-01) +- Updated Mac file to write separate geometry. + +26th May 2004 Mark Donszelmann (exampleA01-V06-01-00) +- Updated mac files for HepRep2 driver to set zoom factor and coordinate system. + 9th February 2004 Makoto Asai (exampleA01-V06-00-00) - Fix EM part of the physics list to use the new - processes introduced at 6.0. + processes introduced at 6.0. - Reference output is updated accordingly. 1st December 2003 Joseph Perl diff --git a/examples/extended/analysis/A01/heprep2-000-gz.mac b/examples/extended/analysis/A01/heprep2-000-gz.mac index 2f9a8826fb..5abbd34dc1 100644 --- a/examples/extended/analysis/A01/heprep2-000-gz.mac +++ b/examples/extended/analysis/A01/heprep2-000-gz.mac @@ -17,7 +17,9 @@ # Edit the next line(s) to choose another graphic system # /vis/open HepRepXML +/vis/heprep/setCoordinateSystem zxy /vis/viewer/set/culling global false +/vis/viewer/zoom 0.0001 #/vis/scene/endOfEventAction accumulate # # Add volume to scene diff --git a/examples/extended/analysis/A01/heprep2-000-zip.mac b/examples/extended/analysis/A01/heprep2-000-zip.mac index 35e5421d17..af0b5758b9 100644 --- a/examples/extended/analysis/A01/heprep2-000-zip.mac +++ b/examples/extended/analysis/A01/heprep2-000-zip.mac @@ -17,7 +17,9 @@ # Edit the next line(s) to choose another graphic system # /vis/open HepRepXML +/vis/heprep/setCoordinateSystem zxy /vis/viewer/set/culling global false +/vis/viewer/zoom 0.0001 #/vis/scene/endOfEventAction accumulate # # Add volume to scene diff --git a/examples/extended/analysis/A01/heprep2.mac b/examples/extended/analysis/A01/heprep2.mac index a900a70973..bf1681a4ff 100644 --- a/examples/extended/analysis/A01/heprep2.mac +++ b/examples/extended/analysis/A01/heprep2.mac @@ -12,7 +12,10 @@ # Edit the next line(s) to choose another graphic system # /vis/open HepRepXML +/vis/heprep/setCoordinateSystem zxy /vis/viewer/set/culling global false +/vis/viewer/zoom 0.0001 +#/vis/viewer/set/viewpointThetaPhi 20 40 deg #/vis/scene/endOfEventAction accumulate # # Add volume to scene diff --git a/examples/extended/analysis/A01/heprep2gz.mac b/examples/extended/analysis/A01/heprep2gz.mac index 3da08a6281..a9bdd3dfad 100644 --- a/examples/extended/analysis/A01/heprep2gz.mac +++ b/examples/extended/analysis/A01/heprep2gz.mac @@ -15,7 +15,9 @@ # Edit the next line(s) to choose another graphic system # /vis/open HepRepXML +/vis/heprep/setCoordinateSystem zxy /vis/viewer/set/culling global false +/vis/viewer/zoom 0.0001 # # Add volume to scene # diff --git a/examples/extended/analysis/A01/heprep2zip.mac b/examples/extended/analysis/A01/heprep2zip.mac index 3473e4bad6..75c7ed28ca 100644 --- a/examples/extended/analysis/A01/heprep2zip.mac +++ b/examples/extended/analysis/A01/heprep2zip.mac @@ -15,7 +15,10 @@ # Edit the next line(s) to choose another graphic system # /vis/open HepRepXML +/vis/heprep/appendGeometry false +/vis/heprep/setCoordinateSystem zxy /vis/viewer/set/culling global false +/vis/viewer/zoom 0.0001 # # Add volume to scene # diff --git a/examples/extended/biasing/B01/exampleB01.out b/examples/extended/biasing/B01/exampleB01.out index f92bf95a9c..5cafaf12c5 100644 --- a/examples/extended/biasing/B01/exampleB01.out +++ b/examples/extended/biasing/B01/exampleB01.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -149,8 +149,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -159,7 +159,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -177,7 +177,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -185,26 +185,26 @@ msc: Model variant of multiple scattering for pi- Lambda tables from 100 eV to 100 TeV in 120 bins. Boundary algorithm is active with facrange= 0.199 Volume name | Importance| Tr.Entering| Population| Collisions| Coll*WGT| NumWGTedE| FluxWGTedE| Av.Tr.WGT| -cell_01_rep:0............ | 1 | 106 | 131 | 120 | 120 | 0.032472038 | 9.2527983 | 1 | -cell_02_rep:0............ | 2 | 72 | 157 | 148 | 74 | 8.9205605 | 9.2174133 | 1 | -cell_03_rep:0............ | 4 | 93 | 212 | 211 | 52.75 | 7.4823819 | 8.5261163 | 1 | -cell_04_rep:0............ | 8 | 112 | 219 | 254 | 31.75 | 3.5008375 | 7.7749792 | 1 | -cell_05_rep:0............ | 16 | 128 | 262 | 321 | 20.0625 | 4.1377944 | 7.7074206 | 1 | -cell_06_rep:0............ | 32 | 134 | 297 | 329 | 10.28125 | 6.6014772 | 7.7333631 | 1 | -cell_07_rep:0............ | 64 | 156 | 316 | 391 | 6.109375 | 0.18088036 | 7.4546045 | 1 | -cell_08_rep:0............ | 128 | 184 | 376 | 497 | 3.8828125 | 5.134922 | 6.7888989 | 1 | -cell_09_rep:0............ | 256 | 211 | 445 | 591 | 2.3085938 | 0.061641191 | 6.5983902 | 1 | -cell_10_rep:0............ | 512 | 239 | 494 | 707 | 1.3808594 | 5.1539762 | 6.6420088 | 1 | -cell_11_rep:0............ | 1024 | 260 | 530 | 781 | 0.76269531 | 0.17684092 | 6.5343371 | 1 | -cell_12_rep:0............ | 2048 | 289 | 596 | 928 | 0.453125 | 2.0888873 | 6.0537706 | 1 | -cell_13_rep:0............ | 4096 | 301 | 643 | 1004 | 0.24511719 | 3.6000169 | 5.9038428 | 1 | -cell_14_rep:0............ | 8192 | 327 | 682 | 1112 | 0.13574219 | 3.6317715 | 5.5996676 | 1 | -cell_15_rep:0............ | 16384 | 332 | 673 | 974 | 0.059448242 | 3.4512276 | 5.5878681 | 1 | -cell_16_rep:0............ | 32768 | 360 | 743 | 1194 | 0.036437988 | 3.1622704 | 5.4812661 | 1 | -cell_17_rep:0............ | 65536 | 394 | 812 | 1230 | 0.018768311 | 3.5856689 | 5.5173971 | 1 | -cell_18_rep:0............ | 131072 | 355 | 828 | 1436 | 0.010955811 | 0.23625257 | 5.1653559 | 1 | -rest_rep:0............... | 131072 | 385 | 385 | 0 | 0 | 0 | 0 | 0 | -shieldWorld_rep:0........ | 1 | 10 | 110 | 0 | 0 | 10 | 10 | 1 | +cell_01_rep:0............ | 1 | 110 | 131 | 118 | 118 | 8.5562926 | 9.237997 | 1 | +cell_02_rep:0............ | 2 | 73 | 167 | 174 | 87 | 7.1601913 | 8.7864585 | 1 | +cell_03_rep:0............ | 4 | 88 | 191 | 196 | 49 | 7.5359216 | 8.6869605 | 1 | +cell_04_rep:0............ | 8 | 104 | 214 | 305 | 38.125 | 3.1115996 | 7.4269722 | 1 | +cell_05_rep:0............ | 16 | 105 | 228 | 302 | 18.875 | 3.5556678 | 7.357289 | 1 | +cell_06_rep:0............ | 32 | 110 | 230 | 286 | 8.9375 | 6.3052811 | 7.3525379 | 1 | +cell_07_rep:0............ | 64 | 119 | 256 | 350 | 5.46875 | 5.6560453 | 6.8402582 | 1 | +cell_08_rep:0............ | 128 | 137 | 281 | 407 | 3.1796875 | 4.9128142 | 6.36468 | 1 | +cell_09_rep:0............ | 256 | 158 | 320 | 491 | 1.9179688 | 4.5960987 | 6.3811044 | 1 | +cell_10_rep:0............ | 512 | 183 | 386 | 561 | 1.0957031 | 4.6296183 | 6.3449131 | 1 | +cell_11_rep:0............ | 1024 | 190 | 403 | 606 | 0.59179688 | 4.3429934 | 6.1812327 | 1 | +cell_12_rep:0............ | 2048 | 188 | 381 | 698 | 0.34082031 | 0.036896157 | 5.4227668 | 1 | +cell_13_rep:0............ | 4096 | 211 | 440 | 822 | 0.20068359 | 3.0971965 | 4.9838145 | 1 | +cell_14_rep:0............ | 8192 | 216 | 452 | 781 | 0.095336914 | 3.0991602 | 4.9325683 | 1 | +cell_15_rep:0............ | 16384 | 251 | 510 | 901 | 0.054992676 | 1.9544162 | 4.851316 | 1 | +cell_16_rep:0............ | 32768 | 256 | 516 | 958 | 0.02923584 | 2.5277374 | 4.4940816 | 1 | +cell_17_rep:0............ | 65536 | 290 | 564 | 1105 | 0.016860962 | 2.5106552 | 4.1521405 | 1 | +cell_18_rep:0............ | 131072 | 265 | 624 | 1379 | 0.010520935 | 0.22549469 | 4.019048 | 1 | +rest_rep:0............... | 131072 | 267 | 267 | 0 | 0 | 0 | 0 | 0 | +shieldWorld_rep:0........ | 1 | 10 | 109 | 0 | 0 | 10 | 10 | 1 | === G4ProcessPlacer::RemoveProcess: for: neutron ProcessName: MassImportanceProcess, will be removed! The initial Vectors: diff --git a/examples/extended/biasing/B02/B02plot.py b/examples/extended/biasing/B02/B02plot.py deleted file mode 100644 index cbfc29fa8e..0000000000 --- a/examples/extended/biasing/B02/B02plot.py +++ /dev/null @@ -1,7 +0,0 @@ -# This script may be executed from a lizard session to display -# the histogram in b02.hbook. To create the histogram and the file -# b02.hbook run exampleB02 first. - -tree = tf.create ("b02.hbook", "hbook",1,0) -h = tree.findH1D("10") -hplot(h) diff --git a/examples/extended/biasing/B02/GNUmakefile b/examples/extended/biasing/B02/GNUmakefile index 773b13ec2c..a6295a168b 100644 --- a/examples/extended/biasing/B02/GNUmakefile +++ b/examples/extended/biasing/B02/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.8 2003/06/20 15:32:09 dressel Exp $ +# $Id: GNUmakefile,v 1.9 2004/06/18 15:59:39 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -21,12 +21,9 @@ endif .PHONY: all all: lib bin - - -CPPFLAGS += -#LDFLAGS += -L/usr/local/lib - include $(G4INSTALL)/config/binmake.gmk -CPPFLAGS += `aida-config -i` -LDFLAGS += `aida-config -l` +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +endif diff --git a/examples/extended/biasing/B02/History b/examples/extended/biasing/B02/History new file mode 100644 index 0000000000..892903e8ee --- /dev/null +++ b/examples/extended/biasing/B02/History @@ -0,0 +1,25 @@ +$Id: History,v 1.1 2004/06/18 16:05:17 daquinog Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + 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 * + ---------------------------------------------------------- + +Jun 18th, 2004 G.Daquino - B02-V06-01-00 +- porting B02 from Anaphe (Lizard) to PI. Actually, PI 1.2.1 still DOES NOT + allow the plotting in the same way, previously set in Anaphe. Therefore the + HBOOk file produced at the end of the example still needs other packages to + be displayed. However, future PI releases could contain python modules with + this property. \ No newline at end of file diff --git a/examples/extended/biasing/B02/setupAnaphe.csh b/examples/extended/biasing/B02/setupAnaphe.csh deleted file mode 100755 index 4ee7dff32b..0000000000 --- a/examples/extended/biasing/B02/setupAnaphe.csh +++ /dev/null @@ -1,148 +0,0 @@ -#!/bin/tcsh -x - -#set verbose = 0 - -set release = "5.0.1" -set redHat72 = "redhat72" -set redHat61 = "redhat61" -set redhat73 = "redhat73" -set gcc295 = "gcc-2.95.2" -set gcc296 = "gcc-2.96" -set gcc32 = "gcc-3.2" -set platform = "$redHat72/$gcc295" # default -set COMP = `g++ --version | tail -1` -set os = `uname` -set osVersion = `uname -r` -set unavailable = "Sorry, Anaphe $release is not available for $os, compiler $COMP" - - - -# deal with non-Linux (= Solaris CC 5.3) first -if ($os != "Linux" && ) then - if ($os == "SunOS" && $osVersion == "5.8") then - set platform = "sun4x_58/CC-5.3" - else - echo $unavailable - exit - endif -endif - - -# Linux next. Find Redhat/SuSE flavours -set is61 = "no" -if { grep "6.1" /etc/issue > /dev/null } then - set is61 = "yes" -endif -set is72 = "no" -if { grep "7.2" /etc/issue > /dev/null } then - set is72 = "yes" -endif -set is73 = "no" -if { grep "7.3" /etc/issue > /dev/null } then - set is73 = "yes" -endif -set isSuSE = "no" -if { grep "SuSE" /etc/issue > /dev/null } then - set isSuSE = "yes" -endif -# Constraint: all these vars are now "yes" or "no" - - -# deal with SuSE -if ($isSuSE == "yes") then - echo "Found SuSE distribution" - if ($is72 == "yes") then # SuSE 7.2 is compatible with RH61 - # use Red Hat 6.1 / gcc-2.95.2 for SuSE 7.2 (gcc-2.95.3) - set platform = "$redHat61/$gcc295" - else - echo "Unknown version of SuSE - please report to HepLib.Support@cern.ch" - echo "/etc/issue contains:" - cat /etc/issue - exit - endif -endif - - -# deal with non-SuSE - assumed to be Red Hat (but might be wrong..!) -if ($isSuSE == "no") then - # first deal with Red Hat 6.1 - if ($is61 == "yes") then - if ($COMP == "gcc-2.96") then - echo $unavailable - exit - else if ($COMP == "2.95.2") then - set platform = "redhat61/gcc-2.95.2" - else - set platform = "redhat61/egcs_1.1.2" # assumption! - endif - endif - # now deal with Red Hat 7.2 - if ($is72 == "yes") then - if ($COMP == "gcc-2.96") then - echo $unavailable - exit - else if ($COMP == "2.95.2") then - set platform = "redhat72/gcc-2.95.2" - else - set platform = "redhat72/gcc-3.2" # assumption! - endif - endif - # finally deal with Red Hat 7.3 - else if ($is73 == "yes") then - if ( $COMP == "gcc-2.96" ) then - echo $unavailable - exit - else if ( $COMP == "gcc-2.95.2" ) then - set platform = "redhat73/gcc-2.95.2" - else - set platform = "redhat73/gcc-3.2" # assumption! - endif - endif -else - echo $unavailable -endif - - - -setenv PLATF $platform - - - -if ($?AIDA_DIR == 0) then - setenv AIDA_DIR /afs/cern.ch/sw/contrib/AIDA/3.0/src/cpp -endif - -if ($?ANAPHETOP == 0) then - setenv ANAPHETOP /afs/cern.ch/sw/lhcxx -endif - -# add to PATH and LD_LIBRARY_PATH, but only if not already present ... -set pubDom = "${ANAPHETOP}/specific/${PLATF}/PublicDomainPackages/2.0.0" - -if ( { echo $PATH | grep $pubDom } == 0 ) then - setenv PATH "${pubDom}/bin:${PATH}" -endif - -if ( $?LD_LIBRARY_PATH == 0 ) then - setenv LD_LIBRARY_PATH "${pubDom}/lib" -else if ( { echo $LD_LIBRARY_PATH | grep $pubDom } == 0 ) then - setenv LD_LIBRARY_PATH "${pubDom}/lib:${LD_LIBRARY_PATH}" -endif - -set releaseDirectory = "${ANAPHETOP}/specific/${PLATF}/${release}" - -if ( { echo $PATH | grep $releaseDirectory } == 0 ) then - setenv PATH "${releaseDirectory}/bin:${PATH}" -endif - -if ( { echo $LD_LIBRARY_PATH | grep $releaseDirectory } == 0 ) then - setenv LD_LIBRARY_PATH "${releaseDirectory}/lib:${LD_LIBRARY_PATH}" -endif - -if ( $?GRACE_HOME == 0 ) then - setenv GRACE_HOME "${pubDom}/grace" -endif - -if ( { echo $PATH | grep $GRACE_HOME } == 0 ) then - setenv PATH "${GRACE_HOME}/bin:${PATH}" -endif diff --git a/examples/extended/biasing/B02/setupPI.csh b/examples/extended/biasing/B02/setupPI.csh new file mode 100755 index 0000000000..911dc2ee7f --- /dev/null +++ b/examples/extended/biasing/B02/setupPI.csh @@ -0,0 +1,63 @@ +#!/bin/tcsh -x + +#set verbose = 0 + +if (${?PI_BASE_DIR} == 1) then + setenv PI_VERSION 1_2_1 + setenv PI_VER 1.2.1 + setenv PLATF rh73_gcc32 + setenv PATH ${PATH}:${PI_BASE_DIR}/${PI_VER}/app/releases/PI/PI_${PI_VER}/${PLATF}/bin + setenv PATH ${PI_BASE_DIR}/Linux-g++/bin:$PATH + eval `aida-config -r csh` +# +# python from PI +# + setenv PYTHONVERSION 2.2 + setenv PYTHON_INCLUDE_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/include/python${PYTHONVERSION} + setenv PYTHON_LIB_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/lib/python${PYTHONVERSION}/config +# +# python for PI +if (${?PYTHONPATH} == 0) then + setenv PYTHONPATH +endif + setenv PYTHONPATH ${PI_BASE_DIR}/Linux-g++/python:$PYTHONPATH + setenv PYTHONPATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/${PLATF}/lib:$PYTHONPATH +# +# +else # not using PI + + echo "-- WARNING: histograms are not activated !" + echo " Either PI_BASE_DIR are not set." + # + if ( ${?PYTHONVERSION} == 1 && \ + ${?PYTHON_BASE_DIR} == 1 && \ + ${?CLHEP_BASE_DIR} == 1) then # settings without PI + setenv PYTHON_LIB_DIR ${PYTHON_BASE_DIR}/lib/python${PYTHONVERSION}/config + setenv PYTHON_INCLUDE_DIR ${PYTHON_BASE_DIR}/include/python${PYTHONVERSION} + # + if ( ! -d $PYTHON_LIB_DIR ) then + echo -- ERROR: no pyhton lib/config directory: $PYTHON_LIB_DIR + endif + if ( ! -d $PYTHON_INCLUDE_DIR ) then + echo -- ERROR: no pyhton include directory: $PYTHON_INCLUDE_DIR + endif + else # environment not completed in case no PI is used + echo "-- ERROR: PYTHONVERSION or PYTHON_BASE_DIR or CLHEP_BASE_DIR not set!" exit + endif + +endif # end settings for not using PI + +if ( ${?LD_LIBRARY_PATH} == 0 ) then + setenv LD_LIBRARY_PATH +endif + +setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/lib/${G4SYSTEM} +setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${PYTHON_LIB_DIR} +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH /afs/cern.ch/sw/lcg/external/Python/2.2.2/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/external/Boost/1.30.2/rh73_gcc32/lib:$LD_LIBRARY_PATH + +if (${?PYTHONPATH} == 0) then + setenv PYTHONPATH +endif +setenv PYTHONPATH ${PYTHONPATH}:${LD_LIBRARY_PATH} diff --git a/examples/extended/biasing/B03/B03RunApplication.py b/examples/extended/biasing/B03/B03RunApplication.py index d081fadd27..1a1a0f6816 100755 --- a/examples/extended/biasing/B03/B03RunApplication.py +++ b/examples/extended/biasing/B03/B03RunApplication.py @@ -8,13 +8,13 @@ # This example needs python2.2 http://www.python.org or later. # -# This script may be used without or with ANAPHE e.g. lizard. -# Without lizard: just execute this file. -# With lizard: start lizard and than do +# This script may be used without or with PI. +# Without python: just execute this file. +# With python: start python2.2 and then do # execfile("B03RunApplication.py") import string - +from PyAida import * execfile("B03Application.py") #executing the application could be done "by hand" @@ -27,19 +27,17 @@ Bapp.setupSampler() Bapp.run(30) -# using lizard and ANAPHE to create a histogram -# check if lizrd is loaded by looking for the af instance of the AnalysisFactory -if 'af' in dir(): - tr = tf.create() - hf = af.createHistogramFactory(tr) - n = Bapp.nevents - minm = int(min(Bapp.messurements))-0.5 - maxm = int(max(Bapp.messurements)+1)+0.5 - h = hf.createHistogram1D ("10","Tracks entering in " + - '%(n)d' % vars() + - " events",30, minm, maxm) - for v in Bapp.messurements: - h.fill(v) - - hplot(h) +# using PI to create a histogram +if 'af' in dir(): + tr = tf.create("TracksEntering.hbook","hbook") + hf = af.createHistogramFactory(tr) + n = Bapp.nevents + minm = int(min(Bapp.messurements))-0.5 + maxm = int(max(Bapp.messurements)+1)+0.5 + h = hf.createHistogram1D ("10","Tracks entering in " + '%(n)d' % vars() + " events",30, minm, maxm) + for v in Bapp.messurements: + h.fill(v) +# hplot(h) +tr.commit() +tr.close() diff --git a/examples/extended/biasing/B03/GNUmakefile b/examples/extended/biasing/B03/GNUmakefile index ff3ffd1684..e64b74a1fa 100644 --- a/examples/extended/biasing/B03/GNUmakefile +++ b/examples/extended/biasing/B03/GNUmakefile @@ -1,23 +1,21 @@ -# $Id: GNUmakefile,v 1.11 2003/06/30 16:40:27 dressel Exp $ +# $Id: GNUmakefile,v 1.12 2004/06/20 17:26:13 daquinog Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- # -# The variable PYTHON_DIR has to be setup. See ../README. +# The variable PI_BASE_DIR has to be setup. See ../README. # name := exampleB03 G4TARGET := $(name) G4EXLIB := true - ifndef G4INSTALL G4INSTALL = ../../.. endif include $(G4INSTALL)/config/architecture.gmk - SWIGINC = include/B03App.i SWIGCC = src/B03App_wrap.cc SWIGD = $(G4WORKDIR)/tmp/$(G4SYSTEM)/exampleB03/B03App_wrap.d @@ -26,27 +24,29 @@ SWIGSO = $(G4WORKDIR)/tmp/$(G4SYSTEM)/exampleB03/_B03App.so moduleName = B03App - MYLIBS = $(subst -l$(name),,$(LDLIBS)) -SWIG = $(ANAPHETOP)/specific/$(PLATF)/PublicDomainPackages/2.0.0/bin/swig-1.3.15 +SWIG = ${SWIG_BASE_DIR}/bin/swig-${SWIGVERSION} - -.PHONY: all +.PHONY: clean_all all all: $(SWIGD) $(SWIGCC) lib $(SWIGSO) bin -CPPFLAGS += -I$(ANAPHETOP)/specific/$(PLATF)/PublicDomainPackages/2.0.0/include/python$(PYTHON_VERSION) +CPPFLAGS += -I${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/include/python${PYTHONVERSION} CXXFLAGS += -w - LDFLAGS += \ - -L$(ANAPHETOP)/specific/$(PLATF)/PublicDomainPackages/2.0.0/lib/python$(PYTHON_VERSION)/config \ + -L${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/lib/python${PYTHONVERSION}/config \ -L/lib \ - -lnsl -ldl -lreadline /lib/libtermcap.so.2 -lieee -lpthread -lutil -lexampleB03 -lpython$(PYTHON_VERSION) + -lnsl -ldl -lreadline /lib/libtermcap.so.2 -lieee -lpthread -lutil -lexampleB03 -lpython$(PYTHONVERSION) include $(G4INSTALL)/config/binmake.gmk +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +endif + $(SWIGSO): $(objectfilesWrapper) @echo Creating shared library: $@ $(CXX) -Wl,-soname,$(@F) -shared $(LDFLAGS) $(objectfilesWrapper) $(MYLIBS) -lc -o $(SWIGSO) @@ -60,6 +60,12 @@ ${G4WORKDIR}/tmp/${G4SYSTEM}/$(name): @mkdir ${G4WORKDIR}/tmp/${G4SYSTEM}/$(name) +clean_all: clean + @rm -f B03App.pyc + @rm B03App.py + @rm src/B03App_wrap.cc + + #libdir = $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name) #objectfiles = $(shell /bin/ls $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(name)/*.o) #_B03App.so: diff --git a/examples/extended/biasing/B03/History b/examples/extended/biasing/B03/History new file mode 100644 index 0000000000..262831e4f1 --- /dev/null +++ b/examples/extended/biasing/B03/History @@ -0,0 +1,26 @@ +$Id: History,v 1.1 2004/06/20 17:26:14 daquinog Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + 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 * + ---------------------------------------------------------- + +Jun 20th, 2004 G.Daquino - B03-V06-01-00 +- porting B03 from Anaphe (Lizard) to PI. Actually, PI 1.2.1 still DOES NOT + allow the plotting in the same way, previously set in Anaphe. Therefore the + HBOOk file produced at the end of the example still needs other packages to + be displayed. However, future PI releases could contain python modules with + this property. + README file has been updated accordingly. \ No newline at end of file diff --git a/examples/extended/biasing/B03/setupPI.csh b/examples/extended/biasing/B03/setupPI.csh new file mode 100644 index 0000000000..0cab74c66f --- /dev/null +++ b/examples/extended/biasing/B03/setupPI.csh @@ -0,0 +1,73 @@ +# #Id: setupPI.csh,v 1.6 2004/06/19 17:22:46 daquinog Exp $ +# ------------------------------------------------------------------- +# GEANT4 tag $Name: geant4-06-02 $ +# ------------------------------------------------------------------- + +# before sourcing this script make sure you have set the +# environment variables according to the description in README + +# setting in case PI and analysis is used +if (${?PI_BASE_DIR} == 1) then + setenv PI_VERSION 1_2_1 + setenv PI_VER 1.2.1 + setenv PLATF rh73_gcc32 + setenv PATH ${PATH}:${PI_BASE_DIR}/${PI_VER}/app/releases/PI/PI_${PI_VER}/${PLATF}/bin + setenv PATH ${PI_BASE_DIR}/Linux-g++/bin:$PATH + eval `aida-config -r csh` +# +# python from PI +# + setenv PYTHONVERSION 2.2 + setenv PYTHON_INCLUDE_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/include/python${PYTHONVERSION} + setenv PYTHON_LIB_DIR ${PI_BASE_DIR}/${PI_VER}/external/Python/2.2.2/${PLATF}/lib/python${PYTHONVERSION}/config +# +# python for PI +if (${?PYTHONPATH} == 0) then + setenv PYTHONPATH +endif + setenv PYTHONPATH ${PI_BASE_DIR}/Linux-g++/python:$PYTHONPATH + setenv PYTHONPATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/${PLATF}/lib:$PYTHONPATH +# +# SWIG settings +setenv SWIGVERSION 1.3.15 +# +else # not using PI + + echo "-- WARNING: histograms are not activated !" + echo " Either PI_BASE_DIR are not set." + # + if ( ${?PYTHONVERSION} == 1 && \ + ${?PYTHON_BASE_DIR} == 1 && \ + ${?SWIG_BASE_DIR} == 1 && \ + ${?SWIG_VERSION} == 1 && \ + ${?CLHEP_BASE_DIR} == 1) then # settings without PI + setenv PYTHON_LIB_DIR ${PYTHON_BASE_DIR}/lib/python${PYTHONVERSION}/config + setenv PYTHON_INCLUDE_DIR ${PYTHON_BASE_DIR}/include/python${PYTHONVERSION} + # + if ( ! -d $PYTHON_LIB_DIR ) then + echo -- ERROR: no pyhton lib/config directory: $PYTHON_LIB_DIR + endif + if ( ! -d $PYTHON_INCLUDE_DIR ) then + echo -- ERROR: no pyhton include directory: $PYTHON_INCLUDE_DIR + endif + else # environment not completed in case no PI is used + echo "-- ERROR: PYTHONVERSION or PYTHON_BASE_DIR or CLHEP_BASE_DIR or SWIG_VERSION or SWIG_BASE_DIR not set!" + exit + endif + +endif # end settings for not using PI +# +if ( ${?LD_LIBRARY_PATH} == 0 ) then + setenv LD_LIBRARY_PATH +endif +setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/lib/${G4SYSTEM}:${G4WORKDIR}/tmp/${G4SYSTEM}/exampleB03 +setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${PYTHON_LIB_DIR} +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/app/releases/SEAL/SEAL_1_3_4/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH /afs/cern.ch/sw/lcg/external/Python/2.2.2/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv LD_LIBRARY_PATH ${PI_BASE_DIR}/${PI_VER}/external/Boost/1.30.2/rh73_gcc32/lib:$LD_LIBRARY_PATH +setenv B03_BASE `pwd` +if (${?PYTHONPATH} == 0) then + setenv PYTHONPATH +endif +setenv PYTHONPATH ${PYTHONPATH}:${LD_LIBRARY_PATH} +setenv PYTHONPATH ${PYTHONPATH}:${B03_BASE} diff --git a/examples/extended/biasing/History b/examples/extended/biasing/History index d16879ed5d..b55225ab74 100644 --- a/examples/extended/biasing/History +++ b/examples/extended/biasing/History @@ -1,4 +1,4 @@ -$Id: History,v 1.27 2003/08/25 12:33:52 dressel Exp $ +$Id: History,v 1.28 2004/06/21 09:28:04 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 21st, 2004 G. Daquino - exbiasing-V06-01-00 +- Ported B02 and B03 to AIDA 3.2.1 and PI 1.2.1. + Jul 31th, 2003 M. Dressel - exbiasing-V05-02-02 - added weight window example to B01 diff --git a/examples/extended/biasing/README b/examples/extended/biasing/README index d8ec0b6abc..248c9ddb62 100644 --- a/examples/extended/biasing/README +++ b/examples/extended/biasing/README @@ -58,7 +58,7 @@ importance of the current volumes. Further information: -------------------- Short description of importance sampling and scoring: -http://dressel.home.cern.ch/dressel/biasscore/Sampling.html +http://cern.ch/geant4/working_groups/geometry/biasing/Sampling.html Example B01 =========== @@ -89,90 +89,62 @@ the scoring. In this example one scorer creates a histogram. Compiling and running --------------------- -To compile this example you need AIDA 3.0 installed. To link +Can be compiled and executed on a RedHat-7.3 system with gcc-3.2.3 +compiler and the tcsh shell. +To compile this example you need AIDA 3.2.1 installed. To link and run it you need a AIDA compliant analysis package. The -GNUmakefile of this example shows how to use Anaphe as analysis -package. -The following list shows what to do if you are at CERN using rehat73 -and gcc-3.2 and the tcsh: -1) set the following variables (for example): -setenv ANAPHETOP /afs/cern.ch/sw/lhcxx - (or if installed in opt: /opt/Anaphe/5.0.5) -setenv AIDA_DIR /afs/cern.ch/sw/contrib/AIDA/3.0/src/cpp - (or if installed in opt: /opt/AIDA/3.0.0/3.0.0/AIDA/3.0/src/cpp) - -2) Source the script: -source $ANAPHETOP/share/LHCXX/5.0.5/scripts/setupAnaphe.csh - -This should set the LD_LIBRARY_PATH and the PATH environment to find the -lizrd executable and Anaphe libraries and header files. -It also sets the environment variable PLATF. - -3) and add to lirary path the following directories: -setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/lib/${G4SYSTEM}:${G4WORKDIR}/tmp/${G4SYSTEM}/exampleB02 +GNUmakefile of this example shows how to use AIDA through PI as +analysis interface. +Histograms are saved in HBOOK format. It can be displayed with PAW or +compatible packages. +You need to set the following variables in your environment: + "G4ANALYSIS_USE" + "PI_BASE_DIR" (where PI has been installed) +Finally, source the script setupPI.csh. Now you should be able to run gmake and to run exampleB02. The example stores the plot in the file b02.hbook. -To look at the histogram using lizard you also may use Anaphe 5.0.5 -http://anaphe.web.cern.ch/anaphe/index2.html. - -Files in B02: -B02plot.py: a simple script that may be executed from a lizzard session - to show the plot created by running the exampleB02. +To look at the histogram using lizard you also may use PI 1.2.1 +http://cern.ch/PI. Example B03 =========== This example uses Geant4 and in particular importance sampling and -scoring through python. It creates a simple histogram. It's ment +scoring through python. It creates a simple histogram. It's meant to demonstrate how to use a customized scorer and importance sampling in combination with a scripting language, python. Geant4 code is executed from a python session. Therefore, swig is used to create python shadow classes and to generate the code necessary to use the Geant4 libraries from a python session. -For simplicity it is recommended to use Anaphe. Anaphe comes with -python and swig installations. - See http://anaphe.web.cern.ch/ - - - +It can be built and run using PI: http://cern.ch/PI. +At the end a histogram called "trackentering.hbook" is created and can be +displayed using standard packages (such as PAW). Building, compiling and running ------------------------------- - Follow similar steps as for example B02. If you already have -the environment set up for example B02 jump to point 3 below: +You need to set the following variables in your environment: + "G4ANALYSIS_USE" + "PI_BASE_DIR" (where PI has been installed) + "SWIG_BASE_DIR" (where SWIG 1.3.15 has been installed) +Finally source the script setupPI.csh. -1) set the following variables (for example): -setenv ANAPHETOP /afs/cern.ch/sw/lhcxx - (or if installed in opt: /opt/Anaphe/5.0.5) -setenv AIDA_DIR /afs/cern.ch/sw/contrib/AIDA/3.0/src/cpp - (or if installed in opt: /opt/AIDA/3.0.0/3.0.0/AIDA/3.0/src/cpp) - -2) Source the script: -source $ANAPHETOP/share/LHCXX/5.0.5/scripts/setupAnaphe.csh - -3) and add to lirary path the following directories: -setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:${G4WORKDIR}/lib/${G4SYSTEM}:${G4WORKDIR}/tmp/${G4SYSTEM}/exampleB03 - ==== - setenv PYTHONPATH $LD_LIBRARY_PATH - -4) setenv PYTHON_VERSION 2.2 - - You may run gmake now. - You should be able to execute the file B03RunApplication.py from your +You may run gmake now. +You should be able to execute the file B03RunApplication.py from your shell or from a lizard session now. - The histogram is displayed only if the script is beeing ran -from lizard. +At the moment the plotting is not available using a python script, but +it is planned in future releases. A histogram is created and later displayed +using standard analysis packages. Files in B03; B03Application.py: Is a example class utilizing importance sampling and scoring using python. B03RunApplication.py: Is a python script running the example. - It may be executed from the shell or in a python or lizard - session. In case it is executed from lizard it creates a plot - with a histogram. + It may be executed from the shell or in a python session. B03App.py: Is created by swig using swig. +TracksEntering.hbook: + It is the histogram file created by running B03RunApplication.py diff --git a/examples/extended/electromagnetic/MuonProcesses/GNUmakefile b/examples/extended/electromagnetic/MuonProcesses/GNUmakefile new file mode 100644 index 0000000000..0da5117e9e --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/GNUmakefile @@ -0,0 +1,40 @@ +# $Id: GNUmakefile,v 1.1 2004/06/14 10:09:19 maire Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := MuonProcesses +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../../.. +endif + +.PHONY: all +all: lib bin + +#### G4ANALYSIS_USE := true + +ifdef G4ANALYSIS_USE +USE_AIDA := true +endif + +ifdef USE_AIDA + CPPFLAGS += -DG4ANALYSIS_USE + CPPFLAGS += -DUSE_AIDA +endif + +include $(G4INSTALL)/config/architecture.gmk + +ifdef USE_AIDA + # for the aida-config command see the README file + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +endif + +include $(G4INSTALL)/config/binmake.gmk + +visclean: + rm -f g4*.prim g4*.eps g4*.wrl + rm -f .DAWN_* diff --git a/examples/extended/electromagnetic/MuonProcesses/History b/examples/extended/electromagnetic/MuonProcesses/History new file mode 100644 index 0000000000..da9e3e6a5c --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/History @@ -0,0 +1,23 @@ +$Id: History,v 1.2 2004/06/16 10:46:47 maire Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + PhotonProcesses 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 * + ---------------------------------------------------------- + +16.06.04 V. Ivantchenko (muonprocesses-V06-01-01) +- std::max in MuCrossSections + +14.06.04 Michel Maire (muonprocesses-V06-01-00) +- creation, from A. Bogdanov and R. Kokoulin's TestMu program. + diff --git a/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.cc b/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.cc new file mode 100644 index 0000000000..41cd57999b --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.cc @@ -0,0 +1,121 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: MuonProcesses.cc,v 1.1 2004/06/14 10:09:20 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" +#include "Randomize.hh" + +#include "DetectorConstruction.hh" +#include "PhysicsList.hh" +#include "PrimaryGeneratorAction.hh" + +#include "RunAction.hh" +#include "EventAction.hh" +#include "SteppingAction.hh" +#include "SteppingVerbose.hh" +#include "StackingAction.hh" +#include "HistoManager.hh" + +#ifdef G4VIS_USE + #include "VisManager.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +int main(int argc,char** argv) { + + //choose the Random engine + HepRandom::setTheEngine(new RanecuEngine); + + //my Verbose output class + G4VSteppingVerbose::SetInstance(new SteppingVerbose); + + // Construct the default run manager + G4RunManager * runManager = new G4RunManager; + + // set mandatory initialization classes + DetectorConstruction* det; + PrimaryGeneratorAction* prim; + runManager->SetUserInitialization(det = new DetectorConstruction); + runManager->SetUserInitialization(new PhysicsList); + runManager->SetUserAction(prim = new PrimaryGeneratorAction(det)); + + #ifdef G4VIS_USE + // visualization manager + G4VisManager* visManager = new VisManager; + visManager->Initialize(); + #endif + + HistoManager* histo = 0; +#ifdef G4ANALYSIS_USE + histo = new HistoManager(); +#endif + + // set user action classes + RunAction* run; + runManager->SetUserAction(run = new RunAction(det,prim,histo)); + runManager->SetUserAction(new EventAction); + runManager->SetUserAction(new SteppingAction(run,histo)); + runManager->SetUserAction(new StackingAction); + + // Start execution + // + if (argc > 1) { // execute an argument macro file if exist + G4String command = "/control/execute "; + G4String fileName = argv[1]; + G4UImanager::GetUIpointer()->ApplyCommand(command+fileName); + + } else { // start interactive session + G4UIsession* session = 0; +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif + session->SessionStart(); + delete session; + } + + // job termination + // +#ifdef G4ANALYSIS_USE + delete histo; +#endif +#ifdef G4VIS_USE + delete visManager; +#endif + + delete runManager; + + return 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.in b/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.in new file mode 100644 index 0000000000..1326aa672c --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/MuonProcesses.in @@ -0,0 +1,22 @@ +# $Id: MuonProcesses.in,v 1.1 2004/06/14 10:09:20 maire Exp $ +# +# Macro file for "MuonProcesses.cc" +# (can be run in batch, without graphic) +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Iron +/testem/det/setSize 1 m +# +/testem/phys/addPhysics standard +/testem/phys/setCuts 1 mm +# +/run/initialize +# +/gun/particle mu+ +/gun/energy 10 TeV +# +/testem/event/printModulo 1000 +# +/run/beamOn 10000 diff --git a/examples/extended/electromagnetic/MuonProcesses/README b/examples/extended/electromagnetic/MuonProcesses/README new file mode 100644 index 0000000000..bf8f43eaa6 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/README @@ -0,0 +1,149 @@ +$Id: README,v 1.2 2004/06/23 11:28:04 maire Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + MuonProcesses + ------------- + This example is intended to check implementation of the processes + of muon interactions: ionization, direct (e+,e-) production, + bremsstrahlung, mu-nuclear interaction. + It allows to compute differential cross sections (as function of the + energy tranfered to secondaries), total cross sections and to compare + with analytic calculations. + + 1- GEOMETRY DEFINITION + + It is a single box of homogeneous medium. + Two parameters define the geometry : + - the material of the box, + - the (full) size of the box. + + The default geometry (1 m of Iron) is constructed in + DetectorConstruction, but the above parameters can be changed + interactively via the commands defined in DetectorMessenger. + + 2- PHYSICS LIST + + The physics list contains only electromagnetic processes for muon, + adding G4MuNuclearInteraction and seting of upper energy range limit + to 1000 PeV). + + Standard (default) and g4v52 (frozen at the release Genat4 v.5.2) + physics can be choosen. + + 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 (mu+ 10 TeV), and can be changed via the G4 + build-in commands of ParticleGun class (see the macros provided with + this example). + + 4- PHYSICS + + The incident particle is a muon. During the tracking, secondary particles + are killed. + + The number of interactions are plotted as a function of the energy + transfered to the secondaries. + The total number of interactions is recorded, and the total crossSection + computed from this. + + At EndOfRun, the above results are compared with analytic calculations. + The functions which compute the theoritical crossSections have been + provided by the G4 MEPhI group, and grouped in MuCrossSection class. + + 5- HISTOGRAMS + + The test contains 4 built-in 1D histograms, which are managed by the + HistoManager class and its Messenger. + + 1 Monte-Carlo relative transferred energy distribution histo + (log10(eps/Emu kin) for knock-on electrons (ionization) + 2 -"- direct (e+,e-) pair production + 3 -"- bremsstrahlung + 4 -"- nuclear interaction + + The histos can be activated individually with the command : + /testem/histo/setHisto id nbBins valMin valMax : min and max values of + log10(eps/Emu kin). + + At EndOfRun the corresponding histos for analytic calculations are + automatically created anf filled (histo 6 to 9), and the comparison + (G4 divided by theory) is done in histos 11 to 14. + + The histograms can be viewed using PAW. See below the note on + ANAPHE+AIDA. + + Note that, by default, histograms are disabled. To activate them, + uncomment the flag G4ANALYSIS_USE in GNUmakefile. + + 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 detector has a default view which is a longitudinal view of the + box. + + The tracks are drawn at the end of event, and erased at the end of run. + + 7- HOW TO START ? + + compile and link to generate an executable + % cd geant4/examples/extended/electromagnetic/MuonProcesses + % gmake + + execute MuonProcesses in 'batch' mode from macro files : + % MuonProcesses allproc.mac + + execute MuonProcesses in 'interactive mode' with visualization : + % MuonProcesses + Idle> control/execute vis.mac + .... + Idle> type your commands + .... + Idle> exit + + 8- Using histograms + ------------------- + +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. + +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/MuonProcesses/allproc.mac b/examples/extended/electromagnetic/MuonProcesses/allproc.mac new file mode 100644 index 0000000000..0e7b9c1651 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/allproc.mac @@ -0,0 +1,29 @@ +# $Id: allproc.mac,v 1.1 2004/06/14 10:09:20 maire Exp $ +# +# Macro file for "MuonProcesses.cc" +# (can be run in batch, without graphic) +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Iron +/testem/det/setSize 1 m +# +/testem/phys/addPhysics standard +### /testem/phys/addPhysics g4v52 +# +/testem/phys/setCuts 1 mm +# +/run/initialize +# +/gun/particle mu+ +/gun/energy 10 TeV +# +/testem/histo/setFileName allproc.paw +/testem/histo/setHisto 1 100 -10. 0. +/testem/histo/setHisto 2 100 -10. 0. +/testem/histo/setHisto 3 100 -10. 0. +# +/testem/event/printModulo 1000 +# +/run/beamOn 10000 diff --git a/examples/extended/electromagnetic/MuonProcesses/include/DetectorConstruction.hh b/examples/extended/electromagnetic/MuonProcesses/include/DetectorConstruction.hh new file mode 100644 index 0000000000..d1d4a2a0c5 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/DetectorConstruction.hh @@ -0,0 +1,89 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorConstruction.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorConstruction_h +#define DetectorConstruction_h 1 + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" + +class G4LogicalVolume; +class G4Material; +class DetectorMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorConstruction : public G4VUserDetectorConstruction +{ + public: + + DetectorConstruction(); + ~DetectorConstruction(); + + public: + + G4VPhysicalVolume* Construct(); + + void SetSize (G4double); + void SetMaterial (G4String); + + void UpdateGeometry(); + + public: + + const + G4VPhysicalVolume* GetWorld() {return pBox;}; + + G4double GetSize() {return BoxSize;}; + G4Material* GetMaterial() {return aMaterial;}; + + void PrintParameters(); + + private: + + G4VPhysicalVolume* pBox; + G4LogicalVolume* lBox; + + G4double BoxSize; + G4Material* aMaterial; + + DetectorMessenger* detectorMessenger; + + private: + + void DefineMaterials(); + G4VPhysicalVolume* ConstructVolumes(); +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/DetectorMessenger.hh b/examples/extended/electromagnetic/MuonProcesses/include/DetectorMessenger.hh new file mode 100644 index 0000000000..7d2d87c52f --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/DetectorMessenger.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorMessenger.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorMessenger_h +#define DetectorMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class DetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorMessenger: public G4UImessenger +{ + public: + + DetectorMessenger(DetectorConstruction* ); + ~DetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + + DetectorConstruction* Detector; + + G4UIdirectory* testemDir; + G4UIdirectory* detDir; + G4UIcmdWithAString* MaterCmd; + G4UIcmdWithADoubleAndUnit* SizeCmd; + G4UIcmdWithoutParameter* UpdateCmd; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/EventAction.hh b/examples/extended/electromagnetic/MuonProcesses/include/EventAction.hh new file mode 100644 index 0000000000..0dde2bed6a --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/EventAction.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: EventAction.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef EventAction_h +#define EventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" + +class EventActionMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EventAction : public G4UserEventAction +{ + public: + EventAction(); + ~EventAction(); + + public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + + void SetPrintModulo(G4int val) {printModulo = val;}; + + private: + G4int printModulo; + EventActionMessenger* eventMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/EventActionMessenger.hh b/examples/extended/electromagnetic/MuonProcesses/include/EventActionMessenger.hh new file mode 100644 index 0000000000..4070d63fc0 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/EventActionMessenger.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: EventActionMessenger.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef EventActionMessenger_h +#define EventActionMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class EventAction; +class G4UIdirectory; +class G4UIcmdWithAnInteger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EventActionMessenger: public G4UImessenger +{ + public: + EventActionMessenger(EventAction*); + ~EventActionMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + EventAction* eventAction; + + G4UIdirectory* eventDir; + G4UIcmdWithAnInteger* PrintCmd; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/include/HistoManager.hh b/examples/extended/electromagnetic/MuonProcesses/include/HistoManager.hh new file mode 100644 index 0000000000..388b068baf --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/HistoManager.hh @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoManager.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoManager_h +#define HistoManager_h 1 + +#ifdef USE_AIDA + +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +namespace AIDA { + class ITree; + class IHistogramFactory; + class IHistogram1D; +} + +class HistoMessenger; + + const G4int MaxHisto = 5; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager +{ + public: + + HistoManager(); + ~HistoManager(); + + void SetFileName (G4String name) { fileName = name;}; + void SetFactory (); + void SaveFactory (); + void SetHisto (G4int, G4int, G4double, G4double, G4String unit="none"); + void RemoveHisto (G4int); + + AIDA::ITree* GetTree() {return tree;} + AIDA::IHistogramFactory* GetHistogramFactory() {return hf;} + AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} + G4double GetHistoUnit(G4int id) {return Unit[id];} + G4double GetBinWidth (G4int id) {return Width[id];} + + private: + + G4String fileName; + AIDA::ITree* tree; + AIDA::IHistogramFactory* hf; + AIDA::IHistogram1D* histo[MaxHisto]; + G4bool exist[MaxHisto]; + G4String Label[MaxHisto]; + G4String Title[MaxHisto]; + G4int Nbins[MaxHisto]; + G4double Vmin [MaxHisto]; + G4double Vmax [MaxHisto]; + G4double Unit [MaxHisto]; + G4double Width[MaxHisto]; + G4bool factoryOn; + HistoMessenger* histoMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/HistoMessenger.hh b/examples/extended/electromagnetic/MuonProcesses/include/HistoMessenger.hh new file mode 100644 index 0000000000..8a4ef28229 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/HistoMessenger.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoMessenger.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoMessenger_h +#define HistoMessenger_h 1 + +#ifdef G4ANALYSIS_USE + +#include "G4UImessenger.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager; +class G4UIdirectory; +class G4UIcommand; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoMessenger: public G4UImessenger +{ + public: + + HistoMessenger(HistoManager* ); + ~HistoMessenger(); + + void SetNewValue(G4UIcommand* ,G4String ); + + private: + + HistoManager* histoManager; + + G4UIdirectory* histoDir; + G4UIcmdWithAString* factoryCmd; + G4UIcommand* histoCmd; + G4UIcmdWithAnInteger* rmhistoCmd; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/include/MuCrossSections.hh b/examples/extended/electromagnetic/MuonProcesses/include/MuCrossSections.hh new file mode 100644 index 0000000000..44fa0472fe --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/MuCrossSections.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MuCrossSections.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef MuCrossSections_h +#define MuCrossSections_h 1 + +#include "globals.hh" + +class G4Material; +class G4Element; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class MuCrossSections +{ + public: + MuCrossSections(); + ~MuCrossSections(); + + public: + G4double CR_Macroscopic (G4String, G4Material*, G4double, G4double); + G4double CR_PerAtom (G4String, G4Element* , G4double, G4double); + + private: + G4double CRB_Mephi (G4double, G4double, G4double, G4double); + G4double CRK_Mephi (G4double, G4double, G4double, G4double); + G4double CRN_Mephi (G4double, G4double, G4double, G4double); + G4double CRP_Mephi (G4double, G4double, G4double, G4double); +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + diff --git a/examples/extended/electromagnetic/TestEm2/include/PhysListEmG4v52.hh b/examples/extended/electromagnetic/MuonProcesses/include/PhysListEmG4v52.hh similarity index 95% rename from examples/extended/electromagnetic/TestEm2/include/PhysListEmG4v52.hh rename to examples/extended/electromagnetic/MuonProcesses/include/PhysListEmG4v52.hh index 8a2e4fa80c..1006dbeed0 100644 --- a/examples/extended/electromagnetic/TestEm2/include/PhysListEmG4v52.hh +++ b/examples/extended/electromagnetic/MuonProcesses/include/PhysListEmG4v52.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListEmG4v52.hh,v 1.1 2003/10/08 17:28:36 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmG4v52.hh,v 1.1 2004/06/14 10:09:22 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/include/PhysListGeneral.hh b/examples/extended/electromagnetic/MuonProcesses/include/PhysListEmStandard.hh similarity index 87% rename from examples/extended/electromagnetic/TestEm2/include/PhysListGeneral.hh rename to examples/extended/electromagnetic/MuonProcesses/include/PhysListEmStandard.hh index b9aa7b07a8..366a72b1c5 100644 --- a/examples/extended/electromagnetic/TestEm2/include/PhysListGeneral.hh +++ b/examples/extended/electromagnetic/MuonProcesses/include/PhysListEmStandard.hh @@ -20,26 +20,25 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListGeneral.hh,v 1.1 2003/10/08 17:28:37 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListGeneral_h -#define PhysListGeneral_h 1 +#ifndef PhysListEmStandard_h +#define PhysListEmStandard_h 1 #include "G4VPhysicsConstructor.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListGeneral : public G4VPhysicsConstructor +class PhysListEmStandard : public G4VPhysicsConstructor { public: - PhysListGeneral(const G4String& name = "general"); - ~PhysListGeneral(); + PhysListEmStandard(const G4String& name = "standard"); + ~PhysListEmStandard(); public: // This method is dummy for physics @@ -49,7 +48,6 @@ class PhysListGeneral : public G4VPhysicsConstructor // each physics process will be instantiated and // registered to the process manager of each particle type void ConstructProcess(); - }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/include/PhysicsList.hh b/examples/extended/electromagnetic/MuonProcesses/include/PhysicsList.hh new file mode 100644 index 0000000000..42272438af --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/PhysicsList.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysicsList.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsList_h +#define PhysicsList_h 1 + +#include "G4VModularPhysicsList.hh" +#include "globals.hh" + +class PhysicsListMessenger; +class G4VPhysicsConstructor; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsList: public G4VModularPhysicsList +{ + public: + PhysicsList(); + ~PhysicsList(); + + void ConstructParticle(); + void ConstructProcess(); + void AddPhysicsList(const G4String& name); + + void SetCuts(); + void SetCutForGamma(G4double); + void SetCutForElectron(G4double); + void SetCutForPositron(G4double); + + private: + G4double cutForGamma; + G4double cutForElectron; + G4double cutForPositron; + G4double currentDefaultCut; + + G4VPhysicsConstructor* emPhysicsList; + G4String emName; + + PhysicsListMessenger* pMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/PhysicsListMessenger.hh b/examples/extended/electromagnetic/MuonProcesses/include/PhysicsListMessenger.hh new file mode 100644 index 0000000000..6842c39d39 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/PhysicsListMessenger.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysicsListMessenger.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsListMessenger_h +#define PhysicsListMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class PhysicsList; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithAString; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsListMessenger: public G4UImessenger +{ + public: + + PhysicsListMessenger(PhysicsList* ); + ~PhysicsListMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + + PhysicsList* pPhysicsList; + + G4UIcmdWithADoubleAndUnit* gammaCutCmd; + G4UIcmdWithADoubleAndUnit* electCutCmd; + G4UIcmdWithADoubleAndUnit* protoCutCmd; + G4UIcmdWithADoubleAndUnit* allCutCmd; + G4UIcmdWithAString* pListCmd; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/PrimaryGeneratorAction.hh b/examples/extended/electromagnetic/MuonProcesses/include/PrimaryGeneratorAction.hh new file mode 100644 index 0000000000..847722d493 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/PrimaryGeneratorAction.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PrimaryGeneratorAction.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PrimaryGeneratorAction_h +#define PrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "G4ParticleGun.hh" +#include "globals.hh" + +class G4Event; +class DetectorConstruction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + PrimaryGeneratorAction(DetectorConstruction*); + ~PrimaryGeneratorAction(); + + public: + void GeneratePrimaries(G4Event*); + G4ParticleGun* GetParticleGun() {return particleGun;}; + + private: + G4ParticleGun* particleGun; + DetectorConstruction* detector; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/ProcessesCount.hh b/examples/extended/electromagnetic/MuonProcesses/include/ProcessesCount.hh new file mode 100644 index 0000000000..46082d40f7 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/ProcessesCount.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: ProcessesCount.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef ProcessesCount_HH +#define ProcessesCount_HH + +#include "globals.hh" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class OneProcessCount +{ +public: + OneProcessCount(G4String name) {Name=name; Counter=0;}; + ~OneProcessCount() {}; + +public: + G4String GetName() {return Name;}; + G4int GetCounter() {return Counter;}; + void Count() {Counter++;}; + +private: + G4String Name; // process name + G4int Counter; // process counter +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +typedef std::vector ProcessesCount; + +#endif + + + + + + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/RunAction.hh b/examples/extended/electromagnetic/MuonProcesses/include/RunAction.hh new file mode 100644 index 0000000000..e325166dde --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/RunAction.hh @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RunAction.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef RunAction_h +#define RunAction_h 1 + +#include "G4UserRunAction.hh" +#include "ProcessesCount.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorConstruction; +class PrimaryGeneratorAction; +class HistoManager; + +class G4Run; +class G4Material; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class RunAction : public G4UserRunAction +{ + public: + RunAction(DetectorConstruction*, PrimaryGeneratorAction*, HistoManager*); + ~RunAction(); + + public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + + void CountProcesses(G4String); + + private: + G4double ComputeTheory (G4String, G4int); + G4double GetEnergyCut (G4Material*, G4int); + + private: + DetectorConstruction* detector; + PrimaryGeneratorAction* primary; + ProcessesCount* ProcCounter; + HistoManager* histoManager; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/MuonProcesses/include/StackingAction.hh b/examples/extended/electromagnetic/MuonProcesses/include/StackingAction.hh new file mode 100644 index 0000000000..4cfe566546 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/StackingAction.hh @@ -0,0 +1,51 @@ + +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: StackingAction.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef StackingAction_h +#define StackingAction_h 1 + +#include "G4UserStackingAction.hh" +#include "globals.hh" + +class G4Track; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class StackingAction : public G4UserStackingAction +{ + public: + + StackingAction(); + ~StackingAction(); + + G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track* ); + +}; + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/include/SteppingAction.hh b/examples/extended/electromagnetic/MuonProcesses/include/SteppingAction.hh new file mode 100644 index 0000000000..7a5687ce77 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/SteppingAction.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: SteppingAction.hh,v 1.1 2004/06/14 10:09:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef SteppingAction_h +#define SteppingAction_h 1 + +#include "G4UserSteppingAction.hh" +#include "globals.hh" + +class RunAction; +class HistoManager; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class SteppingAction : public G4UserSteppingAction +{ + public: + SteppingAction(RunAction*, HistoManager*); + ~SteppingAction(); + + void UserSteppingAction(const G4Step*); + + private: + RunAction* runAction; + HistoManager* histoManager; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/include/SteppingVerbose.hh b/examples/extended/electromagnetic/MuonProcesses/include/SteppingVerbose.hh new file mode 100644 index 0000000000..a77299d860 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/SteppingVerbose.hh @@ -0,0 +1,54 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: SteppingVerbose.hh,v 1.1 2004/06/14 10:09:24 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// This class manages the verbose outputs in G4SteppingManager. +// It inherits from G4SteppingVerbose. +// It shows how to extract informations during the tracking of a particle. +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef SteppingVerbose_h +#define SteppingVerbose_h 1 + +#include "G4SteppingVerbose.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class SteppingVerbose : public G4SteppingVerbose { + +public: + + SteppingVerbose(); + ~SteppingVerbose(); + + void StepInfo(); + void TrackingStarted(); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/include/VisManager.hh b/examples/extended/electromagnetic/MuonProcesses/include/VisManager.hh new file mode 100644 index 0000000000..9d54a07b53 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/include/VisManager.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: VisManager.hh,v 1.1 2004/06/14 10:09:24 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Example Visualization Manager implementing virtual function +// RegisterGraphicsSystems. Exploits C-pre-processor variables +// G4VIS_USE_DAWN, etc., which are set by the GNUmakefiles if +// environment variables of the same name are set. + +// So all you have to do is set environment variables and compile and +// instantiate this in your main(). + +// Alternatively, you can implement an empty function here and just +// register the systems you want in your main(), e.g.: +// G4VisManager* myVisManager = new MyVisManager; +// myVisManager -> RegisterGraphicsSystem (new MyGraphicsSystem); + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef VisManager_h +#define VisManager_h 1 + +#include "G4VisManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class VisManager: public G4VisManager { + +public: + + VisManager (); + +private: + + void RegisterGraphicsSystems (); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/src/DetectorConstruction.cc b/examples/extended/electromagnetic/MuonProcesses/src/DetectorConstruction.cc new file mode 100644 index 0000000000..a6d0efb771 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/DetectorConstruction.cc @@ -0,0 +1,176 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorConstruction.cc,v 1.1 2004/06/14 10:09:25 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorConstruction.hh" +#include "DetectorMessenger.hh" + +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4PVPlacement.hh" + +#include "G4GeometryManager.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" + +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorConstruction::DetectorConstruction() +:pBox(0), lBox(0), aMaterial(0) +{ + BoxSize = 1*m; + DefineMaterials(); + SetMaterial("Iron"); + detectorMessenger = new DetectorMessenger(this); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorConstruction::~DetectorConstruction() +{ delete detectorMessenger;} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::Construct() +{ + return ConstructVolumes(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::DefineMaterials() +{ + // + // define Elements + // + G4double z,a; + + G4Element* C = new G4Element("Carbon" ,"C" , z= 6., a= 12.01*g/mole); + G4Element* N = new G4Element("Nitrogen" ,"N" , z= 7., a= 14.01*g/mole); + G4Element* O = new G4Element("Oxygen" ,"O" , z= 8., a= 16.00*g/mole); + G4Element* Ca = new G4Element("Calcium" ,"Ca", z=20., a= 40.08*g/mole); + + // + // define materials + // + G4double density; + G4int ncomponents, natoms; + G4double fractionmass; + + new G4Material("galactic", z=1., a= 1.01*g/mole, universe_mean_density, + kStateGas, 2.73*kelvin, 3.e-18*pascal); + + G4Material* Air = + new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2); + Air->AddElement(N, fractionmass=70.*perCent); + Air->AddElement(O, fractionmass=30.*perCent); + + G4Material* CaCO3 = + new G4Material("CaCO3", density= 2.80*g/cm3, ncomponents=3); + CaCO3->AddElement(Ca, natoms= 1); + CaCO3->AddElement(C , natoms= 1); + CaCO3->AddElement(O , natoms= 3); + + new G4Material("Carbon", z= 6., a= 12.01*g/mole, density= 2.265*g/cm3); + new G4Material("Iron" , z=26., a= 55.85*g/mole, density= 7.870*g/cm3); + new G4Material("Tin" , z=50., a= 118.7*g/mole, density= 7.310*g/cm3); + + G4cout << *(G4Material::GetMaterialTable()) << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() +{ + // Cleanup old geometry + G4GeometryManager::GetInstance()->OpenGeometry(); + G4PhysicalVolumeStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4SolidStore::GetInstance()->Clean(); + + G4Box* + sBox = new G4Box("Container", //its name + BoxSize/2,BoxSize/2,BoxSize/2); //its dimensions + + lBox = new G4LogicalVolume(sBox, //its shape + aMaterial, //its material + aMaterial->GetName()); //its name + + pBox = new G4PVPlacement(0, //no rotation + G4ThreeVector(), //at (0,0,0) + lBox, //its logical volume + aMaterial->GetName(), //its name + 0, //its mother volume + false, //no boolean operation + 0); //copy number + + PrintParameters(); + + //always return the root volume + // + return pBox; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::PrintParameters() +{ + G4cout << "\n The Box is " << G4BestUnit(BoxSize,"Length") + << " of " << aMaterial->GetName() << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetMaterial(G4String materialChoice) +{ + // search the material by its name + G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); + if (pttoMaterial) aMaterial = pttoMaterial; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetSize(G4double value) +{ + BoxSize = value; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4RunManager.hh" + +void DetectorConstruction::UpdateGeometry() +{ + G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/DetectorMessenger.cc b/examples/extended/electromagnetic/MuonProcesses/src/DetectorMessenger.cc new file mode 100644 index 0000000000..d42c8e5498 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/DetectorMessenger.cc @@ -0,0 +1,95 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorMessenger.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorMessenger.hh" + +#include "DetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithoutParameter.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::DetectorMessenger(DetectorConstruction * Det) +:Detector(Det) +{ + testemDir = new G4UIdirectory("/testem/"); + testemDir->SetGuidance("commands specific to this example"); + + detDir = new G4UIdirectory("/testem/det/"); + detDir->SetGuidance("detector construction"); + + MaterCmd = new G4UIcmdWithAString("/testem/det/setMat",this); + MaterCmd->SetGuidance("Select material of the box."); + MaterCmd->SetParameterName("choice",false); + MaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + SizeCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setSize",this); + SizeCmd->SetGuidance("Set size of the box"); + SizeCmd->SetParameterName("Size",false); + SizeCmd->SetRange("Size>0."); + SizeCmd->SetUnitCategory("Length"); + SizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + UpdateCmd = new G4UIcmdWithoutParameter("/testem/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); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::~DetectorMessenger() +{ + delete MaterCmd; + delete SizeCmd; + delete UpdateCmd; + delete detDir; + delete testemDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if( command == MaterCmd ) + { Detector->SetMaterial(newValue);} + + if( command == SizeCmd ) + { Detector->SetSize(SizeCmd->GetNewDoubleValue(newValue));} + + if( command == UpdateCmd ) + { Detector->UpdateGeometry(); } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/EventAction.cc b/examples/extended/electromagnetic/MuonProcesses/src/EventAction.cc new file mode 100644 index 0000000000..1f5830ff53 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/EventAction.cc @@ -0,0 +1,83 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: EventAction.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EventAction.hh" + +#include "EventActionMessenger.hh" + +#include "G4Event.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventAction::EventAction() +:printModulo(10000),eventMessenger(0) +{ + eventMessenger = new EventActionMessenger(this); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventAction::~EventAction() +{ + delete eventMessenger; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventAction::BeginOfEventAction(const G4Event* evt) +{ + G4int evtNb = evt->GetEventID(); + + //printing survey + if (evtNb%printModulo == 0) + G4cout << "\n---> Begin of Event: " << evtNb << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventAction::EndOfEventAction(const G4Event* evt) +{ + if (G4VVisManager::GetConcreteInstance()) + { + G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + for (G4int i=0; iGetTrajectoryContainer()))[i]); + trj->DrawTrajectory(1000); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/EventActionMessenger.cc b/examples/extended/electromagnetic/MuonProcesses/src/EventActionMessenger.cc new file mode 100644 index 0000000000..76a7ad21ba --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/EventActionMessenger.cc @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: EventActionMessenger.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EventActionMessenger.hh" + +#include "EventAction.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAnInteger.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventActionMessenger::EventActionMessenger(EventAction* EvAct) +:eventAction(EvAct) +{ + eventDir = new G4UIdirectory("/testem/event/"); + eventDir ->SetGuidance("physics list"); + + PrintCmd = new G4UIcmdWithAnInteger("/testem/event/printModulo",this); + PrintCmd->SetGuidance("Print events modulo n"); + PrintCmd->SetParameterName("EventNb",false); + PrintCmd->SetRange("EventNb>0"); + PrintCmd->AvailableForStates(G4State_Idle); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventActionMessenger::~EventActionMessenger() +{ + delete PrintCmd; + delete eventDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventActionMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if (command == PrintCmd) + {eventAction->SetPrintModulo(PrintCmd->GetNewIntValue(newValue));} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/HistoManager.cc b/examples/extended/electromagnetic/MuonProcesses/src/HistoManager.cc new file mode 100644 index 0000000000..cb75607f2f --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/HistoManager.cc @@ -0,0 +1,165 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoManager.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef USE_AIDA + +#include "HistoManager.hh" +#include "HistoMessenger.hh" +#include "G4UnitsTable.hh" + +#include "AIDA/AIDA.h" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoManager::HistoManager() +:tree(0),hf(0),factoryOn(false) +{ + fileName = "muonprocesses.paw"; + + // histograms + for (G4int k=0; kHistoManager::SetFactory(): factory already exists" + << G4endl; + SaveFactory(); + } + + // Creating the analysis factory + AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); + + // Creating the tree factory + AIDA::ITreeFactory* tf = af->createTreeFactory(); + + // Creating a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create(fileName, "hbook", readOnly, createNew); + + // Creating a histogram factory, whose histograms will be handled by the tree + hf = af->createHistogramFactory(*tree); + + // create selected histograms + for (G4int k=0; kcreateHistogram1D( Label[k], Title[k], + Nbins[k], Vmin[k], Vmax[k]); + } + + delete tf; + delete af; + factoryOn = true; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SaveFactory() +{ + if (factoryOn) { + tree->commit(); // Writing the histograms to the file + tree->close(); // and closing the tree (and the file) + + delete hf; + delete tree; + factoryOn = false; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SetHisto(G4int ih, + G4int nbins, G4double valmin, G4double valmax, G4String unit) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + const G4String id[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8"}; + const G4String title[] = + { "dummy", //0 + "log10(Etransfert/Emu) Ionization", //1 + "log10(Etransfert/Emu) Pair", //2 + "log10(Etransfert/Emu) Brems", //3 + "log10(Etransfert/Emu) Nuclear" //4 + }; + + + G4String titl = title[ih]; + G4double vmin = valmin, vmax = valmax; + Unit[ih] = 1.; + + if (unit != "none") { + titl = title[ih] + " (" + unit + ")"; + Unit[ih] = G4UnitDefinition::GetValueOf(unit); + vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; + } + + exist[ih] = true; + Label[ih] = id[ih]; + Title[ih] = titl; + Nbins[ih] = nbins; + Vmin[ih] = vmin; + Vmax[ih] = vmax; + Width[ih] = (valmax-valmin)/nbins; + + G4cout << "----> SetHisto " << ih << ": " << titl << "; " + << nbins << " bins from " + << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::RemoveHisto(G4int ih) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + + histo[ih] = 0; exist[ih] = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/src/HistoMessenger.cc b/examples/extended/electromagnetic/MuonProcesses/src/HistoMessenger.cc new file mode 100644 index 0000000000..f0ea5447ff --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/HistoMessenger.cc @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoMessenger.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4ANALYSIS_USE + +#include "HistoMessenger.hh" + +#include "HistoManager.hh" +#include "G4UIdirectory.hh" +#include "G4UIcommand.hh" +#include "G4UIparameter.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::HistoMessenger(HistoManager* manager) +:histoManager (manager) +{ + histoDir = new G4UIdirectory("/testem/histo/"); + histoDir->SetGuidance("histograms control"); + + factoryCmd = new G4UIcmdWithAString("/testem/histo/setFileName",this); + factoryCmd->SetGuidance("set name for the histograms file"); + + histoCmd = new G4UIcommand("/testem/histo/setHisto",this); + histoCmd->SetGuidance("Set bining of the histo number ih :"); + histoCmd->SetGuidance(" nbBins; valMin; valMax; unit (of vmin and vmax)"); + // + G4UIparameter* ih = new G4UIparameter("ih",'i',false); + ih->SetGuidance("histo number : from 1 to MaxHisto"); + ih->SetParameterRange("ih>0"); + histoCmd->SetParameter(ih); + // + G4UIparameter* nbBins = new G4UIparameter("nbBins",'i',false); + nbBins->SetGuidance("number of bins"); + nbBins->SetParameterRange("nbBins>0"); + histoCmd->SetParameter(nbBins); + // + G4UIparameter* valMin = new G4UIparameter("valMin",'d',false); + valMin->SetGuidance("valMin, expressed in unit"); + histoCmd->SetParameter(valMin); + // + G4UIparameter* valMax = new G4UIparameter("valMax",'d',false); + valMax->SetGuidance("valMax, expressed in unit"); + histoCmd->SetParameter(valMax); + // + G4UIparameter* unit = new G4UIparameter("unit",'s',true); + unit->SetGuidance("if omitted, vmin and vmax are assumed dimensionless"); + unit->SetDefaultValue("none"); + histoCmd->SetParameter(unit); + + rmhistoCmd = new G4UIcmdWithAnInteger("/testem/histo/removeHisto",this); + rmhistoCmd->SetGuidance("desactivate histo #id"); + rmhistoCmd->SetParameterName("id",false); + rmhistoCmd->SetRange("id>0"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::~HistoMessenger() +{ + delete rmhistoCmd; + delete histoCmd; + delete factoryCmd; + delete histoDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoMessenger::SetNewValue(G4UIcommand* command, G4String newValues) +{ + if (command == factoryCmd) + histoManager->SetFileName(newValues); + + if (command == histoCmd) + { G4int ih,nbBins; G4double vmin,vmax; char unts[30]; + const char* t = newValues; + std::istrstream is((char*)t); + is >> ih >> nbBins >> vmin >> vmax >> unts; + G4String unit = unts; + G4double vUnit = 1. ; + if (unit != "none") vUnit = G4UIcommand::ValueOf(unit); + histoManager->SetHisto (ih,nbBins,vmin*vUnit,vmax*vUnit,unit); + } + + if (command == rmhistoCmd) + { histoManager->RemoveHisto(rmhistoCmd->GetNewIntValue(newValues));} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/MuonProcesses/src/MuCrossSections.cc b/examples/extended/electromagnetic/MuonProcesses/src/MuCrossSections.cc new file mode 100644 index 0000000000..8027d2103e --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/MuCrossSections.cc @@ -0,0 +1,392 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: MuCrossSections.cc,v 1.2 2004/06/15 16:33:50 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "MuCrossSections.hh" + +#include "G4Material.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +MuCrossSections::MuCrossSections() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +MuCrossSections::~MuCrossSections() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double MuCrossSections::CR_Macroscopic(G4String process, G4Material* material, + G4double tkin, G4double ep) + +// return the macroscopic cross section (1/L) in GEANT4 internal units +{ + const G4ElementVector* theElementVector = material->GetElementVector(); + const G4double* NbOfAtomsPerVolume = material->GetVecNbOfAtomsPerVolume(); + + G4double SIGMA = 0 ; + + for ( size_t i=0 ; i < material->GetNumberOfElements() ; i++ ) + { + G4Element* element = (*theElementVector)[i]; + SIGMA += NbOfAtomsPerVolume[i] * CR_PerAtom(process, element, tkin, ep); + } + return SIGMA; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double MuCrossSections::CR_PerAtom(G4String process, G4Element* element, + G4double tkin, G4double ep) +{ + G4double z = element->GetZ(); + G4double a = element->GetA(); + + G4double sigma = 0.; + if (process == "MuBrems") + sigma = CRB_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro; + + else if (process == "MuIoni") + sigma = CRK_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro; + + else if (process == "MuNucl") + sigma = CRN_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro; + + else if (process == "MuPairProd") + sigma = CRP_Mephi(z,a/(g/mole),tkin/GeV,ep/GeV)*(cm2/(g*GeV))*a/Avogadro; + + return sigma; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +double MuCrossSections::CRB_Mephi(double z,double a,double tkin,double ep) + +//*********************************************************************** +//*** crb_g4_1.inc in comparison with crb_.inc, following +//*** changes are introduced (September 24th, 1998): +//*** 1) function crb_g4 (Z,A,Tkin,EP), Tkin is kinetic energy +//*** 2) special case of hidrogen (Z<1.5; b,b1,Dn_star) +//*** Numerical comparison: 5 decimal digits coincide. +//*** +//*** Cross section for bremsstrahlung by fast muon +//*** By R.P.Kokoulin, September 1998 +//*** Formulae from Kelner,Kokoulin,Petrukhin 1995, Preprint MEPhI +//*** (7,18,19,20,21,25,26); Dn (18) is modified to incorporate +//*** Bugaev's inelatic nuclear correction (28) for Z > 1. +//*********************************************************************** +{ +// double Z,A,Tkin,EP; + double crb_g4; + double e,v,delta,rab0,z_13,dn,b,b1,dn_star,rab1,fn,epmax1,fe,rab2; +// + double ame=0.51099907e-3; // GeV + double amu=0.105658389; // GeV + double re=2.81794092e-13; // cm + double avno=6.022137e23; + double alpha=1./137.036; + double rmass=amu/ame; // "207" + double coeff=16./3.*alpha*avno*(re/rmass)*(re/rmass); // cm^2 + double sqrte=1.64872127; // sqrt(2.71828...) + double btf=183.; + double btf1=1429.; + double bh=202.4; + double bh1=446.; +//*** + if(ep >= tkin) + { + crb_g4=0.; + return crb_g4; + } + e=tkin+amu; + v=ep/e; + delta=amu*amu*v/(2.*(e-ep)); // qmin + rab0=delta*sqrte; + z_13=pow(z,-0.3333333); // +//*** nuclear size and excitation, screening parameters + dn=1.54*pow(a,0.27); + if(z <= 1.5) // special case for hydrogen + { + b=bh; + b1=bh1; + dn_star=dn; + } + else + { + b=btf; + b1=btf1; + dn_star=pow(dn,(1.-1./z)); // with Bugaev's correction + } +//*** nucleus contribution logarithm + rab1=b*z_13; + fn=log(rab1/(dn_star*(ame+rab0*rab1))*(amu+delta*(dn_star*sqrte-2.))); + if(fn < 0.) fn=0.; +//*** electron contribution logarithm + epmax1=e/(1.+amu*rmass/(2.*e)); + if(ep >= epmax1) + { + fe=0.; + goto label10; + } + rab2=b1*z_13*z_13; + fe=log(rab2*amu/((1.+delta*rmass/(ame*sqrte))*(ame+rab0*rab2))); + if(fe < 0.) fe=0.; +//*** +label10: + crb_g4=coeff*(1.-v*(1.-0.75*v))*z*(z*fn+fe)/(a*ep); + return crb_g4; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +double MuCrossSections::CRK_Mephi(double z,double a,double tkin,double ep) + +//*********************************************************************** +//*** Cross section for knock-on electron production by fast muons +//*** (including bremsstrahlung e-diagrams and rad. correction). +//*** Units: cm^2/(g*GeV); Tkin, ep - GeV. +//*** By R.P.Kokoulin, October 1998 +//*** Formulae from Kelner,Kokoulin,Petrukhin, Phys.Atom.Nuclei, 1997 +//*** (a bit simplified Kelner's version of Eq.30 - with 2 logarithms). +//*** +{ +// double Z,A,Tkin,EP; + double crk_g4; + double e,epmax,v,sigma0,a1,a3; +// + double ame=0.51099907e-3; // GeV + double amu=0.105658389; // GeV + double re=2.81794092e-13; // cm + double avno=6.022137e23; + double alpha=1./137.036; + double pi=3.141592654; + double bmu=amu*amu/(2.*ame); + double coeff0=avno*2.*pi*ame*re*re; + double coeff1=alpha/(2.*pi); +//*** + e=tkin+amu; + epmax=e/(1.+bmu/e); + if(ep >= epmax) + { + crk_g4=0.; + return crk_g4; + } + v=ep/e; + sigma0=coeff0*(z/a)*(1.-ep/epmax+0.5*v*v)/(ep*ep); + a1=log(1.+2.*ep/ame); + a3=log(4.*e*(e-ep)/(amu*amu)); + crk_g4=sigma0*(1.+coeff1*a1*(a3-a1)); + return crk_g4; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +double MuCrossSections::CRN_Mephi(double z,double a,double tkin,double ep) + +//*********************************************************************** +//*** Differential cross section for photonuclear muon interaction. +//*** Formulae from Borog & Petrukhin, 1975 +//*** Real photon cross section: Caldwell e.a., 1979 +//*** Nuclear shadowing: Brodsky e.a., 1972 +//*** Units: cm^2 / g GeV. +//*** CRN_G4_1.inc January 31st, 1998 R.P.Kokoulin +//*********************************************************************** +{ +// double Z,A,Tkin,EP; + double crn_g4; + double dummy,e,aeff,sigph,v,v1,v2,amu2,up,down; +//*** + double amu=0.105658389; // GeV + double avno=6.022137e23; + double amp=0.9382723; // GeV + double pi=3.14159265; + double alpha=1./137.036; +//*** + double epmin_phn=0.20; // GeV + double alam2=0.400000; // GeV**2 + double alam =0.632456; // sqrt(alam2) + double coeffn=alpha/pi*avno*1e-30; // cm^2/microbarn +//*** + dummy=z; // Z is a formal parameter at the moment + e=tkin+amu; + crn_g4=0.; + if(ep >= e-0.5*amp) return crn_g4; + if(ep <= epmin_phn) return crn_g4; + aeff=0.22*a+0.78*pow(a,0.89); // shadowing + sigph=49.2+11.1*log(ep)+151.8/sqrt(ep); // microbarn + v=ep/e; + v1=1.-v; + v2=v*v; + amu2=amu*amu; + up=e*e*v1/amu2*(1.+amu2*v2/(alam2*v1)); + down=1.+ep/alam*(1.+alam/(2.*amp)+ep/alam); + crn_g4=coeffn*aeff/a*sigph/ep*(-v1+(v1+0.5*v2*(1.+2.*amu2/alam2))*log(up/down)); + if(crn_g4 < 0.) crn_g4=0.; + return crn_g4; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +double MuCrossSections::CRP_Mephi(double z,double a,double tkin,double ep) + +//********************************************************************** +//*** crp_g4_1.inc in comparison with crp_m.inc, following +//*** changes are introduced (January 16th, 1998): +//*** 1) Avno/A, cm^2/gram GeV +//*** 2) zeta_loss(E,Z) from Kelner 1997, Eqs.(53-54) +//*** 3) function crp_g4 (Z,A,Tkin,EP), Tkin is kinetic energy +//*** 4) bbb=183 (Thomas-Fermi) +//*** 5) special case of hidrogen (Z<1.5), bbb,g1,g2 +//*** 6) expansions in 'xi' are simplified (Jan.17th,1998) +//*** +//*** Cross section for electron pair production by fast muon +//*** By R.P.Kokoulin, December 1997 +//*** Formulae from Kokoulin & Petrukhin 1971, Hobart, Eqs.(1,8,9,10) +{ +// double Z,A,Tkin,EP; + double crp_g4; + double bbbtf,bbbh,g1tf,g2tf,g1h,g2h,e,z13,e1,alf,a3,bbb; + double g1,g2,zeta1,zeta2,zeta,z2,screen0,a0,a1,bet,xi0,del; + double tmn,sum,a4,a5,a6,a7,a9,xi,xii,xi1,screen,yeu,yed,ye1; + double ale,cre,be,fe,ymu,ymd,ym1,alm_crm,a10,bm,fm; +// + double ame=0.51099907e-3; // GeV + double amu=0.105658389; // GeV + double re=2.81794092e-13; // cm + double avno=6.022137e23; + double pi=3.14159265; + double alpha=1./137.036; + double rmass=amu/ame; // "207" + double coeff=4./(3.*pi)*(alpha*re)*(alpha*re)*avno; // cm^2 + double sqrte=1.64872127; // sqrt(2.71828...) + double c3=3.*sqrte*amu/4.; // for limits + double c7=4.*ame; // -"- + double c8=6.*amu*amu; // -"- + + double xgi[8]={.0199,.1017,.2372,.4083,.5917,.7628,.8983,.9801}; // Gauss, 8 + double wgi[8]={.0506,.1112,.1569,.1813,.1813,.1569,.1112,.0506}; // Gauss, 8 + bbbtf=183.; // for the moment... + bbbh=202.4; // for the moment... + g1tf=1.95e-5; + g2tf=5.3e-5; + g1h=4.4e-5; + g2h=4.8e-5; + + e=tkin+amu; + z13=pow(z,0.3333333); + e1=e-ep; + crp_g4=0.; + if(e1 <= c3*z13) return crp_g4; // ep > max + alf=c7/ep; // 4m/ep + a3=1.-alf; + if(a3 <= 0.) return crp_g4; // ep < min +//*** zeta calculation + if(z <= 1.5) // special case of hidrogen + { + bbb=bbbh; + g1=g1h; + g2=g2h; + } + else + { + bbb=bbbtf; + g1=g1tf; + g2=g2tf; + } + zeta1=0.073*log(e/(amu+g1*z13*z13*e))-0.26; + if(zeta1 > 0.) + { + zeta2=0.058*log(e/(amu+g2*z13*e))-0.14; + zeta=zeta1/zeta2; + } + else + { + zeta=0.; + } + z2=z*(z+zeta); // +//*** just to check (for comparison with crp_m) +// z2=z*(z+1.) +// bbb=189. +//*** + screen0=2.*ame*sqrte*bbb/(z13*ep); // be careful with "ame" + a0=e*e1; + a1=ep*ep/a0; // 2*beta + bet=0.5*a1; // beta + xi0=0.25*rmass*rmass*a1; // xi0 + del=c8/a0; // 6mu^2/EE' + tmn=log((alf+2.*del*a3)/(1.+(1.-del)*sqrt(a3))); // log(1-rmax) + sum=0.; + for(int i=0; i<=7; i++) // integration + { + a4=exp(tmn*xgi[i]); // 1-r + a5=a4*(2.-a4); // 1-r2 + a6=1.-a5; // r2 + a7=1.+a6; // 1+r2 + a9=3.+a6; // 3+r2 + xi=xi0*a5; + xii=1./xi; + xi1=1.+xi; + screen=screen0*xi1/a5; + yeu=5.-a6+4.*bet*a7; + yed=2.*(1.+3.*bet)*log(3.+xii)-a6-a1*(2.-a6); + ye1=1.+yeu/yed; + ale=log(bbb/z13*sqrt(xi1*ye1)/(1.+screen*ye1)); + cre=0.5*log(1.+(1.5/rmass*z13)*(1.5/rmass*z13)*xi1*ye1); + if(xi <= 1e3) // + { + be=((2.+a6)*(1.+bet)+xi*a9)*log(1.+xii)+(a5-bet)/xi1-a9; + } + else + { + be=(3.-a6+a1*a7)/(2.*xi); // -(6.-5.*a6+3.*bet*a6)/(6.*xi*xi); + } + fe=std::max(0.,(ale-cre)*be); + ymu=4.+a6+3.*bet*a7; + ymd=a7*(1.5+a1)*log(3.+xi)+1.-1.5*a6; + ym1=1.+ymu/ymd; + alm_crm=log(bbb*rmass/(1.5*z13*z13*(1.+screen*ym1))); + if(xi >= 1e-3) // + { + a10=(1.+a1)*a5; // (1+2b)(1-r2) + bm=(a7*(1.+1.5*bet)-a10*xii)*log(xi1)+xi*(a5-bet)/xi1+a10; + } + else + { + bm=(5.-a6+bet*a9)*(xi/2.); // -(11.-5.*a6+.5*bet*(5.+a6))*(xi*xi/6.) + } + fm=std::max(0.,(alm_crm)*bm); +//*** + sum=sum+a4*(fe+fm/(rmass*rmass))*wgi[i]; + } + crp_g4=-tmn*sum*(z2/a)*coeff*e1/(e*ep); + return crp_g4; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmG4v52.cc b/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmG4v52.cc new file mode 100644 index 0000000000..4aa4f20bec --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmG4v52.cc @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysListEmG4v52.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysListEmG4v52.hh" + +#include "G4ParticleDefinition.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +#include "G4ProcessManager.hh" +#include "G4MuIonisation52.hh" +#include "G4MuBremsstrahlung52.hh" +#include "G4MuPairProduction52.hh" +#include "G4MuNuclearInteraction.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListEmG4v52::PhysListEmG4v52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListEmG4v52::~PhysListEmG4v52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysListEmG4v52::ConstructProcess() +{ + // Add standard EM Processes for Muon + G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MuIonisation52, -1, 1,1); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,2); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,3); +/// pmanager->AddProcess(new G4MuNuclearInteraction,-1,-1,4); + + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MuIonisation52, -1, 1,1); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,2); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,3); +/// pmanager->AddProcess(new G4MuNuclearInteraction,-1,-1,4); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmStandard.cc new file mode 100644 index 0000000000..ecbe70195b --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/PhysListEmStandard.cc @@ -0,0 +1,84 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysListEmStandard.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysListEmStandard.hh" + +#include "G4ParticleDefinition.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +#include "G4ProcessManager.hh" +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4MuNuclearInteraction.hh" +#include "G4LossTableManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListEmStandard::PhysListEmStandard(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListEmStandard::~PhysListEmStandard() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysListEmStandard::ConstructProcess() +{ + // Add standard EM Processes for Muon + G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MuIonisation, -1, 1,1); + pmanager->AddProcess(new G4MuBremsstrahlung, -1, 2,2); + pmanager->AddProcess(new G4MuPairProduction, -1, 3,3); +/// pmanager->AddProcess(new G4MuNuclearInteraction,-1,-1,4); + + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MuIonisation, -1, 1,1); + pmanager->AddProcess(new G4MuBremsstrahlung, -1, 2,2); + pmanager->AddProcess(new G4MuPairProduction, -1, 3,3); +/// pmanager->AddProcess(new G4MuNuclearInteraction,-1,-1,4); + + //extend binning of PhysicsTables + // + G4LossTableManager::Instance()->SetMaxEnergy(1000.0*PeV); + G4LossTableManager::Instance()->SetDEDXBinning(220); + G4LossTableManager::Instance()->SetLambdaBinning(220); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysListParticles.cc b/examples/extended/electromagnetic/MuonProcesses/src/PhysicsList.cc similarity index 56% rename from examples/extended/electromagnetic/TestEm5/src/PhysListParticles.cc rename to examples/extended/electromagnetic/MuonProcesses/src/PhysicsList.cc index 5bfdb2ac0a..1817c4aa21 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PhysListParticles.cc +++ b/examples/extended/electromagnetic/MuonProcesses/src/PhysicsList.cc @@ -21,19 +21,53 @@ // ******************************************************************** // // -// $Id: PhysListParticles.cc,v 1.1 2003/08/11 10:21:16 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ - +// $Id: PhysicsList.cc,v 1.1 2004/06/14 10:09:26 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "PhysListParticles.hh" +#include "PhysicsList.hh" +#include "PhysicsListMessenger.hh" + +#include "PhysListEmStandard.hh" +#include "PhysListEmG4v52.hh" + +#include "G4LossTableManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::PhysicsList() : G4VModularPhysicsList() +{ + SetVerboseLevel(1); + pMessenger = new PhysicsListMessenger(this); + + // cuts + currentDefaultCut = 1.0*mm; + cutForGamma = currentDefaultCut; + cutForElectron = currentDefaultCut; + cutForPositron = currentDefaultCut; + + // EM physics + emName = G4String("standard"); + emPhysicsList = new PhysListEmStandard(emName); + + // instanciate EnergyLossTable + G4LossTableManager::Instance(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::~PhysicsList() +{ + delete pMessenger; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Bosons -#include "G4ChargedGeantino.hh" #include "G4Geantino.hh" #include "G4Gamma.hh" -#include "G4OpticalPhoton.hh" // leptons #include "G4MuonPlus.hh" @@ -73,33 +107,15 @@ #include "G4He3.hh" #include "G4GenericIon.hh" -#include "IonC12.hh" - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListParticles::PhysListParticles(const G4String& name) - : G4VPhysicsConstructor(name) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListParticles::~PhysListParticles() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListParticles::ConstructParticle() +void PhysicsList::ConstructParticle() { - // pseudo-particles G4Geantino::GeantinoDefinition(); - G4ChargedGeantino::ChargedGeantinoDefinition(); // gamma G4Gamma::GammaDefinition(); - -// optical photon - G4OpticalPhoton::OpticalPhotonDefinition(); // leptons G4Electron::ElectronDefinition(); @@ -137,7 +153,96 @@ void PhysListParticles::ConstructParticle() G4He3::He3Definition(); G4Alpha::AlphaDefinition(); G4GenericIon::GenericIonDefinition(); - IonC12::IonDefinition(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructProcess() +{ + // transportation + // + AddTransportation(); + + // electromagnetic Physics List + // + emPhysicsList->ConstructProcess(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::AddPhysicsList(const G4String& name) +{ + if (verboseLevel>1) { + G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" << G4endl; + } + + if (name == emName) return; + + if (name == "standard") { + + emName = name; + delete emPhysicsList; + emPhysicsList = new PhysListEmStandard(name); + + } else if (name == "g4v52") { + + emName = name; + delete emPhysicsList; + emPhysicsList = new PhysListEmG4v52(name); + + } else { + + G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" + << " is not defined" + << G4endl; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCuts() +{ + + if (verboseLevel >0){ + G4cout << "PhysicsList::SetCuts:"; + G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + + // set cut values for gamma at first and for e- second and next for e+, + // because some processes for e+/e- need cut values for gamma + SetCutValue(cutForGamma, "gamma"); + SetCutValue(cutForElectron, "e-"); + SetCutValue(cutForPositron, "e+"); + + if (verboseLevel>0) DumpCutValuesTable(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" + +void PhysicsList::SetCutForGamma(G4double cut) +{ + cutForGamma = cut; + SetParticleCuts(cutForGamma, G4Gamma::Gamma()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCutForElectron(G4double cut) +{ + cutForElectron = cut; + SetParticleCuts(cutForElectron, G4Electron::Electron()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCutForPositron(G4double cut) +{ + cutForPositron = cut; + SetParticleCuts(cutForPositron, G4Positron::Positron()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/PhysicsListMessenger.cc b/examples/extended/electromagnetic/MuonProcesses/src/PhysicsListMessenger.cc new file mode 100644 index 0000000000..d333328134 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/PhysicsListMessenger.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysicsListMessenger.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsListMessenger.hh" + +#include "PhysicsList.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithAString.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) +:pPhysicsList(pPhys) +{ + gammaCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setGCut",this); + gammaCutCmd->SetGuidance("Set gamma cut."); + gammaCutCmd->SetParameterName("Gcut",false); + gammaCutCmd->SetUnitCategory("Length"); + gammaCutCmd->SetRange("Gcut>0.0"); + gammaCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + electCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setECut",this); + electCutCmd->SetGuidance("Set electron cut."); + electCutCmd->SetParameterName("Ecut",false); + electCutCmd->SetUnitCategory("Length"); + electCutCmd->SetRange("Ecut>0.0"); + electCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + protoCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setPCut",this); + protoCutCmd->SetGuidance("Set positron cut."); + protoCutCmd->SetParameterName("Pcut",false); + protoCutCmd->SetUnitCategory("Length"); + protoCutCmd->SetRange("Pcut>0.0"); + protoCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + allCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setCuts",this); + allCutCmd->SetGuidance("Set cut for all."); + allCutCmd->SetParameterName("cut",false); + allCutCmd->SetUnitCategory("Length"); + allCutCmd->SetRange("cut>0.0"); + allCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + pListCmd = new G4UIcmdWithAString("/testem/phys/addPhysics",this); + pListCmd->SetGuidance("Add modula physics list."); + pListCmd->SetParameterName("PList",false); + pListCmd->AvailableForStates(G4State_PreInit); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::~PhysicsListMessenger() +{ + delete gammaCutCmd; + delete electCutCmd; + delete protoCutCmd; + delete allCutCmd; + delete pListCmd; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListMessenger::SetNewValue(G4UIcommand* command, + G4String newValue) +{ + if( command == gammaCutCmd ) + { pPhysicsList->SetCutForGamma(gammaCutCmd->GetNewDoubleValue(newValue));} + + if( command == electCutCmd ) + { pPhysicsList->SetCutForElectron(electCutCmd->GetNewDoubleValue(newValue));} + + if( command == protoCutCmd ) + { pPhysicsList->SetCutForPositron(protoCutCmd->GetNewDoubleValue(newValue));} + + if( command == allCutCmd ) + { + G4double cut = allCutCmd->GetNewDoubleValue(newValue); + pPhysicsList->SetCutForGamma(cut); + pPhysicsList->SetCutForElectron(cut); + pPhysicsList->SetCutForPositron(cut); + } + + if( command == pListCmd ) + { pPhysicsList->AddPhysicsList(newValue);} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/MuonProcesses/src/PrimaryGeneratorAction.cc new file mode 100644 index 0000000000..0cee39b495 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/PrimaryGeneratorAction.cc @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PrimaryGeneratorAction.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PrimaryGeneratorAction.hh" + +#include "DetectorConstruction.hh" + +#include "G4Event.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "Randomize.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* det) +:detector(det) +{ + particleGun = new G4ParticleGun(1); + G4ParticleDefinition* particle + = G4ParticleTable::GetParticleTable()->FindParticle("mu+"); + particleGun->SetParticleDefinition(particle); + particleGun->SetParticleEnergy(10*TeV); + particleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PrimaryGeneratorAction::~PrimaryGeneratorAction() +{ + delete particleGun; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + //this function is called at the begining of event + // + G4double halfSize = 0.5*(detector->GetSize()); + G4double x0 = - halfSize; + + //randomize (y0,z0) + // + G4double beam = 0.8*halfSize; + G4double y0 = (2*G4UniformRand()-1.)*beam; + G4double z0 = (2*G4UniformRand()-1.)*beam; + + particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); + particleGun->GeneratePrimaryVertex(anEvent); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/RunAction.cc b/examples/extended/electromagnetic/MuonProcesses/src/RunAction.cc new file mode 100644 index 0000000000..7a2a9da219 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/RunAction.cc @@ -0,0 +1,265 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: RunAction.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "RunAction.hh" + +#include "DetectorConstruction.hh" +#include "PrimaryGeneratorAction.hh" +#include "HistoManager.hh" +#include "MuCrossSections.hh" + +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UnitsTable.hh" + +#include "Randomize.hh" + +#ifdef USE_AIDA + #include "AIDA/AIDA.h" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunAction::RunAction(DetectorConstruction* det, PrimaryGeneratorAction* prim, + HistoManager* HistM) + : detector(det), primary(prim), ProcCounter(0), histoManager(HistM) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunAction::~RunAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::BeginOfRunAction(const G4Run* aRun) +{ + G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; + + // save Rndm status + G4RunManager::GetRunManager()->SetRandomNumberStore(true); + HepRandom::showEngineStatus(); + + ProcCounter = new ProcessesCount; + +#ifdef G4ANALYSIS_USE + histoManager->SetFactory(); +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::CountProcesses(G4String procName) +{ + //does the process already encounted ? + size_t nbProc = ProcCounter->size(); + size_t i = 0; + while ((iGetName()!=procName)) i++; + if (i == nbProc) ProcCounter->push_back( new OneProcessCount(procName)); + + (*ProcCounter)[i]->Count(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::EndOfRunAction(const G4Run* aRun) +{ + G4int NbOfEvents = aRun->GetNumberOfEvent(); + if (NbOfEvents == 0) return; + + std::ios::fmtflags mode = G4cout.flags(); + G4int prec = G4cout.precision(2); + + G4Material* material = detector->GetMaterial(); + G4double length = detector->GetSize(); + G4double density = material->GetDensity(); + + G4String particle = primary->GetParticleGun()->GetParticleDefinition() + ->GetParticleName(); + G4double energy = primary->GetParticleGun()->GetParticleEnergy(); + + G4cout << "\n The run consists of " << NbOfEvents << " "<< particle << " of " + << G4BestUnit(energy,"Energy") << " through " + << G4BestUnit(length,"Length") << " of " + << material->GetName() << " (density: " + << G4BestUnit(density,"Volumic Mass") << ")" << G4endl; + + //total number of process calls + G4double countTot = 0.; + G4cout << "\n Number of process calls --->"; + for (size_t i=0; i< ProcCounter->size();i++) { + G4String procName = (*ProcCounter)[i]->GetName(); + if (procName != "Transportation") { + G4int count = (*ProcCounter)[i]->GetCounter(); + G4cout << "\t" << procName << " : " << count; + countTot += count; + } + } + G4cout << G4endl; + + //compute totalCrossSection, meanFreePath and massicCrossSection + // + G4double totalCrossSection = countTot/(NbOfEvents*length); + G4double MeanFreePath = 1./totalCrossSection; + G4double massCrossSection =totalCrossSection/density; + + G4cout.precision(5); + G4cout << "\n Simulation: " + << "total CrossSection = " << totalCrossSection*cm << " /cm" + << "\t MeanFreePath = " << G4BestUnit(MeanFreePath,"Length") + << "\t massicCrossSection = " << massCrossSection*g/cm2 << " cm2/g" + << G4endl; + + //compute theoritical predictions + // + totalCrossSection = 0.; + for (size_t i=0; i< ProcCounter->size();i++) { + G4String procName = (*ProcCounter)[i]->GetName(); + if (procName != "Transportation") + totalCrossSection += ComputeTheory(procName, NbOfEvents); + } + + MeanFreePath = 1./totalCrossSection; + massCrossSection = totalCrossSection/density; + + G4cout << " Theory: " + << "total CrossSection = " << totalCrossSection*cm << " /cm" + << "\t MeanFreePath = " << G4BestUnit(MeanFreePath,"Length") + << "\t massicCrossSection = " << massCrossSection*g/cm2 << " cm2/g" + << G4endl; + + + G4cout.setf(mode,std::ios::floatfield); + G4cout.precision(prec); + + // delete and remove all contents in ProcCounter + while (ProcCounter->size()>0){ + OneProcessCount* aProcCount=ProcCounter->back(); + ProcCounter->pop_back(); + delete aProcCount; + } + delete ProcCounter; + +#ifdef G4ANALYSIS_USE + histoManager->SaveFactory(); +#endif + + // show Rndm status + HepRandom::showEngineStatus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4double RunAction::ComputeTheory(G4String process, G4int NbOfMu) +{ + G4Material* material = detector->GetMaterial(); + G4double length = detector->GetSize(); + G4double ekin = primary->GetParticleGun()->GetParticleEnergy(); + MuCrossSections crossSections; + + G4int id = 0; G4double cut = 0.; + if (process == "MuIoni") { id = 1; cut = GetEnergyCut(material,1); } + if (process == "MuPairProd") { id = 2; cut = 2*GetEnergyCut(material,1); } + if (process == "MuBrems") { id = 3; cut = GetEnergyCut(material,0); } + if (process == "MuNucl") id = 4; + if (id == 0) return 0.; + + G4int nbOfBins = 100; + G4double binMin = -10., binMax = 0., binWidth = (binMax-binMin)/nbOfBins; + +#ifdef USE_AIDA + //create histo for theoritical crossSections, with same bining as simulation + // + const G4String label[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", + "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"}; + + AIDA::IHistogram1D* histoMC = 0; AIDA::IHistogram1D* histoTh = 0; + if (histoManager->GetHisto(id)) { + histoMC = histoManager->GetHisto(id); + nbOfBins = (histoMC->axis()).bins(); + binMin = (histoMC->axis()).lowerEdge(); + binMax = (histoMC->axis()).upperEdge(); + binWidth = (binMax-binMin)/nbOfBins; + + G4String labelTh = label[MaxHisto + id]; + G4String titleTh = histoMC->title() + " (Th)"; + histoTh = histoManager->GetHistogramFactory() + ->createHistogram1D(labelTh,titleTh,nbOfBins,binMin,binMax); + } +#endif + + //compute and plot differential crossSection, as function of energy transfert. + //compute and return integrated crossSection for a given process. + //(note: to compare with simulation, the integrated crossSection is function + // of the energy cut.) + // + G4double lgeps, etransf, sigmaE, dsigma, NbProcess; + G4double sigmaTot = 0.; + const G4double ln10 = log(10); + + for (G4int ibin=0; ibin cut) sigmaTot += dsigma; + NbProcess = NbOfMu*length*dsigma; +#ifdef USE_AIDA + if (histoTh) histoTh->fill(lgeps,NbProcess); +#endif + } + +#ifdef USE_AIDA + //compare simulation and theory + // + if (histoMC && histoTh) histoManager->GetHistogramFactory() + ->divide(label[2*MaxHisto+id], *histoMC, *histoTh); +#endif + + //return integrated crossSection + // + return sigmaTot; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4ProductionCutsTable.hh" + +G4double RunAction::GetEnergyCut(G4Material* material, G4int idParticle) +{ + G4ProductionCutsTable* table = G4ProductionCutsTable::GetProductionCutsTable(); + + size_t index = 0; + while ( (table->GetMaterialCutsCouple(index)->GetMaterial() != material) && + (index < table->GetTableSize())) index++; + + return (*(table->GetEnergyCutsVector(idParticle)))[index]; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/StackingAction.cc b/examples/extended/electromagnetic/MuonProcesses/src/StackingAction.cc new file mode 100644 index 0000000000..32ef402271 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/StackingAction.cc @@ -0,0 +1,56 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: StackingAction.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "StackingAction.hh" +#include "G4Track.hh" +#include "G4TrackStatus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +StackingAction::StackingAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +StackingAction::~StackingAction() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4ClassificationOfNewTrack +StackingAction::ClassifyNewTrack(const G4Track* aTrack) +{ + G4ClassificationOfNewTrack classification = fUrgent; + + // kill all secondaries + if(aTrack->GetParentID() != 0) classification = fKill; + + return classification; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/SteppingAction.cc b/examples/extended/electromagnetic/MuonProcesses/src/SteppingAction.cc new file mode 100644 index 0000000000..d5dab22d18 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/SteppingAction.cc @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: SteppingAction.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SteppingAction.hh" +#include "RunAction.hh" +#include "HistoManager.hh" + +#include "G4RunManager.hh" + +#ifdef USE_AIDA + #include "AIDA/IHistogram1D.h" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingAction::SteppingAction(RunAction* RuAct, HistoManager* Hist) + :runAction(RuAct), histoManager(Hist) +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingAction::~SteppingAction() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingAction::UserSteppingAction(const G4Step* aStep) +{ + G4StepPoint* endPoint = aStep->GetPostStepPoint(); + G4String procName = endPoint->GetProcessDefinedStep()->GetProcessName(); + + //count processes + // + runAction->CountProcesses(procName); + + //plot energy transfered + // + G4StepPoint* startPoint = aStep->GetPreStepPoint(); + G4double E0 = startPoint->GetKineticEnergy(); + G4double edep = aStep->GetTotalEnergyDeposit(); + G4double E1 = E0 - edep; + G4double E2 = endPoint->GetKineticEnergy(); + G4double etrans = E1 - E2; + G4double lgepsE = 0.; + if (etrans > 0.) lgepsE = log10(etrans/E1); + +#ifdef USE_AIDA + // + G4int id = 0; + if (procName == "MuIoni") id = 1; + if (procName == "MuPairProd") id = 2; + if (procName == "MuBrems") id = 3; + if (procName == "MuNucl") id = 4; + if ((id > 0) && (histoManager->GetHisto(id))) + histoManager->GetHisto(id)->fill(lgepsE); +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + diff --git a/examples/extended/electromagnetic/MuonProcesses/src/SteppingVerbose.cc b/examples/extended/electromagnetic/MuonProcesses/src/SteppingVerbose.cc new file mode 100644 index 0000000000..97f6914560 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/SteppingVerbose.cc @@ -0,0 +1,177 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: SteppingVerbose.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SteppingVerbose.hh" + +#include "G4SteppingManager.hh" +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingVerbose::SteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingVerbose::~SteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingVerbose::StepInfo() +{ + CopyState(); + + G4int prec = G4cout.precision(3); + + if( verboseLevel >= 1 ){ + if( verboseLevel >= 4 ) VerboseTrack(); + if( verboseLevel >= 3 ){ + G4cout << G4endl; + G4cout << std::setw( 5) << "#Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "Volume" << " " + << std::setw(10) << "Process" << G4endl; + } + + G4cout << std::setw(5) << fTrack->GetCurrentStepNumber() << " " + << std::setw(6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetTrackLength(),"Length") + << " "; + + // if( fStepStatus != fWorldBoundary){ + if( fTrack->GetNextVolume() != 0 ) { + G4cout << std::setw(10) << fTrack->GetVolume()->GetName(); + } else { + G4cout << std::setw(10) << "OutOfWorld"; + } + + if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != NULL){ + G4cout << " " + << std::setw(10) << fStep->GetPostStepPoint() + ->GetProcessDefinedStep()->GetProcessName(); + } else { + G4cout << " UserLimit"; + } + + G4cout << G4endl; + + if( verboseLevel == 2 ){ + G4int tN2ndariesTot = fN2ndariesAtRestDoIt + + fN2ndariesAlongStepDoIt + + fN2ndariesPostStepDoIt; + if(tN2ndariesTot>0){ + G4cout << " :----- List of 2ndaries - " + << "#SpawnInStep=" << std::setw(3) << tN2ndariesTot + << "(Rest=" << std::setw(2) << fN2ndariesAtRestDoIt + << ",Along=" << std::setw(2) << fN2ndariesAlongStepDoIt + << ",Post=" << std::setw(2) << fN2ndariesPostStepDoIt + << "), " + << "#SpawnTotal=" << std::setw(3) << (*fSecondary).size() + << " ---------------" + << G4endl; + + for(size_t lp1=(*fSecondary).size()-tN2ndariesTot; + lp1<(*fSecondary).size(); lp1++){ + G4cout << " : " + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().x(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().y(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().z(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetKineticEnergy(),"Energy") + << std::setw(10) + << (*fSecondary)[lp1]->GetDefinition()->GetParticleName(); + G4cout << G4endl; + } + + G4cout << " :-----------------------------" + << "----------------------------------" + << "-- EndOf2ndaries Info ---------------" + << G4endl; + } + } + + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingVerbose::TrackingStarted() +{ + + CopyState(); +G4int prec = G4cout.precision(3); + if( verboseLevel > 0 ){ + + G4cout << std::setw( 5) << "Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "Volume" << " " + << std::setw(10) << "Process" << G4endl; + + G4cout << std::setw(5) << fTrack->GetCurrentStepNumber() << " " + << std::setw(6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetTrackLength(),"Length") + << " "; + + if(fTrack->GetNextVolume()){ + G4cout << std::setw(10) << fTrack->GetVolume()->GetName(); + } else { + G4cout << std::setw(10) << "OutOfWorld"; + } + G4cout << " initStep" << G4endl; + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/src/VisManager.cc b/examples/extended/electromagnetic/MuonProcesses/src/VisManager.cc new file mode 100755 index 0000000000..c827c9c3f3 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/src/VisManager.cc @@ -0,0 +1,151 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: VisManager.cc,v 1.1 2004/06/14 10:09:27 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4VIS_USE + +#include "VisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4HepRep.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPACS +#include "G4Wo.hh" +#include "G4Xo.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +VisManager::VisManager () {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void VisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4HepRep); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPACS + RegisterGraphicsSystem (new G4Wo); + RegisterGraphicsSystem (new G4Xo); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/MuonProcesses/vis.mac b/examples/extended/electromagnetic/MuonProcesses/vis.mac new file mode 100644 index 0000000000..841af5d450 --- /dev/null +++ b/examples/extended/electromagnetic/MuonProcesses/vis.mac @@ -0,0 +1,30 @@ +# +# Macro file for the initialization phase of "TestEm1.cc" +# +# Sets some default verbose +# and initializes the graphic. +# +/control/verbose 2 +/run/verbose 2 +# +/run/initialize +# +# Create empty scene ("world" is default) +/vis/scene/create +# +# Create a scene handler for a specific graphics system +# Edit the next line(s) to choose another graphic system +# +/vis/open OGLIX +# +#/vis/open DAWNFILE +# +# Draw scene +/vis/viewer/zoom 1.4 +/vis/viewer/flush +# +# for drawing the tracks +# if too many tracks cause core dump => storeTrajectory 0 +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate + diff --git a/examples/extended/electromagnetic/PhotonProcesses/GNUmakefile b/examples/extended/electromagnetic/PhotonProcesses/GNUmakefile new file mode 100644 index 0000000000..b5e8a1559c --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/GNUmakefile @@ -0,0 +1,40 @@ +# $Id: GNUmakefile,v 1.1 2004/04/28 11:09:04 maire Exp $ +# -------------------------------------------------------------- +# GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. +# -------------------------------------------------------------- + +name := PhotonProcesses +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../../.. +endif + +.PHONY: all +all: lib bin + +#### G4ANALYSIS_USE := true + +ifdef G4ANALYSIS_USE +USE_AIDA := true +endif + +ifdef USE_AIDA + CPPFLAGS += -DG4ANALYSIS_USE + CPPFLAGS += -DUSE_AIDA +endif + +include $(G4INSTALL)/config/architecture.gmk + +ifdef USE_AIDA + # for the aida-config command see the README file + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` +endif + +include $(G4INSTALL)/config/binmake.gmk + +visclean: + rm -f g4*.prim g4*.eps g4*.wrl + rm -f .DAWN_* diff --git a/examples/extended/electromagnetic/PhotonProcesses/History b/examples/extended/electromagnetic/PhotonProcesses/History new file mode 100644 index 0000000000..17978791cd --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/History @@ -0,0 +1,23 @@ +$Id: History,v 1.3 2004/06/10 15:55:35 maire Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + PhotonProcesses 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 * + ---------------------------------------------------------- + +10.06.04 mma (photonprocesses-V06-01-01) +- modifs in HistoManager and messenger to allow a multiruns job. + +23.04.04 Michel Maire (photonprocesses-V06-01-00) +- creation, from TestEm1 + diff --git a/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.cc b/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.cc new file mode 100644 index 0000000000..9768123e82 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.cc @@ -0,0 +1,121 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhotonProcesses.cc,v 1.2 2004/06/10 15:55:35 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" +#include "Randomize.hh" + +#include "DetectorConstruction.hh" +#include "PhysicsList.hh" +#include "PrimaryGeneratorAction.hh" +#include "SteppingVerbose.hh" + +#include "RunAction.hh" +#include "EventAction.hh" +#include "SteppingAction.hh" +#include "HistoManager.hh" + +#ifdef G4VIS_USE + #include "VisManager.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +int main(int argc,char** argv) { + + //choose the Random engine + HepRandom::setTheEngine(new RanecuEngine); + + //my Verbose output class + G4VSteppingVerbose::SetInstance(new SteppingVerbose); + + // Construct the default run manager + G4RunManager * runManager = new G4RunManager; + + // set mandatory initialization classes + DetectorConstruction* det; + PrimaryGeneratorAction* prim; + runManager->SetUserInitialization(det = new DetectorConstruction); + runManager->SetUserInitialization(new PhysicsList); + runManager->SetUserAction(prim = new PrimaryGeneratorAction(det)); + + #ifdef G4VIS_USE + // visualization manager + G4VisManager* visManager = new VisManager; + visManager->Initialize(); + #endif + + HistoManager* histo = 0; +#ifdef G4ANALYSIS_USE + histo = new HistoManager(); +#endif + + // set user action classes + RunAction* run; + runManager->SetUserAction(run = new RunAction(det,prim,histo)); + runManager->SetUserAction(new EventAction); + runManager->SetUserAction(new SteppingAction(run,histo)); + + // get the pointer to the User Interface manager + G4UImanager* UI = G4UImanager::GetUIpointer(); + + if (argc==1) // Define UI terminal for interactive mode + { + G4UIsession * session = 0; +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif + session->SessionStart(); + delete session; + } + else // Batch mode + { + G4String command = "/control/execute "; + G4String fileName = argv[1]; + UI->ApplyCommand(command+fileName); + } + + // job termination +#ifdef G4ANALYSIS_USE + delete histo; +#endif +#ifdef G4VIS_USE + delete visManager; +#endif + + delete runManager; + + return 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.in b/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.in new file mode 100644 index 0000000000..4dee0b97d8 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/PhotonProcesses.in @@ -0,0 +1,20 @@ +# $Id: PhotonProcesses.in,v 1.1 2004/04/28 11:09:05 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 100 keV; all processes +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Water +/testem/det/setSize 100 m +# +/run/initialize +# +/gun/energy 100 keV +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/README b/examples/extended/electromagnetic/PhotonProcesses/README new file mode 100644 index 0000000000..481071cb7e --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/README @@ -0,0 +1,143 @@ +$Id: README,v 1.3 2004/06/23 11:28:26 maire Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + PhotonProcesses + --------------- + + This test is devoted to the photon processes: gamma conversion, coherent + and incoherent scattering, photoelectric effect. It allows to compute + absorption coefficients and to plot final state. + + 1- GEOMETRY DEFINITION + + It is a single box representing a 'semi infinite' homogeneous medium. + Two parameters define the geometry : + - the material of the box, + - the (full) size of the box. + + The default geometry (100 m of water) is constructed in + DetectorConstruction, but the above parameters can be changed + interactively via the commands defined in DetectorMessenger. + + 2- PHYSICS LIST + + The particle list contains only gamma, e+, e-, mu+, mu-. + The physics list contains 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 (1 MeV gamma), and can be changed via the G4 + build-in commands of ParticleGun class (see the macros provided with + this example). + + 4- PHYSICS + + The incident particle is a photon. The event is killed at the first + interaction of the photon. + The absorption length is computed as the mean value of the track length + of the photon. + The energy spectrum and the angular distribution of the scattered photon + (if any) and of the secondaries are plotted (see SteppingAction). + + A set of macros defining various run conditions are provided. + The processes are actived/inactived in order to survey the processes + individually. + + 5- HISTOGRAMS + + The test contains 6 built-in 1D histograms, which are managed by the + HistoManager class and its Messenger. The histos can be individually + activated with the command : + /testem/histo/setHisto id nbBins valMin valMax unit + where unit is the desired unit for the histo (MeV or keV, etc..) + (see the macros xxxx.mac). + + 1 "scattered primary particle: energy spectrum" + 2 "scattered primary particle: costheta distribution" + 3 "charged secondaries: energy spectrum" + 4 "charged secondaries: costheta distribution" + 5 "neutral secondaries: energy spectrum" + 6 "neutral secondaries: costheta distribution" + + The histograms can be viewed using PAW. See below the note on + ANAPHE+AIDA. + + One can control the name of the histograms file with the command: + /testem/histo/setFileName name (default photonprocesses.paw) + + Note that, by default, histograms are disabled. To activate them, + uncomment the flag G4ANALYSIS_USE in GNUmakefile. + + 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 detector has a default view which is a longitudinal view of the + box. + + The tracks are drawn at the end of event, and erased at the end of run. + + 7- HOW TO START ? + + compile and link to generate an executable + % cd geant4/examples/extended/electromagnetic/PhotonProcesses + % gmake + + execute PhotonProcesses in 'batch' mode from macro files : + % PhotonProcesses compt.mac + + execute PhotonProcesses in 'interactive mode' with visualization : + % PhotonProcesses + Idle> control/execute vis.mac + .... + Idle> type your commands + .... + Idle> exit + + + 8- Using histograms + ------------------- + +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. + +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/PhotonProcesses/allproceses.mac b/examples/extended/electromagnetic/PhotonProcesses/allproceses.mac new file mode 100644 index 0000000000..1088a0ae39 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/allproceses.mac @@ -0,0 +1,20 @@ +# $Id: allproceses.mac,v 1.1 2004/04/28 11:09:06 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 100 keV; all processes +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Water +/testem/det/setSize 100 m +# +/run/initialize +# +/gun/energy 100 keV +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/compton.mac b/examples/extended/electromagnetic/PhotonProcesses/compton.mac new file mode 100644 index 0000000000..4dfab4eb34 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/compton.mac @@ -0,0 +1,29 @@ +# $Id: compton.mac,v 1.1 2004/04/28 11:09:06 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 300 keV; compton +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Aluminium +# +/run/initialize +# +/process/inactivate phot +/process/inactivate conv +/process/inactivate GammaToMuPair +# +/gun/energy 300 keV +# +/testem/histo/setFileName compton.paw +/testem/histo/setHisto 1 100 0. 300. keV #energy of primary +/testem/histo/setHisto 2 200 -1. +1. none #costeta of primary +/testem/histo/setHisto 3 100 0. 300. keV #energy of ch. secondary +/testem/histo/setHisto 4 200 -1. +1. none #costeta of ch. secondary +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/conv.mac b/examples/extended/electromagnetic/PhotonProcesses/conv.mac new file mode 100644 index 0000000000..47c850239f --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/conv.mac @@ -0,0 +1,27 @@ +# $Id: conv.mac,v 1.2 2004/06/10 15:55:36 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 100 MeV; gamma conversion to e+e- +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Lead +# +/run/initialize +# +/process/inactivate phot +/process/inactivate compt +/process/inactivate GammaToMuPair +# +/gun/energy 100 MeV +# +/testem/histo/setFileName conv.paw +/testem/histo/setHisto 3 200 0. 100. MeV #energy of ch. secondaries +/testem/histo/setHisto 4 200 0. +1. none #costeta of ch. secondaries +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/convtomu.mac b/examples/extended/electromagnetic/PhotonProcesses/convtomu.mac new file mode 100644 index 0000000000..6f5c81f753 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/convtomu.mac @@ -0,0 +1,28 @@ +# $Id: convtomu.mac,v 1.1 2004/04/28 11:09:07 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 100 TeV; gamma conversion to mu+mu- +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setMat Iron +/testem/det/setSize 10 km +# +/run/initialize +# +/process/inactivate phot +/process/inactivate compt +/process/inactivate conv +# +/gun/energy 100 TeV +# +/testem/histo/setFileName convtomu.paw +/testem/histo/setHisto 3 200 0. 100. TeV #energy of ch. secondaries +/testem/histo/setHisto 4 100 0.9 1.1 none #costeta of ch. secondaries +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/README b/examples/extended/electromagnetic/PhotonProcesses/geant3/README new file mode 100644 index 0000000000..871a4ef2cb --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/README @@ -0,0 +1,44 @@ + + photonprocesses is the geant3 equivalent of PhotonProcesses + + % cd geant3 + % gmakeB to make an executable (Batch version) + % gmakeT to make an executable (inTeractive version) + + To execute: + + % cd geant3 + % $G4SYSTEM/photonprocesses.xb (for batch) or photonprocesses.xt (for interactive) + + The program will ask: + G3 > gives the filename of the data cards to be read: + + myMacro.dat (myMacro.dat is the equivalent of the G4 myMacro.mac) + + data cards + ---------- + Most of the data cards used in xxxx.dat are standard data cards of GEANT3, + but some of them are defined in testem5: + + KEY VARIABLE/type Short description + + FILE fileName (character) fileName of the histos + (the FILE data card should be the + first, with the format A4,A2,A25) + + DETECTOR MAT (integer) mat.number of the absorber + THICK (real) X thickness of the absorber + + + histograms + ---------- + The list of built-in histograms is identical to TestEm5.cc + (see G4 README or histo.F) + + One can control the binning of the histograms with the data card: + *HISTO id1 nbBins valMin valMax valUnit + *HISTO id2 nbBins valMin valMax valUnit + ... etc ........... + + valMin and ValMax are given in the desired unit, whose numerical value must + be specified in valUnit. Remember that Geant3 defaults are: GeV, cm, rad. diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/allprocesses.dat b/examples/extended/electromagnetic/PhotonProcesses/geant3/allprocesses.dat new file mode 100644 index 0000000000..75c9163850 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/allprocesses.dat @@ -0,0 +1,18 @@ +FILE allprocesses.paw +LIST +C +C Photon Processes; gamma 1 MeV +C +DETECTOR 3 (Water) 10000. (cm) +KINE 1 (gamma) 0.001 (GeV) +C +PHOT 1 +COMP 1 +PAIR 1 +C +CUTS 10.e-6 (cutgam) 10.e-6 (cutele) +C +SWIT 0 (draw) +DEBUG 10 5 10000 +C +TRIG 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/compton.dat b/examples/extended/electromagnetic/PhotonProcesses/geant3/compton.dat new file mode 100644 index 0000000000..78ccf301e1 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/compton.dat @@ -0,0 +1,23 @@ +FILE compton.paw +LIST +C +C Photon 300 keV; compton +C +DETECTOR 5 (Aluminium) 10000. (cm) +KINE 1 (gamma) 300.e-6 (GeV) +C +*HISTO 1 (id) 100 (nbins) 0. (Emin) 300. (Emax) 1.e-6 (keV) +*HISTO 2 (id) 200 (nbins) -1. (cost1) +1. (cost2) +*HISTO 3 (id) 100 (nbins) 0. (Emin) 300. (Emax) 1.e-6 (keV) +*HISTO 4 (id) 200 (nbins) -1. (cost1) +1. (cost2) +C +PHOT 0 +COMP 1 +PAIR 0 +C +CUTS 10.e-6 (cutgam) 10.e-6 (cutele) +C +SWIT 0 (draw) +DEBUG 10 5 10000 +C +TRIG 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/conv.dat b/examples/extended/electromagnetic/PhotonProcesses/geant3/conv.dat new file mode 100644 index 0000000000..390431f3d5 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/conv.dat @@ -0,0 +1,21 @@ +FILE conversion.paw +LIST +C +C Photon 100 MeV; gamma conversion to e+e- +C +DETECTOR 8 (Lead) 10000. (cm) +KINE 1 (gamma) 0.1 (GeV) +C +*HISTO 3 (id) 200 (nbins) 0. (Emin) 100. (Emax) 1.e-3 (MeV) +*HISTO 4 (id) 200 (nbins) 0. (cost1) +1. (cost2) +C +PHOT 0 +COMP 0 +PAIR 1 +C +CUTS 10.e-6 (cutgam) 10.e-6 (cutele) +C +SWIT 0 (draw) +DEBUG 10 5 10000 +C +TRIG 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeB b/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeB new file mode 100755 index 0000000000..3a494805bb --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeB @@ -0,0 +1,32 @@ +# +# @(#) Script to build a Batch geant executable +# +set name=photonprocesses + +set extnam=" " +if ($G4SYSTEM == AIX-AFS) set extnam=-qextname +# +mkdir $G4SYSTEM +cd $G4SYSTEM +# +# fortran compilation +# +hepf77 $extnam -c -g -Dbatch -I/cern/pro/include -I../include ../src/*.F + +# +# Link +# +echo 'linking geant3+cernlib libraries ...' +# +hepf77 $extnam -g -o $name.xb *.o \ + `cernlib geant321 pawlib graflib packlib mathlib kernlib` +# +# +chmod +x $name.xb +# +# cleanup +# +rm -f *.o +echo 'done' +exit + diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeT b/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeT new file mode 100755 index 0000000000..bcdd89cfc9 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/gmakeT @@ -0,0 +1,31 @@ +# +# @(#) Script to build an inTeractive geant executable +# +set name=photonprocesses + +set extnam=" " +if ($G4SYSTEM == AIX-AFS) set extnam=-qextname +# +mkdir $G4SYSTEM +cd $G4SYSTEM +# +# fortran compilation +# +hepf77 $extnam -c -g -I/cern/pro/include -I../include ../src/*.F +# +# Link +# +echo 'linking geant3+cernlib libraries...' +# +hepf77 $extnam -g -o $name.xt *.o \ + `cernlib geant321 pawlib graflib packlib mathlib kernlib` +# +# +chmod +x $name.xt +# +# cleanup +# +rm -f *.o +echo 'done' +exit + diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/include/detector.inc b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/detector.inc new file mode 100644 index 0000000000..1405514abd --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/detector.inc @@ -0,0 +1,6 @@ + + COMMON/DETECTOR/Imat,BoxSize +* +* Imat = GEANT material number. (data card DETECTOR) +* BoxSize = total size of the box (cm) (data card DETECTOR) +* diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/include/histo.inc b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/histo.inc new file mode 100644 index 0000000000..1da08da7da --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/histo.inc @@ -0,0 +1,8 @@ + CHARACTER*25 fileName + COMMON/HISTO1/fileName + + COMMON/HISTO2/idhist,nbBins,valmin,valmax,valunit + + PARAMETER (MaxHist = 6) + LOGICAL histo + COMMON/HISTO3/histo(MaxHist),histUnit(MaxHist),binWidth(MaxHist) diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/include/process.inc b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/process.inc new file mode 100644 index 0000000000..749d2c6433 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/include/process.inc @@ -0,0 +1,2 @@ + + COMMON/PROCESS/nbCall(12),sumTrak,sumTrak2 diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ffuser.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ffuser.F new file mode 100644 index 0000000000..abe29f1568 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ffuser.F @@ -0,0 +1,11 @@ + + SUBROUTINE FFUSER(ikey) +* +* The routine is called when a *key card is read +* + CHARACTER*4 keyw +* + call UHTOC(ikey,4,keyw,4) + if (keyw.eq.'HIST') call uhinit +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gtgama.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gtgama.F new file mode 100644 index 0000000000..6feb8775a5 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gtgama.F @@ -0,0 +1,267 @@ + + SUBROUTINE GTGAMA +C. +C. ****************************************************************** +C. * * +C. * Photon track. Computes step size and propagates particle * +C. * through step. * +C. * * +C. * ==>Called by : GTRACK * +C. * Authors R.Brun, F.Bruyant L.Urban ******** * +C. * * +C. ****************************************************************** +C. +#include "geant321/gcbank.inc" +#include "geant321/gccuts.inc" +#include "geant321/gcjloc.inc" +#include "geant321/gconsp.inc" +#include "geant321/gcphys.inc" +#include "geant321/gcstak.inc" +#include "geant321/gctmed.inc" +#include "geant321/gcmulo.inc" +#include "geant321/gctrak.inc" +#include "geant321/gcunit.inc" + + PARAMETER (EPSMAC=1.E-6) + DOUBLE PRECISION ONE,XCOEF1,XCOEF2,XCOEF3,ZERO + + PARAMETER (ONE=1,ZERO=0) + PARAMETER (EPCUT=1.022E-3) +C. +*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + IABAN = NINT(DPHYS1) +*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +C. ------------------------------------------------------------------ +* +* *** Particle below energy threshold ? Short circuit +* +* + IF (GEKIN.LE.CUTGAM) GOTO 998 +* +* *** Update local pointers if medium has changed +* + IF(IUPD.EQ.0)THEN + IUPD = 1 + JPHOT = LQ(JMA-6) + JCOMP = LQ(JMA-8) + JPAIR = LQ(JMA-10) + JPFIS = LQ(JMA-12) + JRAYL = LQ(JMA-13) + ENDIF +* +* *** Compute current step size +* + IPROC = 103 + STEP = STEMAX + GEKRT1 = 1 .-GEKRAT +* +* ** Step limitation due to pair production ? +* + IF (GETOT.GT.EPCUT) THEN + IF (IPAIR.GT.0) THEN + STEPPA = GEKRT1*Q(JPAIR+IEKBIN) +GEKRAT*Q(JPAIR+IEKBIN+1) + SPAIR = STEPPA*ZINTPA + IF (SPAIR.LT.STEP) THEN + STEP = SPAIR + IPROC = 6 + ENDIF + ENDIF + ENDIF +* +* ** Step limitation due to Compton scattering ? +* + IF (ICOMP.GT.0) THEN + STEPCO = GEKRT1*Q(JCOMP+IEKBIN) +GEKRAT*Q(JCOMP+IEKBIN+1) + SCOMP = STEPCO*ZINTCO + IF (SCOMP.LT.STEP) THEN + STEP = SCOMP + IPROC = 7 + ENDIF + ENDIF +* +* ** Step limitation due to photo-electric effect ? +* + IF (GEKIN.LT.0.4) THEN + IF (IPHOT.GT.0) THEN + STEPPH = GEKRT1*Q(JPHOT+IEKBIN) +GEKRAT*Q(JPHOT+IEKBIN+1) + SPHOT = STEPPH*ZINTPH + IF (SPHOT.LT.STEP) THEN + STEP = SPHOT + IPROC = 8 + ENDIF + ENDIF + ENDIF +* +* ** Step limitation due to photo-fission ? +* + IF (JPFIS.GT.0) THEN + STEPPF = GEKRT1*Q(JPFIS+IEKBIN) +GEKRAT*Q(JPFIS+IEKBIN+1) + SPFIS = STEPPF*ZINTPF + IF (SPFIS.LT.STEP) THEN + STEP = SPFIS + IPROC = 23 + ENDIF + ENDIF +* +* ** Step limitation due to Rayleigh scattering ? +* + IF (IRAYL.GT.0) THEN + IF (GEKIN.LT.0.01) THEN + STEPRA = GEKRT1*Q(JRAYL+IEKBIN) +GEKRAT*Q(JRAYL+IEKBIN+1) + SRAYL = STEPRA*ZINTRA + IF (SRAYL.LT.STEP) THEN + STEP = SRAYL + IPROC = 25 + ENDIF + ENDIF + ENDIF +* + IF (STEP.LT.0.) STEP = 0. +* +* ** Step limitation due to geometry ? +* + IF (STEP.GE.SAFETY) THEN + CALL GTNEXT + IF (IGNEXT.NE.0) THEN + STEP = SNEXT + PREC + INWVOL= 2 + IPROC = 0 + NMEC = 1 + LMEC(1)=1 + ENDIF +* +* Update SAFETY in stack companions, if any + IF (IQ(JSTAK+3).NE.0) THEN + DO 10 IST = IQ(JSTAK+3),IQ(JSTAK+1) + JST = JSTAK +3 +(IST-1)*NWSTAK + Q(JST+11) = SAFETY + 10 CONTINUE + IQ(JSTAK+3) = 0 + ENDIF +* + ELSE + IQ(JSTAK+3) = 0 + ENDIF +* +* *** Linear transport +* + IF (INWVOL.EQ.2) THEN + DO 20 I = 1,3 + VECTMP = VECT(I) +STEP*VECT(I+3) + IF(VECTMP.EQ.VECT(I)) THEN +* +* *** Correct for machine precision +* + IF(VECT(I+3).NE.0.) THEN + VECTMP = VECT(I)+ABS(VECT(I))*SIGN(1.,VECT(I+3))* + + EPSMAC + IF(NMEC.GT.0) THEN + IF(LMEC(NMEC).EQ.104) NMEC=NMEC-1 + ENDIF + NMEC=NMEC+1 + LMEC(NMEC)=104 +#ifdef G3DEBUG + WRITE(CHMAIL, 10000) + CALL GMAIL(0,0) + WRITE(CHMAIL, 10100) GEKIN, NUMED, STEP, SNEXT + CALL GMAIL(0,0) +10000 FORMAT(' Boundary correction in GTGAMA: ', + + ' GEKIN NUMED STEP SNEXT') +10100 FORMAT(31X,E10.3,1X,I10,1X,E10.3,1X,E10.3,1X) +#endif + ENDIF + ENDIF + VECT(I) = VECTMP + 20 CONTINUE + ELSE + DO 30 I = 1,3 + VECT(I) = VECT(I) +STEP*VECT(I+3) + 30 CONTINUE + ENDIF +* + SLENG = SLENG +STEP +* +* *** Update time of flight +* + TOFG = TOFG +STEP/CLIGHT +* +* *** Update interaction probabilities +* + IF (GETOT.GT.EPCUT) THEN + IF (IPAIR.GT.0) ZINTPA = ZINTPA -STEP/STEPPA + ENDIF + IF (ICOMP.GT.0) ZINTCO = ZINTCO -STEP/STEPCO + IF (GEKIN.LT.0.4) THEN + IF (IPHOT.GT.0) ZINTPH = ZINTPH -STEP/STEPPH + ENDIF + IF (JPFIS.GT.0) ZINTPF = ZINTPF -STEP/STEPPF + IF (IRAYL.GT.0) THEN + IF (GEKIN.LT.0.01) ZINTRA = ZINTRA -STEP/STEPRA + ENDIF +* + IF (IPROC.EQ.0) GO TO 999 + NMEC = 1 + LMEC(1) = IPROC +* +* ** Pair production ? +* + IF (IPROC.EQ.6) THEN + CALL GPAIRG +* +* ** Compton scattering ? +* + ELSE IF (IPROC.EQ.7) THEN + CALL GCOMP +* +* ** Photo-electric effect ? +* + ELSE IF (IPROC.EQ.8) THEN +* + IF ((IABAN.NE.0).AND.(GEKIN.LE.0.001)) THEN +* Calculate range of the photoelectron ( with kin. energy Ephot) + JCOEF = LQ(JMA-17) + IF(GEKRAT.LT.0.7) THEN + I1 = MAX(IEKBIN-1,1) + ELSE + I1 = MIN(IEKBIN,NEKBIN-1) + ENDIF + I1 = 3*(I1-1)+1 + XCOEF1 = Q(JCOEF+I1) + XCOEF2 = Q(JCOEF+I1+1) + XCOEF3 = Q(JCOEF+I1+2) + IF(XCOEF1.NE.0.) THEN + STOPMX = -XCOEF2+SIGN(ONE,XCOEF1)*SQRT(XCOEF2**2 - (XCOEF3- + + GEKIN/XCOEF1)) + ELSE + STOPMX = - (XCOEF3-GEKIN)/XCOEF2 + ENDIF +* +* DO NOT call GPHOT if this (overestimated) range is smaller +* than SAFETY +* + IF (STOPMX.LE.SAFETY) GOTO 998 + ENDIF + + CALL GPHOT +* +* ** Rayleigh effect ? +* + ELSE IF (IPROC.EQ.25) THEN + CALL GRAYL +* +* ** Photo-fission ? +* + ELSE IF (IPROC.EQ.23) THEN + CALL GPFIS +* + ENDIF +* + GOTO 999 +998 DESTEP = GEKIN + GEKIN = 0. + GETOT = 0. + VECT(7)= 0. + ISTOP = 2 + NMEC = 1 + LMEC(1)= 30 + 999 END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gukine.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gukine.F new file mode 100644 index 0000000000..d3ab20ab19 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gukine.F @@ -0,0 +1,40 @@ + + SUBROUTINE GUKINE +* +* Generates Kinematics for primary track +* +* Data card Kine : Itype Ekine +* +#include "geant321/gcbank.inc" +#include "geant321/gcflag.inc" +#include "geant321/gckine.inc" +* +#include "detector.inc" +* + DIMENSION vertex(3),Plab(3) + dimension rndm(2) +* + DATA vertex/3*0./ + DATA Plab /3*0./ +* + vertex(1) = -0.5*BoxSize +* +* random in YZ + beam = 0.4*BoxSize + call GRNDM (rndm,2) +* + vertex(2) = (2*rndm(1)-1.)*beam + vertex(3) = (2*rndm(2)-1.)*beam +* + CALL GSVERT(vertex,0,0,0,0,NVERT) +* + JPA = LQ(JPART-IKINE) + XMASS = Q(JPA+7) + Plab(1) = SQRT(PKINE(1)*(PKINE(1)+2*XMASS)) +* + CALL GSKINE(Plab,IKINE,NVERT,0,0,NT) +* +* *** Kinematics debug + IF (IEVENT.EQ.1.OR.IDEBUG.NE.0) CALL GPRINT('KINE',0) +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/guout.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/guout.F new file mode 100644 index 0000000000..15de81bfb5 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/guout.F @@ -0,0 +1,18 @@ + + SUBROUTINE GUOUT +* +* User routine called at the end of each event +* +#include "geant321/gcflag.inc" +* +* *** drawing +* +#ifndef batch + IF (ISWIT(1).NE.0) THEN + CALL GDHEAD (110110,'PhotonProcesses',0.) + CALL GDSHOW (3) + CALL GDXYZ (0) + END IF +#endif +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gustep.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gustep.F new file mode 100644 index 0000000000..ef0b44713c --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/gustep.F @@ -0,0 +1,67 @@ + + SUBROUTINE GUSTEP +* +* User routine called at the end of each tracking step +* +#include "geant321/gcflag.inc" +#include "geant321/gckine.inc" +#include "geant321/gcking.inc" +#include "geant321/gctrak.inc" +* +#include "process.inc" +#include "histo.inc" +* + character*20 cdum +* +* *** Debug event and store tracks for drawing + IF (IDEBUG.NE.0) CALL GPCXYZ + IF (IDEBUG.NE.0) CALL GPGKIN + IF ((ISWIT(1).EQ.1).AND.(CHARGE.NE.0.)) CALL GSXYZ + IF (ISWIT(1).EQ.2) CALL GSXYZ +* +* *** if no process: return + IF (NMEC.EQ.0) return +* +* *** count nb of invoked processes + DO IM = 1,NMEC + IPROC = LMEC(IM) + IF (IPROC.EQ.21) IPROC = 12 + IF (IPROC.LE.12) NBCALL(IPROC) = NBCALL(IPROC)+1 + ENDDO +* +* *** sum track length for photon processes + if ((iproc.eq.6).or.(iproc.eq.7).or.(iproc.eq.8)) then + sumTrak = sumTrak + sleng + sumTrak2 = sumTrak2 + sleng*sleng + endif +* +* *** plot final state +* +* scattered primary particle (if still alive) + if (istop.eq.0) then + id = 1 + if (histo(id)) call hfill (id,gekin/histUnit(id),0.,1.) + id = 2 + if (histo(id)) call hfill (id,vect(4),0.,1.) + endif +* +* *** secondaries + if (ngkine.gt.0) then + do lp = 1,ngkine + ipar = gkin(5,lp) + 0.1 + call gfpart(ipar,cdum,ndum,gmass,gcharg,dum,dum,ndum) + ekin = gkin(4,lp) - gmass + pc = sqrt(gkin(1,lp)**2 + gkin(2,lp)**2 + gkin(3,lp)**2) + cost = gkin(1,lp)/pc + if (gcharg.ne.0.) id = 3 + if (gcharg.eq.0.) id = 5 + if (histo(id)) call hfill (id,ekin/histUnit(id),0.,1.) + id = id + 1 + if (histo(id)) call hfill (id,cost,0.,1.) + enddo + endif +* +* *** stop the tracking + istop = 1 +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/main.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/main.F new file mode 100644 index 0000000000..2ce531104e --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/main.F @@ -0,0 +1,61 @@ +#ifdef batch + + PROGRAM main +* +* + PARAMETER (NGBANK=100000, NHBOOK=10000) + COMMON/GCBANK/Q(NGBANK) + COMMON/PAWC /H(NHBOOK) +* + CALL GZEBRA( NGBANK) + CALL HLIMIT(-NHBOOK) +* +* *** initialize HIGZ + CALL HPLINT(0) +* +* *** GEANT initialisation + CALL UGINIT +* +* *** Start events processing + CALL GRUN +* +* *** End of RUN + CALL UGLAST +* + STOP + END + +#else + + PROGRAM main +* +* GEANT main program. To link with the MOTIF user interface +* the routine GPAWPP(NWGEAN,NWPAW) should be called, whereas +* the routine GPAW(NWGEAN,NWPAW) gives access to the basic +* graphics version. +* + PARAMETER (NWGEAN=3000000, NWPAW=1000000) + COMMON/GCBANK/GEANT(NWGEAN) + COMMON/PAWC /PAW (NWPAW) +* +* + CALL GPAW (NWGEAN,NWPAW) +* + END +* + SUBROUTINE qnext + END +* + SUBROUTINE czopen + END +* + SUBROUTINE cztcp + END +* + SUBROUTINE czclos + END +* + SUBROUTINE czputa + END + +#endif diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ugeom.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ugeom.F new file mode 100644 index 0000000000..ae4f680d26 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/ugeom.F @@ -0,0 +1,74 @@ + + SUBROUTINE UGEOM +* +* *** Define user geometry set up +* +* +#include "detector.inc" +* + DIMENSION PAR(3) + + DIMENSION Aair(2),Zair(2),Wair(2) + DIMENSION AH2O(2),ZH2O(2),WH2O(2) +* +* *** Air compound parameters + DATA Aair/14.01, 16.00/ + DATA Zair/ 7. , 8. / + DATA Wair/ 0.7 , 0.3 / +* +* *** Air compound parameters + DATA AH2O/ 1.01, 16.00/ + DATA ZH2O/ 1. , 8. / + DATA WH2O/ 2. , 1. / +* +* *** Defines USER perticular materials + CALL GSMIXT( 1,'Air' , Aair ,Zair, 1.29E-3, 2 , Wair) + CALL GSMATE( 2,'H2 Liquid', 1.01, 1., 0.0708 , 865., 790., 0,0) + CALL GSMIXT( 3,'Water' , AH2O ,ZH2O, 1.0 ,-2 , WH2O) + CALL GSMATE( 4,'Liquid Ar', 39.95, 18., 1.39 , 14.0, 84.0, 0,0) + CALL GSMATE( 5,'Aluminium', 26.98, 13., 2.7 , 8.9, 37.2, 0,0) + CALL GSMATE( 6,'Iron' , 55.85, 26., 7.87 , 1.76, 17.1, 0,0) + CALL GSMATE( 7,'Tungsten' ,183.85, 74., 19.30 , 0.35, 18.5, 0,0) + CALL GSMATE( 8,'Lead' ,207.19, 82., 11.35 , 0.56, 18.5, 0,0) + CALL GSMATE( 9,'Uranium' ,238.03, 92., 18.95 , 0.32, 12. , 0,0) + CALL GSMATE(10,'Germanium', 72.61, 32., 5.323 , 2.30, 16.6, 0,0) +* +* *** Defines USER tracking media parameters + IFIELD = 0 + FIELDM = 0. + TMAXFD = 10.0 + STEMAX = 1000. + DEEMAX = 0.20 + EPSIL = 0.001 + STMIN = 0.010 +* + CALL GSTMED( 1,'Container',Imat, 0 ,IFIELD,FIELDM,TMAXFD, + * STEMAX,DEEMAX,EPSIL,STMIN, 0 , 0 ) +* +* +* *** Geometry + PAR(1) = BoxSize/2. + PAR(2) = BoxSize/2. + PAR(3) = BoxSize/2. + CALL GSVOLU('aBox','BOX ',1,PAR,3,IVOL) +* +* *** Close geometry banks. (obligatory system routine) + CALL GGCLOS +* +* +* *** dessin + CALL GSATT ('*','SEEN',1) +* + DO IX = 1,3 + CALL GDOPEN (IX) + SCALE = 18./BoxSize + PAXIS = 0. + SAXIS = 0.1*BoxSize + CALL GDRAWC ('aBox',IX,0.,10.,9.3,SCALE,SCALE) + CALL GDAXIS (PAXIS,PAXIS,PAXIS,SAXIS) + CALL GDSCAL (10. , 0.3) + CALL GDCLOS + END DO +* + + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uginit.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uginit.F new file mode 100644 index 0000000000..1898cef9ff --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uginit.F @@ -0,0 +1,66 @@ + + SUBROUTINE UGINIT +* +* To initialise GEANT/USER program and read data cards +* +#include "detector.inc" +#include "process.inc" +#include "histo.inc" +* + CHARACTER*20 filnam + CHARACTER*4 key + CHARACTER*2 spaces +* +* *** Define the GEANT parameters + CALL GINIT +* +* histograms + do ih = 1,MaxHist + histo(ih) = .false. + enddo +* +* *** Detector definition + CALL FFKEY('DETECTOR',Imat,2,'MIXED') +* +* histograms + CALL FFKEY('HISTO',idhist,5,'MIXED') +* +* *** read data cards + PRINT *, 'G3 > gives the filename of the data cards to be read:' + READ (*,'(A)') filnam + IF (filnam.EQ.' ') filnam = 'allprocesses.dat' + OPEN (unit=5,file=filnam,status='unknown',form='formatted') +* +* filename should be 1st data card ! + fileName = 'photonprocesses.paw' + READ(5,98)key,spaces,fileName +98 FORMAT(A4,A2,A25) +* +* *** read data cards + CALL GFFGO +* + write(6,99) fileName +99 FORMAT(/,15x,'histogram file --> Name: ',A25) +* + CALL GZINIT + CALL GPART +* + CALL GDINIT +* +* *** Geometry and materials description + CALL UGEOM +* +* *** Energy loss and cross-sections initialisations + CALL GPHYSI +* + CALL GPRINT('MATE',0) + CALL GPRINT('TMED',0) + CALL GPRINT('VOLU',0) +* +* *** initialisation of /process/ + + CALL VZERO (nbCall,12) + sumTrak = 0. + sumTrak2 = 0. +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uglast.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uglast.F new file mode 100644 index 0000000000..b5ad119f80 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uglast.F @@ -0,0 +1,63 @@ + + SUBROUTINE UGLAST +* +* Termination routine to print histograms and statistics +* +#include "geant321/gcflag.inc" +#include "geant321/gckine.inc" +#include "geant321/gctrak.inc" +* +#include "detector.inc" +#include "process.inc" +#include "histo.inc" +* + character*20 material, particle + character*4 unit + real massMFP, massAC +* +* *** run conditions + call gfmate(Imat,material,dum,dum,density,dum,dum,dum,ndum) + call gfpart(Ikine,particle,ndum,dum,dum,dum,dum,ndum) + call gevkev(pkine(1),energy,unit) + PRINT 750, ievent,particle,energy,unit,boxSize,material,density +* +* *** frequency of processes call + CALL UCTOH('MUNU',NAMEC(12),4,4) + PRINT 760,(NAMEC(I),I=1,12) + PRINT 761,(NBCALL(I),I=1,12) +* +* *** compute mean free path and related quantities + nbProc = nbcall(6) + nbcall(7) + nbcall(8) + avTrak = sumTrak /nbProc + avTrak2 = sumTrak2/nbProc + rms = sqrt(abs(avTrak2 - avTrak*avTrak)) + AtteCoef = 1./avTrak +* + massMFP = avTrak*density + massAC = 1./massMFP + print 770, avTrak,rms,massMFP,AtteCoef,massAC +* +* *** geant termination + CALL GLAST +* +* *** close HIGZ file + CALL HPLEND +* +* *** histograms + CALL HRPUT(0,fileName,'N') +* +* *** formats +* + 750 FORMAT(/,1X,'The run consists of ',I7,1X,A8,' of ',F7.2,A4, + + ' throught',F10.2,' cm of ',A8,' (density: ',F7.3,' g/cm3)') + + 760 FORMAT(/,1X,'Frequency of process calls: ', + + /,1X,12A8) + 761 FORMAT( 1X,12I8,/) + + 770 FORMAT(/,1X,'MeanFreePath: ',F12.5,' cm +- ',F12.5,' cm', + + 5X,'massic: ',F12.5,' g/cm2', + + /,1X,'AttenuationCoef: ',F12.5,' cm^-1 ',15X, + + 5X,'massic: ',F12.5,' cm2/g',/) +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uhinit.F b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uhinit.F new file mode 100644 index 0000000000..c58617dae2 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/geant3/src/uhinit.F @@ -0,0 +1,28 @@ + + SUBROUTINE UHINIT +* +* +#include "histo.inc" +* + CHARACTER*50 title(6) +* + data title / + 1 'scattered primary particle: energy spectrum', + 2 'scattered primary particle: costheta distribution', + 3 'charged secondaries: energy spectrum', + 4 'charged secondaries: costheta distribution', + 5 'neutral secondaries: energy spectrum', + 6 'neutral secondaries: costheta distribution' / +* + if (histo(idhist)) call hdelet(idhist) +* + vmin = valmin + vmax = valmax + call hbook1(idhist,title(idhist),nbBins,vmin,vmax,0.) +* + histo (idhist) = .true. + binWidth(idhist) = (valmax-valmin)/nbBins + if (valunit.le.0.) valunit = 1. + histUnit(idhist) = valunit +* + END diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/DetectorConstruction.hh b/examples/extended/electromagnetic/PhotonProcesses/include/DetectorConstruction.hh new file mode 100644 index 0000000000..dfbdd69a2a --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/DetectorConstruction.hh @@ -0,0 +1,89 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorConstruction.hh,v 1.1 2004/04/28 11:11:54 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorConstruction_h +#define DetectorConstruction_h 1 + +#include "G4VUserDetectorConstruction.hh" +#include "globals.hh" + +class G4LogicalVolume; +class G4Material; +class DetectorMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorConstruction : public G4VUserDetectorConstruction +{ + public: + + DetectorConstruction(); + ~DetectorConstruction(); + + public: + + G4VPhysicalVolume* Construct(); + + void SetSize (G4double); + void SetMaterial (G4String); + + void UpdateGeometry(); + + public: + + const + G4VPhysicalVolume* GetWorld() {return pBox;}; + + G4double GetSize() {return BoxSize;}; + G4Material* GetMaterial() {return aMaterial;}; + + void PrintParameters(); + + private: + + G4VPhysicalVolume* pBox; + G4LogicalVolume* lBox; + + G4double BoxSize; + G4Material* aMaterial; + + DetectorMessenger* detectorMessenger; + + private: + + void DefineMaterials(); + G4VPhysicalVolume* ConstructVolumes(); +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/DetectorMessenger.hh b/examples/extended/electromagnetic/PhotonProcesses/include/DetectorMessenger.hh new file mode 100644 index 0000000000..2da09072bd --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/DetectorMessenger.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorMessenger.hh,v 1.1 2004/04/28 11:11:54 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DetectorMessenger_h +#define DetectorMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class DetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorMessenger: public G4UImessenger +{ + public: + + DetectorMessenger(DetectorConstruction* ); + ~DetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + + DetectorConstruction* Detector; + + G4UIdirectory* testemDir; + G4UIdirectory* detDir; + G4UIcmdWithAString* MaterCmd; + G4UIcmdWithADoubleAndUnit* SizeCmd; + G4UIcmdWithoutParameter* UpdateCmd; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/EventAction.hh b/examples/extended/electromagnetic/PhotonProcesses/include/EventAction.hh new file mode 100644 index 0000000000..27fdefa106 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/EventAction.hh @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EventAction.hh,v 1.1 2004/04/28 11:11:54 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef EventAction_h +#define EventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" + +class EventActionMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EventAction : public G4UserEventAction +{ + public: + EventAction(); + ~EventAction(); + + public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + + void SetPrintModulo(G4int val) {printModulo = val;}; + + private: + G4int printModulo; + EventActionMessenger* eventMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + diff --git a/examples/extended/electromagnetic/TestEm1/include/PhysListParticles.hh b/examples/extended/electromagnetic/PhotonProcesses/include/EventActionMessenger.hh similarity index 75% rename from examples/extended/electromagnetic/TestEm1/include/PhysListParticles.hh rename to examples/extended/electromagnetic/PhotonProcesses/include/EventActionMessenger.hh index bd968806c6..c036cc1ad2 100644 --- a/examples/extended/electromagnetic/TestEm1/include/PhysListParticles.hh +++ b/examples/extended/electromagnetic/PhotonProcesses/include/EventActionMessenger.hh @@ -21,45 +21,40 @@ // ******************************************************************** // // -// $Id: PhysListParticles.hh,v 1.1 2003/10/06 10:02:25 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: EventActionMessenger.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // - +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListParticles_h -#define PhysListParticles_h 1 +#ifndef EventActionMessenger_h +#define EventActionMessenger_h 1 -#include "G4VPhysicsConstructor.hh" +#include "G4UImessenger.hh" #include "globals.hh" +class EventAction; +class G4UIdirectory; +class G4UIcmdWithAnInteger; + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListParticles : public G4VPhysicsConstructor +class EventActionMessenger: public G4UImessenger { - public: - PhysListParticles(const G4String& name = "particles"); - ~PhysListParticles(); - - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(); - - // This method is dummy. - void ConstructProcess() {}; - + public: + EventActionMessenger(EventAction*); + ~EventActionMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + EventAction* eventAction; + + G4UIdirectory* eventDir; + G4UIcmdWithAnInteger* PrintCmd; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - - - - - - - diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/HistoManager.hh b/examples/extended/electromagnetic/PhotonProcesses/include/HistoManager.hh new file mode 100644 index 0000000000..93284743bf --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/HistoManager.hh @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: HistoManager.hh,v 1.2 2004/06/10 15:55:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoManager_h +#define HistoManager_h 1 + +#ifdef USE_AIDA + +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +namespace AIDA { + class ITree; + class IHistogramFactory; + class IHistogram1D; +} + +class HistoMessenger; + + const G4int MaxHisto = 7; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager +{ + public: + + HistoManager(); + ~HistoManager(); + + void SetFileName (G4String name) { fileName = name;}; + void SetFactory (); + void SaveFactory (); + void SetHisto (G4int, G4int, G4double, G4double, G4String unit="none"); + void RemoveHisto (G4int); + + AIDA::ITree* GetTree() {return tree;} + AIDA::IHistogramFactory* GetHistogramFactory() {return hf;} + AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} + G4double GetHistoUnit(G4int id) {return Unit[id];} + G4double GetBinWidth (G4int id) {return Width[id];} + + private: + + G4String fileName; + AIDA::ITree* tree; + AIDA::IHistogramFactory* hf; + AIDA::IHistogram1D* histo[MaxHisto]; + G4bool exist[MaxHisto]; + G4String Label[MaxHisto]; + G4String Title[MaxHisto]; + G4int Nbins[MaxHisto]; + G4double Vmin [MaxHisto]; + G4double Vmax [MaxHisto]; + G4double Unit [MaxHisto]; + G4double Width[MaxHisto]; + G4bool factoryOn; + HistoMessenger* histoMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/HistoMessenger.hh b/examples/extended/electromagnetic/PhotonProcesses/include/HistoMessenger.hh new file mode 100644 index 0000000000..6ed030d2e2 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/HistoMessenger.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoMessenger.hh,v 1.2 2004/06/10 15:55:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoMessenger_h +#define HistoMessenger_h 1 + +#ifdef G4ANALYSIS_USE + +#include "G4UImessenger.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager; +class G4UIdirectory; +class G4UIcommand; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoMessenger: public G4UImessenger +{ + public: + + HistoMessenger(HistoManager* ); + ~HistoMessenger(); + + void SetNewValue(G4UIcommand* ,G4String ); + + private: + + HistoManager* histoManager; + + G4UIdirectory* histoDir; + G4UIcmdWithAString* factoryCmd; + G4UIcommand* histoCmd; + G4UIcmdWithAnInteger* rmhistoCmd; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif +#endif diff --git a/examples/extended/electromagnetic/TestEm2/include/PhysListEmStandard.hh b/examples/extended/electromagnetic/PhotonProcesses/include/PhysListEmStandard.hh similarity index 95% rename from examples/extended/electromagnetic/TestEm2/include/PhysListEmStandard.hh rename to examples/extended/electromagnetic/PhotonProcesses/include/PhysListEmStandard.hh index 2c2cf16def..6ba87335b8 100644 --- a/examples/extended/electromagnetic/TestEm2/include/PhysListEmStandard.hh +++ b/examples/extended/electromagnetic/PhotonProcesses/include/PhysListEmStandard.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.hh,v 1.1 2003/10/08 17:28:36 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsList.hh b/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsList.hh new file mode 100644 index 0000000000..547af54805 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsList.hh @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsList.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// +// 14.10.02 (V.Ivanchenko) provide modular list on base of old PhysicsList +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsList_h +#define PhysicsList_h 1 + +#include "G4VModularPhysicsList.hh" +#include "globals.hh" + +class G4VPhysicsConstructor; +class PhysicsListMessenger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsList: public G4VModularPhysicsList +{ + public: + PhysicsList(); + ~PhysicsList(); + + void ConstructParticle(); + void ConstructProcess(); + void AddPhysicsList(const G4String& name); + + void SetCuts(); + + private: + G4String emName; + G4VPhysicsConstructor* emPhysicsList; + + PhysicsListMessenger* messenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsListMessenger.hh b/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsListMessenger.hh new file mode 100644 index 0000000000..c18128a927 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/PhysicsListMessenger.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsListMessenger.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysicsListMessenger_h +#define PhysicsListMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class PhysicsList; +class G4UIdirectory; +class G4UIcmdWithAString; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysicsListMessenger: public G4UImessenger +{ + public: + + PhysicsListMessenger(PhysicsList* ); + ~PhysicsListMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + + private: + + PhysicsList* physicsList; + + G4UIdirectory* physDir; + G4UIcmdWithAString* pListCmd; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/PrimaryGeneratorAction.hh b/examples/extended/electromagnetic/PhotonProcesses/include/PrimaryGeneratorAction.hh new file mode 100644 index 0000000000..ec2aa830e3 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/PrimaryGeneratorAction.hh @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PrimaryGeneratorAction.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PrimaryGeneratorAction_h +#define PrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "G4ParticleGun.hh" +#include "globals.hh" + +class G4Event; +class DetectorConstruction; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + PrimaryGeneratorAction(DetectorConstruction*); + ~PrimaryGeneratorAction(); + + public: + void GeneratePrimaries(G4Event*); + G4ParticleGun* GetParticleGun() {return particleGun;}; + + private: + G4ParticleGun* particleGun; + DetectorConstruction* detector; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/ProcessesCount.hh b/examples/extended/electromagnetic/PhotonProcesses/include/ProcessesCount.hh new file mode 100644 index 0000000000..a84dc20f6d --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/ProcessesCount.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: ProcessesCount.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef ProcessesCount_HH +#define ProcessesCount_HH + +#include "globals.hh" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class OneProcessCount +{ +public: + OneProcessCount(G4String name) {Name=name; Counter=0;}; + ~OneProcessCount() {}; + +public: + G4String GetName() {return Name;}; + G4int GetCounter() {return Counter;}; + void Count() {Counter++;}; + +private: + G4String Name; // process name + G4int Counter; // process counter +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +typedef std::vector ProcessesCount; + +#endif + + + + + + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/RunAction.hh b/examples/extended/electromagnetic/PhotonProcesses/include/RunAction.hh new file mode 100644 index 0000000000..55dbc6d082 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/RunAction.hh @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RunAction.hh,v 1.2 2004/06/10 15:55:37 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef RunAction_h +#define RunAction_h 1 + +#include "G4UserRunAction.hh" +#include "ProcessesCount.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DetectorConstruction; +class PrimaryGeneratorAction; +class HistoManager; +class G4Run; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class RunAction : public G4UserRunAction +{ + public: + RunAction(DetectorConstruction*, PrimaryGeneratorAction*, HistoManager*); + ~RunAction(); + + public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + + void CountProcesses(G4String); + void SumTrack (G4double track) + {totalCount++; sumTrack += track; sumTrack2 += track*track;}; + + private: + DetectorConstruction* detector; + PrimaryGeneratorAction* primary; + ProcessesCount* ProcCounter; + HistoManager* histoManager; + + G4int totalCount; //all processes counter + G4double sumTrack; //sum of trackLength + G4double sumTrack2; //sum of trackLength*trackLength +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/SteppingAction.hh b/examples/extended/electromagnetic/PhotonProcesses/include/SteppingAction.hh new file mode 100644 index 0000000000..4ad1a009dc --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/SteppingAction.hh @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SteppingAction.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef SteppingAction_h +#define SteppingAction_h 1 + +#include "G4UserSteppingAction.hh" + +class RunAction; +class HistoManager; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class SteppingAction : public G4UserSteppingAction +{ + public: + SteppingAction(RunAction*, HistoManager*); + ~SteppingAction(); + + void UserSteppingAction(const G4Step*); + + private: + RunAction* runAction; + HistoManager* histoManager; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/SteppingVerbose.hh b/examples/extended/electromagnetic/PhotonProcesses/include/SteppingVerbose.hh new file mode 100644 index 0000000000..39ed5c7cf0 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/SteppingVerbose.hh @@ -0,0 +1,55 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SteppingVerbose.hh,v 1.1 2004/04/28 11:11:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// This class manages the verbose outputs in G4SteppingManager. +// It inherits from G4SteppingVerbose. +// It shows how to extract informations during the tracking of a particle. +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef SteppingVerbose_h +#define SteppingVerbose_h 1 + +#include "G4SteppingVerbose.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class SteppingVerbose : public G4SteppingVerbose { + +public: + + SteppingVerbose(); + ~SteppingVerbose(); + + void StepInfo(); + void TrackingStarted(); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/PhotonProcesses/include/VisManager.hh b/examples/extended/electromagnetic/PhotonProcesses/include/VisManager.hh new file mode 100644 index 0000000000..cc6f030d10 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/include/VisManager.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: VisManager.hh,v 1.1 2004/04/28 11:11:56 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Example Visualization Manager implementing virtual function +// RegisterGraphicsSystems. Exploits C-pre-processor variables +// G4VIS_USE_DAWN, etc., which are set by the GNUmakefiles if +// environment variables of the same name are set. + +// So all you have to do is set environment variables and compile and +// instantiate this in your main(). + +// Alternatively, you can implement an empty function here and just +// register the systems you want in your main(), e.g.: +// G4VisManager* myVisManager = new MyVisManager; +// myVisManager -> RegisterGraphicsSystem (new MyGraphicsSystem); + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef VisManager_h +#define VisManager_h 1 + +#include "G4VisManager.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class VisManager: public G4VisManager { + +public: + + VisManager (); + +private: + + void RegisterGraphicsSystems (); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/PhotonProcesses/phot.mac b/examples/extended/electromagnetic/PhotonProcesses/phot.mac new file mode 100644 index 0000000000..b5b83b4823 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/phot.mac @@ -0,0 +1,28 @@ +# $Id: phot.mac,v 1.1 2004/04/28 11:09:07 maire Exp $ +# +# Macro file for "PhotonProcesses.cc" +# (can be run in batch, without graphic) +# +# photon 100 keV; photoelectric +# +/control/verbose 2 +/run/verbose 2 +# +#/testem/det/setMat Iron +/testem/det/setMat BGO +# +/run/initialize +# +/process/inactivate compt +/process/inactivate conv +/process/inactivate GammaToMuPair +# +/gun/energy 100 keV +# +/testem/histo/setFileName phot.paw +/testem/histo/setHisto 3 100 0. 100. keV #energy of ch. secondaries +/testem/histo/setHisto 4 200 -1. +1. none #costeta of ch. secondaries +# +/testem/event/printModulo 10000 +# +/run/beamOn 100000 diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/DetectorConstruction.cc b/examples/extended/electromagnetic/PhotonProcesses/src/DetectorConstruction.cc new file mode 100644 index 0000000000..4e6e38e355 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/DetectorConstruction.cc @@ -0,0 +1,201 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +// +// $Id: DetectorConstruction.cc,v 1.1 2004/04/28 11:12:38 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorConstruction.hh" +#include "DetectorMessenger.hh" + +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4LogicalVolume.hh" +#include "G4PVPlacement.hh" + +#include "G4GeometryManager.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" + +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorConstruction::DetectorConstruction() +:pBox(0), lBox(0), aMaterial(0) +{ + BoxSize = 100*m; + DefineMaterials(); + SetMaterial("Water"); + detectorMessenger = new DetectorMessenger(this); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorConstruction::~DetectorConstruction() +{ delete detectorMessenger;} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::Construct() +{ + return ConstructVolumes(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::DefineMaterials() +{ + // + // define Elements + // + G4double z,a; + + G4Element* H = new G4Element("Hydrogen" ,"H" , z= 1., a= 1.01*g/mole); + G4Element* N = new G4Element("Nitrogen" ,"N" , z= 7., a= 14.01*g/mole); + G4Element* O = new G4Element("Oxygen" ,"O" , z= 8., a= 16.00*g/mole); + G4Element* Ge = new G4Element("Germanium","Ge", z=32., a= 72.59*g/mole); + G4Element* Bi = new G4Element("Bismuth" ,"Bi", z=83., a= 208.98*g/mole); + + // + // define materials + // + G4double density; + G4int ncomponents, natoms; + G4double fractionmass; + + G4Material* Air = + new G4Material("Air", density= 1.290*mg/cm3, ncomponents=2); + Air->AddElement(N, fractionmass=70.*perCent); + Air->AddElement(O, fractionmass=30.*perCent); + + G4Material* H2l = + new G4Material("H2liquid", density= 70.8*mg/cm3, ncomponents=1); + H2l->AddElement(H, fractionmass=1.); + + G4Material* H2O = + new G4Material("Water", density= 1.000*g/cm3, ncomponents=2); + H2O->AddElement(H, natoms=2); + H2O->AddElement(O, natoms=1); + H2O->SetChemicalFormula("H_2O"); + H2O->GetIonisation()->SetMeanExcitationEnergy(75.0*eV); + + new G4Material("liquidArgon", z=18., a= 39.95*g/mole, density= 1.390*g/cm3); + + new G4Material("Aluminium" , z=13., a= 26.98*g/mole, density= 2.700*g/cm3); + + new G4Material("Silicon" , z=14., a= 28.09*g/mole, density= 2.330*g/cm3); + + new G4Material("Germanium" , z=32., a= 72.61*g/mole, density= 5.323*g/cm3); + + G4Material* BGO = + new G4Material("BGO", density= 7.10*g/cm3, ncomponents=3); + BGO->AddElement(O , natoms=12); + BGO->AddElement(Ge, natoms= 3); + BGO->AddElement(Bi, natoms= 4); + + new G4Material("Iron" , z=26., a= 55.85*g/mole, density= 7.870*g/cm3); + + new G4Material("Tungsten" , z=74., a=183.85*g/mole, density= 19.30*g/cm3); + + new G4Material("Lead" , z=82., a=207.19*g/mole, density= 11.35*g/cm3); + + new G4Material("Uranium" , z=92., a=238.03*g/mole, density= 18.95*g/cm3); + + + G4cout << *(G4Material::GetMaterialTable()) << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() +{ + // Cleanup old geometry + G4GeometryManager::GetInstance()->OpenGeometry(); + G4PhysicalVolumeStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4SolidStore::GetInstance()->Clean(); + + G4Box* + sBox = new G4Box("Container", //its name + BoxSize/2,BoxSize/2,BoxSize/2); //its dimensions + + lBox = new G4LogicalVolume(sBox, //its shape + aMaterial, //its material + aMaterial->GetName()); //its name + + pBox = new G4PVPlacement(0, //no rotation + G4ThreeVector(), //at (0,0,0) + lBox, //its logical volume + aMaterial->GetName(), //its name + 0, //its mother volume + false, //no boolean operation + 0); //copy number + + PrintParameters(); + + //always return the root volume + // + return pBox; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::PrintParameters() +{ + G4cout << "\n The Box is " << G4BestUnit(BoxSize,"Length") + << " of " << aMaterial->GetName() << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetMaterial(G4String materialChoice) +{ + // search the material by its name + G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); + if (pttoMaterial) aMaterial = pttoMaterial; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorConstruction::SetSize(G4double value) +{ + BoxSize = value; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4RunManager.hh" + +void DetectorConstruction::UpdateGeometry() +{ + G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes()); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/DetectorMessenger.cc b/examples/extended/electromagnetic/PhotonProcesses/src/DetectorMessenger.cc new file mode 100644 index 0000000000..e01538482c --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/DetectorMessenger.cc @@ -0,0 +1,95 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DetectorMessenger.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "DetectorMessenger.hh" + +#include "DetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithoutParameter.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::DetectorMessenger(DetectorConstruction * Det) +:Detector(Det) +{ + testemDir = new G4UIdirectory("/testem/"); + testemDir->SetGuidance("commands specific to this example"); + + detDir = new G4UIdirectory("/testem/det/"); + detDir->SetGuidance("detector construction"); + + MaterCmd = new G4UIcmdWithAString("/testem/det/setMat",this); + MaterCmd->SetGuidance("Select material of the box."); + MaterCmd->SetParameterName("choice",false); + MaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + SizeCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setSize",this); + SizeCmd->SetGuidance("Set size of the box"); + SizeCmd->SetParameterName("Size",false); + SizeCmd->SetRange("Size>0."); + SizeCmd->SetUnitCategory("Length"); + SizeCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + UpdateCmd = new G4UIcmdWithoutParameter("/testem/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); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +DetectorMessenger::~DetectorMessenger() +{ + delete MaterCmd; + delete SizeCmd; + delete UpdateCmd; + delete detDir; + delete testemDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if( command == MaterCmd ) + { Detector->SetMaterial(newValue);} + + if( command == SizeCmd ) + { Detector->SetSize(SizeCmd->GetNewDoubleValue(newValue));} + + if( command == UpdateCmd ) + { Detector->UpdateGeometry(); } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/EventAction.cc b/examples/extended/electromagnetic/PhotonProcesses/src/EventAction.cc new file mode 100644 index 0000000000..9bd9543437 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/EventAction.cc @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EventAction.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EventAction.hh" + +#include "EventActionMessenger.hh" + +#include "G4Event.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventAction::EventAction() +:printModulo(10000),eventMessenger(0) +{ + eventMessenger = new EventActionMessenger(this); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventAction::~EventAction() +{ + delete eventMessenger; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventAction::BeginOfEventAction(const G4Event* evt) +{ + G4int evtNb = evt->GetEventID(); + + //printing survey + if (evtNb%printModulo == 0) + G4cout << "\n---> Begin of Event: " << evtNb << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventAction::EndOfEventAction(const G4Event* evt) +{ + if (G4VVisManager::GetConcreteInstance()) + { + G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + for (G4int i=0; iGetTrajectoryContainer()))[i]); + trj->DrawTrajectory(1000); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/EventActionMessenger.cc b/examples/extended/electromagnetic/PhotonProcesses/src/EventActionMessenger.cc new file mode 100644 index 0000000000..0e73d9ebe8 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/EventActionMessenger.cc @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EventActionMessenger.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EventActionMessenger.hh" + +#include "EventAction.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAnInteger.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventActionMessenger::EventActionMessenger(EventAction* EvAct) +:eventAction(EvAct) +{ + eventDir = new G4UIdirectory("/testem/event/"); + eventDir ->SetGuidance("physics list"); + + PrintCmd = new G4UIcmdWithAnInteger("/testem/event/printModulo",this); + PrintCmd->SetGuidance("Print events modulo n"); + PrintCmd->SetParameterName("EventNb",false); + PrintCmd->SetRange("EventNb>0"); + PrintCmd->AvailableForStates(G4State_Idle); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EventActionMessenger::~EventActionMessenger() +{ + delete PrintCmd; + delete eventDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EventActionMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if (command == PrintCmd) + {eventAction->SetPrintModulo(PrintCmd->GetNewIntValue(newValue));} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/HistoManager.cc b/examples/extended/electromagnetic/PhotonProcesses/src/HistoManager.cc new file mode 100644 index 0000000000..00d7833a30 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/HistoManager.cc @@ -0,0 +1,168 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: HistoManager.cc,v 1.2 2004/06/10 15:55:37 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef USE_AIDA + +#include "HistoManager.hh" +#include "HistoMessenger.hh" + +#include "AIDA/AIDA.h" +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoManager::HistoManager() +:tree(0),hf(0),factoryOn(false) +{ + fileName = "photonprocesses.paw"; + + // histograms + for (G4int k=0; kHistoManager::SetFactory(): factory already exists" + << G4endl; + SaveFactory(); + } + + // Creating the analysis factory + AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); + + // Creating the tree factory + AIDA::ITreeFactory* tf = af->createTreeFactory(); + + // Creating a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create(fileName, "hbook", readOnly, createNew); + + // Creating a histogram factory, whose histograms will be handled by the tree + hf = af->createHistogramFactory(*tree); + + // create selected histograms + for (G4int k=0; kcreateHistogram1D( Label[k], Title[k], + Nbins[k], Vmin[k], Vmax[k]); + } + + delete tf; + delete af; + factoryOn = true; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SaveFactory() +{ + if (factoryOn) { + tree->commit(); // Writing the histograms to the file + tree->close(); // and closing the tree (and the file) + + delete hf; + delete tree; + factoryOn = false; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SetHisto(G4int ih, + G4int nbins, G4double valmin, G4double valmax, G4String unit) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + + const G4String id[] = { "0", "1", "2", "3", "4", "5", "6"}; + const G4String title[] = + { "dummy", //0 + "scattered primary particle: energy spectrum", //1 + "scattered primary particle: costheta distribution", //2 + "charged secondaries: energy spectrum", //3 + "charged secondaries: costheta distribution", //4 + "neutral secondaries: energy spectrum", //5 + "neutral secondaries: costheta distribution" //6 + }; + + G4String titl = title[ih]; + G4double vmin = valmin, vmax = valmax; + Unit[ih] = 1.; + + if (unit != "none") { + titl = title[ih] + " (" + unit + ")"; + Unit[ih] = G4UnitDefinition::GetValueOf(unit); + vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; + } + + exist[ih] = true; + Label[ih] = id[ih]; + Title[ih] = titl; + Nbins[ih] = nbins; + Vmin[ih] = vmin; + Vmax[ih] = vmax; + Width[ih] = (valmax-valmin)/nbins; + + G4cout << "----> SetHisto " << ih << ": " << titl << "; " + << nbins << " bins from " + << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::RemoveHisto(G4int ih) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + + histo[ih] = 0; exist[ih] = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/HistoMessenger.cc b/examples/extended/electromagnetic/PhotonProcesses/src/HistoMessenger.cc new file mode 100644 index 0000000000..cced682689 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/HistoMessenger.cc @@ -0,0 +1,119 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: HistoMessenger.cc,v 1.2 2004/06/10 15:55:37 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4ANALYSIS_USE + +#include "HistoMessenger.hh" + +#include "HistoManager.hh" +#include "G4UIdirectory.hh" +#include "G4UIcommand.hh" +#include "G4UIparameter.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::HistoMessenger(HistoManager* manager) +:histoManager (manager) +{ + histoDir = new G4UIdirectory("/testem/histo/"); + histoDir->SetGuidance("histograms control"); + + factoryCmd = new G4UIcmdWithAString("/testem/histo/setFileName",this); + factoryCmd->SetGuidance("set name for the histograms file"); + + histoCmd = new G4UIcommand("/testem/histo/setHisto",this); + histoCmd->SetGuidance("Set bining of the histo number ih :"); + histoCmd->SetGuidance(" nbBins; valMin; valMax; unit (of vmin and vmax)"); + // + G4UIparameter* ih = new G4UIparameter("ih",'i',false); + ih->SetGuidance("histo number : from 1 to MaxHisto"); + ih->SetParameterRange("ih>0"); + histoCmd->SetParameter(ih); + // + G4UIparameter* nbBins = new G4UIparameter("nbBins",'i',false); + nbBins->SetGuidance("number of bins"); + nbBins->SetParameterRange("nbBins>0"); + histoCmd->SetParameter(nbBins); + // + G4UIparameter* valMin = new G4UIparameter("valMin",'d',false); + valMin->SetGuidance("valMin, expressed in unit"); + histoCmd->SetParameter(valMin); + // + G4UIparameter* valMax = new G4UIparameter("valMax",'d',false); + valMax->SetGuidance("valMax, expressed in unit"); + histoCmd->SetParameter(valMax); + // + G4UIparameter* unit = new G4UIparameter("unit",'s',true); + unit->SetGuidance("if omitted, vmin and vmax are assumed dimensionless"); + unit->SetDefaultValue("none"); + histoCmd->SetParameter(unit); + + rmhistoCmd = new G4UIcmdWithAnInteger("/testem/histo/removeHisto",this); + rmhistoCmd->SetGuidance("desactivate histo #id"); + rmhistoCmd->SetParameterName("id",false); + rmhistoCmd->SetRange("id>0"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::~HistoMessenger() +{ + delete rmhistoCmd; + delete histoCmd; + delete factoryCmd; + delete histoDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoMessenger::SetNewValue(G4UIcommand* command, G4String newValues) +{ + if (command == factoryCmd) + histoManager->SetFileName(newValues); + + if (command == histoCmd) + { G4int ih,nbBins; G4double vmin,vmax; char unts[30]; + const char* t = newValues; + std::istrstream is((char*)t); + is >> ih >> nbBins >> vmin >> vmax >> unts; + G4String unit = unts; + G4double vUnit = 1. ; + if (unit != "none") vUnit = G4UIcommand::ValueOf(unit); + histoManager->SetHisto (ih,nbBins,vmin*vUnit,vmax*vUnit,unit); + } + + if (command == rmhistoCmd) + { histoManager->RemoveHisto(rmhistoCmd->GetNewIntValue(newValues));} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm2/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/PhotonProcesses/src/PhysListEmStandard.cc similarity index 75% rename from examples/extended/electromagnetic/TestEm2/src/PhysListEmStandard.cc rename to examples/extended/electromagnetic/PhotonProcesses/src/PhysListEmStandard.cc index 8fb0766b31..4228220bdf 100644 --- a/examples/extended/electromagnetic/TestEm2/src/PhysListEmStandard.cc +++ b/examples/extended/electromagnetic/PhotonProcesses/src/PhysListEmStandard.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.cc,v 1.2 2003/10/24 12:08:28 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -31,9 +31,10 @@ #include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" +#include "G4PhotoElectricEffect.hh" #include "G4ComptonScattering.hh" #include "G4GammaConversion.hh" -#include "G4PhotoElectricEffect.hh" +#include "G4GammaConversionToMuons.hh" #include "G4MultipleScattering.hh" @@ -41,23 +42,16 @@ #include "G4eBremsstrahlung.hh" #include "G4eplusAnnihilation.hh" -#include "G4MuIonisation.hh" -#include "G4MuBremsstrahlung.hh" -#include "G4MuPairProduction.hh" - -#include "G4hIonisation.hh" -#include "G4ionIonisation.hh" - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysListEmStandard::PhysListEmStandard(const G4String& name) - : G4VPhysicsConstructor(name) -{} + : G4VPhysicsConstructor(name) +{ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysListEmStandard::~PhysListEmStandard() -{} +{ } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -76,6 +70,7 @@ void PhysListEmStandard::ConstructProcess() pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); pmanager->AddDiscreteProcess(new G4ComptonScattering); pmanager->AddDiscreteProcess(new G4GammaConversion); + pmanager->AddDiscreteProcess(new G4GammaConversionToMuons); } else if (particleName == "e-") { //electron @@ -89,25 +84,6 @@ void PhysListEmStandard::ConstructProcess() pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); - - } else if( particleName == "mu+" || - particleName == "mu-" ) { - //muon - pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); - pmanager->AddProcess(new G4MuIonisation, -1, 2,2); - pmanager->AddProcess(new G4MuBremsstrahlung, -1, 3,3); - pmanager->AddProcess(new G4MuPairProduction, -1, 4,4); - - } else if( particleName == "GenericIon" ) { - pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); - pmanager->AddProcess(new G4ionIonisation, -1, 2,2); - - } else if ((!particle->IsShortLived()) && - (particle->GetPDGCharge() != 0.0) && - (particle->GetParticleName() != "chargedgeantino")) { - //all others charged particles except geantino - pmanager->AddProcess(new G4MultipleScattering,-1,1,1); - pmanager->AddProcess(new G4hIonisation, -1,2,2); } } } diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsList.cc b/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsList.cc new file mode 100644 index 0000000000..59f42a6cd2 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsList.cc @@ -0,0 +1,117 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsList.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsList.hh" +#include "PhysicsListMessenger.hh" + +#include "PhysListEmStandard.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::PhysicsList() +: G4VModularPhysicsList() +{ + defaultCutValue = 1.0*mm; + messenger = new PhysicsListMessenger(this); + + // EM physics + emName = G4String("standard"); + emPhysicsList = new PhysListEmStandard(emName); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsList::~PhysicsList() +{ + delete messenger; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4Geantino.hh" +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonMinus.hh" +#include "G4MuonPlus.hh" + +void PhysicsList::ConstructParticle() +{ + G4Geantino::GeantinoDefinition(); + G4Gamma::GammaDefinition(); + + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + + G4MuonMinus::MuonMinusDefinition(); + G4MuonPlus::MuonPlusDefinition(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::ConstructProcess() +{ + AddTransportation(); + emPhysicsList->ConstructProcess(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::AddPhysicsList(const G4String& name) +{ + G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" << G4endl; + + if (name == emName) return; + + if (name == "standard") { + emName = name; + delete emPhysicsList; + emPhysicsList = new PhysListEmStandard(name); + + } else { + G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" + << " is not defined" + << G4endl; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::SetCuts() +{ + // set cut values for gamma at first and for e- second and next for e+, + // because some processes for e+/e- need cut values for gamma + SetCutValue(defaultCutValue, "gamma"); + SetCutValue(defaultCutValue, "e-"); + SetCutValue(defaultCutValue, "e+"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsListMessenger.cc b/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsListMessenger.cc new file mode 100644 index 0000000000..4339d75d12 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/PhysicsListMessenger.cc @@ -0,0 +1,67 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PhysicsListMessenger.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysicsListMessenger.hh" +#include "PhysicsList.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) +:physicsList(pPhys) +{ + physDir = new G4UIdirectory("/testem/phys/"); + physDir ->SetGuidance("physics list"); + + pListCmd = new G4UIcmdWithAString("/testem/phys/addPhysics",this); + pListCmd->SetGuidance("Add modular physics list"); + pListCmd->SetParameterName("PList",false); + pListCmd->AvailableForStates(G4State_PreInit); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysicsListMessenger::~PhysicsListMessenger() +{ + delete pListCmd; + delete physDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsListMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if (command == pListCmd) + {physicsList->AddPhysicsList(newValue);} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/PhotonProcesses/src/PrimaryGeneratorAction.cc new file mode 100644 index 0000000000..4e7a390eb2 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/PrimaryGeneratorAction.cc @@ -0,0 +1,80 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: PrimaryGeneratorAction.cc,v 1.1 2004/04/28 11:12:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PrimaryGeneratorAction.hh" + +#include "DetectorConstruction.hh" + +#include "G4Event.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "Randomize.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* det) +:detector(det) +{ + particleGun = new G4ParticleGun(1); + G4ParticleDefinition* particle + = G4ParticleTable::GetParticleTable()->FindParticle("gamma"); + particleGun->SetParticleDefinition(particle); + particleGun->SetParticleEnergy(1*MeV); + particleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PrimaryGeneratorAction::~PrimaryGeneratorAction() +{ + delete particleGun; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) +{ + //this function is called at the begining of event + // + G4double halfSize = 0.5*(detector->GetSize()); + G4double x0 = - halfSize; + + //randomize (y0,z0) + // + G4double beam = 0.8*halfSize; + G4double y0 = (2*G4UniformRand()-1.)*beam; + G4double z0 = (2*G4UniformRand()-1.)*beam; + + particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); + particleGun->GeneratePrimaryVertex(anEvent); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/RunAction.cc b/examples/extended/electromagnetic/PhotonProcesses/src/RunAction.cc new file mode 100644 index 0000000000..1414dfac8d --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/RunAction.cc @@ -0,0 +1,164 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: RunAction.cc,v 1.2 2004/06/10 15:55:38 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "RunAction.hh" + +#include "DetectorConstruction.hh" +#include "PrimaryGeneratorAction.hh" +#include "HistoManager.hh" + +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UnitsTable.hh" + +#include "Randomize.hh" +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunAction::RunAction(DetectorConstruction* det, PrimaryGeneratorAction* prim, + HistoManager* histo) + : detector(det), primary(prim), ProcCounter(0), histoManager(histo) +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunAction::~RunAction() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::BeginOfRunAction(const G4Run* aRun) +{ + G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; + + // save Rndm status + G4RunManager::GetRunManager()->SetRandomNumberStore(true); + HepRandom::showEngineStatus(); + + ProcCounter = new ProcessesCount; + totalCount = 0; + sumTrack = sumTrack2 = 0.; + +#ifdef G4ANALYSIS_USE + histoManager->SetFactory(); +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::CountProcesses(G4String procName) +{ + //does the process already encounted ? + size_t nbProc = ProcCounter->size(); + size_t i = 0; + while ((iGetName()!=procName)) i++; + if (i == nbProc) ProcCounter->push_back( new OneProcessCount(procName)); + + (*ProcCounter)[i]->Count(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::EndOfRunAction(const G4Run* aRun) +{ + G4int NbOfEvents = aRun->GetNumberOfEvent(); + if (NbOfEvents == 0) return; + + std::ios::fmtflags mode = G4cout.flags(); + G4cout.setf(std::ios::fixed,std::ios::floatfield); + G4int prec = G4cout.precision(2); + + G4Material* material = detector->GetMaterial(); + G4double density = material->GetDensity(); + G4int survive = 0; + + G4String particle = primary->GetParticleGun()->GetParticleDefinition() + ->GetParticleName(); + G4double energy = primary->GetParticleGun()->GetParticleEnergy(); + G4cout << "\n The run consists of " << NbOfEvents << " "<< particle << " of " + << G4BestUnit(energy,"Energy") << " through " + << G4BestUnit(detector->GetSize(),"Length") << " of " + << material->GetName() << " (density: " + << G4BestUnit(density,"Volumic Mass") << ")" << G4endl; + + //frequency of processes + G4cout << "\n Frequency of process calls --->"; + for (size_t i=0; i< ProcCounter->size();i++) { + G4String procName = (*ProcCounter)[i]->GetName(); + G4int count = (*ProcCounter)[i]->GetCounter(); + G4cout << "\t" << procName << " : " << count; + if (procName == "Transportation") survive = count; + } + + if (survive > 0) { + G4cout << "\n\n Nb of incident particles surviving after " + << G4BestUnit(detector->GetSize(),"Length") << " of " + << material->GetName() << " : " << survive << G4endl; + } + + //compute mean free path and related quantities + // + G4double MeanFreePath = sumTrack /totalCount; + G4double MeanTrack2 = sumTrack2/totalCount; + G4double rms = sqrt(abs(MeanTrack2 - MeanFreePath*MeanFreePath)); + G4double AttenuationCoef = 1./MeanFreePath; + G4double massicMFP = MeanFreePath*density; + G4double massicAC = 1./massicMFP; + + G4cout.precision(5); + G4cout << "\n\n MeanFreePath: \t"<< G4BestUnit(MeanFreePath,"Length") + << " +- " << G4BestUnit( rms,"Length") + << "\tmassic: " << massicMFP*cm2/g << " g/cm2 " + << "\n AttenuationCoef:\t" << AttenuationCoef*cm << " cm^-1 " + << "\t\t\tmassic: " << massicAC*g/cm2 << " cm2/g" + << G4endl; + + + G4cout.setf(mode,std::ios::floatfield); + G4cout.precision(prec); + + // delete and remove all contents in ProcCounter + while (ProcCounter->size()>0){ + OneProcessCount* aProcCount=ProcCounter->back(); + ProcCounter->pop_back(); + delete aProcCount; + } + delete ProcCounter; + +#ifdef G4ANALYSIS_USE + histoManager->SaveFactory(); +#endif + + // show Rndm status + HepRandom::showEngineStatus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/SteppingAction.cc b/examples/extended/electromagnetic/PhotonProcesses/src/SteppingAction.cc new file mode 100644 index 0000000000..806c18c276 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/SteppingAction.cc @@ -0,0 +1,112 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SteppingAction.cc,v 1.1 2004/04/28 11:12:40 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SteppingAction.hh" +#include "RunAction.hh" +#include "HistoManager.hh" + +#include "G4RunManager.hh" + +#ifdef USE_AIDA + #include "AIDA/IHistogram1D.h" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingAction::SteppingAction(RunAction* RuAct, HistoManager* Hist) + :runAction(RuAct), histoManager(Hist) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingAction::~SteppingAction() +{ } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingAction::UserSteppingAction(const G4Step* aStep) +{ + G4StepPoint* endPoint = aStep->GetPostStepPoint(); + G4String procName = endPoint->GetProcessDefinedStep()->GetProcessName(); + G4double stepLength = aStep->GetStepLength(); + + //count processes and sum track length + // + runAction->CountProcesses(procName); + if (procName != "Transportation") runAction->SumTrack(stepLength); + +#ifdef USE_AIDA + //plot final state + // + //scattered primary particle + // + G4int id = 1; + if (aStep->GetTrack()->GetTrackStatus() == fAlive) { + if (histoManager->GetHisto(id)) { + G4double energy = endPoint->GetKineticEnergy(); + G4double unit = histoManager->GetHistoUnit(id); + histoManager->GetHisto(id)->fill(energy/unit); + } + id = 2; + if (histoManager->GetHisto(id)) { + G4ThreeVector direction = endPoint->GetMomentumDirection(); + G4double costeta = direction.x(); + histoManager->GetHisto(id)->fill(costeta); + } + } + + //secondaries + // + G4TrackVector* secondary = fpSteppingManager->GetSecondary(); + for (size_t lp=0; lp<(*secondary).size(); lp++) { + G4double charge = (*secondary)[lp]->GetDefinition()->GetPDGCharge(); + if (charge != 0.) id = 3; else id = 5; + if (histoManager->GetHisto(id)) { + G4double energy = (*secondary)[lp]->GetKineticEnergy(); + G4double unit = histoManager->GetHistoUnit(id); + histoManager->GetHisto(id)->fill(energy/unit); + } + id++; + if (histoManager->GetHisto(id)) { + G4ThreeVector direction = (*secondary)[lp]->GetMomentumDirection(); + G4double costeta = direction.x(); + histoManager->GetHisto(id)->fill(costeta); + } + } +#endif + + // kill event after first interaction + // + G4RunManager::GetRunManager()->AbortEvent(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/SteppingVerbose.cc b/examples/extended/electromagnetic/PhotonProcesses/src/SteppingVerbose.cc new file mode 100644 index 0000000000..9bd53a9e12 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/SteppingVerbose.cc @@ -0,0 +1,178 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SteppingVerbose.cc,v 1.1 2004/04/28 11:12:40 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "SteppingVerbose.hh" + +#include "G4SteppingManager.hh" +#include "G4UnitsTable.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingVerbose::SteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +SteppingVerbose::~SteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingVerbose::StepInfo() +{ + CopyState(); + + G4int prec = G4cout.precision(3); + + if( verboseLevel >= 1 ){ + if( verboseLevel >= 4 ) VerboseTrack(); + if( verboseLevel >= 3 ){ + G4cout << G4endl; + G4cout << std::setw( 5) << "#Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "Volume" << " " + << std::setw(10) << "Process" << G4endl; + } + + G4cout << std::setw(5) << fTrack->GetCurrentStepNumber() << " " + << std::setw(6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetTrackLength(),"Length") + << " "; + + // if( fStepStatus != fWorldBoundary){ + if( fTrack->GetNextVolume() != 0 ) { + G4cout << std::setw(10) << fTrack->GetVolume()->GetName(); + } else { + G4cout << std::setw(10) << "OutOfWorld"; + } + + if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != NULL){ + G4cout << " " + << std::setw(10) << fStep->GetPostStepPoint() + ->GetProcessDefinedStep()->GetProcessName(); + } else { + G4cout << " UserLimit"; + } + + G4cout << G4endl; + + if( verboseLevel == 2 ){ + G4int tN2ndariesTot = fN2ndariesAtRestDoIt + + fN2ndariesAlongStepDoIt + + fN2ndariesPostStepDoIt; + if(tN2ndariesTot>0){ + G4cout << " :----- List of 2ndaries - " + << "#SpawnInStep=" << std::setw(3) << tN2ndariesTot + << "(Rest=" << std::setw(2) << fN2ndariesAtRestDoIt + << ",Along=" << std::setw(2) << fN2ndariesAlongStepDoIt + << ",Post=" << std::setw(2) << fN2ndariesPostStepDoIt + << "), " + << "#SpawnTotal=" << std::setw(3) << (*fSecondary).size() + << " ---------------" + << G4endl; + + for(size_t lp1=(*fSecondary).size()-tN2ndariesTot; + lp1<(*fSecondary).size(); lp1++){ + G4cout << " : " + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().x(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().y(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().z(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetKineticEnergy(),"Energy") + << std::setw(10) + << (*fSecondary)[lp1]->GetDefinition()->GetParticleName(); + G4cout << G4endl; + } + + G4cout << " :-----------------------------" + << "----------------------------------" + << "-- EndOf2ndaries Info ---------------" + << G4endl; + } + } + + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void SteppingVerbose::TrackingStarted() +{ + + CopyState(); +G4int prec = G4cout.precision(3); + if( verboseLevel > 0 ){ + + G4cout << std::setw( 5) << "Step#" << " " + << std::setw( 6) << "X" << " " + << std::setw( 6) << "Y" << " " + << std::setw( 6) << "Z" << " " + << std::setw( 9) << "KineE" << " " + << std::setw( 9) << "dEStep" << " " + << std::setw(10) << "StepLeng" + << std::setw(10) << "TrakLeng" + << std::setw(10) << "Volume" << " " + << std::setw(10) << "Process" << G4endl; + + G4cout << std::setw(5) << fTrack->GetCurrentStepNumber() << " " + << std::setw(6) << G4BestUnit(fTrack->GetPosition().x(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().y(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetPosition().z(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetKineticEnergy(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetTotalEnergyDeposit(),"Energy") + << std::setw(6) << G4BestUnit(fStep->GetStepLength(),"Length") + << std::setw(6) << G4BestUnit(fTrack->GetTrackLength(),"Length") + << " "; + + if(fTrack->GetNextVolume()){ + G4cout << std::setw(10) << fTrack->GetVolume()->GetName(); + } else { + G4cout << std::setw(10) << "OutOfWorld"; + } + G4cout << " initStep" << G4endl; + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/src/VisManager.cc b/examples/extended/electromagnetic/PhotonProcesses/src/VisManager.cc new file mode 100755 index 0000000000..bb30255e2d --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/src/VisManager.cc @@ -0,0 +1,155 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: VisManager.cc,v 1.1 2004/04/28 11:12:40 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// John Allison 24th January 1998. + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4VIS_USE + +#include "VisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4HepRep.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPACS +#include "G4Wo.hh" +#include "G4Xo.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +VisManager::VisManager () {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void VisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4HepRep); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPACS + RegisterGraphicsSystem (new G4Wo); + RegisterGraphicsSystem (new G4Xo); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} + +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/PhotonProcesses/vis.mac b/examples/extended/electromagnetic/PhotonProcesses/vis.mac new file mode 100644 index 0000000000..fcf991ea76 --- /dev/null +++ b/examples/extended/electromagnetic/PhotonProcesses/vis.mac @@ -0,0 +1,32 @@ +# +# Macro file for the initialization phase of "TestEm1.cc" +# +# Sets some default verbose +# and initializes the graphic. +# +/control/verbose 2 +/run/verbose 2 +# +/run/initialize +# +# Create empty scene ("world" is default) +/vis/scene/create +# +# Create a scene handler for a specific graphics system +# Edit the next line(s) to choose another graphic system +# +/vis/open OGLIX +# +#/vis/open DAWNFILE +# +# Draw scene +/vis/viewer/zoom 1.4 +/vis/viewer/flush +# +# for drawing the tracks +# if too many tracks cause core dump => storeTrajectory 0 +/tracking/storeTrajectory 1 +/vis/scene/endOfEventAction accumulate +# +/testem/event/drawTracks + diff --git a/examples/extended/electromagnetic/TestEm1/GNUmakefile b/examples/extended/electromagnetic/TestEm1/GNUmakefile index 913728dab2..d502c143ad 100644 --- a/examples/extended/electromagnetic/TestEm1/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm1/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.9 2003/10/06 10:02:19 maire Exp $ +# $Id: GNUmakefile,v 1.11 2004/03/31 11:34:57 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,15 +14,19 @@ endif .PHONY: all all: lib bin -####G4ANALYSIS_USE := true +#### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE - CPPFLAGS += -DG4ANALYSIS_USE +USE_AIDA := true +endif + +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA endif include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` diff --git a/examples/extended/electromagnetic/TestEm1/History b/examples/extended/electromagnetic/TestEm1/History index d963bb169b..7e7da91227 100644 --- a/examples/extended/electromagnetic/TestEm1/History +++ b/examples/extended/electromagnetic/TestEm1/History @@ -1,4 +1,4 @@ -$Id: History,v 1.41 2003/11/25 18:43:35 vnivanch Exp $ +$Id: History,v 1.46 2004/06/09 15:29:41 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,21 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +09-06-04 mma (testem1-V06-01-03) +- PhysicsLists: remove Particles and General + +13-04-04 mma (testem1-V06-01-02) +- EmPhysicsList: set G4eBremsstrahlungCMS as default + +05-04-04 V.Ivan. (testem1-V06-01-01) +- fix G4eBremsstrahlungCMS + +31-03-04 mma (testem1-V06-01-00) +- remove ROOT histos + +15-03-04 mma (testem1-V06-00-00) +- example of histograms with ROOT: USE_ROOT 25-11-03 V.Ivanchenko (testem1-V05-02-06) - Fix geometry (G.Cosmo) diff --git a/examples/extended/electromagnetic/TestEm1/README b/examples/extended/electromagnetic/TestEm1/README index 374cebab49..131a6ef6f1 100644 --- a/examples/extended/electromagnetic/TestEm1/README +++ b/examples/extended/electromagnetic/TestEm1/README @@ -1,4 +1,4 @@ -$Id: README,v 1.8 2003/10/06 10:02:19 maire Exp $ +$Id: README,v 1.12 2004/06/23 11:31:00 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -94,7 +94,7 @@ $Id: README,v 1.8 2003/10/06 10:02:19 maire Exp $ 7- HISTOGRAMS - Testem1 produces several histo which are saved as testem1.paw + Testem1 produces several histo which are saved as testem1.paw Content of these histo: @@ -105,18 +105,35 @@ $Id: README,v 1.8 2003/10/06 10:02:19 maire Exp $ Note that, by default, histograms are disabled. To activate them, uncomment the flag G4ANALYSIS_USE in GNUmakefile. - 8- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + 8- Using histograms + ------------------- - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. + +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) diff --git a/examples/extended/electromagnetic/TestEm1/TestEm1.out b/examples/extended/electromagnetic/TestEm1/TestEm1.out index 74e4224367..5cd7e891e6 100644 --- a/examples/extended/electromagnetic/TestEm1/TestEm1.out +++ b/examples/extended/electromagnetic/TestEm1/TestEm1.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -104,11 +104,12 @@ eIoni: tables are built for e- Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 1 Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. -eBrem: tables are built for e- +brCMS: tables are built for e- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. Total cross sections from a parametrisation based on the EEDL data library. Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. + Gamma high energy threshold 10 MeV eIoni: tables are built for e+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. @@ -116,11 +117,12 @@ eIoni: tables are built for e+ Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 1 Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. -eBrem: tables are built for e+ +brCMS: tables are built for e+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. Total cross sections from a parametrisation based on the EEDL data library. Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. + Gamma high energy threshold 10 MeV annihil: Total cross section from Heilter formula(annihilation into 2 photons). gamma energies sampled according Heitler @@ -133,8 +135,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -143,7 +145,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 0 + Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -161,7 +163,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 0 + Step function: finalRange(mm)= 0.0017, dRoverRange= 0.183, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -201,20 +203,20 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100 - User=26s Real=41s Sys=10s + User=28s Real=43s Sys=10s - nb tracks/event neutral: 27.2700 charged: 695.2400 - nb steps/event neutral: 149.2500 charged: 3410.4800 + nb tracks/event neutral: 27.0700 charged: 701.4100 + nb steps/event neutral: 145.7600 charged: 3504.0700 total energy deposit: 100.0000 MeV nb of process calls per event: - eIoni eBrem compt phot conv annihil - 3383.5800 25.3200 121.9800 25.6900 1.5800 1.5800 + eIoni brCMS phot compt conv annihil + 3477.4900 25.1900 25.6800 118.6900 1.3900 1.3900 --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1351988378, 1579045124 + Current couple of seeds = 1009674686, 985243040 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm1/brem.mac b/examples/extended/electromagnetic/TestEm1/brem.mac index 3175e728e7..a17cecd9a6 100644 --- a/examples/extended/electromagnetic/TestEm1/brem.mac +++ b/examples/extended/electromagnetic/TestEm1/brem.mac @@ -22,11 +22,13 @@ /run/initialize #/run/beamOn 1 # +/process/eLoss/verbose 0 /process/inactivate phot /process/inactivate compt /process/inactivate conv /process/inactivate eIoni -/process/inactivate msc +/process/inactivate eBrem +#/process/inactivate msc # #/process/eLoss/fluct false #/process/eLoss/integral false diff --git a/examples/extended/electromagnetic/TestEm1/include/PhysicsList.hh b/examples/extended/electromagnetic/TestEm1/include/PhysicsList.hh index 1a22e68bf3..fa4fb3094e 100644 --- a/examples/extended/electromagnetic/TestEm1/include/PhysicsList.hh +++ b/examples/extended/electromagnetic/TestEm1/include/PhysicsList.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.hh,v 1.1 2003/10/06 10:02:25 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.hh,v 1.2 2004/06/09 15:29:43 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // @@ -66,8 +66,6 @@ class PhysicsList: public G4VModularPhysicsList G4double currentDefaultCut; G4VPhysicsConstructor* emPhysicsList; - G4VPhysicsConstructor* generalPhysicsList; - G4VPhysicsConstructor* particleList; G4String emName; DetectorConstruction* pDet; diff --git a/examples/extended/electromagnetic/TestEm1/include/RunAction.hh b/examples/extended/electromagnetic/TestEm1/include/RunAction.hh index a0f85dd3b0..23aa5b165d 100644 --- a/examples/extended/electromagnetic/TestEm1/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm1/include/RunAction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.hh,v 1.2 2003/10/28 10:27:25 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.hh,v 1.4 2004/03/31 11:34:58 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -40,13 +40,15 @@ class G4Run; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA namespace AIDA { class ITree; class IHistogram1D; } #endif +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class RunAction : public G4UserRunAction { public: @@ -64,10 +66,10 @@ class RunAction : public G4UserRunAction void CountSteps1(G4int ns) { NbOfSteps1 += ns;} void CountProcesses(G4String); -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} #endif - + private: void bookHisto(); void cleanHisto(); @@ -78,10 +80,10 @@ class RunAction : public G4UserRunAction G4double edep; ProcessesCount* ProcCounter; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::ITree* tree; AIDA::IHistogram1D* histo[3]; -#endif +#endif }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm1/src/DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm1/src/DetectorConstruction.cc index ea19e0d756..f68b98afa0 100644 --- a/examples/extended/electromagnetic/TestEm1/src/DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm1/src/DetectorConstruction.cc @@ -22,8 +22,8 @@ // // -// $Id: DetectorConstruction.cc,v 1.2 2003/11/25 15:19:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.cc,v 1.3 2004/03/15 11:09:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // diff --git a/examples/extended/electromagnetic/TestEm1/src/EventAction.cc b/examples/extended/electromagnetic/TestEm1/src/EventAction.cc index 9a84ee3b63..3027316123 100644 --- a/examples/extended/electromagnetic/TestEm1/src/EventAction.cc +++ b/examples/extended/electromagnetic/TestEm1/src/EventAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: EventAction.cc,v 1.2 2003/10/08 17:55:34 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: EventAction.cc,v 1.3 2004/03/15 11:09:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -84,9 +84,9 @@ void EventAction::EndOfEventAction(const G4Event* evt) for(G4int i=0; iGetTrajectoryContainer()))[i]); - if (drawFlag == "all") trj->DrawTrajectory(50); + if (drawFlag == "all") trj->DrawTrajectory(1000); else if ((drawFlag == "charged")&&(trj->GetCharge() != 0.)) - trj->DrawTrajectory(50); + trj->DrawTrajectory(1000); } } } diff --git a/examples/extended/electromagnetic/TestEm1/src/G4eBremsstrahlungCMS.cc b/examples/extended/electromagnetic/TestEm1/src/G4eBremsstrahlungCMS.cc index 44047fa7b1..2afce56184 100644 --- a/examples/extended/electromagnetic/TestEm1/src/G4eBremsstrahlungCMS.cc +++ b/examples/extended/electromagnetic/TestEm1/src/G4eBremsstrahlungCMS.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4eBremsstrahlungCMS.cc,v 1.4 2003/10/28 10:27:26 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4eBremsstrahlungCMS.cc,v 1.5 2004/04/05 19:04:04 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -37,6 +37,7 @@ // Modifications: // // 17-10-03 model variant (V.Ivanchenko) +// 05-04-03 Migrate to ParticleChangeForLoss (V.Ivanchenko) // // ------------------------------------------------------------------- // @@ -65,20 +66,20 @@ void G4eBremsstrahlungCMS::SecondariesPostStep( G4VEmModel* model, G4double& tcut, G4double& kinEnergy) { - G4DynamicParticle* gamma = model->SampleSecondary(couple, dp, tcut, kinEnergy); + G4DynamicParticle* gamma = model->SampleSecondary(couple, dp, tcut, kinEnergy); G4double gammaEnergy = gamma->GetKineticEnergy(); kinEnergy -= gammaEnergy; G4int nSecond = 1; if(gammaEnergy > gammaThreshold) nSecond = 2; - aParticleChange.SetNumberOfSecondaries(nSecond); - aParticleChange.AddSecondary(gamma); - aParticleChange.SetLocalEnergyDeposit(0.0); + fParticleChange.SetNumberOfSecondaries(nSecond); + fParticleChange.AddSecondary(gamma); + fParticleChange.SetLocalEnergyDeposit(0.0); if(nSecond == 2) { - aParticleChange.SetStatusChange(fStopAndKill); + fParticleChange.SetStatusChange(fStopAndKill); G4DynamicParticle* el = new G4DynamicParticle(dp->GetDefinition(), dp->GetMomentumDirection(), kinEnergy); - aParticleChange.AddSecondary(el); + fParticleChange.AddSecondary(el); } } diff --git a/examples/extended/electromagnetic/TestEm1/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/TestEm1/src/PhysListEmStandard.cc index adc7682283..e5fbfe3a45 100644 --- a/examples/extended/electromagnetic/TestEm1/src/PhysListEmStandard.cc +++ b/examples/extended/electromagnetic/TestEm1/src/PhysListEmStandard.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.cc,v 1.5 2003/10/24 12:06:36 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.cc,v 1.6 2004/04/13 15:07:00 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -82,15 +82,15 @@ void PhysListEmStandard::ConstructProcess() //electron pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); - pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); - ///pmanager->AddProcess(new G4eBremsstrahlungCMS("brCMS", 10*MeV),-1,3,3); + ///pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); + pmanager->AddProcess(new G4eBremsstrahlungCMS("brCMS", 10*MeV),-1,3,3); } else if (particleName == "e+") { //positron pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); - pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); - ///pmanager->AddProcess(new G4eBremsstrahlungCMS("brCMS", 10*MeV),-1,3,3); + ///pmanager->AddProcess(new G4eBremsstrahlung, -1, 3,3); + pmanager->AddProcess(new G4eBremsstrahlungCMS("brCMS", 10*MeV),-1,3,3); pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); } else if( particleName == "mu+" || diff --git a/examples/extended/electromagnetic/TestEm1/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm1/src/PhysicsList.cc index b1f2a9d28b..f6532ccac4 100644 --- a/examples/extended/electromagnetic/TestEm1/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm1/src/PhysicsList.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.cc,v 1.2 2003/10/24 12:06:36 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.cc,v 1.3 2004/06/09 15:29:45 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -30,8 +30,6 @@ #include "PhysicsList.hh" #include "PhysicsListMessenger.hh" -#include "PhysListParticles.hh" -#include "PhysListGeneral.hh" #include "PhysListEmStandard.hh" #include "PhysListEmG4v52.hh" #include "DetectorConstruction.hh" @@ -55,12 +53,6 @@ PhysicsList::PhysicsList(DetectorConstruction* p) pMessenger = new PhysicsListMessenger(this); SetVerboseLevel(1); - - // Particles - particleList = new PhysListParticles("particles"); - - // General Physics - generalPhysicsList = new PhysListGeneral("general"); // EM physics emName = G4String("standard"); @@ -77,18 +69,136 @@ PhysicsList::~PhysicsList() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Bosons +#include "G4ChargedGeantino.hh" +#include "G4Geantino.hh" +#include "G4Gamma.hh" +#include "G4OpticalPhoton.hh" + +// leptons +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" +#include "G4NeutrinoMu.hh" +#include "G4AntiNeutrinoMu.hh" + +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4NeutrinoE.hh" +#include "G4AntiNeutrinoE.hh" + +// Mesons +#include "G4PionPlus.hh" +#include "G4PionMinus.hh" +#include "G4PionZero.hh" +#include "G4Eta.hh" +#include "G4EtaPrime.hh" + +#include "G4KaonPlus.hh" +#include "G4KaonMinus.hh" +#include "G4KaonZero.hh" +#include "G4AntiKaonZero.hh" +#include "G4KaonZeroLong.hh" +#include "G4KaonZeroShort.hh" + +// Baryons +#include "G4Proton.hh" +#include "G4AntiProton.hh" +#include "G4Neutron.hh" +#include "G4AntiNeutron.hh" + +// Nuclei +#include "G4Alpha.hh" +#include "G4Deuteron.hh" +#include "G4Triton.hh" +#include "G4He3.hh" +#include "G4GenericIon.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + void PhysicsList::ConstructParticle() { - particleList->ConstructParticle(); +// pseudo-particles + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); + +// gamma + G4Gamma::GammaDefinition(); + +// optical photon + G4OpticalPhoton::OpticalPhotonDefinition(); + +// leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + +// mesons + G4PionPlus::PionPlusDefinition(); + G4PionMinus::PionMinusDefinition(); + G4PionZero::PionZeroDefinition(); + G4Eta::EtaDefinition(); + G4EtaPrime::EtaPrimeDefinition(); + G4KaonPlus::KaonPlusDefinition(); + G4KaonMinus::KaonMinusDefinition(); + G4KaonZero::KaonZeroDefinition(); + G4AntiKaonZero::AntiKaonZeroDefinition(); + G4KaonZeroLong::KaonZeroLongDefinition(); + G4KaonZeroShort::KaonZeroShortDefinition(); + +// barions + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4AntiNeutron::AntiNeutronDefinition(); + +// ions + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4He3::He3Definition(); + G4Alpha::AlphaDefinition(); + G4GenericIon::GenericIonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#include "G4ProcessManager.hh" +#include "G4Decay.hh" + void PhysicsList::ConstructProcess() { + // Transportation + // AddTransportation(); - generalPhysicsList->ConstructProcess(); + + // Electromagnetic physics list + // emPhysicsList->ConstructProcess(); + + // Decay Process + // + G4Decay* fDecayProcess = new G4Decay(); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (fDecayProcess->IsApplicable(*particle)) { + + pmanager ->AddProcess(fDecayProcess); + + // set ordering for PostStepDoIt and AtRestDoIt + pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); + + } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm1/src/RunAction.cc b/examples/extended/electromagnetic/TestEm1/src/RunAction.cc index 122c634808..364d2fb4f1 100644 --- a/examples/extended/electromagnetic/TestEm1/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm1/src/RunAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.cc,v 1.3 2003/11/07 15:38:28 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.cc,v 1.5 2004/03/31 11:34:59 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -35,14 +35,12 @@ #include "G4Run.hh" #include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" #include "G4UnitsTable.hh" #include "Randomize.hh" #include -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/AIDA.h" #endif @@ -63,7 +61,7 @@ RunAction::~RunAction() void RunAction::bookHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA // Creating the analysis factory AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); @@ -78,11 +76,10 @@ void RunAction::bookHisto() // Creating a histogram factory, whose histograms will be handled by the tree AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); - // booking histograms histo[0] = hf->createHistogram1D("1","track length (mm) of a charged particle", 100,0.,50*cm); - histo[1] = hf->createHistogram1D("2","Nb of steps per track (charged particle)", + histo[1] = hf->createHistogram1D("2","Nb steps per track (charged particle)", 100,0.,100.); histo[2] = hf->createHistogram1D("3","step length (mm) charged particle", 100,0.,10*mm); @@ -90,19 +87,18 @@ void RunAction::bookHisto() delete hf; delete tf; delete af; -#endif +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::cleanHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA tree->commit(); // Writing the histograms to the file - tree->close(); // and closing the tree (and the file) - + tree->close(); // and closing the tree (and the file) delete tree; -#endif +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -122,9 +118,6 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) //histograms // if (aRun->GetRunID() == 0) bookHisto(); - - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -187,10 +180,6 @@ void RunAction::EndOfRunAction(const G4Run* aRun) delete aProcCount; } delete ProcCounter; - - //draw the events - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); // show Rndm status HepRandom::showEngineStatus(); diff --git a/examples/extended/electromagnetic/TestEm1/src/SteppingAction.cc b/examples/extended/electromagnetic/TestEm1/src/SteppingAction.cc index 01920d9434..4b99eab6f8 100644 --- a/examples/extended/electromagnetic/TestEm1/src/SteppingAction.cc +++ b/examples/extended/electromagnetic/TestEm1/src/SteppingAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: SteppingAction.cc,v 1.3 2003/11/07 15:38:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.cc,v 1.5 2004/03/31 11:34:59 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -36,7 +36,7 @@ #include "G4SteppingManager.hh" #include "G4VProcess.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif @@ -63,11 +63,11 @@ void SteppingAction::UserSteppingAction(const G4Step* aStep) if (process) runAction->CountProcesses(process->GetProcessName()); -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA G4double charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge(); G4double steplen = aStep->GetStepLength(); if (charge != 0.) runAction->GetHisto(2)->fill(steplen); -#endif +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm1/src/TrackingAction.cc b/examples/extended/electromagnetic/TestEm1/src/TrackingAction.cc index 0ec9036b54..763eaabfa3 100644 --- a/examples/extended/electromagnetic/TestEm1/src/TrackingAction.cc +++ b/examples/extended/electromagnetic/TestEm1/src/TrackingAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: TrackingAction.cc,v 1.5 2003/10/28 10:27:26 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: TrackingAction.cc,v 1.7 2004/03/31 11:35:00 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -33,7 +33,7 @@ #include "G4Track.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif @@ -70,11 +70,11 @@ void TrackingAction::PostUserTrackingAction(const G4Track* aTrack) runAction->CountTraks1(1); runAction->CountSteps1(nbSteps); -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA G4double Trleng = aTrack->GetTrackLength(); runAction->GetHisto(0)->fill(Trleng); runAction->GetHisto(1)->fill((float)nbSteps); -#endif +#endif } } diff --git a/examples/extended/electromagnetic/TestEm10/README b/examples/extended/electromagnetic/TestEm10/README index 8c4cebfc66..3bc59e813e 100644 --- a/examples/extended/electromagnetic/TestEm10/README +++ b/examples/extended/electromagnetic/TestEm10/README @@ -1,4 +1,4 @@ -$Id: README,v 1.3 2001/11/27 16:58:18 gcosmo Exp $ +$Id: README,v 1.4 2004/06/23 11:28:44 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -125,8 +125,41 @@ $Id: README,v 1.3 2001/11/27 16:58:18 gcosmo Exp $ 9. z distribution of the secondary charged vertices (mm) 10. kinetic energy of the photons escaping the absorber (MeV) - Note that, histograms are disabled via the flag G4NOHIST in the GNUmakefile. - Currently, histograms in this example are implemented through the obsolete - CLHEP/Hist package, which is no longer supported. The implementation will - be replaced by direct call to the AIDA abstract interfaces in a near future. + Using histograms + ---------------- + +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. + +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm10/TestEm10.out b/examples/extended/electromagnetic/TestEm10/TestEm10.out index 6a53eecdcb..97600957d0 100644 --- a/examples/extended/electromagnetic/TestEm10/TestEm10.out +++ b/examples/extended/electromagnetic/TestEm10/TestEm10.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -228,7 +228,7 @@ Regular X-ray TR radiator EM process is called 48 fGamma = 8.085e+04 sumE = 21.04 49 fGamma = 9.283e+04 sumE = 21.05 -total time for build X-ray TR energy loss tables = 96.57 s +total time for build X-ray TR energy loss tables = 101.7 s phot: Total cross sections from Sandia parametrisation. Em10PhysicsList::SetCuts:CutLength : 1 mm @@ -346,7 +346,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 1000 - User=20.48s Real=20.8s Sys=0.32s + User=20.8s Real=21.07s Sys=0.26s ================== run summary ===================== end of Run TotNbofEvents = 1000 mean charged track length in absorber=93.8763 +- 3.16182 mm diff --git a/examples/extended/electromagnetic/TestEm2/GNUmakefile b/examples/extended/electromagnetic/TestEm2/GNUmakefile index b781f31583..753bff833d 100644 --- a/examples/extended/electromagnetic/TestEm2/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm2/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.10 2003/10/08 17:28:28 maire Exp $ +# $Id: GNUmakefile,v 1.19 2004/06/23 09:33:55 stesting Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,15 +14,20 @@ endif .PHONY: all all: lib bin -### G4ANALYSIS_USE := true +# G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE + USE_AIDA := true CPPFLAGS += -DG4ANALYSIS_USE endif - + +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA +endif + include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` @@ -30,6 +35,9 @@ endif include $(G4INSTALL)/config/binmake.gmk +histclean: + rm -f $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(G4TARGET)/RunAction.o + visclean: rm -f g4*.prim g4*.eps g4*.wrl rm -f .DAWN_* diff --git a/examples/extended/electromagnetic/TestEm2/History b/examples/extended/electromagnetic/TestEm2/History index 52c2f57406..931d3745e5 100644 --- a/examples/extended/electromagnetic/TestEm2/History +++ b/examples/extended/electromagnetic/TestEm2/History @@ -1,4 +1,4 @@ -$Id: History,v 1.35 2003/11/25 18:41:14 vnivanch Exp $ +$Id: History,v 1.42 2004/06/21 10:50:26 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,28 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +21-06-04 mma (testem2-V06-01-03) +- move acceptance control and histogram names in RunAction +- add RunActionMessenger + +24-05-04 V.Ivanchenko (testem2-V06-01-02) +- make UI command for acceptance to activate acceptance printout +- no acceptance printout by default + +04-05-04 V.Ivanchenko (testem2-V06-01-01) +- update PhysicsList - use conception of builders per package +- add acceptance control +- add histogram name and type UI commands (AIDA, ROOT, JAS, and other + output types are available) + +31-03-04 mma (testem2-V06-01-00) +- remove direct interface with root + +15-03-04 mma (testem2-V06-00-00) +- PhysListEmG4v52: back to G4MultipleScattering52 +- suppress /vis commands from source code +- example of histograms with ROOT 25-11-03 V.Ivanchenko (testem2-V05-02-02) - Fix geometry (G.Cosmo) diff --git a/examples/extended/electromagnetic/TestEm2/README b/examples/extended/electromagnetic/TestEm2/README index bad70ba183..5886b88415 100644 --- a/examples/extended/electromagnetic/TestEm2/README +++ b/examples/extended/electromagnetic/TestEm2/README @@ -1,4 +1,4 @@ -$Id: README,v 1.11 2003/10/08 17:28:29 maire Exp $ +$Id: README,v 1.16 2004/06/23 11:30:51 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -10,128 +10,158 @@ $Id: README,v 1.11 2003/10/08 17:28:29 maire Exp $ This example allows to do the shower development of an single primary particle, and to survey the physics processes which occur, with printing and visualization. - + 1- GEOMETRY DEFINITION - + The geometry consists of a cylinder of homegenous material. This cylinder is replicated longitudinaly (slice) and radialy (ring). - + The default geometry is constructed in DetectorConstruction class, but all of the above parameters can be modified interactively via the commands defined in the DetectorMessenger class. - + Material can be choosen: Air Water lAr Al Fe BGO PbWO4 Pb. eg: /testem/det/setMat PbWO4 - + The size of the slices and rings are expressed in radiation length units and can be changed. eg: /testem/det/setLbin 20 1. ---> 20 slices of 1. radl /testem/det/setRbin 5 0.25 ---> 5 rings of 0.25 radl /testem/det/update ---> rebuild the geometry - + An uniform magnetic field along the cylinder axis can be set. eg: /testem/det/setField 5 tesla 2- PHYSICS LISTS - Physics Lists are subdivided on 4 following modules: - 1. "particles" - particle definitions - 2. "general" - decays and transportation - 3. "standard" (alternative) - standard EM physics - 4. "model" (alternative) - standard EM physics using model approach + Modular PhysicsList are used. The following modules can be activated: + 1. "standard" - (alternative) standard EM physics + 2. "g4v52" - (alternative) standard EM physics version G4 5.2 + 3. "high_energy" - add high energy processes + + To activate a specific module the UI command can be used: + "/testem/phys/addPhysics title" + By default "standard" module is loaded. - Model approach for EM physics was introduced in order to provide more - flexible way of construction of physics processes. - 3- AN EVENT : THE PRIMARY GENERATOR - + The primary kinematic consists of a single particle which hits the cylinder perpendicular to the input face. The type of the particle and its energy are set in the PrimaryGeneratorAction class, and can changed via the G4 build-in commands of ParticleGun class (see the macros provided with this example). - + A RUN is a set of events. - + 4- 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. In interactive session: PreInit or Idle > /control/execute vis.mac - - The detector has a default view which is a longitudinal view of the + + The detector has a default view which is a longitudinal view of the cylinder. - + The tracks are drawn at the end of event, and erased at the end of run. Optionaly one can choose to draw all particles, only the charged one, or none. This command is defined in EventActionMessenger class. - + 5- PHYSICS DEMO - + The particle's type and the physic processes which will be available in this example are set in PhysicsList class. - + In addition a build-in interactive command (/process/inactivate proname) allows to activate/inactivate the processes one by one. - + The threshold for producing secondaries can be changed. eg: /testem/phys/setCuts 100 microm /run/initialize - + 6- HOW TO START ? - + - compile and link to generate an executable % cd TestEm2 % gmake - + - execute TestEm2 in 'batch' mode from macro files % TestEm2 run01.mac - + - execute TestEm2 in 'interactive mode' with visualization % TestEm2 .... Idle> type your commands .... Idle> exit - + 7- HISTOGRAMS - - TestEm2 produces several histo which are saved as testem2.paw - + + TestEm2 produces several histograms: + Content of these histo: - + 1 : energy deposit per event 2 : charged track length per event 3 : neutral track length per event - + 4 : longitudinal energy profile 5 : cumulated longitudinal energy profile 6 : rms of cumulated longitudinal energy profile - + 7 : gamma's flux 8 : positron's flux 9 : electron's flux - - 10 : radial energy profile + + 10 : radial energy profile 11 : cumulated radial energy profile 12 : rms of cumulated radial energy profile Note that, by default, histograms are disabled. To activate them, uncomment - the flag G4ANALYSIS_USE in GNUmakefile. - - 8- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- + the flag G4ANALYSIS_USE in GNUmakefile. To define the output file name with + histograms and the type of these file the following UI commands can be used: - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + "/testem/histo/fileName name" + "/testem/histo/fileType type" - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) + The following types are available: "hbook", "XML", "root" + By default the name is "testem2.paw" and the type "hbook". - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) + + 8- Using histograms + ------------------- + +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. + +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm2/TestEm2.cc b/examples/extended/electromagnetic/TestEm2/TestEm2.cc index a8ce42bea8..f2b60ee240 100644 --- a/examples/extended/electromagnetic/TestEm2/TestEm2.cc +++ b/examples/extended/electromagnetic/TestEm2/TestEm2.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: TestEm2.cc,v 1.7 2003/10/08 17:28:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: TestEm2.cc,v 1.8 2004/05/04 07:36:36 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -49,20 +49,20 @@ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... int main(int argc,char** argv) { - + //choose the Random engine HepRandom::setTheEngine(new RanecuEngine); - + //my Verbose output class G4VSteppingVerbose::SetInstance(new SteppingVerbose); - + // Construct the default run manager G4RunManager * runManager = new G4RunManager; // set mandatory initialization classes - DetectorConstruction* detector = new DetectorConstruction; + DetectorConstruction* detector = new DetectorConstruction(); runManager->SetUserInitialization(detector); - runManager->SetUserInitialization(new PhysicsList); + runManager->SetUserInitialization(new PhysicsList()); PrimaryGeneratorAction* primary = new PrimaryGeneratorAction(detector); runManager->SetUserAction(primary); diff --git a/examples/extended/electromagnetic/TestEm2/TestEm2.in b/examples/extended/electromagnetic/TestEm2/TestEm2.in index e0ccc66444..0a7efe15b5 100644 --- a/examples/extended/electromagnetic/TestEm2/TestEm2.in +++ b/examples/extended/electromagnetic/TestEm2/TestEm2.in @@ -1,4 +1,4 @@ -# $Id: TestEm2.in,v 1.9 2003/10/08 17:28:29 maire Exp $ +# $Id: TestEm2.in,v 1.14 2004/06/18 15:43:35 maire Exp $ # # Macro file for "TestEm2.cc" # (can be run in batch, without graphic) @@ -15,6 +15,9 @@ /testem/det/setLbin 9 1.11 /testem/det/setRbin 6 0.111 # +# Acceptance printout is activated +/testem/run/acceptance 0.9425 0.0355 3.0 +# /testem/phys/addPhysics standard ### /testem/phys/addPhysics g4v52 # diff --git a/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.in b/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.in deleted file mode 100644 index 507485216b..0000000000 --- a/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.in +++ /dev/null @@ -1,27 +0,0 @@ -# $Id: TestEm2.large_N.in,v 1.1 2003/11/16 19:34:24 stesting Exp $ -# -# Macro file for "TestEm2.cc" -# (can be run in batch, without graphic) -# -# PbWO4 L = 20 radl R = 5 radl; electron 5 GeV -# -/control/verbose 2 -/run/verbose 1 -# -/testem/phys/addPhysics standard -###/testem/phys/addPhysics g4v52 -# -/testem/phys/setCuts 1 mm -# -/run/initialize -# -###/run/particle/applyCuts -# -/gun/particle e- -/gun/energy 5 GeV -# -/testem/event/printModulo 10 -# -/run/beamOn 500 - - diff --git a/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.out b/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.out deleted file mode 100644 index 8bfe331ab6..0000000000 --- a/examples/extended/electromagnetic/TestEm2/TestEm2.large_N.out +++ /dev/null @@ -1,318 +0,0 @@ -********************************************** - Geant4 version $Name: geant4-06-00-patch-01 $ - (27-August-2003) - Copyright : Geant4 Collaboration -********************************************** -G4Material: Mean excitation energy is changed for Water Iold= 70.8926eV; Inew= 75 eV; -Visualization Manager instantiating... -Visualization Manager initialising... -Registering graphics systems... - -You have successfully chosen to use the following graphics systems. -Current available graphics systems are: - ASCIITree (ATree) - DAWNFILE (DAWNFILE) - GAGTree (GAGTree) - G4HepRepFile (HepRepFile) - G4HepRep (HepRepXML) - RayTracer (RayTracer) - VRML1FILE (VRML1FILE) - VRML2FILE (VRML2FILE) - FukuiRenderer (DAWN) - OpenGLImmediateX (OGLIX) - OpenGLStoredX (OGLSX) - VRML1 (VRML1) - VRML2 (VRML2) -/run/verbose 1 -# -/testem/phys/addPhysics standard -###/testem/phys/addPhysics g4v52 -# -/testem/phys/setCuts 1 mm -# -/run/initialize -Absorber is 17.848 cm of PbWO4 - Material: PbWO4 density: 8.280 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 8.924 mm - ---> Element: OxygenO Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 14.07 % Abundance 66.67 % - ---> Element: LeadPb Z = 82.0 N = 207.2 A = 207.19 g/mole fractionMass: 45.53 % Abundance 16.67 % - ---> Element: TungstenW Z = 74.0 N = 183.8 A = 183.84 g/mole fractionMass: 40.40 % Abundance 16.67 % - -phot: Total cross sections from Sandia parametrisation. -PhysicsList::SetCuts:CutLength : 1 mm - # -###/run/particle/applyCuts -# -/gun/particle e- -/gun/energy 5 GeV -# -/testem/event/printModulo 10 -# -/run/beamOn 500 - -compt: Total cross sections from a parametrisation. Good description from 10 KeV to (100/Z) GeV. - Scattered gamma energy according Klein-Nishina. - PhysicsTables from 1 keV to 100 GeV in 80 bins. - -conv: Total cross sections from a parametrisation. Good description from 1.5 MeV to 100 GeV for all Z. - e+e- energies according Bethe-Heitler - PhysicsTables from 1.022 MeV to 100 GeV in 100 bins. - -msc: Model variant of multiple scattering - Lambda tables from 100 eV to 100 TeV in 100 bins. - Boundary algorithm is active with facrange= 0.199 - -eIoni: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. - -eBrem: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Total cross sections from a parametrisation based on the EEDL data library. - Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. - -eIoni: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. - -eBrem: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Total cross sections from a parametrisation based on the EEDL data library. - Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. - -annihil: Total cross section from Heilter formula(annihilation into 2 photons). - gamma energies sampled according Heitler - PhysicsTables from 10 keV to 10 TeV in 100 bins. - -msc: Model variant of multiple scattering - Lambda tables from 100 eV to 100 TeV in 100 bins. - Boundary algorithm is active with facrange= 0.199 - -hIoni: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 - -msc: Model variant of multiple scattering - Lambda tables from 100 eV to 100 TeV in 100 bins. - Boundary algorithm is active with facrange= 0.199 - -MuIoni: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Bether-Bloch model for E > 0.2 MeV parametrisation of Bragg peak below. - -MuBrems: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Parametrised model - -MuPairProd: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Parametrised model - -MuIoni: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Bether-Bloch model for E > 0.2 MeV parametrisation of Bragg peak below. - -MuBrems: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Parametrised model - -MuPairProd: - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Parametrised model - -========= Table of registered couples ============================== - -Index : 0 used in the geometry : Yes recalculation needed : No - Material : PbWO4 - Range cuts : gamma 1 mm e- 1 mm e+ 1 mm - Energy thresholds : gamma 84.7768 keV e- 1.13176 MeV e+ 1.06419 MeV - Region(s) which use this couple : - DefaultRegionForTheWorld - -==================================================================== - -### Run 0 start. - ---------- Ranecu engine status --------- - Initial seed (index) = 0 - Current couple of seeds = 9876, 54321 ----------------------------------------- -Start Run processing. - ----> Begin of Event: 0 - ----> Begin of Event: 10 - ----> Begin of Event: 20 - ----> Begin of Event: 30 - ----> Begin of Event: 40 - ----> Begin of Event: 50 - ----> Begin of Event: 60 - ----> Begin of Event: 70 - ----> Begin of Event: 80 - ----> Begin of Event: 90 - ----> Begin of Event: 100 - ----> Begin of Event: 110 - ----> Begin of Event: 120 - ----> Begin of Event: 130 - ----> Begin of Event: 140 - ----> Begin of Event: 150 - ----> Begin of Event: 160 - ----> Begin of Event: 170 - ----> Begin of Event: 180 - ----> Begin of Event: 190 - ----> Begin of Event: 200 - ----> Begin of Event: 210 - ----> Begin of Event: 220 - ----> Begin of Event: 230 - ----> Begin of Event: 240 - ----> Begin of Event: 250 - ----> Begin of Event: 260 - ----> Begin of Event: 270 - ----> Begin of Event: 280 - ----> Begin of Event: 290 - ----> Begin of Event: 300 - ----> Begin of Event: 310 - ----> Begin of Event: 320 - ----> Begin of Event: 330 - ----> Begin of Event: 340 - ----> Begin of Event: 350 - ----> Begin of Event: 360 - ----> Begin of Event: 370 - ----> Begin of Event: 380 - ----> Begin of Event: 390 - ----> Begin of Event: 400 - ----> Begin of Event: 410 - ----> Begin of Event: 420 - ----> Begin of Event: 430 - ----> Begin of Event: 440 - ----> Begin of Event: 450 - ----> Begin of Event: 460 - ----> Begin of Event: 470 - ----> Begin of Event: 480 - ----> Begin of Event: 490 -Run terminated. -Run Summary - Number of events processed : 500 - User=249.29s Real=263.81s Sys=2.25s - LATERAL PROFILE CUMULATIVE LATERAL PROFILE - - bin Mean rms bin Mean rms - - 0.00-> 1.00 radl: 0.68% 0.39% 0-> 1.00 radl: 0.68% 0.39% - 1.00-> 2.00 radl: 2.72% 1.39% 0-> 2.00 radl: 3.40% 1.67% - 2.00-> 3.00 radl: 5.88% 2.47% 0-> 3.00 radl: 9.28% 3.84% - 3.00-> 4.00 radl: 9.03% 2.86% 0-> 4.00 radl: 18.31% 6.24% - 4.00-> 5.00 radl: 11.09% 2.72% 0-> 5.00 radl: 29.40% 8.22% - 5.00-> 6.00 radl: 11.43% 2.29% 0-> 6.00 radl: 40.82% 9.35% - 6.00-> 7.00 radl: 10.85% 2.03% 0-> 7.00 radl: 51.68% 9.60% - 7.00-> 8.00 radl: 9.65% 1.98% 0-> 8.00 radl: 61.32% 9.20% - 8.00-> 9.00 radl: 7.97% 1.81% 0-> 9.00 radl: 69.29% 8.39% - 9.00->10.00 radl: 6.34% 1.83% 0->10.00 radl: 75.63% 7.32% - 10.00->11.00 radl: 5.01% 1.69% 0->11.00 radl: 80.65% 6.19% - 11.00->12.00 radl: 3.85% 1.39% 0->12.00 radl: 84.50% 5.17% - 12.00->13.00 radl: 2.90% 1.27% 0->13.00 radl: 87.40% 4.17% - 13.00->14.00 radl: 2.20% 1.09% 0->14.00 radl: 89.61% 3.30% - 14.00->15.00 radl: 1.56% 0.84% 0->15.00 radl: 91.17% 2.67% - 15.00->16.00 radl: 1.13% 0.67% 0->16.00 radl: 92.30% 2.18% - 16.00->17.00 radl: 0.85% 0.57% 0->17.00 radl: 93.15% 1.75% - 17.00->18.00 radl: 0.62% 0.47% 0->18.00 radl: 93.77% 1.42% - 18.00->19.00 radl: 0.47% 0.40% 0->19.00 radl: 94.24% 1.16% - 19.00->20.00 radl: 0.31% 0.30% 0->20.00 radl: 94.55% 0.99% - - - - RADIAL PROFILE CUMULATIVE RADIAL PROFILE - - bin Mean rms bin Mean rms - - 0.00-> 0.25 radl: 34.34% 2.51% 0-> 0.25 radl: 34.34% 2.51% - 0.25-> 0.50 radl: 17.82% 1.43% 0-> 0.50 radl: 52.16% 2.55% - 0.50-> 0.75 radl: 10.54% 1.11% 0-> 0.75 radl: 62.70% 2.44% - 0.75-> 1.00 radl: 6.89% 0.90% 0-> 1.00 radl: 69.59% 2.17% - 1.00-> 1.25 radl: 4.83% 0.73% 0-> 1.25 radl: 74.42% 1.96% - 1.25-> 1.50 radl: 3.66% 0.61% 0-> 1.50 radl: 78.09% 1.77% - 1.50-> 1.75 radl: 2.86% 0.51% 0-> 1.75 radl: 80.95% 1.64% - 1.75-> 2.00 radl: 2.32% 0.43% 0-> 2.00 radl: 83.26% 1.52% - 2.00-> 2.25 radl: 1.90% 0.39% 0-> 2.25 radl: 85.17% 1.44% - 2.25-> 2.50 radl: 1.61% 0.35% 0-> 2.50 radl: 86.77% 1.38% - 2.50-> 2.75 radl: 1.36% 0.31% 0-> 2.75 radl: 88.13% 1.32% - 2.75-> 3.00 radl: 1.16% 0.28% 0-> 3.00 radl: 89.29% 1.26% - 3.00-> 3.25 radl: 1.00% 0.26% 0-> 3.25 radl: 90.29% 1.20% - 3.25-> 3.50 radl: 0.87% 0.23% 0-> 3.50 radl: 91.16% 1.17% - 3.50-> 3.75 radl: 0.77% 0.22% 0-> 3.75 radl: 91.93% 1.12% - 3.75-> 4.00 radl: 0.67% 0.21% 0-> 4.00 radl: 92.60% 1.08% - 4.00-> 4.25 radl: 0.61% 0.20% 0-> 4.25 radl: 93.21% 1.05% - 4.25-> 4.50 radl: 0.51% 0.18% 0-> 4.50 radl: 93.72% 1.02% - 4.50-> 4.75 radl: 0.45% 0.16% 0-> 4.75 radl: 94.17% 1.00% - 4.75-> 5.00 radl: 0.39% 0.14% 0-> 5.00 radl: 94.55% 0.99% - - SUMMARY - energy deposit : 94.55 % E0 +- 0.99 % E0 - charged traklen: 476.71 radl +- 5.09 radl - neutral traklen: 4431.57 radl +- 133.17 radl - ---------- Ranecu engine status --------- - Initial seed (index) = 0 - Current couple of seeds = 1618930871, 404048512 ----------------------------------------- -Graphics systems deleted. -Visualization Manager deleting... -G4 kernel has come to Quit state. diff --git a/examples/extended/electromagnetic/TestEm2/TestEm2.out b/examples/extended/electromagnetic/TestEm2/TestEm2.out index 50ef2993d9..368d8c6ba4 100644 --- a/examples/extended/electromagnetic/TestEm2/TestEm2.out +++ b/examples/extended/electromagnetic/TestEm2/TestEm2.out @@ -1,12 +1,66 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* G4Material: Mean excitation energy is changed for Water Iold= 70.8926eV; Inew= 75 eV; + +***** Table : Nb of materials = 13 ***** + + Material: Air density: 1.290 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 285.161 m + ---> Element: Nitrogen N Z = 7.0 N = 14.0 A = 14.01 g/mole fractionMass: 70.00 % Abundance 72.71 % + ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 30.00 % Abundance 27.29 % + + Material: Water density: 1.000 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 36.092 cm + ---> Element: Hydrogen H Z = 1.0 N = 1.0 A = 1.01 g/mole fractionMass: 11.21 % Abundance 66.67 % + ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 88.79 % Abundance 33.33 % + + Material: liquidArgon density: 1.390 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 14.065 cm + ---> Element: liquidArgon Z = 18.0 N = 40.0 A = 39.95 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: Aluminium density: 2.700 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 8.893 cm + ---> Element: Aluminium Z = 13.0 N = 27.0 A = 26.98 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: Iron density: 7.870 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 1.759 cm + ---> Element: Iron Z = 26.0 N = 55.9 A = 55.85 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: Nickel density: 8.960 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 1.415 cm + ---> Element: Nickel Z = 28.0 N = 58.7 A = 58.69 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: Copper density: 8.960 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 1.435 cm + ---> Element: Copper Z = 29.0 N = 63.5 A = 63.54 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: BGO density: 7.100 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 1.123 cm + ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 15.41 % Abundance 63.16 % + ---> Element: Germanium Ge Z = 32.0 N = 72.6 A = 72.59 g/mole fractionMass: 17.48 % Abundance 15.79 % + ---> Element: Bismuth Bi Z = 83.0 N = 209.0 A = 208.98 g/mole fractionMass: 67.10 % Abundance 21.05 % + + Material: PbWO4 density: 8.280 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 8.924 mm + ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 14.07 % Abundance 66.67 % + ---> Element: Lead Pb Z = 82.0 N = 207.2 A = 207.19 g/mole fractionMass: 45.53 % Abundance 16.67 % + ---> Element: Tungsten W Z = 74.0 N = 183.8 A = 183.84 g/mole fractionMass: 40.40 % Abundance 16.67 % + + Material: Tungsten density: 19.300 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 3.504 mm + ---> Element: Tungsten W Z = 74.0 N = 183.8 A = 183.84 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: FCal2Slugs density: 18.600 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 3.689 mm + ---> Element: Tungsten W Z = 74.0 N = 183.8 A = 183.84 g/mole fractionMass: 97.00 % Abundance 91.03 % + ---> Element: Iron Z = 26.0 N = 55.9 A = 55.85 g/mole fractionMass: 1.00 % Abundance 3.09 % + ---> Element: Nickel Z = 28.0 N = 58.7 A = 58.69 g/mole fractionMass: 2.00 % Abundance 5.88 % + + Material: FCal2Abs density: 10.000 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 7.568 mm + ---> Element: Copper Z = 29.0 N = 63.5 A = 63.54 g/mole fractionMass: 20.00 % Abundance 40.43 % + ---> Element: Tungsten W Z = 74.0 N = 183.8 A = 183.84 g/mole fractionMass: 77.60 % Abundance 54.22 % + ---> Element: Iron Z = 26.0 N = 55.9 A = 55.85 g/mole fractionMass: 0.80 % Abundance 1.84 % + ---> Element: Nickel Z = 28.0 N = 58.7 A = 58.69 g/mole fractionMass: 1.60 % Abundance 3.50 % + + Material: Lead density: 11.350 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 5.612 mm + ---> Element: Lead Pb Z = 82.0 N = 207.2 A = 207.19 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Visualization Manager instantiating... Visualization Manager initialising... Registering graphics systems... @@ -27,6 +81,9 @@ Current available graphics systems are: /testem/det/setLbin 9 1.11 /testem/det/setRbin 6 0.111 # +# Acceptance printout is activated +/testem/run/acceptance 0.9425 0.0355 3.0 +# /testem/phys/addPhysics standard ### /testem/phys/addPhysics g4v52 # @@ -39,7 +96,6 @@ Absorber is 3.60564 m of Water ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 88.79 % Abundance 33.33 % phot: Total cross sections from Sandia parametrisation. -PhysicsList::SetCuts:CutLength : 1 mm # /gun/particle e- /gun/energy 1 GeV @@ -57,30 +113,30 @@ conv: Total cross sections from a parametrisation. Good description from 1.5 Me PhysicsTables from 1.022 MeV to 100 GeV in 100 bins. msc: Model variant of multiple scattering for e- - Lambda tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from 100 eV to 100 GeV in 90 bins. Boundary algorithm is active with facrange= 0.199 eIoni: tables are built for e- - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. eBrem: tables are built for e- - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Total cross sections from a parametrisation based on the EEDL data library. Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. eIoni: tables are built for e+ - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. eBrem: tables are built for e+ - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Total cross sections from a parametrisation based on the EEDL data library. Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. @@ -89,46 +145,46 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). PhysicsTables from 10 keV to 10 TeV in 100 bins. msc: Model variant of multiple scattering for proton - Lambda tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from 100 eV to 100 GeV in 90 bins. Boundary algorithm is active with facrange= 0.199 hIoni: tables are built for proton - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ - Lambda tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from 100 eV to 100 GeV in 90 bins. Boundary algorithm is active with facrange= 0.199 MuIoni: tables are built for mu+ - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV MuBrems: tables are built for mu+ - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Parametrised model MuPairProd: tables are built for mu+ - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. Parametrised model ### All dEdx and Range tables are built ##### MuIoni: tables are built for mu- - dE/dx and range tables from 100 eV to 100 TeV in 120 bins. - Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + dE/dx and range tables from 100 eV to 100 GeV in 90 bins. + Lambda tables from threshold to 100 GeV in 90 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV msc: Model variant of multiple scattering for pi- - Lambda tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from 100 eV to 100 GeV in 90 bins. Boundary algorithm is active with facrange= 0.199 ========= Table of registered couples ============================== @@ -162,20 +218,20 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100 - User=19.4s Real=26.61s Sys=0.78s + User=18.88s Real=24s Sys=0.79s LATERAL PROFILE CUMULATIVE LATERAL PROFILE bin Mean rms bin Mean rms - 0.00-> 1.11 radl: 14.52% 5.41% 0-> 1.11 radl: 14.52% 5.41% - 1.11-> 2.22 radl: 25.45% 11.59% 0-> 2.22 radl: 39.97% 13.86% - 2.22-> 3.33 radl: 21.58% 9.64% 0-> 3.33 radl: 61.55% 17.65% - 3.33-> 4.44 radl: 13.27% 8.00% 0-> 4.44 radl: 74.82% 17.01% - 4.44-> 5.55 radl: 8.31% 7.17% 0-> 5.55 radl: 83.13% 14.68% - 5.55-> 6.66 radl: 4.79% 5.50% 0-> 6.66 radl: 87.92% 12.26% - 6.66-> 7.77 radl: 3.09% 4.98% 0-> 7.77 radl: 91.01% 9.43% - 7.77-> 8.88 radl: 1.84% 4.08% 0-> 8.88 radl: 92.85% 7.00% - 8.88-> 9.99 radl: 1.10% 2.97% 0-> 9.99 radl: 93.95% 5.01% + 0.00-> 1.11 radl: 15.55% 7.53% 0-> 1.11 radl: 15.55% 7.53% + 1.11-> 2.22 radl: 25.78% 9.77% 0-> 2.22 radl: 41.33% 14.34% + 2.22-> 3.33 radl: 21.23% 10.43% 0-> 3.33 radl: 62.56% 16.48% + 3.33-> 4.44 radl: 12.63% 7.44% 0-> 4.44 radl: 75.19% 15.24% + 4.44-> 5.55 radl: 8.22% 6.41% 0-> 5.55 radl: 83.41% 13.04% + 5.55-> 6.66 radl: 5.04% 6.12% 0-> 6.66 radl: 88.45% 9.13% + 6.66-> 7.77 radl: 3.32% 5.60% 0-> 7.77 radl: 91.77% 6.79% + 7.77-> 8.88 radl: 1.40% 3.09% 0-> 8.88 radl: 93.17% 6.15% + 8.88-> 9.99 radl: 0.46% 1.16% 0-> 9.99 radl: 93.63% 6.04% @@ -183,22 +239,28 @@ Run Summary bin Mean rms bin Mean rms - 0.00-> 0.11 radl: 64.91% 10.71% 0-> 0.11 radl: 64.91% 10.71% - 0.11-> 0.22 radl: 16.59% 7.15% 0-> 0.22 radl: 81.50% 8.63% - 0.22-> 0.33 radl: 6.13% 3.78% 0-> 0.33 radl: 87.63% 6.99% - 0.33-> 0.44 radl: 3.10% 2.67% 0-> 0.44 radl: 90.72% 5.70% - 0.44-> 0.56 radl: 1.97% 1.86% 0-> 0.56 radl: 92.69% 5.18% - 0.56-> 0.67 radl: 1.26% 1.29% 0-> 0.67 radl: 93.95% 5.01% + 0.00-> 0.11 radl: 62.83% 11.49% 0-> 0.11 radl: 62.83% 11.49% + 0.11-> 0.22 radl: 16.02% 6.14% 0-> 0.22 radl: 78.85% 10.87% + 0.22-> 0.33 radl: 7.39% 4.51% 0-> 0.33 radl: 86.24% 9.57% + 0.33-> 0.44 radl: 3.43% 2.71% 0-> 0.44 radl: 89.67% 8.31% + 0.44-> 0.56 radl: 2.34% 2.36% 0-> 0.56 radl: 92.02% 7.01% + 0.56-> 0.67 radl: 1.62% 1.82% 0-> 0.67 radl: 93.63% 6.04% SUMMARY - energy deposit : 93.95 % E0 +- 5.01 % E0 - charged traklen: 13.68 radl +- 0.73 radl - neutral traklen: 197.09 radl +- 22.60 radl + energy deposit : 93.63 % E0 +- 6.04 % E0 + charged traklen: 13.64 radl +- 0.87 radl + neutral traklen: 194.75 radl +- 23.22 radl --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 542151701, 1817008196 + Current couple of seeds = 1295517251, 1185660715 ---------------------------------------- + +<<<<>>>> 100 events for Total Energy in Absorber +Edep: 0.93630358 delEdep= -0.0061964186 nrms= -1.74547 +Erms: 0.06041669 delErms= 0.02491669 nrms= 7.0187859 +<<<<>>>> IS NOT ACCEPTED + Graphics systems deleted. Visualization Manager deleting... G4 kernel has come to Quit state. diff --git a/examples/extended/electromagnetic/TestEm2/include/DecaysBuilder.hh b/examples/extended/electromagnetic/TestEm2/include/DecaysBuilder.hh new file mode 100755 index 0000000000..6f61014217 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/DecaysBuilder.hh @@ -0,0 +1,71 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: DecaysBuilder.hh,v 1.1 2004/05/04 08:32:47 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef DecaysBuilder_h +#define DecaysBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class DecaysBuilder : public G4VPhysicsConstructor +{ +public: + DecaysBuilder(const G4String& name = "decays"); + virtual ~DecaysBuilder(); + +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(); + +private: + + // hide assignment operator + DecaysBuilder & operator=(const DecaysBuilder &right); + DecaysBuilder(const DecaysBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + + + + + + + + diff --git a/examples/extended/electromagnetic/TestEm2/include/DetectorConstruction.hh b/examples/extended/electromagnetic/TestEm2/include/DetectorConstruction.hh index fba7252c4d..16e269802f 100644 --- a/examples/extended/electromagnetic/TestEm2/include/DetectorConstruction.hh +++ b/examples/extended/electromagnetic/TestEm2/include/DetectorConstruction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.hh,v 1.1 2003/10/08 17:28:34 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.hh,v 1.5 2004/06/18 15:43:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -63,12 +63,11 @@ class DetectorConstruction : public G4VUserDetectorConstruction void UpdateGeometry(); - public: - const G4VPhysicalVolume* GetEcal() {return physiEcal;}; G4Material* GetMaterial() {return myMaterial;}; + // Subdivision of absorber G4int GetnLtot() {return nLtot;}; G4int GetnRtot() {return nRtot;}; G4double GetdLradl() {return dLradl;}; diff --git a/examples/extended/electromagnetic/TestEm2/include/DetectorMessenger.hh b/examples/extended/electromagnetic/TestEm2/include/DetectorMessenger.hh index e229e5f3bb..8b44f9063d 100644 --- a/examples/extended/electromagnetic/TestEm2/include/DetectorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm2/include/DetectorMessenger.hh @@ -20,12 +20,10 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: DetectorMessenger.hh,v 1.1 2003/10/08 17:28:34 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.hh,v 1.4 2004/06/18 15:43:39 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -46,21 +44,21 @@ class G4UIcmdWithoutParameter; class DetectorMessenger: public G4UImessenger { - public: - DetectorMessenger(DetectorConstruction* ); - ~DetectorMessenger(); - - void SetNewValue(G4UIcommand*, G4String); - - private: - DetectorConstruction* Detector; - - G4UIdirectory* testemDir; - G4UIcmdWithAString* MaterCmd; - G4UIcmdWith3Vector* LBinCmd; - G4UIcmdWith3Vector* RBinCmd; - G4UIcmdWithADoubleAndUnit* FieldCmd; - G4UIcmdWithoutParameter* UpdateCmd; +public: + DetectorMessenger(DetectorConstruction* ); + ~DetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + DetectorConstruction* Detector; + + G4UIdirectory* testemDir; + G4UIcmdWithAString* MaterCmd; + G4UIcmdWith3Vector* LBinCmd; + G4UIcmdWith3Vector* RBinCmd; + G4UIcmdWithADoubleAndUnit* FieldCmd; + G4UIcmdWithoutParameter* UpdateCmd; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/include/EmAcceptance.hh b/examples/extended/electromagnetic/TestEm2/include/EmAcceptance.hh new file mode 100644 index 0000000000..1c3f7917db --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/EmAcceptance.hh @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EmAcceptance.hh,v 1.1 2004/05/24 07:03:22 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +#ifndef EmAcceptance_h +#define EmAcceptance_h 1 + +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EmAcceptance +{ + +public: + EmAcceptance(); + ~EmAcceptance(); + + void BeginOfAcceptance(const G4String& title, G4int stat); + void EndOfAcceptance(); + + void EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit); + +private: + + // hide assignment operator + EmAcceptance & operator=(const EmAcceptance &right); + EmAcceptance(const EmAcceptance&); + + G4bool isAccepted; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder.hh new file mode 100755 index 0000000000..74c0c2a6f2 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder.hh,v 1.1 2004/05/04 08:32:48 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHadronBuilder_h +#define G4EmHadronBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHadronBuilder : public G4VPhysicsConstructor +{ +public: + G4EmHadronBuilder(const G4String& name = "EM_stand_had"); + virtual ~G4EmHadronBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmHadronBuilder & operator=(const G4EmHadronBuilder &right); + G4EmHadronBuilder(const G4EmHadronBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder52.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder52.hh new file mode 100755 index 0000000000..786196d310 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmHadronBuilder52.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder52.hh,v 1.1 2004/05/04 08:32:48 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHadronBuilder52_h +#define G4EmHadronBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHadronBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmHadronBuilder52(const G4String& name = "EM_stand_had"); + virtual ~G4EmHadronBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmHadronBuilder52 & operator=(const G4EmHadronBuilder52 &right); + G4EmHadronBuilder52(const G4EmHadronBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmHighEnergyBuilder.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmHighEnergyBuilder.hh new file mode 100755 index 0000000000..bfba1bae21 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmHighEnergyBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHighEnergyBuilder.hh,v 1.1 2004/05/04 08:32:49 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmHighEnergyBuilder_h +#define G4EmHighEnergyBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmHighEnergyBuilder : public G4VPhysicsConstructor +{ +public: + G4EmHighEnergyBuilder(const G4String& name = "EM_stan_HE"); + virtual ~G4EmHighEnergyBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmHighEnergyBuilder & operator=(const G4EmHighEnergyBuilder &right); + G4EmHighEnergyBuilder(const G4EmHighEnergyBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder.hh new file mode 100755 index 0000000000..f08b831146 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder.hh,v 1.1 2004/05/04 08:32:49 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmMuonBuilder_h +#define G4EmMuonBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmMuonBuilder : public G4VPhysicsConstructor +{ +public: + G4EmMuonBuilder(const G4String& name = "EM_stan_muons"); + virtual ~G4EmMuonBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmMuonBuilder & operator=(const G4EmMuonBuilder &right); + G4EmMuonBuilder(const G4EmMuonBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder52.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder52.hh new file mode 100755 index 0000000000..432b273715 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmMuonBuilder52.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder52.hh,v 1.1 2004/05/04 08:32:50 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmMuonBuilder52_h +#define G4EmMuonBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmMuonBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmMuonBuilder52(const G4String& name = "EM_stan_muons"); + virtual ~G4EmMuonBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmMuonBuilder52 & operator=(const G4EmMuonBuilder52 &right); + G4EmMuonBuilder52(const G4EmMuonBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder.hh new file mode 100755 index 0000000000..afb13998b3 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder.hh,v 1.1 2004/05/04 08:32:50 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmQEDBuilder_h +#define G4EmQEDBuilder_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmQEDBuilder : public G4VPhysicsConstructor +{ +public: + G4EmQEDBuilder(const G4String& name = "EM_stan_QED"); + virtual ~G4EmQEDBuilder(); + +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(); + +private: + + // hide assignment operator + G4EmQEDBuilder & operator=(const G4EmQEDBuilder &right); + G4EmQEDBuilder(const G4EmQEDBuilder&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder52.hh b/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder52.hh new file mode 100755 index 0000000000..912bc41c84 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/include/G4EmQEDBuilder52.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder52.hh,v 1.1 2004/05/04 08:32:51 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef G4EmQEDBuilder52_h +#define G4EmQEDBuilder52_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class G4EmQEDBuilder52 : public G4VPhysicsConstructor +{ +public: + G4EmQEDBuilder52(const G4String& name = "EM_stan_QED"); + virtual ~G4EmQEDBuilder52(); + +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(); + +private: + + // hide assignment operator + G4EmQEDBuilder52 & operator=(const G4EmQEDBuilder52 &right); + G4EmQEDBuilder52(const G4EmQEDBuilder52&); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif + diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListParticles.hh b/examples/extended/electromagnetic/TestEm2/include/ParticlesBuilder.hh old mode 100644 new mode 100755 similarity index 77% rename from examples/extended/electromagnetic/TestEm5/include/PhysListParticles.hh rename to examples/extended/electromagnetic/TestEm2/include/ParticlesBuilder.hh index ab515deae6..e07cc735dc --- a/examples/extended/electromagnetic/TestEm5/include/PhysListParticles.hh +++ b/examples/extended/electromagnetic/TestEm2/include/ParticlesBuilder.hh @@ -21,34 +21,34 @@ // ******************************************************************** // // -// $Id: PhysListParticles.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ParticlesBuilder.hh,v 1.1 2004/05/04 08:32:51 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListParticles_h -#define PhysListParticles_h 1 +#ifndef ParticlesBuilder_h +#define ParticlesBuilder_h 1 #include "G4VPhysicsConstructor.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListParticles : public G4VPhysicsConstructor +class ParticlesBuilder : public G4VPhysicsConstructor { - public: - PhysListParticles(const G4String& name = "particles"); - ~PhysListParticles(); +public: + ParticlesBuilder(const G4String& name = "particles"); + virtual ~ParticlesBuilder(); - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(); - - // This method is dummy. - void ConstructProcess() {}; +public: + // This method will be invoked in the Construct() method. + // each particle type will be instantiated + virtual void ConstructParticle(); + + // This method is dummy. + virtual void ConstructProcess() {}; }; diff --git a/examples/extended/electromagnetic/TestEm2/include/PhysicsList.hh b/examples/extended/electromagnetic/TestEm2/include/PhysicsList.hh index 13000e7b0e..037c7d2185 100644 --- a/examples/extended/electromagnetic/TestEm2/include/PhysicsList.hh +++ b/examples/extended/electromagnetic/TestEm2/include/PhysicsList.hh @@ -21,12 +21,20 @@ // ******************************************************************** // // -// $Id: PhysicsList.hh,v 1.1 2003/10/08 17:28:37 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.hh,v 1.2 2004/05/04 07:36:40 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // -// 14.10.02 (V.Ivanchenko) provide modular list on base of old PhysicsList +//--------------------------------------------------------------------------- +// +// ClassName: PhysicsList +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -38,36 +46,40 @@ #include "globals.hh" class PhysicsListMessenger; -class G4VPhysicsConstructor; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class PhysicsList: public G4VModularPhysicsList { - public: - PhysicsList(); - ~PhysicsList(); +public: + PhysicsList(); + ~PhysicsList(); - virtual void ConstructParticle(); - virtual void ConstructProcess(); - void AddPhysicsList(const G4String& name); + virtual void ConstructParticle(); + virtual void ConstructProcess(); + virtual void SetCuts(); - void SetCuts(); - void SetCutForGamma(G4double); - void SetCutForElectron(G4double); - void SetCutForPositron(G4double); + void SetCutForGamma(G4double); + void SetCutForElectron(G4double); + void SetCutForPositron(G4double); - private: - G4double cutForGamma; - G4double cutForElectron; - G4double cutForPositron; - G4double currentDefaultCut; - G4VPhysicsConstructor* emPhysicsList; - G4VPhysicsConstructor* generalPhysicsList; - G4VPhysicsConstructor* particleList; - G4String emName; + void AddPhysicsList(const G4String&); + void SetVerbose(G4int val); + +private: + + // hide assignment operator + PhysicsList & operator=(const PhysicsList &right); + PhysicsList(const PhysicsList&); + + G4double cutForGamma; + G4double cutForElectron; + G4double cutForPositron; + G4int verbose; + G4bool emBuilderIsRegisted; + + PhysicsListMessenger* pMessenger; - PhysicsListMessenger* pMessenger; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/include/RunAction.hh b/examples/extended/electromagnetic/TestEm2/include/RunAction.hh index 2af63e7970..a131c65293 100644 --- a/examples/extended/electromagnetic/TestEm2/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm2/include/RunAction.hh @@ -20,14 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunAction.hh,v 1.5 2004/06/18 15:43:40 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunAction.hh,v 1.1 2003/10/08 17:28:37 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -// 08.03.01 Hisaya: Adapted MyVector for STL - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,6 +32,7 @@ #include "G4UserRunAction.hh" #include "G4ParticleDefinition.hh" +#include "G4ThreeVector.hh" #include "globals.hh" #include @@ -47,72 +43,96 @@ typedef std::vector MyVector; class DetectorConstruction; class PrimaryGeneratorAction; +class RunActionMessenger; class G4Run; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA namespace AIDA { - class ITree; - class IHistogram1D; -} + class ITree; + class IHistogram1D; +} #endif +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class RunAction : public G4UserRunAction { public: - + RunAction(DetectorConstruction*, PrimaryGeneratorAction*); ~RunAction(); void BeginOfRunAction(const G4Run*); void EndOfRunAction(const G4Run*); - + inline void initializePerEvent(); void fillPerEvent(); inline void fillPerTrack(G4double,G4double); inline void fillPerStep (G4double,G4int,G4int); inline void particleFlux(G4ParticleDefinition*,G4int); - + + // Acceptance parameters + void SetEdepAndRMS(G4ThreeVector); + + G4double GetAverageEdep() const {return edeptrue;}; + G4double GetRMSEdep() const {return rmstrue;}; + G4double GetLimitEdep() const {return limittrue;}; + + // Histogram name and type + void SetHistoName(G4String& val) {histoName = val;}; + void SetHistoType(G4String& val) {histoType = val;}; + + const G4String& HistoName() const {return histoName;}; + const G4String& HistoType() const {return histoType;}; + private: - + void bookHisto(); void cleanHisto(); - + private: - + DetectorConstruction* Det; PrimaryGeneratorAction* Kin; + RunActionMessenger* runMessenger; - G4int nLbin; + G4int nLbin; MyVector dEdL; MyVector sumELongit; MyVector sumE2Longit; MyVector sumELongitCumul; MyVector sumE2LongitCumul; - - G4int nRbin; + + G4int nRbin; MyVector dEdR; MyVector sumERadial; MyVector sumE2Radial; MyVector sumERadialCumul; MyVector sumE2RadialCumul; - + MyVector gammaFlux; MyVector electronFlux; MyVector positronFlux; - + G4double ChargTrLength; G4double sumChargTrLength; G4double sum2ChargTrLength; - + G4double NeutrTrLength; G4double sumNeutrTrLength; G4double sum2NeutrTrLength; - -#ifdef G4ANALYSIS_USE + + G4double edeptrue; + G4double rmstrue; + G4double limittrue; + + G4String histoName; + G4String histoType; +#ifdef USE_AIDA AIDA::ITree* tree; // the tree should only be deleted at the end AIDA::IHistogram1D* histo[12]; // (after writing the histos to file) -#endif +#endif }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -120,7 +140,7 @@ class RunAction : public G4UserRunAction inline void RunAction::initializePerEvent() { - //initialize arrays of energy deposit per bin + //initialize arrays of energy deposit per bin for (G4int i=0; ivalue(); G4ProcessManager* pmanager = particle->GetProcessManager(); - if (fDecayProcess->IsApplicable(*particle)) { + if (fDecayProcess->IsApplicable(*particle)) { pmanager ->AddProcess(fDecayProcess); diff --git a/examples/extended/electromagnetic/TestEm2/src/DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm2/src/DetectorConstruction.cc index 72e9d65851..ec19215f17 100644 --- a/examples/extended/electromagnetic/TestEm2/src/DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm2/src/DetectorConstruction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.cc,v 1.2 2003/11/25 15:19:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.cc,v 1.7 2004/06/18 15:43:41 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -56,7 +56,7 @@ DetectorConstruction::DetectorConstruction() { DefineMaterials(); SetMaterial("PbWO4"); - detectorMessenger = new DetectorMessenger(this); + detectorMessenger = new DetectorMessenger(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -109,7 +109,12 @@ void DetectorConstruction::DefineMaterials() new G4Material("Aluminium", z=13., a= 26.98*g/mole, density= 2.7*g/cm3); + G4Material* Fe = new G4Material("Iron", z=26., a= 55.85*g/mole, density= 7.87*g/cm3); + G4Material* Ni = + new G4Material("Nickel", z=28., a= 58.69*g/mole, density= 8.96*g/cm3); + G4Material* Cu = + new G4Material("Copper", z=29., a= 63.54*g/mole, density= 8.96*g/cm3); G4Material* BGO = new G4Material("BGO", density= 7.10*g/cm3, ncomponents=3); @@ -127,11 +132,20 @@ void DetectorConstruction::DefineMaterials() new G4Material("Tungsten", density= 19.30*g/cm3, ncomponents=1); w->AddElement(W, fractionmass=1.0); + G4Material* ma1 = new G4Material("FCal2Slugs",density = 18.6*g/cm3, 3); + ma1->AddMaterial(w, fractionmass=0.97); + ma1->AddMaterial(Fe,fractionmass=0.01); + ma1->AddMaterial(Ni,fractionmass=0.02); + + G4Material* ma2 = new G4Material("FCal2Abs",density = 10.*g/cm3, 2); + ma2->AddMaterial(Cu, fractionmass=0.2); + ma2->AddMaterial(ma1,fractionmass=0.8); + G4Material* pb = new G4Material("Lead", density= 11.35*g/cm3, ncomponents=1); pb->AddElement(Pb, fractionmass=1.0); -//// G4cout << *(G4Material::GetMaterialTable()) << G4endl; + G4cout << *(G4Material::GetMaterialTable()) << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/src/DetectorMessenger.cc b/examples/extended/electromagnetic/TestEm2/src/DetectorMessenger.cc index 9e72bd4e21..4c052fe424 100644 --- a/examples/extended/electromagnetic/TestEm2/src/DetectorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm2/src/DetectorMessenger.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorMessenger.cc,v 1.1 2003/10/08 17:28:43 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.cc,v 1.6 2004/06/18 15:43:41 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -42,41 +42,41 @@ DetectorMessenger::DetectorMessenger(DetectorConstruction * Det) :Detector(Det) -{ +{ testemDir = new G4UIdirectory("/testem/"); testemDir->SetGuidance(" detector control."); - + MaterCmd = new G4UIcmdWithAString("/testem/det/setMat",this); MaterCmd->SetGuidance("Select Material."); MaterCmd->SetParameterName("material",false); MaterCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - + LBinCmd = new G4UIcmdWith3Vector("/testem/det/setLbin",this); LBinCmd->SetGuidance("set longitudinal bining"); LBinCmd->SetGuidance("nb of bins; bin thickness (in radl)"); LBinCmd->SetParameterName("nLtot","dLradl"," ",true); LBinCmd->SetRange("nLtot>=1 && dLradl>0"); LBinCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - + RBinCmd = new G4UIcmdWith3Vector("/testem/det/setRbin",this); RBinCmd->SetGuidance("set radial bining"); RBinCmd->SetGuidance("nb of bins; bin thickness (in radl)"); RBinCmd->SetParameterName("nRtot","dRradl"," ",true); RBinCmd->SetRange("nRtot>=1 && dRradl>0"); RBinCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - FieldCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setField",this); + + FieldCmd = new G4UIcmdWithADoubleAndUnit("/testem/det/setField",this); FieldCmd->SetGuidance("Define magnetic field."); FieldCmd->SetGuidance("Magnetic field will be in Z direction."); FieldCmd->SetParameterName("Bz",false); FieldCmd->SetUnitCategory("Magnetic flux density"); FieldCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - + UpdateCmd = new G4UIcmdWithoutParameter("/testem/det/update",this); UpdateCmd->SetGuidance("Update geometry."); UpdateCmd->SetGuidance("This command MUST be applied before \"beamOn\" "); UpdateCmd->SetGuidance("if you changed geometrical value(s)."); - UpdateCmd->AvailableForStates(G4State_Idle); + UpdateCmd->AvailableForStates(G4State_Idle); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -86,27 +86,27 @@ DetectorMessenger::~DetectorMessenger() delete MaterCmd; delete LBinCmd; delete RBinCmd; - delete FieldCmd; + delete FieldCmd; delete UpdateCmd; delete testemDir; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +void DetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) { if( command == MaterCmd ) { Detector->SetMaterial(newValue);} if( command == LBinCmd ) { Detector->SetLBining(LBinCmd->GetNew3VectorValue(newValue));} - + if( command == RBinCmd ) { Detector->SetRBining(RBinCmd->GetNew3VectorValue(newValue));} - + if( command == FieldCmd ) { Detector->SetMagField(FieldCmd->GetNewDoubleValue(newValue));} - + if( command == UpdateCmd ) { Detector->UpdateGeometry();} } diff --git a/examples/extended/electromagnetic/TestEm2/src/EmAcceptance.cc b/examples/extended/electromagnetic/TestEm2/src/EmAcceptance.cc new file mode 100644 index 0000000000..cc6210cf80 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/EmAcceptance.cc @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EmAcceptance.cc,v 1.2 2004/06/20 01:28:13 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EmAcceptance.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::EmAcceptance() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::~EmAcceptance() +{} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::BeginOfAcceptance(const G4String& title, G4int stat) +{ + G4cout << G4endl; + G4cout << "<<<<>>>> " << stat << " events for " << title << G4endl; + isAccepted = true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EndOfAcceptance() +{ + G4String resume = "IS ACCEPTED"; + if(!isAccepted) resume = "IS NOT ACCEPTED"; + G4cout << "<<<<>>>> " << resume << G4endl; + G4cout << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit) +{ + G4double x = sqrt((G4double)stat); + G4double dde = avr - avr0; + G4double de = dde*x/rms; + + G4cout << title << ": " << avr << " del"<< title << "= " << dde << " nrms= " << de << G4endl; + if(abs(de) > limit) isAccepted = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder.cc new file mode 100755 index 0000000000..713a15e15f --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder.cc,v 1.1 2004/05/04 08:33:32 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHadronBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHadronBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering.hh" + +#include "G4hIonisation.hh" +#include "G4ionIonisation.hh" + +#include "G4Electron.hh" +#include "G4Proton.hh" +#include "G4GenericIon.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder::G4EmHadronBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder::~G4EmHadronBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder::ConstructParticle() +{ + G4Electron::Electron(); + G4Proton::Proton(); + G4GenericIon::GenericIon(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder::ConstructProcess() +{ + // Add standard EM Processes + theParticleIterator->reset(); + + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + + if(particle->GetPDGMass() > 110.*MeV) { + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "GenericIon") { + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4ionIonisation, -1, 2,2); + + } else if ((!particle->IsShortLived()) && + (particle->GetPDGCharge() != 0.0) && + (particle->GetParticleName() != "chargedgeantino")) { + + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); + pmanager->AddProcess(new G4hIonisation, -1,2,2); + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder52.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder52.cc new file mode 100755 index 0000000000..a2883ca8db --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmHadronBuilder52.cc @@ -0,0 +1,104 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHadronBuilder52.cc,v 1.1 2004/05/04 08:33:32 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHadronBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHadronBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4hIonisation52.hh" + +#include "G4Electron.hh" +#include "G4Proton.hh" +#include "G4GenericIon.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder52::G4EmHadronBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHadronBuilder52::~G4EmHadronBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder52::ConstructParticle() +{ + G4Electron::Electron(); + G4Proton::Proton(); + G4GenericIon::GenericIon(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHadronBuilder52::ConstructProcess() +{ + // Add standard EM Processes + theParticleIterator->reset(); + + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + + if(particle->GetPDGMass() > 110.*MeV) { + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); + + + if (particleName == "GenericIon") { + + pmanager->AddProcess(new G4hIonisation52, -1, 1, 1); + + } else if ((!particle->IsShortLived()) && + (particle->GetPDGCharge() != 0.0) && + (particle->GetParticleName() != "chargedgeantino")) { + + pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); + pmanager->AddProcess(new G4hIonisation52, -1,2,2); + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmHighEnergyBuilder.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmHighEnergyBuilder.cc new file mode 100755 index 0000000000..8bb72a77b5 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmHighEnergyBuilder.cc @@ -0,0 +1,93 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmHighEnergyBuilder.cc,v 1.1 2004/05/04 08:33:34 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmHighEnergyBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmHighEnergyBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4AnnihiToMuPair.hh" +#include "G4GammaConversionToMuons.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHighEnergyBuilder::G4EmHighEnergyBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmHighEnergyBuilder::~G4EmHighEnergyBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHighEnergyBuilder::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmHighEnergyBuilder::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + pmanager->AddDiscreteProcess( new G4GammaConversionToMuons() ); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + pmanager->AddDiscreteProcess( new G4AnnihiToMuPair() ); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder.cc new file mode 100755 index 0000000000..a17e5100b9 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder.cc,v 1.1 2004/05/04 08:33:36 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmMuonBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmMuonBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering.hh" + +#include "G4MuIonisation.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder::G4EmMuonBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder::~G4EmMuonBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder::ConstructProcess() +{ + // Add standard EM Processes for mu+ + const G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); + + + // Add standard EM Processes for mu- + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder52.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder52.cc new file mode 100755 index 0000000000..5c2f891dd1 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmMuonBuilder52.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmMuonBuilder52.cc,v 1.1 2004/05/04 08:33:37 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmMuonBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmMuonBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4MuIonisation52.hh" +#include "G4MuBremsstrahlung52.hh" +#include "G4MuPairProduction52.hh" +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder52::G4EmMuonBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmMuonBuilder52::~G4EmMuonBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder52::ConstructParticle() +{ + // Minimal set of particles + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); + G4MuonPlus::MuonPlus(); + G4MuonMinus::MuonMinus(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmMuonBuilder52::ConstructProcess() +{ + // Add standard EM Processes for mu+ + const G4ParticleDefinition* particle = G4MuonPlus::MuonPlus(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation52, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,4); + + + // Add standard EM Processes for mu- + particle = G4MuonMinus::MuonMinus(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52,-1, 1,1); + pmanager->AddProcess(new G4MuIonisation52, -1, 2,2); + pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4MuPairProduction52, -1,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder.cc new file mode 100755 index 0000000000..2d7f887249 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder.cc,v 1.1 2004/05/04 08:33:37 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmQEDBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmQEDBuilder.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4PhotoElectricEffect.hh" + +#include "G4MultipleScattering.hh" + +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder::G4EmQEDBuilder(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder::~G4EmQEDBuilder() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder::ConstructParticle() +{ + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddDiscreteProcess( new G4PhotoElectricEffect() ); + pmanager->AddDiscreteProcess( new G4ComptonScattering() ); + pmanager->AddDiscreteProcess( new G4GammaConversion() ); + + // Add standard EM Processes for e- + particle = G4Electron::Electron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder52.cc b/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder52.cc new file mode 100755 index 0000000000..75b9d8bba8 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm2/src/G4EmQEDBuilder52.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4EmQEDBuilder52.cc,v 1.1 2004/05/04 08:33:38 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: G4EmQEDBuilder52 +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4EmQEDBuilder52.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" + +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4PhotoElectricEffect.hh" + +#include "G4MultipleScattering52.hh" + +#include "G4eIonisation52.hh" +#include "G4eBremsstrahlung52.hh" +#include "G4eplusAnnihilation.hh" + +#include "G4Gamma.hh" +#include "G4Electron.hh" +#include "G4Positron.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder52::G4EmQEDBuilder52(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4EmQEDBuilder52::~G4EmQEDBuilder52() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder52::ConstructParticle() +{ + G4Gamma::Gamma(); + G4Electron::Electron(); + G4Positron::Positron(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void G4EmQEDBuilder52::ConstructProcess() +{ + // Add standard EM Processes for gamma + G4ParticleDefinition* particle = G4Gamma::Gamma(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + pmanager->AddDiscreteProcess( new G4PhotoElectricEffect() ); + pmanager->AddDiscreteProcess( new G4ComptonScattering() ); + pmanager->AddDiscreteProcess( new G4GammaConversion() ); + + // Add standard EM Processes for e- + particle = G4Electron::Electron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); + pmanager->AddProcess(new G4eIonisation52, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); + + // Add standard EM Processes for e+ + particle = G4Positron::Positron(); + pmanager = particle->GetProcessManager(); + + pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); + pmanager->AddProcess(new G4eIonisation52, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm3/src/PhysListParticles.cc b/examples/extended/electromagnetic/TestEm2/src/ParticlesBuilder.cc old mode 100644 new mode 100755 similarity index 87% rename from examples/extended/electromagnetic/TestEm3/src/PhysListParticles.cc rename to examples/extended/electromagnetic/TestEm2/src/ParticlesBuilder.cc index d3b6465bcb..3de794cea9 --- a/examples/extended/electromagnetic/TestEm3/src/PhysListParticles.cc +++ b/examples/extended/electromagnetic/TestEm2/src/ParticlesBuilder.cc @@ -21,13 +21,24 @@ // ******************************************************************** // // -// $Id: PhysListParticles.cc,v 1.1 2003/09/22 14:06:20 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ParticlesBuilder.cc,v 1.1 2004/05/04 08:33:38 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//--------------------------------------------------------------------------- +// +// ClassName: ParticleBuilder +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "PhysListParticles.hh" +#include "ParticlesBuilder.hh" // Bosons #include "G4ChargedGeantino.hh" @@ -73,22 +84,22 @@ #include "G4He3.hh" #include "G4GenericIon.hh" -#include "IonC12.hh" +//#include "IonC12.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListParticles::PhysListParticles(const G4String& name) +ParticlesBuilder::ParticlesBuilder(const G4String& name) : G4VPhysicsConstructor(name) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListParticles::~PhysListParticles() +ParticlesBuilder::~ParticlesBuilder() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PhysListParticles::ConstructParticle() +void ParticlesBuilder::ConstructParticle() { // pseudo-particles @@ -137,7 +148,7 @@ void PhysListParticles::ConstructParticle() G4He3::He3Definition(); G4Alpha::AlphaDefinition(); G4GenericIon::GenericIonDefinition(); - IonC12::IonDefinition(); +// IonC12::IonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm2/src/PhysListEmG4v52.cc b/examples/extended/electromagnetic/TestEm2/src/PhysListEmG4v52.cc deleted file mode 100644 index 89cbd5bf33..0000000000 --- a/examples/extended/electromagnetic/TestEm2/src/PhysListEmG4v52.cc +++ /dev/null @@ -1,119 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -// -// $Id: PhysListEmG4v52.cc,v 1.2 2003/11/13 14:12:50 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "PhysListEmG4v52.hh" -#include "G4ParticleDefinition.hh" -#include "G4ProcessManager.hh" - -#include "G4ComptonScattering.hh" -#include "G4GammaConversion.hh" -#include "G4PhotoElectricEffect.hh" - -#include "G4MultipleScattering52.hh" -#include "G4MultipleScattering.hh" - -#include "G4eIonisation52.hh" -#include "G4eBremsstrahlung52.hh" -#include "G4eplusAnnihilation.hh" - -#include "G4MuIonisation52.hh" -#include "G4MuBremsstrahlung52.hh" -#include "G4MuPairProduction52.hh" - -#include "G4hIonisation52.hh" - - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListEmG4v52::PhysListEmG4v52(const G4String& name) - : G4VPhysicsConstructor(name) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListEmG4v52::~PhysListEmG4v52() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListEmG4v52::ConstructProcess() -{ - // Add EM processes realised on base of prototype of model approach design - - theParticleIterator->reset(); - while( (*theParticleIterator)() ){ - G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - G4String particleName = particle->GetParticleName(); - - if (particleName == "gamma") { - // gamma - pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); - pmanager->AddDiscreteProcess(new G4ComptonScattering); - pmanager->AddDiscreteProcess(new G4GammaConversion); - - } else if (particleName == "e-") { - //electron - // pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); - pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); - pmanager->AddProcess(new G4eIonisation52, -1, 2,2); - pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); - - } else if (particleName == "e+") { - //positron - pmanager->AddProcess(new G4MultipleScattering52, -1, 1,1); - pmanager->AddProcess(new G4eIonisation52, -1, 2,2); - pmanager->AddProcess(new G4eBremsstrahlung52, -1,-1,3); - pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); - - } else if( particleName == "mu+" || - particleName == "mu-" ) { - //muon - pmanager->AddProcess(new G4MultipleScattering52,-1, 1,1); - pmanager->AddProcess(new G4MuIonisation52, -1, 2,2); - pmanager->AddProcess(new G4MuBremsstrahlung52, -1,-1,3); - pmanager->AddProcess(new G4MuPairProduction52, -1,-1,4); - - } else if( particleName == "GenericIon" ) { - - pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); - pmanager->AddProcess(new G4hIonisation52, -1,2,2); - - } else if ((!particle->IsShortLived()) && - (particle->GetPDGCharge() != 0.0) && - (particle->GetParticleName() != "chargedgeantino")) { - //all others charged particles except geantino - pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); - pmanager->AddProcess(new G4hIonisation52, -1,2,2); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/extended/electromagnetic/TestEm2/src/PhysListParticles.cc b/examples/extended/electromagnetic/TestEm2/src/PhysListParticles.cc deleted file mode 100644 index d9454ff635..0000000000 --- a/examples/extended/electromagnetic/TestEm2/src/PhysListParticles.cc +++ /dev/null @@ -1,141 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -// -// $Id: PhysListParticles.cc,v 1.1 2003/10/08 17:28:47 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "PhysListParticles.hh" - -// Bosons -#include "G4ChargedGeantino.hh" -#include "G4Geantino.hh" -#include "G4Gamma.hh" -#include "G4OpticalPhoton.hh" - -// leptons -#include "G4MuonPlus.hh" -#include "G4MuonMinus.hh" -#include "G4NeutrinoMu.hh" -#include "G4AntiNeutrinoMu.hh" - -#include "G4Electron.hh" -#include "G4Positron.hh" -#include "G4NeutrinoE.hh" -#include "G4AntiNeutrinoE.hh" - -// Mesons -#include "G4PionPlus.hh" -#include "G4PionMinus.hh" -#include "G4PionZero.hh" -#include "G4Eta.hh" -#include "G4EtaPrime.hh" - -#include "G4KaonPlus.hh" -#include "G4KaonMinus.hh" -#include "G4KaonZero.hh" -#include "G4AntiKaonZero.hh" -#include "G4KaonZeroLong.hh" -#include "G4KaonZeroShort.hh" - -// Baryons -#include "G4Proton.hh" -#include "G4AntiProton.hh" -#include "G4Neutron.hh" -#include "G4AntiNeutron.hh" - -// Nuclei -#include "G4Alpha.hh" -#include "G4Deuteron.hh" -#include "G4Triton.hh" -#include "G4He3.hh" -#include "G4GenericIon.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListParticles::PhysListParticles(const G4String& name) - : G4VPhysicsConstructor(name) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListParticles::~PhysListParticles() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListParticles::ConstructParticle() -{ - -// pseudo-particles - G4Geantino::GeantinoDefinition(); - G4ChargedGeantino::ChargedGeantinoDefinition(); - -// gamma - G4Gamma::GammaDefinition(); - -// optical photon - G4OpticalPhoton::OpticalPhotonDefinition(); - -// leptons - G4Electron::ElectronDefinition(); - G4Positron::PositronDefinition(); - G4MuonPlus::MuonPlusDefinition(); - G4MuonMinus::MuonMinusDefinition(); - - G4NeutrinoE::NeutrinoEDefinition(); - G4AntiNeutrinoE::AntiNeutrinoEDefinition(); - G4NeutrinoMu::NeutrinoMuDefinition(); - G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); - -// mesons - G4PionPlus::PionPlusDefinition(); - G4PionMinus::PionMinusDefinition(); - G4PionZero::PionZeroDefinition(); - G4Eta::EtaDefinition(); - G4EtaPrime::EtaPrimeDefinition(); - G4KaonPlus::KaonPlusDefinition(); - G4KaonMinus::KaonMinusDefinition(); - G4KaonZero::KaonZeroDefinition(); - G4AntiKaonZero::AntiKaonZeroDefinition(); - G4KaonZeroLong::KaonZeroLongDefinition(); - G4KaonZeroShort::KaonZeroShortDefinition(); - -// barions - G4Proton::ProtonDefinition(); - G4AntiProton::AntiProtonDefinition(); - G4Neutron::NeutronDefinition(); - G4AntiNeutron::AntiNeutronDefinition(); - -// ions - G4Deuteron::DeuteronDefinition(); - G4Triton::TritonDefinition(); - G4He3::He3Definition(); - G4Alpha::AlphaDefinition(); - G4GenericIon::GenericIonDefinition(); -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/extended/electromagnetic/TestEm2/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm2/src/PhysicsList.cc index 00f58e7b18..2817bb8655 100644 --- a/examples/extended/electromagnetic/TestEm2/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm2/src/PhysicsList.cc @@ -20,131 +20,144 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysicsList.cc,v 1.1 2003/10/08 17:28:47 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.cc,v 1.2 2004/05/04 07:36:41 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // +//--------------------------------------------------------------------------- +// +// ClassName: PhysicsList +// +// Author: V.Ivanchenko 03.05.2004 +// +// Modified: +// +//---------------------------------------------------------------------------- +// + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "PhysicsList.hh" #include "PhysicsListMessenger.hh" - -#include "PhysListParticles.hh" -#include "PhysListGeneral.hh" -#include "PhysListEmStandard.hh" -#include "PhysListEmG4v52.hh" -#include "G4LossTableManager.hh" +#include "ParticlesBuilder.hh" +#include "G4EmQEDBuilder.hh" +#include "G4EmMuonBuilder.hh" +#include "G4EmHadronBuilder.hh" +#include "G4EmHighEnergyBuilder.hh" +#include "G4EmQEDBuilder52.hh" +#include "G4EmMuonBuilder52.hh" +#include "G4EmHadronBuilder52.hh" +#include "DecaysBuilder.hh" + #include "G4UnitsTable.hh" +#include "G4LossTableManager.hh" +#include "G4EmProcessOptions.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysicsList::PhysicsList() : G4VModularPhysicsList() +PhysicsList::PhysicsList() : G4VModularPhysicsList(), + verbose(0), + emBuilderIsRegisted(false) { G4LossTableManager::Instance(); - currentDefaultCut = 1.0*mm; - cutForGamma = currentDefaultCut; - cutForElectron = currentDefaultCut; - cutForPositron = currentDefaultCut; + defaultCutValue = 1.*mm; + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForPositron = defaultCutValue; pMessenger = new PhysicsListMessenger(this); - SetVerboseLevel(1); - - // Particles - particleList = new PhysListParticles("particles"); - - // General Physics - generalPhysicsList = new PhysListGeneral("general"); - - // EM physics - emName = G4String("standard"); - emPhysicsList = new PhysListEmStandard(emName); - + // Add Physics builders + RegisterPhysics(new ParticlesBuilder()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysicsList::~PhysicsList() -{ - delete pMessenger; -} +{} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructParticle() { - particleList->ConstructParticle(); + if(!emBuilderIsRegisted) AddPhysicsList("standard"); + G4VModularPhysicsList::ConstructParticle(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::ConstructProcess() { - AddTransportation(); - generalPhysicsList->ConstructProcess(); - emPhysicsList->ConstructProcess(); + G4VModularPhysicsList::ConstructProcess(); + + // Define energy interval for loss processes + G4EmProcessOptions emOptions; + emOptions.SetMinEnergy(0.1*keV); + emOptions.SetMaxEnergy(100.*GeV); + emOptions.SetDEDXBinning(90); + emOptions.SetLambdaBinning(90); + emOptions.SetBuildPreciseRange(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::AddPhysicsList(const G4String& name) { - if (verboseLevel>1) { - G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" << G4endl; - } - - if (name == emName) return; + G4bool yes = false; - if (name == "standard") { + if ("standard" == name && !emBuilderIsRegisted) { + RegisterPhysics(new G4EmQEDBuilder()); + RegisterPhysics(new G4EmMuonBuilder()); + RegisterPhysics(new G4EmHadronBuilder()); + RegisterPhysics(new DecaysBuilder()); + emBuilderIsRegisted = true; + yes = true; - emName = name; - delete emPhysicsList; - emPhysicsList = new PhysListEmStandard(name); + } else if ("g4v52" == name && !emBuilderIsRegisted) { + RegisterPhysics(new G4EmQEDBuilder52()); + RegisterPhysics(new G4EmMuonBuilder52()); + RegisterPhysics(new G4EmHadronBuilder52()); + RegisterPhysics(new DecaysBuilder()); + emBuilderIsRegisted = true; + yes = true; - } else if (name == "g4v52") { - - emName = name; - delete emPhysicsList; - emPhysicsList = new PhysListEmG4v52(name); + } else if ("high_energy" == name ) { + RegisterPhysics(new G4EmHighEnergyBuilder()); } else { - - G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" - << " is not defined" - << G4endl; + G4cout << "PhysicsList::AddPhysicsList <" << name << ">" + << " fail - name is unknown " << G4endl; + } + if (verbose>0 && yes) { + G4cout << "PhysicsList::AddPhysicsList <" << name << ">" << G4endl; } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::SetCuts() -{ - if (verboseLevel >0){ - G4cout << "PhysicsList::SetCuts:"; - G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; - } +{ - // set cut values for gamma at first and for e- second and next for e+, - // because some processes for e+/e- need cut values for gamma SetCutValue(cutForGamma, "gamma"); SetCutValue(cutForElectron, "e-"); SetCutValue(cutForPositron, "e+"); - if (verboseLevel>0) DumpCutValuesTable(); + if (verbose>0) DumpCutValuesTable(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "G4Gamma.hh" -#include "G4Electron.hh" -#include "G4Positron.hh" +void PhysicsList::SetVerbose(G4int val) +{ + verbose = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::SetCutForGamma(G4double cut) { cutForGamma = cut; - SetParticleCuts(cutForGamma, G4Gamma::Gamma()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -152,7 +165,6 @@ void PhysicsList::SetCutForGamma(G4double cut) void PhysicsList::SetCutForElectron(G4double cut) { cutForElectron = cut; - SetParticleCuts(cutForElectron, G4Electron::Electron()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -160,8 +172,6 @@ void PhysicsList::SetCutForElectron(G4double cut) void PhysicsList::SetCutForPositron(G4double cut) { cutForPositron = cut; - SetParticleCuts(cutForPositron, G4Positron::Positron()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/extended/electromagnetic/TestEm2/src/RunAction.cc b/examples/extended/electromagnetic/TestEm2/src/RunAction.cc index 289246b856..80c66e656a 100644 --- a/examples/extended/electromagnetic/TestEm2/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm2/src/RunAction.cc @@ -20,14 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: RunAction.cc,v 1.1 2003/10/08 17:28:47 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.cc,v 1.9 2004/06/18 15:43:41 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -// 08.03.01 Hisaya: Adapted MyVector for STL - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -35,129 +30,136 @@ #include "DetectorConstruction.hh" #include "PrimaryGeneratorAction.hh" +#include "RunActionMessenger.hh" +#include "EmAcceptance.hh" #include "G4Run.hh" #include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" #include "G4UnitsTable.hh" #include -#include #include "Randomize.hh" -#ifdef G4ANALYSIS_USE - #include "AIDA/AIDA.h" +#ifdef USE_AIDA +#include "AIDA/AIDA.h" #endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -RunAction::RunAction(DetectorConstruction* det, - PrimaryGeneratorAction* kin) -:Det(det),Kin(kin) -{ +RunAction::RunAction(DetectorConstruction* det, PrimaryGeneratorAction* kin) +:Det(det),Kin(kin) +{ + runMessenger = new RunActionMessenger(this); + nLbin = Det->GetnLtot(); dEdL.resize(nLbin, 0.0); sumELongit.resize(nLbin, 0.0); - sumELongitCumul.resize(nLbin, 0.0); - sumE2Longit.resize(nLbin, 0.0); + sumELongitCumul.resize(nLbin, 0.0); + sumE2Longit.resize(nLbin, 0.0); sumE2LongitCumul.resize(nLbin, 0.0); - + gammaFlux.resize(nLbin, 0.0); electronFlux.resize(nLbin, 0.0); positronFlux.resize(nLbin, 0.0); - + nRbin = Det->GetnRtot(); dEdR.resize(nRbin, 0.0); sumERadial.resize(nRbin, 0.0); sumERadialCumul.resize(nRbin, 0.0); sumE2Radial.resize(nRbin, 0.0); sumE2RadialCumul.resize(nRbin, 0.0); + + edeptrue = 1.; + rmstrue = 1.; + limittrue = DBL_MAX; + + histoName = "testem2.paw"; + histoType = "hbook"; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... RunAction::~RunAction() { - cleanHisto(); + cleanHisto(); + delete runMessenger; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::bookHisto() { -#ifdef G4ANALYSIS_USE - // Creating the analysis factory - AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); - - // Creating the tree factory - AIDA::ITreeFactory* tf = af->createTreeFactory(); - - // Creating a tree mapped to an hbook file. - G4bool readOnly = false; - G4bool createNew = true; - tree = tf->create("testem2.paw", "hbook", readOnly, createNew); +#ifdef USE_AIDA + // Creating the analysis factory + AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); - // Creating a histogram factory, whose histograms will be handled by the tree - AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); + // Creating the tree factory + AIDA::ITreeFactory* tf = af->createTreeFactory(); + + // Creating a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create(histoName, histoType, readOnly, createNew); + + // Creating a histogram factory, whose histograms will be handled by the tree + AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); G4double Ekin = Kin->GetParticleGun()->GetParticleEnergy(); G4double dLradl = Det->GetdLradl(); G4double dRradl = Det->GetdRradl(); - + histo[0] = hf->createHistogram1D( "1","total energy deposit(percent of Einc)", 100,0.,100.); - + histo[1] = hf->createHistogram1D( "2","total charged tracklength (radl)", 100,0.,100.*Ekin/GeV); - + histo[2] = hf->createHistogram1D( "3","total neutral tracklength (radl)", 100,0.,1000.*Ekin/GeV); - + histo[3] = hf->createHistogram1D( "4","longit energy profile (% of E inc)", nLbin,0.,nLbin*dLradl); - + G4double Zmin=0.5*dLradl, Zmax=Zmin+nLbin*dLradl; histo[4] = hf->createHistogram1D( "5","cumul longit energy dep (% of E inc)", nLbin,Zmin,Zmax); - + histo[5] = hf->createHistogram1D( "6","rms on cumul longit Edep (% of E inc)", nLbin,Zmin,Zmax); - + histo[6] = hf->createHistogram1D( "7","nb of gamma per plane", nLbin,Zmin,Zmax); - + histo[7] = hf->createHistogram1D( "8","nb of positron per plane", nLbin,Zmin,Zmax); - + histo[8] = hf->createHistogram1D( "9","nb of electron per plane", nLbin,Zmin,Zmax); - + histo[9] = hf->createHistogram1D("10","radial energy profile (% of E inc)", nRbin,0.,nRbin*dRradl); - + G4double Rmin=0.5*dRradl, Rmax=Rmin+nRbin*dRradl; histo[10]= hf->createHistogram1D("11","cumul radial energy dep (% of E inc)", nRbin,Rmin,Rmax); - + histo[11]= hf->createHistogram1D("12","rms on cumul radial Edep (% of E inc)", nRbin,Rmin,Rmax); - + delete hf; delete tf; - delete af; + delete af; #endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::cleanHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA tree->commit(); // Writing the histograms to the file tree->close(); // and closing the tree (and the file) - delete tree; -#endif +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -165,15 +167,15 @@ void RunAction::cleanHisto() void RunAction::BeginOfRunAction(const G4Run* aRun) { G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; - + // save Rndm status G4RunManager::GetRunManager()->SetRandomNumberStore(true); HepRandom::showEngineStatus(); - //reshape arrays if needed + //reshape arrays if needed // G4bool rebin(false); - + G4int nLtot = Det->GetnLtot(); if(nLbin != nLtot) {dEdL.resize(nLbin=nLtot, 0.0); @@ -186,7 +188,7 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) positronFlux.resize(nLbin, 0.0); rebin=true; } - + G4int nRtot = Det->GetnRtot(); if(nRbin != nRtot) {dEdR.resize(nRbin=nRtot, 0.0); @@ -196,15 +198,15 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) sumE2RadialCumul.resize(nRbin, 0.0); rebin=true; } - + //initialize arrays of cumulative energy deposition - // + // for (G4int i=0; iGetRunID() == 0) bookHisto(); else if (rebin) {cleanHisto(); bookHisto();} - - //drawing - // - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -225,8 +222,8 @@ void RunAction::fillPerEvent() { //accumulate statistic // - G4double dLCumul = 0.; - for (G4int i=0; iGetParticleGun()->GetParticleEnergy(); G4double mass=Kin->GetParticleGun()->GetParticleDefinition()->GetPDGMass(); G4double radl=Det->GetMaterial()->GetRadlen(); - + histo[0]->fill(100.*dLCumul/(Ekin+mass)); histo[1]->fill(ChargTrLength/radl); histo[2]->fill(NeutrTrLength/radl); -#endif +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::EndOfRunAction(const G4Run* aRun) { - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); - //compute and print statistic - // + // G4int NbOfEvents = aRun->GetNumberOfEvent(); - G4double kinEnergy = Kin->GetParticleGun()->GetParticleEnergy(); + G4double kinEnergy = Kin->GetParticleGun()->GetParticleEnergy(); assert(NbOfEvents*kinEnergy > 0); - + G4double mass=Kin->GetParticleGun()->GetParticleDefinition()->GetPDGMass(); G4double norme = 100./(NbOfEvents*(kinEnergy+mass)); - + //longitudinal // - G4double dLradl = Det->GetdLradl(); - + G4double dLradl = Det->GetdLradl(); + MyVector MeanELongit(nLbin), rmsELongit(nLbin); MyVector MeanELongitCumul(nLbin), rmsELongitCumul(nLbin); - - G4int i; + + G4int i; for (i=0; ifill(bin,MeanELongit[i]/dLradl); bin = (i+1)*dLradl; histo[4]->fill(bin,MeanELongitCumul[i]); histo[5]->fill(bin, rmsELongitCumul[i]); - + histo[6]->fill(bin, gammaFlux[i]); histo[7]->fill(bin, positronFlux[i]); histo[8]->fill(bin, electronFlux[i]); -#endif +#endif } - + //radial - // - G4double dRradl = Det->GetdRradl(); - + // + G4double dRradl = Det->GetdRradl(); + MyVector MeanERadial(nRbin), rmsERadial(nRbin); MyVector MeanERadialCumul(nRbin), rmsERadialCumul(nRbin); - + for (i=0; ifill(bin,MeanERadial[i]/dRradl); bin = (i+1)*dRradl; histo[10]->fill(bin,MeanERadialCumul[i]); histo[11]->fill(bin, rmsERadialCumul[i]); -#endif +#endif } //track length @@ -346,76 +340,96 @@ void RunAction::EndOfRunAction(const G4Run* aRun) G4double MeanChargTrLength = norme*sumChargTrLength; G4double rmsChargTrLength = norme*sqrt(abs(NbOfEvents*sum2ChargTrLength - sumChargTrLength*sumChargTrLength)); - + G4double MeanNeutrTrLength = norme*sumNeutrTrLength; G4double rmsNeutrTrLength = norme*sqrt(abs(NbOfEvents*sum2NeutrTrLength - sumNeutrTrLength*sumNeutrTrLength)); - + //print - // + // std::ios::fmtflags mode = G4cout.flags(); G4cout.setf(std::ios::fixed,std::ios::floatfield); G4int prec = G4cout.precision(2); - + G4cout << " LATERAL PROFILE " - << " CUMULATIVE LATERAL PROFILE" << G4endl << G4endl; - - G4cout << " bin " << " Mean rms " + << " CUMULATIVE LATERAL PROFILE" << G4endl << G4endl; + + G4cout << " bin " << " Mean rms " << " bin " << " Mean rms \n" << G4endl; - + for (i=0; i" - << std::setw(5) << sup << " radl: " - << std::setw(7) << MeanELongit[i] << "% " + + G4cout << std::setw(8) << inf << "->" + << std::setw(5) << sup << " radl: " + << std::setw(7) << MeanELongit[i] << "% " << std::setw(9) << rmsELongit[i] << "% " - << " 0->" << std::setw(5) << sup << " radl: " - << std::setw(7) << MeanELongitCumul[i] << "% " - << std::setw(7) << rmsELongitCumul[i] << "% " + << " 0->" << std::setw(5) << sup << " radl: " + << std::setw(7) << MeanELongitCumul[i] << "% " + << std::setw(7) << rmsELongitCumul[i] << "% " <" - << std::setw(5) << sup << " radl: " - << std::setw(7) << MeanERadial[i] << "% " + + G4cout << std::setw(8) << inf << "->" + << std::setw(5) << sup << " radl: " + << std::setw(7) << MeanERadial[i] << "% " << std::setw(9) << rmsERadial[i] << "% " - << " 0->" << std::setw(5) << sup << " radl: " - << std::setw(7) << MeanERadialCumul[i] << "% " - << std::setw(7) << rmsERadialCumul[i] << "% " + << " 0->" << std::setw(5) << sup << " radl: " + << std::setw(7) << MeanERadialCumul[i] << "% " + << std::setw(7) << rmsERadialCumul[i] << "% " <SetGuidance("set Edep and RMS"); + accCmd->SetGuidance("acceptance values for first layer"); + accCmd->SetParameterName("edep","rms","limit",true); + accCmd->SetRange("edep>0 && edep<1 && rms>0"); + accCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + factoryCmd = new G4UIcmdWithAString("/testem/histo/fileName",this); + factoryCmd->SetGuidance("set name for the histograms file"); + + fileCmd = new G4UIcmdWithAString("/testem/histo/fileType",this); + fileCmd->SetGuidance("set type (hbook, root, XML) for the histograms file"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +RunActionMessenger::~RunActionMessenger() +{ + delete accCmd; + delete factoryCmd; + delete fileCmd; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunActionMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if (command == accCmd ) + { Run->SetEdepAndRMS(accCmd->GetNew3VectorValue(newValue));} + + if (command == factoryCmd) + { Run->SetHistoName(newValue);} + + if (command == fileCmd) + { Run->SetHistoType(newValue);} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/GNUmakefile b/examples/extended/electromagnetic/TestEm3/GNUmakefile index 6d35d455fb..3eeac27d54 100644 --- a/examples/extended/electromagnetic/TestEm3/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm3/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.12 2004/01/21 17:29:21 maire Exp $ +# $Id: GNUmakefile,v 1.16 2004/06/21 10:52:54 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,15 +14,20 @@ endif .PHONY: all all: lib bin -###G4ANALYSIS_USE := true +#### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE + USE_AIDA := true CPPFLAGS += -DG4ANALYSIS_USE endif +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA +endif + include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` diff --git a/examples/extended/electromagnetic/TestEm3/History b/examples/extended/electromagnetic/TestEm3/History index d10b7257a5..75dd2b81f2 100644 --- a/examples/extended/electromagnetic/TestEm3/History +++ b/examples/extended/electromagnetic/TestEm3/History @@ -1,4 +1,4 @@ -$Id: History,v 1.43 2004/01/21 17:29:22 maire Exp $ +$Id: History,v 1.57 2004/06/21 10:52:54 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -13,7 +13,39 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * - ---------------------------------------------------------- + --------------------------------------------------------- + +21-06-04 mma (testem3-V06-01-04) +- remove direct interface to ROOT + +15-06-04 mma (testem3-V06-01-03) +- introduction of the class HistoManager (like TestEm5) +- EndOfRun: missprint in rms of totalTrackLength + +09-06-04 mma (testem3-V06-01-02) +- move acceptance check in RunAction +- printout : remove leakage information + +25-05-04 V.Ivanchenko +- Update printout +- Fix problem of dE/dx printout +- Add acceptance check activated by UI command + +28-04-04 mma (testem3-V06-01-01) +- print resolution at EndOfRun +- suppress PhysListParticles and General + +31-03-04 mma (testem3-V06-01-00) +- README : more informations about ROOT installation + +17-03-04 mma (testem3-V06-00-02) +- energy leakage only from secondaries. +- idem in geant3 +- suppression of DataVector in EventAction +- new macro dedx.max to quickly check dE/dx calculation + +15-03-04 mma (testem3-V06-00-01) +- example of histograms with ROOT: USE_ROOT 21-01-04 mma - possibility to have one histograms file per run. diff --git a/examples/extended/electromagnetic/TestEm3/README b/examples/extended/electromagnetic/TestEm3/README index d000856706..e3c48f3842 100644 --- a/examples/extended/electromagnetic/TestEm3/README +++ b/examples/extended/electromagnetic/TestEm3/README @@ -1,4 +1,4 @@ -$Id: README,v 1.12 2004/01/21 17:29:22 maire Exp $ +$Id: README,v 1.18 2004/06/23 11:30:39 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -115,28 +115,51 @@ $Id: README,v 1.12 2004/01/21 17:29:22 maire Exp $ ...etc........... One can control the binning of the histo with the command: - /testem/run/setHisto idAbsor nbin Emin Emax unit + /testem/histo/setHisto idAbsor nbin Emin Emax unit ...etc........... where unit is the desired energy unit for that histo (see TestEm3.in). One can control the name of the histograms file with the command: - /testem/run/setFileName name (default testem3.paw) + /testem/histo/setFileName name (default testem3.paw) Note that, by default, histograms are disabled. To activate them, uncomment the flag G4ANALYSIS_USE in GNUmakefile. - 8- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + 8- Using histograms + ------------------- - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). + +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm3/TestEm3.cc b/examples/extended/electromagnetic/TestEm3/TestEm3.cc index 51e2ccabec..3ee95a603b 100644 --- a/examples/extended/electromagnetic/TestEm3/TestEm3.cc +++ b/examples/extended/electromagnetic/TestEm3/TestEm3.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: TestEm3.cc,v 1.10 2003/11/28 12:30:00 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: TestEm3.cc,v 1.12 2004/06/15 11:39:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -33,10 +33,6 @@ #include "G4UItcsh.hh" #include "Randomize.hh" -#ifdef G4VIS_USE -#include "VisManager.hh" -#endif - #include "DetectorConstruction.hh" #include "PhysicsList.hh" #include "PrimaryGeneratorAction.hh" @@ -44,6 +40,11 @@ #include "EventAction.hh" #include "SteppingAction.hh" #include "SteppingVerbose.hh" +#include "HistoManager.hh" + +#ifdef G4VIS_USE +#include "VisManager.hh" +#endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -63,17 +64,23 @@ int main(int argc,char** argv) { runManager->SetUserInitialization(detector); runManager->SetUserInitialization(new PhysicsList); // - runManager->SetUserAction(new PrimaryGeneratorAction(detector)); + PrimaryGeneratorAction* primary = new PrimaryGeneratorAction(detector); + runManager->SetUserAction(primary); #ifdef G4VIS_USE // visualization manager G4VisManager* visManager = new VisManager; visManager->Initialize(); #endif + + HistoManager* histo = 0; +#ifdef G4ANALYSIS_USE + histo = new HistoManager(); +#endif // set user action classes - RunAction* runAct = new RunAction(detector); - EventAction* evtAct = new EventAction(detector,runAct); + RunAction* runAct = new RunAction(detector,primary,histo); + EventAction* evtAct = new EventAction(detector,runAct,histo); SteppingAction* stpAct = new SteppingAction(detector,evtAct); runManager->SetUserAction(runAct); @@ -103,9 +110,13 @@ int main(int argc,char** argv) { } // job termination +#ifdef G4ANALYSIS_USE + delete histo; +#endif #ifdef G4VIS_USE delete visManager; #endif + delete runManager; return 0; diff --git a/examples/extended/electromagnetic/TestEm3/TestEm3.in b/examples/extended/electromagnetic/TestEm3/TestEm3.in index e28227cc88..5aa4382105 100644 --- a/examples/extended/electromagnetic/TestEm3/TestEm3.in +++ b/examples/extended/electromagnetic/TestEm3/TestEm3.in @@ -1,15 +1,14 @@ -# $Id: TestEm3.in,v 1.9 2003/11/27 18:20:16 vnivanch Exp $ +# $Id: TestEm3.in,v 1.16 2004/06/16 10:35:40 maire Exp $ # -# Macro file for "exampleN03.cc" +# Macro file for "exampleN03.cc" # (can be run in batch, without graphic) # # Lead-liquidArgon 50 layers; electron 1 GeV # /control/verbose 2 /run/verbose 2 -/tracking/verbose 0 # -##/testem/phys/addPhysics g4v52 +#### /testem/phys/addPhysics g4v52 /testem/phys/addPhysics standard # /run/initialize @@ -17,8 +16,9 @@ /gun/particle e- /gun/energy 1 GeV # -/testem/run/setHisto 0 100 700. 1000. MeV -/testem/run/setHisto 1 100 0. 300. MeV +###/testem/histo/setFileName testem3.paw +###/testem/histo/setHisto 0 100 700. 1000. MeV +###/testem/histo/setHisto 1 100 0. 300. MeV # /testem/event/printModulo 50 # diff --git a/examples/extended/electromagnetic/TestEm3/TestEm3.out b/examples/extended/electromagnetic/TestEm3/TestEm3.out index 5eeb6497d2..1a4a0889c5 100644 --- a/examples/extended/electromagnetic/TestEm3/TestEm3.out +++ b/examples/extended/electromagnetic/TestEm3/TestEm3.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -23,9 +23,8 @@ Current available graphics systems are: VRML1FILE (VRML1FILE) VRML2FILE (VRML2FILE) /run/verbose 2 -/tracking/verbose 0 # -##/testem/phys/addPhysics g4v52 +#### /testem/phys/addPhysics g4v52 /testem/phys/addPhysics standard # /run/initialize @@ -58,8 +57,9 @@ PhysicsList::SetCuts:CutLength : 1 mm /gun/particle e- /gun/energy 1 GeV # -/testem/run/setHisto 0 100 700. 1000. MeV -/testem/run/setHisto 1 100 0. 300. MeV +###/testem/histo/setFileName testem3.paw +###/testem/histo/setHisto 0 100 700. 1000. MeV +###/testem/histo/setHisto 1 100 0. 300. MeV # /testem/event/printModulo 50 # @@ -112,8 +112,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -122,7 +122,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -140,7 +140,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -208,19 +208,19 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100 - User=37.72s Real=48.71s Sys=6.2s + User=42.97s Real=52.04s Sys=6.01s -------------------------------------------------------------- - total energy dep total tracklen mean energy leaving per layer +------------------------------------------------------------ +material Total Edep sqrt(E0(GeV))*rmsE/Emean total tracklen - Absorber0 ( Lead) : 815.52 MeV +- 17.55 MeV 56.69 cm +- 1.37 cm 267.36 MeV +- 45.80 MeV - Absorber1 ( liquidArgon) : 174.13 MeV +- 15.78 MeV 86.03 cm +- 8.19 cm 263.78 MeV +- 45.88 MeV + Lead: 810.29 MeV +- 15.56 MeV 1.92 +- 0.192 % 56.1 cm +- 1.22 cm +liquidArgon: 179.93 MeV +- 14.46 MeV 8.035 +- 0.8035 % 88.8 cm +- 7.75 cm -------------------------------------------------------------- +------------------------------------------------------------ --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1809837985, 1683402677 + Current couple of seeds = 405591755, 816799671 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm3/dedx.mac b/examples/extended/electromagnetic/TestEm3/dedx.mac new file mode 100644 index 0000000000..b7e0bd9a01 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/dedx.mac @@ -0,0 +1,31 @@ +# $Id: dedx.mac,v 1.1 2004/03/17 12:32:57 maire Exp $ +# +# Macro file for "TestEm3.cc" +# (can be run in batch, without graphic) +# +# To control dE/dx calculation: +# 1 layer; minimum ionizing particle +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setNbOfLayers 1 +/testem/det/setNbOfAbsor 1 +/testem/det/setAbsor 0 Water 1 cm +/testem/det/setSizeYZ 1 cm +# +/testem/phys/addPhysics standard +/testem/phys/setCuts 1 km +# +/run/initialize +# +/process/inactivate msc +/process/eLoss/fluct false +# +/testem/gun/setDefault +/gun/particle mu+ +/gun/energy 300 MeV +# +/tracking/verbose 1 +# +/run/beamOn 2 diff --git a/examples/extended/electromagnetic/TestEm3/geant3/dedx.dat b/examples/extended/electromagnetic/TestEm3/geant3/dedx.dat new file mode 100644 index 0000000000..9795dcda72 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/geant3/dedx.dat @@ -0,0 +1,20 @@ +FILE dedx.paw +LIST +C +C 1 layer; minimum ionizing particle +C +CALOR 1 (nbAbs) 1 (nbLay) 1. (calorYZ) 0. (field) +MATE 4 (water) +THICK 1. (cm) +LOSS 4 +MULS 0 +HADR 0 +ABAN 0 +CUTS 10.0e-6 (cutgam) 10.0e-6 (cutele) 3*10.e-3 (cutneu/had/muo) + 2*10.0e+3 (bcute/m) 2*10.0e+3 (dcute/m) +C +KINE 5 (Itype) 0.3 (Ekine) 1000. (x0) 0. (y0) 0. (z0) 1. (ux) 0. (uy) 0. (uz) +SWIT 0 (draw) +DEBUG 1 5 1000 +TRIG 2 +END diff --git a/examples/extended/electromagnetic/TestEm3/geant3/include/celoss.inc b/examples/extended/electromagnetic/TestEm3/geant3/include/celoss.inc index 43d3dbcb68..27f1f3192a 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/include/celoss.inc +++ b/examples/extended/electromagnetic/TestEm3/geant3/include/celoss.inc @@ -1,4 +1,4 @@ - COMMON/CELOSS/ EdepAbs(MaxAbs),TrckAbs(MaxAbs), - & sumEdep(MaxAbs),sumTrck(MaxAbs), - & su2Edep(MaxAbs),su2Trck(MaxAbs) + COMMON/CELOSS/ EdepAbs(MaxAbs),TrckAbs(MaxAbs),EleaAbs(MaxAbs), + & sumEdep(MaxAbs),sumTrck(MaxAbs),sumElea(MaxAbs), + & su2Edep(MaxAbs),su2Trck(MaxAbs),su2Elea(MaxAbs) diff --git a/examples/extended/electromagnetic/TestEm3/geant3/src/guout.F b/examples/extended/electromagnetic/TestEm3/geant3/src/guout.F index 0d10494b8b..6e7eb34435 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/src/guout.F +++ b/examples/extended/electromagnetic/TestEm3/geant3/src/guout.F @@ -16,13 +16,15 @@ if (histo(k)) call hfill (k,EdepAbs(k)/histUnit(k),0.,1.) enddo * -* cumul energy deposited and charged track length +* cumul energy deposited, charged track length and energy leakage do k=1,NbAbsor sumEdep(k) = sumEdep(k) + EdepAbs(k) sumTrck(k) = sumTrck(k) + TrckAbs(k) + sumElea(k) = sumElea(k) + EleaAbs(k)/NbLayer * su2Edep(k) = su2Edep(k) + EdepAbs(k)**2 su2Trck(k) = su2Trck(k) + TrckAbs(k)**2 + su2Elea(k) = su2Elea(k) + (EleaAbs(k)/NbLayer)**2 enddo * * *** print diff --git a/examples/extended/electromagnetic/TestEm3/geant3/src/gustep.F b/examples/extended/electromagnetic/TestEm3/geant3/src/gustep.F index 9834a01c1d..9246bca093 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/src/gustep.F +++ b/examples/extended/electromagnetic/TestEm3/geant3/src/gustep.F @@ -6,6 +6,7 @@ #include "geant321/gcflag.inc" #include "geant321/gckine.inc" #include "geant321/gcking.inc" +#include "geant321/gconst.inc" #include "geant321/gctrak.inc" #include "geant321/gctmed.inc" #include "calor.inc" @@ -25,5 +26,12 @@ if (DESTEP.NE.0.) EdepAbs(NUMED) = EdepAbs(NUMED) + DESTEP if (CHARGE*STEP.NE.0.) TrckAbs(NUMED) = TrckAbs(NUMED) + STEP ENDIF +* +* *** Energy leakage from secondaries + IF ((NUMED.LE.NbAbsor).and.(INWVOL.EQ.2).and.(ISTAK.GT.0)) THEN + Eleav = gekin + if (ipart.eq.2) Eleav = gekin + 2*emass + EleaAbs(NUMED) = EleaAbs(NUMED) + Eleav + ENDIF * END diff --git a/examples/extended/electromagnetic/TestEm3/geant3/src/gutrev.F b/examples/extended/electromagnetic/TestEm3/geant3/src/gutrev.F index fe1af57197..80bac7a840 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/src/gutrev.F +++ b/examples/extended/electromagnetic/TestEm3/geant3/src/gutrev.F @@ -10,6 +10,7 @@ do k=1,NbAbsor EdepAbs(k) = 0. TrckAbs(k) = 0. + EleaAbs(k) = 0. enddo * CALL GTREVE diff --git a/examples/extended/electromagnetic/TestEm3/geant3/src/uginit.F b/examples/extended/electromagnetic/TestEm3/geant3/src/uginit.F index 4427886ce4..9818dc2104 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/src/uginit.F +++ b/examples/extended/electromagnetic/TestEm3/geant3/src/uginit.F @@ -70,8 +70,10 @@ do k=1,MaxAbs sumEdep(k) = 0. sumTrck(k) = 0. + sumElea(k) = 0. su2Edep(k) = 0. su2Trck(k) = 0. + su2Elea(k) = 0. enddo * END diff --git a/examples/extended/electromagnetic/TestEm3/geant3/src/uglast.F b/examples/extended/electromagnetic/TestEm3/geant3/src/uglast.F index 2d2d153177..f6a9036655 100644 --- a/examples/extended/electromagnetic/TestEm3/geant3/src/uglast.F +++ b/examples/extended/electromagnetic/TestEm3/geant3/src/uglast.F @@ -3,14 +3,14 @@ * * Termination routine to print histograms and statistics * -#include "geant321/gcflag.inc" +#include "geant321/gcflag.inc" #include "geant321/gctrak.inc" #include "calor.inc" #include "celoss.inc" #include "histo.inc" * CHARACTER*20 matnam - CHARACTER*4 unitm,unitr + CHARACTER*4 unitdm,unitdr,unitlm,unitlr * * *** mean energy deposit and track length PRINT 749 @@ -23,10 +23,15 @@ rmsEdep = fnorm*sqrt(abs(IEVENT*su2Edep(k)-sumEdep(k)**2)) aveTrck = fnorm*sumTrck(k) rmsTrck = fnorm*sqrt(abs(IEVENT*su2Trck(k)-sumTrck(k)**2)) + aveElea = fnorm*sumElea(k) + rmsElea = fnorm*sqrt(abs(IEVENT*su2Elea(k)-sumElea(k)**2)) * - CALL GEVKEV (aveEdep,Emean,unitm) - CALL GEVKEV (rmsEdep,Erms ,unitr) - PRINT 752,k-1,matnam,Emean,unitm,Erms,unitr,aveTrck,rmsTrck + CALL GEVKEV (aveEdep,Edmean,unitdm) + CALL GEVKEV (rmsEdep,Edrms ,unitdr) + CALL GEVKEV (aveElea,Elmean,unitlm) + CALL GEVKEV (rmsElea,Elrms ,unitlr) + PRINT 752,k-1,matnam,Edmean,unitdm,Edrms,unitdr,aveTrck,rmsTrck + + ,Elmean,unitlm,Elrms,unitlr enddo PRINT 749 * @@ -44,7 +49,9 @@ * *** formats 749 FORMAT(/ ,60(1H-),/) 750 FORMAT(1X,'Nb of events:',I6) - 751 FORMAT(1X,'AbsNo Material',5X,'Energy deposit',14X,'Trck length') - 752 FORMAT(I5,3X,A10,F8.3,A4,' +- ',F6.2,A4,F9.3,' cm +- ',F6.2,' cm') + 751 FORMAT(1X,'AbsNo Material',5X,'Energy deposit',14X,'Trck length', + + 12X,'E leakage by secondaries') + 752 FORMAT(I5,3X,A10,F8.3,A4,' +- ',F6.2,A4,F9.3,' cm +- ',F6.2,' cm', + + F9.3,A4,' +- ',F6.2,A4) * END diff --git a/examples/extended/electromagnetic/TestEm3/include/DetectorConstruction.hh b/examples/extended/electromagnetic/TestEm3/include/DetectorConstruction.hh index b88c085487..261179e4f7 100644 --- a/examples/extended/electromagnetic/TestEm3/include/DetectorConstruction.hh +++ b/examples/extended/electromagnetic/TestEm3/include/DetectorConstruction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.hh,v 1.5 2004/01/16 14:14:08 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.hh,v 1.9 2004/06/09 14:18:45 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -40,7 +40,6 @@ class G4VPhysicalVolume; class G4Material; class G4UniformMagField; class G4UserLimits; - class DetectorMessenger; const G4int MaxAbsor = 10; @@ -60,10 +59,10 @@ class DetectorConstruction : public G4VUserDetectorConstruction void SetAbsorMaterial (G4int,G4String); void SetAbsorThickness(G4int,G4double); - void SetWorldMaterial (G4String); + void SetWorldMaterial (G4String); void SetCalorSizeYZ (G4double); void SetNbOfLayers (G4int); - + void SetMagField (G4double); void SetMaxStepSize(G4double); @@ -86,27 +85,27 @@ class DetectorConstruction : public G4VUserDetectorConstruction G4int GetNbOfAbsor() {return NbOfAbsor;}; G4Material* GetAbsorMaterial(G4int i) {return AbsorMaterial[i];}; G4double GetAbsorThickness(G4int i) {return AbsorThickness[i];}; - + const G4VPhysicalVolume* GetphysiWorld() {return physiWorld;}; const G4Material* GetWorldMaterial() {return defaultMaterial;}; const G4VPhysicalVolume* GetAbsorber(G4int i) {return physiAbsor[i];}; - + private: - - G4int NbOfAbsor; + + G4int NbOfAbsor; G4Material* AbsorMaterial [MaxAbsor]; G4double AbsorThickness[MaxAbsor]; - + G4int NbOfLayers; G4double LayerThickness; - + G4double CalorSizeYZ; G4double CalorThickness; - + G4Material* defaultMaterial; G4double WorldSizeYZ; G4double WorldSizeX; - + G4Box* solidWorld; G4LogicalVolume* logicWorld; G4VPhysicalVolume* physiWorld; @@ -114,25 +113,25 @@ class DetectorConstruction : public G4VUserDetectorConstruction G4Box* solidCalor; G4LogicalVolume* logicCalor; G4VPhysicalVolume* physiCalor; - + G4Box* solidLayer; G4LogicalVolume* logicLayer; G4VPhysicalVolume* physiLayer; - + G4Box* solidAbsor[MaxAbsor]; G4LogicalVolume* logicAbsor[MaxAbsor]; G4VPhysicalVolume* physiAbsor[MaxAbsor]; - + G4UniformMagField* magField; G4UserLimits* userLimits; - + DetectorMessenger* detectorMessenger; - + private: - + void DefineMaterials(); void ComputeCalorParameters(); - G4VPhysicalVolume* ConstructCalorimeter(); + G4VPhysicalVolume* ConstructCalorimeter(); }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/include/DetectorMessenger.hh b/examples/extended/electromagnetic/TestEm3/include/DetectorMessenger.hh index adc2a7e30f..d93a1474b6 100644 --- a/examples/extended/electromagnetic/TestEm3/include/DetectorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm3/include/DetectorMessenger.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorMessenger.hh,v 1.1 2003/09/22 14:06:39 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.hh,v 1.5 2004/06/09 14:18:45 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -49,18 +49,18 @@ class DetectorMessenger: public G4UImessenger public: DetectorMessenger(DetectorConstruction* ); ~DetectorMessenger(); - + void SetNewValue(G4UIcommand*, G4String); - + private: DetectorConstruction* Detector; - + G4UIdirectory* testemDir; G4UIcmdWithADoubleAndUnit* SizeYZCmd; G4UIcmdWithAnInteger* NbLayersCmd; G4UIcmdWithAnInteger* NbAbsorCmd; - G4UIcommand* AbsorCmd; + G4UIcommand* AbsorCmd; G4UIcmdWithADoubleAndUnit* MagFieldCmd; G4UIcmdWithADoubleAndUnit* MaxStepCmd; G4UIcmdWithoutParameter* UpdateCmd; diff --git a/examples/extended/electromagnetic/TestEm2/include/PhysListParticles.hh b/examples/extended/electromagnetic/TestEm3/include/EmAcceptance.hh similarity index 75% rename from examples/extended/electromagnetic/TestEm2/include/PhysListParticles.hh rename to examples/extended/electromagnetic/TestEm3/include/EmAcceptance.hh index 0f74c4cb45..866ce44947 100644 --- a/examples/extended/electromagnetic/TestEm2/include/PhysListParticles.hh +++ b/examples/extended/electromagnetic/TestEm3/include/EmAcceptance.hh @@ -21,45 +21,38 @@ // ******************************************************************** // // -// $Id: PhysListParticles.hh,v 1.1 2003/10/08 17:28:37 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: EmAcceptance.hh,v 1.2 2004/06/09 14:18:45 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListParticles_h -#define PhysListParticles_h 1 +#ifndef EmAcceptance_h +#define EmAcceptance_h 1 -#include "G4VPhysicsConstructor.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListParticles : public G4VPhysicsConstructor +class EmAcceptance { - public: - PhysListParticles(const G4String& name = "particles"); - ~PhysListParticles(); +public: - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(); - - // This method is dummy. - void ConstructProcess() {}; + EmAcceptance(); + ~EmAcceptance(); + void BeginOfAcceptance(const G4String& title, G4int stat); + void EndOfAcceptance(); + + void EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit); + +private: + + G4bool isAccepted; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif - - - - - - - - diff --git a/examples/extended/electromagnetic/TestEm3/include/EventAction.hh b/examples/extended/electromagnetic/TestEm3/include/EventAction.hh index 2465efeefe..2486521ebf 100644 --- a/examples/extended/electromagnetic/TestEm3/include/EventAction.hh +++ b/examples/extended/electromagnetic/TestEm3/include/EventAction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: EventAction.hh,v 1.3 2003/11/27 18:20:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: EventAction.hh,v 1.7 2004/06/15 11:39:57 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -35,17 +35,17 @@ #include "G4UserEventAction.hh" #include "globals.hh" #include "DetectorConstruction.hh" -#include "G4DataVector.hh" class RunAction; class EventActionMessenger; +class HistoManager; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class EventAction : public G4UserEventAction { public: - EventAction(DetectorConstruction*, RunAction*); + EventAction(DetectorConstruction*, RunAction*, HistoManager*); ~EventAction(); void BeginOfEventAction(const G4Event*); @@ -63,12 +63,14 @@ class EventAction : public G4UserEventAction DetectorConstruction* detector; RunAction* runAct; - G4DataVector energyDeposit; - G4DataVector energyLeaving; - G4DataVector trackLengthCh; - G4String drawFlag; // draw the event + G4double energyDeposit[MaxAbsor]; + G4double energyLeaving[MaxAbsor]; + G4double trackLengthCh[MaxAbsor]; + + G4String drawFlag; G4int printModulo; EventActionMessenger* eventMessenger; + HistoManager* histoManager; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/include/HistoManager.hh b/examples/extended/electromagnetic/TestEm3/include/HistoManager.hh new file mode 100644 index 0000000000..a1869509c6 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/include/HistoManager.hh @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoManager.hh,v 1.2 2004/06/21 10:52:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoManager_h +#define HistoManager_h 1 + +#ifdef G4ANALYSIS_USE + +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef USE_AIDA +namespace AIDA { + class ITree; + class IHistogramFactory; + class IHistogram1D; +} +#endif + +class HistoMessenger; + +#include "DetectorConstruction.hh" + const G4int MaxHisto = MaxAbsor; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager +{ + public: + + HistoManager(); + ~HistoManager(); + + void SetFileName (G4String name) { fileName = name;}; + void SetFactory (); + void SaveFactory (); + void SetHisto (G4int, G4int, G4double, G4double, G4String unit="none"); + void RemoveHisto (G4int); + +#ifdef USE_AIDA + AIDA::ITree* GetTree() {return tree;} + AIDA::IHistogramFactory* GetHistogramFactory() {return hf;} + AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} +#endif + + G4double GetHistoUnit(G4int id) {return Unit[id];} + G4double GetBinWidth (G4int id) {return Width[id];} + + private: + + G4String fileName; + +#ifdef USE_AIDA + AIDA::ITree* tree; + AIDA::IHistogramFactory* hf; + AIDA::IHistogram1D* histo[MaxHisto]; +#endif + + G4bool exist[MaxHisto]; + G4String Label[MaxHisto]; + G4String Title[MaxHisto]; + G4int Nbins[MaxHisto]; + G4double Vmin [MaxHisto]; + G4double Vmax [MaxHisto]; + G4double Unit [MaxHisto]; + G4double Width[MaxHisto]; + G4bool factoryOn; + HistoMessenger* histoMessenger; +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif //G4ANALYSIS_USE +#endif + diff --git a/examples/extended/electromagnetic/TestEm3/include/HistoMessenger.hh b/examples/extended/electromagnetic/TestEm3/include/HistoMessenger.hh new file mode 100644 index 0000000000..e902d91d82 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/include/HistoMessenger.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoMessenger.hh,v 1.1 2004/06/15 11:39:57 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef HistoMessenger_h +#define HistoMessenger_h 1 + +#ifdef G4ANALYSIS_USE + +#include "G4UImessenger.hh" +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoManager; +class G4UIdirectory; +class G4UIcommand; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class HistoMessenger: public G4UImessenger +{ + public: + + HistoMessenger(HistoManager* ); + ~HistoMessenger(); + + void SetNewValue(G4UIcommand* ,G4String ); + + private: + + HistoManager* histoManager; + + G4UIdirectory* histoDir; + G4UIcmdWithAString* factoryCmd; + G4UIcommand* histoCmd; + G4UIcmdWithAnInteger* rmhistoCmd; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif +#endif diff --git a/examples/extended/electromagnetic/TestEm3/include/PhysicsList.hh b/examples/extended/electromagnetic/TestEm3/include/PhysicsList.hh index 994703ff5c..3ac75c6e99 100644 --- a/examples/extended/electromagnetic/TestEm3/include/PhysicsList.hh +++ b/examples/extended/electromagnetic/TestEm3/include/PhysicsList.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.hh,v 1.2 2003/10/06 10:09:24 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.hh,v 1.3 2004/04/28 17:40:42 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // @@ -62,9 +62,8 @@ class PhysicsList: public G4VModularPhysicsList G4double cutForElectron; G4double cutForPositron; G4double currentDefaultCut; + G4VPhysicsConstructor* emPhysicsList; - G4VPhysicsConstructor* generalPhysicsList; - G4VPhysicsConstructor* particleList; G4String emName; PhysicsListMessenger* pMessenger; diff --git a/examples/extended/electromagnetic/TestEm3/include/RunAction.hh b/examples/extended/electromagnetic/TestEm3/include/RunAction.hh index 8278b7a546..30ff604c4d 100644 --- a/examples/extended/electromagnetic/TestEm3/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm3/include/RunAction.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunAction.hh,v 1.13 2004/06/15 11:39:57 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunAction.hh,v 1.8 2004/01/21 17:29:26 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -35,64 +32,53 @@ #include "DetectorConstruction.hh" #include "G4UserRunAction.hh" +#include "G4ThreeVector.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class G4Run; +class PrimaryGeneratorAction; class RunActionMessenger; +class HistoManager; -#ifdef G4ANALYSIS_USE -namespace AIDA { - class ITree; - class IHistogramFactory; - class IHistogram1D; -} -#endif +class G4Run; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class RunAction : public G4UserRunAction { public: - RunAction(DetectorConstruction*); + RunAction(DetectorConstruction*, PrimaryGeneratorAction*, HistoManager*); ~RunAction(); void BeginOfRunAction(const G4Run*); void EndOfRunAction(const G4Run*); void fillPerEvent(G4int,G4double,G4double,G4double); - -#ifdef G4ANALYSIS_USE - AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} - G4double GetHistoUnit(G4int id) {return histoUnit[id];} -#endif - - void SetFileName(const G4String& s) {fileName = s;}; - void SetHisto (G4int, G4int, G4double, G4double, G4String); - + void PrintDedxTables(); + // Acceptance parameters + void SetEdepAndRMS(G4int, G4ThreeVector); + G4double GetAverageEdep(G4int i) const {return edeptrue[i];}; + G4double GetRMSEdep(G4int i) const {return rmstrue[i];}; + G4double GetLimitEdep(G4int i) const {return limittrue[i];}; + private: G4double sumEAbs [MaxAbsor], sum2EAbs [MaxAbsor]; G4double sumLAbs [MaxAbsor], sum2LAbs [MaxAbsor]; G4double sumEleav[MaxAbsor], sum2Eleav[MaxAbsor]; - DetectorConstruction* Detector; - RunActionMessenger* runMessenger; - - G4String fileName; - G4String hid [MaxAbsor], htitle[MaxAbsor]; - G4int hbins[MaxAbsor]; - G4double hmin [MaxAbsor], hmax [MaxAbsor]; - G4double histoUnit[MaxAbsor]; - -#ifdef G4ANALYSIS_USE - AIDA::ITree* tree; - AIDA::IHistogramFactory* hf; - AIDA::IHistogram1D* histo[MaxAbsor]; -#endif - + DetectorConstruction* Detector; + PrimaryGeneratorAction* Primary; + RunActionMessenger* runMessenger; + HistoManager* histoManager; + + G4double edeptrue [MaxAbsor]; + G4double rmstrue [MaxAbsor]; + G4double limittrue[MaxAbsor]; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/include/RunActionMessenger.hh b/examples/extended/electromagnetic/TestEm3/include/RunActionMessenger.hh index bc4c95ef56..1da4bec804 100644 --- a/examples/extended/electromagnetic/TestEm3/include/RunActionMessenger.hh +++ b/examples/extended/electromagnetic/TestEm3/include/RunActionMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunActionMessenger.hh,v 1.7 2004/06/15 11:39:58 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunActionMessenger.hh,v 1.3 2004/01/21 17:29:26 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -36,8 +33,7 @@ #include "G4UImessenger.hh" class RunAction; -class G4UIcommand; -class G4UIcmdWithAString; +class G4UIcmdWith3Vector; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -51,8 +47,8 @@ class RunActionMessenger: public G4UImessenger private: RunAction* Run; - G4UIcmdWithAString* fileCmd; - G4UIcommand* HistoCmd; + G4UIcmdWith3Vector* accCmd1; + G4UIcmdWith3Vector* accCmd2; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/include/SteppingAction.hh b/examples/extended/electromagnetic/TestEm3/include/SteppingAction.hh index bb7ea3ef6d..e28835da8c 100644 --- a/examples/extended/electromagnetic/TestEm3/include/SteppingAction.hh +++ b/examples/extended/electromagnetic/TestEm3/include/SteppingAction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: SteppingAction.hh,v 1.2 2003/11/27 18:20:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.hh,v 1.3 2004/03/16 18:25:29 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -43,9 +43,9 @@ class SteppingAction : public G4UserSteppingAction { public: SteppingAction(DetectorConstruction*, EventAction*); - virtual ~SteppingAction(); + ~SteppingAction(); - virtual void UserSteppingAction(const G4Step*); + void UserSteppingAction(const G4Step*); G4double BirkAttenuation(const G4Step*); diff --git a/examples/extended/electromagnetic/TestEm3/include/SteppingVerbose.hh b/examples/extended/electromagnetic/TestEm3/include/SteppingVerbose.hh index 3a6bd622a9..a1b8ac72ae 100644 --- a/examples/extended/electromagnetic/TestEm3/include/SteppingVerbose.hh +++ b/examples/extended/electromagnetic/TestEm3/include/SteppingVerbose.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: SteppingVerbose.hh,v 1.2 2003/11/27 18:20:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingVerbose.hh,v 1.3 2004/03/16 18:27:18 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // This class manages the verbose outputs in G4SteppingManager. // It inherits from G4SteppingVerbose. @@ -43,7 +43,7 @@ class SteppingVerbose : public G4SteppingVerbose public: SteppingVerbose(); - ~SteppingVerbose(); + ~SteppingVerbose(); void StepInfo(); void TrackingStarted(); diff --git a/examples/extended/electromagnetic/TestEm3/ionC12.mac b/examples/extended/electromagnetic/TestEm3/ionC12.mac index 47b97d621b..c7060c55e9 100644 --- a/examples/extended/electromagnetic/TestEm3/ionC12.mac +++ b/examples/extended/electromagnetic/TestEm3/ionC12.mac @@ -1,4 +1,4 @@ -# $Id: ionC12.mac,v 1.3 2003/10/06 10:09:19 maire Exp $ +# $Id: ionC12.mac,v 1.6 2004/06/16 10:35:41 maire Exp $ # # Macro file for "TestEm3.cc" # (can be run in batch, without graphic) @@ -6,6 +6,7 @@ # CsI 1 layer; # /control/verbose 2 +/run/verbose 2 # # select EM PhysicsList # @@ -19,15 +20,14 @@ /testem/det/setAbsor 0 CsI 1.99 cm /testem/det/setSizeYZ 3 cm # -/testem/gun/setDefault /run/initialize # -/run/verbose 2 -/testem/event/printModulo 1000 -# +/testem/gun/setDefault /gun/particle ionC12 /gun/energy 108 GeV # -/testem/run/setHisto 0 100 3.e-3 6.e-3 +/testem/histo/setHisto 0 200 350. 550. MeV # -/run/beamOn 2000 +/testem/event/printModulo 1000 +/run/beamOn 5000 + diff --git a/examples/extended/electromagnetic/TestEm3/run01.mac b/examples/extended/electromagnetic/TestEm3/run01.mac index d399999a49..76ec47d5b6 100644 --- a/examples/extended/electromagnetic/TestEm3/run01.mac +++ b/examples/extended/electromagnetic/TestEm3/run01.mac @@ -1,4 +1,4 @@ -# $Id: run01.mac,v 1.11 2004/01/21 17:29:22 maire Exp $ +# $Id: run01.mac,v 1.12 2004/06/16 10:35:41 maire Exp $ # # Macro file for "exampleN03.cc" # (can be run in batch, without graphic) @@ -18,9 +18,9 @@ /gun/particle e- /gun/energy 1 GeV # -/testem/run/setFileName run01.paw -/testem/run/setHisto 0 100 700. 1000. MeV -/testem/run/setHisto 1 100 0. 300. MeV +/testem/histo/setFileName run01.paw +/testem/histo/setHisto 0 100 700. 1000. MeV +/testem/histo/setHisto 1 100 0. 300. MeV # /testem/event/printModulo 50 # diff --git a/examples/extended/electromagnetic/TestEm3/run02.mac b/examples/extended/electromagnetic/TestEm3/run02.mac index 1ca7c234f0..10725d4131 100644 --- a/examples/extended/electromagnetic/TestEm3/run02.mac +++ b/examples/extended/electromagnetic/TestEm3/run02.mac @@ -1,4 +1,4 @@ -# $Id: run02.mac,v 1.10 2004/01/21 17:29:22 maire Exp $ +# $Id: run02.mac,v 1.11 2004/06/16 10:35:41 maire Exp $ # # Macro file for "TestEm3.cc" # (can be run in batch, without graphic) @@ -24,9 +24,9 @@ /gun/particle e- /gun/energy 1 GeV # -/testem/run/setFileName run02.paw -/testem/run/setHisto 0 100 900. 1000. MeV -/testem/run/setHisto 1 100 0. 50. MeV +/testem/histo/setFileName run02.paw +/testem/histo/setHisto 0 100 900. 1000. MeV +/testem/histo/setHisto 1 100 0. 50. MeV # /testem/event/printModulo 50 # diff --git a/examples/extended/electromagnetic/TestEm3/run15.mac b/examples/extended/electromagnetic/TestEm3/run15.mac index ad78b67d50..4635e62475 100644 --- a/examples/extended/electromagnetic/TestEm3/run15.mac +++ b/examples/extended/electromagnetic/TestEm3/run15.mac @@ -1,4 +1,4 @@ -# $Id: run15.mac,v 1.10 2004/01/21 17:29:22 maire Exp $ +# $Id: run15.mac,v 1.11 2004/06/16 10:35:41 maire Exp $ # # Macro file for "TestEm3.cc" # (can be run in batch, without graphic) @@ -25,9 +25,9 @@ /gun/particle mu+ /gun/energy 20 GeV # -/testem/run/setFileName run15.paw -/testem/run/setHisto 0 100 0. 2. GeV -/testem/run/setHisto 1 100 0. 100. MeV +/testem/histo/setFileName run15.paw +/testem/histo/setHisto 0 100 0. 2. GeV +/testem/histo/setHisto 1 100 0. 100. MeV # /testem/event/printModulo 1000 # diff --git a/examples/extended/electromagnetic/TestEm3/sicapo3.mac b/examples/extended/electromagnetic/TestEm3/sicapo3.mac index bdb8d4870e..e4b0538b85 100644 --- a/examples/extended/electromagnetic/TestEm3/sicapo3.mac +++ b/examples/extended/electromagnetic/TestEm3/sicapo3.mac @@ -1,4 +1,4 @@ -# $Id: sicapo3.mac,v 1.2 2003/10/06 10:09:22 maire Exp $ +# $Id: sicapo3.mac,v 1.3 2004/06/16 10:35:41 maire Exp $ # # Macro file for "TestEm3.cc" # (can be run in batch, without graphic) @@ -30,7 +30,7 @@ /gun/particle e- /gun/energy 6 GeV # -/testem/run/setHisto 2 100 0. 50. MeV +/testem/histo/setHisto 2 100 0. 50. MeV # /testem/event/printModulo 100 # diff --git a/examples/extended/electromagnetic/TestEm3/src/DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm3/src/DetectorConstruction.cc index 22c5ed8b6c..99ebc9aab0 100644 --- a/examples/extended/electromagnetic/TestEm3/src/DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm3/src/DetectorConstruction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.cc,v 1.7 2004/01/21 17:29:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.cc,v 1.11 2004/06/09 14:18:47 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -54,12 +54,6 @@ DetectorConstruction::DetectorConstruction() solidLayer(0),logicLayer(0),physiLayer(0), magField(0) { - for (G4int i=0; iAddElement(H, natoms=2); @@ -522,6 +516,7 @@ void DetectorConstruction::SetMaxStepSize(G4double val) userLimits->SetMaxAllowedStep(val); } + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "G4RunManager.hh" diff --git a/examples/extended/electromagnetic/TestEm3/src/DetectorMessenger.cc b/examples/extended/electromagnetic/TestEm3/src/DetectorMessenger.cc index 658aecc11b..be1ce69145 100644 --- a/examples/extended/electromagnetic/TestEm3/src/DetectorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm3/src/DetectorMessenger.cc @@ -21,11 +21,9 @@ // ******************************************************************** // // -// $Id: DetectorMessenger.cc,v 1.1 2003/09/22 14:06:16 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.cc,v 1.5 2004/06/09 14:18:47 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -122,7 +120,7 @@ DetectorMessenger::~DetectorMessenger() delete SizeYZCmd; delete NbLayersCmd; delete NbAbsorCmd; - delete AbsorCmd; + delete AbsorCmd; delete MagFieldCmd; delete UpdateCmd; delete MaxStepCmd; @@ -132,13 +130,13 @@ DetectorMessenger::~DetectorMessenger() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) -{ +{ if( command == SizeYZCmd ) { Detector->SetCalorSizeYZ(SizeYZCmd->GetNewDoubleValue(newValue));} - + if( command == NbLayersCmd ) { Detector->SetNbOfLayers(NbLayersCmd->GetNewIntValue(newValue));} - + if( command == NbAbsorCmd ) { Detector->SetNbOfAbsor(NbAbsorCmd->GetNewIntValue(newValue));} @@ -154,7 +152,7 @@ void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) Detector->SetAbsorMaterial (num,material); Detector->SetAbsorThickness(num,tick); } - + if( command == MagFieldCmd ) { Detector->SetMagField(MagFieldCmd->GetNewDoubleValue(newValue));} diff --git a/examples/extended/electromagnetic/TestEm3/src/EmAcceptance.cc b/examples/extended/electromagnetic/TestEm3/src/EmAcceptance.cc new file mode 100644 index 0000000000..5e11e9cb8d --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/src/EmAcceptance.cc @@ -0,0 +1,77 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EmAcceptance.cc,v 1.3 2004/06/20 01:32:20 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EmAcceptance.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::EmAcceptance() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::~EmAcceptance() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::BeginOfAcceptance(const G4String& title, G4int stat) +{ + G4cout << "\n<<<<>>>> " << stat << " events for " << title + << G4endl; + isAccepted = true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EndOfAcceptance() +{ + G4String resume = "IS ACCEPTED"; + if (!isAccepted) resume = "IS NOT ACCEPTED"; + G4cout << "<<<<>>>> " << resume << G4endl; + G4cout << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit) +{ + G4double x = sqrt((G4double)stat); + G4double dde = avr - avr0; + G4double de = dde*x/rms; + + G4cout << title << ": " << avr << " del"<< title << "= " << dde + << " nrms= " << de << G4endl; + + if (abs(de) > limit) isAccepted = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/src/EventAction.cc b/examples/extended/electromagnetic/TestEm3/src/EventAction.cc index ed79833301..b0d1e907fd 100644 --- a/examples/extended/electromagnetic/TestEm3/src/EventAction.cc +++ b/examples/extended/electromagnetic/TestEm3/src/EventAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventAction.cc,v 1.8 2004/06/21 10:52:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventAction.cc,v 1.4 2004/01/21 17:29:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -33,21 +30,25 @@ #include "RunAction.hh" #include "EventActionMessenger.hh" +#include "HistoManager.hh" #include "G4Event.hh" #include "G4TrajectoryContainer.hh" #include "G4Trajectory.hh" #include "G4VVisManager.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -EventAction::EventAction(DetectorConstruction* det, RunAction* run) -:detector(det),runAct(run),drawFlag("none"),printModulo(10000),eventMessenger(0) +EventAction::EventAction(DetectorConstruction* det, RunAction* run, + HistoManager* hist) +:detector(det), runAct(run), histoManager(hist) { + drawFlag = "none"; + printModulo = 10000; eventMessenger = new EventActionMessenger(this); } @@ -69,15 +70,9 @@ void EventAction::BeginOfEventAction(const G4Event* evt) G4cout << "\n---> Begin Of Event: " << evtNb << G4endl; //initialize EnergyDeposit per event - size_t n = detector->GetNbOfAbsor(); - energyDeposit.resize(n); - energyLeaving.resize(n); - trackLengthCh.resize(n); - for (size_t k=0; kGetNbOfAbsor(); k++) { runAct->fillPerEvent(k,energyDeposit[k],trackLengthCh[k], - energyLeaving[k]/(G4double)(detector->GetNbOfLayers())); -#ifdef G4ANALYSIS_USE - if (runAct->GetHisto(k)) { - G4double unit = runAct->GetHistoUnit(k); - runAct->GetHisto(k)->fill(energyDeposit[k]/unit); + energyLeaving[k]/(G4double)(detector->GetNbOfLayers())); + +#ifdef USE_AIDA + if (histoManager->GetHisto(k)) { + G4double unit = histoManager->GetHistoUnit(k); + histoManager->GetHisto(k)->fill(energyDeposit[k]/unit); } #endif } diff --git a/examples/extended/electromagnetic/TestEm3/src/HistoManager.cc b/examples/extended/electromagnetic/TestEm3/src/HistoManager.cc new file mode 100644 index 0000000000..fc32088e71 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/src/HistoManager.cc @@ -0,0 +1,159 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoManager.cc,v 1.2 2004/06/21 10:52:55 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4ANALYSIS_USE + +#include "HistoManager.hh" +#include "HistoMessenger.hh" +#include "G4UnitsTable.hh" + +#ifdef USE_AIDA + #include "AIDA/AIDA.h" +#endif + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoManager::HistoManager() +{ + fileName = "testem3.paw"; + factoryOn = false; + + // histograms + for (G4int k=0; kHistoManager::SetFactory(): factory already exists" + << G4endl; + SaveFactory(); + } + +#ifdef USE_AIDA + // Creating the analysis factory + AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); + + // Creating the tree factory + AIDA::ITreeFactory* tf = af->createTreeFactory(); + + // Creating a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create(fileName, "hbook", readOnly, createNew); + + // Creating a histogram factory, whose histograms will be handled by the tree + hf = af->createHistogramFactory(*tree); + + // create selected histograms + for (G4int k=0; kcreateHistogram1D( Label[k], Title[k], + Nbins[k], Vmin[k], Vmax[k]); + else histo[k] = 0; + } + delete tf; + delete af; +#endif //USE_AIDA + + factoryOn = true; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SaveFactory() +{ + if (factoryOn) { + +#ifdef USE_AIDA + tree->commit(); // Writing the histograms to the file + tree->close(); // and closing the tree (and the file) + G4cout << "---> Histograms are saved" << G4endl; + delete hf; + delete tree; +#endif //USE_AIDA + + factoryOn = false; + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::SetHisto(G4int ih, + G4int nbins, G4double valmin, G4double valmax, G4String unit) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + const G4String id[] = {"0","1","2","3","4","5","6","7","8""9","10"}; + G4String title = "Edep in absorber " + id[ih] + " (" + unit + ")"; + G4double valunit = G4UnitDefinition::GetValueOf(unit); + + exist[ih] = true; + Label[ih] = id[ih+1]; + Title[ih] = title; + Nbins[ih] = nbins; + Vmin[ih] = valmin/valunit; + Vmax[ih] = valmax/valunit; + Width[ih] = (valmax-valmin)/nbins; + Unit[ih] = valunit; + + G4cout << "----> SetHisto " << ih << ": " << title << "; " + << nbins << " bins from " + << valmin << " " << unit << " to " << valmax << " " << unit << G4endl; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::RemoveHisto(G4int ih) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + + histo[ih] = 0; exist[ih] = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif //G4ANALYSIS_USE diff --git a/examples/extended/electromagnetic/TestEm3/src/HistoMessenger.cc b/examples/extended/electromagnetic/TestEm3/src/HistoMessenger.cc new file mode 100644 index 0000000000..64d1670bb5 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm3/src/HistoMessenger.cc @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: HistoMessenger.cc,v 1.2 2004/06/16 10:35:43 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifdef G4ANALYSIS_USE + +#include "HistoMessenger.hh" + +#include "HistoManager.hh" +#include "G4UIdirectory.hh" +#include "G4UIcommand.hh" +#include "G4UIparameter.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::HistoMessenger(HistoManager* manager) +:histoManager (manager) +{ + histoDir = new G4UIdirectory("/testem/histo/"); + histoDir->SetGuidance("histograms control"); + + factoryCmd = new G4UIcmdWithAString("/testem/histo/setFileName",this); + factoryCmd->SetGuidance("set name for the histograms file"); + + histoCmd = new G4UIcommand("/testem/histo/setHisto",this); + histoCmd->SetGuidance("Set bining of the histo number ih :"); + histoCmd->SetGuidance(" nbBins; valMin; valMax; unit (of vmin and vmax)"); + // + G4UIparameter* ih = new G4UIparameter("ih",'i',false); + ih->SetGuidance("histo number : from 1 to MaxHisto"); + ih->SetParameterRange("ih>=0"); + histoCmd->SetParameter(ih); + // + G4UIparameter* nbBins = new G4UIparameter("nbBins",'i',false); + nbBins->SetGuidance("number of bins"); + nbBins->SetParameterRange("nbBins>0"); + histoCmd->SetParameter(nbBins); + // + G4UIparameter* valMin = new G4UIparameter("valMin",'d',false); + valMin->SetGuidance("valMin, expressed in unit"); + histoCmd->SetParameter(valMin); + // + G4UIparameter* valMax = new G4UIparameter("valMax",'d',false); + valMax->SetGuidance("valMax, expressed in unit"); + histoCmd->SetParameter(valMax); + // + G4UIparameter* unit = new G4UIparameter("unit",'s',true); + unit->SetGuidance("if omitted, vmin and vmax are assumed dimensionless"); + unit->SetDefaultValue("none"); + histoCmd->SetParameter(unit); + + rmhistoCmd = new G4UIcmdWithAnInteger("/testem/histo/removeHisto",this); + rmhistoCmd->SetGuidance("desactivate histo #id"); + rmhistoCmd->SetParameterName("id",false); + rmhistoCmd->SetRange("id>=0"); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +HistoMessenger::~HistoMessenger() +{ + delete rmhistoCmd; + delete histoCmd; + delete factoryCmd; + delete histoDir; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoMessenger::SetNewValue(G4UIcommand* command, G4String newValues) +{ + if (command == factoryCmd) + histoManager->SetFileName(newValues); + + if (command == histoCmd) + { G4int ih,nbBins; G4double vmin,vmax; char unts[30]; + const char* t = newValues; + std::istrstream is((char*)t); + is >> ih >> nbBins >> vmin >> vmax >> unts; + G4String unit = unts; + G4double vUnit = 1. ; + if (unit != "none") vUnit = G4UIcommand::ValueOf(unit); + histoManager->SetHisto (ih,nbBins,vmin*vUnit,vmax*vUnit,unit); + } + + if (command == rmhistoCmd) + { histoManager->RemoveHisto(rmhistoCmd->GetNewIntValue(newValues));} +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm3/src/PhysListEmG4v52.cc b/examples/extended/electromagnetic/TestEm3/src/PhysListEmG4v52.cc index 9fa47eb5db..8692f8d423 100644 --- a/examples/extended/electromagnetic/TestEm3/src/PhysListEmG4v52.cc +++ b/examples/extended/electromagnetic/TestEm3/src/PhysListEmG4v52.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmG4v52.cc,v 1.1 2003/10/06 10:09:24 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmG4v52.cc,v 1.2 2004/03/24 18:25:31 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -108,7 +108,7 @@ void PhysListEmG4v52::ConstructProcess() (particle->GetParticleName() != "chargedgeantino")) { //all others charged particles except geantino pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); - pmanager->AddProcess(new G4hIonisation52, -1,2,2); + pmanager->AddProcess(new G4hIonisation52, -1,2,2); } } } diff --git a/examples/extended/electromagnetic/TestEm3/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/TestEm3/src/PhysListEmStandard.cc index 569883d5c1..767190458f 100644 --- a/examples/extended/electromagnetic/TestEm3/src/PhysListEmStandard.cc +++ b/examples/extended/electromagnetic/TestEm3/src/PhysListEmStandard.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.cc,v 1.3 2003/10/24 12:12:12 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.cc,v 1.5 2004/04/28 16:58:49 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm3/src/PhysicsList.cc index 320e7a8d48..e8434545cc 100644 --- a/examples/extended/electromagnetic/TestEm3/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm3/src/PhysicsList.cc @@ -21,19 +21,20 @@ // ******************************************************************** // // - +// $Id: PhysicsList.cc,v 1.5 2004/04/28 17:40:48 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "PhysicsList.hh" #include "PhysicsListMessenger.hh" -#include "PhysListParticles.hh" -#include "PhysListGeneral.hh" #include "PhysListEmStandard.hh" #include "PhysListEmG4v52.hh" #include "G4LossTableManager.hh" +#include "G4UnitsTable.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -49,12 +50,6 @@ PhysicsList::PhysicsList() : G4VModularPhysicsList() SetVerboseLevel(1); - // Particles - particleList = new PhysListParticles("particles"); - - // General Physics - generalPhysicsList = new PhysListGeneral("general"); - // EM physics emName = G4String("standard"); emPhysicsList = new PhysListEmStandard(emName); @@ -70,17 +65,134 @@ PhysicsList::~PhysicsList() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Bosons +#include "G4ChargedGeantino.hh" +#include "G4Geantino.hh" +#include "G4Gamma.hh" +#include "G4OpticalPhoton.hh" + +// leptons +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" +#include "G4NeutrinoMu.hh" +#include "G4AntiNeutrinoMu.hh" + +#include "G4Electron.hh" +#include "G4Positron.hh" +#include "G4NeutrinoE.hh" +#include "G4AntiNeutrinoE.hh" + +// Mesons +#include "G4PionPlus.hh" +#include "G4PionMinus.hh" +#include "G4PionZero.hh" +#include "G4Eta.hh" +#include "G4EtaPrime.hh" + +#include "G4KaonPlus.hh" +#include "G4KaonMinus.hh" +#include "G4KaonZero.hh" +#include "G4AntiKaonZero.hh" +#include "G4KaonZeroLong.hh" +#include "G4KaonZeroShort.hh" + +// Baryons +#include "G4Proton.hh" +#include "G4AntiProton.hh" +#include "G4Neutron.hh" +#include "G4AntiNeutron.hh" + +// Nuclei +#include "G4Alpha.hh" +#include "G4Deuteron.hh" +#include "G4Triton.hh" +#include "G4He3.hh" +#include "G4GenericIon.hh" + +#include "IonC12.hh" + void PhysicsList::ConstructParticle() { - particleList->ConstructParticle(); +// pseudo-particles + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); + +// gamma + G4Gamma::GammaDefinition(); + +// optical photon + G4OpticalPhoton::OpticalPhotonDefinition(); + +// leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + +// mesons + G4PionPlus::PionPlusDefinition(); + G4PionMinus::PionMinusDefinition(); + G4PionZero::PionZeroDefinition(); + G4Eta::EtaDefinition(); + G4EtaPrime::EtaPrimeDefinition(); + G4KaonPlus::KaonPlusDefinition(); + G4KaonMinus::KaonMinusDefinition(); + G4KaonZero::KaonZeroDefinition(); + G4AntiKaonZero::AntiKaonZeroDefinition(); + G4KaonZeroLong::KaonZeroLongDefinition(); + G4KaonZeroShort::KaonZeroShortDefinition(); + +// barions + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4AntiNeutron::AntiNeutronDefinition(); + +// ions + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4He3::He3Definition(); + G4Alpha::AlphaDefinition(); + G4GenericIon::GenericIonDefinition(); + IonC12::IonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#include "G4ProcessManager.hh" +#include "G4Decay.hh" + void PhysicsList::ConstructProcess() { AddTransportation(); - generalPhysicsList->ConstructProcess(); + + // Add Decay Process + // + G4Decay* fDecayProcess = new G4Decay(); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (fDecayProcess->IsApplicable(*particle)) { + + pmanager ->AddProcess(fDecayProcess); + + // set ordering for PostStepDoIt and AtRestDoIt + pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); + + } + } + + // electromagnetic Physics List + // emPhysicsList->ConstructProcess(); } diff --git a/examples/extended/electromagnetic/TestEm3/src/PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/TestEm3/src/PrimaryGeneratorAction.cc index 3876856faa..9e3a72ae46 100644 --- a/examples/extended/electromagnetic/TestEm3/src/PrimaryGeneratorAction.cc +++ b/examples/extended/electromagnetic/TestEm3/src/PrimaryGeneratorAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PrimaryGeneratorAction.cc,v 1.1 2003/09/22 14:06:20 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PrimaryGeneratorAction.cc,v 1.3 2004/04/28 16:58:49 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // diff --git a/examples/extended/electromagnetic/TestEm3/src/RunAction.cc b/examples/extended/electromagnetic/TestEm3/src/RunAction.cc index 302db733a6..69d6877727 100644 --- a/examples/extended/electromagnetic/TestEm3/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm3/src/RunAction.cc @@ -20,39 +20,36 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunAction.cc,v 1.19 2004/06/16 16:25:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunAction.cc,v 1.11 2004/01/21 17:29:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "RunAction.hh" + +#include "PrimaryGeneratorAction.hh" #include "RunActionMessenger.hh" +#include "HistoManager.hh" +#include "EmAcceptance.hh" #include "G4Run.hh" #include "G4RunManager.hh" #include "G4UnitsTable.hh" #include "Randomize.hh" -#include - -#ifdef G4ANALYSIS_USE - #include "AIDA/AIDA.h" -#endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -RunAction::RunAction(DetectorConstruction* det) -:Detector(det) +RunAction::RunAction(DetectorConstruction* det, PrimaryGeneratorAction* prim, + HistoManager* hist) +:Detector(det), Primary(prim), histoManager(hist) { runMessenger = new RunActionMessenger(this); - - fileName = "testem3.paw"; - for (G4int k=0; kSetHisto: " << title << " ; " << nbins << " bins from " - << hmin[k] << " " + unit << " to " << hmax[k] << " " + unit << G4endl; -#endif -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - void RunAction::BeginOfRunAction(const G4Run* aRun) { G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; @@ -102,32 +77,13 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) sumEAbs[k] = sum2EAbs[k] = sumLAbs[k] = sum2LAbs[k] = sumEleav[k]= sum2Eleav[k] = 0.; } - + //histograms // #ifdef G4ANALYSIS_USE - // Creating the analysis factory - std::auto_ptr af(AIDA_createAnalysisFactory()); - - // Creating the tree factory - std::auto_ptr tf(af->createTreeFactory()); - - // Creating a tree mapped to an hbook file. - G4bool readOnly = false; - G4bool createNew = true; - tree = tf->create(fileName, "hbook", readOnly, createNew); - - // Creating a histogram factory, whose histograms will be handled by the tree - hf = af->createHistogramFactory(*tree); - - // histograms - for (G4int k=0; k 0) - histo[k] = hf->createHistogram1D(hid[k],htitle[k],hbins[k],hmin[k],hmax[k]); - else histo[k] = 0; - } -#endif - + histoManager->SetFactory(); +#endif + //example of print dEdx tables // ////PrintDedxTables(); @@ -137,7 +93,7 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) void RunAction::fillPerEvent(G4int kAbs, G4double EAbs, G4double LAbs, G4double Eleav) -{ +{ //accumulate statistic // sumEAbs[kAbs] += EAbs; sum2EAbs[kAbs] += EAbs*EAbs; @@ -153,58 +109,79 @@ void RunAction::EndOfRunAction(const G4Run* aRun) //compute and print statistic // G4int NbOfEvents = aRun->GetNumberOfEvent(); - G4double norme = 1./NbOfEvents; + G4double norm = 1.0/NbOfEvents; + G4double qnorm = sqrt(norm); + G4double beamEnergy = Primary->GetParticleGun()->GetParticleEnergy(); + G4double sqbeam = sqrt(beamEnergy/GeV); - G4double MeanEAbs,rmsEAbs,MeanLAbs,rmsLAbs,MeanEleav,rmsEleav; + G4double MeanEAbs,MeanEAbs2,rmsEAbs,resolution,rmsres; + G4double MeanLAbs,MeanLAbs2,rmsLAbs; std::ios::fmtflags mode = G4cout.flags(); - G4cout.setf(std::ios::fixed,std::ios::floatfield); G4int prec = G4cout.precision(2); - - G4cout << "\n-------------------------------------------------------------\n" - << std::setw(51) << "total energy dep" - << std::setw(30) << "total tracklen" - << std::setw(40) << "mean energy leaving per layer \n \n"; + G4cout << "\n------------------------------------------------------------\n"; + G4cout << std::setw( 8) << "material" + << std::setw(23) << "Total Edep" + << std::setw(27) << "sqrt(E0(GeV))*rmsE/Emean" + << std::setw(23) << "total tracklen \n \n"; for (G4int k=0; kGetNbOfAbsor(); k++) { - MeanEAbs = norme*sumEAbs[k]; - rmsEAbs = norme*sqrt(abs(NbOfEvents*sum2EAbs[k] - sumEAbs[k]*sumEAbs[k])); + MeanEAbs = sumEAbs[k]*norm; + MeanEAbs2 = sum2EAbs[k]*norm; + rmsEAbs = sqrt(abs(MeanEAbs2 - MeanEAbs*MeanEAbs)); + resolution= 100.*sqbeam*rmsEAbs/MeanEAbs; + rmsres = resolution*qnorm; - MeanLAbs = norme*sumLAbs[k]; - rmsLAbs = norme*sqrt(abs(NbOfEvents*sum2LAbs[k] - sumLAbs[k]*sumLAbs[k])); - - MeanEleav = norme*sumEleav[k]; - rmsEleav=norme*sqrt(abs(NbOfEvents*sum2Eleav[k]-sumEleav[k]*sumEleav[k])); + MeanLAbs = sumLAbs[k]*norm; + MeanLAbs2 = sum2LAbs[k]*norm; + rmsLAbs = sqrt(abs(MeanLAbs2 - MeanLAbs*MeanLAbs)); //print // G4cout - << " Absorber" << k - << " (" << std::setw(12) << Detector->GetAbsorMaterial(k)->GetName() - << ") :" - << std::setw( 7) << G4BestUnit(MeanEAbs,"Energy") << " +- " - << std::setw( 5) << G4BestUnit( rmsEAbs,"Energy") - << std::setw(12) << G4BestUnit(MeanLAbs,"Length") << " +- " - << std::setw( 5) << G4BestUnit( rmsLAbs,"Length") - << std::setw(22) << G4BestUnit(MeanEleav,"Energy") << " +- " - << std::setw( 5) << G4BestUnit( rmsEleav,"Energy") - << G4endl; + << std::setw(10) << Detector->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 << "\n-------------------------------------------------------------"; - G4cout << G4endl; G4cout.setf(mode,std::ios::floatfield); G4cout.precision(prec); + // Acceptance + EmAcceptance acc; + G4bool isStarted = false; + for (G4int j=0; jGetNbOfAbsor(); j++) { + if (limittrue[j] < DBL_MAX) { + if (!isStarted) { + acc.BeginOfAcceptance("Sampling Calorimeter",NbOfEvents); + isStarted = true; + } + MeanEAbs = sumEAbs[j]*norm; + MeanEAbs2 = sum2EAbs[j]*norm; + rmsEAbs = sqrt(abs(MeanEAbs2 - MeanEAbs*MeanEAbs)); + G4String mat = Detector->GetAbsorMaterial(j)->GetName(); + acc.EmAcceptanceGauss("Edep"+mat, NbOfEvents, MeanEAbs, + edeptrue[j], rmstrue[j], limittrue[j]); + acc.EmAcceptanceGauss("Erms"+mat, NbOfEvents, rmsEAbs, + rmstrue[j], rmstrue[j], 2.0*limittrue[j]); + } + } + if(isStarted) acc.EndOfAcceptance(); + //save histograms and delete factory - // + // #ifdef G4ANALYSIS_USE - tree->commit(); // Writing the histograms to the file - tree->close(); // and closing the tree (and the file) - G4cout << "---> Histograms are saved" << G4endl; - delete hf; - delete tree; + histoManager->SaveFactory(); #endif // show Rndm status @@ -218,7 +195,7 @@ void RunAction::EndOfRunAction(const G4Run* aRun) #include "G4Gamma.hh" #include "G4Electron.hh" #include "G4ProductionCutsTable.hh" -#include "G4EnergyLossTables.hh" +#include "G4LossTableManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -259,16 +236,20 @@ void RunAction::PrintDedxTables() G4ParticleDefinition* part = G4ParticleTable::GetParticleTable()->FindParticle("mu+"); - const G4ProductionCutsTable* theCoupleTable= + + G4ProductionCutsTable* theCoupleTable = G4ProductionCutsTable::GetProductionCutsTable(); - + size_t numOfCouples = theCoupleTable->GetTableSize(); + const G4MaterialCutsCouple* couple = 0; for (G4int iab=0;iab < Detector->GetNbOfAbsor(); iab++) { G4Material* mat = Detector->GetAbsorMaterial(iab); - G4int index = mat->GetIndex(); - const G4MaterialCutsCouple* couple = - theCoupleTable->GetMaterialCutsCouple(index); + G4int index = 0; + for (size_t i=0; iGetMaterialCutsCouple(i); + if (couple->GetMaterial() == mat) {index = i; break;} + } G4cout << "\nLIST"; G4cout << "\nC \nC dE/dx (MeV/cm) for " << part->GetParticleName() << " in " << mat ->GetName() << "\nC"; @@ -293,7 +274,8 @@ void RunAction::PrintDedxTables() G4cout << "\nG4VAL \n "; for (G4int l=0;lGetDEDX(part,tk[l],couple); G4cout << dedx/(MeV/cm) << "\t"; if ((l+1)%ncolumn == 0) G4cout << "\n "; } @@ -305,3 +287,14 @@ void RunAction::PrintDedxTables() } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void RunAction::SetEdepAndRMS(G4int i, G4ThreeVector Value) +{ + if (i>=0 && iSetGuidance("set name for the histograms file"); + accCmd1 = new G4UIcmdWith3Vector("/testem/run/acceptanceL1",this); + accCmd1->SetGuidance("set Edep and RMS"); + accCmd1->SetGuidance("acceptance values for first layer"); + accCmd1->SetParameterName("edep","rms","limit",true); + accCmd1->SetRange("edep>0 && edep<1 && rms>0"); + accCmd1->AvailableForStates(G4State_PreInit,G4State_Idle); - HistoCmd = new G4UIcommand("/testem/run/setHisto",this); - HistoCmd->SetGuidance("Set histo Edep in absorber k"); - HistoCmd->SetGuidance(" histo=absor number : from 0 to NbOfAbsor-1"); - HistoCmd->SetGuidance(" nb bins; Emin; Emax; unit (of Emin and Emax"); - // - G4UIparameter* AbsNbPrm = new G4UIparameter("AbsorNb",'i',false); - AbsNbPrm->SetGuidance("histo=absor number : from 0 to NbOfAbsor-1"); - AbsNbPrm->SetParameterRange("AbsorNb>=0"); - HistoCmd->SetParameter(AbsNbPrm); - // - G4UIparameter* NbinPrm = new G4UIparameter("Nbin",'i',false); - NbinPrm->SetGuidance("number of bins"); - NbinPrm->SetParameterRange("Nbin>=0"); - HistoCmd->SetParameter(NbinPrm); - // - G4UIparameter* VminPrm = new G4UIparameter("Vmin",'d',false); - VminPrm->SetGuidance("Emin, expressed in unit"); - HistoCmd->SetParameter(VminPrm); - // - G4UIparameter* VmaxPrm = new G4UIparameter("Vmax",'d',false); - VmaxPrm->SetGuidance("Emax, expressed in unit"); - HistoCmd->SetParameter(VmaxPrm); - // - G4UIparameter* UnitPrm = new G4UIparameter("unit",'s',false); - HistoCmd->SetParameter(UnitPrm); + accCmd2 = new G4UIcmdWith3Vector("/testem/run/acceptanceL2",this); + accCmd2->SetGuidance("set Edep and RMS"); + accCmd2->SetGuidance("acceptance values for 2nd layer"); + accCmd2->SetParameterName("edep","rms","limit",true); + accCmd2->SetRange("edep>0 && edep<1 && rms>0"); + accCmd2->AvailableForStates(G4State_PreInit,G4State_Idle); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... RunActionMessenger::~RunActionMessenger() { - delete HistoCmd; - delete fileCmd; + delete accCmd1; + delete accCmd2; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunActionMessenger::SetNewValue(G4UIcommand* command,G4String newValue) -{ - if (command == fileCmd) Run->SetFileName(newValue); +{ + if( command == accCmd1 ) + { Run->SetEdepAndRMS(0,accCmd1->GetNew3VectorValue(newValue));} - if (command == HistoCmd) - { G4int idh,nbins; G4double vmin,vmax; char unts[30]; - const char* t = newValue; - std::istrstream is((char*)t); - is >> idh >> nbins >> vmin >> vmax >> unts; - G4String unit = unts; - G4double vUnit = G4UIcommand::ValueOf(unit); - Run->SetHisto (idh,nbins,vmin*vUnit,vmax*vUnit,unit); - } + if( command == accCmd2 ) + { Run->SetEdepAndRMS(1,accCmd2->GetNew3VectorValue(newValue));} } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm3/src/SteppingAction.cc b/examples/extended/electromagnetic/TestEm3/src/SteppingAction.cc index acb4d07f5c..7cd185144f 100644 --- a/examples/extended/electromagnetic/TestEm3/src/SteppingAction.cc +++ b/examples/extended/electromagnetic/TestEm3/src/SteppingAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: SteppingAction.cc,v 1.9 2004/01/21 17:29:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.cc,v 1.10 2004/03/16 18:06:17 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -67,8 +67,8 @@ void SteppingAction::UserSteppingAction(const G4Step* aStep) // sum up per event eventAct->SumEnergy(absorNo,edep,stepl); - // energy leaving each volume - if (track->GetNextVolume() != volume) { + // energy from secondaries leaving each volume + if ((track->GetTrackID() != 1)&&(track->GetNextVolume() != volume)) { G4double EnLeaving = track->GetKineticEnergy(); if (track->GetDefinition() == G4Positron::Positron()) EnLeaving += 2*electron_mass_c2; diff --git a/examples/extended/electromagnetic/TestEm3/tbhec.mac b/examples/extended/electromagnetic/TestEm3/tbhec.mac index 42a4f3c3b1..dcb6db0a04 100644 --- a/examples/extended/electromagnetic/TestEm3/tbhec.mac +++ b/examples/extended/electromagnetic/TestEm3/tbhec.mac @@ -1,4 +1,4 @@ -# $Id: tbhec.mac,v 1.6 2004/01/21 17:29:22 maire Exp $ +# $Id: tbhec.mac,v 1.10 2004/06/16 10:35:41 maire Exp $ # # Macro file for "TestEm3.cc" # @@ -13,44 +13,20 @@ /testem/det/setAbsor 1 Copper 2.5 cm /testem/det/setSizeYZ 17 cm # -##/testem/phys/addPhysics g4v52 +####/testem/phys/addPhysics g4v52 /testem/phys/addPhysics standard +/testem/phys/setCuts 0.07 mm # /run/initialize # -/testem/run/setHisto 0 100 0. 100. MeV -/testem/run/setHisto 1 100 900. 1000. MeV +/testem/histo/setFileName 10gev.paw +/testem/histo/setHisto 0 100 0. 1000. MeV +/testem/histo/setHisto 1 100 9. 10. GeV # /gun/particle e- -/gun/energy 1 GeV +/gun/energy 10 GeV /gun/position -40.635 0 0 # -/testem/phys/setCuts 10. mm -/testem/run/setFileName tb_1_10000.paw -/testem/event/printModulo 1000 -/run/beamOn 10000 -# -/testem/phys/setCuts 7. mm -/testem/run/setFileName tb_1_7000.paw -/run/beamOn 10000 -# -/testem/phys/setCuts 1. mm -/testem/run/setFileName tb_1_1000.paw -/run/beamOn 10000 -# -/testem/phys/setCuts 0.7 mm -/testem/run/setFileName tb_1_700.paw -/run/beamOn 10000 -# -/testem/phys/setCuts 0.1 mm -/testem/run/setFileName tb_1_100.paw -/run/beamOn 10000 -# -/testem/phys/setCuts 0.07 mm -/testem/run/setFileName tb_1_70.paw -/run/beamOn 10000 -# -/testem/phys/setCuts 0.01 mm -/testem/run/setFileName tb_1_10.paw -/run/beamOn 10000 -# +/testem/event/printModulo 100 +/run/beamOn 1000 + diff --git a/examples/extended/electromagnetic/TestEm4/GNUmakefile b/examples/extended/electromagnetic/TestEm4/GNUmakefile index 95965dead8..176a1e62e8 100644 --- a/examples/extended/electromagnetic/TestEm4/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm4/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.9 2003/10/06 14:51:14 maire Exp $ +# $Id: GNUmakefile,v 1.12 2004/06/21 10:55:09 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,21 +14,26 @@ endif .PHONY: all all: lib bin -####G4ANALYSIS_USE := true +#### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE - CPPFLAGS += -DG4ANALYSIS_USE +USE_AIDA := true endif + +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA +endif + include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` endif include $(G4INSTALL)/config/binmake.gmk - + visclean: rm -f g4*.prim g4*.eps g4*.wrl rm -f .DAWN_* diff --git a/examples/extended/electromagnetic/TestEm4/History b/examples/extended/electromagnetic/TestEm4/History index 8e184ac399..8e17361cee 100644 --- a/examples/extended/electromagnetic/TestEm4/History +++ b/examples/extended/electromagnetic/TestEm4/History @@ -1,4 +1,4 @@ -$Id: History,v 1.28 2003/11/25 18:36:18 vnivanch Exp $ +$Id: History,v 1.32 2004/06/21 10:55:10 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,18 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +21-06-04 mma (testem4-V0-01-01) +- remove direct ROOT interface + +30-03-04 mma (testem4-V0-01-00) +- README: more information about ROOT installation + +15-03-04 mma (testem4-V06-00-01) +- put back G4ANALYSIS_USE in GNUmakefile + +27-02-04 mma (testem4-V06-00-00) +- example of histogram with ROOT: USE_ROOT 25-11-03 V.Ivanchenko (testem4-V05-02-03) diff --git a/examples/extended/electromagnetic/TestEm4/README b/examples/extended/electromagnetic/TestEm4/README index 63f5fa7db1..b9fd23fb67 100644 --- a/examples/extended/electromagnetic/TestEm4/README +++ b/examples/extended/electromagnetic/TestEm4/README @@ -1,4 +1,4 @@ -$Id: README,v 1.8 2003/10/06 14:51:15 maire Exp $ +$Id: README,v 1.14 2004/06/23 11:30:23 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -40,7 +40,7 @@ $Id: README,v 1.8 2003/10/06 14:51:15 maire Exp $ 5- PHYSICS SURVEY - the energy deposited in C6F6 is histogramed + The energy deposited in C6F6 is histogramed. 6- HOW TO START ? @@ -58,28 +58,43 @@ $Id: README,v 1.8 2003/10/06 14:51:15 maire Exp $ .... Idle> exit - - visualize the histogram + - visualize the histogram (aida) paw> h/file 1 testem4.paw paw> option stat paw> option logy paw> h/pl 1 Note that, by default, histograms are disabled. To activate them, uncomment - the flag G4ANALYSIS_USE in GNUmakefile. + the flag G4ANALYSIS_USE in GNUmakefile. - 7- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- + 7- Using histograms + ------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` diff --git a/examples/extended/electromagnetic/TestEm4/TestEm4.out b/examples/extended/electromagnetic/TestEm4/TestEm4.out index f254612e17..85f745748c 100644 --- a/examples/extended/electromagnetic/TestEm4/TestEm4.out +++ b/examples/extended/electromagnetic/TestEm4/TestEm4.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -93,11 +93,11 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 50000 - User=16.65s Real=469.57s Sys=41.92s + User=15.51s Real=553.82s Sys=37.47s --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 2009194324, 1256174957 + Current couple of seeds = 1888278667, 436168634 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm4/include/RunAction.hh b/examples/extended/electromagnetic/TestEm4/include/RunAction.hh index 6b78f112a2..39f33785b2 100644 --- a/examples/extended/electromagnetic/TestEm4/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm4/include/RunAction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.hh,v 1.2 2003/10/06 14:51:16 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.hh,v 1.5 2004/06/21 10:55:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -39,13 +39,15 @@ class G4Run; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA namespace AIDA { class ITree; class IHistogram1D; } #endif +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class RunAction : public G4UserRunAction { public: @@ -56,18 +58,19 @@ class RunAction : public G4UserRunAction void BeginOfRunAction(const G4Run*); void EndOfRunAction(const G4Run*); -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} #endif - + private: void bookHisto(); private: -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::ITree* tree; //the tree should only be deleted at the end AIDA::IHistogram1D* histo[1]; // (after writing the histos to file) -#endif +#endif + }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm4/src/EventAction.cc b/examples/extended/electromagnetic/TestEm4/src/EventAction.cc index 5f13bea545..12676b9135 100644 --- a/examples/extended/electromagnetic/TestEm4/src/EventAction.cc +++ b/examples/extended/electromagnetic/TestEm4/src/EventAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventAction.cc,v 1.5 2004/06/21 10:55:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventAction.cc,v 1.2 2003/10/06 14:51:17 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -40,7 +37,7 @@ #include "G4VVisManager.hh" #include "G4UnitsTable.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif @@ -76,15 +73,16 @@ void EventAction::BeginOfEventAction( const G4Event* evt) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void EventAction::EndOfEventAction( const G4Event* evt) -{ +{ if (drawFlag != "none") G4cout << " Energy deposit: " << G4BestUnit(TotalEnergyDeposit,"Energy") << G4endl; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA Run->GetHisto(0)->fill(TotalEnergyDeposit/MeV); #endif + // draw trajectories if(G4VVisManager::GetConcreteInstance()) { G4TrajectoryContainer* trajectoryContainer = evt->GetTrajectoryContainer(); @@ -93,9 +91,9 @@ void EventAction::EndOfEventAction( const G4Event* evt) for(G4int i=0; iGetTrajectoryContainer()))[i]); - if (drawFlag == "all") trj->DrawTrajectory(50); + if (drawFlag == "all") trj->DrawTrajectory(1000); else if ((drawFlag == "charged")&&(trj->GetCharge() != 0.)) - trj->DrawTrajectory(50); + trj->DrawTrajectory(1000); } } } diff --git a/examples/extended/electromagnetic/TestEm4/src/RunAction.cc b/examples/extended/electromagnetic/TestEm4/src/RunAction.cc index f6d49b5b6c..eff2c7cdcb 100644 --- a/examples/extended/electromagnetic/TestEm4/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm4/src/RunAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.cc,v 1.2 2003/10/06 14:51:17 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.cc,v 1.5 2004/06/21 10:55:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -32,12 +32,10 @@ #include "G4Run.hh" #include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" #include "Randomize.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/AIDA.h" #endif @@ -52,20 +50,18 @@ RunAction::RunAction() RunAction::~RunAction() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA tree->commit(); // Writing the histograms to the file - tree->close(); // and closing the tree (and the file) - + tree->close(); // and closing the tree (and the file) delete tree; -#endif - +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::bookHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA // Creating the analysis factory AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); @@ -81,7 +77,8 @@ void RunAction::bookHisto() AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); // Creating the histogram - histo[0]=hf->createHistogram1D("1","total energy deposit in C6F6(MeV)",100,0.,10.); + histo[0]=hf->createHistogram1D + ("1","total energy deposit in C6F6(MeV)",100,0.,10.); delete hf; delete tf; @@ -98,18 +95,12 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) // save Rndm status G4RunManager::GetRunManager()->SetRandomNumberStore(true); HepRandom::showEngineStatus(); - - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::EndOfRunAction(const G4Run*) { - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); - // show Rndm status HepRandom::showEngineStatus(); } diff --git a/examples/extended/electromagnetic/TestEm5/GNUmakefile b/examples/extended/electromagnetic/TestEm5/GNUmakefile index 4c02d46c9a..87415e069c 100644 --- a/examples/extended/electromagnetic/TestEm5/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm5/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.15 2004/02/19 18:18:33 maire Exp $ +# $Id: GNUmakefile,v 1.18 2004/06/21 10:57:09 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,18 +14,18 @@ endif .PHONY: all all: lib bin -###G4ANALYSIS_USE := true +#### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE CPPFLAGS += -DG4ANALYSIS_USE endif include $(G4INSTALL)/config/architecture.gmk - + ifdef G4ANALYSIS_USE # for the aida-config command see the README file CPPFLAGS += `aida-config --include` - LDFLAGS += `aida-config --lib` + LDFLAGS += `aida-config --lib` endif include $(G4INSTALL)/config/binmake.gmk @@ -33,3 +33,6 @@ include $(G4INSTALL)/config/binmake.gmk visclean: rm -f g4*.prim g4*.eps g4*.wrl rm -f .DAWN_* + +histclean: + rm ${G4WORKDIR}/tmp/${G4SYSTEM}/${G4TARGET}/HistoManager.o diff --git a/examples/extended/electromagnetic/TestEm5/History b/examples/extended/electromagnetic/TestEm5/History index 1f0aa4ead1..4e0a22e36b 100644 --- a/examples/extended/electromagnetic/TestEm5/History +++ b/examples/extended/electromagnetic/TestEm5/History @@ -1,4 +1,4 @@ -$Id: History,v 1.39 2004/02/19 18:29:10 maire Exp $ +$Id: History,v 1.45 2004/06/21 10:57:09 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,26 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +21-06-04 mma (testem5-V06-01-04) +- simplifications in HistoManager. + +16-06-04 mma (testem5-V06-01-03) +- print rms of projected angle at exit if histo=6 selected. + +10-06-04 mma (testem5-V06-01-02) +- modify HistoManager and its Messenger in order to allow a multirun job. + +29-04-04 mma (testem5-V06-01-01) +- add physicsLists: HadronElastic, BinaryCascade, IonBinaryCascade (Ivanch.) +- rm physicsLists: Particles, General + +31-03-04 mma (testem5-V06-01-00) +- identical to V06-00-01 + +17-03-04 mma (testem5-V06-00-01) +- new macro dedx.mac +- sign corrected in ComputeMscHighland() 19-02-04 mma (testem5-V06-00-00) - modify histo 7 : projected position at exit diff --git a/examples/extended/electromagnetic/TestEm5/README b/examples/extended/electromagnetic/TestEm5/README index 2309df878f..495ff43ae6 100644 --- a/examples/extended/electromagnetic/TestEm5/README +++ b/examples/extended/electromagnetic/TestEm5/README @@ -1,4 +1,4 @@ -$Id: README,v 1.10 2004/02/19 18:18:42 maire Exp $ +$Id: README,v 1.12 2004/06/23 11:30:08 maire Exp $ ----------------------------------------------------- ========================================================= @@ -97,6 +97,9 @@ $Id: README,v 1.10 2004/02/19 18:18:42 maire Exp $ 16 "(reflect , neutral) : projected angle at exit" The histograms can be viewed using PAW. See below the note on ANAPHE+AIDA. + + One can control the name of the histograms file with the command: + /testem/histo/setFileName name (default testem5.paw) Note that, by default, histograms are disabled. To activate them, uncomment the flag G4ANALYSIS_USE in GNUmakefile. @@ -138,19 +141,41 @@ $Id: README,v 1.10 2004/02/19 18:18:42 maire Exp $ Idle> run/beamOn 5 .... - Note - Using the Anaphe implementation of the AIDA 3.0 histograms: - ------------------------------------------------------------------ - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + 8- Using histograms + ------------------- - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm5/TestEm5.cc b/examples/extended/electromagnetic/TestEm5/TestEm5.cc index c767c80a32..deacd3dbf5 100644 --- a/examples/extended/electromagnetic/TestEm5/TestEm5.cc +++ b/examples/extended/electromagnetic/TestEm5/TestEm5.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: TestEm5.cc,v 1.9 2004/02/19 18:18:42 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: TestEm5.cc,v 1.11 2004/06/18 09:47:48 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -54,36 +54,33 @@ int main(int argc,char** argv) { //choose the Random engine HepRandom::setTheEngine(new RanecuEngine); - + //my Verbose output class G4VSteppingVerbose::SetInstance(new SteppingVerbose); - + // Construct the default run manager G4RunManager * runManager = new G4RunManager; - + // set mandatory initialization classes DetectorConstruction* detector; detector = new DetectorConstruction; runManager->SetUserInitialization(detector); - runManager->SetUserInitialization(new PhysicsList(detector)); - + runManager->SetUserInitialization(new PhysicsList()); + #ifdef G4VIS_USE // visualization manager G4VisManager* visManager = new VisManager; visManager->Initialize(); -#endif +#endif + + HistoManager* histo = new HistoManager(); - HistoManager* histo = 0; -#ifdef G4ANALYSIS_USE - histo = new HistoManager(); -#endif - // set user action classes // //primaryGenerator PrimaryGeneratorAction* primary = new PrimaryGeneratorAction(detector); runManager->SetUserAction(primary); - + //runAction RunAction* runaction = new RunAction(detector,primary,histo); runManager->SetUserAction(runaction); @@ -91,7 +88,7 @@ int main(int argc,char** argv) { //eventAction EventAction* eventaction = new EventAction(runaction,histo); runManager->SetUserAction(eventaction); - + //trackAction TrackingAction* trackingaction = new TrackingAction(detector, runaction, eventaction, histo); diff --git a/examples/extended/electromagnetic/TestEm5/TestEm5.in b/examples/extended/electromagnetic/TestEm5/TestEm5.in index 6454740905..aa7ee7f881 100644 --- a/examples/extended/electromagnetic/TestEm5/TestEm5.in +++ b/examples/extended/electromagnetic/TestEm5/TestEm5.in @@ -1,22 +1,23 @@ -# $Id: TestEm5.in,v 1.11 2003/10/27 11:32:38 maire Exp $ +# $Id: TestEm5.in,v 1.13 2004/06/21 10:57:09 maire Exp $ # # macro file for TestEm5.cc # /control/verbose 2 /run/verbose 2 # -/testem/det/setAbsMat Silicon -/testem/det/setAbsThick 20.5 mum +/testem/det/setAbsMat Silicon +/testem/det/setAbsThick 20.5 mum /testem/det/setAbsYZ 1 mm # /testem/phys/addPhysics standard ###/testem/phys/addPhysics g4v52 # -/testem/phys/setGCut 2.13 mm +/testem/phys/setGCut 2.13 mm /testem/phys/setECut 7.0 mum /testem/phys/setPCut 7.0 mum # /run/initialize +###/testem/histo/setHisto 6 100 -0.25 0.25 mrad # /testem/gun/setDefault /gun/particle pi+ diff --git a/examples/extended/electromagnetic/TestEm5/TestEm5.out b/examples/extended/electromagnetic/TestEm5/TestEm5.out index 8c0431f56d..604447d6ac 100644 --- a/examples/extended/electromagnetic/TestEm5/TestEm5.out +++ b/examples/extended/electromagnetic/TestEm5/TestEm5.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -23,14 +23,15 @@ Current available graphics systems are: VRML2FILE (VRML2FILE) /run/verbose 2 # -/testem/det/setAbsMat Silicon -/testem/det/setAbsThick 20.5 mum +/testem/det/setAbsMat Silicon +/testem/det/setAbsThick 20.5 mum /testem/det/setAbsYZ 1 mm # /testem/phys/addPhysics standard +PhysicsList::AddPhysicsList: ###/testem/phys/addPhysics g4v52 # -/testem/phys/setGCut 2.13 mm +/testem/phys/setGCut 2.13 mm /testem/phys/setECut 7.0 mum /testem/phys/setPCut 7.0 mum # @@ -53,6 +54,7 @@ physicsList->Construct() start. phot: Total cross sections from Sandia parametrisation. physicsList->setCut() start. PhysicsList::SetCuts:CutLength : 1 mm +###/testem/histo/setHisto 6 100 -0.25 0.25 mrad # /testem/gun/setDefault /gun/particle pi+ @@ -107,8 +109,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -117,7 +119,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -135,7 +137,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -200,21 +202,21 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100000 - User=46.49s Real=1044.02s Sys=104.53s + User=45.97s Real=1123.29s Sys=85.2s ======================== run summary ====================== Number of Events = 100000 - Total energy deposit in absorber per event = 6.698 keV +- 21.79 eV + Total energy deposit in absorber per event = 6.7 keV +- 21.82 eV - Total track length (charged) in absorber per event = 20.97 mum +- 15.28 nm - Total track length (neutral) in absorber per event = 3.612 nm +- 3.107 nm + Total track length (charged) in absorber per event = 20.97 mum +- 15.24 nm + Total track length (neutral) in absorber per event = 1.319 nm +- 9.342 Ang - Number of steps (charged) in absorber per event = 1.079 +- 1.236e-05 - Number of steps (neutral) in absorber per event = 3e-05 +- 1.236e-05 + Number of steps (charged) in absorber per event = 1.08 +- 1.234e-05 + Number of steps (neutral) in absorber per event = 3e-05 +- 1.234e-05 - Number of secondaries per event : Gammas = 3e-05; electrons = 0.03757; positrons = 0 + Number of secondaries per event : Gammas = 3e-05; electrons = 0.03719; positrons = 0 Number of events with the primary particle transmitted = 100 % Number of events with at least 1 particle transmitted (same charge as primary) = 100 % @@ -222,11 +224,9 @@ Run Summary Number of events with the primary particle reflected = 0 % Number of events with at least 1 particle reflected (same charge as primary) = 0 % - MultipleScattering: theta0 Highland = 0.02663 mrad - --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1147184665, 872245730 + Current couple of seeds = 1636731634, 910890274 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm5/dedx.mac b/examples/extended/electromagnetic/TestEm5/dedx.mac new file mode 100644 index 0000000000..395e0b5fc3 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm5/dedx.mac @@ -0,0 +1,30 @@ +# $Id: dedx.mac,v 1.1 2004/03/17 14:03:38 maire Exp $ +# +# macro file for TestEm5.cc +# +# to control dE/dx calculation +# +/control/verbose 2 +/run/verbose 2 +# +/testem/det/setAbsMat Water +/testem/det/setAbsThick 1 cm +/testem/det/setAbsYZ 1 cm +# +###/testem/phys/addPhysics g4v52 +/testem/phys/addPhysics standard +/testem/phys/setCuts 1 km +# +/run/initialize +# +/process/inactivate msc +/process/eLoss/fluct false +# +/testem/gun/setDefault +/gun/particle mu+ +/gun/energy 300 MeV +# +/testem/stepMax 1 mm +/tracking/verbose 1 +# +/run/beamOn 2 diff --git a/examples/extended/electromagnetic/TestEm5/include/DetectorConstruction.hh b/examples/extended/electromagnetic/TestEm5/include/DetectorConstruction.hh index 19531e54ad..8a32c64282 100644 --- a/examples/extended/electromagnetic/TestEm5/include/DetectorConstruction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/DetectorConstruction.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: DetectorConstruction.hh,v 1.5 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: DetectorConstruction.hh,v 1.4 2004/02/19 18:18:51 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/DetectorMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/DetectorMessenger.hh index 2d705f659a..07ed3f7162 100644 --- a/examples/extended/electromagnetic/TestEm5/include/DetectorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/DetectorMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: DetectorMessenger.hh,v 1.3 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: DetectorMessenger.hh,v 1.2 2003/10/07 11:58:28 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/EventAction.hh b/examples/extended/electromagnetic/TestEm5/include/EventAction.hh index fac05d53ef..91e7d5be05 100644 --- a/examples/extended/electromagnetic/TestEm5/include/EventAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/EventAction.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventAction.hh,v 1.2 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventAction.hh,v 1.1 2003/08/11 10:13:02 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/EventMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/EventMessenger.hh index e8f7bcedfd..d82cd92905 100644 --- a/examples/extended/electromagnetic/TestEm5/include/EventMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/EventMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventMessenger.hh,v 1.3 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventMessenger.hh,v 1.2 2003/10/07 11:58:28 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/HistoManager.hh b/examples/extended/electromagnetic/TestEm5/include/HistoManager.hh index 2181abab25..cecd1d5ca1 100644 --- a/examples/extended/electromagnetic/TestEm5/include/HistoManager.hh +++ b/examples/extended/electromagnetic/TestEm5/include/HistoManager.hh @@ -20,20 +20,15 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: HistoManager.hh,v 1.6 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: HistoManager.hh,v 1.3 2003/11/03 12:58:52 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #ifndef HistoManager_h #define HistoManager_h 1 -#ifdef G4ANALYSIS_USE - #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,40 +37,53 @@ namespace AIDA { class ITree; class IHistogramFactory; class IHistogram1D; -} +} class HistoMessenger; - const G4int MaxHisto = 17; +const G4int MaxHisto = 17; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... class HistoManager { public: + HistoManager(); ~HistoManager(); - - void SetFactory(G4String); - void SetHisto (G4int, G4int, G4double, G4double, G4String unit="none"); - - AIDA::ITree* GetTree() {return tree;} - AIDA::IHistogramFactory* GetHistogramFactory() {return hf;} - AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} - G4double GetHistoUnit(G4int id) {return histoUnit[id];} - G4double GetBinWidth (G4int id) {return binWidth[id];} + + void SetFileName (const G4String& name) { fileName = name;}; + void SetFileType (const G4String& name) { fileType = name;}; + void book(); + void save(); + void SetHisto (G4int,G4int,G4double,G4double,const G4String& unit="none"); + void FillHisto(G4int id, G4double e, G4double weight = 1.0); + void RemoveHisto (G4int); + + G4bool HistoExist (G4int id) {return exist[id];} + G4double GetHistoUnit(G4int id) {return Unit[id];} + G4double GetBinWidth (G4int id) {return Width[id];} + private: + + G4String fileName; + G4String fileType; AIDA::ITree* tree; - AIDA::IHistogramFactory* hf; + AIDA::IHistogramFactory* hf; AIDA::IHistogram1D* histo[MaxHisto]; - G4double histoUnit[MaxHisto]; - G4double binWidth[MaxHisto]; - G4bool factoryOn; + G4bool exist[MaxHisto]; + G4String Label[MaxHisto]; + G4String Title[MaxHisto]; + G4int Nbins[MaxHisto]; + G4double Vmin [MaxHisto]; + G4double Vmax [MaxHisto]; + G4double Unit [MaxHisto]; + G4double Width[MaxHisto]; + G4bool factoryOn; HistoMessenger* histoMessenger; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif -#endif diff --git a/examples/extended/electromagnetic/TestEm5/include/HistoMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/HistoMessenger.hh index b017fd675e..83b0216193 100644 --- a/examples/extended/electromagnetic/TestEm5/include/HistoMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/HistoMessenger.hh @@ -20,21 +20,15 @@ // * statement, and all its terms. * // ******************************************************************** // - +// $Id: HistoMessenger.hh,v 1.5 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: HistoMessenger.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #ifndef HistoMessenger_h #define HistoMessenger_h 1 -#ifdef G4ANALYSIS_USE - #include "G4UImessenger.hh" #include "globals.hh" @@ -44,6 +38,7 @@ class HistoManager; class G4UIdirectory; class G4UIcommand; class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -62,11 +57,13 @@ class HistoMessenger: public G4UImessenger G4UIdirectory* histoDir; G4UIcmdWithAString* factoryCmd; - G4UIcommand* histoCmd; - + G4UIcmdWithAString* typeCmd; + G4UIcommand* histoCmd; + G4UIcmdWithAnInteger* rmhistoCmd; + }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif -#endif + diff --git a/examples/extended/electromagnetic/TestEm5/include/IonC12.hh b/examples/extended/electromagnetic/TestEm5/include/IonC12.hh index 00c6caf18f..9710f2ad74 100644 --- a/examples/extended/electromagnetic/TestEm5/include/IonC12.hh +++ b/examples/extended/electromagnetic/TestEm5/include/IonC12.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: IonC12.hh,v 1.3 2003/08/11 10:26:24 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: IonC12.hh,v 1.4 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Each class inheriting from G4VIon // corresponds to a particle type; one and only one diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListBinaryCascade.hh b/examples/extended/electromagnetic/TestEm5/include/PhysListBinaryCascade.hh new file mode 100644 index 0000000000..576f9a0f62 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm5/include/PhysListBinaryCascade.hh @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysListBinaryCascade.hh,v 1.2 2004/04/29 13:55:09 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Class Description: +// This class is an derived class of G4VPhysicsConstructor +// It is provide PhysicsList for Binary Cascade for +// protons and neutrons with the energy E<3 GeV +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysListBinaryCascade_h +#define PhysListBinaryCascade_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" +#include "G4ProtonInelasticProcess.hh" +#include "G4NeutronInelasticProcess.hh" +#include "G4ProtonInelasticCrossSection.hh" +#include "G4NeutronInelasticCrossSection.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class PhysListBinaryCascade : public G4VPhysicsConstructor +{ + public: + PhysListBinaryCascade(const G4String& name = "binary"); + ~PhysListBinaryCascade(); + + 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(); + + private: + + G4ProtonInelasticProcess theIPproton; + G4NeutronInelasticProcess theIPneutron; + G4ProtonInelasticCrossSection thePXSec; + G4NeutronInelasticCrossSection theNXSec; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListEmG4v52.hh b/examples/extended/electromagnetic/TestEm5/include/PhysListEmG4v52.hh index 887f1bf6f2..36275fbe78 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PhysListEmG4v52.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PhysListEmG4v52.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListEmG4v52.hh,v 1.1 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmG4v52.hh,v 1.3 2004/06/21 10:57:10 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListEmStandard.hh b/examples/extended/electromagnetic/TestEm5/include/PhysListEmStandard.hh index 36aa87c9d1..9843df0818 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PhysListEmStandard.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PhysListEmStandard.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListEmStandard.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.hh,v 1.4 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm1/include/PhysListGeneral.hh b/examples/extended/electromagnetic/TestEm5/include/PhysListHadronElastic.hh similarity index 75% rename from examples/extended/electromagnetic/TestEm1/include/PhysListGeneral.hh rename to examples/extended/electromagnetic/TestEm5/include/PhysListHadronElastic.hh index 62ca6ac6d3..0b5c4621e0 100644 --- a/examples/extended/electromagnetic/TestEm1/include/PhysListGeneral.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PhysListHadronElastic.hh @@ -20,29 +20,34 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PhysListHadronElastic.hh,v 1.3 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PhysListGeneral.hh,v 1.1 2003/10/06 10:02:25 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// Class Description: +// This class is an derived class of G4VPhysicsConstructor +// It is provide PhysicsList for hadron eleastic process // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListGeneral_h -#define PhysListGeneral_h 1 +#ifndef PhysListHadronElastic_h +#define PhysListHadronElastic_h 1 #include "G4VPhysicsConstructor.hh" +#include "G4HadronElasticProcess.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListGeneral : public G4VPhysicsConstructor +class PhysListHadronElastic : public G4VPhysicsConstructor { public: - PhysListGeneral(const G4String& name = "general"); - ~PhysListGeneral(); + PhysListHadronElastic(const G4String& name = "elastic"); + virtual ~PhysListHadronElastic(); public: - // This method is dummy for physics + // 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. @@ -50,6 +55,9 @@ class PhysListGeneral : public G4VPhysicsConstructor // registered to the process manager of each particle type void ConstructProcess(); + private: + // Elastic Process + G4HadronElasticProcess theElasticProcess; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListIonBinaryCascade.hh b/examples/extended/electromagnetic/TestEm5/include/PhysListIonBinaryCascade.hh new file mode 100644 index 0000000000..ff5a4857ce --- /dev/null +++ b/examples/extended/electromagnetic/TestEm5/include/PhysListIonBinaryCascade.hh @@ -0,0 +1,77 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysListIonBinaryCascade.hh,v 1.3 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Class Description: +// This class is an derived class of G4VPhysicsConstructor +// It is provide PhysicsList for Binary Cascade for +// protons and neutrons with the energy E<3 GeV +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#ifndef PhysListIonBinaryCascade_h +#define PhysListIonBinaryCascade_h 1 + +#include "G4VPhysicsConstructor.hh" +#include "globals.hh" +#include "G4DeuteronInelasticProcess.hh" +#include "G4TritonInelasticProcess.hh" +#include "G4AlphaInelasticProcess.hh" + +class G4HadronInelasticProcess; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + +class PhysListIonBinaryCascade : public G4VPhysicsConstructor +{ + public: + PhysListIonBinaryCascade(const G4String& name = "binary_ion"); + ~PhysListIonBinaryCascade(); + + 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(); + + private: + + G4DeuteronInelasticProcess theIPdeuteron; + G4TritonInelasticProcess theIPtriton; + G4AlphaInelasticProcess theIPalpha; + G4HadronInelasticProcess* theIPHe3; + G4HadronInelasticProcess* theIPIonC12; + G4HadronInelasticProcess* theIPGenericIon; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysicsList.hh b/examples/extended/electromagnetic/TestEm5/include/PhysicsList.hh index 5cc95893df..88fe0aaafd 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PhysicsList.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PhysicsList.hh @@ -20,13 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysicsList.hh,v 1.1 2003/08/11 10:14:07 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -// -// 14.10.02 (V.Ivanchenko) provide modular list on base of old PhysicsList +// $Id: PhysicsList.hh,v 1.4 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -38,7 +33,6 @@ #include "globals.hh" class G4VPhysicsConstructor; -class DetectorConstruction; class StepMax; class PhysicsListMessenger; @@ -47,38 +41,36 @@ class PhysicsListMessenger; class PhysicsList: public G4VModularPhysicsList { public: - PhysicsList(DetectorConstruction*); + PhysicsList(); ~PhysicsList(); void ConstructParticle(); + + void AddPhysicsList(const G4String& name); + + void ConstructProcess(); + void AddDecay(); + void AddStepMax(); + StepMax* GetStepMaxProcess() {return stepMaxProcess;}; void SetCuts(); - void SetCutForGamma (G4double); + void SetCutForGamma(G4double); void SetCutForElectron(G4double); void SetCutForPositron(G4double); - void AddPhysicsList(const G4String& name); - void ConstructProcess(); - - void AddStepMax(); - StepMax* GetStepMaxProcess() {return stepMaxProcess;} - - G4double GetRange(G4double); - - private: + + PhysicsListMessenger* pMessenger; + + G4String emName; + G4VPhysicsConstructor* emPhysicsList; + std::vector hadronPhys; + + StepMax* stepMaxProcess; + G4double cutForGamma; G4double cutForElectron; - G4double cutForPositron; - - DetectorConstruction* pDet; - PhysicsListMessenger* pMessenger; - - G4VPhysicsConstructor* particleList; - G4VPhysicsConstructor* generalPhysicsList; - G4VPhysicsConstructor* emPhysicsList; - G4String emName; - StepMax* stepMaxProcess; + G4double cutForPositron; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysicsListMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/PhysicsListMessenger.hh index 0b30840636..ad1af076f7 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PhysicsListMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PhysicsListMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PhysicsListMessenger.hh,v 1.5 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PhysicsListMessenger.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -36,8 +33,8 @@ #include "globals.hh" class PhysicsList; -class G4UIcmdWithADoubleAndUnit; class G4UIcmdWithAString; +class G4UIcmdWithADoubleAndUnit; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -54,13 +51,11 @@ class PhysicsListMessenger: public G4UImessenger PhysicsList* pPhysicsList; + G4UIcmdWithAString* pListCmd; G4UIcmdWithADoubleAndUnit* gammaCutCmd; G4UIcmdWithADoubleAndUnit* electCutCmd; - G4UIcmdWithADoubleAndUnit* positCutCmd; - G4UIcmdWithADoubleAndUnit* allCutCmd; - G4UIcmdWithADoubleAndUnit* rangeCmd; - G4UIcmdWithAString* pListCmd; - + G4UIcmdWithADoubleAndUnit* protoCutCmd; + G4UIcmdWithADoubleAndUnit* allCutCmd; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorAction.hh b/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorAction.hh index a3aac08c18..766743a1ba 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorAction.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PrimaryGeneratorAction.hh,v 1.3 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PrimaryGeneratorAction.hh,v 1.2 2004/02/19 18:18:51 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorMessenger.hh index 1d8b765324..0ea94d6e39 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/PrimaryGeneratorMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PrimaryGeneratorMessenger.hh,v 1.2 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PrimaryGeneratorMessenger.hh,v 1.1 2003/08/11 10:14:49 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/RunAction.hh b/examples/extended/electromagnetic/TestEm5/include/RunAction.hh index 251d5fdb5c..ef93a7710e 100644 --- a/examples/extended/electromagnetic/TestEm5/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/RunAction.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunAction.hh,v 1.5 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunAction.hh,v 1.2 2004/02/19 18:18:51 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -59,45 +56,49 @@ class RunAction : public G4UserRunAction void BeginOfRunAction(const G4Run*); void EndOfRunAction(const G4Run*); - void AddEnergy (G4double edep) + void AddEnergy (G4double edep) {EnergyDeposit += edep; EnergyDeposit2 += edep*edep;}; - + void AddTrakLenCharg (G4double length) {TrakLenCharged += length; TrakLenCharged2 += length*length;}; - + void AddTrakLenNeutr (G4double length) {TrakLenNeutral += length; TrakLenNeutral2 += length*length;}; - + + void AddMscProjTheta (G4double theta) + {MscProjecTheta += theta; MscProjecTheta2 += theta*theta;}; + void CountStepsCharg (G4int nSteps) {nbStepsCharged += nSteps; nbStepsCharged2 += nSteps*nSteps;}; - + void CountStepsNeutr (G4int nSteps) {nbStepsNeutral += nSteps; nbStepsNeutral2 += nSteps*nSteps;}; - + void CountParticles (G4ParticleDefinition* part) { if (part == G4Gamma::Gamma()) nbGamma++ ; else if (part == G4Electron::Electron()) nbElect++ ; else if (part == G4Positron::Positron()) nbPosit++ ; }; - + void CountTransmit (G4int flag) { if (flag == 1) Transmit[0]++; - else if (flag == 2) {Transmit[0]++; Transmit[1]++; }}; - + else if (flag == 2) {Transmit[0]++; Transmit[1]++; }}; + void CountReflect (G4int flag) { if (flag == 1) Reflect[0]++; - else if (flag == 2) {Reflect[0]++; Reflect[1]++; }}; - + else if (flag == 2) {Reflect[0]++; Reflect[1]++; }}; + G4double ComputeMscHighland(); - + private: G4double EnergyDeposit, EnergyDeposit2; G4double TrakLenCharged, TrakLenCharged2; G4double TrakLenNeutral, TrakLenNeutral2; G4double nbStepsCharged, nbStepsCharged2; G4double nbStepsNeutral, nbStepsNeutral2; + G4double MscProjecTheta, MscProjecTheta2; G4int nbGamma, nbElect, nbPosit; G4int Transmit[2], Reflect[2]; - + DetectorConstruction* detector; PrimaryGeneratorAction* primary; HistoManager* histoManager; diff --git a/examples/extended/electromagnetic/TestEm5/include/StackingAction.hh b/examples/extended/electromagnetic/TestEm5/include/StackingAction.hh index 738ceb2e69..06e8c48493 100644 --- a/examples/extended/electromagnetic/TestEm5/include/StackingAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/StackingAction.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: StackingAction.hh,v 1.1 2003/08/11 10:15:05 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: StackingAction.hh,v 1.2 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/StackingMessenger.hh b/examples/extended/electromagnetic/TestEm5/include/StackingMessenger.hh index 663d3357db..ab7843e300 100644 --- a/examples/extended/electromagnetic/TestEm5/include/StackingMessenger.hh +++ b/examples/extended/electromagnetic/TestEm5/include/StackingMessenger.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: StackingMessenger.hh,v 1.3 2004/06/21 10:57:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: StackingMessenger.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/StepMax.hh b/examples/extended/electromagnetic/TestEm5/include/StepMax.hh index d634828ad5..8af9b7b72b 100644 --- a/examples/extended/electromagnetic/TestEm5/include/StepMax.hh +++ b/examples/extended/electromagnetic/TestEm5/include/StepMax.hh @@ -20,11 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: StepMax.hh,v 1.2 2004/06/21 10:57:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: StepMax.hh,v 1.1 2003/08/11 10:15:32 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/SteppingAction.hh b/examples/extended/electromagnetic/TestEm5/include/SteppingAction.hh index c16a76c368..21fe757bab 100644 --- a/examples/extended/electromagnetic/TestEm5/include/SteppingAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/SteppingAction.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: SteppingAction.hh,v 1.1 2003/08/11 10:15:45 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.hh,v 1.2 2004/06/21 10:57:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/SteppingVerbose.hh b/examples/extended/electromagnetic/TestEm5/include/SteppingVerbose.hh index 929704f646..ce20b32e7a 100644 --- a/examples/extended/electromagnetic/TestEm5/include/SteppingVerbose.hh +++ b/examples/extended/electromagnetic/TestEm5/include/SteppingVerbose.hh @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: SteppingVerbose.hh,v 1.1 2003/08/11 10:15:51 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingVerbose.hh,v 1.2 2004/06/21 10:57:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // This class manages the verbose outputs in G4SteppingManager. // It inherits from G4SteppingVerbose. diff --git a/examples/extended/electromagnetic/TestEm5/include/TrackingAction.hh b/examples/extended/electromagnetic/TestEm5/include/TrackingAction.hh index c2259f84f7..a7287cbf7f 100644 --- a/examples/extended/electromagnetic/TestEm5/include/TrackingAction.hh +++ b/examples/extended/electromagnetic/TestEm5/include/TrackingAction.hh @@ -20,10 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: TrackingAction.hh,v 1.1 2003/08/11 10:16:04 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// +// $Id: TrackingAction.hh,v 1.2 2004/06/21 10:57:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/include/VisManager.hh b/examples/extended/electromagnetic/TestEm5/include/VisManager.hh index d957171cdb..10252d04f2 100644 --- a/examples/extended/electromagnetic/TestEm5/include/VisManager.hh +++ b/examples/extended/electromagnetic/TestEm5/include/VisManager.hh @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: VisManager.hh,v 1.2 2004/06/21 10:57:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: VisManager.hh,v 1.1 2003/08/11 10:16:21 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/mumsc.mac b/examples/extended/electromagnetic/TestEm5/mumsc.mac index c378245b03..d6bd11aa5b 100644 --- a/examples/extended/electromagnetic/TestEm5/mumsc.mac +++ b/examples/extended/electromagnetic/TestEm5/mumsc.mac @@ -1,4 +1,4 @@ -# $Id: mumsc.mac,v 1.1 2004/02/19 18:18:43 maire Exp $ +# $Id: mumsc.mac,v 1.4 2004/06/21 10:57:09 maire Exp $ # # macro file for TestEm5.cc # @@ -7,23 +7,23 @@ /control/verbose 2 /run/verbose 2 # -/testem/det/setAbsMat Iron -/testem/det/setAbsThick 1 m +/testem/det/setAbsMat Iron +/testem/det/setAbsThick 1 m /testem/det/setAbsYZ 1 m /testem/det/setWorldX 1 m /testem/det/setWorldYZ 1 m # -###/testem/phys/addPhysics g4v52 +#### /testem/phys/addPhysics g4v52 # /testem/phys/setCuts 0.1 mm -# +# /run/initialize # /testem/gun/setDefault -/gun/particle mu+ +/gun/particle mu+ /gun/energy 50 GeV # -/testem/histo/setFileName 50gev.std.paw +/testem/histo/setFileName mumsc.paw /testem/histo/setHisto 6 200 -20.0 +20.0 mrad #projected angle /testem/histo/setHisto 7 200 -10.0 +10.0 mm #projected deviation # diff --git a/examples/extended/electromagnetic/TestEm5/src/DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm5/src/DetectorConstruction.cc index c358f47e60..90c6880a04 100644 --- a/examples/extended/electromagnetic/TestEm5/src/DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/DetectorConstruction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: DetectorConstruction.cc,v 1.3 2004/06/21 10:57:13 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: DetectorConstruction.cc,v 1.2 2003/11/25 15:19:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/DetectorMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/DetectorMessenger.cc index f5e02bc10e..40470b4078 100644 --- a/examples/extended/electromagnetic/TestEm5/src/DetectorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/DetectorMessenger.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: DetectorMessenger.cc,v 1.2 2004/06/21 10:57:13 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: DetectorMessenger.cc,v 1.1 2003/08/11 10:17:17 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/EventAction.cc b/examples/extended/electromagnetic/TestEm5/src/EventAction.cc index 2730bd5d52..bdae78b966 100644 --- a/examples/extended/electromagnetic/TestEm5/src/EventAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/EventAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventAction.cc,v 1.4 2004/06/21 10:57:13 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventAction.cc,v 1.2 2004/02/19 18:18:52 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -40,10 +37,6 @@ #include "G4Trajectory.hh" #include "G4VVisManager.hh" -#ifdef G4ANALYSIS_USE - #include "AIDA/IHistogram1D.h" -#endif - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... EventAction::EventAction(RunAction* RA, HistoManager* histo) @@ -84,19 +77,14 @@ void EventAction::EndOfEventAction(const G4Event* evt) runaction->AddEnergy(EnergyDeposit); runaction->AddTrakLenCharg(TrakLenCharged); runaction->AddTrakLenNeutr(TrakLenNeutral); - + runaction->CountStepsCharg(nbStepsCharged); runaction->CountStepsNeutr(nbStepsNeutral); - + runaction->CountTransmit (TransmitFlag); runaction->CountReflect (ReflectFlag); - -#ifdef G4ANALYSIS_USE - if (histoManager->GetHisto(1)) { - G4double unit = histoManager->GetHistoUnit(1); - histoManager->GetHisto(1)->fill(EnergyDeposit/unit); - } -#endif + + histoManager->FillHisto(1,EnergyDeposit); if (G4VVisManager::GetConcreteInstance()) { diff --git a/examples/extended/electromagnetic/TestEm5/src/EventMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/EventMessenger.cc index 0edeab57cb..2992a5f7e6 100644 --- a/examples/extended/electromagnetic/TestEm5/src/EventMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/EventMessenger.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: EventMessenger.cc,v 1.2 2004/06/21 10:57:13 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: EventMessenger.cc,v 1.1 2003/08/11 10:20:23 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/HistoManager.cc b/examples/extended/electromagnetic/TestEm5/src/HistoManager.cc index 2ba5c478fc..bf0b349bac 100644 --- a/examples/extended/electromagnetic/TestEm5/src/HistoManager.cc +++ b/examples/extended/electromagnetic/TestEm5/src/HistoManager.cc @@ -20,93 +20,125 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: HistoManager.cc,v 1.9 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: HistoManager.cc,v 1.6 2004/02/19 18:18:53 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifdef G4ANALYSIS_USE - #include "HistoManager.hh" #include "HistoMessenger.hh" - -#include "AIDA/AIDA.h" #include "G4UnitsTable.hh" +#ifdef G4ANALYSIS_USE +#include "AIDA/AIDA.h" +#endif + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... HistoManager::HistoManager() :tree(0),hf(0),factoryOn(false) { + fileName = "testem5.paw"; + fileType = "hbook"; + // histograms + for (G4int k=0; kcreateTreeFactory(); + + // Creating a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create(fileName, fileType, readOnly, createNew); + + // Creating a histogram factory, whose histograms will be handled by the tree + hf = af->createHistogramFactory(*tree); + + // create selected histograms + for (G4int k=0; kcreateHistogram1D( Label[k], Title[k], + Nbins[k], Vmin[k], Vmax[k]); + factoryOn = true; + } + } + if(factoryOn) + G4cout << "\n----> Histogram Tree is opened " << G4endl; + + delete tf; + delete af; +#endif +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::save() +{ +#ifdef G4ANALYSIS_USE + if (factoryOn) { tree->commit(); // Writing the histograms to the file tree->close(); // and closing the tree (and the file) - - delete hf; + G4cout << "\n----> Histogram Tree is saved in " << fileName << G4endl; + + delete hf; delete tree; factoryOn = false; } - - delete histoMessenger; +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void HistoManager::SetFactory(G4String fileName) -{ - if (factoryOn) { - G4cout << "\n--->HistoManager::SetFactory(): factory already exists" - << G4endl; +void HistoManager::FillHisto(G4int ih, G4double e, G4double weight) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::FillHisto() : histo " << ih + << "does not exist; e= " << e << " w= " << weight << G4endl; return; } - - // Creating the analysis factory - AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); - - // Creating the tree factory - AIDA::ITreeFactory* tf = af->createTreeFactory(); - - // Creating a tree mapped to an hbook file. - G4bool readOnly = false; - G4bool createNew = true; - tree = tf->create(fileName, "hbook", readOnly, createNew); - - // Creating a histogram factory, whose histograms will be handled by the tree - hf = af->createHistogramFactory(*tree); - - // histograms - for (G4int k=0; kfill(e/Unit[ih], weight); +#endif } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void HistoManager::SetHisto(G4int ih, - G4int nbBins, G4double valmin, G4double valmax, G4String unit) -{ - if (!factoryOn) SetFactory("testem5.paw"); - +void HistoManager::SetHisto(G4int ih, + G4int nbins, G4double valmin, G4double valmax, const G4String& unit) +{ if (ih > MaxHisto) { G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih << "does not exist" << G4endl; return; - } + } const G4String id[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10","11","12","13","14","15","16"}; - const G4String title[] = + const G4String title[] = { "dummy", //0 "energy deposit in absorber", //1 "energy of charged secondaries at creation", //2 @@ -125,27 +157,45 @@ void HistoManager::SetHisto(G4int ih, "(reflect , neutral) : space angle at exit", //15 "(reflect , neutral) : projected angle at exit", //16 }; - + G4String titl = title[ih]; G4double vmin = valmin, vmax = valmax; - + Unit[ih] = 1.; + if (ih == 3) { vmin = log10(valmin/MeV); vmax = log10(valmax/MeV);} else if (unit != "none") { titl = title[ih] + " (" + unit + ")"; - histoUnit[ih] = G4UnitDefinition::GetValueOf(unit); - vmin = valmin/histoUnit[ih]; vmax = valmax/histoUnit[ih]; + Unit[ih] = G4UnitDefinition::GetValueOf(unit); + vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; } - - histo[ih] = hf->createHistogram1D(id[ih],titl,nbBins,vmin,vmax); - - binWidth[ih] = (valmax-valmin)/nbBins; - + + exist[ih] = true; + Label[ih] = id[ih]; + Title[ih] = titl; + Nbins[ih] = nbins; + Vmin[ih] = vmin; + Vmax[ih] = vmax; + Width[ih] = (valmax-valmin)/nbins; + G4cout << "----> SetHisto " << ih << ": " << titl << "; " - << nbBins << " bins from " + << nbins << " bins from " << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; - + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void HistoManager::RemoveHisto(G4int ih) +{ + if (ih > MaxHisto) { + G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih + << "does not exist" << G4endl; + return; + } + + histo[ih] = 0; + exist[ih] = false; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#endif diff --git a/examples/extended/electromagnetic/TestEm5/src/HistoMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/HistoMessenger.cc index ec069d2368..3c62a8513c 100644 --- a/examples/extended/electromagnetic/TestEm5/src/HistoMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/HistoMessenger.cc @@ -20,15 +20,12 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: HistoMessenger.cc,v 1.1 2003/08/11 10:20:44 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: HistoMessenger.cc,v 1.4 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifdef G4ANALYSIS_USE - #include "HistoMessenger.hh" #include "HistoManager.hh" @@ -36,6 +33,7 @@ #include "G4UIcommand.hh" #include "G4UIparameter.hh" #include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -47,7 +45,10 @@ HistoMessenger::HistoMessenger(HistoManager* manager) factoryCmd = new G4UIcmdWithAString("/testem/histo/setFileName",this); factoryCmd->SetGuidance("set name for the histograms file"); - + + typeCmd = new G4UIcmdWithAString("/testem/histo/setFileType",this); + typeCmd->SetGuidance("set histograms file type"); + histoCmd = new G4UIcommand("/testem/histo/setHisto",this); histoCmd->SetGuidance("Set bining of the histo number ih :"); histoCmd->SetGuidance(" nbBins; valMin; valMax; unit (of vmin and vmax)"); @@ -60,8 +61,8 @@ HistoMessenger::HistoMessenger(HistoManager* manager) G4UIparameter* nbBins = new G4UIparameter("nbBins",'i',false); nbBins->SetGuidance("number of bins"); nbBins->SetParameterRange("nbBins>0"); - histoCmd->SetParameter(nbBins); - // + histoCmd->SetParameter(nbBins); + // G4UIparameter* valMin = new G4UIparameter("valMin",'d',false); valMin->SetGuidance("valMin, expressed in unit"); histoCmd->SetParameter(valMin); @@ -73,25 +74,35 @@ HistoMessenger::HistoMessenger(HistoManager* manager) G4UIparameter* unit = new G4UIparameter("unit",'s',true); unit->SetGuidance("if omitted, vmin and vmax are assumed dimensionless"); unit->SetDefaultValue("none"); - histoCmd->SetParameter(unit); + histoCmd->SetParameter(unit); + + rmhistoCmd = new G4UIcmdWithAnInteger("/testem/histo/removeHisto",this); + rmhistoCmd->SetGuidance("desactivate histo #id"); + rmhistoCmd->SetParameterName("id",false); + rmhistoCmd->SetRange("id>0"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... HistoMessenger::~HistoMessenger() { + delete rmhistoCmd; delete histoCmd; + delete typeCmd; delete factoryCmd; - delete histoDir; + delete histoDir; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void HistoMessenger::SetNewValue(G4UIcommand* command,G4String newValues) +void HistoMessenger::SetNewValue(G4UIcommand* command, G4String newValues) { if (command == factoryCmd) - histoManager->SetFactory(newValues); - + histoManager->SetFileName(newValues); + + if (command == typeCmd) + histoManager->SetFileType(newValues); + if (command == histoCmd) { G4int ih,nbBins; G4double vmin,vmax; char unts[30]; const char* t = newValues; @@ -101,9 +112,11 @@ void HistoMessenger::SetNewValue(G4UIcommand* command,G4String newValues) G4double vUnit = 1. ; if (unit != "none") vUnit = G4UIcommand::ValueOf(unit); histoManager->SetHisto (ih,nbBins,vmin*vUnit,vmax*vUnit,unit); - } + } + + if (command == rmhistoCmd) + histoManager->RemoveHisto(rmhistoCmd->GetNewIntValue(newValues)); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#endif diff --git a/examples/extended/electromagnetic/TestEm5/src/IonC12.cc b/examples/extended/electromagnetic/TestEm5/src/IonC12.cc index 2d1753c0be..7527802047 100644 --- a/examples/extended/electromagnetic/TestEm5/src/IonC12.cc +++ b/examples/extended/electromagnetic/TestEm5/src/IonC12.cc @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: IonC12.cc,v 1.4 2003/08/11 10:27:14 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: IonC12.cc,v 1.5 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysListBinaryCascade.cc b/examples/extended/electromagnetic/TestEm5/src/PhysListBinaryCascade.cc new file mode 100644 index 0000000000..4591a47a57 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm5/src/PhysListBinaryCascade.cc @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysListBinaryCascade.cc,v 1.2 2004/04/29 13:55:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysListBinaryCascade.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4LFission.hh" +#include "G4LCapture.hh" +#include "G4Proton.hh" +#include "G4Neutron.hh" + +#include "G4HadronFissionProcess.hh" +#include "G4HadronCaptureProcess.hh" + +#include "G4BinaryCascade.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListBinaryCascade::PhysListBinaryCascade(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListBinaryCascade::~PhysListBinaryCascade() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysListBinaryCascade::ConstructProcess() +{ + + // Binary Cascade + G4ParticleDefinition* particle = 0; + G4ProcessManager* pmanager = 0; + + G4BinaryCascade* theBC = 0; + + // proton + particle = G4Proton::Proton(); + pmanager = particle->GetProcessManager(); + theBC = new G4BinaryCascade(); + theIPproton.RegisterMe(theBC); + theIPproton.AddDataSet(&thePXSec); + pmanager->AddDiscreteProcess(&theIPproton); + + // neutron + particle = G4Neutron::Neutron(); + pmanager = particle->GetProcessManager(); + theBC = new G4BinaryCascade(); + theIPneutron.RegisterMe(theBC); + theIPneutron.AddDataSet(&theNXSec); + pmanager->AddDiscreteProcess(&theIPneutron); + // fission + G4HadronFissionProcess* theFissionProcess = new G4HadronFissionProcess; + G4LFission* theFissionModel = new G4LFission; + theFissionProcess->RegisterMe(theFissionModel); + pmanager->AddDiscreteProcess(theFissionProcess); + // capture + G4HadronCaptureProcess* theCaptureProcess = new G4HadronCaptureProcess; + G4LCapture* theCaptureModel = new G4LCapture; + theCaptureProcess->RegisterMe(theCaptureModel); + pmanager->AddDiscreteProcess(theCaptureProcess); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysListEmG4v52.cc b/examples/extended/electromagnetic/TestEm5/src/PhysListEmG4v52.cc index dac86012a8..d73055c2b5 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PhysListEmG4v52.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PhysListEmG4v52.cc @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListEmG4v52.cc,v 1.1 2003/10/07 11:58:31 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmG4v52.cc,v 1.4 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -107,14 +106,14 @@ void PhysListEmG4v52::ConstructProcess() } else if( particleName == "GenericIon" ) { pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); - pmanager->AddProcess(new G4hIonisation52, -1,2,2); + pmanager->AddProcess(new G4hIonisation52, -1,2,2); } else if ((!particle->IsShortLived()) && (particle->GetPDGCharge() != 0.0) && (particle->GetParticleName() != "chargedgeantino")) { //all others charged particles except geantino pmanager->AddProcess(new G4MultipleScattering52,-1,1,1); - pmanager->AddProcess(new G4hIonisation52, -1,2,2); + pmanager->AddProcess(new G4hIonisation52, -1,2,2); } } } diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/TestEm5/src/PhysListEmStandard.cc index 7bcc512880..2cec956dc1 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PhysListEmStandard.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PhysListEmStandard.cc @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListEmStandard.cc,v 1.3 2003/10/24 12:18:14 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.cc,v 1.6 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm1/src/PhysListGeneral.cc b/examples/extended/electromagnetic/TestEm5/src/PhysListHadronElastic.cc similarity index 73% rename from examples/extended/electromagnetic/TestEm1/src/PhysListGeneral.cc rename to examples/extended/electromagnetic/TestEm5/src/PhysListHadronElastic.cc index 8d74ba9367..bf96ba8dc9 100644 --- a/examples/extended/electromagnetic/TestEm1/src/PhysListGeneral.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PhysListHadronElastic.cc @@ -20,52 +20,49 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListGeneral.cc,v 1.1 2003/10/06 10:02:32 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListHadronElastic.cc,v 1.4 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "PhysListGeneral.hh" +#include "PhysListHadronElastic.hh" #include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" -#include "G4Decay.hh" +#include "G4LElastic.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListGeneral::PhysListGeneral(const G4String& name) +PhysListHadronElastic::PhysListHadronElastic(const G4String& name) : G4VPhysicsConstructor(name) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListGeneral::~PhysListGeneral() +PhysListHadronElastic::~PhysListHadronElastic() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PhysListGeneral::ConstructProcess() +void PhysListHadronElastic::ConstructProcess() { - // Add Decay Process + + // Hadron elastic process - G4Decay* fDecayProcess = new G4Decay(); + theElasticProcess.RegisterMe( new G4LElastic() ); theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - - if (fDecayProcess->IsApplicable(*particle)) { - - pmanager ->AddProcess(fDecayProcess); - - // set ordering for PostStepDoIt and AtRestDoIt - pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); - pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); - + G4ProcessManager* pManager = particle->GetProcessManager(); + if (particle->GetPDGMass() > 110.*MeV && theElasticProcess.IsApplicable(*particle)) { + pManager->AddDiscreteProcess(&theElasticProcess); + G4cout << "### Elastic model are registered for " + << particle->GetParticleName() + << G4endl; } } + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysListIonBinaryCascade.cc b/examples/extended/electromagnetic/TestEm5/src/PhysListIonBinaryCascade.cc new file mode 100644 index 0000000000..13a1ac4e64 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm5/src/PhysListIonBinaryCascade.cc @@ -0,0 +1,171 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: PhysListIonBinaryCascade.cc,v 1.2 2004/04/29 13:55:11 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "PhysListIonBinaryCascade.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4LFission.hh" +#include "G4LCapture.hh" +#include "G4Deuteron.hh" +#include "G4Triton.hh" +#include "G4He3.hh" +#include "G4Alpha.hh" +#include "IonC12.hh" +#include "G4GenericIon.hh" + +#include "G4ExcitationHandler.hh" +#include "G4Evaporation.hh" +#include "G4FermiBreakUp.hh" +#include "G4StatMF.hh" +#include "G4GeneratorPrecompoundInterface.hh" + +#include "G4HadronInelasticProcess.hh" +#include "G4BinaryLightIonReaction.hh" +#include "G4TripathiCrossSection.hh" +#include "G4IonsShenCrossSection.hh" +#include "G4LEDeuteronInelastic.hh" +#include "G4LETritonInelastic.hh" +#include "G4LEAlphaInelastic.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListIonBinaryCascade::PhysListIonBinaryCascade(const G4String& name) + : G4VPhysicsConstructor(name) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +PhysListIonBinaryCascade::~PhysListIonBinaryCascade() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysListIonBinaryCascade::ConstructProcess() +{ + /* + // all models for treatment of thermal nucleus + G4Evaporation * theEvaporation = new G4Evaporation; + G4FermiBreakUp * theFermiBreakUp = new G4FermiBreakUp; + G4StatMF * theMF = new G4StatMF; + + // Evaporation logic + G4ExcitationHandler * theHandler = new G4ExcitationHandler; + theHandler->SetEvaporation(theEvaporation); + theHandler->SetFermiModel(theFermiBreakUp); + theHandler->SetMultiFragmentation(theMF); + theHandler->SetMaxAandZForFermiBreakUp(12, 6); + theHandler->SetMinEForMultiFrag(3*MeV); + + // Pre equilibrium stage + G4PreCompoundModel * thePreEquilib = new G4PreCompoundModel(theHandler); + + // a no-cascade generator-precompound interaface + G4GeneratorPrecompoundInterface * theCascade = new G4GeneratorPrecompoundInterface; + theCascade->SetDeExcitation(thePreEquilib); + */ + // Binary Cascade + G4ParticleDefinition* particle = 0; + G4ProcessManager* pmanager = 0; + G4BinaryLightIonReaction* theBC = new G4BinaryLightIonReaction(); + theBC->SetMinEnergy(80*MeV); + theBC->SetMaxEnergy(20*GeV); + + G4TripathiCrossSection * TripathiCrossSection= new G4TripathiCrossSection; + G4IonsShenCrossSection * aShen = new G4IonsShenCrossSection; + + // deuteron + particle = G4Deuteron::Deuteron(); + pmanager = particle->GetProcessManager(); + G4LEDeuteronInelastic* theDIModel = new G4LEDeuteronInelastic; + theDIModel->SetMaxEnergy(100*MeV); + theIPdeuteron.AddDataSet(TripathiCrossSection); + theIPdeuteron.AddDataSet(aShen); + theIPdeuteron.RegisterMe(theDIModel); + theIPdeuteron.RegisterMe(theBC); + pmanager->AddDiscreteProcess(&theIPdeuteron); + + // triton + particle = G4Triton::Triton(); + pmanager = particle->GetProcessManager(); + G4LETritonInelastic* theTIModel = new G4LETritonInelastic; + theTIModel->SetMaxEnergy(100*MeV); + theIPtriton.AddDataSet(TripathiCrossSection); + theIPtriton.AddDataSet(aShen); + theIPtriton.RegisterMe(theTIModel); + theIPtriton.RegisterMe(theBC); + pmanager->AddDiscreteProcess(&theIPtriton); + + // alpha + particle = G4Alpha::Alpha(); + pmanager = particle->GetProcessManager(); + G4LEAlphaInelastic* theAIModel = new G4LEAlphaInelastic; + theAIModel->SetMaxEnergy(100*MeV); + theIPalpha.AddDataSet(TripathiCrossSection); + theIPalpha.AddDataSet(aShen); + theIPalpha.RegisterMe(theAIModel); + theIPalpha.RegisterMe(theBC); + pmanager->AddDiscreteProcess(&theIPalpha); + + + // GenericIon + particle = G4GenericIon::GenericIon(); + pmanager = particle->GetProcessManager(); + G4HadronInelasticProcess* theIPGenericIon = + new G4HadronInelasticProcess("IonInelastic",particle); + theIPGenericIon->AddDataSet(TripathiCrossSection); + theIPGenericIon->AddDataSet(aShen); + G4BinaryLightIonReaction * theGenIonBC= new G4BinaryLightIonReaction; + theGenIonBC->SetMinEnergy(0*MeV); + theGenIonBC->SetMaxEnergy(10*GeV); + theIPGenericIon->RegisterMe(theGenIonBC); + pmanager->AddDiscreteProcess(theIPGenericIon); + + // C12 + particle = IonC12::Ion(); + pmanager = particle->GetProcessManager(); + G4HadronInelasticProcess* theIPIonC12 = + new G4HadronInelasticProcess("IonC12Inelastic",particle); + theIPIonC12->AddDataSet(TripathiCrossSection); + theIPIonC12->AddDataSet(aShen); + theIPIonC12->RegisterMe(theGenIonBC); + pmanager->AddDiscreteProcess(theIPIonC12); + + // He3 + particle = G4He3::He3(); + pmanager = particle->GetProcessManager(); + G4HadronInelasticProcess* theIPHe3 = + new G4HadronInelasticProcess("He3Inelastic",particle); + theIPHe3->AddDataSet(TripathiCrossSection); + theIPHe3->AddDataSet(aShen); + theIPHe3->RegisterMe(theGenIonBC); + pmanager->AddDiscreteProcess(theIPHe3); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm5/src/PhysicsList.cc index b6657d70f0..10c8b1c676 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PhysicsList.cc @@ -20,66 +20,153 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PhysicsList.cc,v 1.8 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PhysicsList.cc,v 1.5 2004/02/19 18:18:53 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "PhysicsList.hh" #include "PhysicsListMessenger.hh" -#include "PhysListParticles.hh" -#include "PhysListGeneral.hh" #include "PhysListEmStandard.hh" #include "PhysListEmG4v52.hh" -#include "DetectorConstruction.hh" +#include "PhysListHadronElastic.hh" +#include "PhysListBinaryCascade.hh" +#include "PhysListIonBinaryCascade.hh" +#include "G4LossTableManager.hh" #include "G4UnitsTable.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysicsList::PhysicsList(DetectorConstruction* p) -: G4VModularPhysicsList() +PhysicsList::PhysicsList() : G4VModularPhysicsList() { - pDet = p; + G4LossTableManager::Instance(); + pMessenger = new PhysicsListMessenger(this); + + // EM physics + emName = G4String("standard"); + emPhysicsList = new PhysListEmStandard(emName); - defaultCutValue = 1.0*mm; + stepMaxProcess = 0; + + defaultCutValue = 1.*mm; cutForGamma = defaultCutValue; cutForElectron = defaultCutValue; cutForPositron = defaultCutValue; - pMessenger = new PhysicsListMessenger(this); - stepMaxProcess = 0; - SetVerboseLevel(1); - - // Particles - particleList = new PhysListParticles("particles"); - - // General Physics - generalPhysicsList = new PhysListGeneral("general"); - - // EM physics - emName = G4String("standard"); - emPhysicsList = new PhysListEmStandard(emName); - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysicsList::~PhysicsList() { - delete pMessenger; + delete emPhysicsList; + for(size_t i=0; iConstructParticle(); +// pseudo-particles + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); + +// gamma + G4Gamma::GammaDefinition(); + +// optical photon + G4OpticalPhoton::OpticalPhotonDefinition(); + +// leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + +// mesons + G4PionPlus::PionPlusDefinition(); + G4PionMinus::PionMinusDefinition(); + G4PionZero::PionZeroDefinition(); + G4Eta::EtaDefinition(); + G4EtaPrime::EtaPrimeDefinition(); + G4KaonPlus::KaonPlusDefinition(); + G4KaonMinus::KaonMinusDefinition(); + G4KaonZero::KaonZeroDefinition(); + G4AntiKaonZero::AntiKaonZeroDefinition(); + G4KaonZeroLong::KaonZeroLongDefinition(); + G4KaonZeroShort::KaonZeroShortDefinition(); + +// barions + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4AntiNeutron::AntiNeutronDefinition(); + +// ions + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4He3::He3Definition(); + G4Alpha::AlphaDefinition(); + G4GenericIon::GenericIonDefinition(); + IonC12::IonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -87,16 +174,72 @@ void PhysicsList::ConstructParticle() void PhysicsList::ConstructProcess() { AddTransportation(); - generalPhysicsList->ConstructProcess(); + AddDecay(); emPhysicsList->ConstructProcess(); + for(size_t i=0; iConstructProcess(); AddStepMax(); } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4Decay.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::AddDecay() +{ + // Add Decay Process + + G4Decay* fDecayProcess = new G4Decay(); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (fDecayProcess->IsApplicable(*particle)) { + + pmanager ->AddProcess(fDecayProcess); + + // set ordering for PostStepDoIt and AtRestDoIt + pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); + + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "StepMax.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void PhysicsList::AddStepMax() +{ + // Step limitation seen as a process + stepMaxProcess = new StepMax(); + + theParticleIterator->reset(); + while ((*theParticleIterator)()){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (stepMaxProcess->IsApplicable(*particle)) + { + pmanager ->AddDiscreteProcess(stepMaxProcess); + } + } +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void PhysicsList::AddPhysicsList(const G4String& name) { - if (verboseLevel>1) { + if (verboseLevel>-1) { G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" << G4endl; } @@ -114,6 +257,18 @@ void PhysicsList::AddPhysicsList(const G4String& name) delete emPhysicsList; emPhysicsList = new PhysListEmG4v52(name); + } else if (name == "elastic") { + + hadronPhys.push_back( new PhysListHadronElastic(name)); + + } else if (name == "binary") { + + hadronPhys.push_back( new PhysListBinaryCascade(name)); + + } else if (name == "binary_ion") { + + hadronPhys.push_back( new PhysListIonBinaryCascade(name)); + } else { G4cout << "PhysicsList::AddPhysicsList: <" << name << ">" @@ -124,49 +279,19 @@ void PhysicsList::AddPhysicsList(const G4String& name) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "StepMax.hh" - -#include "G4ProcessManager.hh" -#include "G4ParticleTypes.hh" -#include "G4ParticleTable.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysicsList::AddStepMax() -{ - // Step limitation seen as a process - stepMaxProcess = new StepMax(); - - theParticleIterator->reset(); - while ((*theParticleIterator)()){ - G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - - if (stepMaxProcess->IsApplicable(*particle)) - { - pmanager ->AddDiscreteProcess(stepMaxProcess); - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "G4Gamma.hh" -#include "G4Electron.hh" -#include "G4Positron.hh" - void PhysicsList::SetCuts() -{ +{ + if (verboseLevel >0){ G4cout << "PhysicsList::SetCuts:"; G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; - } + } // set cut values for gamma at first and for e- second and next for e+, // because some processes for e+/e- need cut values for gamma SetCutValue(cutForGamma, "gamma"); SetCutValue(cutForElectron, "e-"); - SetCutValue(cutForPositron, "e+"); + SetCutValue(cutForPositron, "e+"); if (verboseLevel>0) DumpCutValuesTable(); } @@ -197,22 +322,3 @@ void PhysicsList::SetCutForPositron(G4double cut) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "G4LossTableManager.hh" - -G4double PhysicsList::GetRange(G4double val) -{ - G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable(); - const G4MaterialCutsCouple* couple = pDet->GetAbsorbMaterialCut(); - - G4ParticleDefinition* part = theParticleTable->FindParticle("e-"); - G4double range = G4LossTableManager::Instance()->GetRange(part,val,couple); - - G4cout << "material : " << couple->GetMaterial()->GetName() << G4endl; - G4cout << "particle : " << part->GetParticleName() << G4endl; - G4cout << "energy : " << G4BestUnit(val, "Energy") << G4endl; - G4cout << "range : " << G4BestUnit(range,"Length") << G4endl; - - return range; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/PhysicsListMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/PhysicsListMessenger.cc index 6ab95d2ed6..260c655cca 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PhysicsListMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PhysicsListMessenger.cc @@ -20,26 +20,28 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PhysicsListMessenger.cc,v 1.4 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PhysicsListMessenger.cc,v 1.1 2003/08/11 10:21:23 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "PhysicsListMessenger.hh" #include "PhysicsList.hh" -#include "G4UIcmdWithADoubleAndUnit.hh" #include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) :pPhysicsList(pPhys) -{ +{ + pListCmd = new G4UIcmdWithAString("/testem/phys/addPhysics",this); + pListCmd->SetGuidance("Add modula physics list."); + pListCmd->SetParameterName("PList",false); + pListCmd->AvailableForStates(G4State_PreInit); + gammaCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setGCut",this); gammaCutCmd->SetGuidance("Set gamma cut."); gammaCutCmd->SetParameterName("Gcut",false); @@ -54,12 +56,12 @@ PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) electCutCmd->SetRange("Ecut>0.0"); electCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - positCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setPCut",this); - positCutCmd->SetGuidance("Set positron cut."); - positCutCmd->SetParameterName("Pcut",false); - positCutCmd->SetUnitCategory("Length"); - positCutCmd->SetRange("Pcut>0.0"); - positCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + protoCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setPCut",this); + protoCutCmd->SetGuidance("Set positron cut."); + protoCutCmd->SetParameterName("Pcut",false); + protoCutCmd->SetUnitCategory("Length"); + protoCutCmd->SetRange("Pcut>0.0"); + protoCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); allCutCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/setCuts",this); allCutCmd->SetGuidance("Set cut for all."); @@ -67,45 +69,34 @@ PhysicsListMessenger::PhysicsListMessenger(PhysicsList* pPhys) allCutCmd->SetUnitCategory("Length"); allCutCmd->SetRange("cut>0.0"); allCutCmd->AvailableForStates(G4State_PreInit,G4State_Idle); - - pListCmd = new G4UIcmdWithAString("/testem/phys/addPhysics",this); - pListCmd->SetGuidance("Add modula physics list."); - pListCmd->SetParameterName("PList",false); - pListCmd->AvailableForStates(G4State_PreInit); - - rangeCmd = new G4UIcmdWithADoubleAndUnit("/testem/phys/getRange",this); - rangeCmd->SetGuidance("get the electron range for the current material."); - rangeCmd->SetParameterName("energy",false); - rangeCmd->SetRange("energy>0."); - rangeCmd->SetUnitCategory("Energy"); - rangeCmd->AvailableForStates(G4State_Idle); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysicsListMessenger::~PhysicsListMessenger() { + delete pListCmd; delete gammaCutCmd; delete electCutCmd; - delete positCutCmd; + delete protoCutCmd; delete allCutCmd; - delete rangeCmd; - delete pListCmd; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PhysicsListMessenger::SetNewValue(G4UIcommand* command, - G4String newValue) -{ +void PhysicsListMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if( command == pListCmd ) + { pPhysicsList->AddPhysicsList(newValue);} + if( command == gammaCutCmd ) { pPhysicsList->SetCutForGamma(gammaCutCmd->GetNewDoubleValue(newValue));} if( command == electCutCmd ) { pPhysicsList->SetCutForElectron(electCutCmd->GetNewDoubleValue(newValue));} - if( command == positCutCmd ) - { pPhysicsList->SetCutForPositron(positCutCmd->GetNewDoubleValue(newValue));} + if( command == protoCutCmd ) + { pPhysicsList->SetCutForPositron(protoCutCmd->GetNewDoubleValue(newValue));} if( command == allCutCmd ) { @@ -114,12 +105,6 @@ void PhysicsListMessenger::SetNewValue(G4UIcommand* command, pPhysicsList->SetCutForElectron(cut); pPhysicsList->SetCutForPositron(cut); } - - if( command == pListCmd ) - { pPhysicsList->AddPhysicsList(newValue);} - - if(command == rangeCmd) - { pPhysicsList->GetRange(rangeCmd->GetNewDoubleValue(newValue));} } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorAction.cc index dbe5e75e79..0a324ef322 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PrimaryGeneratorAction.cc,v 1.3 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PrimaryGeneratorAction.cc,v 1.2 2004/02/19 18:18:54 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorMessenger.cc index 24e99790d5..9721caf277 100644 --- a/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/PrimaryGeneratorMessenger.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: PrimaryGeneratorMessenger.cc,v 1.2 2004/06/21 10:57:14 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: PrimaryGeneratorMessenger.cc,v 1.1 2003/08/11 10:21:28 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/RunAction.cc b/examples/extended/electromagnetic/TestEm5/src/RunAction.cc index 3889db1a86..f48b080376 100644 --- a/examples/extended/electromagnetic/TestEm5/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/RunAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: RunAction.cc,v 1.7 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: RunAction.cc,v 1.2 2004/02/19 18:18:54 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -57,7 +54,7 @@ RunAction::~RunAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::BeginOfRunAction(const G4Run* aRun) -{ +{ G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; //initialisation @@ -66,11 +63,14 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) TrakLenNeutral = TrakLenNeutral2 = 0.; nbStepsCharged = nbStepsCharged2 = 0.; nbStepsNeutral = nbStepsNeutral2 = 0.; - + MscProjecTheta = MscProjecTheta2 = 0.; + nbGamma = nbElect = nbPosit = 0; - + Transmit[0] = Transmit[1] = Reflect[0] = Reflect[1] = 0; - + + histoManager->book(); + // save Rndm status G4RunManager::GetRunManager()->SetRandomNumberStore(true); HepRandom::showEngineStatus(); @@ -84,95 +84,105 @@ void RunAction::EndOfRunAction(const G4Run* aRun) // G4int TotNbofEvents = aRun->GetNumberOfEvent(); if (TotNbofEvents == 0) return; - - EnergyDeposit /= TotNbofEvents; - G4double rmsEdep = EnergyDeposit2/TotNbofEvents - EnergyDeposit*EnergyDeposit; + + EnergyDeposit /= TotNbofEvents; EnergyDeposit2 /= TotNbofEvents; + G4double rmsEdep = EnergyDeposit2 - EnergyDeposit*EnergyDeposit; if (rmsEdep>0.) rmsEdep = sqrt(rmsEdep/TotNbofEvents); else rmsEdep = 0.; - - TrakLenCharged /= TotNbofEvents; - G4double rmsTLCh = TrakLenCharged2/TotNbofEvents - - TrakLenCharged*TrakLenCharged; + + TrakLenCharged /= TotNbofEvents; TrakLenCharged2 /= TotNbofEvents; + G4double rmsTLCh = TrakLenCharged2 - TrakLenCharged*TrakLenCharged; if (rmsTLCh>0.) rmsTLCh = sqrt(rmsTLCh/TotNbofEvents); else rmsTLCh = 0.; - - TrakLenNeutral /= TotNbofEvents; - G4double rmsTLNe = TrakLenNeutral2/TotNbofEvents - - TrakLenNeutral*TrakLenNeutral; + + TrakLenNeutral /= TotNbofEvents; TrakLenNeutral2 /= TotNbofEvents; + G4double rmsTLNe = TrakLenNeutral2 - TrakLenNeutral*TrakLenNeutral; if (rmsTLNe>0.) rmsTLNe = sqrt(rmsTLNe/TotNbofEvents); else rmsTLNe = 0.; - - nbStepsCharged /= TotNbofEvents; - G4double rmsStCh = nbStepsCharged2/TotNbofEvents - - nbStepsCharged*nbStepsCharged; + + nbStepsCharged /= TotNbofEvents; nbStepsCharged2 /= TotNbofEvents; + G4double rmsStCh = nbStepsCharged2 - nbStepsCharged*nbStepsCharged; if (rmsStCh>0.) rmsStCh = sqrt(rmsTLCh/TotNbofEvents); - else rmsStCh = 0.; - - nbStepsNeutral /= TotNbofEvents; - G4double rmsStNe = nbStepsNeutral2/TotNbofEvents - - nbStepsNeutral*nbStepsNeutral; + else rmsStCh = 0.; + + nbStepsNeutral /= TotNbofEvents; nbStepsNeutral2 /= TotNbofEvents; + G4double rmsStNe = nbStepsNeutral2 - nbStepsNeutral*nbStepsNeutral; if (rmsStNe>0.) rmsStNe = sqrt(rmsTLCh/TotNbofEvents); else rmsStNe = 0.; - - G4double Gamma = (double)nbGamma/TotNbofEvents; + + G4double Gamma = (double)nbGamma/TotNbofEvents; G4double Elect = (double)nbElect/TotNbofEvents; G4double Posit = (double)nbPosit/TotNbofEvents; - + G4double transmit[2]; transmit[0] = 100.*Transmit[0]/TotNbofEvents; transmit[1] = 100.*Transmit[1]/TotNbofEvents; - + G4double reflect[2]; reflect[0] = 100.*Reflect[0]/TotNbofEvents; reflect[1] = 100.*Reflect[1]/TotNbofEvents; - - G4cout << "\n ======================== run summary ======================\n"; - G4int prec = G4cout.precision(4); - - G4cout << "\n Number of Events = " << TotNbofEvents << G4endl; - - G4cout << "\n Total energy deposit in absorber per event = " - << G4BestUnit(EnergyDeposit,"Energy") << " +- " - << G4BestUnit(rmsEdep, "Energy") << G4endl; - - G4cout << "\n Total track length (charged) in absorber per event = " - << G4BestUnit(TrakLenCharged,"Length") << " +- " - << G4BestUnit(rmsTLCh, "Length") << G4endl; - - G4cout << " Total track length (neutral) in absorber per event = " - << G4BestUnit(TrakLenNeutral,"Length") << " +- " - << G4BestUnit(rmsTLNe, "Length") << G4endl; - - G4cout << "\n Number of steps (charged) in absorber per event = " - << nbStepsCharged << " +- " << rmsStCh << G4endl; - - G4cout << " Number of steps (neutral) in absorber per event = " - << nbStepsNeutral << " +- " << rmsStNe << G4endl; - - G4cout << "\n Number of secondaries per event : Gammas = " << Gamma - << "; electrons = " << Elect - << "; positrons = " << Posit << G4endl; - - G4cout << "\n Number of events with the primary particle transmitted = " - << transmit[1] << " %" << G4endl; - - G4cout << " Number of events with at least 1 particle transmitted " - << "(same charge as primary) = " << transmit[0] << " %" << G4endl; - - G4cout << "\n Number of events with the primary particle reflected = " - << reflect[1] << " %" << G4endl; - - G4cout << " Number of events with at least 1 particle reflected " - << "(same charge as primary) = " << reflect[0] << " %" << G4endl; - - // compute width of the Gaussian central part of the MultipleScattering - // - G4cout << "\n MultipleScattering: theta0 Highland = " - << ComputeMscHighland()/mrad << " mrad" << G4endl; - - G4cout.precision(prec); - + G4double rmsMsc = 0.; + if (Transmit[1] > 0) { + MscProjecTheta /= (2*Transmit[1]); MscProjecTheta2 /= (2*Transmit[1]); + rmsMsc = MscProjecTheta2 - MscProjecTheta*MscProjecTheta; + if (rmsMsc > 0.) rmsMsc = sqrt(rmsMsc); + } + + G4cout << "\n ======================== run summary ======================\n"; + + G4int prec = G4cout.precision(4); + + G4cout << "\n Number of Events = " << TotNbofEvents << G4endl; + + G4cout << "\n Total energy deposit in absorber per event = " + << G4BestUnit(EnergyDeposit,"Energy") << " +- " + << G4BestUnit(rmsEdep, "Energy") << G4endl; + + G4cout << "\n Total track length (charged) in absorber per event = " + << G4BestUnit(TrakLenCharged,"Length") << " +- " + << G4BestUnit(rmsTLCh, "Length") << G4endl; + + G4cout << " Total track length (neutral) in absorber per event = " + << G4BestUnit(TrakLenNeutral,"Length") << " +- " + << G4BestUnit(rmsTLNe, "Length") << G4endl; + + G4cout << "\n Number of steps (charged) in absorber per event = " + << nbStepsCharged << " +- " << rmsStCh << G4endl; + + G4cout << " Number of steps (neutral) in absorber per event = " + << nbStepsNeutral << " +- " << rmsStNe << G4endl; + + G4cout << "\n Number of secondaries per event : Gammas = " << Gamma + << "; electrons = " << Elect + << "; positrons = " << Posit << G4endl; + + G4cout << "\n Number of events with the primary particle transmitted = " + << transmit[1] << " %" << G4endl; + + G4cout << " Number of events with at least 1 particle transmitted " + << "(same charge as primary) = " << transmit[0] << " %" << G4endl; + + G4cout << "\n Number of events with the primary particle reflected = " + << reflect[1] << " %" << G4endl; + + G4cout << " Number of events with at least 1 particle reflected " + << "(same charge as primary) = " << reflect[0] << " %" << G4endl; + + // compute width of the Gaussian central part of the MultipleScattering + // + if (histoManager->HistoExist(6)) { + G4cout << "\n MultipleScattering: rms proj angle of transmit primary particle = " + << rmsMsc/mrad << " mrad " << G4endl; + + G4cout << " MultipleScattering: computed theta0 (Highland formula) = " + << ComputeMscHighland()/mrad << " mrad" << G4endl; + } + + G4cout.precision(prec); + + histoManager->save(); + // show Rndm status HepRandom::showEngineStatus(); } @@ -184,16 +194,16 @@ G4double RunAction::ComputeMscHighland() //compute the width of the Gaussian central part of the MultipleScattering //projected angular distribution. //Eur. Phys. Jour. C15 (2000) page 166, formule 23.9 - + G4double t = (detector->GetAbsorberThickness()) /(detector->GetAbsorberMaterial()->GetRadlen()); if (t < DBL_MIN) return 0.; - - G4ParticleGun* particle = primary->GetParticleGun(); + + G4ParticleGun* particle = primary->GetParticleGun(); G4double T = particle->GetParticleEnergy(); G4double M = particle->GetParticleDefinition()->GetPDGMass(); - G4double z = particle->GetParticleDefinition()->GetPDGCharge()/eplus; - + G4double z = abs(particle->GetParticleDefinition()->GetPDGCharge()/eplus); + G4double bpc = T*(T+2*M)/(T+M); G4double teta0 = 13.6*MeV*z*sqrt(t)*(1.+0.038*log(t))/bpc; return teta0; diff --git a/examples/extended/electromagnetic/TestEm5/src/StackingAction.cc b/examples/extended/electromagnetic/TestEm5/src/StackingAction.cc index 3ca6f2a416..2396f1fcb2 100644 --- a/examples/extended/electromagnetic/TestEm5/src/StackingAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/StackingAction.cc @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: StackingAction.cc,v 1.1 2003/08/11 10:21:33 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: StackingAction.cc,v 1.3 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -36,17 +35,13 @@ #include "G4Track.hh" -#ifdef G4ANALYSIS_USE - #include "AIDA/IHistogram1D.h" -#endif - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... StackingAction::StackingAction(RunAction* RA, EventAction* EA, HistoManager* HM) :runaction(RA), eventaction(EA), histoManager(HM) { - killSecondary = false; - stackMessenger = new StackingMessenger(this); + killSecondary = false; + stackMessenger = new StackingMessenger(this); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -58,36 +53,26 @@ StackingAction::~StackingAction() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -G4ClassificationOfNewTrack +G4ClassificationOfNewTrack StackingAction::ClassifyNewTrack(const G4Track* aTrack) { - //keep primary particle + //keep primary particle if (aTrack->GetParentID() == 0) return fUrgent; - + //count secondary particles runaction->CountParticles(aTrack->GetDefinition()); - -#ifdef G4ANALYSIS_USE - // + + // //energy spectrum of secondaries // G4double energy = aTrack->GetKineticEnergy(); G4double charge = aTrack->GetDefinition()->GetPDGCharge(); - - if (charge != 0.) { - if (histoManager->GetHisto(2)) { - G4double unit = histoManager->GetHistoUnit(2); - histoManager->GetHisto(2)->fill(energy/unit); - } - } - - if (aTrack->GetDefinition() == G4Gamma::Gamma()) { - if (histoManager->GetHisto(3)) { - histoManager->GetHisto(3)->fill(log10(energy/MeV)); - } - } -#endif - + + if (charge != 0.) histoManager->FillHisto(2,energy); + + if (aTrack->GetDefinition() == G4Gamma::Gamma()) + histoManager->FillHisto(3, log10(energy/MeV)); + //stack or delete secondaries G4ClassificationOfNewTrack status = fUrgent; if (killSecondary) status = fKill; diff --git a/examples/extended/electromagnetic/TestEm5/src/StackingMessenger.cc b/examples/extended/electromagnetic/TestEm5/src/StackingMessenger.cc index bf425f4807..bb416800e1 100644 --- a/examples/extended/electromagnetic/TestEm5/src/StackingMessenger.cc +++ b/examples/extended/electromagnetic/TestEm5/src/StackingMessenger.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: StackingMessenger.cc,v 1.2 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: StackingMessenger.cc,v 1.1 2003/08/11 10:21:37 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/SteppingAction.cc b/examples/extended/electromagnetic/TestEm5/src/SteppingAction.cc index 55799ddb3c..2b04cac9ba 100644 --- a/examples/extended/electromagnetic/TestEm5/src/SteppingAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/SteppingAction.cc @@ -20,12 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: SteppingAction.cc,v 1.2 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: SteppingAction.cc,v 1.1 2003/08/11 10:22:10 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -38,10 +35,6 @@ #include "G4Track.hh" -#ifdef G4ANALYSIS_USE - #include "AIDA/IHistogram1D.h" -#endif - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... SteppingAction::SteppingAction(DetectorConstruction* DET, RunAction* RA, diff --git a/examples/extended/electromagnetic/TestEm5/src/SteppingVerbose.cc b/examples/extended/electromagnetic/TestEm5/src/SteppingVerbose.cc index 2c6815af88..d8e58684fb 100644 --- a/examples/extended/electromagnetic/TestEm5/src/SteppingVerbose.cc +++ b/examples/extended/electromagnetic/TestEm5/src/SteppingVerbose.cc @@ -20,9 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: SteppingVerbose.cc,v 1.1 2003/08/11 10:22:17 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingVerbose.cc,v 1.2 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/TrackingAction.cc b/examples/extended/electromagnetic/TestEm5/src/TrackingAction.cc index 68a78c3635..de7cc87977 100644 --- a/examples/extended/electromagnetic/TestEm5/src/TrackingAction.cc +++ b/examples/extended/electromagnetic/TestEm5/src/TrackingAction.cc @@ -20,13 +20,10 @@ // * statement, and all its terms. * // ******************************************************************** // - // -// $Id: TrackingAction.cc,v 1.3 2004/02/19 18:18:54 maire Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: TrackingAction.cc,v 1.8 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -38,10 +35,6 @@ #include "HistoManager.hh" #include "G4Track.hh" - -#ifdef G4ANALYSIS_USE - #include "AIDA/IHistogram1D.h" -#endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -49,13 +42,13 @@ TrackingAction::TrackingAction(DetectorConstruction* DET,RunAction* RA, EventAction* EA, HistoManager* HM) :detector(DET), runaction(RA), eventaction(EA), histoManager(HM) { } - + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void TrackingAction::PreUserTrackingAction(const G4Track* aTrack ) -{ +{ // few initialisations - // + // if (aTrack->GetTrackID() == 1) { worldLimit = 0.5*(detector->GetWorldSizeX()); primaryCharge = aTrack->GetDefinition()->GetPDGCharge(); @@ -79,11 +72,10 @@ void TrackingAction::PostUserTrackingAction(const G4Track* aTrack) if (aTrack->GetTrackID() == 1) flag = 2; if (transmit) eventaction->SetTransmitFlag(flag); if (reflect) eventaction->SetReflectFlag(flag); - -#ifdef G4ANALYSIS_USE - // + + // //histograms - // + // G4int id = 0; G4bool charged = (charge != 0.); G4bool neutral = !charged; @@ -94,49 +86,48 @@ void TrackingAction::PostUserTrackingAction(const G4Track* aTrack) else if (transmit && neutral) id = 8; else if (reflect && charged) id = 11; else if (reflect && neutral) id = 14; - if (histoManager->GetHisto(id)) { - G4double energy = aTrack->GetKineticEnergy(); - G4double unit = histoManager->GetHistoUnit(id); - histoManager->GetHisto(id)->fill(energy/unit); - } - + + histoManager->FillHisto(id, aTrack->GetKineticEnergy()); + //space angle distribution at exit // if (transmit && charged) id = 5; else if (transmit && neutral) id = 9; else if (reflect && charged) id = 12; else if (reflect && neutral) id = 15; - if (histoManager->GetHisto(id)) { - G4ThreeVector direction = aTrack->GetMomentumDirection(); - G4double theta = acos(abs(direction.x())); + + G4ThreeVector direction = aTrack->GetMomentumDirection(); + if (histoManager->HistoExist(id)) { + G4double theta = acos(direction.x()); G4double dteta = histoManager->GetBinWidth(id); - G4double weight = 1./(2*pi*sin(theta)*dteta); + G4double weight = 1./(twopi*sin(theta)*dteta); G4double unit = histoManager->GetHistoUnit(id); - histoManager->GetHisto(id)->fill(theta/unit,weight*unit*unit); + histoManager->FillHisto(id,theta,weight*unit*unit); } - - //projected angle distribution at exit + + //projected angles distribution at exit // if (transmit && charged) id = 6; else if (transmit && neutral) id = 10; else if (reflect && charged) id = 13; else if (reflect && neutral) id = 16; - if (histoManager->GetHisto(id)) { - G4ThreeVector momentum = aTrack->GetMomentum(); - G4double unit = histoManager->GetHistoUnit(id); - histoManager->GetHisto(id)->fill(atan(momentum.y()/abs(momentum.x()))/unit); - histoManager->GetHisto(id)->fill(atan(momentum.z()/abs(momentum.x()))/unit); + + if(id>0) { + G4double tet = atan(direction.y()/abs(direction.x())); + histoManager->FillHisto(id,tet); + if (transmit && (flag == 2)) runaction->AddMscProjTheta(tet); + + tet = atan(direction.z()/abs(direction.x())); + histoManager->FillHisto(id,tet); + if (transmit && (flag == 2)) runaction->AddMscProjTheta(tet); } - + //projected position at exit // - if (transmit && charged) id = 7; - if (histoManager->GetHisto(id)) { - G4double unit = histoManager->GetHistoUnit(id); - histoManager->GetHisto(id)->fill(position.y()/unit); - histoManager->GetHisto(id)->fill(position.z()/unit); - } -#endif + if (transmit && charged) { + histoManager->FillHisto(7, position.y()); + histoManager->FillHisto(7, position.z()); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm5/src/VisManager.cc b/examples/extended/electromagnetic/TestEm5/src/VisManager.cc index b131fc0729..e3009ecc5d 100755 --- a/examples/extended/electromagnetic/TestEm5/src/VisManager.cc +++ b/examples/extended/electromagnetic/TestEm5/src/VisManager.cc @@ -20,13 +20,9 @@ // * statement, and all its terms. * // ******************************************************************** // +// $Id: VisManager.cc,v 1.3 2004/06/21 10:57:15 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// $Id: VisManager.cc,v 1.2 2003/11/13 15:10:28 johna Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -// -// John Allison 24th January 1998. - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm6/GNUmakefile b/examples/extended/electromagnetic/TestEm6/GNUmakefile index 2dc528378a..c2a699d651 100644 --- a/examples/extended/electromagnetic/TestEm6/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm6/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.9 2003/10/10 10:42:35 maire Exp $ +# $Id: GNUmakefile,v 1.11 2004/03/31 16:33:32 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -14,15 +14,19 @@ endif .PHONY: all all: lib bin -####G4ANALYSIS_USE := true +#### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE - CPPFLAGS += -DG4ANALYSIS_USE +USE_AIDA := true +endif + +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA endif include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` diff --git a/examples/extended/electromagnetic/TestEm6/History b/examples/extended/electromagnetic/TestEm6/History index 3a7a022207..404a67b752 100644 --- a/examples/extended/electromagnetic/TestEm6/History +++ b/examples/extended/electromagnetic/TestEm6/History @@ -1,4 +1,4 @@ -$Id: History,v 1.16 2003/11/25 18:31:47 vnivanch Exp $ +$Id: History,v 1.18 2004/03/31 16:33:33 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,12 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +31-03-04 mma (testem6-V06-01-00) +- remove direct interface with root + +15-03-04 mma (testem6-V06-00-00) +- example of histograms with ROOT: USE_ROOT 25-11-03 V.Ivanchenko (testem6-V05-02-02) - Fix geometry (G.Cosmo) diff --git a/examples/extended/electromagnetic/TestEm6/README b/examples/extended/electromagnetic/TestEm6/README index 9c8ca57902..61036cc063 100644 --- a/examples/extended/electromagnetic/TestEm6/README +++ b/examples/extended/electromagnetic/TestEm6/README @@ -1,4 +1,4 @@ -$Id: README,v 1.8 2003/10/10 10:42:35 maire Exp $ +$Id: README,v 1.12 2004/06/23 11:29:59 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -110,30 +110,47 @@ $Id: README,v 1.8 2003/10/10 10:42:35 maire Exp $ 7- HISTOGRAMS - Testem6 produces 6 histograms (saved as testem6.paw) which illustrate - the final state of the GammaConversionToMuons process. - See their definitions in RunAction.cc - - Note that, by default, histograms are disabled. To activate them, uncomment - the flag G4ANALYSIS_USE in GNUmakefile. + Testem6 produces 6 histograms which illustrate the final state of + the GammaConversionToMuons process. See their definitions in RunAction.cc + + The histograms are saved as testem7.paw + + Note that, by default, histograms are disabled. To activate them, uncomment + G4ANALYSIS_USE in GNUmakefile. - 8- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + 8- Using histograms + ------------------- - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + + 9- HOW TO INCREASE STATISTICS ON gamma -> mu+mu- ? The processes of gamma -> mu+mu- and e+e- -> mu+mu- diff --git a/examples/extended/electromagnetic/TestEm6/TestEm6.out b/examples/extended/electromagnetic/TestEm6/TestEm6.out index 4c1ba44d19..d7fe272b9a 100644 --- a/examples/extended/electromagnetic/TestEm6/TestEm6.out +++ b/examples/extended/electromagnetic/TestEm6/TestEm6.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -93,7 +93,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -111,7 +111,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -167,8 +167,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 31.9 m 0 fm 0 fm 29.8 TeV 0 eV 0 fm 0 fm Iron initStep - 1 189 m -4.12 mm -4.49 cm 11.9 TeV 17.9 TeV 158 m 158 m Iron MuIoni - 2 250 m 589 mum -4.69 cm 8.46 TeV 3.46 TeV 60.5 m 218 m OutOfWorld Transportation + 1 250 m -65.2 mum -53.1 mum 18.1 TeV 11.7 TeV 218 m 218 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = mu+, Track ID = 2, Parent ID = 1 @@ -176,8 +175,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 31.9 m 0 fm 0 fm 70.2 TeV 0 eV 0 fm 0 fm Iron initStep - 1 217 m 2.91 cm 4.76 cm 20.6 TeV 49.6 TeV 185 m 185 m Iron MuIoni - 2 250 m 2.96 cm 4.72 cm 13.3 TeV 7.3 TeV 33.1 m 218 m OutOfWorld Transportation + 1 250 m 27.6 mum 22.6 mum 40.5 TeV 29.7 TeV 218 m 218 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -185,23 +183,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 -250 m 0 fm 0 fm 100 TeV 0 eV 0 fm 0 fm Iron initStep - 1 120 m 0 fm 0 fm 0 eV 0 eV 370 m 370 m Iron GammaToMuPair - -********************************************************************************************************* -* G4Track Information: Particle = mu-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 120 m 0 fm 0 fm 20 TeV 0 eV 0 fm 0 fm Iron initStep - 1 250 m 1.11 mm 1.17 mm 9.94 TeV 10.1 TeV 130 m 130 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = mu+, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 120 m 0 fm 0 fm 80 TeV 0 eV 0 fm 0 fm Iron initStep - 1 250 m -277 mum -292 mum 44.2 TeV 35.8 TeV 130 m 130 m OutOfWorld Transportation + 1 250 m 0 fm 0 fm 100 TeV 0 eV 500 m 500 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -209,31 +191,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 -250 m 0 fm 0 fm 100 TeV 0 eV 0 fm 0 fm Iron initStep - 1 91.5 m 0 fm 0 fm 0 eV 0 eV 342 m 342 m Iron GammaToMuPair - -********************************************************************************************************* -* G4Track Information: Particle = mu-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 91.5 m 0 fm 0 fm 567 GeV 0 eV 0 fm 0 fm Iron initStep - 1 130 m -5.6 cm -29.2 cm 416 GeV 151 GeV 38.9 m 38.9 m Iron MuIoni - 2 163 m -11.3 cm -37.6 cm 234 GeV 182 GeV 32.1 m 71.1 m Iron MuIoni - 3 184 m -15.1 cm -50.6 cm 180 GeV 53.6 GeV 21.6 m 92.6 m Iron MuIoni - 4 202 m -12.6 cm -56.7 cm 142 GeV 38.3 GeV 17.7 m 110 m Iron MuIoni - 5 217 m -19.3 cm -69.2 cm 112 GeV 30.4 GeV 14.7 m 125 m Iron MuIoni - 6 229 m -12.3 cm -69.9 cm 87.3 GeV 24.3 GeV 12 m 137 m Iron MuIoni - 7 238 m -10.8 cm -71.5 cm 65.9 GeV 21.4 GeV 9.8 m 147 m Iron MuIoni - 8 246 m -3.62 cm -67.1 cm 52.8 GeV 13.1 GeV 7.7 m 155 m Iron MuIoni - 9 250 m -9.93 mm -70.1 cm 45.7 GeV 7.14 GeV 3.91 m 158 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = mu+, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 91.5 m 0 fm 0 fm 99.4 TeV 0 eV 0 fm 0 fm Iron initStep - 1 250 m -40.5 mum -4.92 mum 36 TeV 63.4 TeV 158 m 158 m OutOfWorld Transportation + 1 250 m 0 fm 0 fm 100 TeV 0 eV 500 m 500 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 1, Parent ID = 0 @@ -241,37 +199,33 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 -250 m 0 fm 0 fm 100 TeV 0 eV 0 fm 0 fm Iron initStep - 1 -190 m 0 fm 0 fm 0 eV 0 eV 60.2 m 60.2 m Iron GammaToMuPair + 1 -84.8 m 0 fm 0 fm 0 eV 0 eV 165 m 165 m Iron GammaToMuPair ********************************************************************************************************* * G4Track Information: Particle = mu-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -190 m 0 fm 0 fm 82.5 TeV 0 eV 0 fm 0 fm Iron initStep - 1 -61.8 cm -5.73 cm 2.49 cm 21.6 TeV 60.9 TeV 189 m 189 m Iron MuIoni - 2 147 m 6.31 mm 1.5 cm 8.1 TeV 13.5 TeV 147 m 336 m Iron MuIoni - 3 250 m 8.78 mm 3.44 cm 4.57 TeV 3.53 TeV 103 m 440 m OutOfWorld Transportation + 0 -84.8 m 0 fm 0 fm 92 TeV 0 eV 0 fm 0 fm Iron initStep + 1 250 m 623 mum -1.81 mm 50 TeV 42 TeV 335 m 335 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = mu+, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -190 m 0 fm 0 fm 17.5 TeV 0 eV 0 fm 0 fm Iron initStep - 1 -49.3 m 1.44 cm 4.56 cm 7.95 TeV 9.6 TeV 141 m 141 m Iron MuIoni - 2 66.3 m -1.14 cm 10.4 cm 4.21 TeV 3.74 TeV 116 m 256 m Iron MuIoni - 3 162 m 2.45 cm 19.7 cm 2.45 TeV 1.76 TeV 95.4 m 351 m Iron MuIoni - 4 240 m -9.84 mm 24.6 cm 1.4 TeV 1.05 TeV 78.9 m 430 m Iron MuIoni - 5 250 m -1.15 cm 25.1 cm 1.3 TeV 93.7 GeV 9.53 m 440 m OutOfWorld Transportation + 0 -84.8 m 0 fm 0 fm 8.02 TeV 0 eV 0 fm 0 fm Iron initStep + 1 119 m -3.42 mm 8.94 cm 2.06 TeV 5.96 TeV 204 m 204 m Iron MuIoni + 2 232 m -9.57 cm 18.7 cm 1.39 TeV 666 GeV 112 m 316 m Iron MuIoni + 3 250 m -9.27 cm 18.1 cm 1.31 TeV 83.5 GeV 18.4 m 335 m OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 5 - User=0.01s Real=2.04s Sys=0.02s + User=0.01s Real=0.14s Sys=0.01s --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1436682984, 1663224890 + Current couple of seeds = 1362242984, 2014133420 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm6/include/RunAction.hh b/examples/extended/electromagnetic/TestEm6/include/RunAction.hh index f9fa2ab9bb..0b2729ec86 100644 --- a/examples/extended/electromagnetic/TestEm6/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm6/include/RunAction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.hh,v 1.5 2003/10/10 10:42:39 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.hh,v 1.7 2004/03/31 16:33:35 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -39,13 +39,15 @@ class G4Run; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA namespace AIDA { class ITree; class IHistogram1D; } #endif +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class RunAction : public G4UserRunAction { public: @@ -56,19 +58,19 @@ class RunAction : public G4UserRunAction void BeginOfRunAction(const G4Run*); void EndOfRunAction(const G4Run*); -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} #endif - + private: void bookHisto(); void cleanHisto(); -#ifdef G4ANALYSIS_USE private: +#ifdef USE_AIDA AIDA::ITree* tree; AIDA::IHistogram1D* histo[6]; -#endif +#endif }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm6/run02.mac b/examples/extended/electromagnetic/TestEm6/run02.mac index 054ad28825..02e645e851 100644 --- a/examples/extended/electromagnetic/TestEm6/run02.mac +++ b/examples/extended/electromagnetic/TestEm6/run02.mac @@ -1,4 +1,4 @@ -# $Id: run02.mac,v 1.4 2003/10/10 10:42:36 maire Exp $ +# $Id: run02.mac,v 1.5 2004/03/15 11:23:16 maire Exp $ # # Macro file for "TestEm6.cc" # (can be run in batch, without graphic) @@ -16,4 +16,4 @@ /gun/energy 100 TeV /testem/gun/rndm 0.8 # -#/run/beamOn 50000 +/run/beamOn 50000 diff --git a/examples/extended/electromagnetic/TestEm6/src/EventAction.cc b/examples/extended/electromagnetic/TestEm6/src/EventAction.cc index 0a04c749cb..f5e6489e76 100644 --- a/examples/extended/electromagnetic/TestEm6/src/EventAction.cc +++ b/examples/extended/electromagnetic/TestEm6/src/EventAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: EventAction.cc,v 1.3 2003/10/10 10:42:39 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: EventAction.cc,v 1.4 2004/03/15 11:23:16 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -76,9 +76,9 @@ void EventAction::EndOfEventAction(const G4Event* evt) for(G4int i=0; iGetTrajectoryContainer()))[i]); - if (drawFlag == "all") trj->DrawTrajectory(50); + if (drawFlag == "all") trj->DrawTrajectory(1000); else if ((drawFlag == "charged")&&(trj->GetCharge() != 0.)) - trj->DrawTrajectory(50); + trj->DrawTrajectory(1000); } } } diff --git a/examples/extended/electromagnetic/TestEm6/src/RunAction.cc b/examples/extended/electromagnetic/TestEm6/src/RunAction.cc index c26985ddf9..95f82a22b0 100644 --- a/examples/extended/electromagnetic/TestEm6/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm6/src/RunAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: RunAction.cc,v 1.5 2003/10/10 10:42:39 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.cc,v 1.7 2004/03/31 16:33:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -33,12 +33,10 @@ #include "G4Run.hh" #include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" #include "Randomize.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/AIDA.h" #endif @@ -58,7 +56,7 @@ RunAction::~RunAction() void RunAction::bookHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA // Creating the analysis factory AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); @@ -84,17 +82,17 @@ void RunAction::bookHisto() delete hf; delete tf; delete af; -#endif +#endif + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::cleanHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA tree->commit(); // Writing the histograms to the file - tree->close(); // and closing the tree (and the file) - + tree->close(); // and closing the tree (and the file) delete tree; #endif } @@ -112,19 +110,12 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) //histograms // if (aRun->GetRunID() == 0) bookHisto(); - - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void RunAction::EndOfRunAction(const G4Run*) { - //draw the events - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); - // show Rndm status HepRandom::showEngineStatus(); } diff --git a/examples/extended/electromagnetic/TestEm6/src/SteppingAction.cc b/examples/extended/electromagnetic/TestEm6/src/SteppingAction.cc index c5063bf160..49e72719a2 100644 --- a/examples/extended/electromagnetic/TestEm6/src/SteppingAction.cc +++ b/examples/extended/electromagnetic/TestEm6/src/SteppingAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: SteppingAction.cc,v 1.3 2003/10/10 10:42:40 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.cc,v 1.5 2004/03/31 16:33:36 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -35,7 +35,7 @@ #include "G4VProcess.hh" #include "G4ParticleTypes.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif @@ -77,15 +77,15 @@ void SteppingAction::UserSteppingAction(const G4Step* aStep) } G4double xPlus = Eplus/EGamma, xMinus = Eminus/EGamma; G4double thetaPlus = PGamma.angle(Pplus), thetaMinus = PGamma.angle(Pminus); - -#ifdef G4ANALYSIS_USE + static const G4double muonMass=G4MuonPlus::MuonPlus()->GetPDGMass(); - G4double GammaPlus=EGamma*xPlus/muonMass; + G4double GammaMinus=EGamma*xMinus/muonMass; + +#ifdef USE_AIDA runAction->GetHisto(0)->fill(1./(1.+pow(thetaPlus*GammaPlus,2))); runAction->GetHisto(1)->fill(log10(thetaPlus*GammaPlus)); - G4double GammaMinus=EGamma*xMinus/muonMass; runAction->GetHisto(2)->fill(log10(thetaMinus*GammaMinus)); runAction->GetHisto(3)->fill(log10(fabs(thetaPlus *GammaPlus -thetaMinus*GammaMinus))); diff --git a/examples/extended/electromagnetic/TestEm7/GNUmakefile b/examples/extended/electromagnetic/TestEm7/GNUmakefile index 3f6e27a155..e0caa36725 100644 --- a/examples/extended/electromagnetic/TestEm7/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm7/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 2003/10/10 16:21:04 maire Exp $ +# $Id: GNUmakefile,v 1.5 2004/03/31 17:09:45 maire Exp $ # -------------------------------------------------------------- # GNUmakefile for examples module. Gabriele Cosmo, 06/04/98. # -------------------------------------------------------------- @@ -17,12 +17,16 @@ all: lib bin #### G4ANALYSIS_USE := true ifdef G4ANALYSIS_USE - CPPFLAGS += -DG4ANALYSIS_USE +USE_AIDA := true +endif + +ifdef USE_AIDA + CPPFLAGS += -DUSE_AIDA endif include $(G4INSTALL)/config/architecture.gmk -ifdef G4ANALYSIS_USE +ifdef USE_AIDA # for the aida-config command see the README file CPPFLAGS += `aida-config --include` LDFLAGS += `aida-config --lib` diff --git a/examples/extended/electromagnetic/TestEm7/History b/examples/extended/electromagnetic/TestEm7/History index 1125bcd3c6..9eefb17129 100644 --- a/examples/extended/electromagnetic/TestEm7/History +++ b/examples/extended/electromagnetic/TestEm7/History @@ -1,4 +1,4 @@ -$Id: History,v 1.14 2004/02/06 17:12:45 vnivanch Exp $ +$Id: History,v 1.18 2004/06/09 16:20:28 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -14,6 +14,18 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +09-06-04 mma (testem7-V06-01-01) +- remove PhysicsList Particles and General + +31-03-04 mma (testem7-V06-01-00) +- remove direct root interface + +15-03-04 mma (testem7-V06-00-02) +- put back G4ANALYSIS_USE in GNUmakefile + +10-03-04 mma (testem7-V06-00-01) +- example of histogram with ROOT: USE_ROOT 06-02-04 V.Ivanchenko (testem7-V06-00-00) - Remove "add binary" from TestEm7.in macro diff --git a/examples/extended/electromagnetic/TestEm7/README b/examples/extended/electromagnetic/TestEm7/README index 4cc0896c0e..239455a136 100644 --- a/examples/extended/electromagnetic/TestEm7/README +++ b/examples/extended/electromagnetic/TestEm7/README @@ -1,4 +1,4 @@ -$Id: README,v 1.2 2003/10/10 16:21:19 maire Exp $ +$Id: README,v 1.7 2004/06/23 11:29:50 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -103,15 +103,17 @@ $Id: README,v 1.2 2003/10/10 16:21:19 maire Exp $ the maximum allowed for the step size of charged particles. (command /testem/stepMax ) - The result is a 1D histogram (saved as testem7.paw) which is the total - energy deposited along the trajectory of the incident particle. + The result is a 1D histogram which is the total energy deposited along + the trajectory of the incident particle. + + The histogram is saved in paw (testem7.paw) The bin size is egal to stepMax. The number of bins is determined by the thickness of the absorber (with a minimum of 100 bins). The total energy deposited is plotted in MeV/mm. Note that, by default, histograms are disabled. To activate them, uncomment - the flag G4ANALYSIS_USE in GNUmakefile. + G4ANALYSIS_USE in GNUmakefile. 7- DOSE IN 'TEST-VOLUMES' @@ -121,19 +123,41 @@ $Id: README,v 1.2 2003/10/10 16:21:19 maire Exp $ Notice that the doses are not re initialized between runs, i.e. they are cumulative over the runs. (idem for the histogram of the Bragg peak.) - 8- Using the Anaphe implementation of the AIDA 3.0 histograms: - -------------------------------------------------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config + 8- Using histograms + ------------------- - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm7/TestEm7.in b/examples/extended/electromagnetic/TestEm7/TestEm7.in index 3395a09306..ec8add169b 100644 --- a/examples/extended/electromagnetic/TestEm7/TestEm7.in +++ b/examples/extended/electromagnetic/TestEm7/TestEm7.in @@ -1,4 +1,4 @@ -# $Id: TestEm7.in,v 1.6 2004/02/06 17:12:45 vnivanch Exp $ +# $Id: TestEm7.in,v 1.7 2004/03/10 12:32:19 maire Exp $ # # Macro file for "TestEm7.cc" # (can be run in batch, without graphic) @@ -20,7 +20,7 @@ # /testem/phys/addPhysics standard # em physics ###/testem/phys/addPhysics g4v52 # em physics -#/testem/phys/addPhysics binary # hadronic physics +###/testem/phys/addPhysics binary # hadronic physics # /run/initialize # diff --git a/examples/extended/electromagnetic/TestEm7/TestEm7.out b/examples/extended/electromagnetic/TestEm7/TestEm7.out index c38cb08bc5..05a51ebf21 100644 --- a/examples/extended/electromagnetic/TestEm7/TestEm7.out +++ b/examples/extended/electromagnetic/TestEm7/TestEm7.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -52,7 +52,7 @@ Current available graphics systems are: /testem/phys/addPhysics standard # em physics PhysicsList::AddPhysicsList: ###/testem/phys/addPhysics g4v52 # em physics -#/testem/phys/addPhysics binary # hadronic physics +###/testem/phys/addPhysics binary # hadronic physics # /run/initialize userDetector->Construct() start. @@ -132,8 +132,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -142,7 +142,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -160,7 +160,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -235,20 +235,20 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 10000 - User=157.8s Real=351.83s Sys=76.83s + User=154.28s Real=375.56s Sys=54.77s --------------------------------------------------------- Cumulated Doses : Edep Edep/Ebeam Dose -tally 0: 10.392776 GeV 0.64954851 % 0.00020813838 Gy -tally 1: 7.8411972 GeV 0.49007483 % 0.00015703736 Gy -tally 2: 3.5135969 GeV 0.2195998 % 7.0367565e-05 Gy -tally 3: 1.7251868 GeV 0.10782418 % 3.4550691e-05 Gy +tally 0: 10.400219 GeV 0.65001367 % 0.00020828743 Gy +tally 1: 7.9906299 GeV 0.49941437 % 0.00016003008 Gy +tally 2: 3.6423712 GeV 0.2276482 % 7.2946557e-05 Gy +tally 3: 1.8338852 GeV 0.11461782 % 3.6727615e-05 Gy --------------------------------------------------------- --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1526069608, 646338923 + Current couple of seeds = 1800509887, 111688235 ---------------------------------------- Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm7/include/PhysListGeneral.hh b/examples/extended/electromagnetic/TestEm7/include/PhysListGeneral.hh deleted file mode 100644 index 6c12416f4d..0000000000 --- a/examples/extended/electromagnetic/TestEm7/include/PhysListGeneral.hh +++ /dev/null @@ -1,65 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -// -// $Id: PhysListGeneral.hh,v 1.2 2003/10/10 16:21:26 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#ifndef PhysListGeneral_h -#define PhysListGeneral_h 1 - -#include "G4VPhysicsConstructor.hh" -#include "globals.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -class PhysListGeneral : public G4VPhysicsConstructor -{ - public: - PhysListGeneral(const G4String& name = "general"); - ~PhysListGeneral(); - - public: - // This method is dummy for physics - 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(); - -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#endif - - - - - - - - diff --git a/examples/extended/electromagnetic/TestEm7/include/PhysListParticles.hh b/examples/extended/electromagnetic/TestEm7/include/PhysListParticles.hh deleted file mode 100644 index f100bedc63..0000000000 --- a/examples/extended/electromagnetic/TestEm7/include/PhysListParticles.hh +++ /dev/null @@ -1,65 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -// -// $Id: PhysListParticles.hh,v 1.2 2003/10/10 16:21:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#ifndef PhysListParticles_h -#define PhysListParticles_h 1 - -#include "G4VPhysicsConstructor.hh" -#include "globals.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -class PhysListParticles : public G4VPhysicsConstructor -{ - public: - PhysListParticles(const G4String& name = "particles"); - ~PhysListParticles(); - - public: - // This method will be invoked in the Construct() method. - // each particle type will be instantiated - void ConstructParticle(); - - // This method is dummy. - void ConstructProcess() {}; - -}; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#endif - - - - - - - - diff --git a/examples/extended/electromagnetic/TestEm7/include/PhysicsList.hh b/examples/extended/electromagnetic/TestEm7/include/PhysicsList.hh index 051afc24ca..6c33970ebc 100644 --- a/examples/extended/electromagnetic/TestEm7/include/PhysicsList.hh +++ b/examples/extended/electromagnetic/TestEm7/include/PhysicsList.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.hh,v 1.3 2003/06/16 16:47:56 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: PhysicsList.hh,v 1.4 2004/06/09 16:20:29 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // @@ -66,12 +66,10 @@ class PhysicsList: public G4VModularPhysicsList G4double cutForGamma; G4double cutForElectron; G4double cutForPositron; - - G4VPhysicsConstructor* emPhysicsList; - G4VPhysicsConstructor* generalPhysicsList; - G4VPhysicsConstructor* particleList; + + G4String emName; + G4VPhysicsConstructor* emPhysicsList; std::vector hadronPhys; - G4String emName; StepMax* stepMaxProcess; diff --git a/examples/extended/electromagnetic/TestEm7/include/RunAction.hh b/examples/extended/electromagnetic/TestEm7/include/RunAction.hh index febd1f468f..ba7fe526b8 100644 --- a/examples/extended/electromagnetic/TestEm7/include/RunAction.hh +++ b/examples/extended/electromagnetic/TestEm7/include/RunAction.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: RunAction.hh,v 1.2 2003/10/10 16:21:27 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.hh,v 1.4 2004/03/31 17:09:45 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,7 +37,7 @@ class PhysicsList; class PrimaryGeneratorAction; class G4Run; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA namespace AIDA { class ITree; class IHistogram1D; @@ -58,12 +58,12 @@ class RunAction : public G4UserRunAction G4double* GetTallyEdep() {return tallyEdep;}; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA AIDA::IHistogram1D* GetHisto(G4int id) {return histo[id];} - +#endif + G4double GetBinLength() {return binLength;}; G4double GetOffsetX() {return offsetX;} -#endif private: void bookHisto(); @@ -75,14 +75,14 @@ class RunAction : public G4UserRunAction PrimaryGeneratorAction* kinematic; G4double* tallyEdep; -#ifdef G4ANALYSIS_USE - private: + private: +#ifdef USE_AIDA AIDA::ITree* tree; AIDA::IHistogram1D* histo[1]; - +#endif + G4double binLength; - G4double offsetX; -#endif + G4double offsetX; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm7/ionC12.mac b/examples/extended/electromagnetic/TestEm7/ionC12.mac index 4c61174751..9060127989 100644 --- a/examples/extended/electromagnetic/TestEm7/ionC12.mac +++ b/examples/extended/electromagnetic/TestEm7/ionC12.mac @@ -1,4 +1,4 @@ -# $Id: ionC12.mac,v 1.5 2003/12/05 11:17:15 vnivanch Exp $ +# $Id: ionC12.mac,v 1.6 2004/03/10 10:48:11 maire Exp $ # # Macro file for "TestEm7.cc" # (can be run in batch, without graphic) @@ -6,7 +6,6 @@ # /control/verbose 2 /run/verbose 2 -/tracking/verbose 0 # /testem/det/setMat Water /testem/det/setSizeX 20 cm @@ -19,17 +18,18 @@ /testem/det/tallyPosition 0. 0. 0. cm /testem/det/tallyPosition 5. 0. 0. cm # -/testem/phys/addPhysics standard #em physics -####/testem/phys/addPhysics g4v52 #em physics +/testem/phys/addPhysics standard #em physics +####/testem/phys/addPhysics g4v52 #em physics # -/testem/phys/addPhysics binary #hadronic physics -/testem/phys/addPhysics binary_ion #hadronic physics -/testem/phys/addPhysics elastic #hadronic physics +####/testem/phys/addPhysics binary #hadronic physics +####/testem/phys/addPhysics binary_ion #hadronic physics +####/testem/phys/addPhysics elastic #hadronic physics # /run/initialize # -/gun/particle ion #GenericIon C12 -/gun/ion 6 12 6 +####/gun/particle ion +####/gun/ion 6 12 +/gun/particle ionC12 /gun/energy 3.5 GeV # /testem/event/printModulo 1000 diff --git a/examples/extended/electromagnetic/TestEm7/src/PhysListGeneral.cc b/examples/extended/electromagnetic/TestEm7/src/PhysListGeneral.cc deleted file mode 100644 index 99a649c457..0000000000 --- a/examples/extended/electromagnetic/TestEm7/src/PhysListGeneral.cc +++ /dev/null @@ -1,72 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -// -// $Id: PhysListGeneral.cc,v 1.2 2003/10/10 16:21:31 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -#include "PhysListGeneral.hh" -#include "G4ParticleDefinition.hh" -#include "G4ProcessManager.hh" -#include "G4Decay.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListGeneral::PhysListGeneral(const G4String& name) - : G4VPhysicsConstructor(name) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListGeneral::~PhysListGeneral() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListGeneral::ConstructProcess() -{ - // Add Decay Process - - G4Decay* fDecayProcess = new G4Decay(); - - theParticleIterator->reset(); - while( (*theParticleIterator)() ){ - G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - - if (fDecayProcess->IsApplicable(*particle)) { - - pmanager ->AddProcess(fDecayProcess); - - // set ordering for PostStepDoIt and AtRestDoIt - pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); - pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); - - } - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - diff --git a/examples/extended/electromagnetic/TestEm7/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm7/src/PhysicsList.cc index 2f20d5457d..521a26daee 100644 --- a/examples/extended/electromagnetic/TestEm7/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm7/src/PhysicsList.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.cc,v 1.9 2003/11/19 10:16:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.cc,v 1.10 2004/06/09 16:20:31 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -31,8 +31,6 @@ #include "PhysicsList.hh" #include "PhysicsListMessenger.hh" -#include "PhysListParticles.hh" -#include "PhysListGeneral.hh" #include "PhysListEmStandard.hh" #include "PhysListEmG4v52.hh" #include "PhysListHadronElastic.hh" @@ -58,15 +56,8 @@ PhysicsList::PhysicsList() : G4VModularPhysicsList() SetVerboseLevel(1); - // Particles - particleList = new PhysListParticles("particles"); - - // General Physics - generalPhysicsList = new PhysListGeneral("general"); - // EM physics - emName = G4String("standard"); - emPhysicsList = new PhysListEmStandard(emName); + emPhysicsList = new PhysListEmStandard(emName = "standard"); } @@ -75,26 +66,151 @@ PhysicsList::PhysicsList() : G4VModularPhysicsList() PhysicsList::~PhysicsList() { delete pMessenger; - delete generalPhysicsList; delete emPhysicsList; for(size_t i=0; iConstructParticle(); +// pseudo-particles + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); + +// gamma + G4Gamma::GammaDefinition(); + +// optical photon + G4OpticalPhoton::OpticalPhotonDefinition(); + +// leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); + +// mesons + G4PionPlus::PionPlusDefinition(); + G4PionMinus::PionMinusDefinition(); + G4PionZero::PionZeroDefinition(); + G4Eta::EtaDefinition(); + G4EtaPrime::EtaPrimeDefinition(); + G4KaonPlus::KaonPlusDefinition(); + G4KaonMinus::KaonMinusDefinition(); + G4KaonZero::KaonZeroDefinition(); + G4AntiKaonZero::AntiKaonZeroDefinition(); + G4KaonZeroLong::KaonZeroLongDefinition(); + G4KaonZeroShort::KaonZeroShortDefinition(); + +// barions + G4Proton::ProtonDefinition(); + G4AntiProton::AntiProtonDefinition(); + G4Neutron::NeutronDefinition(); + G4AntiNeutron::AntiNeutronDefinition(); + +// ions + G4Deuteron::DeuteronDefinition(); + G4Triton::TritonDefinition(); + G4He3::He3Definition(); + G4Alpha::AlphaDefinition(); + G4GenericIon::GenericIonDefinition(); + IonC12::IonDefinition(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#include "G4ProcessManager.hh" +#include "G4Decay.hh" + void PhysicsList::ConstructProcess() { + // transportation + // AddTransportation(); - generalPhysicsList->ConstructProcess(); + + // electromagnetic physics list + // emPhysicsList->ConstructProcess(); + + // hadronic physics lists for(size_t i=0; iConstructProcess(); + + // decay process + // + G4Decay* fDecayProcess = new G4Decay(); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + + if (fDecayProcess->IsApplicable(*particle)) { + + pmanager ->AddProcess(fDecayProcess); + + // set ordering for PostStepDoIt and AtRestDoIt + pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); + pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); + + } + } + + // step limitation (as a full process) + // AddStepMax(); } @@ -144,12 +260,6 @@ void PhysicsList::AddPhysicsList(const G4String& name) #include "StepMax.hh" -#include "G4ProcessManager.hh" -#include "G4ParticleTypes.hh" -#include "G4ParticleTable.hh" - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - void PhysicsList::AddStepMax() { // Step limitation seen as a process diff --git a/examples/extended/electromagnetic/TestEm7/src/RunAction.cc b/examples/extended/electromagnetic/TestEm7/src/RunAction.cc index 18d295faff..723a87871c 100644 --- a/examples/extended/electromagnetic/TestEm7/src/RunAction.cc +++ b/examples/extended/electromagnetic/TestEm7/src/RunAction.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: RunAction.cc,v 1.4 2003/11/19 10:16:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: RunAction.cc,v 1.6 2004/03/31 17:09:46 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -34,14 +34,12 @@ #include "G4Run.hh" #include "G4RunManager.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" #include "G4UnitsTable.hh" #include "G4ios.hh" #include "Randomize.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/AIDA.h" #endif @@ -52,6 +50,7 @@ RunAction::RunAction(DetectorConstruction* det, PhysicsList* phys, :detector(det), physics(phys), kinematic(kin) { tallyEdep = new G4double[MaxTally]; + binLength = offsetX = 0.; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -66,22 +65,7 @@ RunAction::~RunAction() void RunAction::bookHisto() { -#ifdef G4ANALYSIS_USE - // Creating the analysis factory - AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); - // Creating the tree factory - AIDA::ITreeFactory* tf = af->createTreeFactory(); - - // Creating a tree mapped to an hbook file. - G4bool readOnly = false; - G4bool createNew = true; - tree = tf->create("testem7.paw", "hbook", readOnly, createNew); - - // Creating a histogram factory, whose histograms will be handled by the tree - AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); - - // Creating histograms G4double length = detector->GetAbsorSizeX(); G4double stepMax = physics->GetStepMaxProcess()->GetMaxStep(); const G4int nbmin = 100; @@ -89,6 +73,23 @@ void RunAction::bookHisto() if (nbBins < nbmin) nbBins = nbmin; binLength = length/nbBins; offsetX = 0.5*length; + +#ifdef USE_AIDA + // Create the analysis factory + AIDA::IAnalysisFactory* af = AIDA_createAnalysisFactory(); + + // Create the tree factory + AIDA::ITreeFactory* tf = af->createTreeFactory(); + + // Create a tree mapped to an hbook file. + G4bool readOnly = false; + G4bool createNew = true; + tree = tf->create("testem7.paw", "hbook", readOnly, createNew); + + // Create a histogram factory, whose histograms will be handled by the tree + AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); + + // Create histograms histo[0] = hf->createHistogram1D("1","Edep (MeV/mm)",nbBins, 0,length); delete hf; @@ -101,11 +102,10 @@ void RunAction::bookHisto() void RunAction::cleanHisto() { -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA tree->commit(); // Writing the histograms to the file tree->close(); // and closing the tree (and the file) - -// delete tree; + delete tree; #endif } @@ -125,11 +125,6 @@ void RunAction::BeginOfRunAction(const G4Run* aRun) bookHisto(); for (G4int j=0; jApplyCommand("/vis/scene/notifyHandlers"); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -154,10 +149,6 @@ void RunAction::EndOfRunAction(const G4Run*) } G4cout << "\n---------------------------------------------------------\n"; } - - //draw the events - if (G4VVisManager::GetConcreteInstance()) - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); // show Rndm status HepRandom::showEngineStatus(); diff --git a/examples/extended/electromagnetic/TestEm7/src/SteppingAction.cc b/examples/extended/electromagnetic/TestEm7/src/SteppingAction.cc index c7876cddfa..389d2cf5c1 100644 --- a/examples/extended/electromagnetic/TestEm7/src/SteppingAction.cc +++ b/examples/extended/electromagnetic/TestEm7/src/SteppingAction.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: SteppingAction.cc,v 1.2 2003/10/10 16:21:32 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: SteppingAction.cc,v 1.4 2004/03/31 17:09:46 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -33,7 +33,7 @@ #include "G4VProcess.hh" #include "G4ParticleTypes.hh" -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA #include "AIDA/IHistogram1D.h" #endif @@ -55,12 +55,12 @@ void SteppingAction::UserSteppingAction(const G4Step* aStep) G4double edep = aStep->GetTotalEnergyDeposit(); if (edep <= 0.) return; -#ifdef G4ANALYSIS_USE +#ifdef USE_AIDA G4double x = aStep->GetTrack()->GetPosition().x() + runAction->GetOffsetX(); G4double binLength = runAction->GetBinLength(); runAction->GetHisto(0)->fill(x, (edep/binLength)/(MeV/mm)); #endif - + //fill tallies // G4VPhysicalVolume* pVolume = aStep->GetTrack()->GetVolume(); diff --git a/examples/extended/electromagnetic/TestEm8/History b/examples/extended/electromagnetic/TestEm8/History index 5d95a25586..9aba914398 100644 --- a/examples/extended/electromagnetic/TestEm8/History +++ b/examples/extended/electromagnetic/TestEm8/History @@ -1,4 +1,4 @@ -$Id: History,v 1.12 2004/01/27 11:20:12 vnivanch Exp $ +$Id: History,v 1.13 2004/05/27 18:04:30 vnivanch Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,9 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +27-05-04 V.Ivant (testem8-V06-01-00) +- Updated test of PAI model + 27-01-04 V.Ivant (testem8-V06-00-00) - Fix model name diff --git a/examples/extended/electromagnetic/TestEm8/TestEm8.in b/examples/extended/electromagnetic/TestEm8/TestEm8.in index 6805210c2c..93adb66729 100644 --- a/examples/extended/electromagnetic/TestEm8/TestEm8.in +++ b/examples/extended/electromagnetic/TestEm8/TestEm8.in @@ -1,5 +1,5 @@ # -# Macro file 'run11.mac' for the initialization phase of "TestEm8.cc" +# Macro file for the initialization phase of "TestEm8.cc" # # It creates the default geometry (simple absorber cylinder ) # @@ -7,33 +7,21 @@ /run/verbose 2 #/tracking/verbose 2 # -# # select EM PhysicsList # #/testem/phys/addPhysics g4v52 -# -/testem/phys/addPhysics standard -# -#/testem/phys/addPhysics model +#/testem/phys/addPhysics standard +/testem/phys/addPhysics PAI # /testem/phys/setCuts 1 mm -#/testem/phys/VertexCuts 0.1 mm -#/testem/phys/MuonCuts 10.0 mm #/testem/stepMax 10 mm # -#/process/eLoss/preciseRange true -#/process/eLoss/integral true -# -# hist file name -# -/plots/sethistName g4.p11 -# # PLOT: energy deposit distribution in absorber # /plots/setnbinEn 20 /plots/setEnlow 0.0 MeV /plots/setEnhigh 0.060 MeV -# +/plots/sethistName g4.p11 # /run/initialize /run/particle/dumpCutValues @@ -53,12 +41,3 @@ /event/printModulo 100 /run/beamOn 1000 # -# - - - - - - - - diff --git a/examples/extended/electromagnetic/TestEm8/TestEm8.out b/examples/extended/electromagnetic/TestEm8/TestEm8.out index fe6a41a254..0071bd93db 100644 --- a/examples/extended/electromagnetic/TestEm8/TestEm8.out +++ b/examples/extended/electromagnetic/TestEm8/TestEm8.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -23,29 +23,16 @@ Current available graphics systems are: /run/verbose 2 #/tracking/verbose 2 # -# # select EM PhysicsList # #/testem/phys/addPhysics g4v52 -# -/testem/phys/addPhysics standard -PhysicsList::AddPhysicsList: -# -#/testem/phys/addPhysics model +#/testem/phys/addPhysics standard +/testem/phys/addPhysics PAI +PhysicsList::AddPhysicsList: # /testem/phys/setCuts 1 mm -#/testem/phys/VertexCuts 0.1 mm -#/testem/phys/MuonCuts 10.0 mm #/testem/stepMax 10 mm # -#/process/eLoss/preciseRange true -#/process/eLoss/integral true -# -# hist file name -# -/plots/sethistName g4.p11 - hist file = g4.p11 -# # PLOT: energy deposit distribution in absorber # /plots/setnbinEn 20 @@ -54,12 +41,18 @@ PhysicsList::AddPhysicsList: Elow in the Edep plot = 0 /plots/setEnhigh 0.060 MeV Ehigh in the Edep plot = 0.06 -# +/plots/sethistName g4.p11 + hist file = g4.p11 # /run/initialize userDetector->Construct() start. -***** Table : Nb of materials = 7 ***** +***** Table : Nb of materials = 12 ***** + + Material: Mylar density: 1.390 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 28.743 cm + ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 33.30 % Abundance 18.18 % + ---> Element: Carbon C Z = 6.0 N = 12.0 A = 12.01 g/mole fractionMass: 62.49 % Abundance 45.45 % + ---> Element: Hydrogen H Z = 1.0 N = 1.0 A = 1.01 g/mole fractionMass: 4.20 % Abundance 36.36 % Material: Kr density: 3.700 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 30.736 m ---> Element: Kr Z = 36.0 N = 83.8 A = 83.80 g/mole fractionMass: 100.00 % Abundance 100.00 % @@ -78,6 +71,22 @@ userDetector->Construct() start. ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 23.15 % Abundance 21.05 % ---> Element: Argon Ar Z = 18.0 N = 39.9 A = 39.95 g/mole fractionMass: 1.28 % Abundance 0.47 % + Material: Xenon density: 5.858 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 14.478 m + ---> Element: Xenon Z = 54.0 N = 131.3 A = 131.29 g/mole fractionMass: 100.00 % Abundance 100.00 % + + Material: CH4 density: 0.717 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 648.001 m + ---> Element: Carbon C Z = 6.0 N = 12.0 A = 12.01 g/mole fractionMass: 74.83 % Abundance 20.00 % + ---> Element: Hydrogen H Z = 1.0 N = 1.0 A = 1.01 g/mole fractionMass: 25.17 % Abundance 80.00 % + + Material: C3H8 density: 2.005 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 226.382 m + ---> Element: Carbon C Z = 6.0 N = 12.0 A = 12.01 g/mole fractionMass: 81.68 % Abundance 27.27 % + ---> Element: Hydrogen H Z = 1.0 N = 1.0 A = 1.01 g/mole fractionMass: 18.32 % Abundance 72.73 % + + Material: XeCH4C3H8 density: 4.920 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 17.657 m + ---> Element: Xenon Z = 54.0 N = 131.3 A = 131.29 g/mole fractionMass: 97.10 % Abundance 48.50 % + ---> Element: Carbon C Z = 6.0 N = 12.0 A = 12.01 g/mole fractionMass: 2.30 % Abundance 12.56 % + ---> Element: Hydrogen H Z = 1.0 N = 1.0 A = 1.01 g/mole fractionMass: 0.60 % Abundance 38.94 % + Material: CO2 density: 1.977 mg/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 183.083 m ---> Element: Carbon C Z = 6.0 N = 12.0 A = 12.01 g/mole fractionMass: 27.29 % Abundance 33.33 % ---> Element: Oxygen O Z = 8.0 N = 16.0 A = 16.00 g/mole fractionMass: 72.71 % Abundance 66.67 % @@ -89,9 +98,9 @@ userDetector->Construct() start. - The WORLD is made of 800mm of Air, the transverse size (R) of the world is 200 mm. - The ABSORBER is made of 40mm of Kr20CO2, the transverse size (R) is 100 mm. - Z position of the (middle of the) absorber 360 mm. + The WORLD is made of 23.1022mm of Mylar, the transverse size (R) of the world is 100 mm. + The ABSORBER is made of 23mm of XeCH4C3H8, the transverse size (R) is 100 mm. + Z position of the (middle of the) absorber 0 mm. World is registered to the default region. physicsList->Construct() start. @@ -128,7 +137,7 @@ conv: Total cross sections from a parametrisation. Good description from 1.5 Me msc: Model variant of multiple scattering for e- Lambda tables from 100 eV to 100 TeV in 120 bins. Boundary algorithm is active with facrange= 0.199 -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV +PAIModel DeltaCutInKineticEnergyNow = 63.4899 keV eIoni: tables are built for e- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. @@ -161,33 +170,23 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. Boundary algorithm is active with facrange= 0.199 -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV +PAIModel DeltaCutInKineticEnergyNow = 63.4899 keV hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. Boundary algorithm is active with facrange= 0.199 -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV +PAIModel DeltaCutInKineticEnergyNow = 63.4899 keV MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -200,13 +199,13 @@ MuPairProd: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. Parametrised model -PAIModel DeltaCutInKineticEnergyNow = 66.6945 keV +PAIModel DeltaCutInKineticEnergyNow = 63.4899 keV ### All dEdx and Range tables are built ##### MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -215,26 +214,26 @@ msc: Model variant of multiple scattering for pi- Boundary algorithm is active with facrange= 0.199 Region DefaultRegionForTheWorld - Materials : Air + Materials : Mylar Production cuts : gamma 1 mm e- 1 mm e+ 1 mm Region VertexDetector - Materials : Kr20CO2 - Production cuts : gamma 3 cm e- 3 cm e+ 3 cm + Materials : XeCH4C3H8 + Production cuts : gamma 2.3 cm e- 2.3 cm e+ 2.3 cm ========= Table of registered couples ============================== Index : 0 used in the geometry : Yes recalculation needed : No - Material : Air + Material : Mylar Range cuts : gamma 1 mm e- 1 mm e+ 1 mm - Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV + Energy thresholds : gamma 2.97898 keV e- 417.539 keV e+ 402.4 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes recalculation needed : No - Material : Kr20CO2 - Range cuts : gamma 3 cm e- 3 cm e+ 3 cm - Energy thresholds : gamma 2.56669 keV e- 66.6945 keV e+ 65.4742 keV + Material : XeCH4C3H8 + Range cuts : gamma 2.3 cm e- 2.3 cm e+ 2.3 cm + Energy thresholds : gamma 3.83995 keV e- 63.4899 keV e+ 61.9458 keV Region(s) which use this couple : VertexDetector @@ -249,7 +248,7 @@ G4GeometryManager::ReportVoxelStats -- Voxel Statistics --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 1564919237, 736159499 + Current couple of seeds = 1815521978, 93696064 ---------------------------------------- Start Run processing. @@ -275,57 +274,56 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 1000 - User=2.51s Real=2.63s Sys=0.12s + User=1.05s Real=1.09s Sys=0.04s ================== run summary ===================== end of Run TotNbofEvents = 1000 - mean charged track length in absorber=44.5315 +- 4.03033 mm + mean charged track length in absorber=23.0486 +- 0.0245813 mm - mean energy deposit in absorber=0.108768 +- 0.0694057 MeV + mean energy deposit in absorber=0.02286 +- 0.00524843 MeV - mean number of steps in absorber (charged) =4.981 +- 4.66626 - mean number of steps in absorber (neutral) =0.001 +- 0.0009995 + mean number of steps in absorber (charged) =0.013 +- 0.00590178 + mean number of steps in absorber (neutral) =0 +- 0 - mean number of charged secondaries = 2.476 +- 2.33308 + mean number of charged secondaries = 0.009 +- 0.00386251 - mean number of neutral secondaries = 0.001 +- 0.0009995 + mean number of neutral secondaries = 0 +- 0 - mean number of e-s =2.476 and e+s =0 + mean number of e-s =0.009 and e+s =0 -(number) transmission coeff=0.514 reflection coeff=0 +(number) transmission coeff=0.499 reflection coeff=0 energy deposit distribution -#entries=1000 #underflows=0 #overflows=46 +#entries=1000 #underflows=0 #overflows=21 bin nb Elow entries normalized 0 0 0 0 - 1 3 0 0 - 2 6 0 0 - 3 9 13 0.013 - 4 12 130 0.13 - 5 15 238 0.238 - 6 18 207 0.207 - 7 21 152 0.152 - 8 24 61 0.061 - 9 27 47 0.047 - 10 30 26 0.026 - 11 33 25 0.025 - 12 36 16 0.016 + 1 3 2 0.002 + 2 6 101 0.101 + 3 9 249 0.249 + 4 12 264 0.264 + 5 15 149 0.149 + 6 18 78 0.078 + 7 21 53 0.053 + 8 24 28 0.028 + 9 27 14 0.014 + 10 30 10 0.01 + 11 33 4 0.004 + 12 36 3 0.003 13 39 9 0.009 - 14 42 10 0.01 - 15 45 3 0.003 - 16 48 6 0.006 + 14 42 3 0.003 + 15 45 2 0.002 + 16 48 1 0.001 17 51 2 0.002 - 18 54 5 0.005 - 19 57 4 0.004 + 18 54 2 0.002 + 19 57 5 0.005 - Emp = 0.015 width= 0.009 MeV + Emp = 0.012 width= 0.006 MeV --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 550100734, 266777197 + Current couple of seeds = 1687235618, 177783924 ---------------------------------------- # -# Graphics systems deleted. Visualization Manager deleting... UserDetectorConstruction deleted. diff --git a/examples/extended/electromagnetic/TestEm8/include/Em8DetectorConstruction.hh b/examples/extended/electromagnetic/TestEm8/include/Em8DetectorConstruction.hh index 78c4345627..23dfda9b3e 100644 --- a/examples/extended/electromagnetic/TestEm8/include/Em8DetectorConstruction.hh +++ b/examples/extended/electromagnetic/TestEm8/include/Em8DetectorConstruction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: Em8DetectorConstruction.hh,v 1.5 2003/11/24 16:34:08 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: Em8DetectorConstruction.hh,v 1.7 2004/05/27 08:39:05 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -38,6 +38,7 @@ class G4Tubs; class G4LogicalVolume; class G4VPhysicalVolume; class G4Material; +class G4Region; class G4UniformMagField; class Em8DetectorMessenger; class Em8CalorimeterSD; @@ -53,15 +54,20 @@ class Em8DetectorConstruction : public G4VUserDetectorConstruction public: - void SetAbsorberMaterial (G4String); - void SetAbsorberThickness(G4double); - void SetAbsorberRadius(G4double); + void SetAbsorberMaterial (G4String); + void SetAbsorberThickness(G4double); + void SetAbsorberRadius(G4double); - void SetAbsorberZpos(G4double); + void SetAbsorberZpos(G4double); + + void SetWorldMaterial(G4String); + void SetWorldSizeZ(G4double); + void SetWorldSizeR(G4double); + + void SetGammaCut(G4double cut){fGammaCut = cut;}; + void SetElectronCut(G4double cut){fElectronCut = cut;}; + void SetPositronCut(G4double cut){fPositronCut = cut;}; - void SetWorldMaterial(G4String); - void SetWorldSizeZ(G4double); - void SetWorldSizeR(G4double); // void SetMagField(G4double); @@ -71,108 +77,84 @@ class Em8DetectorConstruction : public G4VUserDetectorConstruction public: - void PrintCalorParameters(); + void PrintCalorParameters(); - G4Material* GetWorldMaterial() {return WorldMaterial;}; - G4double GetWorldSizeZ() {return WorldSizeZ;}; - G4double GetWorldSizeR() {return WorldSizeR;}; + G4Material* GetWorldMaterial() {return fWorldMaterial;}; + G4double GetWorldSizeZ() {return fWorldSizeZ;}; + G4double GetWorldSizeR() {return fWorldSizeR;}; - G4double GetAbsorberZpos() {return zAbsorber;}; - G4double GetzstartAbs() {return zstartAbs;}; - G4double GetzendAbs() {return zendAbs;}; + G4double GetAbsorberZ() {return fAbsorberZ;}; + G4double GetStartAbsZ() {return fStartAbsZ;}; + G4double GetEndAbsZ() {return fEndAbsZ;}; - G4Material* GetAbsorberMaterial() {return AbsorberMaterial;}; - G4double GetAbsorberThickness() {return AbsorberThickness;}; - G4double GetAbsorberRadius() {return AbsorberRadius;}; + G4Material* GetAbsorberMaterial() {return fAbsorberMaterial;}; + G4double GetAbsorberThickness() {return fAbsorberThickness;}; + G4double GetAbsorberRadius() {return fAbsorberRadius;}; - const G4VPhysicalVolume* GetphysiWorld() {return physiWorld;}; - const G4VPhysicalVolume* GetAbsorber() {return physiAbsorber;}; - G4LogicalVolume* GetLogicalAbsorber() {return logicAbsorber;}; + const G4VPhysicalVolume* GetphysiWorld() {return fPhysicsWorld;}; + const G4VPhysicalVolume* GetAbsorber() {return fPhysicsAbsorber;}; + G4LogicalVolume* GetLogicalAbsorber() {return fLogicAbsorber;}; private: - G4bool worldchanged; - G4double AbsorberThickness; - G4double AbsorberRadius; + static const G4double fDelta; + + G4bool fWorldChanged; + G4double fAbsorberThickness; + G4double fAbsorberRadius; G4Material* fWindowMat ; G4double fWindowThick ; - G4Material* fElectrodeMat ; - G4double fElectrodeThick ; - - G4Material* fGapMat ; - G4double fGapThick ; - G4double zAbsorber ; - G4double zstartAbs , zendAbs ; + G4double fAbsorberZ ; + G4double fStartAbsZ , fEndAbsZ ; - G4Material* WorldMaterial; - G4double WorldSizeR; - G4double WorldSizeZ; + G4Material* fWorldMaterial; + G4double fWorldSizeR; + G4double fWorldSizeZ; - G4Tubs* solidWorld; //pointer to the solid World - G4LogicalVolume* logicWorld; //pointer to the logical World - G4VPhysicalVolume* physiWorld; //pointer to the physical World - - // TR radiator volumes and dimensions - - G4Tubs* fSolidRadSlice; // pointer to the solid z-slice - G4LogicalVolume* fLogicRadSlice; // pointer to the logical z-slide - G4VPhysicalVolume* fPhysicRadSlice; // pointer to the physical z-slide - - G4Tubs* fSolidRadRing; // pointer to the solid R-slice - G4LogicalVolume* fLogicRadRing; // pointer to the logical R-slide - G4VPhysicalVolume* fPhysicRadRing; // pointer to the physical R-slide + G4Tubs* fSolidWorld; //pointer to the solid World + G4LogicalVolume* fLogicWorld; //pointer to the logical World + G4VPhysicalVolume* fPhysicsWorld; //pointer to the physical World - G4double fRadThickness ; - G4double fGasGap ; + G4Material* fAbsorberMaterial; + G4Tubs* fSolidAbsorber; //pointer to the solid Absorber + G4LogicalVolume* fLogicAbsorber; //pointer to the logical Absorber + G4VPhysicalVolume* fPhysicsAbsorber; //pointer to the physical Absorber - G4int fFoilNumber ; - - G4double fDetThickness ; - G4double fDetLength ; - G4double fDetGap ; - - G4double fStartR ; - G4double fStartZ ; - - G4int fModuleNumber ; // the number of Rad-Det modules - - G4Material* AbsorberMaterial; - G4Tubs* solidAbsorber; //pointer to the solid Absorber - G4LogicalVolume* logicAbsorber; //pointer to the logical Absorber - G4VPhysicalVolume* physiAbsorber; //pointer to the physical Absorber - - G4Material* fRadiatorMat; //pointer to the TR radiator material + G4double fElectronCut, fGammaCut, fPositronCut; - G4UniformMagField* magField; //pointer to the magnetic field - - Em8DetectorMessenger* detectorMessenger; //pointer to the Messenger - Em8CalorimeterSD* calorimeterSD; //pointer to the sensitive detector + Em8DetectorMessenger* fDetectorMessenger; //pointer to the Messenger + Em8CalorimeterSD* fCalorimeterSD; //pointer to the sensitive detector + G4Region* fRegGasDet; private: - void DefineMaterials(); - void ComputeCalorParameters(); - G4VPhysicalVolume* ConstructCalorimeter(); + void DefineMaterials(); + void ComputeCalorParameters(); + G4VPhysicalVolume* ConstructCalorimeter(); + }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +////////////////////////////////////////////////////////////////////// inline void Em8DetectorConstruction::ComputeCalorParameters() { // Compute derived parameters of the calorimeter - if(!worldchanged) - { + + if( !fWorldChanged ) + { // WorldSizeR=2.*AbsorberRadius ; // WorldSizeZ=2.*AbsorberThickness ; - } - - zstartAbs = zAbsorber-0.5*AbsorberThickness; - zendAbs = zAbsorber+0.5*AbsorberThickness; + } + fWorldSizeZ = fAbsorberThickness + 2*fWindowThick + 2*fDelta; + fWorldSizeR = fAbsorberRadius + fDelta; + + fStartAbsZ = fAbsorberZ - 0.5*fAbsorberThickness; + fEndAbsZ = fAbsorberZ + 0.5*fAbsorberThickness; } diff --git a/examples/extended/electromagnetic/TestEm8/include/Em8DetectorMessenger.hh b/examples/extended/electromagnetic/TestEm8/include/Em8DetectorMessenger.hh index 259f21c1df..4973b46c3c 100644 --- a/examples/extended/electromagnetic/TestEm8/include/Em8DetectorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm8/include/Em8DetectorMessenger.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: Em8DetectorMessenger.hh,v 1.3 2001/07/11 09:57:53 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: Em8DetectorMessenger.hh,v 1.4 2004/05/27 08:39:05 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -53,6 +53,7 @@ class Em8DetectorMessenger: public G4UImessenger void SetNewValue(G4UIcommand*, G4String); private: + Em8DetectorConstruction* Em8Detector; G4UIdirectory* Em8detDir; @@ -67,7 +68,10 @@ class Em8DetectorMessenger: public G4UImessenger G4UIcmdWithADoubleAndUnit* WorldZCmd; G4UIcmdWithADoubleAndUnit* WorldRCmd; - G4UIcmdWithADoubleAndUnit* MagFieldCmd; + G4UIcmdWithADoubleAndUnit* ElectronCutCmd; + G4UIcmdWithADoubleAndUnit* PositronCutCmd; + G4UIcmdWithADoubleAndUnit* GammaCutCmd; + G4UIcmdWithoutParameter* UpdateCmd; }; diff --git a/examples/extended/electromagnetic/TestEm8/include/PhysListEmModelP.hh b/examples/extended/electromagnetic/TestEm8/include/PhysListEmPAI.hh similarity index 85% rename from examples/extended/electromagnetic/TestEm8/include/PhysListEmModelP.hh rename to examples/extended/electromagnetic/TestEm8/include/PhysListEmPAI.hh index c20a6ffeb6..0c9c3123a7 100755 --- a/examples/extended/electromagnetic/TestEm8/include/PhysListEmModelP.hh +++ b/examples/extended/electromagnetic/TestEm8/include/PhysListEmPAI.hh @@ -21,28 +21,28 @@ // ******************************************************************** // // -// $Id: PhysListEmModelP.hh,v 1.1 2003/10/27 15:24:08 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmPAI.hh,v 1.1 2004/05/27 18:04:31 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListEmModelP_h -#define PhysListEmModelP_h 1 +#ifndef PhysListEmPAI_h +#define PhysListEmPAI_h 1 #include "G4VPhysicsConstructor.hh" #include "globals.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListEmModelP : public G4VPhysicsConstructor +class PhysListEmPAI : public G4VPhysicsConstructor { public: - PhysListEmModelP(const G4String& name = "model"); - virtual ~PhysListEmModelP(); + PhysListEmPAI(const G4String& name = "PAI"); + virtual ~PhysListEmPAI(); public: - // This method is dummy for physics. + // This method is dummy for physics virtual void ConstructParticle() {}; // This method will be invoked in the Construct() method. diff --git a/examples/extended/electromagnetic/TestEm8/include/PhysListEmStandard.hh b/examples/extended/electromagnetic/TestEm8/include/PhysListEmStandard.hh index 132f250e1d..1ba2e1c263 100755 --- a/examples/extended/electromagnetic/TestEm8/include/PhysListEmStandard.hh +++ b/examples/extended/electromagnetic/TestEm8/include/PhysListEmStandard.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.hh,v 1.1 2003/10/27 15:24:08 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.hh,v 1.2 2004/05/27 18:04:31 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -42,7 +42,7 @@ class PhysListEmStandard : public G4VPhysicsConstructor virtual ~PhysListEmStandard(); public: - // This method is dummy for physics + // This method is dummy for physics. virtual void ConstructParticle() {}; // This method will be invoked in the Construct() method. diff --git a/examples/extended/electromagnetic/TestEm8/src/Em8DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm8/src/Em8DetectorConstruction.cc index 9a98479ea0..f8c62b1138 100644 --- a/examples/extended/electromagnetic/TestEm8/src/Em8DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm8/src/Em8DetectorConstruction.cc @@ -21,84 +21,77 @@ // ******************************************************************** // // -// $Id: Em8DetectorConstruction.cc,v 1.11 2003/11/24 16:34:09 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: Em8DetectorConstruction.cc,v 1.13 2004/05/27 08:39:05 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // #include "Em8DetectorConstruction.hh" #include "Em8DetectorMessenger.hh" - #include "Em8CalorimeterSD.hh" -#include "G4VXrayTRmodel.hh" -#include "G4IrregularXrayTRmodel.hh" -#include "G4FoamXrayTRmodel.hh" -#include "G4RegularXrayTRmodel.hh" -#include "G4GamDistrXrayTRmodel.hh" -#include "G4PlateIrrGasXrayTRmodel.hh" + #include "G4Material.hh" #include "G4Tubs.hh" #include "G4LogicalVolume.hh" #include "G4PVPlacement.hh" -#include "G4UniformMagField.hh" + #include "G4FieldManager.hh" #include "G4TransportationManager.hh" #include "G4SDManager.hh" +#include "G4GeometryManager.hh" #include "G4RunManager.hh" #include "G4Region.hh" #include "G4RegionStore.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4SolidStore.hh" #include "G4ProductionCuts.hh" + +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +#include "G4UnitsTable.hh" #include "G4ios.hh" + + +const G4double Em8DetectorConstruction::fDelta = 0.0001*mm; + + + + ///////////////////////////////////////////////////////////////////////////// // // Em8DetectorConstruction::Em8DetectorConstruction() : -worldchanged(false), -WorldMaterial(NULL),solidWorld(NULL),logicWorld(NULL),physiWorld(NULL), -AbsorberMaterial(NULL),solidAbsorber(NULL),logicAbsorber(NULL), -physiAbsorber(NULL), -fRadiatorMat(NULL), - magField(NULL),calorimeterSD(NULL) +fWorldChanged(false), +fWorldMaterial(NULL),fSolidWorld(NULL),fLogicWorld(NULL),fPhysicsWorld(NULL), +fAbsorberMaterial(NULL),fSolidAbsorber(NULL),fLogicAbsorber(NULL), +fPhysicsAbsorber(NULL),fDetectorMessenger(NULL), +fCalorimeterSD(NULL),fRegGasDet(NULL) { // default parameter values of the calorimeter // G4double inch = 2.54*cm ; // G4double mil = inch/1000.0 ; - WorldSizeZ = 80.*cm; - WorldSizeR = 20.*cm; + // G4double delta = 0.0001*mm; - AbsorberThickness = 40.0*mm; - // AbsorberThickness = 0.04*mm; + fAbsorberThickness = 23.0*mm; + fAbsorberRadius = 10.*cm; + fAbsorberZ = 0.*cm ; - AbsorberRadius = 10.*cm; - zAbsorber = 36.*cm ; + fWindowThick = 51.0*micrometer ; - fWindowThick = 51.0*micrometer ; - fElectrodeThick = 10.0*micrometer ; - fGapThick = 1.0*mm ; + fGammaCut = 23*mm; + fElectronCut = 23*mm; + fPositronCut = 23*mm; - fRadThickness = 25*micrometer ; // 0.5*mil ; - fGasGap = 1500*micrometer ; // 30*mil ; - fFoilNumber = 188 ; - - fDetThickness = 40.0*mm ; - fDetLength = 200.0*cm ; - fDetGap = 1.0*mm ; - - fStartR = 40*cm ; - fStartZ = 10.0*mm ; - - fModuleNumber = 1 ; - - // create commands for interactive definition of the calorimeter - - detectorMessenger = new Em8DetectorMessenger(this); + fDetectorMessenger = new Em8DetectorMessenger(this); } ////////////////////////////////////////////////////////////////////////// @@ -107,7 +100,7 @@ fRadiatorMat(NULL), Em8DetectorConstruction::~Em8DetectorConstruction() { - delete detectorMessenger; + delete fDetectorMessenger; } ////////////////////////////////////////////////////////////////////////// @@ -144,8 +137,8 @@ G4double fractionmass; // define Elements // -// a = 1.01*g/mole; -// G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); + a = 1.01*g/mole; + G4Element* elH = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); a = 12.01*g/mole; G4Element* elC = new G4Element(name="Carbon", symbol="C", z=6., a); @@ -280,13 +273,6 @@ H2O->AddElement(elO, natoms=1); a = 26.98*g/mole; G4Material* Al = new G4Material(name="Aluminium", z=13., a, density); - // Mylar - - density = 1.39*g/cm3; - G4Material* Mylar = new G4Material(name="Mylar", density, nel=3); - Mylar->AddElement(elO,2); - Mylar->AddElement(elC,5); - Mylar->AddElement(elH,4); // Polypropelene @@ -295,6 +281,13 @@ H2O->AddElement(elO, natoms=1); CH2->AddElement(elC,1); ************************ */ + // Mylar + + density = 1.39*g/cm3; + G4Material* Mylar = new G4Material(name="Mylar", density, nel=3); + Mylar->AddElement(elO,2); + Mylar->AddElement(elC,5); + Mylar->AddElement(elH,4); // Krypton as detector gas, STP @@ -381,9 +374,34 @@ H2O->AddElement(elO, natoms=1); // Xenon as detector gas, STP - // density = 5.858*mg/cm3 ; - // a = 131.29*g/mole ; - // G4Material* Xe = new G4Material(name="Xenon",z=54., a, density ); + density = 5.858*mg/cm3 ; + a = 131.29*g/mole ; + G4Material* Xe = new G4Material(name="Xenon",z=54., a, density ); + + // Metane, STP + + density = 0.7174*mg/cm3 ; + G4Material* metane = new G4Material(name="CH4",density,nel=2) ; + metane->AddElement(elC,1) ; + metane->AddElement(elH,4) ; + + // Propane, STP + + density = 2.005*mg/cm3 ; + G4Material* propane = new G4Material(name="C3H8",density,nel=2) ; + propane->AddElement(elC,3) ; + propane->AddElement(elH,8) ; + + // 87.5% Xe + 7.5% CH4 + 5% C3H8, 20 C, 1 atm + + density = 4.9196*mg/cm3 ; + + G4Material* XeCH4C3H8 = new G4Material(name="XeCH4C3H8" , + density, ncomponents=3); + XeCH4C3H8->AddMaterial( Xe, fractionmass = 0.971 ) ; + XeCH4C3H8->AddMaterial( metane, fractionmass = 0.010 ) ; + XeCH4C3H8->AddMaterial( propane, fractionmass = 0.019 ) ; + // Carbon dioxide, STP @@ -419,17 +437,17 @@ H2O->AddElement(elO, natoms=1); G4cout << *(G4Material::GetMaterialTable()) << G4endl; - //default materials of the calorimeter and TR radiator + //default materials of the absorber and window - // fRadiatorMat = Mylar ; // CH2 ; // Mylar ; + // fWindowMat = Mylar ; - // fElectrodeMat = Al ; + - AbsorberMaterial = Kr20CO2 ; // lH2 ; // Al; // Be; // XeCO2CF4 ; - fGapMat = Kr20CO2 ; + fAbsorberMaterial = XeCH4C3H8; // Kr20CO2 ; // lH2 ; // Al; // Be; // XeCO2CF4 ; - WorldMaterial = Air ; + + fWorldMaterial = Mylar; // Air ; } ///////////////////////////////////////////////////////////////////////// @@ -438,77 +456,97 @@ H2O->AddElement(elO, natoms=1); G4VPhysicalVolume* Em8DetectorConstruction::ConstructCalorimeter() { - // G4int i, j ; - // G4double zModule, zRadiator, rModule, rRadiator ; + // Cleanup old geometry - // complete the Calor parameters definition and Print + G4GeometryManager::GetInstance()->OpenGeometry(); + G4PhysicalVolumeStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4SolidStore::GetInstance()->Clean(); + + // G4RegionStore::GetInstance()->Clean(); + + // complete the Calor parameters definition and print ComputeCalorParameters(); PrintCalorParameters(); // World - if(solidWorld) delete solidWorld ; - if(logicWorld) delete logicWorld ; - if(physiWorld) delete physiWorld ; + // if(fSolidWorld) delete fSolidWorld ; + // if(fLogicWorld) delete fLogicWorld ; + // if(fPhysicsWorld) delete fPhysicsWorld ; - solidWorld = new G4Tubs("World", //its name - 0.,WorldSizeR,WorldSizeZ/2.,0.,twopi) ;//its size + fSolidWorld = new G4Tubs("World", //its name + 0.,fWorldSizeR,fWorldSizeZ/2.,0.,twopi) ;//its size - logicWorld = new G4LogicalVolume(solidWorld, //its solid - WorldMaterial, //its material + fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid + fWorldMaterial, //its material "World"); //its name - physiWorld = new G4PVPlacement(0, //no rotation + fPhysicsWorld = new G4PVPlacement(0, //no rotation G4ThreeVector(), //at (0,0,0) "World", //its name - logicWorld, //its logical volume + fLogicWorld, //its logical volume NULL, //its mother volume false, //no boolean operation 0); //copy number // Absorber - if (AbsorberThickness > 0.) + if (fAbsorberThickness > 0.) { - if(solidAbsorber) delete solidAbsorber ; - if(logicAbsorber) delete logicAbsorber ; - if(physiAbsorber) delete physiAbsorber ; + // if(fSolidAbsorber) delete fSolidAbsorber ; + // if(fLogicAbsorber) delete fLogicAbsorber ; + // if(fPhysicsAbsorber) delete fPhysicsAbsorber ; - solidAbsorber = new G4Tubs("Absorber", - 0.,AbsorberRadius,AbsorberThickness/2.,0.,twopi); + fSolidAbsorber = new G4Tubs("Absorber", + 0.,fAbsorberRadius,fAbsorberThickness/2.,0.,twopi); - logicAbsorber = new G4LogicalVolume(solidAbsorber, - AbsorberMaterial, + fLogicAbsorber = new G4LogicalVolume(fSolidAbsorber, + fAbsorberMaterial, "Absorber"); - physiAbsorber = new G4PVPlacement(0, - G4ThreeVector(0.,0.,zAbsorber), + fPhysicsAbsorber = new G4PVPlacement(0, + G4ThreeVector(0.,0.,fAbsorberZ), "Absorber", - logicAbsorber, - physiWorld, + fLogicAbsorber, + fPhysicsWorld, false, 0); } - G4Region* regGasDet = new G4Region("VertexDetector"); - regGasDet->AddRootLogicalVolume(logicAbsorber); - G4ProductionCuts* cuts = new G4ProductionCuts(); - cuts->SetProductionCut(30.*mm,"gamma"); - cuts->SetProductionCut(30.*mm,"e-"); - cuts->SetProductionCut(30.*mm,"e+"); - regGasDet->SetProductionCuts(cuts); + if( fRegGasDet != 0 ) // remove obsolete root logical volume + { + fRegGasDet->RemoveRootLogicalVolume(fLogicAbsorber); + } + G4ProductionCuts* cuts = 0; + + if( fRegGasDet == 0 ) // First time - instantiate a region and a cut objects + { + fRegGasDet = new G4Region("VertexDetector"); + cuts = new G4ProductionCuts(); + fRegGasDet->SetProductionCuts(cuts); + } + else // Second time - get a cut object from region + { + cuts = fRegGasDet->GetProductionCuts(); + } + fRegGasDet->AddRootLogicalVolume(fLogicAbsorber); + + cuts->SetProductionCut(fGammaCut,"gamma"); + cuts->SetProductionCut(fElectronCut,"e-"); + cuts->SetProductionCut(fPositronCut,"e+"); // Sensitive Detectors: Absorber G4SDManager* SDman = G4SDManager::GetSDMpointer(); - if(!calorimeterSD) + if(!fCalorimeterSD) { - calorimeterSD = new Em8CalorimeterSD("CalorSD",this); - SDman->AddNewDetector( calorimeterSD ); + fCalorimeterSD = new Em8CalorimeterSD("CalorSD",this); + SDman->AddNewDetector( fCalorimeterSD ); } - if (logicAbsorber) logicAbsorber->SetSensitiveDetector(calorimeterSD); + if (fLogicAbsorber) fLogicAbsorber->SetSensitiveDetector(fCalorimeterSD); // Parameterisation @@ -538,7 +576,7 @@ G4VPhysicalVolume* Em8DetectorConstruction::ConstructCalorimeter() // always return physics world - return physiWorld; + return fPhysicsWorld; } //////////////////////////////////////////////////////////////////////////// @@ -548,12 +586,12 @@ G4VPhysicalVolume* Em8DetectorConstruction::ConstructCalorimeter() void Em8DetectorConstruction::PrintCalorParameters() { G4cout << "\n The WORLD is made of " - << WorldSizeZ/mm << "mm of " << WorldMaterial->GetName() ; - G4cout << ", the transverse size (R) of the world is " << WorldSizeR/mm << " mm. " << G4endl; + << fWorldSizeZ/mm << "mm of " << fWorldMaterial->GetName() ; + G4cout << ", the transverse size (R) of the world is " << fWorldSizeR/mm << " mm. " << G4endl; G4cout << " The ABSORBER is made of " - << AbsorberThickness/mm << "mm of " << AbsorberMaterial->GetName() ; - G4cout << ", the transverse size (R) is " << AbsorberRadius/mm << " mm. " << G4endl; - G4cout << " Z position of the (middle of the) absorber " << zAbsorber/mm << " mm." << G4endl; + << fAbsorberThickness/mm << "mm of " << fAbsorberMaterial->GetName() ; + G4cout << ", the transverse size (R) is " << fAbsorberRadius/mm << " mm. " << G4endl; + G4cout << " Z position of the (middle of the) absorber " << fAbsorberZ/mm << " mm." << G4endl; G4cout << G4endl; } @@ -568,14 +606,19 @@ void Em8DetectorConstruction::SetAbsorberMaterial(G4String materialChoice) // search the material by its name G4Material* pttoMaterial; - for (size_t J=0 ; Jsize() ; J++) - { pttoMaterial = (*theMaterialTable)[J]; - if(pttoMaterial->GetName() == materialChoice) - {AbsorberMaterial = pttoMaterial; - logicAbsorber->SetMaterial(pttoMaterial); + + for (size_t J = 0 ; J < theMaterialTable->size() ; J++) + { + pttoMaterial = (*theMaterialTable)[J]; + + if(pttoMaterial->GetName() == materialChoice) + { + fAbsorberMaterial = pttoMaterial; + fLogicAbsorber->SetMaterial(pttoMaterial); + // PrintCalorParameters(); - } - } + } + } } //////////////////////////////////////////////////////////////////////////// @@ -590,13 +633,17 @@ void Em8DetectorConstruction::SetWorldMaterial(G4String materialChoice) // search the material by its name G4Material* pttoMaterial; for (size_t J=0 ; Jsize() ; J++) - { pttoMaterial = (*theMaterialTable)[J]; - if(pttoMaterial->GetName() == materialChoice) - {WorldMaterial = pttoMaterial; - logicWorld->SetMaterial(pttoMaterial); + { + pttoMaterial = (*theMaterialTable)[J]; + + if(pttoMaterial->GetName() == materialChoice) + { + fWorldMaterial = pttoMaterial; + fLogicWorld->SetMaterial(pttoMaterial); + // PrintCalorParameters(); - } - } + } + } } /////////////////////////////////////////////////////////////////////////// @@ -606,7 +653,7 @@ void Em8DetectorConstruction::SetWorldMaterial(G4String materialChoice) void Em8DetectorConstruction::SetAbsorberThickness(G4double val) { // change Absorber thickness and recompute the calorimeter parameters - AbsorberThickness = val; + fAbsorberThickness = val; ComputeCalorParameters(); } @@ -617,7 +664,7 @@ void Em8DetectorConstruction::SetAbsorberThickness(G4double val) void Em8DetectorConstruction::SetAbsorberRadius(G4double val) { // change the transverse size and recompute the calorimeter parameters - AbsorberRadius = val; + fAbsorberRadius = val; ComputeCalorParameters(); } @@ -627,8 +674,8 @@ void Em8DetectorConstruction::SetAbsorberRadius(G4double val) void Em8DetectorConstruction::SetWorldSizeZ(G4double val) { - worldchanged=true; - WorldSizeZ = val; + fWorldChanged=true; + fWorldSizeZ = val; ComputeCalorParameters(); } @@ -638,8 +685,8 @@ void Em8DetectorConstruction::SetWorldSizeZ(G4double val) void Em8DetectorConstruction::SetWorldSizeR(G4double val) { - worldchanged=true; - WorldSizeR = val; + fWorldChanged=true; + fWorldSizeR = val; ComputeCalorParameters(); } @@ -649,41 +696,10 @@ void Em8DetectorConstruction::SetWorldSizeR(G4double val) void Em8DetectorConstruction::SetAbsorberZpos(G4double val) { - zAbsorber = val; + fAbsorberZ = val; ComputeCalorParameters(); } -////////////////////////////////////////////////////////////////////////////// -// -// - -//void Em8DetectorConstruction::SetMagField(G4double fieldValue) -//{ - - //apply a global uniform magnetic field along X 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(fieldValue,0.,0.)); - fieldMgr->SetDetectorField(magField); - fieldMgr->CreateChordFinder(magField); - } - else - { - magField = NULL; - fieldMgr->SetDetectorField(magField); - } - - *************************************************************** */ - -// } /////////////////////////////////////////////////////////////////////////////// // diff --git a/examples/extended/electromagnetic/TestEm8/src/Em8DetectorMessenger.cc b/examples/extended/electromagnetic/TestEm8/src/Em8DetectorMessenger.cc index 5939d7ebbb..47742ead3c 100644 --- a/examples/extended/electromagnetic/TestEm8/src/Em8DetectorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm8/src/Em8DetectorMessenger.cc @@ -21,14 +21,11 @@ // ******************************************************************** // // -// $Id: Em8DetectorMessenger.cc,v 1.5 2003/11/24 16:34:10 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: Em8DetectorMessenger.cc,v 1.6 2004/05/27 08:39:06 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - #include "Em8DetectorMessenger.hh" #include "Em8DetectorConstruction.hh" @@ -38,7 +35,7 @@ #include "G4UIcmdWithADoubleAndUnit.hh" #include "G4UIcmdWithoutParameter.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +/////////////////////////////////////////////////////////////////////////////////// Em8DetectorMessenger::Em8DetectorMessenger(Em8DetectorConstruction * Em8Det) :Em8Detector(Em8Det) @@ -91,6 +88,31 @@ Em8DetectorMessenger::Em8DetectorMessenger(Em8DetectorConstruction * Em8Det) WorldRCmd->SetDefaultUnit("mm"); WorldRCmd->SetRange("WSizeR>0."); WorldRCmd->AvailableForStates(G4State_Idle); + + + ElectronCutCmd = new G4UIcmdWithADoubleAndUnit("/calor/setElectronCut",this); + ElectronCutCmd->SetGuidance("Set electron cut in mm for vertex region"); + ElectronCutCmd->SetParameterName("ElectronCut",false,false); + ElectronCutCmd->SetDefaultUnit("mm"); + ElectronCutCmd->SetRange("ElectronCut>0."); + ElectronCutCmd->AvailableForStates(G4State_Idle); + + + PositronCutCmd = new G4UIcmdWithADoubleAndUnit("/calor/setPositronCut",this); + PositronCutCmd->SetGuidance("Set positron cut in mm for vertex region"); + PositronCutCmd->SetParameterName("PositronCut",false,false); + PositronCutCmd->SetDefaultUnit("mm"); + PositronCutCmd->SetRange("PositronCut>0."); + PositronCutCmd->AvailableForStates(G4State_Idle); + + + GammaCutCmd = new G4UIcmdWithADoubleAndUnit("/calor/setGammaCut",this); + GammaCutCmd->SetGuidance("Set gamma cut in mm for vertex region"); + GammaCutCmd->SetParameterName("GammaCut",false,false); + GammaCutCmd->SetDefaultUnit("mm"); + GammaCutCmd->SetRange("GammaCut>0."); + GammaCutCmd->AvailableForStates(G4State_Idle); + UpdateCmd = new G4UIcmdWithoutParameter("/calor/update",this); UpdateCmd->SetGuidance("Update calorimeter geometry."); @@ -98,16 +120,10 @@ Em8DetectorMessenger::Em8DetectorMessenger(Em8DetectorConstruction * Em8Det) UpdateCmd->SetGuidance("if you changed geometrical value(s)."); UpdateCmd->AvailableForStates(G4State_Idle); - MagFieldCmd = new G4UIcmdWithADoubleAndUnit("/calor/setField",this); - MagFieldCmd->SetGuidance("Define magnetic field."); - MagFieldCmd->SetGuidance("Magnetic field will be in Z direction."); - MagFieldCmd->SetParameterName("Bz",false,false); - MagFieldCmd->SetDefaultUnit("tesla"); - MagFieldCmd->AvailableForStates(G4State_Idle); } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +////////////////////////////////////////////////////////////////////////////// Em8DetectorMessenger::~Em8DetectorMessenger() { @@ -119,43 +135,60 @@ Em8DetectorMessenger::~Em8DetectorMessenger() delete WorldZCmd; delete WorldRCmd; delete UpdateCmd; - delete MagFieldCmd; + delete Em8detDir; } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +////////////////////////////////////////////////////////////////////////////////// void Em8DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) { if( command == AbsMaterCmd ) - { Em8Detector->SetAbsorberMaterial(newValue);} - - if( command == WorldMaterCmd ) - { Em8Detector->SetWorldMaterial(newValue);} - - if( command == AbsThickCmd ) - { Em8Detector->SetAbsorberThickness(AbsThickCmd->GetNewDoubleValue(newValue));} - - if( command == AbsRadCmd ) - { Em8Detector->SetAbsorberRadius(AbsRadCmd->GetNewDoubleValue(newValue));} - - if( command == AbsZposCmd ) - { Em8Detector->SetAbsorberZpos(AbsZposCmd->GetNewDoubleValue(newValue));} - - if( command == WorldZCmd ) - { Em8Detector->SetWorldSizeZ(WorldZCmd->GetNewDoubleValue(newValue));} - - if( command == WorldRCmd ) - { Em8Detector->SetWorldSizeR(WorldRCmd->GetNewDoubleValue(newValue));} - - if( command == UpdateCmd ) - { Em8Detector->UpdateGeometry(); } - - if( command == MagFieldCmd ) { - // Em8Detector->SetMagField(MagFieldCmd->GetNewDoubleValue(newValue)); + Em8Detector->SetAbsorberMaterial(newValue); + } + if( command == WorldMaterCmd ) + { + Em8Detector->SetWorldMaterial(newValue); + } + if( command == AbsThickCmd ) + { + Em8Detector->SetAbsorberThickness(AbsThickCmd->GetNewDoubleValue(newValue)); + } + if( command == AbsRadCmd ) + { + Em8Detector->SetAbsorberRadius(AbsRadCmd->GetNewDoubleValue(newValue)); + } + if( command == AbsZposCmd ) + { + Em8Detector->SetAbsorberZpos(AbsZposCmd->GetNewDoubleValue(newValue)); } + if( command == WorldZCmd ) + { + Em8Detector->SetWorldSizeZ(WorldZCmd->GetNewDoubleValue(newValue)); + } + if( command == WorldRCmd ) + { + Em8Detector->SetWorldSizeR(WorldRCmd->GetNewDoubleValue(newValue)); + } + if( command == ElectronCutCmd ) + { + Em8Detector->SetElectronCut(WorldRCmd->GetNewDoubleValue(newValue)); + } + if( command == PositronCutCmd ) + { + Em8Detector->SetPositronCut(WorldRCmd->GetNewDoubleValue(newValue)); + } + if( command == GammaCutCmd ) + { + Em8Detector->SetGammaCut(WorldRCmd->GetNewDoubleValue(newValue)); + } + if( command == UpdateCmd ) + { + Em8Detector->UpdateGeometry(); + } + } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +///////////////////////////////////////////////////////////////////////////////// diff --git a/examples/extended/electromagnetic/TestEm8/src/Em8PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/TestEm8/src/Em8PrimaryGeneratorAction.cc index 105ab03fc5..e3b7cdbaf5 100644 --- a/examples/extended/electromagnetic/TestEm8/src/Em8PrimaryGeneratorAction.cc +++ b/examples/extended/electromagnetic/TestEm8/src/Em8PrimaryGeneratorAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: Em8PrimaryGeneratorAction.cc,v 1.4 2001/07/11 09:57:56 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: Em8PrimaryGeneratorAction.cc,v 1.5 2004/05/24 16:56:31 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -93,6 +93,7 @@ void Em8PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) thePrimaryParticleName = particleGun->GetParticleDefinition()-> GetParticleName() ; G4double x0,y0,z0 ; + G4double delta = 0.0001*mm; if(vertexdefined) { x0 = xvertex ; @@ -103,7 +104,7 @@ void Em8PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { x0 = 0. ; y0 = 0. ; - z0 = 0. ; // -0.5*(Em8Detector->GetWorldSizeZ()) ; + z0 = -0.5*( Em8Detector->GetWorldSizeZ() ) + delta ; } G4double r0,phi0 ; /* **************************************************** diff --git a/examples/extended/electromagnetic/TestEm8/src/PhysListEmModelP.cc b/examples/extended/electromagnetic/TestEm8/src/PhysListEmPAI.cc similarity index 54% rename from examples/extended/electromagnetic/TestEm8/src/PhysListEmModelP.cc rename to examples/extended/electromagnetic/TestEm8/src/PhysListEmPAI.cc index dbf7bd4b4c..a52a8f89c9 100755 --- a/examples/extended/electromagnetic/TestEm8/src/PhysListEmModelP.cc +++ b/examples/extended/electromagnetic/TestEm8/src/PhysListEmPAI.cc @@ -21,13 +21,13 @@ // ******************************************************************** // // -// $Id: PhysListEmModelP.cc,v 1.1 2003/10/27 15:24:10 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmPAI.cc,v 1.1 2004/05/27 18:04:31 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#include "PhysListEmModelP.hh" +#include "PhysListEmPAI.hh" #include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" @@ -38,6 +38,10 @@ #include "G4MultipleScattering.hh" #include "G4eIonisation.hh" +#include "G4PAIModel.hh" +#include "G4PAIPhotonModel.hh" +//#include "G4PAIwithPhotons.hh" + #include "G4eBremsstrahlung.hh" #include "G4eplusAnnihilation.hh" @@ -48,67 +52,118 @@ #include "G4hIonisation.hh" #include "G4ionIonisation.hh" +#include "G4Region.hh" +#include "G4RegionStore.hh" + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListEmModelP::PhysListEmModelP(const G4String& name) +PhysListEmPAI::PhysListEmPAI(const G4String& name) : G4VPhysicsConstructor(name) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -PhysListEmModelP::~PhysListEmModelP() +PhysListEmPAI::~PhysListEmPAI() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void PhysListEmModelP::ConstructProcess() +void PhysListEmPAI::ConstructProcess() { - // Add EM processes realised on base of prototype of model approach design + // Add standard EM Processes + + const G4RegionStore* theRegionStore = G4RegionStore::GetInstance(); + G4Region* gas = theRegionStore->GetRegion("VertexDetector"); theParticleIterator->reset(); - while( (*theParticleIterator)() ){ + + while( (*theParticleIterator)() ) + { G4ParticleDefinition* particle = theParticleIterator->value(); - G4ProcessManager* pmanager = particle->GetProcessManager(); - G4String particleName = particle->GetParticleName(); + G4ProcessManager* pmanager = particle->GetProcessManager(); + G4String particleName = particle->GetParticleName(); - if (particleName == "gamma") { - + if (particleName == "gamma") + { pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); pmanager->AddDiscreteProcess(new G4ComptonScattering); pmanager->AddDiscreteProcess(new G4GammaConversion); - } else if (particleName == "e-") { - + } + else if (particleName == "e-") + { pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); - pmanager->AddProcess(new G4eIonisation, -1, 2,2); - pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + + G4eIonisation* eion = new G4eIonisation(); + + + G4PAIModel* pai = new G4PAIModel(particle,"PAIModel"); + //G4PAIPhotonModel* pai = new G4PAIPhotonModel(particle,"PAIModel"); + // G4PAIwithPhotons* pai = new G4PAIwithPhotons(particle,"PAIwPhotons"); + eion->AddEmModel(0,pai,pai,gas); + + pmanager->AddProcess(eion,-1, 2,2); + + pmanager->AddProcess(new G4eBremsstrahlung,-1,1,3); - } else if (particleName == "e+") { - + } + else if (particleName == "e+") + { pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); - pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); } else if( particleName == "mu+" || - particleName == "mu-" ) { - + particleName == "mu-" ) + { pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); - pmanager->AddProcess(new G4MuIonisation, -1, 2,2); + + G4MuIonisation* muion = new G4MuIonisation(); + + G4PAIModel* pai = new G4PAIModel(particle,"PAIModel"); + // G4PAIwithPhotons* pai = new G4PAIwithPhotons(particle,"PAIwPhotons"); + muion->AddEmModel(0,pai,pai,gas); + + pmanager->AddProcess(muion, -1, 2,-2); pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); - - } else if( particleName == "GenericIon" ) { - - pmanager->AddProcess(new G4MultipleScattering,-1,1,1); - pmanager->AddProcess(new G4ionIonisation, -1,2,2); - } else if ((!particle->IsShortLived()) && - (particle->GetPDGCharge() != 0.0) && - (particle->GetParticleName() != "chargedgeantino")) { - //all others charged particles except geantino + } + else if (particleName == "GenericIon") + { + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4ionIonisation, -1, 2,2); + + } + else if ( particleName == "proton" ) + { + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); - pmanager->AddProcess(new G4hIonisation, -1,2,2); + + G4hIonisation* pion = new G4hIonisation(); + G4PAIModel* pai = new G4PAIModel(particle,"PAIModel"); + //G4PAIPhotonModel* pai = new G4PAIPhotonModel(particle,"PAIModel"); + // G4PAIwithPhotons* pai = new G4PAIwithPhotons(particle,"PAIwPhotons"); + pion->AddEmModel(0,pai,pai,gas); + + pmanager->AddProcess(pion, -1,2,2); + } + else if ( ( !particle->IsShortLived() ) && + ( particle->GetPDGCharge() != 0.0 ) && + ( particle->GetParticleName() != "chargedgeantino") ) + { + + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); + + G4hIonisation* hion = new G4hIonisation(); + + // G4PAIModel* pai = new G4PAIModel(particle,"PAIModel"); + // G4PAIwithPhotons* pai = new G4PAIwithPhotons(particle,"PAIwPhotons"); + // hion->AddEmModel(0,pai,pai,gas); + + pmanager->AddProcess(hion, -1,2,2); } } } diff --git a/examples/extended/electromagnetic/TestEm8/src/PhysListEmStandard.cc b/examples/extended/electromagnetic/TestEm8/src/PhysListEmStandard.cc index d9c6490006..64af5a3e17 100755 --- a/examples/extended/electromagnetic/TestEm8/src/PhysListEmStandard.cc +++ b/examples/extended/electromagnetic/TestEm8/src/PhysListEmStandard.cc @@ -21,11 +21,11 @@ // ******************************************************************** // // -// $Id: PhysListEmStandard.cc,v 1.3 2004/01/27 11:19:15 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListEmStandard.cc,v 1.6 2004/06/18 09:18:12 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "PhysListEmStandard.hh" #include "G4ParticleDefinition.hh" @@ -38,7 +38,6 @@ #include "G4MultipleScattering.hh" #include "G4eIonisation.hh" -#include "G4PAIModel.hh" #include "G4eBremsstrahlung.hh" #include "G4eplusAnnihilation.hh" @@ -49,10 +48,6 @@ #include "G4hIonisation.hh" #include "G4ionIonisation.hh" -#include "G4Region.hh" -#include "G4RegionStore.hh" - - //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PhysListEmStandard::PhysListEmStandard(const G4String& name) @@ -68,77 +63,52 @@ PhysListEmStandard::~PhysListEmStandard() void PhysListEmStandard::ConstructProcess() { - // Add standard EM Processes - - const G4RegionStore* theRegionStore = G4RegionStore::GetInstance(); - G4Region* gas = theRegionStore->GetRegion("VertexDetector"); + // Add EM processes realised on base of prototype of model approach design theParticleIterator->reset(); - while( (*theParticleIterator)() ) - { + while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); G4String particleName = particle->GetParticleName(); - if (particleName == "gamma") - { + if (particleName == "gamma") { + pmanager->AddDiscreteProcess(new G4PhotoElectricEffect); pmanager->AddDiscreteProcess(new G4ComptonScattering); pmanager->AddDiscreteProcess(new G4GammaConversion); - } - else if (particleName == "e-") - { - pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); - - G4eIonisation* eion = new G4eIonisation(); - - G4PAIModel* pai = new G4PAIModel(particle); - eion->AddEmModel(0,pai,pai,gas); - - pmanager->AddProcess(eion, -1, 2,2); - - pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); - - } else if (particleName == "e+") { - + } else if (particleName == "e-") { + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); pmanager->AddProcess(new G4eIonisation, -1, 2,2); pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); - pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); + + } else if (particleName == "e+") { + + pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager->AddProcess(new G4eIonisation, -1, 2,2); + pmanager->AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager->AddProcess(new G4eplusAnnihilation, 0,-1,4); } else if( particleName == "mu+" || particleName == "mu-" ) { - + pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); - - G4MuIonisation* muion = new G4MuIonisation(); - G4PAIModel* pai = new G4PAIModel(particle); - muion->AddEmModel(0,pai,pai,gas); - - pmanager->AddProcess(muion, -1, 2,-2); + pmanager->AddProcess(new G4MuIonisation, -1, 2,2); pmanager->AddProcess(new G4MuBremsstrahlung, -1,-1,3); pmanager->AddProcess(new G4MuPairProduction, -1,-1,4); - - } - else if (particleName == "GenericIon") - { - pmanager->AddProcess(new G4MultipleScattering, -1, 1,1); - pmanager->AddProcess(new G4ionIonisation, -1, 2,2); - } - else if ( ( !particle->IsShortLived() ) && - ( particle->GetPDGCharge() != 0.0 ) && - ( particle->GetParticleName() != "chargedgeantino") ) - { - + } else if( particleName == "GenericIon" ) { + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); + pmanager->AddProcess(new G4ionIonisation, -1,2,2); - G4hIonisation* hion = new G4hIonisation(); - G4PAIModel* pai = new G4PAIModel(particle); - hion->AddEmModel(0,pai,pai,gas); - - pmanager->AddProcess(hion, -1,2,2); + } else if ((!particle->IsShortLived()) && + (particle->GetPDGCharge() != 0.0) && + (particle->GetParticleName() != "chargedgeantino")) { + //all others charged particles except geantino + pmanager->AddProcess(new G4MultipleScattering,-1,1,1); + pmanager->AddProcess(new G4hIonisation, -1,2,2); } } } diff --git a/examples/extended/electromagnetic/TestEm8/src/PhysListGeneral.cc b/examples/extended/electromagnetic/TestEm8/src/PhysListGeneral.cc index 6decd4e6a0..146bf0d7a8 100755 --- a/examples/extended/electromagnetic/TestEm8/src/PhysListGeneral.cc +++ b/examples/extended/electromagnetic/TestEm8/src/PhysListGeneral.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysListGeneral.cc,v 1.1 2003/10/27 15:24:10 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysListGeneral.cc,v 1.2 2004/05/24 16:56:32 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -51,12 +51,13 @@ void PhysListGeneral::ConstructProcess() G4Decay* fDecayProcess = new G4Decay(); theParticleIterator->reset(); - while( (*theParticleIterator)() ){ + while( (*theParticleIterator)() ) + { G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); - if (fDecayProcess->IsApplicable(*particle) && !particle->IsShortLived()) { - + if (fDecayProcess->IsApplicable(*particle) && !particle->IsShortLived()) + { pmanager ->AddProcess(fDecayProcess); // set ordering for PostStepDoIt and AtRestDoIt diff --git a/examples/extended/electromagnetic/TestEm8/src/PhysicsList.cc b/examples/extended/electromagnetic/TestEm8/src/PhysicsList.cc index c7717ced62..2622d108d3 100755 --- a/examples/extended/electromagnetic/TestEm8/src/PhysicsList.cc +++ b/examples/extended/electromagnetic/TestEm8/src/PhysicsList.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PhysicsList.cc,v 1.2 2003/11/24 17:52:48 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PhysicsList.cc,v 1.3 2004/05/27 18:04:31 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -34,7 +34,7 @@ #include "PhysListParticles.hh" #include "PhysListGeneral.hh" #include "PhysListEmStandard.hh" -#include "PhysListEmModelP.hh" +#include "PhysListEmPAI.hh" #include "PhysListEmG4v52.hh" #include "G4Gamma.hh" @@ -122,11 +122,11 @@ void PhysicsList::AddPhysicsList(const G4String& name) delete emPhysicsList; emPhysicsList = new PhysListEmG4v52(name); - } else if (name == "modelPAI") { + } else if (name == "PAI") { emName = name; delete emPhysicsList; - emPhysicsList = new PhysListEmModelP(name); + emPhysicsList = new PhysListEmPAI(name); } else { diff --git a/examples/extended/electromagnetic/TestEm9/GNUmakefile b/examples/extended/electromagnetic/TestEm9/GNUmakefile index c978338c27..c9a31b318b 100644 --- a/examples/extended/electromagnetic/TestEm9/GNUmakefile +++ b/examples/extended/electromagnetic/TestEm9/GNUmakefile @@ -1,5 +1,5 @@ -# $Id: GNUmakefile,v 1.6 2003/11/13 12:00:27 vnivanch Exp $ -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# $Id: GNUmakefile,v 1.7 2004/05/27 13:43:17 vnivanch Exp $ +# GEANT4 tag $Name: geant4-06-02 $ # -------------------------------------------------------------- # GNUmakefile for examples module with AIDA interface # -------------------------------------------------------------- @@ -29,7 +29,7 @@ endif include $(G4INSTALL)/config/binmake.gmk -analclean: +histclean: rm -f $(G4WORKDIR)/tmp/$(G4SYSTEM)/$(G4TARGET)/Histo.o visclean: diff --git a/examples/extended/electromagnetic/TestEm9/History b/examples/extended/electromagnetic/TestEm9/History index 476635be4e..3f1e7a9c02 100644 --- a/examples/extended/electromagnetic/TestEm9/History +++ b/examples/extended/electromagnetic/TestEm9/History @@ -1,4 +1,4 @@ -$Id: History,v 1.16 2003/12/05 11:22:45 vnivanch Exp $ +$Id: History,v 1.17 2004/05/27 13:43:17 vnivanch Exp $ ------------------------------------------------------------------- ========================================================= @@ -16,6 +16,11 @@ track of all tags. ---------------------------------------------------------- +05-12-03 V.Ivanchenko (testem9-V06-01-00) +- Remove Clean of G4RegionStore, instead delete regions one by one +- Add acceptance printout +- Add histclean target into GNUmakefile + 05-12-03 V.Ivanchenko (testem9-V05-02-10) - Update hadronic physics according to the hadronics_lists diff --git a/examples/extended/electromagnetic/TestEm9/README b/examples/extended/electromagnetic/TestEm9/README index 4571aae5a0..62560310c0 100644 --- a/examples/extended/electromagnetic/TestEm9/README +++ b/examples/extended/electromagnetic/TestEm9/README @@ -1,4 +1,4 @@ -$Id: README,v 1.5 2003/10/31 12:08:50 vnivanch Exp $ +$Id: README,v 1.6 2004/06/23 11:28:55 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -82,25 +82,48 @@ $Id: README,v 1.5 2003/10/31 12:08:50 vnivanch Exp $ environment variable G4ANALYSIS_USE and setup local AIDA implementation. The example should be recompiled: - gmake analclean + gmake histclean gmake The macro file csi.mac can be used as exmple of macro for analysis. It can be executed in the following way: $G4WORKDIR/bin/$G4SYSTEM/TestEm9 csi.mac - 7- Using the Anaphe implementation of the AIDA 3.0 histograms: + 7- Using histograms + ------------------- - In order to use the Anaphe implementation of the AIDA 3.0 interfaces, - the 'aida-config' command (which is used in the GNUmakefile) is - available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/aida-config +By default the histograms are not activated. To activate histograms +the environment variable G4ANALYSIS_USE should be defined. For instance +uncomment the flag G4ANALYSIS_USE in GNUmakefile. - In order to run the executable, you need to source the following - script (once): - $HOME/bin/setupAnaphe.csh (or $HOME/bin/setupAnaphe) +To use histograms any of implementations of AIDA interfaces should +be available (see http://aida.freehep.org). - At cern 'setupAnaphe' is available at: - /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe.csh - (or /afs/cern.ch/sw/lhcxx/share/LHCXX/latest/scripts/setupAnaphe) +A package including AIDA and extended interfaces also using Python +is PI, available from: http://cern.ch/pi . + +Once installed PI or PI-Lite in a specified local area $MYPY, it is +required to add the installation path to $PATH, i.e. for example, +for release 1.2.1 of PI: + +setenv PATH ${PATH}:$MYPI/1.2.1/app/releases/PI/PI_1_2_1/rh73_gcc32/bin + +CERN users can use the PATH to the LCG area on AFS. + +Before compilation of the example it is optimal to clean up old +files: + +gmake histclean +gmake + +Before running the example the command should be issued: + +eval `aida-config --runtime csh` + +It is possible to choose the format of the output file with +histograms using UI command: + +/testem/histo/setFileType type + +The following types are available: hbook, root, xml. diff --git a/examples/extended/electromagnetic/TestEm9/TestEm9.in b/examples/extended/electromagnetic/TestEm9/TestEm9.in index 081278b18f..d62bb3d157 100644 --- a/examples/extended/electromagnetic/TestEm9/TestEm9.in +++ b/examples/extended/electromagnetic/TestEm9/TestEm9.in @@ -1,5 +1,5 @@ -# $Id: TestEm9.in,v 1.8 2003/11/26 14:44:43 vnivanch Exp $ -# GEANT4 tag $Name: geant4-06-00-patch-01 $ +# $Id: TestEm9.in,v 1.10 2004/05/27 13:43:17 vnivanch Exp $ +# GEANT4 tag $Name: geant4-06-02 $ # # Macro file for TestEm9 - Crystal Calorimeter # V.Ivanchenko @@ -19,11 +19,16 @@ /testem/phys/MuonCuts 10.0 mm /testem/stepMax 100 mm # -/process/eLoss/preciseRange true -/process/eLoss/integral true +/testem/det/acceptance1 0.8380 0.0319 3.0 +/testem/det/acceptance9 0.9605 0.0146 3.0 +/testem/det/acceptance25 0.9805 0.0118 3.0 +# +#/process/eLoss/preciseRange true +#/process/eLoss/integral true /run/initialize # -#/testem/histo/fileName e_pr.paw +#/testem/histo/fileName e_pr.root +#/testem/histo/fileType root /gun/particle e- /gun/energy 1 GeV /run/beamOn 100 diff --git a/examples/extended/electromagnetic/TestEm9/TestEm9.out b/examples/extended/electromagnetic/TestEm9/TestEm9.out index 4f37658289..8d90c2cdf9 100644 --- a/examples/extended/electromagnetic/TestEm9/TestEm9.out +++ b/examples/extended/electromagnetic/TestEm9/TestEm9.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -74,8 +74,12 @@ PhysicsList::AddPhysicsList: /testem/phys/MuonCuts 10.0 mm /testem/stepMax 100 mm # -/process/eLoss/preciseRange true -/process/eLoss/integral true +/testem/det/acceptance1 0.8380 0.0319 3.0 +/testem/det/acceptance9 0.9605 0.0146 3.0 +/testem/det/acceptance25 0.9805 0.0118 3.0 +# +#/process/eLoss/preciseRange true +#/process/eLoss/integral true /run/initialize Ecal is 36 cm of CsI Absorber is 2 mm of Al @@ -86,7 +90,8 @@ world cuts are set Vertex cuts are set Muon cuts are set # -#/testem/histo/fileName e_pr.paw +#/testem/histo/fileName e_pr.root +#/testem/histo/fileType root /gun/particle e- /gun/energy 1 GeV /run/beamOn 100 @@ -107,7 +112,6 @@ eIoni: tables are built for e- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 - Precise range table up to 1 GeV in 70 bins. Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. eBrem: tables are built for e- @@ -120,7 +124,6 @@ eIoni: tables are built for e+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 - Precise range table up to 1 GeV in 70 bins. Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. eBrem: tables are built for e+ @@ -140,8 +143,7 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 - Precise range table up to 1 GeV in 70 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ @@ -151,8 +153,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 - Precise range table up to 1 GeV in 70 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -170,8 +171,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 - Precise range table up to 1 GeV in 70 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -245,17 +245,30 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100 - User=30.84s Real=34.11s Sys=3.27s + User=31.48s Real=35.19s Sys=3.65s RunAction: End of run actions are started HistoManager: End of run actions are started ======================================================== -Number of events 100 -Average number of e- 1295 -Average number of gamma 681.2 -Average number of e+ 48.45 -Average number of steps 3796 +Number of events 100 +Average number of e- 1306 +Average number of gamma 684.6 +Average number of e+ 48.98 +Average number of steps 3831 +Edep 1x1 = 0.8336 +- 0.002815 +Edep 3x3 = 0.9586 +- 0.001349 +Edep 5x5 = 0.979 +- 0.001047 ======================================================== + +<<<<>>>> 100 events for Crystal Calorimeter +Edep1x1: 0.8336 delEdep1x1= -0.004382 nrms= -1.374 +Erms1x1: 0.02815 delErms1x1= -0.003748 nrms= -1.175 +Edep3x3: 0.9586 delEdep3x3= -0.001905 nrms= -1.305 +Erms3x3: 0.01349 delErms3x3= -0.001111 nrms= -0.7611 +Edep5x5: 0.979 delEdep5x5= -0.001528 nrms= -1.295 +Erms5x5: 0.01047 delErms5x5= -0.00133 nrms= -1.127 +<<<<>>>> IS ACCEPTED + # Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/extended/electromagnetic/TestEm9/include/DetectorConstruction.hh b/examples/extended/electromagnetic/TestEm9/include/DetectorConstruction.hh index 357a86c725..b70686fc85 100644 --- a/examples/extended/electromagnetic/TestEm9/include/DetectorConstruction.hh +++ b/examples/extended/electromagnetic/TestEm9/include/DetectorConstruction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.hh,v 1.2 2003/10/31 12:08:50 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.hh,v 1.3 2004/05/27 13:43:17 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ///////////////////////////////////////////////////////////////////////// @@ -52,6 +52,7 @@ class G4Tubs; class G4LogicalVolume; class G4UniformMagField; class DetectorMessenger; +class G4Region; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -106,6 +107,9 @@ private: G4LogicalVolume* logicA2; G4LogicalVolume* logicA3; G4LogicalVolume* logicA4; + + G4Region* vertexRegion; + G4Region* muonRegion; DetectorMessenger* detectorMessenger; //pointer to the Messenger diff --git a/examples/extended/electromagnetic/TestEm9/include/DetectorMessenger.hh b/examples/extended/electromagnetic/TestEm9/include/DetectorMessenger.hh index 1eca6a74eb..4b205c6c23 100644 --- a/examples/extended/electromagnetic/TestEm9/include/DetectorMessenger.hh +++ b/examples/extended/electromagnetic/TestEm9/include/DetectorMessenger.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorMessenger.hh,v 1.2 2003/10/31 12:08:50 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.hh,v 1.3 2004/05/27 13:43:17 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ///////////////////////////////////////////////////////////////////////// @@ -75,6 +75,9 @@ private: G4UIcmdWithADoubleAndUnit* l5Cmd; G4UIcmdWithADoubleAndUnit* l6Cmd; G4UIcmdWithoutParameter* UpdateCmd; + G4UIcmdWith3Vector* accCmd1; + G4UIcmdWith3Vector* accCmd2; + G4UIcmdWith3Vector* accCmd3; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm9/include/EmAcceptance.hh b/examples/extended/electromagnetic/TestEm9/include/EmAcceptance.hh new file mode 100644 index 0000000000..49862206ed --- /dev/null +++ b/examples/extended/electromagnetic/TestEm9/include/EmAcceptance.hh @@ -0,0 +1,62 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EmAcceptance.hh,v 1.1 2004/05/27 13:43:57 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +#ifndef EmAcceptance_h +#define EmAcceptance_h 1 + +#include "globals.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +class EmAcceptance +{ + +public: + EmAcceptance(); + ~EmAcceptance(); + + void BeginOfAcceptance(const G4String& title, G4int stat); + void EndOfAcceptance(); + + void EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit); + +private: + + // hide assignment operator + EmAcceptance & operator=(const EmAcceptance &right); + EmAcceptance(const EmAcceptance&); + + G4bool isAccepted; + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/electromagnetic/TestEm9/include/Histo.hh b/examples/extended/electromagnetic/TestEm9/include/Histo.hh index 000f2bf286..5e0f67083a 100644 --- a/examples/extended/electromagnetic/TestEm9/include/Histo.hh +++ b/examples/extended/electromagnetic/TestEm9/include/Histo.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: Histo.hh,v 1.2 2003/11/03 19:19:46 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: Histo.hh,v 1.3 2004/04/02 15:13:44 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ #ifndef Histo_h #define Histo_h 1 @@ -92,9 +92,9 @@ public: void addRow(); // Save tuple event - void setFileName(const G4String& nam) {histName = nam;}; + void setFileName(const G4String&); - void setFileType(const G4String& nam) {if(nam == "XML") histType = "XML";}; + void setFileType(const G4String&); private: @@ -117,7 +117,7 @@ private: std::vector xmax; std::vector unit; std::vector ids; - std::vector tittles; + std::vector titles; }; #endif diff --git a/examples/extended/electromagnetic/TestEm9/include/HistoManager.hh b/examples/extended/electromagnetic/TestEm9/include/HistoManager.hh index e5e284fd91..0262184b5b 100644 --- a/examples/extended/electromagnetic/TestEm9/include/HistoManager.hh +++ b/examples/extended/electromagnetic/TestEm9/include/HistoManager.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: HistoManager.hh,v 1.4 2003/11/03 19:19:46 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: HistoManager.hh,v 1.6 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ #ifndef HistoManager_h #define HistoManager_h 1 @@ -50,10 +50,12 @@ #include "G4VPhysicalVolume.hh" #include "G4DataVector.hh" #include "G4Track.hh" -#include "Histo.hh" +//#include "Histo.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +class Histo; + class HistoManager { @@ -106,6 +108,9 @@ public: // Without description void SetThresholdZ(G4double val) {thPosZ = val;}; void AddStep() {n_step++;}; + // Acceptance parameters + void SetEdepAndRMS(G4int, G4ThreeVector); + void SetBeamEnergy(G4double val) {beamEnergy = val;}; private: @@ -137,11 +142,21 @@ private: G4bool nTuple; G4double Eabs1, Eabs2, Eabs3, Eabs4; - G4double E[25]; + G4double E[25]; G4DataVector Evertex; G4DataVector Nvertex; - Histo histo; + G4DataVector edeptrue; + G4DataVector rmstrue; + G4DataVector limittrue; + G4DataVector edep; + G4DataVector erms; + G4int nmax; + + Histo* histo; + + + }; #endif diff --git a/examples/extended/electromagnetic/TestEm9/include/HistoMessenger.hh b/examples/extended/electromagnetic/TestEm9/include/HistoMessenger.hh index 0a5939b229..48ce55a2ce 100644 --- a/examples/extended/electromagnetic/TestEm9/include/HistoMessenger.hh +++ b/examples/extended/electromagnetic/TestEm9/include/HistoMessenger.hh @@ -22,8 +22,8 @@ // // -// $Id: HistoMessenger.hh,v 1.1 2003/10/31 12:09:36 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: HistoMessenger.hh,v 1.2 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -61,8 +61,8 @@ class HistoMessenger: public G4UImessenger G4UIdirectory* histoDir; G4UIcmdWithAString* factoryCmd; G4UIcmdWithAString* fileCmd; - G4UIcommand* histoCmd; - + G4UIcommand* histoCmd; + }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm9/src/DetectorConstruction.cc b/examples/extended/electromagnetic/TestEm9/src/DetectorConstruction.cc index d242d78f7f..e172a3c422 100644 --- a/examples/extended/electromagnetic/TestEm9/src/DetectorConstruction.cc +++ b/examples/extended/electromagnetic/TestEm9/src/DetectorConstruction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorConstruction.cc,v 1.4 2003/11/25 15:19:05 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorConstruction.cc,v 1.5 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ///////////////////////////////////////////////////////////////////////// @@ -79,6 +79,8 @@ DetectorConstruction::DetectorConstruction() padLength = 0.1*mm; padWidth = 0.02*mm; absLength = 2.*mm; + vertexRegion = 0; + muonRegion = 0; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -221,7 +223,11 @@ G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() G4PhysicalVolumeStore::GetInstance()->Clean(); G4LogicalVolumeStore::GetInstance()->Clean(); G4SolidStore::GetInstance()->Clean(); - // G4RegionStore::GetInstance()->Clean(); + + if(vertexRegion) delete vertexRegion; + if(muonRegion) delete muonRegion; + vertexRegion = new G4Region("VertexDetector"); + muonRegion = new G4Region("MuonDetector"); if(vertexLength < padLength*5.0) vertexLength = padLength*5.0; G4double gap = 0.01*mm; @@ -359,15 +365,12 @@ G4VPhysicalVolume* DetectorConstruction::ConstructVolumes() // Define region for the vertex detector - G4Region* regionV = new G4Region("VertexDetector"); - regionV->AddRootLogicalVolume(logicVV); - regionV->AddRootLogicalVolume(logicA3); - + vertexRegion->AddRootLogicalVolume(logicVV); + vertexRegion->AddRootLogicalVolume(logicA3); // Define region for the muon detector - G4Region* regionM = new G4Region("MuonDetector"); - regionM->AddRootLogicalVolume(logicYV); + muonRegion->AddRootLogicalVolume(logicYV); // color regions diff --git a/examples/extended/electromagnetic/TestEm9/src/DetectorMessenger.cc b/examples/extended/electromagnetic/TestEm9/src/DetectorMessenger.cc index c75fa4bee6..770ce96ca4 100644 --- a/examples/extended/electromagnetic/TestEm9/src/DetectorMessenger.cc +++ b/examples/extended/electromagnetic/TestEm9/src/DetectorMessenger.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: DetectorMessenger.cc,v 1.1 2003/07/14 17:10:16 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: DetectorMessenger.cc,v 1.2 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ///////////////////////////////////////////////////////////////////////// @@ -47,6 +47,7 @@ #include "G4UIcmdWith3Vector.hh" #include "G4UIcmdWithADoubleAndUnit.hh" #include "G4UIcmdWithoutParameter.hh" +#include "HistoManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -109,6 +110,28 @@ DetectorMessenger::DetectorMessenger(DetectorConstruction * Det) UpdateCmd->SetGuidance("if you changed geometrical value(s)"); UpdateCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + accCmd1 = new G4UIcmdWith3Vector("/testem/det/acceptance1",this); + accCmd1->SetGuidance("set Edep and RMS"); + accCmd1->SetGuidance("acceptance values for central cell"); + accCmd1->SetParameterName("edep","rms","limit",true); + accCmd1->SetRange("edep>0 && edep<1 && rms>0"); + accCmd1->AvailableForStates(G4State_PreInit,G4State_Idle); + + accCmd2 = new G4UIcmdWith3Vector("/testem/det/acceptance9",this); + accCmd2->SetGuidance("set Edep and RMS"); + accCmd2->SetGuidance("acceptance values for 3x3 matrix"); + accCmd2->SetParameterName("edep","rms","limit",true); + accCmd2->SetRange("edep>0 && edep<1 && rms>0"); + accCmd2->AvailableForStates(G4State_PreInit,G4State_Idle); + + accCmd3 = new G4UIcmdWith3Vector("/testem/det/acceptance25",this); + accCmd3->SetGuidance("set Edep and RMS"); + accCmd3->SetGuidance("acceptance values for 5x5 matrix"); + accCmd3->SetParameterName("edep","rms","limit",true); + accCmd3->SetRange("edep>0 && edep<1 && rms>0"); + accCmd3->AvailableForStates(G4State_PreInit,G4State_Idle); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -125,6 +148,9 @@ DetectorMessenger::~DetectorMessenger() delete l6Cmd; delete UpdateCmd; delete testemDir; + delete accCmd1; + delete accCmd2; + delete accCmd3; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -157,6 +183,18 @@ void DetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) if( command == UpdateCmd ) { Detector->UpdateGeometry();} + + HistoManager* histo = HistoManager::GetPointer(); + if( command == accCmd1 ) + { histo->SetEdepAndRMS(0,accCmd1->GetNew3VectorValue(newValue));} + + if( command == accCmd2 ) + { histo->SetEdepAndRMS(1,accCmd2->GetNew3VectorValue(newValue));} + + if( command == accCmd3 ) + { histo->SetEdepAndRMS(2,accCmd3->GetNew3VectorValue(newValue));} + + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm9/src/EmAcceptance.cc b/examples/extended/electromagnetic/TestEm9/src/EmAcceptance.cc new file mode 100644 index 0000000000..f8574a7c35 --- /dev/null +++ b/examples/extended/electromagnetic/TestEm9/src/EmAcceptance.cc @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: EmAcceptance.cc,v 1.1 2004/05/27 13:43:57 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#include "EmAcceptance.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::EmAcceptance() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +EmAcceptance::~EmAcceptance() +{} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::BeginOfAcceptance(const G4String& title, G4int stat) +{ + G4cout << G4endl; + G4cout << "<<<<>>>> " << stat << " events for " << title << G4endl; + isAccepted = true; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EndOfAcceptance() +{ + G4String resume = "IS ACCEPTED"; + if(!isAccepted) resume = "IS NOT ACCEPTED"; + G4cout << "<<<<>>>> " << resume << G4endl; + G4cout << G4endl; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void EmAcceptance::EmAcceptanceGauss(const G4String& title, G4int stat, + G4double avr, G4double avr0, + G4double rms, G4double limit) +{ + G4double x = sqrt((G4double)stat); + G4double dde = avr - avr0; + G4double de = dde*x/rms; + + G4cout << title << ": " << avr << " del"<< title << "= " << dde << " nrms= " << de << G4endl; + if(de > limit) isAccepted = false; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm9/src/Histo.cc b/examples/extended/electromagnetic/TestEm9/src/Histo.cc index c13bb1e8d0..bd1993ad02 100644 --- a/examples/extended/electromagnetic/TestEm9/src/Histo.cc +++ b/examples/extended/electromagnetic/TestEm9/src/Histo.cc @@ -36,12 +36,12 @@ #include "Histo.hh" #ifdef G4ANALYSIS_USE + #include // for the auto_ptr(T> #include "AIDA/AIDA.h" #include "HistoMessenger.hh" -#endif -//#include +#endif //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -84,14 +84,16 @@ void Histo::book() G4cout << "### Histo books " << nHisto << " histograms " << G4endl; // Creating the analysis factory std::auto_ptr< AIDA::IAnalysisFactory > af( AIDA_createAnalysisFactory() ); - // Creating the tree factory std::auto_ptr< AIDA::ITreeFactory > tf( af->createTreeFactory() ); // Creating a tree mapped to a new hbook file. - //tree = tf->create(histName,histType,false,false); - tree = tf->create(histName,histType,false,false,"uncompress"); - G4cout << "Tree store : " << tree->storeName() << G4endl; + + tree = tf->create(histName,histType,false,true,"uncompress"); + if(tree) + G4cout << "Tree store : " << tree->storeName() << G4endl; + else + G4cout << "ERROR: Tree store " << histName << " is not created!" << G4endl; // Creating a histogram factory, whose histograms will be handled by the tree std::auto_ptr< AIDA::IHistogramFactory > hf(af->createHistogramFactory( *tree )); @@ -100,7 +102,7 @@ void Histo::book() for(G4int i=0; icreateHistogram1D(ids[i], tittles[i], bins[i], xmin[i], xmax[i]); + histo[i] = hf->createHistogram1D(ids[i], titles[i], bins[i], xmin[i], xmax[i]); } } // Creating a tuple factory, whose tuples will be handled by the tree @@ -143,7 +145,7 @@ void Histo::add1D(const G4String& id, const G4String& name, G4int nb, xmax.push_back(x2); unit.push_back(u); ids.push_back(id); - tittles.push_back(name); + titles.push_back(name); histo.push_back(0); } @@ -232,3 +234,17 @@ void Histo::addRow() //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void Histo::setFileName(const G4String& nam) +{ + histName = nam; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void Histo::setFileType(const G4String& nam) +{ + histType = nam; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/examples/extended/electromagnetic/TestEm9/src/HistoManager.cc b/examples/extended/electromagnetic/TestEm9/src/HistoManager.cc index 68b7f411ee..e0733679fc 100644 --- a/examples/extended/electromagnetic/TestEm9/src/HistoManager.cc +++ b/examples/extended/electromagnetic/TestEm9/src/HistoManager.cc @@ -35,6 +35,8 @@ #include "HistoManager.hh" #include "G4UnitsTable.hh" +#include "Histo.hh" +#include "EmAcceptance.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -55,15 +57,19 @@ HistoManager* HistoManager::GetPointer() HistoManager::HistoManager() { verbose = 1; - nEvt1 = -1; - nEvt2 = -1; + nEvt1 = -1; + nEvt2 = -1; + nmax = 3; + histo = new Histo(); bookHisto(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... HistoManager::~HistoManager() -{} +{ + delete histo; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -79,38 +85,46 @@ void HistoManager::bookHisto() nTuple = false; nHisto = 10; - histo.add1D("10", + for(G4int i=0; iadd1D("10", "Energy deposit (MeV) in central crystal",nBinsED,0.0,beamEnergy,MeV); - histo.add1D("11", + histo->add1D("11", "Energy deposit (MeV) in 3x3",nBinsED,0.0,beamEnergy,MeV); - histo.add1D("12", + histo->add1D("12", "Energy deposit (MeV) in 5x5",nBinsED,0.0,beamEnergy,MeV); - histo.add1D("13", + histo->add1D("13", "Energy (MeV) of delta-electrons",nBinsE,0.0,maxEnergy,MeV); - histo.add1D("14", + histo->add1D("14", "Energy (MeV) of gammas",nBinsE,0.0,maxEnergy,MeV); - histo.add1D("15", + histo->add1D("15", "Energy (MeV) in abs1",nBinsEA,0.0,maxEnergyAbs,MeV); - histo.add1D("16", + histo->add1D("16", "Energy (MeV) in abs2",nBinsEA,0.0,maxEnergyAbs,MeV); - histo.add1D("17", + histo->add1D("17", "Energy (MeV) in abs3",nBinsEA,0.0,maxEnergyAbs,MeV); - histo.add1D("18", + histo->add1D("18", "Energy (MeV) in abs4",nBinsEA,0.0,maxEnergyAbs,MeV); - histo.add1D("19", + histo->add1D("19", "Number of vertex hits",20,-0.5,19.5,1.0); if(nTuple) { - histo.addTuple( "100", "Dose deposite","float r, z, e" ); + histo->addTuple( "100", "Dose deposite","float r, z, e" ); } } @@ -123,7 +137,7 @@ void HistoManager::BeginOfRun() n_posit= 0; n_gam = 0; n_step = 0; - histo.book(); + histo->book(); if(verbose > 0) { G4cout << "HistoManager: Histograms are booked and run has been started" @@ -137,30 +151,62 @@ void HistoManager::EndOfRun() { G4cout << "HistoManager: End of run actions are started" << G4endl; + G4String nam[3] = {"1x1", "3x3", "5x5"}; // average G4cout<<"========================================================"< 0) x = 1.0/x; + G4int j; + for(j=0; jscale(i,x); } - histo.save(); + histo->save(); + + // Acceptance + EmAcceptance acc; + G4bool isStarted = false; + for (j=0; j=i) || (11<=i && 13>=i) || (16<=i && 18>=i)) e9 += E[i]; } - histo.fill(0,E[12],1.0); - histo.fill(1,e9,1.0); - histo.fill(2,e25,1.0); - histo.fill(5,Eabs1,1.0); - histo.fill(6,Eabs2,1.0); - histo.fill(7,Eabs3,1.0); - histo.fill(8,Eabs4,1.0); + histo->fill(0,E[12],1.0); + histo->fill(1,e9,1.0); + histo->fill(2,e25,1.0); + histo->fill(5,Eabs1,1.0); + histo->fill(6,Eabs2,1.0); + histo->fill(7,Eabs3,1.0); + histo->fill(8,Eabs4,1.0); float nn = (double)(Nvertex.size()); - histo.fill(9,nn,1.0); + histo->fill(9,nn,1.0); - if(nTuple) histo.addRow(); + edep[0] += E[12]; + erms[0] += E[12]*E[12]; + edep[1] += e9; + erms[1] += e9*e9; + edep[2] += e25; + erms[2] += e25*e25; + + if(nTuple) histo->addRow(); } @@ -219,13 +272,13 @@ void HistoManager::ScoreNewTrack(const G4Track* aTrack) if(0 == pid) { - histo.fillTuple("TKIN", kinE/MeV); + histo->fillTuple("TKIN", kinE/MeV); G4double mass = 0.0; if(particle) { mass = particle->GetPDGMass(); - histo.fillTuple("MASS", mass/MeV); - histo.fillTuple("CHAR",(particle->GetPDGCharge())/eplus); + histo->fillTuple("MASS", mass/MeV); + histo->fillTuple("CHAR",(particle->GetPDGCharge())/eplus); G4double beta = 1.; if(mass > 0.) { G4double gamma = kinE/mass + 1.; @@ -268,9 +321,9 @@ void HistoManager::ScoreNewTrack(const G4Track* aTrack) void HistoManager::AddEnergy(G4double edep, G4int volIndex, G4int copyNo) { if(1 < verbose) { - G4cout << "HistoManager::AddEnergy: e(keV)= " << edep/keV + G4cout << "HistoManager::AddEnergy: e(keV)= " << edep/keV << "; volIdx= " << volIndex - << "; copyNo= " << copyNo + << "; copyNo= " << copyNo << G4endl; } if(0 == volIndex) { @@ -308,7 +361,7 @@ void HistoManager::AddDeltaElectron(const G4DynamicParticle* elec) { G4double e = elec->GetKineticEnergy()/MeV; if(e > 0.0) n_elec++; - histo.fill(3,e,1.0); + histo->fill(3,e,1.0); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -317,7 +370,18 @@ void HistoManager::AddPhoton(const G4DynamicParticle* ph) { G4double e = ph->GetKineticEnergy()/MeV; if(e > 0.0) n_gam++; - histo.fill(4,e,1.0); + histo->fill(4,e,1.0); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void HistoManager::SetEdepAndRMS(G4int i, G4ThreeVector val) +{ + if(i=0) { + if(val[0] > 0.0) edeptrue[i] = val[0]; + if(val[1] > 0.0) rmstrue[i] = val[1]; + if(val[2] > 0.0) limittrue[i] = val[2]; + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/examples/extended/electromagnetic/TestEm9/src/HistoMessenger.cc b/examples/extended/electromagnetic/TestEm9/src/HistoMessenger.cc index 782b427b9a..2ec593a049 100644 --- a/examples/extended/electromagnetic/TestEm9/src/HistoMessenger.cc +++ b/examples/extended/electromagnetic/TestEm9/src/HistoMessenger.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: HistoMessenger.cc,v 1.1 2003/10/31 12:09:37 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: HistoMessenger.cc,v 1.2 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -48,7 +48,7 @@ HistoMessenger::HistoMessenger(Histo* manager) fileCmd = new G4UIcmdWithAString("/testem/histo/fileType",this); fileCmd->SetGuidance("set type (hbook, XML) for the histograms file"); - + histoCmd = new G4UIcommand("/testem/histo/setHisto",this); histoCmd->SetGuidance("Set bining of the histo number ih :"); histoCmd->SetGuidance(" nbBins; valMin; valMax; unit (of vmin and vmax)"); @@ -61,20 +61,21 @@ HistoMessenger::HistoMessenger(Histo* manager) G4UIparameter* nbBins = new G4UIparameter("nbBins",'i',false); nbBins->SetGuidance("number of bins"); nbBins->SetParameterRange("nbBins>0"); - histoCmd->SetParameter(nbBins); - // + histoCmd->SetParameter(nbBins); + // G4UIparameter* valMin = new G4UIparameter("valMin",'d',false); valMin->SetGuidance("valMin, expressed in unit"); - histoCmd->SetParameter(valMin); - // + histoCmd->SetParameter(valMin); + // G4UIparameter* valMax = new G4UIparameter("valMax",'d',false); valMax->SetGuidance("valMax, expressed in unit"); histoCmd->SetParameter(valMax); - // + // G4UIparameter* unit = new G4UIparameter("unit",'s',true); unit->SetGuidance("if omitted, vmin and vmax are assumed dimensionless"); unit->SetDefaultValue("none"); - histoCmd->SetParameter(unit); + histoCmd->SetParameter(unit); + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -84,7 +85,7 @@ HistoMessenger::~HistoMessenger() delete fileCmd; delete histoCmd; delete factoryCmd; - delete histoDir; + delete histoDir; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -106,7 +107,7 @@ void HistoMessenger::SetNewValue(G4UIcommand* command,G4String newValues) G4double vUnit = 1. ; if (unit != "none") vUnit = G4UIcommand::ValueOf(unit); histo->setHisto1D(ih,nbBins,vmin,vmax,vUnit); - } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/electromagnetic/TestEm9/src/PrimaryGeneratorAction.cc b/examples/extended/electromagnetic/TestEm9/src/PrimaryGeneratorAction.cc index 8ab0468bf4..e1f403fd10 100644 --- a/examples/extended/electromagnetic/TestEm9/src/PrimaryGeneratorAction.cc +++ b/examples/extended/electromagnetic/TestEm9/src/PrimaryGeneratorAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: PrimaryGeneratorAction.cc,v 1.1 2003/07/14 17:10:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: PrimaryGeneratorAction.cc,v 1.2 2004/05/27 13:43:18 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ///////////////////////////////////////////////////////////////////////// @@ -46,6 +46,7 @@ #include "G4Event.hh" #include "G4ParticleTable.hh" #include "G4ParticleDefinition.hh" +#include "HistoManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -74,7 +75,9 @@ PrimaryGeneratorAction::~PrimaryGeneratorAction() void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { G4double zVertex = - (detector->GetWorldSizeZ()); - particleGun->SetParticlePosition(G4ThreeVector(0.,0.,zVertex)); + particleGun->SetParticlePosition(G4ThreeVector(0.,0.,zVertex)); + if(anEvent->GetEventID() == 1) + (HistoManager::GetPointer())->SetBeamEnergy(particleGun->GetParticleEnergy()); particleGun->GeneratePrimaryVertex(anEvent); } diff --git a/examples/extended/field/BlineTracer/History b/examples/extended/field/BlineTracer/History index 01014ecbc4..f6eb03f871 100644 --- a/examples/extended/field/BlineTracer/History +++ b/examples/extended/field/BlineTracer/History @@ -1,4 +1,4 @@ -$Id: History,v 1.1 2003/11/25 09:29:45 gcosmo Exp $ +$Id: History,v 1.2 2004/06/03 15:28:49 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 6th, 2004 - L.Desorgher (BlineTracer-V06-01-00) +--------------------------- +- Added inclusion of G4ChordFinder.hh in G4BlineTracer.cc. + Nov 25th, 2003 - G.Cosmo (BlineTracer-V05-02-00) ------------------------ - Created from original sources, courtesy of L.Desorgher. diff --git a/examples/extended/field/BlineTracer/src/G4BlineTracer.cc b/examples/extended/field/BlineTracer/src/G4BlineTracer.cc index a58fbc2d53..ef937dc53e 100644 --- a/examples/extended/field/BlineTracer/src/G4BlineTracer.cc +++ b/examples/extended/field/BlineTracer/src/G4BlineTracer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4BlineTracer.cc,v 1.1 2003/11/25 09:29:47 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4BlineTracer.cc,v 1.2 2004/06/03 15:28:28 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------------- @@ -47,6 +47,7 @@ #include "G4PropagatorInField.hh" #include "G4CashKarpRKF45.hh" #include "G4LogicalVolumeStore.hh" +#include "G4ChordFinder.hh" ////////////////////////////////////////////////////////////////// diff --git a/examples/extended/field/History b/examples/extended/field/History new file mode 100644 index 0000000000..9191e395f1 --- /dev/null +++ b/examples/extended/field/History @@ -0,0 +1,25 @@ +$Id: History,v 1.2 2004/04/27 08:15:40 gcosmo Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + extended/field 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 * + ---------------------------------------------------------- + +Mar 23rd, 2004 John Apostolakis (fieldex-V06-00-00) +--------------------------------------------------- +- Group together fixes in: + field01 fieldex01-V06-00-00 and + field03 fieldex03-V06-00-00 + which fix common problem in SetField methods. +- Created. + diff --git a/examples/extended/field/field01/field01.out b/examples/extended/field/field01/field01.out index b1c965f603..41b7f06680 100644 --- a/examples/extended/field/field01/field01.out +++ b/examples/extended/field/field01/field01.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -122,8 +122,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -132,7 +132,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -150,7 +150,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -181,12 +181,12 @@ Start Run processing. Step# X Y Z Direction x dir y dir z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 21.9895 m 0 0 -1 500 MeV 0 eV 0 fm 0 fm World initStep 1 0 fm 1.01183 m 21.9895 m 0 8.95106e-13 1 500 MeV 0 eV 1.58938 m 1.58938 m World Transportation - 2 0 fm 1.01183 m 21.9905 m 0 -0.00197661 0.999998 500 MeV 0 eV 1 mm 1.59038 m Absorber Transportation - 3 0 fm 1.01172 m 22 m 0 -0.0207544 0.999785 500 MeV 0 eV 9.50075 mm 1.59988 m OutOfWorld Transportation + 2 0 fm 1.01183 m 21.9905 m 0 -0.00197661 0.999998 500 MeV2.44427e-06 eV 1 mm 1.59038 m Absorber Transportation + 3 0 fm 1.01172 m 22 m 0 -0.0207544 0.999785 500 MeV2.31353e-05 eV 9.50075 mm 1.59988 m OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 1 - User=0.01s Real=0.01s Sys=0s + User=0s Real=0.01s Sys=0.01s ========= Table of registered couples ============================== @@ -211,12 +211,12 @@ Start Run processing. Step# X Y Z Direction x dir y dir z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 21.9895 m 0 0 -1 250 MeV 0 eV 0 fm 0 fm World initStep 1 0 fm 50.6432 cm 21.9895 m 0 1.17461e-09 1 250 MeV 0 eV 79.5502 cm 79.5502 cm World Transportation - 2 0 fm 50.643 cm 21.9905 m 0 -0.0039492 0.999992 250 MeV 0 eV 1 mm 79.6502 cm Absorber Transportation - 3 0 fm 50.6214 cm 22 m 0 -0.0414666 0.99914 250 MeV 0 eV 9.50301 mm 80.6005 cm OutOfWorld Transportation + 2 0 fm 50.643 cm 21.9905 m 0 -0.0039492 0.999992 250 MeV2.30216e-06 eV 1 mm 79.6502 cm Absorber Transportation + 3 0 fm 50.6214 cm 22 m 0 -0.0414666 0.99914 250 MeV2.18563e-05 eV 9.50301 mm 80.6005 cm OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 1 - User=0.01s Real=0.01s Sys=0s + User=0s Real=0s Sys=0s ========= Table of registered couples ============================== @@ -241,12 +241,12 @@ Start Run processing. Step# X Y Z Direction x dir y dir z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 21.9895 m 0 0 -1 200 MeV 0 eV 0 fm 0 fm World initStep 1 0 fm 40.5352 cm 21.9895 m 0 -2.18037e-09 1 200 MeV 0 eV 63.6725 cm 63.6725 cm World Transportation - 2 0 fm 40.5349 cm 21.9905 m 0 -0.00493399 0.999988 200 MeV 0 eV 1 mm 63.7725 cm Absorber Transportation - 3 0 fm 40.5079 cm 22 m 0 -0.0518069 0.998657 200 MeV 0 eV 9.50471 mm 64.723 cm OutOfWorld Transportation + 2 0 fm 40.5349 cm 21.9905 m 0 -0.00493399 0.999988 200 MeV2.24532e-06 eV 1 mm 63.7725 cm Absorber Transportation + 3 0 fm 40.5079 cm 22 m 0 -0.0518069 0.998657 200 MeV2.14584e-05 eV 9.50471 mm 64.723 cm OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 1 - User=0s Real=0.01s Sys=0.01s + User=0.01s Real=0.01s Sys=0s ========= Table of registered couples ============================== @@ -270,13 +270,13 @@ Start Run processing. Step# X Y Z Direction x dir y dir z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 21.9895 m 0 0 -1 100 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm 20.319 cm 21.9895 m 0 9.91398e-09 1 100 MeV 0 eV 31.9171 cm 31.9171 cm World Transportation - 2 0 fm 20.3185 cm 21.9905 m 0 -0.00984297 0.999952 100 MeV 0 eV 1.00002 mm 32.0171 cm Absorber Transportation - 3 0 fm 20.2645 cm 22 m 0 -0.103352 0.994645 100 MeV 0 eV 9.51883 mm 32.969 cm OutOfWorld Transportation + 1 0 fm 20.319 cm 21.9895 m 0 9.91398e-09 1 100 MeV0.000676636 eV 31.9171 cm 31.9171 cm World Transportation + 2 0 fm 20.3185 cm 21.9905 m 0 -0.00984297 0.999952 100 MeV2.11742e-06 eV 1.00002 mm 32.0171 cm Absorber Transportation + 3 0 fm 20.2645 cm 22 m 0 -0.103352 0.994645 100 MeV2.01794e-05 eV 9.51883 mm 32.969 cm OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 1 - User=0s Real=0s Sys=0s + User=0s Real=0.01s Sys=0.01s ========= Table of registered couples ============================== @@ -300,9 +300,9 @@ Start Run processing. Step# X Y Z Direction x dir y dir z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 21.9895 m 0 0 -1 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm 10.2108 cm 21.9895 m 0 -7.69218e-09 1 50 MeV 0 eV 16.0391 cm 16.0391 cm World Transportation - 2 0 fm 10.2098 cm 21.9905 m 0 -0.0195872 0.999808 50 MeV 0 eV 1.00006 mm 16.1391 cm Absorber Transportation - 3 0 fm 10.1016 cm 22 m 0 -0.205667 0.978622 50 MeV 0 eV 9.5755 mm 17.0966 cm OutOfWorld Transportation + 1 0 fm 10.2108 cm 21.9895 m 0 -7.69218e-09 1 50 MeV0.000318174 eV 16.0391 cm 16.0391 cm World Transportation + 2 0 fm 10.2098 cm 21.9905 m 0 -0.0195872 0.999808 50 MeV1.98241e-06 eV 1.00006 mm 16.1391 cm Absorber Transportation + 3 0 fm 10.1016 cm 22 m 0 -0.205667 0.978622 50 MeV1.89928e-05 eV 9.5755 mm 17.0966 cm OutOfWorld Transportation Run terminated. Run Summary Number of events processed : 1 @@ -375,7 +375,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 100 - User=0.03s Real=0.03s Sys=0s + User=0.02s Real=0.02s Sys=0s Graphics systems deleted. Visualization Manager deleting... G4 kernel has come to Quit state. diff --git a/examples/extended/field/field02/field02.out b/examples/extended/field/field02/field02.out index 9ff69b21ca..bc339349d2 100644 --- a/examples/extended/field/field02/field02.out +++ b/examples/extended/field/field02/field02.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -123,8 +123,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -133,7 +133,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -151,7 +151,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -188,16 +188,16 @@ Start Run processing. Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -18.1 cm 2.17 cm 1.86 GeV 36.7 keV 18.6 cm 18.6 cm World eIoni - 2 -684 nm -20 cm 2.22 cm 2.05 GeV 2.53 keV 1.85 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -18 cm 2.17 cm 1.85 GeV 36.4 keV 18.5 cm 18.5 cm World eIoni + 2 -744 nm -20 cm 2.22 cm 2.05 GeV 2.67 keV 2 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -18.1 cm 2.17 cm 5.17 keV 0 eV 0 fm 0 fm World initStep - 1 30 mum -18.2 cm 2.17 cm 8.15 MeV 5.17 keV 766 mum 766 mum World eIoni + 0 0 fm -18 cm 2.17 cm 5.17 keV 0 eV 0 fm 0 fm World initStep + 1 30 mum -18.1 cm 2.17 cm 8.15 MeV 5.17 keV 766 mum 766 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -205,70 +205,44 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.3 cm 1.66 cm 680 MeV 13.8 keV 6.79 cm 6.79 cm World eIoni - 2 -388 nm -8.27 cm 1.79 cm 877 MeV 4.45 keV 1.97 cm 8.76 cm World eIoni - 3 -1.81 mum -11.3 cm 1.94 cm 1.18 GeV 9.54 keV 3.05 cm 11.8 cm World eIoni - 4 -6.7 mum -14.4 cm 2.06 cm 1.49 GeV 7.95 keV 3.12 cm 14.9 cm World eIoni - 5 -13.9 mum -20 cm 2.22 cm 2.05 GeV 11.4 keV 5.57 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -6.25 cm 1.66 cm 675 MeV 13.7 keV 6.73 cm 6.73 cm World eIoni + 2 -390 nm -8.21 cm 1.79 cm 871 MeV 4.45 keV 1.97 cm 8.7 cm World eIoni + 3 -1.82 mum -11.3 cm 1.94 cm 1.18 GeV 9.54 keV 3.05 cm 11.8 cm World eIoni + 4 -6.73 mum -14.4 cm 2.06 cm 1.49 GeV 7.95 keV 3.12 cm 14.9 cm World eIoni + 5 -14 mum -20 cm 2.22 cm 2.05 GeV 11.5 keV 5.63 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -6.7 mum -14.4 cm 2.06 cm 1.29 keV 0 eV 0 fm 0 fm World initStep - 1 -3.77 mum -14.4 cm 2.06 cm 903 keV 1.29 keV 82.2 mum 82.2 mum World eIoni + 0 -6.73 mum -14.4 cm 2.06 cm 1.29 keV 0 eV 0 fm 0 fm World initStep + 1 -3.8 mum -14.4 cm 2.06 cm 903 keV 1.29 keV 82.2 mum 82.2 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.81 mum -11.3 cm 1.94 cm 52.5 keV 0 eV 0 fm 0 fm World initStep - 1 135 mum -12.9 cm 1.93 cm 162 MeV 10.8 keV 1.61 cm 1.61 cm World eIoni - 2 150 mum -17 cm 1.93 cm 575 MeV 9.01 keV 4.12 cm 5.74 cm World eIoni - 3 153 mum -18.9 cm 1.93 cm 761 MeV 4.22 keV 1.87 cm 7.6 cm World eIoni - 4 154 mum -20 cm 1.93 cm 870 MeV 1.83 keV 1.09 cm 8.69 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 153 mum -18.9 cm 1.93 cm 3.4 keV 0 eV 0 fm 0 fm World initStep - 1 135 mum -18.9 cm 1.93 cm 4 MeV 3.4 keV 372 mum 372 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 150 mum -17 cm 1.93 cm 1.09 keV 0 eV 0 fm 0 fm World initStep - 1 154 mum -17 cm 1.93 cm 713 keV 1.09 keV 64.8 mum 64.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 135 mum -12.9 cm 1.93 cm 1.93 keV 0 eV 0 fm 0 fm World initStep - 1 145 mum -12.9 cm 1.93 cm 1.61 MeV 1.93 keV 147 mum 147 mum World eIoni + 0 -1.82 mum -11.3 cm 1.94 cm 52.5 keV 0 eV 0 fm 0 fm World initStep + 1 95.7 mum -11.6 cm 1.93 cm 34.6 MeV 2.82 keV 3.39 mm 3.39 mm World eIoni + 2 148 mum -20 cm 1.92 cm 875 MeV 15.9 keV 8.41 cm 8.75 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -388 nm -8.27 cm 1.79 cm 1.41 keV 0 eV 0 fm 0 fm World initStep - 1 5.48 mum -8.28 cm 1.79 cm 1.03 MeV 1.41 keV 93.3 mum 93.3 mum World eIoni + 0 -390 nm -8.21 cm 1.79 cm 1.41 keV 0 eV 0 fm 0 fm World initStep + 1 5.48 mum -8.22 cm 1.79 cm 1.03 MeV 1.41 keV 93.3 mum 93.3 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.3 cm 1.66 cm 1.08 keV 0 eV 0 fm 0 fm World initStep - 1 2.33 mum -6.31 cm 1.66 cm 704 keV 1.08 keV 64.1 mum 64.1 mum World eIoni + 0 0 fm -6.25 cm 1.66 cm 1.08 keV 0 eV 0 fm 0 fm World initStep + 1 2.33 mum -6.25 cm 1.66 cm 703 keV 1.08 keV 64.1 mum 64.1 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -276,52 +250,43 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.63 cm 1.27 cm 313 MeV 6.73 keV 3.1 cm 3.1 cm World eIoni - 2 169 nm -2.96 cm 1.32 cm 346 MeV 103 eV 3.32 mm 3.43 cm World eIoni - 3 4.11 mum -7.48 cm 1.74 cm 798 MeV 9.08 keV 4.54 cm 7.96 cm World eIoni - 4 4.6 mum -10 cm 1.88 cm 1.05 GeV 3.69 keV 2.53 cm 10.5 cm World eIoni - 5 7.57 mum -18.2 cm 2.17 cm 1.87 GeV 17.4 keV 8.23 cm 18.7 cm World eIoni - 6 7.47 mum -20 cm 2.22 cm 2.05 GeV 4.82 keV 1.77 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 7.57 mum -18.2 cm 2.17 cm 4.35 keV 0 eV 0 fm 0 fm World initStep - 1 30.7 mum -18.3 cm 2.17 cm 6.09 MeV 4.35 keV 569 mum 569 mum World eIoni + 1 0 fm -856 mum 2.9 mm 58.6 MeV 346 eV 3.06 mm 3.06 mm World eIoni + 2 15.3 mum -2.24 cm 1.2 cm 274 MeV 6.52 keV 2.39 cm 2.7 cm World eIoni + 3 18.4 mum -4.09 cm 1.46 cm 459 MeV 4.11 keV 1.87 cm 4.56 cm World eIoni + 4 29.9 mum -15.9 cm 2.11 cm 1.64 GeV 25.2 keV 11.8 cm 16.4 cm World eIoni + 5 31.8 mum -20 cm 2.22 cm 2.05 GeV 9.79 keV 4.1 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.6 mum -10 cm 1.88 cm 1.43 keV 0 eV 0 fm 0 fm World initStep - 1 -1.49 mum -10 cm 1.88 cm 1.04 MeV 1.43 keV 94.6 mum 94.6 mum World eIoni + 0 29.9 mum -15.9 cm 2.11 cm 1.91 keV 0 eV 0 fm 0 fm World initStep + 1 30.7 mum -15.9 cm 2.11 cm 1.59 MeV 1.91 keV 145 mum 145 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.11 mum -7.48 cm 1.74 cm 3.11 keV 0 eV 0 fm 0 fm World initStep - 1 12.7 mum -7.51 cm 1.74 cm 3.43 MeV 3.11 keV 317 mum 317 mum World eIoni + 0 18.4 mum -4.09 cm 1.46 cm 1.48 keV 0 eV 0 fm 0 fm World initStep + 1 12.8 mum -4.1 cm 1.46 cm 1.1 MeV 1.48 keV 100 mum 100 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 169 nm -2.96 cm 1.32 cm 1.59 keV 0 eV 0 fm 0 fm World initStep - 1 -5.72 mum -2.97 cm 1.32 cm 1.22 MeV 1.59 keV 110 mum 110 mum World eIoni + 0 15.3 mum -2.24 cm 1.2 cm 1.09 keV 0 eV 0 fm 0 fm World initStep + 1 19.2 mum -2.24 cm 1.2 cm 710 keV 1.09 keV 64.8 mum 64.8 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.63 cm 1.27 cm 1.01 keV 0 eV 0 fm 0 fm World initStep - 1 -2.51 mum -2.64 cm 1.27 cm 645 keV 1.01 keV 58.3 mum 58.3 mum World eIoni + 0 0 fm -856 mum 2.9 mm 9.17 keV 0 eV 0 fm 0 fm World initStep + 1 -55.1 mum -2.98 mm 2.89 mm 22.7 MeV 9.17 keV 2.15 mm 2.15 mm World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -329,16 +294,43 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -7.12 cm 1.72 cm 762 MeV 13.9 keV 7.6 cm 7.6 cm World eIoni - 2 444 nm -20 cm 2.22 cm 2.05 GeV 28.6 keV 12.9 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -1.44 cm 1.02 cm 194 MeV 3.66 keV 1.88 cm 1.88 cm World eIoni + 2 -1.84 mum -3.61 cm 1.41 cm 411 MeV 4.24 keV 2.21 cm 4.08 cm World eIoni + 3 -15.9 mum -15 cm 2.08 cm 1.55 GeV 23.6 keV 11.4 cm 15.5 cm World eIoni + 4 -17.3 mum -16.7 cm 2.13 cm 1.72 GeV 2.9 keV 1.7 cm 17.2 cm World eIoni + 5 -20.3 mum -20 cm 2.22 cm 2.05 GeV 4.79 keV 3.29 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -17.3 mum -16.7 cm 2.13 cm 2 keV 0 eV 0 fm 0 fm World initStep + 1 -10.7 mum -16.7 cm 2.13 cm 1.7 MeV 2 keV 155 mum 155 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -15.9 mum -15 cm 2.08 cm 1.28 keV 0 eV 0 fm 0 fm World initStep + 1 -10.4 mum -15 cm 2.08 cm 884 keV 1.28 keV 80.4 mum 80.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.84 mum -3.61 cm 1.41 cm 8.91 keV 0 eV 0 fm 0 fm World initStep + 1 49.9 mum -3.81 cm 1.4 cm 21.6 MeV 8.91 keV 2.04 mm 2.04 mm World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -7.12 cm 1.72 cm 1.17 keV 0 eV 0 fm 0 fm World initStep - 1 -720 nm -7.12 cm 1.72 cm 784 keV 1.17 keV 71.5 mum 71.5 mum World eIoni + 0 0 fm -1.44 cm 1.02 cm 1.02 keV 0 eV 0 fm 0 fm World initStep + 1 3.64 mum -1.44 cm 1.02 cm 662 keV 1.02 keV 59.7 mum 59.7 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -346,16 +338,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -12.8 cm 2 cm 1.33 GeV 27 keV 13.3 cm 13.3 cm World eIoni - 2 -1.22 mum -20 cm 2.22 cm 2.05 GeV 15 keV 7.22 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -11.3 cm 1.94 cm 1.18 GeV 22.9 keV 11.8 cm 11.8 cm World eIoni + 2 1.49 mum -20 cm 2.22 cm 2.05 GeV 17.8 keV 8.69 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -12.8 cm 2 cm 1.24 keV 0 eV 0 fm 0 fm World initStep - 1 4.67 mum -12.8 cm 2 cm 850 keV 1.24 keV 77.4 mum 77.4 mum World eIoni + 0 0 fm -11.3 cm 1.94 cm 1.45 keV 0 eV 0 fm 0 fm World initStep + 1 -4.98 mum -11.3 cm 1.94 cm 1.07 MeV 1.45 keV 97.1 mum 97.1 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -363,8 +355,50 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -10.2 cm 1.89 cm 1.07 GeV 20.9 keV 10.7 cm 10.7 cm World eIoni - 2 -3.31 mum -20 cm 2.22 cm 2.05 GeV 21.2 keV 9.76 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.7 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -11.6 cm 1.95 cm 1.21 GeV 23.4 keV 12.1 cm 12.1 cm World eIoni + 2 238 nm -20 cm 2.22 cm 2.05 GeV 19.1 keV 8.45 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -11.6 cm 1.95 cm 1.17 keV 0 eV 0 fm 0 fm World initStep + 1 -721 nm -11.6 cm 1.95 cm 785 keV 1.17 keV 71.5 mum 71.5 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -12.7 cm 2 cm 1.32 GeV 26.8 keV 13.2 cm 13.2 cm World eIoni + 2 -1.24 mum -20 cm 2.22 cm 2.05 GeV 15.2 keV 7.33 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -12.7 cm 2 cm 1.24 keV 0 eV 0 fm 0 fm World initStep + 1 4.67 mum -12.7 cm 2 cm 850 keV 1.24 keV 77.4 mum 77.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -10.2 cm 1.89 cm 1.07 GeV 20.7 keV 10.7 cm 10.7 cm World eIoni + 2 -3.35 mum -20 cm 2.22 cm 2.05 GeV 21.4 keV 9.85 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 @@ -372,7 +406,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm -10.2 cm 1.89 cm 2.61 keV 0 eV 0 fm 0 fm World initStep - 1 13.5 mum -10.3 cm 1.89 cm 2.58 MeV 2.61 keV 238 mum 238 mum World eIoni + 1 13.5 mum -10.2 cm 1.89 cm 2.58 MeV 2.61 keV 238 mum 238 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -380,11 +414,11 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -637 mum 2.51 mm 56.4 MeV 240 eV 2.62 mm 2.62 mm World eIoni - 2 -10.6 mum -1.8 cm 1.11 cm 230 MeV 4.53 keV 1.99 cm 2.25 cm World eIoni - 3 -23.6 mum -10.1 cm 1.89 cm 1.06 GeV 17.5 keV 8.3 cm 10.5 cm World eIoni - 4 -25.1 mum -14.4 cm 2.06 cm 1.49 GeV 9.78 keV 4.32 cm 14.9 cm World eIoni - 5 -27.8 mum -20 cm 2.22 cm 2.05 GeV 11.9 keV 5.63 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -627 mum 2.49 mm 56.3 MeV 240 eV 2.59 mm 2.59 mm World eIoni + 2 -10.6 mum -1.78 cm 1.11 cm 228 MeV 4.52 keV 1.97 cm 2.23 cm World eIoni + 3 -23.7 mum -10 cm 1.88 cm 1.05 GeV 17.5 keV 8.3 cm 10.5 cm World eIoni + 4 -25.1 mum -14.4 cm 2.06 cm 1.49 GeV 9.78 keV 4.32 cm 14.8 cm World eIoni + 5 -27.8 mum -20 cm 2.22 cm 2.05 GeV 12 keV 5.65 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 @@ -399,7 +433,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -23.6 mum -10.1 cm 1.89 cm 2.4 keV 0 eV 0 fm 0 fm World initStep + 0 -23.7 mum -10 cm 1.88 cm 2.4 keV 0 eV 0 fm 0 fm World initStep 1 -34.6 mum -10.1 cm 1.88 cm 2.26 MeV 2.4 keV 208 mum 208 mum World eIoni ********************************************************************************************************* @@ -407,16 +441,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -10.6 mum -1.8 cm 1.11 cm 2.84 keV 0 eV 0 fm 0 fm World initStep - 1 -4.41 mum -1.83 cm 1.11 cm 2.97 MeV 2.84 keV 275 mum 275 mum World eIoni + 0 -10.6 mum -1.78 cm 1.11 cm 2.84 keV 0 eV 0 fm 0 fm World initStep + 1 -4.39 mum -1.81 cm 1.11 cm 2.97 MeV 2.84 keV 275 mum 275 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -637 mum 2.51 mm 4.99 keV 0 eV 0 fm 0 fm World initStep - 1 25.6 mum -1.34 mm 2.52 mm 7.63 MeV 4.99 keV 717 mum 717 mum World eIoni + 0 0 fm -627 mum 2.49 mm 4.99 keV 0 eV 0 fm 0 fm World initStep + 1 25.6 mum -1.33 mm 2.5 mm 7.63 MeV 4.99 keV 717 mum 717 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -424,25 +458,25 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.38 cm 1.67 cm 688 MeV 12.2 keV 6.87 cm 6.87 cm World eIoni - 2 -893 nm -7.67 cm 1.76 cm 817 MeV 2.51 keV 1.29 cm 8.16 cm World eIoni - 3 -4.85 mum -20 cm 2.22 cm 2.05 GeV 25.3 keV 12.3 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -6.33 cm 1.67 cm 683 MeV 12.1 keV 6.82 cm 6.82 cm World eIoni + 2 -900 nm -7.61 cm 1.75 cm 811 MeV 2.51 keV 1.29 cm 8.1 cm World eIoni + 3 -4.89 mum -20 cm 2.22 cm 2.05 GeV 25.5 keV 12.4 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -893 nm -7.67 cm 1.76 cm 1.41 keV 0 eV 0 fm 0 fm World initStep - 1 -2.53 mum -7.68 cm 1.76 cm 1.03 MeV 1.41 keV 93.5 mum 93.5 mum World eIoni + 0 -900 nm -7.61 cm 1.75 cm 1.41 keV 0 eV 0 fm 0 fm World initStep + 1 -2.54 mum -7.62 cm 1.75 cm 1.03 MeV 1.41 keV 93.5 mum 93.5 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.38 cm 1.67 cm 2.67 keV 0 eV 0 fm 0 fm World initStep - 1 14 mum -6.41 cm 1.67 cm 2.69 MeV 2.67 keV 248 mum 248 mum World eIoni + 0 0 fm -6.33 cm 1.67 cm 2.67 keV 0 eV 0 fm 0 fm World initStep + 1 14 mum -6.35 cm 1.66 cm 2.69 MeV 2.67 keV 248 mum 248 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -450,34 +484,34 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -7.38 mm 7.83 mm 124 MeV 1.49 keV 1.14 cm 1.14 cm World eIoni - 2 -11.9 mum -9.83 cm 1.87 cm 1.03 GeV 18.3 keV 9.19 cm 10.3 cm World eIoni - 3 -17.2 mum -15.6 cm 2.1 cm 1.61 GeV 11.2 keV 5.77 cm 16.1 cm World eIoni - 4 -18.4 mum -20 cm 2.22 cm 2.05 GeV 8.16 keV 4.41 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -7.29 mm 7.79 mm 123 MeV 1.48 keV 1.13 cm 1.13 cm World eIoni + 2 -11.9 mum -9.81 cm 1.87 cm 1.03 GeV 18.2 keV 9.17 cm 10.3 cm World eIoni + 3 -17.3 mum -15.6 cm 2.1 cm 1.61 GeV 11.2 keV 5.77 cm 16.1 cm World eIoni + 4 -18.5 mum -20 cm 2.22 cm 2.05 GeV 8.19 keV 4.43 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -17.2 mum -15.6 cm 2.1 cm 5.28 keV 0 eV 0 fm 0 fm World initStep - 1 -47.3 mum -15.7 cm 2.1 cm 8.49 MeV 5.28 keV 797 mum 797 mum World eIoni + 0 -17.3 mum -15.6 cm 2.1 cm 5.28 keV 0 eV 0 fm 0 fm World initStep + 1 -47.4 mum -15.7 cm 2.1 cm 8.49 MeV 5.28 keV 797 mum 797 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -11.9 mum -9.83 cm 1.87 cm 4.55 keV 0 eV 0 fm 0 fm World initStep - 1 13.3 mum -9.89 cm 1.87 cm 6.56 MeV 4.55 keV 614 mum 614 mum World eIoni + 0 -11.9 mum -9.81 cm 1.87 cm 4.55 keV 0 eV 0 fm 0 fm World initStep + 1 13.3 mum -9.87 cm 1.87 cm 6.56 MeV 4.55 keV 614 mum 614 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -7.38 mm 7.83 mm 4.94 keV 0 eV 0 fm 0 fm World initStep - 1 22.2 mum -8.07 mm 7.84 mm 7.5 MeV 4.94 keV 704 mum 704 mum World eIoni + 0 0 fm -7.29 mm 7.79 mm 4.94 keV 0 eV 0 fm 0 fm World initStep + 1 22.2 mum -7.98 mm 7.81 mm 7.5 MeV 4.94 keV 704 mum 704 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -485,26 +519,25 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -10.6 cm 1.91 cm 1.11 GeV 21.4 keV 11.1 cm 11.1 cm World eIoni - 2 393 nm -17.1 cm 2.14 cm 1.76 GeV 14 keV 6.5 cm 17.6 cm World eIoni - 3 -371 nm -20 cm 2.22 cm 2.05 GeV 5.99 keV 2.92 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -10.5 cm 1.91 cm 1.1 GeV 21.3 keV 11 cm 11 cm World eIoni + 2 395 nm -17 cm 2.14 cm 1.75 GeV 14 keV 6.5 cm 17.5 cm World eIoni + 3 -394 nm -20 cm 2.22 cm 2.05 GeV 6.53 keV 3.01 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 393 nm -17.1 cm 2.14 cm 4.82 keV 0 eV 0 fm 0 fm World initStep - 1 20.5 mum -17.1 cm 2.14 cm 5.31 MeV 2.32 keV 500 mum 500 mum World eIoni - 2 42.7 mum -20 cm 2.14 cm 292 MeV 3.87 keV 2.87 cm 2.92 cm OutOfWorldTransportation + 0 395 nm -17 cm 2.14 cm 4.82 keV 0 eV 0 fm 0 fm World initStep + 1 23.4 mum -17.1 cm 2.14 cm 7.23 MeV 4.82 keV 678 mum 678 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -10.6 cm 1.91 cm 1.32 keV 0 eV 0 fm 0 fm World initStep - 1 -1.48 mum -10.6 cm 1.91 cm 934 keV 1.32 keV 85.1 mum 85.1 mum World eIoni + 0 0 fm -10.5 cm 1.91 cm 1.32 keV 0 eV 0 fm 0 fm World initStep + 1 -1.48 mum -10.5 cm 1.91 cm 934 keV 1.32 keV 85.1 mum 85.1 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -512,271 +545,44 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.26 mm 3.49 mm 62.6 MeV 738 eV 3.78 mm 3.78 mm World eIoni - 2 6.46 mum -6 cm 1.64 cm 650 MeV 11.4 keV 6.1 cm 6.48 cm World eIoni - 3 6.33 mum -14.7 cm 2.07 cm 1.52 GeV 18.2 keV 8.71 cm 15.2 cm World eIoni - 4 5.09 mum -20 cm 2.22 cm 2.05 GeV 10.1 keV 5.31 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 6.33 mum -14.7 cm 2.07 cm 2.27 keV 0 eV 0 fm 0 fm World initStep - 1 16 mum -14.7 cm 2.07 cm 2.08 MeV 2.27 keV 191 mum 191 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 6.46 mum -6 cm 1.64 cm 1.39 keV 0 eV 0 fm 0 fm World initStep - 1 11.3 mum -6.01 cm 1.64 cm 1 MeV 1.39 keV 91.4 mum 91.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.26 mm 3.49 mm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 -4.03 mum -1.33 mm 3.49 mm 812 keV 1.21 keV 74.7 mum 74.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.14 cm 1.65 cm 664 MeV 13.1 keV 6.62 cm 6.62 cm World eIoni - 2 7.15 mum -20 cm 2.22 cm 2.05 GeV 29.9 keV 13.9 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.14 cm 1.65 cm 5.07 keV 0 eV 0 fm 0 fm World initStep - 1 -25.9 mum -6.21 cm 1.65 cm 7.87 MeV 5.07 keV 739 mum 739 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.03 cm 1.16 cm 253 MeV 5.91 keV 2.49 cm 2.49 cm World eIoni - 2 -3.34 mum -6.58 cm 1.68 cm 708 MeV 10.7 keV 4.58 cm 7.07 cm World eIoni - 3 -8.91 mum -15.7 cm 2.1 cm 1.62 GeV 19 keV 9.11 cm 16.2 cm World eIoni - 4 -11 mum -20 cm 2.22 cm 2.05 GeV 8.28 keV 4.32 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -8.91 mum -15.7 cm 2.1 cm 2.71 keV 0 eV 0 fm 0 fm World initStep - 1 -2.99 mum -15.7 cm 2.1 cm 2.75 MeV 2.71 keV 254 mum 254 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.34 mum -6.58 cm 1.68 cm 2.79 keV 0 eV 0 fm 0 fm World initStep - 1 6.33 mum -6.6 cm 1.68 cm 2.89 MeV 2.79 keV 267 mum 267 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.03 cm 1.16 cm 1.24 keV 0 eV 0 fm 0 fm World initStep - 1 5.35 mum -2.04 cm 1.16 cm 846 keV 1.24 keV 77.2 mum 77.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.25 cm 1.36 cm 375 MeV 7.15 keV 3.72 cm 3.72 cm World eIoni - 2 4.12 mum -18.5 cm 2.18 cm 1.9 GeV 32.1 keV 15.3 cm 19 cm World eIoni - 3 4.49 mum -20 cm 2.22 cm 2.05 GeV 4.18 keV 1.49 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.12 mum -18.5 cm 2.18 cm 1.17 keV 0 eV 0 fm 0 fm World initStep - 1 295 nm -18.5 cm 2.18 cm 787 keV 1.17 keV 71.6 mum 71.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.25 cm 1.36 cm 1.22 keV 0 eV 0 fm 0 fm World initStep - 1 -4.22 mum -3.26 cm 1.36 cm 838 keV 1.22 keV 75.9 mum 75.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.74 mm 4.09 mm 67.4 MeV 840 eV 4.55 mm 4.55 mm World eIoni - 2 -7.17 mum -6.62 cm 1.69 cm 712 MeV 12.3 keV 6.66 cm 7.11 cm World eIoni - 3 -12 mum -20 cm 2.22 cm 2.05 GeV 27.9 keV 13.4 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -7.17 mum -6.62 cm 1.69 cm 1.59 keV 0 eV 0 fm 0 fm World initStep - 1 -3.77 mum -6.64 cm 1.69 cm 1.21 MeV 1.59 keV 110 mum 110 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.74 mm 4.09 mm 1.11 keV 0 eV 0 fm 0 fm World initStep - 1 4.62 mum -1.81 mm 4.09 mm 759 keV 1.11 keV 67 mum 67 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.65 cm 1.41 cm 415 MeV 9.05 keV 4.12 cm 4.12 cm World eIoni - 2 -2.38 mum -8.84 cm 1.82 cm 934 MeV 11.1 keV 5.2 cm 9.33 cm World eIoni - 3 8.21 mum -20 cm 2.22 cm 2.05 GeV 23.7 keV 11.2 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.38 mum -8.84 cm 1.82 cm 26.4 keV 0 eV 0 fm 0 fm World initStep - 1 -152 mum -9.4 cm 1.82 cm 58.8 MeV 4.47 keV 5.69 mm 5.69 mm World eIoni - 2 -200 mum -19.3 cm 1.82 cm 1.05 GeV 19.6 keV 9.92 cm 10.5 cm World eIoni - 3 -200 mum -20 cm 1.82 cm 1.12 GeV 1.07 keV 6.78 mm 11.2 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -200 mum -19.3 cm 1.82 cm 1.22 keV 0 eV 0 fm 0 fm World initStep - 1 -205 mum -19.3 cm 1.82 cm 832 keV 1.22 keV 75.7 mum 75.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.65 cm 1.41 cm 3.6 keV 0 eV 0 fm 0 fm World initStep - 1 9.23 mum -3.69 cm 1.41 cm 4.04 MeV 2.39 keV 376 mum 376 mum World eIoni - 2 20.4 mum -5.53 cm 1.42 cm 189 MeV 3.18 keV 1.85 cm 1.89 cm World eIoni - 3 34.7 mum -19.3 cm 1.42 cm 1.56 GeV 28.2 keV 13.7 cm 15.6 cm World eIoni - 4 34.9 mum -20 cm 1.42 cm 1.64 GeV 1.25 keV 7.44 mm 16.4 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 34.7 mum -19.3 cm 1.42 cm 2.51 keV 0 eV 0 fm 0 fm World initStep - 1 41.3 mum -19.3 cm 1.42 cm 2.42 MeV 2.51 keV 223 mum 223 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 20.4 mum -5.53 cm 1.42 cm 1.73 keV 0 eV 0 fm 0 fm World initStep - 1 12.8 mum -5.55 cm 1.42 cm 1.38 MeV 1.73 keV 126 mum 126 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -14.1 cm 2.05 cm 1.46 GeV 28.3 keV 14.6 cm 14.6 cm World eIoni - 2 -3.05 mum -20 cm 2.22 cm 2.05 GeV 12.6 keV 5.94 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -14.1 cm 2.05 cm 9.5 keV 0 eV 0 fm 0 fm World initStep - 1 59.9 mum -14.3 cm 2.05 cm 24.1 MeV 9.5 keV 2.29 mm 2.29 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -10.6 cm 1.91 cm 1.11 GeV 21.1 keV 11 cm 11 cm World eIoni - 2 -2.17 mum -20 cm 2.22 cm 2.05 GeV 20.5 keV 9.45 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -10.6 cm 1.91 cm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 5.78 mum -10.6 cm 1.91 cm 821 keV 1.21 keV 74.7 mum 74.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -37.7 mum 616 mum 50.4 MeV 37.6 eV 618 mum 618 mum World eIoni - 2 -2.86 mum -11.7 cm 1.96 cm 1.22 GeV 23.4 keV 12.1 cm 12.2 cm World eIoni - 3 -2.84 mum -11.8 cm 1.96 cm 1.23 GeV 142 eV 1.11 mm 12.3 cm World eIoni - 4 -3.88 mum -17.3 cm 2.15 cm 1.78 GeV 11.6 keV 5.49 cm 17.8 cm World eIoni - 5 -4.02 mum -20 cm 2.22 cm 2.05 GeV 6.74 keV 2.69 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -5.38 cm 1.59 cm 588 MeV 11.8 keV 5.86 cm 5.86 cm World eIoni + 2 -1.47 mum -15.2 cm 2.08 cm 1.57 GeV 20 keV 9.81 cm 15.7 cm World eIoni + 3 -1.65 mum -16.9 cm 2.14 cm 1.74 GeV 3.24 keV 1.77 cm 17.4 cm World eIoni + 4 -1.38 mum -19.9 cm 2.22 cm 2.04 GeV 5.77 keV 2.92 cm 20.4 cm World eIoni + 5 -1.4 mum -20 cm 2.22 cm 2.05 GeV 481 eV 1.4 mm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.88 mum -17.3 cm 2.15 cm 1.52 keV 0 eV 0 fm 0 fm World initStep - 1 -7.38 mum -17.3 cm 2.15 cm 1.14 MeV 1.52 keV 104 mum 104 mum World eIoni + 0 -1.38 mum -19.9 cm 2.22 cm 2.27 keV 0 eV 0 fm 0 fm World initStep + 1 8.28 mum -19.9 cm 2.22 cm 2.08 MeV 2.27 keV 191 mum 191 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.84 mum -11.8 cm 1.96 cm 2.04 keV 0 eV 0 fm 0 fm World initStep - 1 7.43 mum -11.8 cm 1.96 cm 1.76 MeV 2.04 keV 161 mum 161 mum World eIoni + 0 -1.65 mum -16.9 cm 2.14 cm 1.16 keV 0 eV 0 fm 0 fm World initStep + 1 -7.14 mum -17 cm 2.14 cm 775 keV 1.16 keV 70.5 mum 70.5 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.86 mum -11.7 cm 1.96 cm 1.12 keV 0 eV 0 fm 0 fm World initStep - 1 -6.76 mum -11.7 cm 1.96 cm 745 keV 1.12 keV 67.9 mum 67.9 mum World eIoni + 0 -1.47 mum -15.2 cm 2.08 cm 5.17 keV 0 eV 0 fm 0 fm World initStep + 1 -975 nm -15.2 cm 2.08 cm 2.49 MeV 1.09 keV 238 mum 238 mum World eIoni + 2 33.6 nm -20 cm 2.08 cm 482 MeV 8.14 keV 4.8 cm 4.82 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -37.7 mum 616 mum 1.08 keV 0 eV 0 fm 0 fm World initStep - 1 1.58 mum -99.5 mum 617 mum 991 keV 1.08 keV 64.1 mum 64.1 mum World eIoni + 0 0 fm -5.38 cm 1.59 cm 1.41 keV 0 eV 0 fm 0 fm World initStep + 1 2.73 mum -5.39 cm 1.59 cm 1.03 MeV 1.41 keV 93.6 mum 93.6 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -784,34 +590,35 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.49 cm 1.6 cm 599 MeV 11.8 keV 5.97 cm 5.97 cm World eIoni - 2 3.02 mum -11 cm 1.93 cm 1.15 GeV 12.2 keV 5.49 cm 11.5 cm World eIoni - 3 3.46 mum -14.4 cm 2.06 cm 1.49 GeV 6.59 keV 3.4 cm 14.9 cm World eIoni - 4 2.95 mum -20 cm 2.22 cm 2.05 GeV 11.8 keV 5.63 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -3.78 cm 1.43 cm 428 MeV 8.68 keV 4.26 cm 4.26 cm World eIoni + 2 -288 nm -12.1 cm 1.97 cm 1.26 GeV 17.4 keV 8.32 cm 12.6 cm World eIoni + 3 1.04 mum -13.7 cm 2.03 cm 1.42 GeV 4.45 keV 1.59 cm 14.2 cm World eIoni + 4 6.4 mum -20 cm 2.22 cm 2.05 GeV 14 keV 6.33 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 3.46 mum -14.4 cm 2.06 cm 1.47 keV 0 eV 0 fm 0 fm World initStep - 1 9.49 mum -14.4 cm 2.06 cm 1.08 MeV 1.47 keV 98.7 mum 98.7 mum World eIoni + 0 1.04 mum -13.7 cm 2.03 cm 1.48 keV 0 eV 0 fm 0 fm World initStep + 1 -5.11 mum -13.7 cm 2.03 cm 1.09 MeV 1.48 keV 99.6 mum 99.6 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 3.02 mum -11 cm 1.93 cm 1.96 keV 0 eV 0 fm 0 fm World initStep - 1 9.54 mum -11 cm 1.93 cm 1.65 MeV 1.96 keV 151 mum 151 mum World eIoni + 0 -288 nm -12.1 cm 1.97 cm 27.5 keV 0 eV 0 fm 0 fm World initStep + 1 -77.2 mum -12.4 cm 1.98 cm 33.9 MeV 2.03 keV 3.29 mm 3.29 mm World eIoni + 2 -114 mum -20 cm 1.99 cm 793 MeV 14.3 keV 7.59 cm 7.92 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.49 cm 1.6 cm 2.7 keV 0 eV 0 fm 0 fm World initStep - 1 -12.6 mum -5.51 cm 1.6 cm 2.74 MeV 2.7 keV 253 mum 253 mum World eIoni + 0 0 fm -3.78 cm 1.43 cm 1.43 keV 0 eV 0 fm 0 fm World initStep + 1 492 nm -3.79 cm 1.43 cm 1.05 MeV 1.43 keV 95.4 mum 95.4 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -819,394 +626,35 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.2 cm 1.57 cm 570 MeV 10.6 keV 5.68 cm 5.68 cm World eIoni - 2 -2.56 mum -9 cm 1.83 cm 950 MeV 6.6 keV 3.81 cm 9.49 cm World eIoni - 3 2.24 mum -19.3 cm 2.2 cm 1.98 GeV 22 keV 10.3 cm 19.8 cm World eIoni - 4 2.58 mum -20 cm 2.22 cm 2.05 GeV 2.82 keV 6.9 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.24 mum -19.3 cm 2.2 cm 1.86 keV 0 eV 0 fm 0 fm World initStep - 1 -5.04 mum -19.3 cm 2.2 cm 1.53 MeV 1.86 keV 140 mum 140 mum World eIoni + 1 0 fm -94.6 mum 976 mum 50.9 MeV 220 eV 982 mum 982 mum World eIoni + 2 -93.7 mum -17.8 cm 2.16 cm 1.83 GeV 35.6 keV 18.2 cm 18.3 cm World eIoni + 3 -96 mum -20 cm 2.22 cm 2.05 GeV 5.61 keV 2.15 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.56 mum -9 cm 1.83 cm 13.2 keV 0 eV 0 fm 0 fm World initStep - 1 -108 mum -9.41 cm 1.83 cm 43.7 MeV 13.2 keV 4.16 mm 4.16 mm World eIoni + 0 -93.7 mum -17.8 cm 2.16 cm 1.22 keV 0 eV 0 fm 0 fm World initStep + 1 -97.9 mum -17.9 cm 2.16 cm 835 keV 1.22 keV 75.9 mum 75.9 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.2 cm 1.57 cm 4.87 keV 0 eV 0 fm 0 fm World initStep - 1 19.9 mum -5.26 cm 1.57 cm 7.35 MeV 4.87 keV 689 mum 689 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 40.8 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.91 cm 1.71 cm 741 MeV 14.4 keV 7.39 cm 7.39 cm World eIoni - 2 -200 nm -7.47 cm 1.74 cm 797 MeV 1.13 keV 5.7 mm 7.96 cm World eIoni - 3 -595 nm -11.5 cm 1.95 cm 1.2 GeV 10.2 keV 4.03 cm 12 cm World eIoni - 4 537 nm -13.4 cm 2.02 cm 1.39 GeV 4.19 keV 1.9 cm 13.9 cm World eIoni - 5 4.48 mum -18.3 cm 2.18 cm 1.88 GeV 10.1 keV 4.93 cm 18.8 cm World eIoni - 6 6.39 mum -20 cm 2.22 cm 2.05 GeV 4.12 keV 1.68 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.48 mum -18.3 cm 2.18 cm 9.21 keV 0 eV 0 fm 0 fm World initStep - 1 -56.9 mum -18.5 cm 2.18 cm 22.9 MeV 9.21 keV 2.17 mm 2.17 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 537 nm -13.4 cm 2.02 cm 2.82 keV 0 eV 0 fm 0 fm World initStep - 1 -14.1 mum -13.4 cm 2.02 cm 2.93 MeV 2.82 keV 271 mum 271 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -595 nm -11.5 cm 1.95 cm 22.5 keV 0 eV 0 fm 0 fm World initStep - 1 -87.2 mum -12.6 cm 1.94 cm 113 MeV 22.5 keV 1.11 cm 1.11 cm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -200 nm -7.47 cm 1.74 cm 1.81 keV 0 eV 0 fm 0 fm World initStep - 1 -3.83 mum -7.49 cm 1.74 cm 1.47 MeV 1.81 keV 134 mum 134 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.91 cm 1.71 cm 1.25 keV 0 eV 0 fm 0 fm World initStep - 1 4.51 mum -6.91 cm 1.71 cm 858 keV 1.25 keV 78.2 mum 78.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.7 cm 1.09 cm 220 MeV 4.77 keV 2.15 cm 2.15 cm World eIoni - 2 4.87 mum -7.81 cm 1.76 cm 831 MeV 13.5 keV 6.15 cm 8.3 cm World eIoni - 3 5.23 mum -10.1 cm 1.89 cm 1.06 GeV 5.79 keV 2.33 cm 10.6 cm World eIoni - 4 6.59 mum -14 cm 2.04 cm 1.45 GeV 6.69 keV 3.84 cm 14.5 cm World eIoni - 5 8.65 mum -20 cm 2.22 cm 2.05 GeV 13.2 keV 6.03 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 6.59 mum -14 cm 2.04 cm 1.05 keV 0 eV 0 fm 0 fm World initStep - 1 4.32 mum -14 cm 2.04 cm 679 keV 1.05 keV 61.8 mum 61.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 5.23 mum -10.1 cm 1.89 cm 11 keV 0 eV 0 fm 0 fm World initStep - 1 -16.5 mum -10.4 cm 1.88 cm 30.1 MeV 5.87 keV 2.86 mm 2.86 mm World eIoni - 2 -26.8 mum -20 cm 1.88 cm 988 MeV 17.9 keV 9.58 cm 9.87 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.87 mum -7.81 cm 1.76 cm 1.03 keV 0 eV 0 fm 0 fm World initStep - 1 8.1 mum -7.81 cm 1.76 cm 667 keV 1.03 keV 60.6 mum 60.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.7 cm 1.09 cm 1.33 keV 0 eV 0 fm 0 fm World initStep - 1 -6.37 mum -1.71 cm 1.09 cm 946 keV 1.33 keV 85.9 mum 85.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -10.5 cm 1.91 cm 1.1 GeV 20.4 keV 11 cm 11 cm World eIoni - 2 -1.3 mum -16.9 cm 2.14 cm 1.74 GeV 13.5 keV 6.4 cm 17.4 cm World eIoni - 3 -1.34 mum -20 cm 2.22 cm 2.05 GeV 7.58 keV 3.11 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.3 mum -16.9 cm 2.14 cm 1.02 keV 0 eV 0 fm 0 fm World initStep - 1 -5.21 mum -16.9 cm 2.14 cm 656 keV 1.02 keV 59.7 mum 59.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -10.5 cm 1.91 cm 1.1 keV 0 eV 0 fm 0 fm World initStep - 1 4.43 mum -10.5 cm 1.91 cm 725 keV 1.1 keV 65.9 mum 65.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -12.4 cm 1.99 cm 1.29 GeV 24.4 keV 12.9 cm 12.9 cm World eIoni - 2 -936 nm -17.8 cm 2.16 cm 1.83 GeV 11.9 keV 5.39 cm 18.3 cm World eIoni - 3 -1.31 mum -20 cm 2.22 cm 2.05 GeV 6.49 keV 2.24 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -936 nm -17.8 cm 2.16 cm 1.03 keV 0 eV 0 fm 0 fm World initStep - 1 -81.9 nm -17.8 cm 2.16 cm 662 keV 1.03 keV 60.1 mum 60.1 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -12.4 cm 1.99 cm 1.3 keV 0 eV 0 fm 0 fm World initStep - 1 4.59 mum -12.4 cm 1.99 cm 907 keV 1.3 keV 82.6 mum 82.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -18.2 cm 2.17 cm 1.87 GeV 35.5 keV 18.7 cm 18.7 cm World eIoni - 2 207 nm -20 cm 2.22 cm 2.05 GeV 3.99 keV 1.8 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -18.2 cm 2.17 cm 1.48 keV 0 eV 0 fm 0 fm World initStep - 1 -4.18 mum -18.2 cm 2.17 cm 1.1 MeV 1.48 keV 100 mum 100 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 38.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -17.7 cm 2.16 cm 1.82 GeV 33.8 keV 18.2 cm 18.2 cm World eIoni - 2 -178 nm -19.2 cm 2.2 cm 1.97 GeV 2.9 keV 1.54 cm 19.7 cm World eIoni - 3 -310 nm -20 cm 2.22 cm 2.05 GeV 3.46 keV 7.81 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -178 nm -19.2 cm 2.2 cm 6.51 keV 0 eV 0 fm 0 fm World initStep - 1 5.87 mum -19.3 cm 2.21 cm 12.3 MeV 6.51 keV 1.16 mm 1.16 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -17.7 cm 2.16 cm 1.59 keV 0 eV 0 fm 0 fm World initStep - 1 4.24 mum -17.7 cm 2.16 cm 1.21 MeV 1.59 keV 110 mum 110 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -7.91 cm 1.77 cm 841 MeV 17 keV 8.4 cm 8.4 cm World eIoni - 2 1.03 mum -9.71 cm 1.87 cm 1.02 GeV 4.6 keV 1.8 cm 10.2 cm World eIoni - 3 1.11 mum -9.96 cm 1.88 cm 1.05 GeV 144 eV 2.53 mm 10.5 cm World eIoni - 4 1.11 mum -10.4 cm 1.9 cm 1.09 GeV 1.06 keV 3.91 mm 10.8 cm World eIoni - 5 2.55 mum -19 cm 2.2 cm 1.95 GeV 18.2 keV 8.69 cm 19.5 cm World eIoni - 6 2.44 mum -20 cm 2.22 cm 2.05 GeV 1.35 keV 9.66 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.55 mum -19 cm 2.2 cm 2.47 keV 0 eV 0 fm 0 fm World initStep - 1 14.7 mum -19.1 cm 2.2 cm 2.37 MeV 2.47 keV 218 mum 218 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.11 mum -10.4 cm 1.9 cm 1.17 keV 0 eV 0 fm 0 fm World initStep - 1 -2.57 mum -10.4 cm 1.9 cm 791 keV 1.17 keV 71.8 mum 71.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.11 mum -9.96 cm 1.88 cm 1.03 keV 0 eV 0 fm 0 fm World initStep - 1 5.92 mum -9.97 cm 1.88 cm 664 keV 1.03 keV 60.4 mum 60.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.03 mum -9.71 cm 1.87 cm 2.09 keV 0 eV 0 fm 0 fm World initStep - 1 5.44 mum -9.72 cm 1.87 cm 1.82 MeV 2.09 keV 167 mum 167 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -7.91 cm 1.77 cm 2.76 keV 0 eV 0 fm 0 fm World initStep - 1 -14.5 mum -7.94 cm 1.77 cm 2.83 MeV 2.76 keV 262 mum 262 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -14.5 cm 2.06 cm 1.5 GeV 29.1 keV 15 cm 15 cm World eIoni - 2 -1.18 mum -20 cm 2.22 cm 2.05 GeV 11.7 keV 5.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -14.5 cm 2.06 cm 1.53 keV 0 eV 0 fm 0 fm World initStep - 1 7.2 mum -14.5 cm 2.06 cm 1.15 MeV 1.53 keV 105 mum 105 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 41.3 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -7.06 cm 1.72 cm 756 MeV 13.7 keV 7.55 cm 7.55 cm World eIoni - 2 6.78 mum -20 cm 2.22 cm 2.05 GeV 28.2 keV 12.9 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -7.06 cm 1.72 cm 4.92 keV 0 eV 0 fm 0 fm World initStep - 1 -18.8 mum -7.09 cm 1.72 cm 3.1 MeV 1.12 keV 295 mum 295 mum World eIoni - 2 -49.1 mum -9.92 cm 1.72 cm 286 MeV 3.27 keV 2.83 cm 2.86 cm World eIoni - 3 -50.3 mum -10.8 cm 1.72 cm 370 MeV 3.05 keV 8.38 mm 3.7 cm World eIoni - 4 -46.9 mum -12.8 cm 1.72 cm 572 MeV 4.01 keV 2.02 cm 5.72 cm World eIoni - 5 -43.1 mum -19.6 cm 1.72 cm 1.25 GeV 13.9 keV 6.8 cm 12.5 cm World eIoni - 6 -42.8 mum -20 cm 1.72 cm 1.29 GeV 1.57 keV 4.24 mm 12.9 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -43.1 mum -19.6 cm 1.72 cm 5.54 keV 0 eV 0 fm 0 fm World initStep - 1 -69 mum -19.7 cm 1.71 cm 9.25 MeV 5.54 keV 870 mum 870 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -46.9 mum -12.8 cm 1.72 cm 2.38 keV 0 eV 0 fm 0 fm World initStep - 1 -38.9 mum -12.8 cm 1.71 cm 2.24 MeV 2.38 keV 206 mum 206 mum World eIoni + 0 0 fm -94.6 mum 976 mum 70.8 keV 0 eV 0 fm 0 fm World initStep + 1 180 mum -1.97 cm 1.05 mm 198 MeV 8.81 keV 1.98 cm 1.98 cm World eIoni + 2 224 mum -13 cm 1.07 mm 1.3 GeV 22.4 keV 11.1 cm 13 cm World eIoni + 3 233 mum -20 cm 1.08 mm 2 GeV 14.5 keV 6.96 cm 20 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -50.3 mum -10.8 cm 1.72 cm 15.9 keV 0 eV 0 fm 0 fm World initStep - 1 -144 mum -11.1 cm 1.72 cm 33.7 MeV 6.9 keV 3.22 mm 3.22 mm World eIoni - 2 -173 mum -14.1 cm 1.72 cm 333 MeV 5.58 keV 3 cm 3.32 cm World eIoni - 3 -181 mum -15.6 cm 1.72 cm 482 MeV 3.31 keV 1.49 cm 4.8 cm World eIoni - 4 -193 mum -20 cm 1.72 cm 926 MeV 12.3 keV 4.44 cm 9.24 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -181 mum -15.6 cm 1.72 cm 3.26 keV 0 eV 0 fm 0 fm World initStep - 1 -190 mum -15.6 cm 1.72 cm 3.71 MeV 3.26 keV 345 mum 345 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -173 mum -14.1 cm 1.72 cm 9.27 keV 0 eV 0 fm 0 fm World initStep - 1 -114 mum -14.3 cm 1.72 cm 23.1 MeV 9.27 keV 2.19 mm 2.19 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -49.1 mum -9.92 cm 1.72 cm 1.27 keV 0 eV 0 fm 0 fm World initStep - 1 -52.7 mum -9.93 cm 1.71 cm 883 keV 1.27 keV 80.4 mum 80.4 mum World eIoni + 0 224 mum -13 cm 1.07 mm 1.59 keV 0 eV 0 fm 0 fm World initStep + 1 227 mum -13 cm 1.06 mm 1.21 MeV 1.59 keV 110 mum 110 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1214,43 +662,35 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.51 cm 1.6 cm 601 MeV 11.1 keV 6 cm 6 cm World eIoni - 2 4.79 mum -13.4 cm 2.02 cm 1.39 GeV 16.6 keV 7.89 cm 13.9 cm World eIoni - 3 5.15 mum -15.7 cm 2.1 cm 1.62 GeV 5.56 keV 2.34 cm 16.2 cm World eIoni - 4 4.93 mum -18.7 cm 2.19 cm 1.92 GeV 4.18 keV 2.93 cm 19.2 cm World eIoni - 5 5.13 mum -20 cm 2.22 cm 2.05 GeV 3.4 keV 1.34 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.93 mum -18.7 cm 2.19 cm 3.68 keV 0 eV 0 fm 0 fm World initStep - 1 -9.33 mum -18.7 cm 2.18 cm 4.56 MeV 3.68 keV 425 mum 425 mum World eIoni + 1 0 fm -1.28 mm 3.52 mm 62.8 MeV 1.51 keV 3.81 mm 3.81 mm World eIoni + 2 -2.66 mum -6.15 mm 7.24 mm 112 MeV 424 eV 6.19 mm 10 mm World eIoni + 3 -14.2 mum -5.71 cm 1.62 cm 621 MeV 10.7 keV 5.2 cm 6.2 cm World eIoni + 4 -2.44 mum -20 cm 2.22 cm 2.05 GeV 30.2 keV 14.3 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 5.15 mum -15.7 cm 2.1 cm 2.72 keV 0 eV 0 fm 0 fm World initStep - 1 15 mum -15.8 cm 2.1 cm 2.77 MeV 2.72 keV 256 mum 256 mum World eIoni + 0 -14.2 mum -5.71 cm 1.62 cm 26.4 keV 0 eV 0 fm 0 fm World initStep + 1 -98.6 mum -5.9 cm 1.62 cm 20.2 MeV 1.39 keV 1.97 mm 1.97 mm World eIoni + 2 -168 mum -20 cm 1.62 cm 1.43 GeV 25.6 keV 14.1 cm 14.3 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.79 mum -13.4 cm 2.02 cm 1.16 keV 0 eV 0 fm 0 fm World initStep - 1 10.3 mum -13.4 cm 2.02 cm 776 keV 1.16 keV 70.5 mum 70.5 mum World eIoni + 0 -2.66 mum -6.15 mm 7.24 mm 3.6 keV 0 eV 0 fm 0 fm World initStep + 1 7.05 mum -6.55 mm 7.26 mm 4.4 MeV 3.6 keV 409 mum 409 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.51 cm 1.6 cm 5.07 keV 0 eV 0 fm 0 fm World initStep - 1 -23.4 mum -5.59 cm 1.6 cm 7.86 MeV 5.07 keV 738 mum 738 mum World eIoni + 0 0 fm -1.28 mm 3.52 mm 1.48 keV 0 eV 0 fm 0 fm World initStep + 1 6.9 mum -1.37 mm 3.52 mm 1.11 MeV 1.48 keV 99.9 mum 99.9 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1258,93 +698,34 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.39 cm 1.38 cm 389 MeV 8.14 keV 3.86 cm 3.86 cm World eIoni - 2 4.74 mum -20 cm 2.22 cm 2.05 GeV 33.9 keV 16.6 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -9.35 cm 1.85 cm 985 MeV 19.4 keV 9.84 cm 9.84 cm World eIoni + 2 68 nm -11.4 cm 1.95 cm 1.19 GeV 4.22 keV 2.09 cm 11.9 cm World eIoni + 3 -115 nm -14.5 cm 2.06 cm 1.5 GeV 6.75 keV 3.08 cm 15 cm World eIoni + 4 -1.9 mum -20 cm 2.22 cm 2.05 GeV 11.3 keV 5.49 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.39 cm 1.38 cm 1.18 keV 0 eV 0 fm 0 fm World initStep - 1 -4.6 mum -3.39 cm 1.38 cm 794 keV 1.18 keV 72.4 mum 72.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.16 cm 1.57 cm 566 MeV 10.9 keV 5.64 cm 5.64 cm World eIoni - 2 -3.51 mum -20 cm 2.22 cm 2.05 GeV 32.5 keV 14.9 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.16 cm 1.57 cm 7.41 keV 0 eV 0 fm 0 fm World initStep - 1 14.9 mum -5.3 cm 1.57 cm 15.5 MeV 7.41 keV 1.46 mm 1.46 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.81 cm 1.54 cm 531 MeV 10.7 keV 5.3 cm 5.3 cm World eIoni - 2 5.02 mum -20 cm 2.22 cm 2.05 GeV 33.1 keV 15.2 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.81 cm 1.54 cm 2.21 keV 0 eV 0 fm 0 fm World initStep - 1 -8.9 mum -4.83 cm 1.54 cm 1.99 MeV 2.21 keV 183 mum 183 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -18.3 cm 2.18 cm 1.88 GeV 37 keV 18.8 cm 18.8 cm World eIoni - 2 -270 nm -20 cm 2.22 cm 2.05 GeV 4.16 keV 1.69 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -18.3 cm 2.18 cm 2.37 keV 0 eV 0 fm 0 fm World initStep - 1 7.83 mum -18.3 cm 2.18 cm 2.22 MeV 2.37 keV 204 mum 204 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -15.1 cm 2.08 cm 1.56 GeV 31.2 keV 15.6 cm 15.6 cm World eIoni - 2 738 nm -17 cm 2.14 cm 1.75 GeV 5.53 keV 1.89 cm 17.5 cm World eIoni - 3 2.4 mum -20 cm 2.22 cm 2.05 GeV 6.15 keV 2.99 cm 20.5 cm OutOfWorldTransportation + 0 -115 nm -14.5 cm 2.06 cm 3.39 keV 0 eV 0 fm 0 fm World initStep + 1 15.3 mum -14.6 cm 2.06 cm 3.97 MeV 3.39 keV 369 mum 369 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 738 nm -17 cm 2.14 cm 2.05 keV 0 eV 0 fm 0 fm World initStep - 1 -8.58 mum -17 cm 2.14 cm 1.78 MeV 2.05 keV 163 mum 163 mum World eIoni + 0 68 nm -11.4 cm 1.95 cm 1.09 keV 0 eV 0 fm 0 fm World initStep + 1 1.85 mum -11.4 cm 1.95 cm 714 keV 1.09 keV 65 mum 65 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -15.1 cm 2.08 cm 4.47 keV 0 eV 0 fm 0 fm World initStep - 1 -24.2 mum -15.2 cm 2.08 cm 6.38 MeV 4.47 keV 597 mum 597 mum World eIoni + 0 0 fm -9.35 cm 1.85 cm 1.02 keV 0 eV 0 fm 0 fm World initStep + 1 -525 nm -9.36 cm 1.85 cm 654 keV 1.02 keV 59.6 mum 59.6 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1352,16 +733,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -16.4 cm 2.12 cm 1.69 GeV 31.1 keV 16.9 cm 16.9 cm World eIoni - 2 -2.73 mum -20 cm 2.22 cm 2.05 GeV 6.88 keV 3.65 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -4.42 cm 1.5 cm 492 MeV 9.16 keV 4.9 cm 4.9 cm World eIoni + 2 7.18 mum -20 cm 2.22 cm 2.05 GeV 32 keV 15.6 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -16.4 cm 2.12 cm 20.4 keV 0 eV 0 fm 0 fm World initStep - 1 142 mum -17.3 cm 2.12 cm 94 MeV 20.4 keV 9.18 mm 9.18 mm World eIoni + 0 0 fm -4.42 cm 1.5 cm 3.02 keV 0 eV 0 fm 0 fm World initStep + 1 -14.5 mum -4.45 cm 1.5 cm 3.27 MeV 3.02 keV 303 mum 303 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1369,26 +750,69 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -13.4 cm 2.02 cm 1.39 GeV 27.4 keV 13.8 cm 13.8 cm World eIoni - 2 81.4 nm -14 cm 2.05 cm 1.45 GeV 2.45 keV 6.92 mm 14.5 cm World eIoni - 3 549 nm -20 cm 2.22 cm 2.05 GeV 12.5 keV 5.96 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -1.21 cm 9.55 mm 171 MeV 3.74 keV 1.64 cm 1.64 cm World eIoni + 2 12.1 mum -20 cm 2.22 cm 2.05 GeV 37.8 keV 18.9 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -1.21 cm 9.55 mm 2.44 keV 0 eV 0 fm 0 fm World initStep + 1 -12.3 mum -1.23 cm 9.56 mm 2.32 MeV 2.44 keV 213 mum 213 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.33 cm 1.22 cm 283 MeV 6.61 keV 2.79 cm 2.79 cm World eIoni + 2 657 nm -3.26 cm 1.36 cm 376 MeV 1.27 keV 9.41 mm 3.73 cm World eIoni + 3 8.03 mum -7.53 cm 1.75 cm 803 MeV 10.1 keV 4.29 cm 8.02 cm World eIoni + 4 15.5 mum -13 cm 2.01 cm 1.35 GeV 12.2 keV 5.49 cm 13.5 cm World eIoni + 5 18 mum -16.4 cm 2.12 cm 1.69 GeV 6.59 keV 3.4 cm 16.9 cm World eIoni + 6 19.6 mum -20 cm 2.22 cm 2.05 GeV 6.37 keV 3.59 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 18 mum -16.4 cm 2.12 cm 1.47 keV 0 eV 0 fm 0 fm World initStep + 1 24.1 mum -16.4 cm 2.12 cm 1.08 MeV 1.47 keV 98.7 mum 98.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 15.5 mum -13 cm 2.01 cm 1.96 keV 0 eV 0 fm 0 fm World initStep + 1 22 mum -13 cm 2.01 cm 1.65 MeV 1.96 keV 151 mum 151 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 8.03 mum -7.53 cm 1.75 cm 2.7 keV 0 eV 0 fm 0 fm World initStep + 1 -4.56 mum -7.55 cm 1.75 cm 2.74 MeV 2.7 keV 253 mum 253 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 81.4 nm -14 cm 2.05 cm 1.15 keV 0 eV 0 fm 0 fm World initStep - 1 577 nm -14.1 cm 2.05 cm 767 keV 1.15 keV 69.6 mum 69.6 mum World eIoni + 0 657 nm -3.26 cm 1.36 cm 5.35 keV 0 eV 0 fm 0 fm World initStep + 1 -30.8 mum -3.34 cm 1.36 cm 8.69 MeV 5.35 keV 817 mum 817 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -13.4 cm 2.02 cm 9.97 keV 0 eV 0 fm 0 fm World initStep - 1 -6.39 mum -13.4 cm 2.02 cm 7.88 MeV 2.98 keV 759 mum 759 mum World eIoni - 2 -13.7 mum -20 cm 2.01 cm 665 MeV 10.7 keV 6.57 cm 6.65 cm OutOfWorldTransportation + 0 0 fm -2.33 cm 1.22 cm 1.83 keV 0 eV 0 fm 0 fm World initStep + 1 -4.81 mum -2.34 cm 1.22 cm 1.49 MeV 1.83 keV 137 mum 137 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1396,87 +820,60 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.9 cm 1.44 cm 440 MeV 9.1 keV 4.38 cm 4.38 cm World eIoni - 2 -4.4 mum -16.9 cm 2.14 cm 1.74 GeV 28.3 keV 13.1 cm 17.4 cm World eIoni - 3 -4.36 mum -20 cm 2.22 cm 2.05 GeV 3.27 keV 3.07 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -20 cm 2.22 cm 2.05 GeV 38.8 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.7 cm 1.28 cm 320 MeV 5.29 keV 3.16 cm 3.16 cm World eIoni + 2 16.6 mum -13 cm 2.01 cm 1.35 GeV 21.7 keV 10.3 cm 13.5 cm World eIoni + 3 22 mum -18.8 cm 2.19 cm 1.93 GeV 12.7 keV 5.78 cm 19.3 cm World eIoni + 4 23.2 mum -20 cm 2.22 cm 2.05 GeV 1.97 keV 1.24 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 22 mum -18.8 cm 2.19 cm 2.61 keV 0 eV 0 fm 0 fm World initStep + 1 9.36 mum -18.8 cm 2.19 cm 2.59 MeV 2.61 keV 238 mum 238 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -4.4 mum -16.9 cm 2.14 cm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 -10.1 mum -16.9 cm 2.14 cm 824 keV 1.21 keV 74.9 mum 74.9 mum World eIoni + 0 16.6 mum -13 cm 2.01 cm 1.86 keV 0 eV 0 fm 0 fm World initStep + 1 9.37 mum -13 cm 2.01 cm 1.53 MeV 1.86 keV 140 mum 140 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.9 cm 1.44 cm 1 keV 0 eV 0 fm 0 fm World initStep - 1 4.69 mum -3.91 cm 1.44 cm 636 keV 1 keV 57.9 mum 57.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -7.63 cm 1.75 cm 813 MeV 15.7 keV 8.12 cm 8.12 cm World eIoni - 2 12.9 mum -15 cm 2.08 cm 1.55 GeV 17 keV 7.4 cm 15.5 cm World eIoni - 3 19.6 mum -20 cm 2.22 cm 2.05 GeV 10.3 keV 4.98 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 12.9 mum -15 cm 2.08 cm 1.54 keV 0 eV 0 fm 0 fm World initStep - 1 5.46 mum -15 cm 2.08 cm 1.16 MeV 1.54 keV 105 mum 105 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -7.63 cm 1.75 cm 40.6 keV 0 eV 0 fm 0 fm World initStep - 1 -170 mum -8.38 cm 1.76 cm 76.5 MeV 3.91 keV 7.51 mm 7.51 mm World eIoni - 2 -217 mum -15.1 cm 1.76 cm 752 MeV 12.9 keV 6.76 cm 7.51 cm World eIoni - 3 -224 mum -17.4 cm 1.76 cm 974 MeV 5.72 keV 2.22 cm 9.73 cm World eIoni - 4 -225 mum -18.1 cm 1.76 cm 1.05 GeV 2.84 keV 7.56 mm 10.5 cm World eIoni - 5 -227 mum -20 cm 1.76 cm 1.24 GeV 3.65 keV 1.89 cm 12.4 cm OutOfWorldTransportation + 0 0 fm -2.7 cm 1.28 cm 13.2 keV 0 eV 0 fm 0 fm World initStep + 1 -35.7 mum -2.74 cm 1.28 cm 4.75 MeV 1.17 keV 465 mum 465 mum World eIoni + 2 -75.9 mum -5.71 cm 1.28 cm 302 MeV 5.45 keV 2.97 cm 3.02 cm World eIoni + 3 -92.8 mum -20 cm 1.28 cm 1.73 GeV 28.8 keV 14.3 cm 17.3 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -225 mum -18.1 cm 1.76 cm 2.97 keV 0 eV 0 fm 0 fm World initStep - 1 -234 mum -18.1 cm 1.76 cm 3.2 MeV 2.97 keV 296 mum 296 mum World eIoni + 0 -75.9 mum -5.71 cm 1.28 cm 1.32 keV 0 eV 0 fm 0 fm World initStep + 1 -76.2 mum -5.72 cm 1.28 cm 935 keV 1.32 keV 85 mum 85 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -224 mum -17.4 cm 1.76 cm 1.47 keV 0 eV 0 fm 0 fm World initStep - 1 -230 mum -17.4 cm 1.76 cm 1.08 MeV 1.47 keV 98.7 mum 98.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -217 mum -15.1 cm 1.76 cm 1.33 keV 0 eV 0 fm 0 fm World initStep - 1 -211 mum -15.1 cm 1.76 cm 946 keV 1.33 keV 86 mum 86 mum World eIoni + 0 -35.7 mum -2.74 cm 1.28 cm 1.81 keV 0 eV 0 fm 0 fm World initStep + 1 -39.3 mum -2.76 cm 1.28 cm 1.47 MeV 1.81 keV 134 mum 134 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1484,43 +881,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 40.9 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.67 cm 1.52 cm 517 MeV 10 keV 5.15 cm 5.15 cm World eIoni - 2 6.56 mum -20 cm 2.22 cm 2.05 GeV 33 keV 15.4 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -10.1 cm 1.89 cm 1.06 GeV 21.4 keV 10.6 cm 10.6 cm World eIoni + 2 -2.04 mum -20 cm 2.22 cm 2.05 GeV 20.9 keV 9.87 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.67 cm 1.52 cm 15.9 keV 0 eV 0 fm 0 fm World initStep - 1 -39 mum -5.04 cm 1.53 cm 39.4 MeV 7.11 keV 3.77 mm 3.77 mm World eIoni - 2 -51.7 mum -10.2 cm 1.54 cm 555 MeV 9.08 keV 5.16 cm 5.53 cm World eIoni - 3 -52.2 mum -14.7 cm 1.54 cm 1.01 GeV 8.8 keV 4.52 cm 10.1 cm World eIoni - 4 -53.8 mum -20 cm 1.54 cm 1.54 GeV 11.7 keV 5.29 cm 15.3 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -52.2 mum -14.7 cm 1.54 cm 3.99 keV 0 eV 0 fm 0 fm World initStep - 1 -41.8 mum -14.8 cm 1.54 cm 5.19 MeV 3.99 keV 485 mum 485 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -51.7 mum -10.2 cm 1.54 cm 1.86 keV 0 eV 0 fm 0 fm World initStep - 1 -60 mum -10.2 cm 1.54 cm 1.54 MeV 1.86 keV 140 mum 140 mum World eIoni + 0 0 fm -10.1 cm 1.89 cm 1.13 keV 0 eV 0 fm 0 fm World initStep + 1 4.92 mum -10.1 cm 1.89 cm 751 keV 1.13 keV 68.3 mum 68.3 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -1528,1236 +898,53 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -12.5 cm 1.99 cm 1.3 GeV 25.4 keV 13 cm 13 cm World eIoni - 2 192 nm -14.1 cm 2.05 cm 1.46 GeV 2.66 keV 1.58 cm 14.6 cm World eIoni - 3 1.99 mum -20 cm 2.22 cm 2.05 GeV 11.9 keV 5.87 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 192 nm -14.1 cm 2.05 cm 3.58 keV 0 eV 0 fm 0 fm World initStep - 1 -10.4 mum -14.2 cm 2.05 cm 3.32 MeV 1.93 keV 310 mum 310 mum World eIoni - 2 -28.8 mum -20 cm 2.05 cm 587 MeV 7.3 keV 5.84 cm 5.87 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -12.5 cm 1.99 cm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 -2.74 mum -12.6 cm 1.99 cm 819 keV 1.21 keV 74.6 mum 74.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 37.7 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -14.2 cm 2.05 cm 1.47 GeV 27.4 keV 14.7 cm 14.7 cm World eIoni - 2 -494 nm -17.7 cm 2.16 cm 1.82 GeV 6.77 keV 3.43 cm 18.2 cm World eIoni - 3 -561 nm -20 cm 2.22 cm 2.05 GeV 5.42 keV 2.33 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -494 nm -17.7 cm 2.16 cm 1.46 keV 0 eV 0 fm 0 fm World initStep - 1 -3.81 mum -17.7 cm 2.16 cm 1.08 MeV 1.46 keV 98 mum 98 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -14.2 cm 2.05 cm 3.95 keV 0 eV 0 fm 0 fm World initStep - 1 8.13 mum -14.3 cm 2.05 cm 5.12 MeV 3.95 keV 478 mum 478 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.66 cm 1.61 cm 616 MeV 11.5 keV 6.15 cm 6.15 cm World eIoni - 2 -1.33 mum -15.1 cm 2.08 cm 1.56 GeV 19.4 keV 9.49 cm 15.6 cm World eIoni - 3 -1.74 mum -18.5 cm 2.18 cm 1.9 GeV 6.86 keV 3.4 cm 19 cm World eIoni - 4 -1.48 mum -20 cm 2.22 cm 2.05 GeV 3.21 keV 1.46 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.74 mum -18.5 cm 2.18 cm 4.23 keV 0 eV 0 fm 0 fm World initStep - 1 -22 mum -18.6 cm 2.18 cm 5.79 MeV 4.23 keV 542 mum 542 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.33 mum -15.1 cm 2.08 cm 2.19 keV 0 eV 0 fm 0 fm World initStep - 1 242 nm -15.2 cm 2.09 cm 1.97 MeV 2.19 keV 181 mum 181 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.66 cm 1.61 cm 1.96 keV 0 eV 0 fm 0 fm World initStep - 1 3.13 mum -5.68 cm 1.61 cm 1.64 MeV 1.96 keV 151 mum 151 mum World eIoni - ----> Begin of Event: 50 - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -19.4 cm 2.21 cm 1.99 GeV 38.7 keV 19.9 cm 19.9 cm World eIoni - 2 -80.4 nm -20 cm 2.22 cm 2.05 GeV 1.36 keV 6.09 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -19.4 cm 2.21 cm 1.88 keV 0 eV 0 fm 0 fm World initStep - 1 5.75 mum -19.4 cm 2.21 cm 1.55 MeV 1.88 keV 142 mum 142 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.49 mm 6.31 mm 94.9 MeV 1.74 keV 8.09 mm 8.09 mm World eIoni - 2 -12.4 mum -8.65 cm 1.81 cm 915 MeV 16 keV 8.34 cm 9.15 cm World eIoni - 3 -13.7 mum -12.4 cm 1.99 cm 1.29 GeV 7.48 keV 3.77 cm 12.9 cm World eIoni - 4 -16.9 mum -20 cm 2.22 cm 2.05 GeV 15.3 keV 7.58 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -13.7 mum -12.4 cm 1.99 cm 1.29 keV 0 eV 0 fm 0 fm World initStep - 1 -8.18 mum -12.4 cm 1.99 cm 904 keV 1.29 keV 82.3 mum 82.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -12.4 mum -8.65 cm 1.81 cm 1.06 keV 0 eV 0 fm 0 fm World initStep - 1 -14.6 mum -8.66 cm 1.81 cm 687 keV 1.06 keV 62.3 mum 62.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.49 mm 6.31 mm 2.9 keV 0 eV 0 fm 0 fm World initStep - 1 14.9 mum -4.77 mm 6.31 mm 3.08 MeV 2.9 keV 285 mum 285 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -372 mum 1.93 mm 53.7 MeV 205 eV 1.97 mm 1.97 mm World eIoni - 2 -3.81 mum -3.4 cm 1.38 cm 390 MeV 8.63 keV 3.68 cm 3.87 cm World eIoni - 3 -12.7 mum -20 cm 2.22 cm 2.05 GeV 34.9 keV 16.6 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.81 mum -3.4 cm 1.38 cm 1.56 keV 0 eV 0 fm 0 fm World initStep - 1 3.38 mum -3.41 cm 1.38 cm 1.18 MeV 1.56 keV 107 mum 107 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -372 mum 1.93 mm 1.77 keV 0 eV 0 fm 0 fm World initStep - 1 3.81 mum -497 mum 1.93 mm 1.56 MeV 1.77 keV 130 mum 130 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -11.9 cm 1.97 cm 1.24 GeV 23.5 keV 12.4 cm 12.4 cm World eIoni - 2 -4.41 mum -17.4 cm 2.15 cm 1.79 GeV 11.2 keV 5.5 cm 17.9 cm World eIoni - 3 -6.37 mum -20 cm 2.22 cm 2.05 GeV 7.01 keV 2.6 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -4.41 mum -17.4 cm 2.15 cm 2.03 keV 0 eV 0 fm 0 fm World initStep - 1 1.07 mum -17.4 cm 2.15 cm 1.74 MeV 2.03 keV 159 mum 159 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -11.9 cm 1.97 cm 14.9 keV 0 eV 0 fm 0 fm World initStep - 1 43.1 mum -12 cm 1.97 cm 7.26 MeV 1.07 keV 708 mum 708 mum World eIoni - 2 95.9 mum -17.8 cm 1.96 cm 592 MeV 9.18 keV 5.85 cm 5.92 cm WorldTransportation - 3 95.9 mum -17.8 cm 1.96 cm 592 MeV2.32e-12 eV 0.011 fm 5.92 cm World eIoni - 4 97.9 mum -19.6 cm 1.96 cm 766 MeV 3.14 keV 1.74 cm 7.66 cm World eIoni - 5 98.1 mum -20 cm 1.96 cm 810 MeV 1.45 keV 4.36 mm 8.1 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 97.9 mum -19.6 cm 1.96 cm 1.29 keV 0 eV 0 fm 0 fm World initStep - 1 98.7 mum -19.6 cm 1.96 cm 897 keV 1.29 keV 81.6 mum 81.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 95.9 mum -17.8 cm 1.96 cm 13.3 keV 0 eV 0 fm 0 fm World initStep - 1 112 mum -17.9 cm 1.97 cm 7.41 MeV 511 eV 721 mum 721 mum World eIoni - 2 115 mum -18 cm 1.97 cm 13.1 MeV 0 eV 572 mum 1.29 mm World eIoni - 3 102 mum -20 cm 1.97 cm 218 MeV 2.74 keV 2.05 cm 2.18 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 115 mum -18 cm 1.97 cm 16.5 keV 0 eV 0 fm 0 fm World initStep - 1 208 mum -18.6 cm 1.96 cm 64.7 MeV 16.5 keV 6.23 mm 6.23 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -8.21 cm 1.79 cm 871 MeV 16.9 keV 8.7 cm 8.7 cm World eIoni - 2 -977 nm -12.8 cm 2 cm 1.33 GeV 8.23 keV 4.56 cm 13.3 cm World eIoni - 3 -2.73 mum -17.8 cm 2.16 cm 1.83 GeV 10.3 keV 5 cm 18.3 cm World eIoni - 4 -5.54 mum -20 cm 2.22 cm 2.05 GeV 4.34 keV 2.23 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.73 mum -17.8 cm 2.16 cm 52.7 keV 0 eV 0 fm 0 fm World initStep - 1 147 mum -18.4 cm 2.15 cm 64.1 MeV 2.67 keV 6.29 mm 6.29 mm World eIoni - 2 167 mum -19.7 cm 2.15 cm 190 MeV 2.63 keV 1.26 cm 1.89 cm World eIoni - 3 172 mum -20 cm 2.15 cm 225 MeV 787 eV 3.46 mm 2.24 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 167 mum -19.7 cm 2.15 cm 3.21 keV 0 eV 0 fm 0 fm World initStep - 1 150 mum -19.7 cm 2.15 cm 3.61 MeV 3.21 keV 335 mum 335 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -977 nm -12.8 cm 2 cm 5.86 keV 0 eV 0 fm 0 fm World initStep - 1 13.4 mum -12.9 cm 2 cm 10.2 MeV 5.86 keV 960 mum 960 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -8.21 cm 1.79 cm 1.59 keV 0 eV 0 fm 0 fm World initStep - 1 4.5 mum -8.22 cm 1.79 cm 1.21 MeV 1.59 keV 111 mum 111 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -11 cm 1.93 cm 1.15 GeV 21.3 keV 11.5 cm 11.5 cm World eIoni - 2 574 nm -20 cm 2.22 cm 2.05 GeV 19.6 keV 8.97 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -11 cm 1.93 cm 1.61 keV 0 eV 0 fm 0 fm World initStep - 1 -1.96 mum -11 cm 1.93 cm 1.24 MeV 1.61 keV 113 mum 113 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.38 cm 1.59 cm 588 MeV 11.1 keV 5.86 cm 5.86 cm World eIoni - 2 4.48 mum -20 cm 2.22 cm 2.05 GeV 31.3 keV 14.6 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.38 cm 1.59 cm 3.17 keV 0 eV 0 fm 0 fm World initStep - 1 -10.7 mum -5.41 cm 1.59 cm 3.54 MeV 3.17 keV 328 mum 328 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -17.9 cm 2.17 cm 1.84 GeV 35.6 keV 18.4 cm 18.4 cm World eIoni - 2 137 nm -19.5 cm 2.21 cm 2 GeV 2.99 keV 1.51 cm 20 cm World eIoni - 3 287 nm -20 cm 2.22 cm 2.05 GeV 1.27 keV 5.44 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 137 nm -19.5 cm 2.21 cm 1.53 keV 0 eV 0 fm 0 fm World initStep - 1 -7.13 mum -19.5 cm 2.21 cm 1.15 MeV 1.53 keV 105 mum 105 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -17.9 cm 2.17 cm 1.06 keV 0 eV 0 fm 0 fm World initStep - 1 -2.66 mum -17.9 cm 2.17 cm 692 keV 1.06 keV 62.9 mum 62.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.06 mm 6.04 mm 90.6 MeV 1.66 keV 7.58 mm 7.58 mm World eIoni - 2 -2.82 mum -1.76 cm 1.1 cm 226 MeV 2.67 keV 1.45 cm 2.21 cm World eIoni - 3 -3.53 mum -9.66 cm 1.87 cm 1.02 GeV 15.8 keV 7.95 cm 10.2 cm World eIoni - 4 -2.02 mum -13.7 cm 2.03 cm 1.42 GeV 8.05 keV 4.06 cm 14.2 cm World eIoni - 5 -959 nm -16.6 cm 2.13 cm 1.71 GeV 6.61 keV 2.88 cm 17.1 cm World eIoni - 6 477 nm -20 cm 2.22 cm 2.05 GeV 5.49 keV 3.41 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -959 nm -16.6 cm 2.13 cm 1.69 keV 0 eV 0 fm 0 fm World initStep - 1 -5.24 mum -16.6 cm 2.13 cm 1.32 MeV 1.69 keV 121 mum 121 mum World eIoni + 1 0 fm -4.08 cm 1.46 cm 458 MeV 7.06 keV 4.56 cm 4.56 cm World eIoni + 2 3.24 mum -6.91 cm 1.71 cm 741 MeV 7.99 keV 2.84 cm 7.4 cm World eIoni + 3 3.4 mum -9.1 cm 1.84 cm 960 MeV 7.43 keV 2.19 cm 9.59 cm World eIoni + 4 3.27 mum -9.37 cm 1.85 cm 987 MeV 906 eV 2.7 mm 9.86 cm World eIoni + 5 -3.62 mum -20 cm 2.22 cm 2.05 GeV 22.3 keV 10.6 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.02 mum -13.7 cm 2.03 cm 1.11 keV 0 eV 0 fm 0 fm World initStep - 1 -4.02 mum -13.7 cm 2.03 cm 737 keV 1.11 keV 67.1 mum 67.1 mum World eIoni + 0 3.27 mum -9.37 cm 1.85 cm 2.58 keV 0 eV 0 fm 0 fm World initStep + 1 15 mum -9.4 cm 1.85 cm 2.54 MeV 2.58 keV 234 mum 234 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.53 mum -9.66 cm 1.87 cm 2.6 keV 0 eV 0 fm 0 fm World initStep - 1 -16.7 mum -9.69 cm 1.86 cm 2.57 MeV 2.6 keV 237 mum 237 mum World eIoni + 0 3.4 mum -9.1 cm 1.84 cm 3.05 keV 0 eV 0 fm 0 fm World initStep + 1 19.6 mum -9.13 cm 1.84 cm 3.33 MeV 3.05 keV 309 mum 309 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.82 mum -1.76 cm 1.1 cm 1.05 keV 0 eV 0 fm 0 fm World initStep - 1 -6.49 mum -1.76 cm 1.1 cm 690 keV 1.05 keV 62.2 mum 62.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.06 mm 6.04 mm 1.17 keV 0 eV 0 fm 0 fm World initStep - 1 4.76 mum -4.13 mm 6.04 mm 805 keV 1.17 keV 71.8 mum 71.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.84 cm 1.63 cm 634 MeV 11.7 keV 6.32 cm 6.32 cm World eIoni - 2 -567 nm -8.17 cm 1.79 cm 867 MeV 5.84 keV 2.34 cm 8.66 cm World eIoni - 3 -2.29 mum -15.7 cm 2.1 cm 1.62 GeV 16.1 keV 7.52 cm 16.2 cm World eIoni - 4 -2.74 mum -16.9 cm 2.14 cm 1.74 GeV 1.31 keV 1.23 cm 17.4 cm World eIoni - 5 -3.03 mum -19.2 cm 2.2 cm 1.97 GeV 6.68 keV 2.33 cm 19.7 cm World eIoni - 6 -2.7 mum -20 cm 2.22 cm 2.05 GeV 1.74 keV 7.54 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.03 mum -19.2 cm 2.2 cm 12.3 keV 0 eV 0 fm 0 fm World initStep - 1 -69.1 mum -19.4 cm 2.2 cm 21.4 MeV 4.87 keV 2.05 mm 2.05 mm World eIoni - 2 -83 mum -20 cm 2.2 cm 76.6 MeV 1.13 keV 5.52 mm 7.57 mm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.74 mum -16.9 cm 2.14 cm 1.97 keV 0 eV 0 fm 0 fm World initStep - 1 -11.3 mum -16.9 cm 2.14 cm 1.66 MeV 1.97 keV 152 mum 152 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.29 mum -15.7 cm 2.1 cm 1.48 keV 0 eV 0 fm 0 fm World initStep - 1 3.97 mum -15.7 cm 2.1 cm 1.09 MeV 1.48 keV 99.4 mum 99.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -567 nm -8.17 cm 1.79 cm 2.45 keV 0 eV 0 fm 0 fm World initStep - 1 1.85 mum -8.19 cm 1.78 cm 2.33 MeV 2.45 keV 215 mum 215 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.84 cm 1.63 cm 1.07 keV 0 eV 0 fm 0 fm World initStep - 1 2.78 mum -5.84 cm 1.63 cm 699 keV 1.07 keV 63.3 mum 63.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.45 cm 1.67 cm 695 MeV 13 keV 6.94 cm 6.94 cm World eIoni - 2 -8.55 mum -11.3 cm 1.94 cm 1.18 GeV 9.55 keV 4.9 cm 11.8 cm World eIoni - 3 -11.2 mum -13.1 cm 2.01 cm 1.36 GeV 2.77 keV 1.73 cm 13.6 cm World eIoni - 4 -19.3 mum -20 cm 2.22 cm 2.05 GeV 14.9 keV 6.93 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -11.2 mum -13.1 cm 2.01 cm 1.1 keV 0 eV 0 fm 0 fm World initStep - 1 -11.1 mum -13.1 cm 2.01 cm 728 keV 1.1 keV 66.1 mum 66.1 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -8.55 mum -11.3 cm 1.94 cm 1.25 keV 0 eV 0 fm 0 fm World initStep - 1 -2.64 mum -11.4 cm 1.94 cm 856 keV 1.25 keV 77.8 mum 77.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.45 cm 1.67 cm 30.3 keV 0 eV 0 fm 0 fm World initStep - 1 149 mum -8.35 cm 1.67 cm 192 MeV 30.3 keV 1.91 cm 1.91 cm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.35 cm 1.22 cm 285 MeV 5.52 keV 2.81 cm 2.81 cm World eIoni - 2 25 nm -2.38 cm 1.23 cm 288 MeV 13 eV 219 mum 2.84 cm World eIoni - 3 2.24 mum -8.3 cm 1.79 cm 880 MeV 12.5 keV 5.96 cm 8.79 cm World eIoni - 4 1.28 mum -20 cm 2.22 cm 2.05 GeV 24.2 keV 11.7 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.24 mum -8.3 cm 1.79 cm 3.23 keV 0 eV 0 fm 0 fm World initStep - 1 11.7 mum -8.34 cm 1.79 cm 3.65 MeV 3.23 keV 339 mum 339 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 25 nm -2.38 cm 1.23 cm 2.43 keV 0 eV 0 fm 0 fm World initStep - 1 3.31 mum -2.4 cm 1.22 cm 2.3 MeV 2.43 keV 212 mum 212 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.35 cm 1.22 cm 1.25 keV 0 eV 0 fm 0 fm World initStep - 1 -5.47 mum -2.36 cm 1.22 cm 853 keV 1.25 keV 77.8 mum 77.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.58 cm 1.26 cm 308 MeV 5.19 keV 3.05 cm 3.05 cm World eIoni - 2 -863 nm -3.31 cm 1.37 cm 381 MeV 1.27 keV 7.36 mm 3.78 cm World eIoni - 3 -1.13 mum -3.81 cm 1.43 cm 431 MeV 533 eV 5.01 mm 4.29 cm World eIoni - 4 -10.6 mum -16.4 cm 2.12 cm 1.69 GeV 27 keV 12.6 cm 16.9 cm World eIoni - 5 -12.4 mum -20 cm 2.22 cm 2.05 GeV 6.6 keV 3.59 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -10.6 mum -16.4 cm 2.12 cm 1.07 keV 0 eV 0 fm 0 fm World initStep - 1 -6.55 mum -16.4 cm 2.12 cm 699 keV 1.07 keV 63.6 mum 63.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.13 mum -3.81 cm 1.43 cm 2.28 keV 0 eV 0 fm 0 fm World initStep - 1 10.3 mum -3.83 cm 1.43 cm 2.09 MeV 2.28 keV 192 mum 192 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -863 nm -3.31 cm 1.37 cm 1.08 keV 0 eV 0 fm 0 fm World initStep - 1 -3.69 mum -3.32 cm 1.37 cm 702 keV 1.08 keV 64.1 mum 64.1 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.58 cm 1.26 cm 1.59 keV 0 eV 0 fm 0 fm World initStep - 1 7.84 mum -2.59 cm 1.26 cm 1.21 MeV 1.59 keV 111 mum 111 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.61 cm 1.41 cm 410 MeV 9.29 keV 4.08 cm 4.08 cm World eIoni - 2 10 mum -6.74 cm 1.69 cm 724 MeV 5.72 keV 3.15 cm 7.23 cm World eIoni - 3 18.2 mum -12.2 cm 1.98 cm 1.27 GeV 11.8 keV 5.45 cm 12.7 cm World eIoni - 4 21.3 mum -17 cm 2.14 cm 1.75 GeV 11 keV 4.86 cm 17.5 cm World eIoni - 5 22.4 mum -20 cm 2.22 cm 2.05 GeV 5.11 keV 2.96 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 21.3 mum -17 cm 2.14 cm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 24.7 mum -17 cm 2.14 cm 828 keV 1.21 keV 75.2 mum 75.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 18.2 mum -12.2 cm 1.98 cm 24.3 keV 0 eV 0 fm 0 fm World initStep - 1 66.4 mum -12.7 cm 1.99 cm 55.2 MeV 8.01 keV 5.33 mm 5.33 mm World eIoni - 2 80.2 mum -20 cm 1.99 cm 784 MeV 15.1 keV 7.29 cm 7.82 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 10 mum -6.74 cm 1.69 cm 2.68 keV 0 eV 0 fm 0 fm World initStep - 1 17.9 mum -6.77 cm 1.69 cm 2.71 MeV 2.68 keV 250 mum 250 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.61 cm 1.41 cm 52.8 keV 0 eV 0 fm 0 fm World initStep - 1 -116 mum -4 cm 1.42 cm 40.9 MeV 1.21 keV 4.01 mm 4.01 mm World eIoni - 2 -172 mum -13.4 cm 1.42 cm 977 MeV 17.8 keV 9.36 cm 9.76 cm World eIoni - 3 -180 mum -20 cm 1.42 cm 1.64 GeV 13.5 keV 6.64 cm 16.4 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -172 mum -13.4 cm 1.42 cm 994 eV 0 eV 0 fm 0 fm World initStep - 1 -175 mum -13.4 cm 1.42 cm 631 keV 994 eV 57.4 mum 57.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.33 cm 1.67 cm 683 MeV 13.1 keV 6.82 cm 6.82 cm World eIoni - 2 -4.28 mum -10.4 cm 1.9 cm 1.09 GeV 7.18 keV 4.1 cm 10.9 cm World eIoni - 3 -6.32 mum -14.4 cm 2.06 cm 1.49 GeV 9.45 keV 3.96 cm 14.9 cm World eIoni - 4 -7.9 mum -16.9 cm 2.14 cm 1.74 GeV 6.97 keV 2.57 cm 17.4 cm World eIoni - 5 -8.01 mum -17.3 cm 2.15 cm 1.78 GeV 821 eV 3.97 mm 17.8 cm World eIoni - 6 -11.2 mum -20 cm 2.22 cm 2.05 GeV 7.74 keV 2.66 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -8.01 mum -17.3 cm 2.15 cm 35.4 keV 0 eV 0 fm 0 fm World initStep - 1 159 mum -18.7 cm 2.15 cm 139 MeV 12.7 keV 1.37 cm 1.37 cm World eIoni - 2 172 mum -20 cm 2.15 cm 268 MeV 2.58 keV 1.29 cm 2.66 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 6 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 159 mum -18.7 cm 2.15 cm 2.8 keV 0 eV 0 fm 0 fm World initStep - 1 153 mum -18.7 cm 2.15 cm 2.91 MeV 2.8 keV 269 mum 269 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -7.9 mum -16.9 cm 2.14 cm 3.15 keV 0 eV 0 fm 0 fm World initStep - 1 -24.1 mum -17 cm 2.14 cm 3.49 MeV 3.15 keV 323 mum 323 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -6.32 mum -14.4 cm 2.06 cm 1.7 keV 0 eV 0 fm 0 fm World initStep - 1 452 nm -14.4 cm 2.06 cm 1.34 MeV 1.7 keV 122 mum 122 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -4.28 mum -10.4 cm 1.9 cm 2.01 keV 0 eV 0 fm 0 fm World initStep - 1 -9.86 mum -10.4 cm 1.9 cm 1.72 MeV 2.01 keV 157 mum 157 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.33 cm 1.67 cm 8.22 keV 0 eV 0 fm 0 fm World initStep - 1 53.8 mum -6.5 cm 1.67 cm 18.6 MeV 8.22 keV 1.76 mm 1.76 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -9.81 cm 1.87 cm 1.03 GeV 19.3 keV 10.3 cm 10.3 cm World eIoni - 2 2.62 mum -11.6 cm 1.96 cm 1.21 GeV 2.8 keV 1.82 cm 12.1 cm World eIoni - 3 8.68 mum -20 cm 2.22 cm 2.05 GeV 18.3 keV 8.38 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.62 mum -11.6 cm 1.96 cm 3.62 keV 0 eV 0 fm 0 fm World initStep - 1 17.6 mum -11.7 cm 1.96 cm 4.44 MeV 3.62 keV 413 mum 413 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -9.81 cm 1.87 cm 25.8 keV 0 eV 0 fm 0 fm World initStep - 1 -149 mum -10.4 cm 1.87 cm 63.6 MeV 7.57 keV 6.18 mm 6.18 mm World eIoni - 2 -194 mum -20 cm 1.87 cm 1.02 GeV 19.7 keV 9.58 cm 10.2 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -14.8 cm 2.07 cm 1.53 GeV 29.6 keV 15.3 cm 15.3 cm World eIoni - 2 894 nm -17.9 cm 2.17 cm 1.84 GeV 5.93 keV 3.08 cm 18.4 cm World eIoni - 3 1.81 mum -20 cm 2.22 cm 2.05 GeV 4.72 keV 2.08 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 894 nm -17.9 cm 2.17 cm 1.37 keV 0 eV 0 fm 0 fm World initStep - 1 -5.69 mum -17.9 cm 2.17 cm 982 keV 1.37 keV 89.3 mum 89.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -14.8 cm 2.07 cm 2.35 keV 0 eV 0 fm 0 fm World initStep - 1 -12.1 mum -14.9 cm 2.07 cm 2.19 MeV 2.35 keV 201 mum 201 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -16.7 cm 2.13 cm 1.72 GeV 34.8 keV 17.2 cm 17.2 cm World eIoni - 2 417 nm -20 cm 2.22 cm 2.05 GeV 8.48 keV 3.33 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -16.7 cm 2.13 cm 1.27 keV 0 eV 0 fm 0 fm World initStep - 1 -3.99 mum -16.7 cm 2.13 cm 882 keV 1.27 keV 80.3 mum 80.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.24 cm 1.58 cm 574 MeV 11.9 keV 5.72 cm 5.72 cm World eIoni - 2 2.36 mum -11.7 cm 1.96 cm 1.22 GeV 13.7 keV 6.51 cm 12.2 cm World eIoni - 3 2.49 mum -20 cm 2.22 cm 2.05 GeV 16.5 keV 8.26 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.36 mum -11.7 cm 1.96 cm 4.56 keV 0 eV 0 fm 0 fm World initStep - 1 13.3 mum -11.8 cm 1.96 cm 6.59 MeV 4.56 keV 617 mum 617 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.24 cm 1.58 cm 2.05 keV 0 eV 0 fm 0 fm World initStep - 1 -7.11 mum -5.26 cm 1.58 cm 1.77 MeV 2.05 keV 162 mum 162 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -13.9 cm 2.04 cm 1.44 GeV 27.5 keV 14.4 cm 14.4 cm World eIoni - 2 -1.48 mum -20 cm 2.22 cm 2.05 GeV 12.6 keV 6.09 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -13.9 cm 2.04 cm 3.28 keV 0 eV 0 fm 0 fm World initStep - 1 12.8 mum -13.9 cm 2.04 cm 3.75 MeV 3.28 keV 348 mum 348 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.73 cm 1.69 cm 722 MeV 14.3 keV 7.21 cm 7.21 cm World eIoni - 2 -237 nm -7.05 cm 1.72 cm 755 MeV 445 eV 3.22 mm 7.53 cm World eIoni - 3 -9.09 mum -19.6 cm 2.21 cm 2.01 GeV 27 keV 12.6 cm 20.1 cm World eIoni - 4 -9.39 mum -20 cm 2.22 cm 2.05 GeV 1.36 keV 3.98 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -9.09 mum -19.6 cm 2.21 cm 14.4 keV 0 eV 0 fm 0 fm World initStep - 1 161 mum -20 cm 2.18 cm 52.4 MeV 10.1 keV 4.25 mm 4.25 mm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -237 nm -7.05 cm 1.72 cm 35.1 keV 0 eV 0 fm 0 fm World initStep - 1 32 mum -9.45 cm 1.73 cm 242 MeV 27.7 keV 2.41 cm 2.41 cm World eIoni - 2 37.4 mum -17.8 cm 1.74 cm 1.08 GeV 17.4 keV 8.38 cm 10.8 cm World eIoni - 3 37.9 mum -20 cm 1.74 cm 1.3 GeV 5.32 keV 2.17 cm 13 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 37.4 mum -17.8 cm 1.74 cm 1.13 keV 0 eV 0 fm 0 fm World initStep - 1 38.2 mum -17.8 cm 1.73 cm 748 keV 1.13 keV 68 mum 68 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.73 cm 1.69 cm 9.58 keV 0 eV 0 fm 0 fm World initStep - 1 36.7 mum -6.95 cm 1.69 cm 24.5 MeV 9.58 keV 2.32 mm 2.32 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.66 cm 1.69 cm 716 MeV 13.6 keV 7.14 cm 7.14 cm World eIoni - 2 -407 nm -7.9 cm 1.77 cm 840 MeV 2.8 keV 1.24 cm 8.39 cm World eIoni - 3 -1.16 mum -15.1 cm 2.08 cm 1.56 GeV 15.1 keV 7.18 cm 15.6 cm World eIoni - 4 -2.49 mum -20 cm 2.22 cm 2.05 GeV 10.8 keV 4.93 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.16 mum -15.1 cm 2.08 cm 1.58 keV 0 eV 0 fm 0 fm World initStep - 1 5.81 mum -15.1 cm 2.08 cm 1.2 MeV 1.58 keV 109 mum 109 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -407 nm -7.9 cm 1.77 cm 2.31 keV 0 eV 0 fm 0 fm World initStep - 1 -3.67 mum -7.92 cm 1.77 cm 2.15 MeV 2.31 keV 197 mum 197 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.66 cm 1.69 cm 2.6 keV 0 eV 0 fm 0 fm World initStep - 1 5.46 mum -6.67 cm 1.69 cm 1.6 MeV 863 eV 149 mum 149 mum World eIoni - 2 22 mum -20 cm 1.69 cm 1.33 GeV 19.1 keV 13.3 cm 13.3 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -15.5 cm 2.1 cm 1.6 GeV 31 keV 16 cm 16 cm World eIoni - 2 2.41 nm -17.1 cm 2.14 cm 1.76 GeV 3.43 keV 1.59 cm 17.6 cm World eIoni - 3 2.72 nm -18.2 cm 2.17 cm 1.87 GeV 3.15 keV 1.05 cm 18.7 cm World eIoni - 4 -151 nm -20 cm 2.22 cm 2.05 GeV 4.32 keV 1.83 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.72 nm -18.2 cm 2.17 cm 1.23 keV 0 eV 0 fm 0 fm World initStep - 1 2.75 mum -18.2 cm 2.17 cm 841 keV 1.23 keV 76.4 mum 76.4 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.41 nm -17.1 cm 2.14 cm 1.02 keV 0 eV 0 fm 0 fm World initStep - 1 32.4 nm -17.1 cm 2.14 cm 656 keV 1.02 keV 59.6 mum 59.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -15.5 cm 2.1 cm 1.57 keV 0 eV 0 fm 0 fm World initStep - 1 -48.9 nm -15.5 cm 2.1 cm 1.18 MeV 1.57 keV 108 mum 108 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 40.1 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.94 mm 6.58 mm 99.3 MeV 1.15 keV 8.61 mm 8.61 mm World eIoni - 2 4.58 mum -3.47 cm 1.39 cm 397 MeV 7.66 keV 3.08 cm 3.94 cm World eIoni - 3 5.69 mum -7.81 cm 1.76 cm 831 MeV 8.4 keV 4.36 cm 8.3 cm World eIoni - 4 6.39 mum -8.86 cm 1.82 cm 936 MeV 1.22 keV 1.05 cm 9.35 cm World eIoni - 5 13.9 mum -20 cm 2.22 cm 2.05 GeV 22.2 keV 11.1 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 6.39 mum -8.86 cm 1.82 cm 1.85 keV 0 eV 0 fm 0 fm World initStep - 1 -1.42 mum -8.87 cm 1.82 cm 1.52 MeV 1.85 keV 139 mum 139 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 5.69 mum -7.81 cm 1.76 cm 2.04 keV 0 eV 0 fm 0 fm World initStep - 1 -4.26 mum -7.83 cm 1.76 cm 1.76 MeV 2.04 keV 161 mum 161 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.58 mum -3.47 cm 1.39 cm 3.34 keV 0 eV 0 fm 0 fm World initStep - 1 9.7 mum -3.5 cm 1.39 cm 3.87 MeV 3.34 keV 359 mum 359 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.94 mm 6.58 mm 1.57 keV 0 eV 0 fm 0 fm World initStep - 1 -6.26 mum -5.04 mm 6.59 mm 1.21 MeV 1.57 keV 109 mum 109 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -20 cm 2.22 cm 2.05 GeV 41 keV 20.5 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -106 mum 1.03 mm 51.1 MeV 259 eV 1.04 mm 1.04 mm World eIoni - 2 1.58 mum -4.5 mm 6.33 mm 95 MeV 1.52 keV 7.07 mm 8.11 mm World eIoni - 3 1.52 mum -2.84 cm 1.3 cm 334 MeV 4.97 keV 2.5 cm 3.31 cm World eIoni - 4 -3.38 mum -15.8 cm 2.1 cm 1.63 GeV 25.5 keV 12.9 cm 16.3 cm World eIoni - 5 -3.15 mum -20 cm 2.22 cm 2.05 GeV 11.3 keV 4.25 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -3.38 mum -15.8 cm 2.1 cm 1.73 keV 0 eV 0 fm 0 fm World initStep - 1 -11.7 mum -15.8 cm 2.1 cm 1.37 MeV 1.73 keV 125 mum 125 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.52 mum -2.84 cm 1.3 cm 1.08 keV 0 eV 0 fm 0 fm World initStep - 1 6.18 mum -2.85 cm 1.3 cm 704 keV 1.08 keV 64.2 mum 64.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.58 mum -4.5 mm 6.33 mm 1.12 keV 0 eV 0 fm 0 fm World initStep - 1 4.16 mum -4.57 mm 6.33 mm 774 keV 1.12 keV 67.8 mum 67.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -106 mum 1.03 mm 1.89 keV 0 eV 0 fm 0 fm World initStep - 1 -3.13 mum -249 mum 1.03 mm 1.56 MeV 1.89 keV 144 mum 144 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.82 cm 1.54 cm 532 MeV 10.1 keV 5.3 cm 5.3 cm World eIoni - 2 -9.59 nm -5.37 cm 1.59 cm 587 MeV 569 eV 5.54 mm 5.85 cm World eIoni - 3 -1.87 mum -9.06 cm 1.83 cm 956 MeV 9.48 keV 3.7 cm 9.55 cm World eIoni - 4 -7.1 mum -20 cm 2.22 cm 2.05 GeV 22.6 keV 10.9 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.87 mum -9.06 cm 1.83 cm 1.06 keV 0 eV 0 fm 0 fm World initStep - 1 2.78 mum -9.06 cm 1.83 cm 691 keV 1.06 keV 62.8 mum 62.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -9.59 nm -5.37 cm 1.59 cm 1.37 keV 0 eV 0 fm 0 fm World initStep - 1 6.59 mum -5.38 cm 1.59 cm 986 keV 1.37 keV 89.7 mum 89.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.82 cm 1.54 cm 21.8 keV 0 eV 0 fm 0 fm World initStep - 1 962 nm -5.86 cm 1.55 cm 107 MeV 21.8 keV 1.05 cm 1.05 cm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.22 cm 1.2 cm 272 MeV 5.74 keV 2.68 cm 2.68 cm World eIoni - 2 4.27 mum -8.97 cm 1.83 cm 947 MeV 14.3 keV 6.78 cm 9.46 cm World eIoni - 3 8.95 mum -20 cm 2.22 cm 2.05 GeV 22.9 keV 11 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.27 mum -8.97 cm 1.83 cm 1.15 keV 0 eV 0 fm 0 fm World initStep - 1 20.6 nm -8.98 cm 1.83 cm 769 keV 1.15 keV 69.8 mum 69.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.22 cm 1.2 cm 1.15 keV 0 eV 0 fm 0 fm World initStep - 1 -5.44 mum -2.23 cm 1.2 cm 767 keV 1.15 keV 69.6 mum 69.6 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.13 cm 9.32 mm 163 MeV 1.98 keV 1.56 cm 1.56 cm World eIoni - 2 -6.15 mum -9.58 cm 1.86 cm 1.01 GeV 16.9 keV 8.51 cm 10.1 cm World eIoni - 3 -10.9 mum -19.9 cm 2.22 cm 2.04 GeV 22.1 keV 10.3 cm 20.4 cm World eIoni - 4 -10.9 mum -20 cm 2.22 cm 2.05 GeV 184 eV 954 mum 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -10.9 mum -19.9 cm 2.22 cm 1.68 keV 0 eV 0 fm 0 fm World initStep - 1 -8.85 mum -19.9 cm 2.22 cm 1.32 MeV 1.68 keV 121 mum 121 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -6.15 mum -9.58 cm 1.86 cm 1.14 keV 0 eV 0 fm 0 fm World initStep - 1 -769 nm -9.59 cm 1.86 cm 758 keV 1.14 keV 68.9 mum 68.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.13 cm 9.32 mm 1.28 keV 0 eV 0 fm 0 fm World initStep - 1 5.65 mum -1.14 cm 9.32 mm 888 keV 1.28 keV 81.1 mum 81.1 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -12.6 cm 1.99 cm 1.31 GeV 24.8 keV 13.1 cm 13.1 cm World eIoni - 2 324 nm -14 cm 2.05 cm 1.45 GeV 3.09 keV 1.42 cm 14.5 cm World eIoni - 3 945 nm -19.3 cm 2.2 cm 1.98 GeV 11.3 keV 5.27 cm 19.8 cm World eIoni - 4 953 nm -20 cm 2.22 cm 2.05 GeV 1.4 keV 7.05 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 945 nm -19.3 cm 2.2 cm 1.18 keV 0 eV 0 fm 0 fm World initStep - 1 3.83 mum -19.3 cm 2.2 cm 795 keV 1.18 keV 72.2 mum 72.2 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 324 nm -14 cm 2.05 cm 1.04 keV 0 eV 0 fm 0 fm World initStep - 1 2.06 mum -14 cm 2.05 cm 674 keV 1.04 keV 61.3 mum 61.3 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -12.6 cm 1.99 cm 1.83 keV 0 eV 0 fm 0 fm World initStep - 1 -6.71 mum -12.6 cm 2 cm 1.5 MeV 1.83 keV 137 mum 137 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -9.79 cm 1.87 cm 1.03 GeV 19.4 keV 10.3 cm 10.3 cm World eIoni - 2 55.2 nm -11.5 cm 1.95 cm 1.2 GeV 2.79 keV 1.67 cm 12 cm World eIoni - 3 2.05 mum -20 cm 2.22 cm 2.05 GeV 18.6 keV 8.55 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 55.2 nm -11.5 cm 1.95 cm 1.93 keV 0 eV 0 fm 0 fm World initStep - 1 -7.24 mum -11.5 cm 1.95 cm 1.62 MeV 1.93 keV 148 mum 148 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -9.79 cm 1.87 cm 2.73 keV 0 eV 0 fm 0 fm World initStep - 1 -1 mum -9.81 cm 1.87 cm 2.79 MeV 2.73 keV 258 mum 258 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.3 cm 1.37 cm 380 MeV 6.47 keV 3.78 cm 3.78 cm World eIoni - 2 -239 nm -3.59 cm 1.41 cm 409 MeV 496 eV 2.9 mm 4.06 cm World eIoni - 3 4.25 mum -8.22 cm 1.79 cm 872 MeV 10.1 keV 4.64 cm 8.71 cm World eIoni - 4 15.8 mum -20 cm 2.22 cm 2.05 GeV 24.3 keV 11.8 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 4.25 mum -8.22 cm 1.79 cm 14.8 keV 0 eV 0 fm 0 fm World initStep - 1 -74.7 mum -8.72 cm 1.78 cm 54.2 MeV 14.8 keV 5.16 mm 5.16 mm World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -239 nm -3.59 cm 1.41 cm 16.7 keV 0 eV 0 fm 0 fm World initStep - 1 -47 mum -3.75 cm 1.41 cm 17.2 MeV 4.13 keV 1.66 mm 1.66 mm World eIoni - 2 -84.2 mum -13.2 cm 1.41 cm 960 MeV 17.6 keV 9.42 cm 9.59 cm World eIoni - 3 -86.6 mum -15.3 cm 1.41 cm 1.17 GeV 3.25 keV 2.15 cm 11.7 cm World eIoni - 4 -87.1 mum -15.8 cm 1.41 cm 1.22 GeV 2.49 keV 4.32 mm 12.2 cm World eIoni - 5 -90.5 mum -19.3 cm 1.41 cm 1.58 GeV 9.38 keV 3.58 cm 15.7 cm World eIoni - 6 -91.2 mum -20 cm 1.41 cm 1.64 GeV 1.55 keV 6.66 mm 16.4 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -90.5 mum -19.3 cm 1.41 cm 1.73 keV 0 eV 0 fm 0 fm World initStep - 1 -86 mum -19.3 cm 1.42 cm 1.38 MeV 1.73 keV 126 mum 126 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -87.1 mum -15.8 cm 1.41 cm 5.54 keV 0 eV 0 fm 0 fm World initStep - 1 -87.6 mum -15.8 cm 1.42 cm 9.26 MeV 5.54 keV 871 mum 871 mum World eIoni + 0 3.24 mum -6.91 cm 1.71 cm 13.7 keV 0 eV 0 fm 0 fm World initStep + 1 44 mum -7.17 cm 1.7 cm 26.9 MeV 3.56 keV 2.57 mm 2.57 mm World eIoni + 2 65.5 mum -15.5 cm 1.7 cm 856 MeV 15.2 keV 8.29 cm 8.54 cm World eIoni + 3 66.6 mum -20 cm 1.7 cm 1.31 GeV 8.95 keV 4.55 cm 13.1 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 3 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -86.6 mum -15.3 cm 1.41 cm 2.12 keV 0 eV 0 fm 0 fm World initStep - 1 -83.3 mum -15.3 cm 1.42 cm 1.87 MeV 2.12 keV 171 mum 171 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -84.2 mum -13.2 cm 1.41 cm 3.46 keV 0 eV 0 fm 0 fm World initStep - 1 -75.2 mum -13.2 cm 1.41 cm 4.13 MeV 3.46 keV 384 mum 384 mum World eIoni + 0 65.5 mum -15.5 cm 1.7 cm 1.6 keV 0 eV 0 fm 0 fm World initStep + 1 72.3 mum -15.5 cm 1.7 cm 1.22 MeV 1.6 keV 111 mum 111 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.3 cm 1.37 cm 1.07 keV 0 eV 0 fm 0 fm World initStep - 1 5 mum -3.31 cm 1.37 cm 701 keV 1.07 keV 63.7 mum 63.7 mum World eIoni + 0 0 fm -4.08 cm 1.46 cm 4.45 keV 0 eV 0 fm 0 fm World initStep + 1 -25.2 mum -4.14 cm 1.46 cm 6.32 MeV 4.45 keV 592 mum 592 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2765,61 +952,36 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.72 cm 1.53 cm 522 MeV 9.49 keV 5.21 cm 5.21 cm World eIoni - 2 -5.03 mum -20 cm 2.22 cm 2.05 GeV 32.8 keV 15.3 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.72 cm 1.53 cm 1.38 keV 0 eV 0 fm 0 fm World initStep - 1 6.59 mum -4.73 cm 1.53 cm 998 keV 1.38 keV 90.8 mum 90.8 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -2.76 cm 1.29 cm 326 MeV 4.38 keV 3.23 cm 3.23 cm World eIoni - 2 800 nm -11 cm 1.93 cm 1.15 GeV 17.7 keV 8.29 cm 11.5 cm World eIoni - 3 7.54 mum -20 cm 2.22 cm 2.05 GeV 18.4 keV 8.98 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -6.51 mm 7.42 mm 115 MeV 1.59 keV 1.04 cm 1.04 cm World eIoni + 2 5.57 mum -8.17 cm 1.79 cm 867 MeV 15 keV 7.62 cm 8.66 cm World eIoni + 3 16.4 mum -20 cm 2.22 cm 2.05 GeV 26.7 keV 11.8 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 800 nm -11 cm 1.93 cm 15.7 keV 0 eV 0 fm 0 fm World initStep - 1 -44.4 mum -11.1 cm 1.93 cm 10.2 MeV 895 eV 995 mum 995 mum World eIoni - 2 -92.3 mum -18.7 cm 1.94 cm 770 MeV 13.5 keV 7.6 cm 7.7 cm World eIoni - 3 -95.8 mum -20 cm 1.94 cm 898 MeV 3.64 keV 1.28 cm 8.98 cm OutOfWorldTransportation + 0 5.57 mum -8.17 cm 1.79 cm 24.1 keV 0 eV 0 fm 0 fm World initStep + 1 -22.6 mum -8.21 cm 1.78 cm 4.23 MeV 764 eV 421 mum 421 mum World eIoni + 2 -56.4 mum -9.56 cm 1.78 cm 138 MeV 1.92 keV 1.34 cm 1.38 cm World eIoni + 3 -69.7 mum -13.5 cm 1.78 cm 533 MeV 6.53 keV 3.95 cm 5.33 cm World eIoni + 4 -77.7 mum -20 cm 1.78 cm 1.18 GeV 13.4 keV 6.49 cm 11.8 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 3 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -92.3 mum -18.7 cm 1.94 cm 41.1 keV 0 eV 0 fm 0 fm World initStep - 1 -26.6 mum -19 cm 1.94 cm 27.6 MeV 1.57 keV 2.71 mm 2.71 mm World eIoni - 2 -11 mum -20 cm 1.95 cm 129 MeV 950 eV 1.01 cm 1.28 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 4 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -26.6 mum -19 cm 1.94 cm 3.39 keV 0 eV 0 fm 0 fm World initStep - 1 -22 mum -19 cm 1.95 cm 3.97 MeV 3.39 keV 369 mum 369 mum World eIoni + 0 -69.7 mum -13.5 cm 1.78 cm 1.34 keV 0 eV 0 fm 0 fm World initStep + 1 -69.4 mum -13.5 cm 1.78 cm 951 keV 1.34 keV 86.5 mum 86.5 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -2.76 cm 1.29 cm 1.25 keV 0 eV 0 fm 0 fm World initStep - 1 -1.05 mum -2.77 cm 1.29 cm 856 keV 1.25 keV 78.3 mum 78.3 mum World eIoni + 0 0 fm -6.51 mm 7.42 mm 1.04 keV 0 eV 0 fm 0 fm World initStep + 1 -4.13 mum -6.57 mm 7.43 mm 677 keV 1.04 keV 60.7 mum 60.7 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2827,25 +989,25 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.72 cm 1.62 cm 622 MeV 12.6 keV 6.21 cm 6.21 cm World eIoni - 2 -2.67 mum -14.6 cm 2.06 cm 1.51 GeV 18.5 keV 8.84 cm 15 cm World eIoni - 3 -2.8 mum -20 cm 2.22 cm 2.05 GeV 11.6 keV 5.45 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -6.11 cm 1.65 cm 661 MeV 12.7 keV 6.59 cm 6.59 cm World eIoni + 2 1.84 mum -13.9 cm 2.04 cm 1.44 GeV 16.5 keV 7.77 cm 14.4 cm World eIoni + 3 3.01 mum -20 cm 2.22 cm 2.05 GeV 12.4 keV 6.14 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -2.67 mum -14.6 cm 2.06 cm 2.63 keV 0 eV 0 fm 0 fm World initStep - 1 -9.6 mum -14.6 cm 2.06 cm 2.62 MeV 2.63 keV 241 mum 241 mum World eIoni + 0 1.84 mum -13.9 cm 2.04 cm 1.64 keV 0 eV 0 fm 0 fm World initStep + 1 -1.58 nm -13.9 cm 2.04 cm 1.27 MeV 1.64 keV 116 mum 116 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.72 cm 1.62 cm 1.04 keV 0 eV 0 fm 0 fm World initStep - 1 4.54 mum -5.73 cm 1.62 cm 672 keV 1.04 keV 61.2 mum 61.2 mum World eIoni + 0 0 fm -6.11 cm 1.65 cm 5.69 keV 0 eV 0 fm 0 fm World initStep + 1 -10.5 mum -6.2 cm 1.65 cm 9.71 MeV 5.69 keV 913 mum 913 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2853,42 +1015,25 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -9.33 cm 1.85 cm 983 MeV 20.2 keV 9.82 cm 9.82 cm World eIoni - 2 -3.49 mum -20 cm 2.22 cm 2.05 GeV 22.6 keV 10.7 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -9.33 cm 1.85 cm 5.42 keV 0 eV 0 fm 0 fm World initStep - 1 20.4 mum -9.42 cm 1.85 cm 8.89 MeV 5.42 keV 835 mum 835 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.05 cm 1.56 cm 555 MeV 10.5 keV 5.53 cm 5.53 cm World eIoni - 2 2.55 mum -11 cm 1.93 cm 1.15 GeV 11.7 keV 6.01 cm 11.5 cm World eIoni - 3 4.14 mum -20 cm 2.22 cm 2.05 GeV 19.5 keV 8.96 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -8.6 cm 1.81 cm 910 MeV 18.4 keV 9.1 cm 9.1 cm World eIoni + 2 1.19 mum -19 cm 2.19 cm 1.95 GeV 22.5 keV 10.4 cm 19.5 cm World eIoni + 3 1.21 mum -20 cm 2.22 cm 2.05 GeV 3.72 keV 1.05 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.55 mum -11 cm 1.93 cm 2.73 keV 0 eV 0 fm 0 fm World initStep - 1 4.51 mum -11.1 cm 1.93 cm 2.79 MeV 2.73 keV 258 mum 258 mum World eIoni + 0 1.19 mum -19 cm 2.19 cm 6.51 keV 0 eV 0 fm 0 fm World initStep + 1 7.24 mum -19.1 cm 2.2 cm 12.3 MeV 6.51 keV 1.16 mm 1.16 mm World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.05 cm 1.56 cm 1.94 keV 0 eV 0 fm 0 fm World initStep - 1 -7.66 mum -5.06 cm 1.56 cm 1.62 MeV 1.94 keV 148 mum 148 mum World eIoni + 0 0 fm -8.6 cm 1.81 cm 1.58 keV 0 eV 0 fm 0 fm World initStep + 1 -3.04 mum -8.62 cm 1.81 cm 1.2 MeV 1.58 keV 109 mum 109 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2896,43 +1041,52 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.56 cm 1.05 cm 206 MeV 3.69 keV 2.01 cm 2.01 cm World eIoni - 2 1.53 mum -9.84 cm 1.88 cm 1.03 GeV 17.3 keV 8.33 cm 10.3 cm World eIoni - 3 -365 nm -18.6 cm 2.19 cm 1.91 GeV 18.5 keV 8.77 cm 19.1 cm World eIoni - 4 -392 nm -18.7 cm 2.19 cm 1.92 GeV 386 eV 1.1 mm 19.2 cm World eIoni - 5 -395 nm -20 cm 2.22 cm 2.05 GeV 4.05 keV 1.28 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -7.84 cm 1.77 cm 834 MeV 16.8 keV 8.33 cm 8.33 cm World eIoni + 2 1.03 mum -9.64 cm 1.86 cm 1.01 GeV 4.6 keV 1.8 cm 10.1 cm World eIoni + 3 1.12 mum -9.89 cm 1.88 cm 1.04 GeV 144 eV 2.53 mm 10.4 cm World eIoni + 4 1.12 mum -10.3 cm 1.9 cm 1.08 GeV 1.06 keV 3.91 mm 10.8 cm World eIoni + 5 2.56 mum -19 cm 2.19 cm 1.95 GeV 18.2 keV 8.69 cm 19.5 cm World eIoni + 6 2.44 mum -20 cm 2.22 cm 2.05 GeV 1.91 keV 1.03 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 2.56 mum -19 cm 2.19 cm 2.47 keV 0 eV 0 fm 0 fm World initStep + 1 14.7 mum -19 cm 2.19 cm 2.37 MeV 2.47 keV 218 mum 218 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -392 nm -18.7 cm 2.19 cm 2.2 keV 0 eV 0 fm 0 fm World initStep - 1 -11.6 mum -18.7 cm 2.19 cm 1.98 MeV 2.2 keV 181 mum 181 mum World eIoni + 0 1.12 mum -10.3 cm 1.9 cm 1.17 keV 0 eV 0 fm 0 fm World initStep + 1 -2.56 mum -10.3 cm 1.9 cm 791 keV 1.17 keV 71.8 mum 71.8 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -365 nm -18.6 cm 2.19 cm 1.24 keV 0 eV 0 fm 0 fm World initStep - 1 2.45 mum -18.6 cm 2.19 cm 855 keV 1.24 keV 77.7 mum 77.7 mum World eIoni + 0 1.12 mum -9.89 cm 1.88 cm 1.03 keV 0 eV 0 fm 0 fm World initStep + 1 5.93 mum -9.9 cm 1.88 cm 664 keV 1.03 keV 60.4 mum 60.4 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 1.53 mum -9.84 cm 1.88 cm 2.6 keV 0 eV 0 fm 0 fm World initStep - 1 12.2 mum -9.86 cm 1.88 cm 2.57 MeV 2.6 keV 237 mum 237 mum World eIoni + 0 1.03 mum -9.64 cm 1.86 cm 2.09 keV 0 eV 0 fm 0 fm World initStep + 1 5.45 mum -9.65 cm 1.86 cm 1.82 MeV 2.09 keV 167 mum 167 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.56 cm 1.05 cm 5.01 keV 0 eV 0 fm 0 fm World initStep - 1 -3.79 mum -1.63 cm 1.05 cm 7.69 MeV 5.01 keV 721 mum 721 mum World eIoni + 0 0 fm -7.84 cm 1.77 cm 2.76 keV 0 eV 0 fm 0 fm World initStep + 1 -14.5 mum -7.87 cm 1.77 cm 2.83 MeV 2.76 keV 262 mum 262 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2940,43 +1094,61 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.54 cm 1.4 cm 404 MeV 9.35 keV 4.01 cm 4.01 cm World eIoni - 2 130 nm -10.6 cm 1.91 cm 1.11 GeV 15.1 keV 7.1 cm 11.1 cm World eIoni - 3 59.7 nm -10.9 cm 1.92 cm 1.14 GeV 1.16 keV 2.5 mm 11.4 cm World eIoni - 4 -1.36 mum -16.2 cm 2.12 cm 1.67 GeV 11.9 keV 5.3 cm 16.7 cm World eIoni - 5 -2.06 mum -20 cm 2.22 cm 2.05 GeV 6.54 keV 3.84 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -12.4 cm 1.99 cm 1.29 GeV 24.6 keV 12.9 cm 12.9 cm World eIoni + 2 -1.71 mum -17.6 cm 2.16 cm 1.81 GeV 11.1 keV 5.27 cm 18.1 cm World eIoni + 3 -1.56 mum -20 cm 2.22 cm 2.05 GeV 5.21 keV 2.38 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.36 mum -16.2 cm 2.12 cm 1.66 keV 0 eV 0 fm 0 fm World initStep - 1 -1.98 mum -16.2 cm 2.12 cm 1.29 MeV 1.66 keV 118 mum 118 mum World eIoni + 0 -1.71 mum -17.6 cm 2.16 cm 22.6 keV 0 eV 0 fm 0 fm World initStep + 1 -13.1 mum -17.6 cm 2.16 cm 1.27 MeV 65.3 eV 130 mum 130 mum World eIoni + 2 -43.8 mum -20 cm 2.15 cm 238 MeV 2.5 keV 2.37 cm 2.38 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -12.4 cm 1.99 cm 5 keV 0 eV 0 fm 0 fm World initStep + 1 20.2 mum -12.4 cm 1.99 cm 7.67 MeV 5 keV 720 mum 720 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -5.2 cm 1.57 cm 570 MeV 11.4 keV 5.68 cm 5.68 cm World eIoni + 2 -1.22 mum -8.31 cm 1.79 cm 881 MeV 7.5 keV 3.12 cm 8.8 cm World eIoni + 3 -4.63 mum -15.1 cm 2.08 cm 1.56 GeV 13.9 keV 6.8 cm 15.6 cm World eIoni + 4 -4.64 mum -20 cm 2.22 cm 2.05 GeV 9.77 keV 4.9 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 59.7 nm -10.9 cm 1.92 cm 1.78 keV 0 eV 0 fm 0 fm World initStep - 1 1.23 mum -10.9 cm 1.92 cm 1.44 MeV 1.78 keV 131 mum 131 mum World eIoni + 0 -4.63 mum -15.1 cm 2.08 cm 5.54 keV 0 eV 0 fm 0 fm World initStep + 1 -30.5 mum -15.2 cm 2.08 cm 9.25 MeV 5.54 keV 870 mum 870 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 130 nm -10.6 cm 1.91 cm 1.04 keV 0 eV 0 fm 0 fm World initStep - 1 5.05 mum -10.6 cm 1.91 cm 674 keV 1.04 keV 61.3 mum 61.3 mum World eIoni + 0 -1.22 mum -8.31 cm 1.79 cm 2.38 keV 0 eV 0 fm 0 fm World initStep + 1 6.7 mum -8.33 cm 1.79 cm 2.22 MeV 2.38 keV 205 mum 205 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.54 cm 1.4 cm 8.46 keV 0 eV 0 fm 0 fm World initStep - 1 -773 nm -3.72 cm 1.39 cm 19.6 MeV 8.46 keV 1.86 mm 1.86 mm World eIoni + 0 0 fm -5.2 cm 1.57 cm 1.29 keV 0 eV 0 fm 0 fm World initStep + 1 4.77 mum -5.2 cm 1.57 cm 897 keV 1.29 keV 81.4 mum 81.4 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -2984,25 +1156,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -18.6 cm 2.19 cm 1.91 GeV 37.6 keV 19.1 cm 19.1 cm World eIoni - 2 2.23 nm -19.9 cm 2.22 cm 2.04 GeV 1.73 keV 1.24 cm 20.4 cm World eIoni - 3 -7.59 nm -20 cm 2.22 cm 2.05 GeV 18.1 eV 1.25 mm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 2.23 nm -19.9 cm 2.22 cm 1.24 keV 0 eV 0 fm 0 fm World initStep - 1 2.79 mum -19.9 cm 2.22 cm 854 keV 1.24 keV 77.6 mum 77.6 mum World eIoni + 1 0 fm -13.3 cm 2.02 cm 1.38 GeV 26.3 keV 13.8 cm 13.8 cm World eIoni + 2 2.38 mum -20 cm 2.22 cm 2.05 GeV 14.5 keV 6.74 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -18.6 cm 2.19 cm 1.1 keV 0 eV 0 fm 0 fm World initStep - 1 -55.2 nm -18.6 cm 2.19 cm 725 keV 1.1 keV 65.9 mum 65.9 mum World eIoni + 0 0 fm -13.3 cm 2.02 cm 3.74 keV 0 eV 0 fm 0 fm World initStep + 1 -20 mum -13.3 cm 2.02 cm 4.69 MeV 3.74 keV 437 mum 437 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3010,43 +1173,36 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -3.32 cm 1.37 cm 382 MeV 9.41 keV 3.79 cm 3.79 cm World eIoni - 2 -1.66 mum -8.42 cm 1.8 cm 892 MeV 10.4 keV 5.12 cm 8.91 cm World eIoni - 3 -948 nm -10.8 cm 1.92 cm 1.13 GeV 4.93 keV 2.44 cm 11.3 cm World eIoni - 4 -841 nm -11.7 cm 1.96 cm 1.22 GeV 1.1 keV 8.14 mm 12.2 cm World eIoni - 5 1.42 mum -20 cm 2.22 cm 2.05 GeV 16.8 keV 8.34 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -841 nm -11.7 cm 1.96 cm 1.67 keV 0 eV 0 fm 0 fm World initStep - 1 -6.4 mum -11.7 cm 1.96 cm 1.31 MeV 1.67 keV 119 mum 119 mum World eIoni + 1 0 fm -6.53 cm 1.68 cm 703 MeV 13.1 keV 7.02 cm 7.02 cm World eIoni + 2 -2.28 mum -14.7 cm 2.07 cm 1.52 GeV 17.8 keV 8.21 cm 15.2 cm World eIoni + 3 -3.4 mum -16.2 cm 2.12 cm 1.67 GeV 3.32 keV 1.49 cm 16.7 cm World eIoni + 4 -5.25 mum -20 cm 2.22 cm 2.05 GeV 10.7 keV 3.79 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -948 nm -10.8 cm 1.92 cm 1.74 keV 0 eV 0 fm 0 fm World initStep - 1 1.94 mum -10.9 cm 1.92 cm 1.39 MeV 1.74 keV 127 mum 127 mum World eIoni + 0 -3.4 mum -16.2 cm 2.12 cm 3.26 keV 0 eV 0 fm 0 fm World initStep + 1 -12.4 mum -16.2 cm 2.12 cm 3.71 MeV 3.26 keV 345 mum 345 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.66 mum -8.42 cm 1.8 cm 2.37 keV 0 eV 0 fm 0 fm World initStep - 1 -13.9 mum -8.44 cm 1.8 cm 2.22 MeV 2.37 keV 204 mum 204 mum World eIoni + 0 -2.28 mum -14.7 cm 2.07 cm 9.27 keV 0 eV 0 fm 0 fm World initStep + 1 16.1 mum -14.7 cm 2.07 cm 1.5 MeV 261 eV 149 mum 149 mum World eIoni + 2 63.7 mum -18.4 cm 2.07 cm 364 MeV 4.67 keV 3.62 cm 3.64 cm World eIoni + 3 66.2 mum -20 cm 2.07 cm 527 MeV 3.31 keV 1.64 cm 5.27 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -3.32 cm 1.37 cm 1.07 keV 0 eV 0 fm 0 fm World initStep - 1 2.98 mum -3.32 cm 1.37 cm 699 keV 1.07 keV 63.8 mum 63.8 mum World eIoni + 0 0 fm -6.53 cm 1.68 cm 4.07 keV 0 eV 0 fm 0 fm World initStep + 1 10.4 mum -6.58 cm 1.68 cm 5.4 MeV 4.07 keV 504 mum 504 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3054,62 +1210,86 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -1.71 cm 1.09 cm 221 MeV 4.13 keV 2.16 cm 2.16 cm World eIoni - 2 -1.92 mum -4.26 cm 1.48 cm 476 MeV 5.63 keV 2.58 cm 4.74 cm World eIoni - 3 -1.37 mum -12 cm 1.97 cm 1.25 GeV 17.6 keV 7.79 cm 12.5 cm World eIoni - 4 -1.16 mum -13.2 cm 2.02 cm 1.37 GeV 1.93 keV 1.18 cm 13.7 cm World eIoni - 5 -4.08 mum -20 cm 2.22 cm 2.05 GeV 14.1 keV 6.79 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -17.1 cm 2.14 cm 1.76 GeV 35.6 keV 17.6 cm 17.6 cm World eIoni + 2 286 nm -18.7 cm 2.19 cm 1.92 GeV 2.79 keV 1.65 cm 19.2 cm World eIoni + 3 338 nm -20 cm 2.22 cm 2.05 GeV 2.99 keV 1.27 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.16 mum -13.2 cm 2.02 cm 17.6 keV 0 eV 0 fm 0 fm World initStep - 1 49.2 mum -13.4 cm 2.02 cm 18.9 MeV 3.08 keV 1.83 mm 1.83 mm World eIoni - 2 78.3 mum -17.1 cm 2.03 cm 392 MeV 6.17 keV 3.73 cm 3.91 cm World eIoni - 3 83.5 mum -18.7 cm 2.03 cm 552 MeV 4.19 keV 1.6 cm 5.52 cm World eIoni - 4 86.7 mum -20 cm 2.03 cm 680 MeV 1.9 keV 1.28 cm 6.79 cm OutOfWorldTransportation + 0 286 nm -18.7 cm 2.19 cm 2.52 keV 0 eV 0 fm 0 fm World initStep + 1 6.37 mum -18.8 cm 2.19 cm 2.43 MeV 2.52 keV 224 mum 224 mum World eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 5 +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 83.5 mum -18.7 cm 2.03 cm 1.11 keV 0 eV 0 fm 0 fm World initStep - 1 82 mum -18.7 cm 2.03 cm 735 keV 1.11 keV 66.8 mum 66.8 mum World eIoni + 0 0 fm -17.1 cm 2.14 cm 1 keV 0 eV 0 fm 0 fm World initStep + 1 -4.68 mum -17.1 cm 2.14 cm 637 keV 1 keV 57.9 mum 57.9 mum World eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 5 +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 78.3 mum -17.1 cm 2.03 cm 3.3 keV 0 eV 0 fm 0 fm World initStep - 1 60.6 mum -17.2 cm 2.03 cm 3.8 MeV 3.3 keV 353 mum 353 mum World eIoni + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.01 cm 1.16 cm 251 MeV 8.06 keV 2.46 cm 2.46 cm World eIoni + 2 -7.69 mum -18.3 cm 2.18 cm 1.88 GeV 32.3 keV 16.3 cm 18.8 cm World eIoni + 3 -7.77 mum -20 cm 2.22 cm 2.05 GeV 2.22 keV 1.71 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -7.69 mum -18.3 cm 2.18 cm 1.18 keV 0 eV 0 fm 0 fm World initStep + 1 -12.3 mum -18.3 cm 2.18 cm 796 keV 1.18 keV 72.4 mum 72.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.01 cm 1.16 cm 1.73 keV 0 eV 0 fm 0 fm World initStep + 1 7.75 mum -2.02 cm 1.15 cm 1.37 MeV 1.73 keV 125 mum 125 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -14.8 cm 2.07 cm 1.53 GeV 28.8 keV 15.3 cm 15.3 cm World eIoni + 2 -597 nm -18 cm 2.17 cm 1.85 GeV 7.62 keV 3.2 cm 18.5 cm World eIoni + 3 -276 nm -19.9 cm 2.22 cm 2.04 GeV 5.53 keV 1.89 cm 20.4 cm World eIoni + 4 -247 nm -20 cm 2.22 cm 2.05 GeV 77.7 eV 806 mum 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.37 mum -12 cm 1.97 cm 1.58 keV 0 eV 0 fm 0 fm World initStep - 1 -4.67 mum -12 cm 1.97 cm 1.19 MeV 1.58 keV 109 mum 109 mum World eIoni + 0 -276 nm -19.9 cm 2.22 cm 2.05 keV 0 eV 0 fm 0 fm World initStep + 1 -9.6 mum -19.9 cm 2.22 cm 1.78 MeV 2.05 keV 163 mum 163 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -1.92 mum -4.26 cm 1.48 cm 1e+03 eV 0 eV 0 fm 0 fm World initStep - 1 -6.39 mum -4.26 cm 1.48 cm 634 keV 1e+03 eV 57.8 mum 57.8 mum World eIoni + 0 -597 nm -18 cm 2.17 cm 4.47 keV 0 eV 0 fm 0 fm World initStep + 1 -24.8 mum -18.1 cm 2.17 cm 6.38 MeV 4.47 keV 597 mum 597 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -1.71 cm 1.09 cm 1.05 keV 0 eV 0 fm 0 fm World initStep - 1 3.72 mum -1.72 cm 1.09 cm 678 keV 1.05 keV 61.9 mum 61.9 mum World eIoni + 0 0 fm -14.8 cm 2.07 cm 2.37 keV 0 eV 0 fm 0 fm World initStep + 1 7.83 mum -14.8 cm 2.07 cm 2.22 MeV 2.37 keV 204 mum 204 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3117,16 +1297,16 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -4.58 cm 1.52 cm 508 MeV 10.9 keV 5.06 cm 5.06 cm World eIoni - 2 3.37 mum -20 cm 2.22 cm 2.05 GeV 32.9 keV 15.4 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -5.38 cm 1.59 cm 588 MeV 11.8 keV 5.86 cm 5.86 cm World eIoni + 2 -4.85 mum -20 cm 2.22 cm 2.05 GeV 29.9 keV 14.6 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -4.58 cm 1.52 cm 1.6 keV 0 eV 0 fm 0 fm World initStep - 1 -4.68 mum -4.59 cm 1.51 cm 1.21 MeV 1.6 keV 111 mum 111 mum World eIoni + 0 0 fm -5.38 cm 1.59 cm 1.92 keV 0 eV 0 fm 0 fm World initStep + 1 8.45 mum -5.39 cm 1.59 cm 1.6 MeV 1.92 keV 146 mum 146 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3134,25 +1314,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -11.5 cm 1.95 cm 1.2 GeV 23.3 keV 12 cm 12 cm World eIoni - 2 -30.6 nm -14.9 cm 2.08 cm 1.54 GeV 7.59 keV 3.33 cm 15.4 cm World eIoni - 3 -1.43 mum -20 cm 2.22 cm 2.05 GeV 10.9 keV 5.13 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -30.6 nm -14.9 cm 2.08 cm 5.29 keV 0 eV 0 fm 0 fm World initStep - 1 19.9 mum -15 cm 2.07 cm 8.5 MeV 5.29 keV 799 mum 799 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -11.5 cm 1.95 cm 994 eV 0 eV 0 fm 0 fm World initStep - 1 184 nm -11.5 cm 1.95 cm 632 keV 994 eV 57.4 mum 57.4 mum World eIoni + 1 0 fm -20 cm 2.22 cm 2.05 GeV 40.5 keV 20.5 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3160,53 +1322,7 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -13.4 cm 2.02 cm 1.39 GeV 26.7 keV 13.9 cm 13.9 cm World eIoni - 2 4.73 mum -20 cm 2.22 cm 2.05 GeV 15.2 keV 6.64 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -13.4 cm 2.02 cm 14.3 keV 0 eV 0 fm 0 fm World initStep - 1 -70 mum -13.6 cm 2.02 cm 21.2 MeV 3.98 keV 2.03 mm 2.03 mm World eIoni - 2 -79.5 mum -13.8 cm 2.02 cm 47.2 MeV 150 eV 2.6 mm 4.64 mm World eIoni - 3 -89.4 mum -14.8 cm 2.02 cm 142 MeV 2.02 keV 9.53 mm 1.42 cm World eIoni - 4 -94.5 mum -16 cm 2.02 cm 270 MeV 3.45 keV 1.27 cm 2.69 cm World eIoni - 5 -98 mum -18.9 cm 2.02 cm 558 MeV 5.96 keV 2.88 cm 5.57 cm World eIoni - 6 -98.4 mum -20 cm 2.02 cm 665 MeV 2.7 keV 1.07 cm 6.64 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -98 mum -18.9 cm 2.02 cm 4.33 keV 0 eV 0 fm 0 fm World initStep - 1 -106 mum -19 cm 2.02 cm 6.03 MeV 4.33 keV 564 mum 564 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -94.5 mum -16 cm 2.02 cm 1.03 keV 0 eV 0 fm 0 fm World initStep - 1 -99.1 mum -16.1 cm 2.02 cm 659 keV 1.03 keV 59.9 mum 59.9 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -89.4 mum -14.8 cm 2.02 cm 1.56 keV 0 eV 0 fm 0 fm World initStep - 1 -91.2 mum -14.8 cm 2.02 cm 1.18 MeV 1.56 keV 107 mum 107 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -79.5 mum -13.8 cm 2.02 cm 1.18 keV 0 eV 0 fm 0 fm World initStep - 1 -84.5 mum -13.8 cm 2.02 cm 800 keV 1.18 keV 72.7 mum 72.7 mum World eIoni + 1 0 fm -20 cm 2.22 cm 2.05 GeV 38.1 keV 20.5 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3214,16 +1330,17 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -6.69 cm 1.69 cm 719 MeV 13.9 keV 7.18 cm 7.18 cm World eIoni - 2 7.53 mum -20 cm 2.22 cm 2.05 GeV 28.8 keV 13.3 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -19.6 cm 2.21 cm 2.01 GeV 37 keV 20.1 cm 20.1 cm World eIoni + 2 -119 nm -20 cm 2.22 cm 2.05 GeV 1.14 keV 4.33 mm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -6.69 cm 1.69 cm 9.18 keV 0 eV 0 fm 0 fm World initStep - 1 -46.8 mum -6.91 cm 1.7 cm 22.8 MeV 9.18 keV 2.15 mm 2.15 mm World eIoni + 0 0 fm -19.6 cm 2.21 cm 64.9 keV 0 eV 0 fm 0 fm World initStep + 1 25.6 mum -19.8 cm 2.22 cm 20.8 MeV 824 eV 2.06 mm 2.06 mm World eIoni + 2 29.7 mum -20 cm 2.22 cm 43.9 MeV 615 eV 2.31 mm 4.37 mm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3239,71 +1356,43 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -5.12 mm 6.69 mm 101 MeV 2.13 keV 8.83 mm 8.83 mm World eIoni - 2 6.58 mum -10.5 cm 1.91 cm 1.1 GeV 20.5 keV 10.2 cm 11 cm World eIoni - 3 7.43 mum -12.1 cm 1.97 cm 1.26 GeV 3.33 keV 1.58 cm 12.6 cm World eIoni - 4 9.19 mum -14.8 cm 2.07 cm 1.53 GeV 6.2 keV 2.67 cm 15.3 cm World eIoni - 5 9.82 mum -16.6 cm 2.13 cm 1.71 GeV 3.62 keV 1.8 cm 17.1 cm World eIoni - 6 10.3 mum -17.6 cm 2.16 cm 1.81 GeV 1.32 keV 1.01 cm 18.1 cm World eIoni - 7 11.1 mum -20 cm 2.22 cm 2.05 GeV 6.26 keV 2.4 cm 20.5 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 10.3 mum -17.6 cm 2.16 cm 1.22 keV 0 eV 0 fm 0 fm World initStep - 1 15.2 mum -17.6 cm 2.16 cm 831 keV 1.22 keV 75.7 mum 75.7 mum World eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 9.82 mum -16.6 cm 2.13 cm 1.26 keV 0 eV 0 fm 0 fm World initStep - 1 4.2 mum -16.6 cm 2.13 cm 865 keV 1.26 keV 78.7 mum 78.7 mum World eIoni + 1 0 fm -3.47 mm 5.63 mm 84.7 MeV 1.19 keV 6.86 mm 6.86 mm World eIoni + 2 3.41 mum -1.69 cm 1.09 cm 219 MeV 3.44 keV 1.45 cm 2.14 cm World eIoni + 3 1.96 mum -8.49 cm 1.8 cm 899 MeV 14.3 keV 6.84 cm 8.98 cm World eIoni + 4 1.94 mum -8.6 cm 1.81 cm 910 MeV 152 eV 1.1 mm 9.09 cm World eIoni + 5 -4.57 mum -20 cm 2.22 cm 2.05 GeV 22.2 keV 11.4 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 9.19 mum -14.8 cm 2.07 cm 1.21 keV 0 eV 0 fm 0 fm World initStep - 1 15 mum -14.8 cm 2.07 cm 820 keV 1.21 keV 74.6 mum 74.6 mum World eIoni + 0 1.94 mum -8.6 cm 1.81 cm 5.03 keV 0 eV 0 fm 0 fm World initStep + 1 26.1 mum -8.67 cm 1.81 cm 7.74 MeV 5.03 keV 726 mum 726 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 7.43 mum -12.1 cm 1.97 cm 1.41 keV 0 eV 0 fm 0 fm World initStep - 1 2.23 mum -12.1 cm 1.98 cm 1.03 MeV 1.41 keV 93.3 mum 93.3 mum World eIoni + 0 1.96 mum -8.49 cm 1.8 cm 1.07 keV 0 eV 0 fm 0 fm World initStep + 1 3.56 mum -8.49 cm 1.8 cm 697 keV 1.07 keV 63.2 mum 63.2 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 6.58 mum -10.5 cm 1.91 cm 5.2 keV 0 eV 0 fm 0 fm World initStep - 1 -2.96 mum -10.6 cm 1.91 cm 2.73 MeV 442 eV 260 mum 260 mum World eIoni - 2 -23.1 mum -18.6 cm 1.91 cm 804 MeV 11.4 keV 8.01 cm 8.04 cm World eIoni - 3 -23.6 mum -20 cm 1.91 cm 946 MeV 3.38 keV 1.42 cm 9.46 cm OutOfWorldTransportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 3 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 -23.1 mum -18.6 cm 1.91 cm 1.06 keV 0 eV 0 fm 0 fm World initStep - 1 -23.1 mum -18.6 cm 1.91 cm 689 keV 1.06 keV 62.6 mum 62.6 mum World eIoni + 0 3.41 mum -1.69 cm 1.09 cm 2.61 keV 0 eV 0 fm 0 fm World initStep + 1 14.8 mum -1.72 cm 1.09 cm 2.59 MeV 2.61 keV 239 mum 239 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -5.12 mm 6.69 mm 1.4 keV 0 eV 0 fm 0 fm World initStep - 1 -4.98 mum -5.21 mm 6.7 mm 1.03 MeV 1.4 keV 91.9 mum 91.9 mum World eIoni + 0 0 fm -3.47 mm 5.63 mm 1.68 keV 0 eV 0 fm 0 fm World initStep + 1 -6.83 mum -3.59 mm 5.63 mm 1.33 MeV 1.68 keV 120 mum 120 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 @@ -3311,30 +1400,1592 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Ne Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm -970 mum 3.08 mm 59.6 MeV 1.79 keV 3.28 mm 3.28 mm World eIoni - 2 -71 mum -20 cm 2.21 cm 2.05 GeV 38.7 keV 20.2 cm 20.5 cm OutOfWorldTransportation + 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -18 cm 2.17 cm 1.85 GeV 37 keV 18.5 cm 18.5 cm World eIoni + 2 -60.9 nm -20 cm 2.22 cm 2.05 GeV 7.17 keV 2 cm 20.5 cm OutOfWorldTransportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 0 fm -970 mum 3.08 mm 65.5 keV 0 eV 0 fm 0 fm World initStep - 1 82.7 mum -2.62 mm 3.15 mm 17 MeV 282 eV 1.7 mm 1.7 mm World eIoni - 2 166 mum -15.1 cm 3.22 mm 1.5 GeV 24.8 keV 14.8 cm 15 cm World eIoni - 3 171 mum -20 cm 3.22 mm 1.99 GeV 10.4 keV 4.9 cm 19.9 cm OutOfWorldTransportation + 0 0 fm -18 cm 2.17 cm 1.34 keV 0 eV 0 fm 0 fm World initStep + 1 1.04 mum -18 cm 2.17 cm 953 keV 1.34 keV 86.7 mum 86.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -15.1 cm 2.08 cm 1.56 GeV 29.8 keV 15.6 cm 15.6 cm World eIoni + 2 1.16 mum -20 cm 2.22 cm 2.05 GeV 10.5 keV 4.9 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -15.1 cm 2.08 cm 3.57 keV 0 eV 0 fm 0 fm World initStep + 1 -13.7 mum -15.1 cm 2.08 cm 4.34 MeV 3.57 keV 404 mum 404 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -16 cm 2.11 cm 1.65 GeV 31.8 keV 16.5 cm 16.5 cm World eIoni + 2 -956 nm -20 cm 2.22 cm 2.05 GeV 9.15 keV 3.96 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -16 cm 2.11 cm 1.95 keV 0 eV 0 fm 0 fm World initStep + 1 9.8 mum -16.1 cm 2.11 cm 1.63 MeV 1.95 keV 149 mum 149 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.21 cm 1.2 cm 271 MeV 4.49 keV 2.67 cm 2.67 cm World eIoni + 2 808 nm -2.96 cm 1.32 cm 346 MeV 2.82 keV 7.55 mm 3.42 cm World eIoni + 3 9.21 mum -12.7 cm 2 cm 1.32 GeV 19.2 keV 9.75 cm 13.2 cm World eIoni + 4 14.1 mum -20 cm 2.22 cm 2.05 GeV 15.4 keV 7.32 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 9.21 mum -12.7 cm 2 cm 3.08 keV 0 eV 0 fm 0 fm World initStep + 1 4.35 mum -12.7 cm 2 cm 295 keV 642 eV 30.1 mum 30.1 mum World eIoni + 2 -17.7 mum -13.3 cm 2 cm 64.2 MeV 447 eV 6.39 mm 6.42 mm World eIoni + 3 -29.1 mum -19.1 cm 1.99 cm 639 MeV 10.7 keV 5.75 cm 6.39 cm World eIoni + 4 -29.8 mum -20 cm 1.99 cm 732 MeV 2.01 keV 9.28 mm 7.32 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -29.1 mum -19.1 cm 1.99 cm 1.61 keV 0 eV 0 fm 0 fm World initStep + 1 -23.3 mum -19.1 cm 2 cm 1.23 MeV 1.61 keV 112 mum 112 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 808 nm -2.96 cm 1.32 cm 2.97 keV 0 eV 0 fm 0 fm World initStep + 1 -7.81 mum -2.99 cm 1.32 cm 3.2 MeV 2.97 keV 296 mum 296 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.21 cm 1.2 cm 1.47 keV 0 eV 0 fm 0 fm World initStep + 1 -6.05 mum -2.22 cm 1.2 cm 1.08 MeV 1.47 keV 98.7 mum 98.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -4.64 cm 1.52 cm 513 MeV 9.69 keV 5.12 cm 5.12 cm World eIoni + 2 -4.39 mum -20 cm 2.22 cm 2.05 GeV 32.6 keV 15.4 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -4.64 cm 1.52 cm 4.49 keV 0 eV 0 fm 0 fm World initStep + 1 9.17 mum -4.67 cm 1.52 cm 3.39 MeV 2.92 keV 320 mum 320 mum World eIoni + 2 26.4 mum -13.3 cm 1.53 cm 871 MeV 13.3 keV 8.67 cm 8.71 cm World eIoni + 3 27 mum -14.8 cm 1.53 cm 1.01 GeV 4.32 keV 1.43 cm 10.1 cm World eIoni + 4 27.3 mum -20 cm 1.53 cm 1.54 GeV 10.8 keV 5.23 cm 15.4 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 2 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 27 mum -14.8 cm 1.53 cm 1.58 keV 0 eV 0 fm 0 fm World initStep + 1 31.2 mum -14.8 cm 1.53 cm 1.2 MeV 1.58 keV 109 mum 109 mum World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 2 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process - 0 166 mum -15.1 cm 3.22 mm 8.62 keV 0 eV 0 fm 0 fm World initStep - 1 183 mum -15.3 cm 3.16 mm 20.3 MeV 8.62 keV 1.92 mm 1.92 mm World eIoni + 0 26.4 mum -13.3 cm 1.53 cm 1.5 keV 0 eV 0 fm 0 fm World initStep + 1 25.6 mum -13.4 cm 1.53 cm 1.11 MeV 1.5 keV 101 mum 101 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -16.5 cm 2.13 cm 1.7 GeV 30.8 keV 17 cm 17 cm World eIoni + 2 452 nm -18.5 cm 2.18 cm 1.9 GeV 4.45 keV 1.97 cm 19 cm World eIoni + 3 482 nm -20 cm 2.22 cm 2.05 GeV 2.26 keV 1.49 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 452 nm -18.5 cm 2.18 cm 1.39 keV 0 eV 0 fm 0 fm World initStep + 1 7.12 mum -18.5 cm 2.18 cm 1e+03 keV 1.39 keV 91 mum 91 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -16.5 cm 2.13 cm 1.68 keV 0 eV 0 fm 0 fm World initStep + 1 -8.31 mum -16.6 cm 2.13 cm 1.32 MeV 1.68 keV 120 mum 120 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -4.65 cm 1.52 cm 515 MeV 10.1 keV 5.13 cm 5.13 cm World eIoni + 2 -3.24 mum -7.82 cm 1.76 cm 831 MeV 5.19 keV 3.18 cm 8.3 cm World eIoni + 3 -6.66 mum -20 cm 2.22 cm 2.05 GeV 25.1 keV 12.2 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -3.24 mum -7.82 cm 1.76 cm 1.5 keV 0 eV 0 fm 0 fm World initStep + 1 -8.83 mum -7.83 cm 1.77 cm 1.12 MeV 1.5 keV 102 mum 102 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -4.65 cm 1.52 cm 4.71 keV 0 eV 0 fm 0 fm World initStep + 1 26.3 mum -4.71 cm 1.52 cm 6.96 MeV 4.71 keV 653 mum 653 mum World eIoni + +---> Begin of Event: 50 + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 41.1 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -8.47 cm 1.8 cm 897 MeV 17.3 keV 8.96 cm 8.96 cm World eIoni + 2 1.43 mum -19.3 cm 2.2 cm 1.98 GeV 24.4 keV 10.9 cm 19.8 cm World eIoni + 3 1.69 mum -20 cm 2.22 cm 2.05 GeV 1.52 keV 6.51 mm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 1.43 mum -19.3 cm 2.2 cm 5.74 keV 0 eV 0 fm 0 fm World initStep + 1 -27.3 mum -19.4 cm 2.2 cm 9.84 MeV 5.74 keV 926 mum 926 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -8.47 cm 1.8 cm 1.46 keV 0 eV 0 fm 0 fm World initStep + 1 -3.31 mum -8.48 cm 1.8 cm 1.07 MeV 1.46 keV 98 mum 98 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -5.72 cm 1.62 cm 622 MeV 10.8 keV 6.2 cm 6.2 cm World eIoni + 2 -4.27 mum -20 cm 2.22 cm 2.05 GeV 29.2 keV 14.3 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -5.72 cm 1.62 cm 2.95 keV 0 eV 0 fm 0 fm World initStep + 1 10.3 mum -5.75 cm 1.62 cm 3.15 MeV 2.95 keV 292 mum 292 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.83 cm 1.7 cm 733 MeV 14.4 keV 7.32 cm 7.32 cm World eIoni + 2 -519 nm -11.1 cm 1.93 cm 1.16 GeV 10.3 keV 4.25 cm 11.6 cm World eIoni + 3 -1.39 mum -13.6 cm 2.03 cm 1.41 GeV 4.53 keV 2.54 cm 14.1 cm World eIoni + 4 -2.06 mum -20 cm 2.22 cm 2.05 GeV 14.3 keV 6.39 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.39 mum -13.6 cm 2.03 cm 5.01 keV 0 eV 0 fm 0 fm World initStep + 1 -12 mum -13.7 cm 2.03 cm 7.68 MeV 5.01 keV 721 mum 721 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -519 nm -11.1 cm 1.93 cm 1.38 keV 0 eV 0 fm 0 fm World initStep + 1 5.35 mum -11.1 cm 1.93 cm 997 keV 1.38 keV 90.7 mum 90.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.83 cm 1.7 cm 1.72 keV 0 eV 0 fm 0 fm World initStep + 1 2.31 mum -6.85 cm 1.7 cm 1.36 MeV 1.72 keV 124 mum 124 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -13 cm 2.01 cm 1.35 GeV 26.9 keV 13.5 cm 13.5 cm World eIoni + 2 -877 nm -20 cm 2.22 cm 2.05 GeV 14.7 keV 7 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -13 cm 2.01 cm 1 keV 0 eV 0 fm 0 fm World initStep + 1 3.08 mum -13 cm 2.01 cm 636 keV 1 keV 57.9 mum 57.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -3.06 mm 5.31 mm 80.6 MeV 717 eV 6.35 mm 6.35 mm World eIoni + 2 -616 nm -7.38 mm 7.83 mm 124 MeV 1.29 keV 5 mm 1.14 cm World eIoni + 3 -12.7 mum -17.4 cm 2.15 cm 1.79 GeV 32.8 keV 16.7 cm 17.9 cm World eIoni + 4 -13.5 mum -20 cm 2.22 cm 2.05 GeV 5.79 keV 2.62 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -12.7 mum -17.4 cm 2.15 cm 1.77 keV 0 eV 0 fm 0 fm World initStep + 1 -9.32 mum -17.4 cm 2.15 cm 1.42 MeV 1.77 keV 130 mum 130 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -616 nm -7.38 mm 7.83 mm 1.29 keV 0 eV 0 fm 0 fm World initStep + 1 4.83 mum -7.46 mm 7.82 mm 899 keV 1.29 keV 82.3 mum 82.3 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -3.06 mm 5.31 mm 1.05 keV 0 eV 0 fm 0 fm World initStep + 1 1.82 mum -3.12 mm 5.31 mm 675 keV 1.05 keV 62.2 mum 62.2 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.08 cm 1.17 cm 258 MeV 3.91 keV 2.53 cm 2.53 cm World eIoni + 2 -3.79 mum -11.7 cm 1.96 cm 1.22 GeV 20.4 keV 9.64 cm 12.2 cm World eIoni + 3 1.92 mum -13.2 cm 2.02 cm 1.37 GeV 4.52 keV 1.52 cm 13.7 cm World eIoni + 4 22.7 mum -20 cm 2.22 cm 2.05 GeV 14.3 keV 6.8 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 1.92 mum -13.2 cm 2.02 cm 8.4 keV 0 eV 0 fm 0 fm World initStep + 1 -17.1 mum -13.4 cm 2.02 cm 19.4 MeV 8.4 keV 1.83 mm 1.83 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -3.79 mum -11.7 cm 1.96 cm 361 keV 0 eV 0 fm 0 fm World initStep + 1 -289 mum -12.7 cm 1.98 cm 105 MeV 2.57 keV 1.05 cm 1.05 cm World eIoni + 2 -394 mum -20 cm 1.98 cm 833 MeV 14.5 keV 7.28 cm 8.33 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.08 cm 1.17 cm 2.03 keV 0 eV 0 fm 0 fm World initStep + 1 5.54 mum -2.09 cm 1.17 cm 1.75 MeV 2.03 keV 159 mum 159 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.9 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -1.69 cm 1.09 cm 219 MeV 2.86 keV 2.14 cm 2.14 cm World eIoni + 2 -17.7 mum -4.57 cm 1.51 cm 507 MeV 8.43 keV 2.91 cm 5.05 cm World eIoni + 3 -29.9 mum -7.09 cm 1.72 cm 759 MeV 4.11 keV 2.53 cm 7.58 cm World eIoni + 4 -38.4 mum -9.23 cm 1.85 cm 973 MeV 3.55 keV 2.14 cm 9.72 cm World eIoni + 5 -48.9 mum -12.1 cm 1.98 cm 1.26 GeV 5.22 keV 2.9 cm 12.6 cm World eIoni + 6 -69.2 mum -19.5 cm 2.21 cm 2 GeV 15.1 keV 7.38 cm 20 cm World eIoni + 7 -70.4 mum -20 cm 2.22 cm 2.05 GeV 551 eV 5.01 mm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -69.2 mum -19.5 cm 2.21 cm 2.05 keV 0 eV 0 fm 0 fm World initStep + 1 -59.6 mum -19.5 cm 2.21 cm 1.76 MeV 2.05 keV 161 mum 161 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -48.9 mum -12.1 cm 1.98 cm 2.52 keV 0 eV 0 fm 0 fm World initStep + 1 -38.3 mum -12.1 cm 1.98 cm 2.44 MeV 2.52 keV 225 mum 225 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -38.4 mum -9.23 cm 1.85 cm 7.15 keV 0 eV 0 fm 0 fm World initStep + 1 -8.49 mum -9.36 cm 1.84 cm 14.6 MeV 7.15 keV 1.37 mm 1.37 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -29.9 mum -7.09 cm 1.72 cm 1.92 keV 0 eV 0 fm 0 fm World initStep + 1 -20.2 mum -7.11 cm 1.72 cm 1.6 MeV 1.92 keV 147 mum 147 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -17.7 mum -4.57 cm 1.51 cm 16.5 keV 0 eV 0 fm 0 fm World initStep + 1 56.2 mum -4.94 cm 1.51 cm 39.8 MeV 5.84 keV 3.81 mm 3.81 mm World eIoni + 2 73.4 mum -7.23 cm 1.51 cm 269 MeV 5.17 keV 2.29 cm 2.67 cm WorldTransportation + 3 73.4 mum -7.23 cm 1.51 cm 269 MeV 0 eV 0.00548 fm 2.67 cm World eIoni + 4 95.6 mum -20 cm 1.5 cm 1.55 GeV 25.8 keV 12.8 cm 15.4 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 3 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 73.4 mum -7.23 cm 1.51 cm 1.83 keV 0 eV 0 fm 0 fm World initStep + 1 65.8 mum -7.24 cm 1.5 cm 1.5 MeV 1.83 keV 137 mum 137 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -1.69 cm 1.09 cm 44.8 keV 0 eV 0 fm 0 fm World initStep + 1 155 mum -2.14 cm 1.08 cm 47 MeV 1.85 keV 4.59 mm 4.59 mm World eIoni + 2 225 mum -15 cm 1.08 cm 1.33 GeV 23.8 keV 12.9 cm 13.3 cm World eBrem + 3 232 mum -20 cm 1.08 cm 1.83 GeV 10.2 keV 4.98 cm 18.3 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.25 cm 1.2 cm 275 MeV 6.24 keV 2.71 cm 2.71 cm World eIoni + 2 -2.24 mum -4.88 cm 1.54 cm 538 MeV 4.37 keV 2.65 cm 5.36 cm World eIoni + 3 -1.39 mum -6.56 cm 1.68 cm 706 MeV 3.65 keV 1.69 cm 7.04 cm World eIoni + 4 -1.17 mum -11.9 cm 1.97 cm 1.24 GeV 11.6 keV 5.35 cm 12.4 cm World eIoni + 5 -1.35 mum -14.2 cm 2.05 cm 1.47 GeV 5.32 keV 2.32 cm 14.7 cm World eIoni + 6 -401 nm -20 cm 2.22 cm 2.05 GeV 12.6 keV 5.79 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.35 mum -14.2 cm 2.05 cm 1.69 keV 0 eV 0 fm 0 fm World initStep + 1 -9.23 mum -14.2 cm 2.05 cm 1.34 MeV 1.69 keV 122 mum 122 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.17 mum -11.9 cm 1.97 cm 1.09 keV 0 eV 0 fm 0 fm World initStep + 1 1.02 mum -11.9 cm 1.97 cm 712 keV 1.09 keV 64.9 mum 64.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.39 mum -6.56 cm 1.68 cm 2.19 keV 0 eV 0 fm 0 fm World initStep + 1 5 mum -6.57 cm 1.68 cm 1.97 MeV 2.19 keV 181 mum 181 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -2.24 mum -4.88 cm 1.54 cm 4.07 keV 0 eV 0 fm 0 fm World initStep + 1 -24.8 mum -4.93 cm 1.54 cm 5.39 MeV 4.07 keV 503 mum 503 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.25 cm 1.2 cm 1.07 keV 0 eV 0 fm 0 fm World initStep + 1 5.08 mum -2.26 cm 1.2 cm 701 keV 1.07 keV 63.8 mum 63.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -4.12 cm 1.47 cm 462 MeV 8.04 keV 4.59 cm 4.59 cm World eIoni + 2 290 nm -8.18 cm 1.79 cm 868 MeV 6.28 keV 4.08 cm 8.67 cm World eIoni + 3 -1.89 mum -16.1 cm 2.11 cm 1.66 GeV 16.9 keV 7.91 cm 16.6 cm World eIoni + 4 -2.57 mum -18.4 cm 2.18 cm 1.89 GeV 5.84 keV 2.34 cm 18.9 cm World eIoni + 5 -3.06 mum -20 cm 2.22 cm 2.05 GeV 2.5 keV 1.59 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -2.57 mum -18.4 cm 2.18 cm 2.45 keV 0 eV 0 fm 0 fm World initStep + 1 -146 nm -18.4 cm 2.18 cm 2.33 MeV 2.45 keV 215 mum 215 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.89 mum -16.1 cm 2.11 cm 1.07 keV 0 eV 0 fm 0 fm World initStep + 1 883 nm -16.1 cm 2.11 cm 697 keV 1.07 keV 63.3 mum 63.3 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 290 nm -8.18 cm 1.79 cm 1.86 keV 0 eV 0 fm 0 fm World initStep + 1 8.47 mum -8.19 cm 1.79 cm 1.54 MeV 1.86 keV 140 mum 140 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -4.12 cm 1.47 cm 3.24 keV 0 eV 0 fm 0 fm World initStep + 1 -1.4 mum -4.15 cm 1.47 cm 3.68 MeV 3.24 keV 341 mum 341 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -3.57 cm 1.4 cm 407 MeV 10.4 keV 4.05 cm 4.05 cm World eIoni + 2 2.5 mum -20 cm 2.22 cm 2.05 GeV 34.1 keV 16.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -3.57 cm 1.4 cm 1.11 keV 0 eV 0 fm 0 fm World initStep + 1 -2.4 mum -3.58 cm 1.4 cm 729 keV 1.11 keV 66.5 mum 66.5 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -7.99 cm 1.78 cm 849 MeV 17.2 keV 8.48 cm 8.48 cm World eIoni + 2 -9.97 Ang -7.99 cm 1.78 cm 849 MeV 0 eV 16.4 mum 8.48 cm World eIoni + 3 -1.18 mum -13.3 cm 2.02 cm 1.38 GeV 11.3 keV 5.28 cm 13.8 cm World eIoni + 4 -2.27 mum -18.1 cm 2.17 cm 1.86 GeV 10.6 keV 4.79 cm 18.6 cm World eIoni + 5 -2.44 mum -20 cm 2.22 cm 2.05 GeV 3.05 keV 1.94 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -2.27 mum -18.1 cm 2.17 cm 14.6 keV 0 eV 0 fm 0 fm World initStep + 1 -21.4 mum -18.6 cm 2.16 cm 52.9 MeV 14.6 keV 5.03 mm 5.03 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.18 mum -13.3 cm 2.02 cm 3.85 keV 0 eV 0 fm 0 fm World initStep + 1 2.85 mum -13.3 cm 2.02 cm 4.92 MeV 3.85 keV 458 mum 458 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -9.97 Ang -7.99 cm 1.78 cm 1.36 keV 0 eV 0 fm 0 fm World initStep + 1 -4.8 mum -8 cm 1.78 cm 975 keV 1.36 keV 88.8 mum 88.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -7.99 cm 1.78 cm 3.03 keV 0 eV 0 fm 0 fm World initStep + 1 15 mum -8.02 cm 1.78 cm 3.3 MeV 3.03 keV 305 mum 305 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.31 cm 1.21 cm 281 MeV 5.53 keV 2.77 cm 2.77 cm World eIoni + 2 -6.9 mum -20 cm 2.22 cm 2.05 GeV 37.1 keV 17.7 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.31 cm 1.21 cm 1.3 keV 0 eV 0 fm 0 fm World initStep + 1 5.93 mum -2.32 cm 1.21 cm 909 keV 1.3 keV 82.8 mum 82.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.69 mm 7.51 mm 117 MeV 1.79 keV 1.06 cm 1.06 cm World eIoni + 2 6.57 mum -8.29 cm 1.79 cm 879 MeV 15.7 keV 7.72 cm 8.78 cm World eIoni + 3 11.2 mum -20 cm 2.22 cm 2.05 GeV 24.9 keV 11.7 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 6.57 mum -8.29 cm 1.79 cm 1.87 keV 0 eV 0 fm 0 fm World initStep + 1 1.65 mum -8.3 cm 1.79 cm 1.55 MeV 1.87 keV 141 mum 141 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.69 mm 7.51 mm 1.08 keV 0 eV 0 fm 0 fm World initStep + 1 -4.86 mum -6.75 mm 7.51 mm 703 keV 1.08 keV 64.2 mum 64.2 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 42.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.98 cm 1.71 cm 748 MeV 14.8 keV 7.47 cm 7.47 cm World eIoni + 2 913 nm -11.8 cm 1.96 cm 1.23 GeV 10.4 keV 4.87 cm 12.3 cm World eIoni + 3 -816 nm -20 cm 2.22 cm 2.05 GeV 17 keV 8.16 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 913 nm -11.8 cm 1.96 cm 3.87 keV 0 eV 0 fm 0 fm World initStep + 1 18.7 mum -11.9 cm 1.96 cm 4.95 MeV 3.87 keV 462 mum 462 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.98 cm 1.71 cm 3.29 keV 0 eV 0 fm 0 fm World initStep + 1 -5.6 mum -7.01 cm 1.71 cm 3.77 MeV 3.29 keV 350 mum 350 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -12.8 cm 2 cm 1.33 GeV 25.7 keV 13.3 cm 13.3 cm World eIoni + 2 256 nm -14.7 cm 2.07 cm 1.52 GeV 3.84 keV 1.88 cm 15.2 cm World eIoni + 3 1.77 mum -20 cm 2.22 cm 2.05 GeV 11.8 keV 5.34 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 256 nm -14.7 cm 2.07 cm 1.14 keV 0 eV 0 fm 0 fm World initStep + 1 -4.64 mum -14.7 cm 2.07 cm 762 keV 1.14 keV 69.3 mum 69.3 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -12.8 cm 2 cm 3.22 keV 0 eV 0 fm 0 fm World initStep + 1 -5.84 mum -12.8 cm 2 cm 3.63 MeV 3.22 keV 337 mum 337 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -5.95 cm 1.64 cm 645 MeV 11.8 keV 6.44 cm 6.44 cm World eIoni + 2 2.42 mum -14.3 cm 2.05 cm 1.48 GeV 16.5 keV 8.33 cm 14.8 cm World eIoni + 3 2.98 mum -20 cm 2.22 cm 2.05 GeV 11.7 keV 5.74 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 2.42 mum -14.3 cm 2.05 cm 2.45 keV 0 eV 0 fm 0 fm World initStep + 1 5.53 mum -14.3 cm 2.05 cm 2.33 MeV 2.45 keV 215 mum 215 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -5.95 cm 1.64 cm 1.01 keV 0 eV 0 fm 0 fm World initStep + 1 -4.33 mum -5.96 cm 1.64 cm 643 keV 1.01 keV 58.4 mum 58.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -8.13 cm 1.78 cm 863 MeV 16.6 keV 8.62 cm 8.62 cm World eIoni + 2 1.65 mum -16.2 cm 2.12 cm 1.67 GeV 17.5 keV 8.07 cm 16.7 cm World eIoni + 3 1.45 mum -20 cm 2.22 cm 2.05 GeV 7.19 keV 3.81 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 1.65 mum -16.2 cm 2.12 cm 1.18 keV 0 eV 0 fm 0 fm World initStep + 1 7.25 mum -16.2 cm 2.12 cm 799 keV 1.18 keV 72.7 mum 72.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -8.13 cm 1.78 cm 1.06 keV 0 eV 0 fm 0 fm World initStep + 1 -3.82 mum -8.14 cm 1.78 cm 693 keV 1.06 keV 62.9 mum 62.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.51 cm 1.25 cm 301 MeV 5.13 keV 2.97 cm 2.97 cm World eIoni + 2 43.7 nm -2.63 cm 1.27 cm 313 MeV 214 eV 1.23 mm 3.09 cm World eIoni + 3 -922 nm -9.89 cm 1.88 cm 1.04 GeV 14.7 keV 7.29 cm 10.4 cm World eIoni + 4 -2.33 mum -13.9 cm 2.04 cm 1.44 GeV 8.84 keV 4.03 cm 14.4 cm World eIoni + 5 -3.21 mum -18.3 cm 2.18 cm 1.88 GeV 7.79 keV 4.43 cm 18.8 cm World eIoni + 6 -3.66 mum -20 cm 2.22 cm 2.05 GeV 2.47 keV 1.66 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -3.21 mum -18.3 cm 2.18 cm 1.21 keV 0 eV 0 fm 0 fm World initStep + 1 253 nm -18.3 cm 2.18 cm 828 keV 1.21 keV 75.2 mum 75.2 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -2.33 mum -13.9 cm 2.04 cm 1.33 keV 0 eV 0 fm 0 fm World initStep + 1 -4.12 mum -13.9 cm 2.04 cm 938 keV 1.33 keV 85.4 mum 85.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -922 nm -9.89 cm 1.88 cm 1.23 keV 0 eV 0 fm 0 fm World initStep + 1 4.9 mum -9.9 cm 1.88 cm 838 keV 1.23 keV 76.1 mum 76.1 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 43.7 nm -2.63 cm 1.27 cm 1.39 keV 0 eV 0 fm 0 fm World initStep + 1 3.47 mum -2.64 cm 1.27 cm 1.01 MeV 1.39 keV 91.5 mum 91.5 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.51 cm 1.25 cm 995 eV 0 eV 0 fm 0 fm World initStep + 1 -1.58 mum -2.51 cm 1.25 cm 628 keV 995 eV 57.4 mum 57.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 41.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -13.8 cm 2.04 cm 1.43 GeV 29 keV 14.3 cm 14.3 cm World eIoni + 2 -1.97 mum -20 cm 2.22 cm 2.05 GeV 12.6 keV 6.16 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -13.8 cm 2.04 cm 3.68 keV 0 eV 0 fm 0 fm World initStep + 1 18.3 mum -13.9 cm 2.04 cm 4.57 MeV 3.68 keV 426 mum 426 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.42 cm 1.23 cm 292 MeV 3.95 keV 2.88 cm 2.88 cm World eIoni + 2 -12.2 mum -14.4 cm 2.06 cm 1.49 GeV 24.8 keV 12 cm 14.9 cm World eIoni + 3 -16.3 mum -18.5 cm 2.18 cm 1.9 GeV 7.19 keV 4.1 cm 19 cm World eIoni + 4 -17.4 mum -20 cm 2.22 cm 2.05 GeV 2.45 keV 1.54 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -16.3 mum -18.5 cm 2.18 cm 2.01 keV 0 eV 0 fm 0 fm World initStep + 1 -21.9 mum -18.5 cm 2.18 cm 1.72 MeV 2.01 keV 157 mum 157 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -12.2 mum -14.4 cm 2.06 cm 8.22 keV 0 eV 0 fm 0 fm World initStep + 1 41.5 mum -14.5 cm 2.06 cm 18.6 MeV 8.22 keV 1.76 mm 1.76 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.42 cm 1.23 cm 9.35 keV 0 eV 0 fm 0 fm World initStep + 1 49.5 mum -2.64 cm 1.23 cm 23.5 MeV 9.35 keV 2.22 mm 2.22 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -9.89 cm 1.88 cm 1.04 GeV 18.3 keV 10.4 cm 10.4 cm World eIoni + 2 0 fm -16.4 cm 2.12 cm 1.69 GeV 13.3 keV 6.49 cm 16.9 cm World eIoni + 3 -474 nm -18.9 cm 2.19 cm 1.94 GeV 6.97 keV 2.57 cm 19.4 cm World eIoni + 4 -466 nm -19 cm 2.2 cm 1.95 GeV 259 eV 712 mum 19.5 cm World eBrem + 5 -432 nm -19.3 cm 2.2 cm 1.98 GeV 297 eV 3.26 mm 19.8 cm World eIoni + 6 -274 nm -20 cm 2.22 cm 2.05 GeV 912 eV 6.66 mm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -432 nm -19.3 cm 2.2 cm 18.8 keV 0 eV 0 fm 0 fm World initStep + 1 -13.9 mum -19.5 cm 2.2 cm 17.7 MeV 2 keV 1.71 mm 1.71 mm World eIoni + 2 -17.5 mum -20 cm 2.2 cm 67.4 MeV 708 eV 4.98 mm 6.69 mm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -466 nm -19 cm 2.2 cm 303 keV 0 eV 0 fm 0 fm World initStep + 1 -2.22 mum -20 cm 2.22 cm 303 keV 0 eV 9.93 mm 9.93 mm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -474 nm -18.9 cm 2.19 cm 3.15 keV 0 eV 0 fm 0 fm World initStep + 1 -16.7 mum -19 cm 2.19 cm 3.49 MeV 3.15 keV 323 mum 323 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -16.4 cm 2.12 cm 1.7 keV 0 eV 0 fm 0 fm World initStep + 1 6.77 mum -16.4 cm 2.12 cm 1.34 MeV 1.7 keV 122 mum 122 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -13 cm 2.01 cm 1.35 GeV 26 keV 13.5 cm 13.5 cm World eIoni + 2 -561 nm -15.6 cm 2.1 cm 1.61 GeV 4.02 keV 2.62 cm 16.1 cm World eIoni + 3 -2.43 mum -20 cm 2.22 cm 2.05 GeV 9.91 keV 4.4 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -561 nm -15.6 cm 2.1 cm 3.62 keV 0 eV 0 fm 0 fm World initStep + 1 14.4 mum -15.6 cm 2.1 cm 4.44 MeV 3.62 keV 413 mum 413 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -13 cm 2.01 cm 2.53 keV 0 eV 0 fm 0 fm World initStep + 1 8.16 mum -13 cm 2.01 cm 2.45 MeV 2.53 keV 226 mum 226 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -3.36 cm 1.38 cm 386 MeV 9.67 keV 3.83 cm 3.83 cm World eIoni + 2 6.2 mum -20 cm 2.22 cm 2.05 GeV 33.9 keV 16.7 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -3.36 cm 1.38 cm 1.37 keV 0 eV 0 fm 0 fm World initStep + 1 -6.57 mum -3.37 cm 1.38 cm 981 keV 1.37 keV 89.3 mum 89.3 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -7.26 mm 7.77 mm 123 MeV 1.81 keV 1.12 cm 1.12 cm World eIoni + 2 11.3 mum -7.86 cm 1.77 cm 836 MeV 14.6 keV 7.23 cm 8.35 cm World eIoni + 3 19.4 mum -20 cm 2.22 cm 2.05 GeV 26.5 keV 12.1 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 11.3 mum -7.86 cm 1.77 cm 1.05 keV 0 eV 0 fm 0 fm World initStep + 1 6.44 mum -7.87 cm 1.77 cm 676 keV 1.05 keV 61.5 mum 61.5 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -7.26 mm 7.77 mm 3.34 keV 0 eV 0 fm 0 fm World initStep + 1 -17.8 mum -7.62 mm 7.77 mm 3.89 MeV 3.34 keV 361 mum 361 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -4.86 cm 1.54 cm 536 MeV 10.9 keV 5.34 cm 5.34 cm World eIoni + 2 -1.78 mum -11.2 cm 1.94 cm 1.17 GeV 12.5 keV 6.33 cm 11.7 cm World eIoni + 3 -1.95 mum -20 cm 2.22 cm 2.05 GeV 18.6 keV 8.83 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.78 mum -11.2 cm 1.94 cm 1.76 keV 0 eV 0 fm 0 fm World initStep + 1 -5.85 mum -11.2 cm 1.94 cm 1.41 MeV 1.76 keV 129 mum 129 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -4.86 cm 1.54 cm 1.47 keV 0 eV 0 fm 0 fm World initStep + 1 4.21 mum -4.87 cm 1.54 cm 1.08 MeV 1.47 keV 98.8 mum 98.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.6 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -14.6 cm 2.07 cm 1.51 GeV 29.2 keV 15.1 cm 15.1 cm World eIoni + 2 -2.62 mum -20 cm 2.22 cm 2.05 GeV 11.5 keV 5.36 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -14.6 cm 2.07 cm 15.6 keV 0 eV 0 fm 0 fm World initStep + 1 89.4 mum -15.2 cm 2.08 cm 58.6 MeV 15.6 keV 5.61 mm 5.61 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -11.7 cm 1.96 cm 1.22 GeV 22.9 keV 12.2 cm 12.2 cm World eIoni + 2 -2.18 mum -20 cm 2.22 cm 2.05 GeV 17.2 keV 8.33 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -11.7 cm 1.96 cm 3.28 keV 0 eV 0 fm 0 fm World initStep + 1 12.8 mum -11.7 cm 1.96 cm 3.75 MeV 3.28 keV 348 mum 348 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.67 cm 1.69 cm 717 MeV 14.2 keV 7.15 cm 7.15 cm World eIoni + 2 -239 nm -6.99 cm 1.71 cm 749 MeV 445 eV 3.22 mm 7.48 cm World eIoni + 3 -9.13 mum -19.5 cm 2.21 cm 2 GeV 27 keV 12.6 cm 20 cm World eIoni + 4 -9.48 mum -20 cm 2.22 cm 2.05 GeV 1.46 keV 4.57 mm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -9.13 mum -19.5 cm 2.21 cm 14.4 keV 0 eV 0 fm 0 fm World initStep + 1 45.2 mum -19.9 cm 2.2 cm 41.7 MeV 8.98 keV 3.98 mm 3.98 mm World eIoni + 2 45.9 mum -20 cm 2.2 cm 48.3 MeV 64 eV 655 mum 4.63 mm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -239 nm -6.99 cm 1.71 cm 35.1 keV 0 eV 0 fm 0 fm World initStep + 1 18.7 mum -7.21 cm 1.72 cm 23.3 MeV 2.69 keV 2.28 mm 2.28 mm World eIoni + 2 22.5 mum -7.66 cm 1.72 cm 68.2 MeV 227 eV 4.49 mm 6.78 mm World eIoni + 3 45.6 mum -20 cm 1.73 cm 1.3 GeV 23.5 keV 12.3 cm 13 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 3 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 22.5 mum -7.66 cm 1.72 cm 1.76 keV 0 eV 0 fm 0 fm World initStep + 1 13.8 mum -7.67 cm 1.72 cm 1.42 MeV 1.76 keV 129 mum 129 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.67 cm 1.69 cm 9.58 keV 0 eV 0 fm 0 fm World initStep + 1 36.7 mum -6.89 cm 1.68 cm 24.5 MeV 9.58 keV 2.32 mm 2.32 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.6 cm 1.68 cm 710 MeV 13.5 keV 7.09 cm 7.09 cm World eIoni + 2 -410 nm -7.84 cm 1.77 cm 834 MeV 2.8 keV 1.24 cm 8.33 cm World eIoni + 3 -1.17 mum -15 cm 2.08 cm 1.55 GeV 15.1 keV 7.18 cm 15.5 cm World eIoni + 4 -2.51 mum -20 cm 2.22 cm 2.05 GeV 11 keV 4.99 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.17 mum -15 cm 2.08 cm 1.58 keV 0 eV 0 fm 0 fm World initStep + 1 5.8 mum -15 cm 2.08 cm 1.2 MeV 1.58 keV 109 mum 109 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -410 nm -7.84 cm 1.77 cm 2.31 keV 0 eV 0 fm 0 fm World initStep + 1 -3.68 mum -7.86 cm 1.77 cm 2.15 MeV 2.31 keV 197 mum 197 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.6 cm 1.68 cm 2.6 keV 0 eV 0 fm 0 fm World initStep + 1 5.46 mum -6.61 cm 1.68 cm 1.6 MeV 863 eV 149 mum 149 mum World eIoni + 2 20.8 mum -14.5 cm 1.68 cm 790 MeV 11.3 keV 7.88 cm 7.9 cm World eIoni + 3 27 mum -20 cm 1.68 cm 1.34 GeV 12 keV 5.51 cm 13.4 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 2 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 20.8 mum -14.5 cm 1.68 cm 8.47 keV 0 eV 0 fm 0 fm World initStep + 1 -35.5 mum -14.7 cm 1.68 cm 19.7 MeV 8.47 keV 1.86 mm 1.86 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -2.67 cm 1.28 cm 317 MeV 6.98 keV 3.13 cm 3.13 cm World eIoni + 2 -953 nm -20 cm 2.22 cm 2.05 GeV 36.9 keV 17.4 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -2.67 cm 1.28 cm 1.23 keV 0 eV 0 fm 0 fm World initStep + 1 856 nm -2.68 cm 1.28 cm 844 keV 1.23 keV 76.2 mum 76.2 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -17.7 cm 2.16 cm 1.82 GeV 34.5 keV 18.2 cm 18.2 cm World eIoni + 2 794 nm -20 cm 2.22 cm 2.05 GeV 5.65 keV 2.29 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -17.7 cm 2.16 cm 7.69 keV 0 eV 0 fm 0 fm World initStep + 1 -15.5 mum -17.7 cm 2.16 cm 2.07 MeV 180 eV 202 mum 202 mum World eIoni + 2 -44.1 mum -19.4 cm 2.16 cm 171 MeV 3.03 keV 1.69 cm 1.71 cm World eIoni + 3 -46.1 mum -20 cm 2.16 cm 229 MeV 758 eV 5.79 mm 2.29 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 38.5 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.27 mm 7.3 mm 113 MeV 1.51 keV 1.01 cm 1.01 cm World eIoni + 2 -693 nm -18.8 cm 2.19 cm 1.93 GeV 36.2 keV 18.3 cm 19.3 cm World eIoni + 3 -491 nm -20 cm 2.22 cm 2.05 GeV 1.98 keV 1.18 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -693 nm -18.8 cm 2.19 cm 1.85 keV 0 eV 0 fm 0 fm World initStep + 1 -8.49 mum -18.8 cm 2.19 cm 1.52 MeV 1.85 keV 139 mum 139 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.27 mm 7.3 mm 1.1 keV 0 eV 0 fm 0 fm World initStep + 1 363 nm -6.33 mm 7.3 mm 717 keV 1.1 keV 65.9 mum 65.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -11 cm 1.93 cm 1.14 GeV 23.9 keV 11.4 cm 11.4 cm World eIoni + 2 90.6 nm -11.7 cm 1.96 cm 1.22 GeV 1.56 keV 7.07 mm 12.2 cm World eIoni + 3 81.9 nm -14.2 cm 2.05 cm 1.47 GeV 5.08 keV 2.5 cm 14.6 cm World eIoni + 4 -955 nm -20 cm 2.22 cm 2.05 GeV 11.4 keV 5.85 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 81.9 nm -14.2 cm 2.05 cm 1.08 keV 0 eV 0 fm 0 fm World initStep + 1 4.76 mum -14.2 cm 2.05 cm 705 keV 1.08 keV 64.2 mum 64.2 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 90.6 nm -11.7 cm 1.96 cm 1.12 keV 0 eV 0 fm 0 fm World initStep + 1 2.56 mum -11.7 cm 1.96 cm 747 keV 1.12 keV 67.8 mum 67.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -11 cm 1.93 cm 1.89 keV 0 eV 0 fm 0 fm World initStep + 1 -3.27 mum -11 cm 1.93 cm 1.57 MeV 1.89 keV 144 mum 144 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.28 mm 7.31 mm 113 MeV 1.06 keV 1.01 cm 1.01 cm World eIoni + 2 -6.08 mum -5.31 cm 1.58 cm 581 MeV 9.73 keV 4.78 cm 5.8 cm World eIoni + 3 -8.89 mum -6.99 cm 1.71 cm 749 MeV 3.79 keV 1.68 cm 7.47 cm World eIoni + 4 -9.74 mum -12.2 cm 1.98 cm 1.27 GeV 10.4 keV 5.22 cm 12.7 cm World eIoni + 5 -12.1 mum -20 cm 2.22 cm 2.05 GeV 16.1 keV 7.8 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -9.74 mum -12.2 cm 1.98 cm 1.16 keV 0 eV 0 fm 0 fm World initStep + 1 -4.24 mum -12.2 cm 1.98 cm 782 keV 1.16 keV 71.1 mum 71.1 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -8.89 mum -6.99 cm 1.71 cm 9.7 keV 0 eV 0 fm 0 fm World initStep + 1 -73.4 mum -7.22 cm 1.71 cm 25 MeV 9.7 keV 2.37 mm 2.37 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -6.08 mum -5.31 cm 1.58 cm 5.48 keV 0 eV 0 fm 0 fm World initStep + 1 26.2 mum -5.4 cm 1.58 cm 9.07 MeV 5.48 keV 853 mum 853 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.28 mm 7.31 mm 1.52 keV 0 eV 0 fm 0 fm World initStep + 1 6.75 mum -6.39 mm 7.31 mm 1.13 MeV 1.52 keV 104 mum 104 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -17.1 cm 2.14 cm 1.76 GeV 32.8 keV 17.6 cm 17.6 cm World eIoni + 2 584 nm -20 cm 2.22 cm 2.05 GeV 6.1 keV 2.93 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -17.1 cm 2.14 cm 1.4 keV 0 eV 0 fm 0 fm World initStep + 1 -6.84 mum -17.1 cm 2.14 cm 1.02 MeV 1.4 keV 92.6 mum 92.6 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -20 cm 2.22 cm 2.05 GeV 39.1 keV 20.5 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -10.7 cm 1.91 cm 1.12 GeV 22.1 keV 11.2 cm 11.2 cm World eIoni + 2 -1.89 mum -19.2 cm 2.2 cm 1.97 GeV 17.4 keV 8.51 cm 19.7 cm World eIoni + 3 -2.16 mum -20 cm 2.22 cm 2.05 GeV 1.41 keV 8.17 mm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.89 mum -19.2 cm 2.2 cm 1.14 keV 0 eV 0 fm 0 fm World initStep + 1 3.49 mum -19.2 cm 2.2 cm 758 keV 1.14 keV 68.9 mum 68.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -10.7 cm 1.91 cm 1.28 keV 0 eV 0 fm 0 fm World initStep + 1 5.68 mum -10.7 cm 1.91 cm 891 keV 1.28 keV 81.1 mum 81.1 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -16.4 cm 2.12 cm 1.69 GeV 32 keV 16.9 cm 16.9 cm World eIoni + 2 -514 nm -20 cm 2.22 cm 2.05 GeV 5.96 keV 3.57 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -16.4 cm 2.12 cm 2.9 keV 0 eV 0 fm 0 fm World initStep + 1 7.63 mum -16.5 cm 2.13 cm 3.08 MeV 2.9 keV 285 mum 285 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -8.33 cm 1.79 cm 883 MeV 17.3 keV 8.82 cm 8.82 cm World eIoni + 2 -132 nm -9.21 cm 1.84 cm 971 MeV 2.36 keV 8.82 mm 9.7 cm World eIoni + 3 -4.22 mum -20 cm 2.22 cm 2.05 GeV 22.7 keV 10.8 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -132 nm -9.21 cm 1.84 cm 2.05 keV 0 eV 0 fm 0 fm World initStep + 1 9.17 mum -9.22 cm 1.84 cm 1.77 MeV 2.05 keV 162 mum 162 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -8.33 cm 1.79 cm 5.91 keV 0 eV 0 fm 0 fm World initStep + 1 6.31 mum -8.42 cm 1.79 cm 10.3 MeV 5.91 keV 973 mum 973 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.17 cm 1.65 cm 667 MeV 12.6 keV 6.65 cm 6.65 cm World eIoni + 2 797 nm -18.1 cm 2.17 cm 1.86 GeV 25.4 keV 11.9 cm 18.6 cm World eIoni + 3 1.21 mum -20 cm 2.22 cm 2.05 GeV 3.93 keV 1.95 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 797 nm -18.1 cm 2.17 cm 1.31 keV 0 eV 0 fm 0 fm World initStep + 1 -5 mum -18.1 cm 2.17 cm 917 keV 1.31 keV 83.4 mum 83.4 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.17 cm 1.65 cm 1.37 keV 0 eV 0 fm 0 fm World initStep + 1 -1.38 mum -6.18 cm 1.65 cm 983 keV 1.37 keV 89.7 mum 89.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -11.8 cm 1.96 cm 1.23 GeV 25 keV 12.3 cm 12.3 cm World eIoni + 2 48.4 nm -14.5 cm 2.06 cm 1.5 GeV 4.79 keV 2.73 cm 15 cm World eIoni + 3 -784 nm -20 cm 2.22 cm 2.05 GeV 11.4 keV 5.47 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 48.4 nm -14.5 cm 2.06 cm 2.02 keV 0 eV 0 fm 0 fm World initStep + 1 6.65 mum -14.6 cm 2.06 cm 1.74 MeV 2.02 keV 159 mum 159 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -11.8 cm 1.96 cm 2.85 keV 0 eV 0 fm 0 fm World initStep + 1 -677 nm -11.8 cm 1.96 cm 2.99 MeV 2.85 keV 276 mum 276 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -6.65 mm 7.49 mm 116 MeV 637 eV 1.06 cm 1.06 cm World eIoni + 2 -1.47 mum -1.64 cm 1.07 cm 214 MeV 1.14 keV 1.03 cm 2.09 cm World eIoni + 3 -2.15 mum -2.07 cm 1.17 cm 257 MeV 2.45 keV 4.31 mm 2.52 cm World eIoni + 4 -5.28 mum -5.61 cm 1.61 cm 611 MeV 9.28 keV 3.57 cm 6.1 cm World eIoni + 5 -6.32 mum -6.8 cm 1.7 cm 730 MeV 2.15 keV 1.2 cm 7.29 cm World eIoni + 6 -6.56 mum -9.14 cm 1.84 cm 964 MeV 3.68 keV 2.34 cm 9.63 cm World eIoni + 7 -7.13 mum -10.5 cm 1.9 cm 1.1 GeV 2.66 keV 1.35 cm 11 cm World eIoni + 8 -7.31 mum -12.8 cm 2 cm 1.33 GeV 5.95 keV 2.34 cm 13.3 cm World eIoni + 9 -7.55 mum -14.5 cm 2.06 cm 1.5 GeV 2.72 keV 1.72 cm 15 cm World eIoni + 10 -7.45 mum -14.9 cm 2.07 cm 1.54 GeV 333 eV 3.75 mm 15.4 cm World eIoni + 11 -7.5 mum -20 cm 2.22 cm 2.05 GeV 10.8 keV 5.08 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 11, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -7.45 mum -14.9 cm 2.07 cm 1.72 keV 0 eV 0 fm 0 fm World initStep + 1 1.08 mum -14.9 cm 2.07 cm 1.37 MeV 1.72 keV 125 mum 125 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 10, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -7.55 mum -14.5 cm 2.06 cm 3.68 keV 0 eV 0 fm 0 fm World initStep + 1 -27.4 mum -14.6 cm 2.06 cm 4.56 MeV 3.68 keV 425 mum 425 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 9, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -7.31 mum -12.8 cm 2 cm 1.42 keV 0 eV 0 fm 0 fm World initStep + 1 -5.38 mum -12.8 cm 2 cm 1.03 MeV 1.42 keV 93.7 mum 93.7 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 8, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -7.13 mum -10.5 cm 1.9 cm 1.45 keV 0 eV 0 fm 0 fm World initStep + 1 -13.3 mum -10.5 cm 1.9 cm 1.07 MeV 1.45 keV 96.9 mum 96.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -6.56 mum -9.14 cm 1.84 cm 1.41 keV 0 eV 0 fm 0 fm World initStep + 1 -369 nm -9.15 cm 1.84 cm 1.02 MeV 1.41 keV 92.8 mum 92.8 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -6.32 mum -6.8 cm 1.7 cm 8.59 keV 0 eV 0 fm 0 fm World initStep + 1 -19.3 mum -6.83 cm 1.7 cm 2.89 MeV 588 eV 282 mum 282 mum World eIoni + 2 -49 mum -20 cm 1.7 cm 1.32 GeV 20.4 keV 13.2 cm 13.2 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -5.28 mum -5.61 cm 1.61 cm 1.73 keV 0 eV 0 fm 0 fm World initStep + 1 -702 nm -5.62 cm 1.61 cm 1.38 MeV 1.73 keV 126 mum 126 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -2.15 mum -2.07 cm 1.17 cm 5.54 keV 0 eV 0 fm 0 fm World initStep + 1 -2.62 mum -2.15 cm 1.17 cm 9.25 MeV 5.54 keV 871 mum 871 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 -1.47 mum -1.64 cm 1.07 cm 2.12 keV 0 eV 0 fm 0 fm World initStep + 1 1.87 mum -1.66 cm 1.08 cm 1.88 MeV 2.12 keV 171 mum 171 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -6.65 mm 7.49 mm 1.24 keV 0 eV 0 fm 0 fm World initStep + 1 3.91 mum -6.72 mm 7.49 mm 863 keV 1.24 keV 76.9 mum 76.9 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -7.3 cm 1.73 cm 780 MeV 14.3 keV 7.79 cm 7.79 cm World eIoni + 2 -4.58 mum -20 cm 2.22 cm 2.05 GeV 26.9 keV 12.7 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -7.3 cm 1.73 cm 5.42 keV 0 eV 0 fm 0 fm World initStep + 1 20.4 mum -7.39 cm 1.74 cm 8.89 MeV 5.42 keV 835 mum 835 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm 0 fm 0 fm 50 MeV 0 eV 0 fm 0 fm World initStep + 1 0 fm -5 cm 1.56 cm 550 MeV 10.4 keV 5.49 cm 5.49 cm World eIoni + 2 2.57 mum -11 cm 1.93 cm 1.15 GeV 11.7 keV 6.01 cm 11.5 cm World eIoni + 3 4.16 mum -20 cm 2.22 cm 2.05 GeV 19.6 keV 9.01 cm 20.5 cm OutOfWorldTransportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 2.57 mum -11 cm 1.93 cm 2.73 keV 0 eV 0 fm 0 fm World initStep + 1 4.53 mum -11 cm 1.93 cm 2.79 MeV 2.73 keV 258 mum 258 mum World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng NextVolu Process + 0 0 fm -5 cm 1.56 cm 1.94 keV 0 eV 0 fm 0 fm World initStep + 1 -7.67 mum -5.02 cm 1.56 cm 1.62 MeV 1.94 keV 148 mum 148 mum World eIoni Run terminated. Run Summary Number of events processed : 100 - User=0.49s Real=3.62s Sys=0.61s + User=0.47s Real=1s Sys=0.51s Graphics systems deleted. Visualization Manager deleting... G4 kernel has come to Quit state. diff --git a/examples/extended/field/field03/field03.out b/examples/extended/field/field03/field03.out index 53662c5617..17f73f07c0 100644 --- a/examples/extended/field/field03/field03.out +++ b/examples/extended/field/field03/field03.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -128,8 +128,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -138,7 +138,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -156,7 +156,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -186,15 +186,15 @@ Start Run processing. Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 22 m 500 MeV 0 eV 0 fm 0 fm World initStep - 1 0 fm 4.0138452 cm 21.79201 m 500 MeV 0 eV 20.288442 cm 20.288442 cm World Transportation 0 fm 390.36094 mum -920.6619 mum - 2 0 fm 6.5801508 cm 21.74 m 500 MeV 0 eV 5.8028638 cm 26.091306 cm RadSlice Transportation 0 fm 493.16452 mum -869.93607 mum - 3 0 fm 19.942498 cm 21.58699 m 500 MeV 0 eV 20.453361 cm 46.544667 cm Radiator Transportation 0 fm 795.60591 mum -605.81452 mum + 1 0 fm 4.0138452 cm 21.79201 m 500 MeV0.00049459459 eV 20.288442 cm 20.288442 cm World Transportation 0 fm 390.36094 mum -920.6619 mum + 2 0 fm 6.5801508 cm 21.74 m 500 MeV0.00014148327 eV 5.8028638 cm 26.091306 cm RadSlice Transportation 0 fm 493.16452 mum -869.93607 mum + 3 0 fm 19.942498 cm 21.58699 m 500 MeV0.00049863047 eV 20.453361 cm 46.544667 cm Radiator Transportation 0 fm 795.60591 mum -605.81452 mum 4 0 fm 81.240793 cm 21.58699 m 500 MeV 0 eV 65.848987 cm 1.1239365 m World Transportation 0 fm 795.60595 mum 605.81447 mum - 5 0 fm 94.603131 cm 21.74 m 500 MeV 0 eV 20.453354 cm 1.3284701 m Radiator Transportation 0 fm 493.1647 mum 869.93596 mum - 6 0 fm 98.923943 cm 21.84 m 500 MeV 0 eV 10.914704 cm 1.4376171 m RadSlice Transportation 0 fm 295.50359 mum 955.34163 mum - 7 0 fm 1.0118328 m 21.9895 m 500 MeV 0 eV 15.176601 cm 1.5893831 m World Transportation 0 fm 2.1926162 Ang 1000 mum - 8 0 fm 1.0118318 m 21.9905 m 500 MeV 0 eV 1.0000007 mm 1.5903831 m Absorber Transportation 0 fm -1.9763919 mum 999.99805 mum - 9 0 fm 1.0117238 m 22 m 500 MeV 0 eV 9.5007541 mm 1.5998839 m OutOfWorld Transportation 0 fm -20.7542 mum 999.78461 mum + 5 0 fm 94.603131 cm 21.74 m 500 MeV0.00049863047 eV 20.453354 cm 1.3284701 m Radiator Transportation 0 fm 493.1647 mum 869.93596 mum + 6 0 fm 98.923943 cm 21.84 m 500 MeV0.00026608404 eV 10.914704 cm 1.4376171 m RadSlice Transportation 0 fm 295.50359 mum 955.34163 mum + 7 0 fm 1.0118328 m 21.9895 m 500 MeV0.00036999381 eV 15.176601 cm 1.5893831 m World Transportation 0 fm 2.1925965 Ang 1000 mum + 8 0 fm 1.0118318 m 21.9905 m 500 MeV2.444267e-06 eV 1.0000007 mm 1.5903831 m Absorber Transportation 0 fm -1.9763919 mum 999.99805 mum + 9 0 fm 1.0117238 m 22 m 500 MeV2.3135271e-05 eV 9.5007541 mm 1.5998839 m OutOfWorld Transportation 0 fm -20.7542 mum 999.78461 mum Run terminated. Run Summary Number of events processed : 1 diff --git a/examples/extended/medical/DICOM/History b/examples/extended/medical/DICOM/History index 9de74be8e0..42ce08f794 100644 --- a/examples/extended/medical/DICOM/History +++ b/examples/extended/medical/DICOM/History @@ -6,6 +6,9 @@ Category History file --------------------- +13.5.2004 - Susanna Guatelli + updated compiler: gcc3.2.3 + 11.3.2003 - Susanna Guatelli README changed diff --git a/examples/extended/medical/DICOM/README b/examples/extended/medical/DICOM/README index 129ab17b91..67f113a962 100644 --- a/examples/extended/medical/DICOM/README +++ b/examples/extended/medical/DICOM/README @@ -35,11 +35,11 @@ In the application the phantom is placed on a table. ---> 2) Installation: - -example enviroment with the compiler 3.2 + -example enviroment with the compiler 3.2.3 -a standard Geant4 example GNUmakefile is provided setup with: -compiler = gcc-3.2 +compiler = gcc-3.2.3 G4SYSTEM = linux-g++ The following environment variables need to be set: diff --git a/examples/extended/optical/LXe/GNUmakefile b/examples/extended/optical/LXe/GNUmakefile new file mode 100644 index 0000000000..c70e81bc42 --- /dev/null +++ b/examples/extended/optical/LXe/GNUmakefile @@ -0,0 +1,19 @@ +# $Id: GNUmakefile,v 1.2 2004/06/01 07:05:03 gcosmo Exp $ +# -------------------------------------------------------------- +# GNUmakefile for LXe example. +# -------------------------------------------------------------- + +name := LXe +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../../.. +endif + +.PHONY: all +all: lib bin + +include $(G4INSTALL)/config/architecture.gmk + +include $(G4INSTALL)/config/binmake.gmk diff --git a/examples/extended/optical/LXe/History b/examples/extended/optical/LXe/History new file mode 100644 index 0000000000..9cc866c29b --- /dev/null +++ b/examples/extended/optical/LXe/History @@ -0,0 +1,20 @@ +$Id: History,v 1.1 2004/06/01 07:02:16 gcosmo Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - an Object-Oriented Toolkit for Simulation in HEP + ========================================================= + + LXe 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 * + ---------------------------------------------------------- + +May 31st, 2004 Trevor MacPhail (LXe-V06-01-00) +------------------------------ +- First release of LXe setup for optical processes. diff --git a/examples/extended/optical/LXe/LXe.cc b/examples/extended/optical/LXe/LXe.cc new file mode 100644 index 0000000000..7b6ec155d7 --- /dev/null +++ b/examples/extended/optical/LXe/LXe.cc @@ -0,0 +1,107 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4String.hh" +#include "G4UItcsh.hh" +#include "G4UIterminal.hh" + +#include "LXeDetectorConstruction.hh" +#include "LXePhysicsList.hh" +#include "LXePrimaryGeneratorAction.hh" +#include "LXeEventAction.hh" +#include "LXeStackingAction.hh" +#include "LXeSteppingAction.hh" +#include "LXeTrackingAction.hh" +#include "LXeRunAction.hh" +#include "LXeSteppingVerbose.hh" + +#include "RecorderBase.hh" + +#ifdef G4VIS_USE +#include "LXeVisManager.hh" +#endif + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +int main(int argc, char** argv) +{ + G4VSteppingVerbose::SetInstance(new LXeSteppingVerbose); + + G4RunManager* runManager = new G4RunManager; + + runManager->SetUserInitialization(new LXeDetectorConstruction); + runManager->SetUserInitialization(new LXePhysicsList); + +#ifdef G4VIS_USE + G4VisManager* visManager = new LXeVisManager; + visManager->Initialize(); +#endif + + RecorderBase* recorder = NULL;//No recording is done in this example + + runManager->SetUserAction(new LXePrimaryGeneratorAction); + runManager->SetUserAction(new LXeStackingAction); + + runManager->SetUserAction(new LXeRunAction(recorder)); + runManager->SetUserAction(new LXeEventAction(recorder)); + runManager->SetUserAction(new LXeTrackingAction(recorder)); + runManager->SetUserAction(new LXeSteppingAction(recorder)); + + runManager->Initialize(); + + // get the pointer to the UI manager and set verbosities + G4UImanager* UI = G4UImanager::GetUIpointer(); + + if(argc==1){ + G4UIsession* session=0; +#ifdef G4UI_USE_TCSH + session = new G4UIterminal(new G4UItcsh); +#else + session = new G4UIterminal(); +#endif + + //execute vis.mac + UI->ApplyCommand("/control/execute vis.mac"); + + session->SessionStart(); + delete session; + + } + else{ + G4String command = "/control/execute "; + G4String filename = argv[1]; + UI->ApplyCommand(command+filename); + } + + if(recorder)delete recorder; + +#ifdef G4VIS_USE + delete visManager; +#endif + + // job termination + delete runManager; + return 0; +} + + diff --git a/examples/extended/optical/LXe/LXe.in b/examples/extended/optical/LXe/LXe.in new file mode 100644 index 0000000000..33e665225a --- /dev/null +++ b/examples/extended/optical/LXe/LXe.in @@ -0,0 +1,10 @@ +#************** +#** +#** Demonstrates the basic functionality of this example by running a +#** a single event with the default configuration +#** +#************** +#/LXe/detector/MainScintYield 100 +/LXe/eventVerbose 1 +#/tracking/verbose 1 +/run/beamOn 3 diff --git a/examples/extended/optical/LXe/LXe.out b/examples/extended/optical/LXe/LXe.out new file mode 100644 index 0000000000..9c5ce7bc5f --- /dev/null +++ b/examples/extended/optical/LXe/LXe.out @@ -0,0 +1,125 @@ +********************************************** + Geant4 version $Name: geant4-06-02 $ + (12-December-2003) + Copyright : Geant4 Collaboration +********************************************** +Visualization Manager instantiating... +Visualization Manager initialising... +Registering graphics systems... + +You have successfully chosen to use the following graphics systems. +Current available graphics systems are: + ASCIITree (ATree) + DAWNFILE (DAWNFILE) + GAGTree (GAGTree) + G4HepRepFile (HepRepFile) + G4HepRep (HepRepXML) + RayTracer (RayTracer) + VRML1FILE (VRML1FILE) + VRML2FILE (VRML2FILE) + OpenGLImmediateX (OGLIX) + OpenGLStoredX (OGLSX) + OpenGLImmediateXm (OGLIXm) + OpenGLStoredXm (OGLSXm) + +phot: Total cross sections from Sandia parametrisation. +MuonMinusCaptureAtRest is created + +compt: Total cross sections from a parametrisation. Good description from 10 KeV to (100/Z) GeV. + Scattered gamma energy according Klein-Nishina. + PhysicsTables from 1 keV to 100 GeV in 80 bins. + +conv: Total cross sections from a parametrisation. Good description from 1.5 MeV to 100 GeV for all Z. + e+e- energies according Bethe-Heitler + PhysicsTables from 1.022 MeV to 100 GeV in 100 bins. + +msc: Model variant of multiple scattering for e- + Lambda tables from 100 eV to 100 TeV in 120 bins. + Boundary algorithm is active with facrange= 0.199 + +eIoni: tables are built for e- + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 + Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. + +eBrem: tables are built for e- + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Total cross sections from a parametrisation based on the EEDL data library. + Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. + +eIoni: tables are built for e+ + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Step function: finalRange(mm)= 1, dRoverRange= 1, integral: 1 + Delta cross sections from Moller+Bhabha, good description from 1 KeV to 100 GeV. + +eBrem: tables are built for e+ + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Total cross sections from a parametrisation based on the EEDL data library. + Good description from 1 KeV to 100 GeV, log scale extrapolation above 100 GeV. + +annihil: Total cross section from Heilter formula(annihilation into 2 photons). + gamma energies sampled according Heitler + PhysicsTables from 10 keV to 10 TeV in 100 bins. + +msc: Model variant of multiple scattering for mu+ + Lambda tables from 100 eV to 100 TeV in 120 bins. + Boundary algorithm is active with facrange= 0.199 + +MuIoni: tables are built for mu+ + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Bether-Bloch model for E > 0.2 MeV parametrisation of Bragg peak below. + +MuBrems: tables are built for mu+ + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Parametrised model + +MuPairProd: tables are built for mu+ + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Parametrised model +### All dEdx and Range tables are built ##### + +MuIoni: tables are built for mu- + dE/dx and range tables from 100 eV to 100 TeV in 120 bins. + Lambda tables from threshold to 100 TeV in 120 bins. + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Bether-Bloch model for E > 0.2 MeV parametrisation of Bragg peak below. + Energy weighted position of hits in LXe : (5.18102,30.2388,-98.8831) + Total energy deposition in scintillator : 511 (keV) + Reconstructed position of hits in LXe : (3.87256,8.56373,-27.017) + Number of photons that hit PMTs in this event : 2160 + Number of PMTs above threshold(1) : 32 + Number of photons produced by scintillation in this event : 6040 + Number of photons produced by cerenkov in this event : 1 + Number of photons absorbed (OpAbsorption) in this event : 3881 + Number of photons absorbed at boundaries (OpBoundary) in this event : 0 +Unacounted for photons in this event : 0 + Energy weighted position of hits in LXe : (-28.7618,-1.33268,-9.54847) + Total energy deposition in scintillator : 511 (keV) + Reconstructed position of hits in LXe : (-5.96696,-2.2751,-2.77019) + Number of photons that hit PMTs in this event : 2176 + Number of PMTs above threshold(1) : 32 + Number of photons produced by scintillation in this event : 6167 + Number of photons produced by cerenkov in this event : 1 + Number of photons absorbed (OpAbsorption) in this event : 3992 + Number of photons absorbed at boundaries (OpBoundary) in this event : 0 +Unacounted for photons in this event : 0 + Energy weighted position of hits in LXe : (1.6474,-12.2959,-71.5899) + Total energy deposition in scintillator : 511 (keV) + Reconstructed position of hits in LXe : (1.21798,-3.59905,-26.1855) + Number of photons that hit PMTs in this event : 2230 + Number of PMTs above threshold(1) : 32 + Number of photons produced by scintillation in this event : 6217 + Number of photons produced by cerenkov in this event : 1 + Number of photons absorbed (OpAbsorption) in this event : 3988 + Number of photons absorbed at boundaries (OpBoundary) in this event : 0 +Unacounted for photons in this event : 0 +Graphics systems deleted. +Visualization Manager deleting... diff --git a/examples/extended/optical/LXe/README b/examples/extended/optical/LXe/README new file mode 100644 index 0000000000..12a4339084 --- /dev/null +++ b/examples/extended/optical/LXe/README @@ -0,0 +1,553 @@ + + LXe Example + ----------- + +************** +*Classes Used* +************** + +main() +------ + + ==> Use G4UItcsh if available + + ==> Provide interactive and macro mode + +G4VModularPhysicsList +------------------ +(class: LXePhysicsList) + + ==> Registers General, EM, Muon, and Optical physics lists + + ==> define particles; including *** G4OpticalPhoton *** + define processes; including *** G4Cerenkov *** + *** G4Scintillation *** + *** G4OpAbsorption *** + *** G4OpRayleigh *** + *** G4OpBoundaryProcess *** + *** G4OpWLS *** + +G4VUserDetectorConstruction +--------------------------- +(class: LXeDetectorConstruction) + + ==> define material: LXe (liquid xenon), Aluminum, Air, Vacuum, Glass,... + define G4Box geometry with aluminum housing and LXe volume inside + define G4Tubs placed around the housing walls + define G4Sphere to demonstrate skin surfaces inside volumes + *** add G4MaterialPropertiesTable to G4Material *** + *** define G4OpticalSurface(s) *** + *** define G4LogicalBorderSurface(s) *** + *** define G4LogicalSkinSurface(s) *** + *** add G4MaterialPropertiesTable to G4OpticalSurface(s)*** + + ==> Mesenger to change many of the dectector geometry properties + + ==> Uses a alternative style of geometry definition. See "Geometry" section. + +G4VUserPrimaryGeneratorAction +----------------------------- +(class: LXePrimaryGeneratorAction) + + ==> Use G4ParticleGun to shoot a 511 keV gamma through the housing into + liquid xenon scintillator + +G4UserStackingAction +-------------------- +(class: LXeStackingAction) + + ==> show how to count the number of secondary particles in an event + differentiates between different creator processes + +G4UserRunAction +--------------- +(class: LXeRunAction) + + ==> Call recorder class for begin and end of run + +G4UserSteppingAction +-------------------- +(class: LXeSteppingAction) + + ==> Identify which secondaries were generated during a particular step + + ==> ***Count reflections/absorptions/detections due to G4OpBoundaryProcess*** + ***Count absorptions due to G4OpAbsorption *** + Manually trigger a sensitive detector when a boundary process detects + + ==> Call recorder class at end of step + +G4UserTrackingAction +____________________ +(class: LXeTrackingAction) + + ==> Determine if the trajectory should be drawn by checking if it hit the + sphere(if enabled) and a pmt. + + ==> Call recorder class at end of track + +G4UserEventAction +----------------- +(class: LXeEventAction) + + ==> Triggers drawing of trajectories + + ==> Calculates and stores data in a G4VUserEventInformation object + + ==> Outputs basic event data at end of event + + ==> Decides if the random seed should be saved for this event + + ==> Call recorder class at begin and end of event + +G4VSensitiveDetector +-------------------- +(classes: LXePMTSD, LXeScintSD) + + ==> Basic sensitive detectors keeping hit collections + Keep one G4VHit object per hit + or + Keep one G4VHit object per volume containing hits + + ==> LXePMTSD decides if the hits it is creating should be redrawn + +G4VHit +------ +(classes: LXePMTHit, LXeScintHIT) + + ==> Store individual hit positions + or + Store a count of hits in a particular volume + + ==> Selectively redraw volumes containing hits at the end of event + +G4VUserEventInformation & G4VUserTrackInformation +------------------------------------------------- +(classes: LXeUserEventInformation, LXeUserTrackInformation) + + ==> Store aditional information along with the G4Event/G4Track objects + +G4VSteppingVerbose +------------------ +(classes: LXeSteppingVerbose) + + ==> Custom verbose stepping output to use G4BestUnit and print current volume + rather than next volume + ==> Same as ExN03SteppingVerbose but output reformated to fit nicer into + tables. + +G4UImessenger +------------- +(classes: LXeDetectorMessenger, LXeEventMessenger, LXeSteppingMessenger) + + ==> Create /LXe and /LXe/detector interactive command folders + + ==> Create new commands + + ==> See interactive help when running the example for descriptions of commands + +G4Trajectory +------------ +(class: LXeTrajectory) + + ==> Derived from G4Trajectory to use most of the basic trajectory functions + already defined + + ==> Uses a coppied and modified version of DrawTrajectory from G4VTrajectory + to enable/disable drawing of individual trajectories and to redefine + the colours used + +G4VisManager +------------ +(class: LXeVisManager) + + ==> Initialize graphics systems geant4 is configured for + +RecorderBase +------------ + + ==> Virtual class provided for recording of simulation data + + ==> Derive your own implementation from it and instantiate the recorder + object in main() + + ==> For full description see RecorderBase.hh + +********** +*Geometry* +********** +The way the geometry is constructed is an experiment for a new, more object +oriented, way to construct geometry. It seperates the concept of how a volume +is built from where it is placed. Each major volume in the geometry is defined +as a class derived from G4PVPlacement. In this example, just the main LXe +volume, the WLS scintillator slab, and the WLS fibers were chosen. To place +one of these volumes, simply create an instance of it with the appropriate +rotation, translation, and mother volumes. + +------- +LXeMainVolume(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c); +------- + +Also necessary are the pMany and pCopyNo variables with the same usage as in +G4PVPlacement. Additionally, the detector construction must be passed to the +main volume as a way to communicate the many parameters to the volume and its +sub-volumes. The communication is done from the CopyValues() function which +retrieves the information from the detector constructor. + +Notably, the name and logical volume parameters are no longer part of the +constructor. This is because they are both to be decided by the volume itself. +The volume must specify its own name and a temporary logical volume. The +constructor will then procede to define its logical volume in the normal way. +Once complete, the logical volume can be assigned to the physical volume using +the SetLogicalVolume() function. + +To handle instances of the same type of volume, a new logical volume should not +be defined for each one. Instead, the logical volume is kept as a static member +and defined only once. + +------ +if(!housing_log || updated){ +//... +//Define logical volume +//... +} +SetLogicalVolume(housing_log); +------ + +The updated variable is to signal that the volume needs to be updated and a new +logical volume made. + +*********************************** +*Modifying the geometry at runtime* +*********************************** +This example allows the user to modify the geometry definition at runtime. This +is accomplished through LXeDetecotrMessenger, a derived class of G4UImessenger. +The commands it adds change variables stored in LXeDetectorConstructor that +are used when constructing the geometry. After changing these variables +the /LXe/detector/update command must be issued to reconstruct the geometry +with the new values. + +------ +void LXeDetectorConstruction::UpdateGeometry(){ + // clean-up previous geometry + G4SolidStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4PhysicalVolumeStore::GetInstance()->Clean(); + + //define new one + G4RunManager::GetRunManager()->DefineWorldVolume(ConstructDetector()); + G4RunManager::GetRunManager()->GeometryHasBeenModified(); +} + +************************ +*PMT sensitive detector* +************************ +The PMT sensitive detector cannot be triggered like a normal sensitive detector +because the sensitive volume does not allow photons to pass through it. Rather, +it detects them in the OpBoundary process based on an efficiency set on the +skin of the volume. + +------ + + G4OpticalSurface* photocath_opsurf= + new G4OpticalSurface("photocath_opsurf",glisur,polished, + dielectric_metal); + G4double photocath_EFF[num]={1.,1.}; + G4double photocath_REFL[num]={0.,0.}; + G4MaterialPropertiesTable* photocath_mt = new G4MaterialPropertiesTable(); + photocath_mt->AddProperty("EFFICIENCY",Ephoton,photocath_EFF,num); + photocath_mt->AddProperty("REFLECTIVITY",Ephoton,photocath_REFL,num); + photocath_opsurf->SetMaterialPropertiesTable(photocath_mt); + new G4LogicalSkinSurface("photocath_surf",photocath_log,photocath_opsurf); + +------ + +A normal sensitive detector would have its ProcessHits +function called for each step by a particle inside the volume. So, to record +these hits with a sensitive detector we watched the status of the OpBoundary +process from the stepping manager whenever a photon hit the sensitive volume +of the pmt. If the status was 'Detection', we retrieve the sensitive detector +from G4SDManager and call its ProcessHits function. + +------ + + boundaryStatus=boundary->GetStatus(); + //Check to see if the particle was actually at a boundary + //Otherwise the boundary status may not be valid + //Prior to Geant4.6.0-p1 this would not have been enough to check + if(thePostPoint->GetStepStatus()==fGeomBoundary){ + switch(boundaryStatus){ + //... + case Detection: //Note, this assumes that the volume causing detection + //is the photocathode because it is the only one with + //non-zero efficiency + { + //Trigger sensitive detector manually since photon is + //absorbed but status was Detection + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + G4String sdName="/LXeDet/pmtSD"; + LXePMTSD* pmtSD = (LXePMTSD*)SDman + ->FindSensitiveDetector(sdName); + if(pmtSD) + pmtSD->ProcessHits_constStep(theStep,NULL); + break; + } + //... + } + +********************** +*Modular Physics List* +********************** +Using a modular physics list is an easy way to organize the physics list into +categories for easier maintenance. It can also assist with testing code +by making it easy to disable an entire category of physics at once if +necessary. The physics list instantiated in main() is a derived class of +G4VModularPhysics list rather than the usual G4VUserPhysicsList. The only +function aside from the constructor that is necessary in this class is +SetCuts(). The constructor must register the other physics lists individually. + +RegisterPhysics( new LXeGeneralPhysics("general") ); + +The other physics lists (the modules) are derived from G4VPhysicsConstructor +and it is necessary to write the ConstructParticle() and ConstructProcess() +functions for each list. They work in the same way as in G4VUserPhysicsList. + +Do not create instances of the individual physics processes as members of the +modules. Instead, use pointers to the processes and create the instances +in the ConstructProcess() function. The reason for this is that the materials +needed to build physics tables for the processes will not have been created +at the time that the modules are created but will have been created before the +ConstructProcess() function is called. + +********************************************************** +*Selectively drawing trajectories or highlighting volumes* +********************************************************** +In a simulation such as this one, where an average of 6000 trajectories are +generated in a small space, there is little use in drawing all of them. There +are two ways to select which ones to draw. The first of which is to decide +while looping through the trajectory container which ones to draw and only call +DrawTrajectory on the important ones. However, trajectories only contain a +small portion of the information from the track it represents. This may not +be enough to decide if a trajectory is worth drawing. + +The alternative is to define your own trajectory class to store additional +information to help decide if it should be drawn. To use your custom trajectory +you must create it in the PreUserTrackingAction: + +fpTrackingManager->SetTrajectory(new LXeTrajectory(aTrack)); + +Then at any point you can get access to the trajectory you can update the extra +information within it. When it comes to drawing, you can then use this to +decide if you want to call DrawTrajectory. Or you can call DrawTrajectory for +all trajectories and have the logic decide how and if a trajectory should +be drawn inside the DrawTrajectory function itself. + +Selectively highlighting volumes is useful to show which volumes were hit. To +do this, you simply need a pointer to the physical volume. With that, you can +modify its vis attributes and instruct the vis manager to redraw the volume +with the new vis attributes. + +------ + G4VisAttributes attribs(G4Colour(1.,0.,0.)); + attribs.SetForceSolid(true); + G4RotationMatrix rot; + if(physVol->GetRotation())//If a rotation is defined use it + rot=*(physVol->GetRotation()); + G4Transform3D trans(rot,physVol->GetTranslation());//Create transform + pVVisManager->Draw(*physVol,attribs,trans);//Draw it +------ + +In this case, it is done in Draw function of a PMT hit but it can be placed +anywhere. The logic to decide if it should be drawn or not may be similar to +the logic used in choosing which trajectories to draw. + +See /LXe/detector/volumes/sphere in "UI commands" below for info on what +trajectories are drawn in this simulation. + +**************************** +*Saving random engine seeds* +**************************** +At times it may be necessary to review a particular event of interest. To do +this without redoing an entire run, which may take a long time, you must store +the random engine seed from the beginning of the event. The run manager +has some functions that help in this task. + +G4RunManager::SetRandomNumberStore(G4bool) + +When set to true, this causes the run manager to write the seed for the +beginning of the current run to CurrentRun.rndm and the current event to +CurrentEvent.rndm. However, at the beginning of each event this file will be +overwritten with the new event. To keep a copy for a particular event there is +a function to copy this file to run###evt###.rndm. + +G4RunManager::rndmSaveThisEvent() + +This can be done for every event so you can review any event you like but this +may be awkward for runs with very large numbers of events. Instead, implement +some form of logic in EndOfEventAction to decide if the event is worth saving. +If it is, then call rndmSaveThisEvent(). By default, these files are stored in +the current working directory. There is a function to change this as well. +Typically you would call that at the same time SetRandomNumberStore. The +directory to save in must exist first. GEANT4 will not create it for you. + +G4RunManager::SetRandomNumberStoreDir(G4String) + +************** +*RecorderBase* +************** +RecorderBase is a virtual class to serve as a template for how to add +histogram functionality to a GEANT4 application. To use it, derive a +class from it and instantiate that in main(). Each of your user action classes +to do any recording must have a pointer to this instance. Then at the end of +the critical functions in each user action, call the appropriate recorder +function. The recorder functions and the functions to call them from are listed +here: + + RecordBeginOfRun(const G4Run*) + -Call from BeginOfRunAction() + RecordEndOfRun(const G4Run*) + -Call from EndOfRunAction() + RecordBeginOfEvent(const G4Event*) + -Call from BeginOfEventAction() + RecordEndOfEvent(const G4Event*) + -Call from EndOfEventAction() + RecordTrack(const G4Track*) + -Call from PostUserTrackingAction() + RecordStep(const G4Step*) + -Call from UserSteppingAction() + +For the reasoning behind why it is done this way see RecorderBase.hh + +************* +*UI commands* +************* +The method to define UI commands is well documented in the GEANT4 documentation +so will not be discussed here. This is a description of the commands added to +this example. + +Directories: +/LXe/ - All custom commands belong below this directory +/LXe/detector/ - Geometry related commands +/LXe/detector/volumes/ - Commands to enable/disable volumes in the geometry + +Commands: +/LXe/saveThreshold +-Specifies a threshold for saving the random seed for an event. If the number +of photons generated in an event is below this number then the random seed is +saved to ./random/run###evt###.rndm. See "Saving random engine seeds". + +/LXe/eventVerbose +-Enables end of event verbose data to be printed. This includes information +counted and calculated by the user action classes. + +/LXe/pmtThreshold +-Sets the PMT threshold in # of photons being detected by the PMT. PMTs below +with fewer hits than the threshold will not count as being hit and will also +not be highlighted at the end of the event. + +/LXe/oneStepPrimaries +-This causes primary particles to be killed after going only one step inside +the scintillator volume. This is useful to view the photons generated during +the initial conversion of the primary particle. + +/LXe/forceDrawPhotons +-Forces all optical photon trajectories to be drawn at the end of the event +regardless of the scheme mentioned in /LXe/detector/volumes/sphere below. + +/LXe/forceDrawNoPhotons +-Forces all optical photon trajectories to NOT be drawn at the end of the +event regardless of the scheme mentioned in /LXe/detector/volumes/sphere below. +-If /LXe/forceDrawPhotons is set to true, this has no effect. + +/LXe/detector/dimensions +-Sets the dimensions of the main scintillator volume. + +/LXe/detector/housingThickness +-Sets the thickness of the housing surrounding the main detector volume. + +/LXe/detector/pmtRadius +-Sets the radius of the PMTs + +/LXe/detector/nx +/LXe/detector/ny +/LXe/detector/nz +-Sets the number of PMTs placed in a row along each axis. + +/LXe/detector/reflectivity +-Sets the reflectivity of the inside of the aluminum housing. The geometry +uses a default value of 1.00 for a fully reflective surface. + +/LXe/detector/nfibers +-Sets the number of WLS fibers placed in the WLS scintillator slab. The +geometry uses a default value of 15 fibers. + +/LXe/detector/scintYieldFactor +-Sets the yield factor for the scintillation process. This is cumulative with +the yield factor set on individual materials. Set to 0 to produce no +scintillation photons. + +/LXe/detector/update +-Builds the new geometry based on any parameters that have been updated with +the other UI commands. ***This must be called for the changes to take effect*** + +/LXe/detector/defaults +-Resets all detector values customizable with commands above to their defaults. + +/LXe/detector/volumes/sphere +-Enables/disables the sphere placed inside the main scintillator volume. When +the sphere is enabled, only photons that hit the sphere and hit a PMT are +drawn. If it is disabled, then all photons that hit PMTs are drawn. + +/LXe/detector/volumes/wls +-Enables/disables the WLS scintillator slab containing WLS fibers. By default +this is not part of the geometry. Enabling it will place it behind the LXe +scintillator volume. + +/LXe/detector/volumes/lxe +-Enables/disables the main LXe scintillator volume. By default this is part of +the geometry. + +************* +*Macro files* +************* +The following are the macro files included in this example and what they do. + +LXe.in +-This produces a standard event with a 511 keV gamma fired into the LXe volume. +All values are left at their default states but verbose output has been +enabled. + +cerenkov.mac +-This is to demonstrate the cerenkov process. It disables the scintillation +process and uses a 200MeV mu+ to produce cerenkov photons. The volume has +been resized and the number of pmts has been increased to more accurately +show the cone. OneStepPrimaries has been enabled so that the cone does not fill +itself in as the muon slows down. + +wls.mac +-This disables the main volume and enables the WLS slab volume. It sets the +particle gun to use an e- to produce scintillation in the slab which will be +absorbed by the WLS fibers and re-emited at a different wavelength. + +vis.mac +-This is a standard vis.mac file to tell the vis manager how to visualize the +simulation. + +photon.mac +-A very simple test in which the gun is set to produce a single photon inside +the main scintillator volume. + +reviewEvent.mac +-This is to review an event by loading in a random seed and running the event +with verbose output. Modify the file to specify the filename of the random +seed. + +defaults.mac +-This resets all values that can be changed with the /LXe/ commands back to +their initial configuration including those that are not reset with +/LXe/detector/defaults diff --git a/examples/extended/optical/LXe/WALKTHROUGH b/examples/extended/optical/LXe/WALKTHROUGH new file mode 100644 index 0000000000..fda2fde6ba --- /dev/null +++ b/examples/extended/optical/LXe/WALKTHROUGH @@ -0,0 +1,73 @@ +#LXe Example Walkthrough +#----------------------- +# +#Follow these steps to see what this example can do. +# +#You can also execute steps 3-7 of this walkthrough as a macro file +#/control/execute WALKTHROUGH + +#1) Compile +#>cd LXe/ +#>gmake + +#2) Launch the program +#>$G4WORKDIR/bin/$G4SYSTEM/LXe + +#3) Run a basic event + +#3a)Turn on verbose output at end of event +# We'll leave it on for the rest of the events in the walkthrough too +/LXe/eventVerbose 1 + +#3b)Run +/run/beamOn + +#You will see a blue trajectory representing the gamma and some green +#trajectories representing the optical photons that hit the sphere and +#went into a pmt. Any pmt that had a trajectory drawn and is above it's +#threshold(1) will be redrawn red. + +#4) Run a cerenkov cone event +/control/execute cerenkov.mac +/run/beamOn + +#You will see a circle of PMTs that have lit up from the optical photons +#produced by the cerenkov process. The cone does not fill in because the +#primary particle was killed after one step in the scintillator. + +#5) Run a wls event +/control/execute wls.mac +/run/beamOn + +#You will see a number of green and red trajectories drawn. The green ones +#are the optical photons produced by scintillation. The red ones are created +#by the wavelength shifting(WLS) fibers which absorbed the scintillation +#photons and re-emited them at a different wavelength. Most of the WLS photons +#then travel down the fibers to the edge of the slab. + +#6) Modify the geometry yourself + +#6a)Turning the sphere off +/LXe/detector/defaults +/LXe/detector/volumes/sphere 0 +/LXe/detector/update + +#6b)Changing the dimensions +/LXe/detector/dimensions 15 15 50 cm +/LXe/detector/update + +#6c)Changing the PMTs +/LXe/detector/pmtRadius 0.5 cm +/LXe/detector/nx 15 +/LXe/detector/ny 15 +/LXe/detector/nz 50 +/LXe/detector/update + +#7) Test your new geometry +/gun/particle gamma +/run/beamOn + +#Done +# +#For more specific information +/random/setDirectoryName random2 diff --git a/examples/extended/optical/LXe/cerenkov.mac b/examples/extended/optical/LXe/cerenkov.mac new file mode 100644 index 0000000000..b5f0f1a46b --- /dev/null +++ b/examples/extended/optical/LXe/cerenkov.mac @@ -0,0 +1,35 @@ +################# +## +## This example demonstrates the cerenkov process by using a 200 MeV mu+ +## particle in a geometry configuration that shows the cerenkov cone +## and pmts hit by it. +## +################# + +/control/execute defaults.mac + +#This currently causes the program to crash due to a bug in geant4 +#Uncomment it once that bug has been fixed. Until then, to use this, +#modify LXePhysicsList to disable scintillation. +#/process/inactivate Scintillation + +/LXe/detector/MainScintYield 0 + +/LXe/detector/nx 20 +/LXe/detector/ny 20 +/LXe/detector/nz 0 +/LXe/detector/dimensions 60 60 25 cm +/LXe/detector/pmtRadius 1.5 cm +/LXe/detector/volumes/sphere 0 +/LXe/detector/reflectivity 0.0 +/LXe/detector/update + +/gun/particle mu+ +/gun/energy 200 MeV + +#This causes the primary particle to be killed after its first step in the +#scintillator volume. Thus preventing the cerenkov cone to fill in. +/LXe/oneStepPrimaries true + +#reset from a random seed that shows a good cone +/random/resetEngineFrom random/goodCerenkov.rndm diff --git a/examples/extended/optical/LXe/defaults.mac b/examples/extended/optical/LXe/defaults.mac new file mode 100644 index 0000000000..332c9ead1f --- /dev/null +++ b/examples/extended/optical/LXe/defaults.mac @@ -0,0 +1,6 @@ +#Resets all defaults +/LXe/detector/defaults +/LXe/detector/update +/LXe/oneStepPrimaries false +/gun/particle gamma +/gun/energy 511 keV diff --git a/examples/extended/optical/LXe/include/LXeDetectorConstruction.hh b/examples/extended/optical/LXe/include/LXeDetectorConstruction.hh new file mode 100644 index 0000000000..d0e4bf98e7 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeDetectorConstruction.hh @@ -0,0 +1,146 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeDetectorConstruction_H +#define LXeDetectorConstruction_H 1 + +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4Box; +class G4Tubs; +class LXePMTSD; +class LXeScintSD; +class G4Sphere; + +#include "G4Material.hh" +#include "LXeDetectorMessenger.hh" +#include "G4VisAttributes.hh" +#include "G4RotationMatrix.hh" +#include "G4VUserDetectorConstruction.hh" + +class LXeDetectorConstruction : public G4VUserDetectorConstruction +{ + public: + + LXeDetectorConstruction(); + ~LXeDetectorConstruction(); + + G4VPhysicalVolume* Construct(); + + //Functions to modify the geometry + void SetDimensions(G4ThreeVector dims); + void SetHousingThickness(G4double d_mtl); + void SetNX(G4int nx); + void SetNY(G4int ny); + void SetNZ(G4int nz); + void SetPMTRadius(G4double outerRadius_pmt); + void SetDefaults(); + + //Get values + G4double GetScintX(){return scint_x;} + G4double GetScintY(){return scint_y;} + G4double GetScintZ(){return scint_z;} + G4double GetHousingThickness(){return d_mtl;} + G4int GetNX(){return nx;} + G4int GetNY(){return ny;} + G4int GetNZ(){return nz;} + G4double GetPMTRadius(){return outerRadius_pmt;} + G4double GetSlabZ(){return slab_z;} + + //rebuild the geometry based on changes. must be called + void UpdateGeometry(); + G4bool GetUpdated(){return updated;} + + void SetSphereOn(G4bool b){sphereOn=b;updated=true;} + static G4bool GetSphereOn(){return sphereOn;} + + void SetHousingReflectivity(G4double r){refl=r;updated=true;} + G4double GetHousingReflectivity(){return refl;} + + void SetWLSSlabOn(G4bool b){WLSslab=b;updated=true;} + G4bool GetWLSSlabOn(){return WLSslab;} + + void SetMainVolumeOn(G4bool b){mainVolume=b;updated=true;} + G4bool GetMainVolumeOn(){return mainVolume;} + + void SetNFibers(G4int n){nfibers=n;updated=true;} + G4int GetNFibers(){return nfibers;} + + void SetMainScintYield(G4double y); + void SetWLSScintYield(G4double y); + +private: + + void DefineMaterials(); + G4VPhysicalVolume* ConstructDetector(); + + LXeDetectorMessenger* detectorMessenger; + + G4bool updated; + + G4Box* experimentalHall_box; + G4LogicalVolume* experimentalHall_log; + G4VPhysicalVolume* experimentalHall_phys; + + //Materials & Elements + G4Material* LXe; + G4Material* Al; + G4Element* N; + G4Element* O; + G4Material* Air; + G4Material* Vacuum; + G4Element* C; + G4Element* H; + G4Material* Glass; + G4Material* Pstyrene; + G4Material* PMMA; + G4Material* Pethylene; + G4Material* fPethylene; + + + + //Geometry + G4double scint_x; + G4double scint_y; + G4double scint_z; + G4double d_mtl; + G4int nx; + G4int ny; + G4int nz; + G4double outerRadius_pmt; + G4int nfibers; + static G4bool sphereOn; + G4double refl; + G4bool WLSslab; + G4bool mainVolume; + G4double slab_z; + + G4MaterialPropertiesTable* LXe_mt; + G4MaterialPropertiesTable* MPTPStyrene; + +}; + +#endif + + + + diff --git a/examples/extended/optical/LXe/include/LXeDetectorMessenger.hh b/examples/extended/optical/LXe/include/LXeDetectorMessenger.hh new file mode 100644 index 0000000000..ba1cf63f2b --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeDetectorMessenger.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeDetectorMessenger_h +#define LXeDetectorMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class LXeDetectorConstruction; +class G4UIdirectory; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWith3VectorAndUnit; +class G4UIcmdWithAnInteger; +class G4UIcommand; +class G4UIcmdWithABool; +class G4UIcmdWithADouble; + +class LXeDetectorMessenger: public G4UImessenger +{ +public: + LXeDetectorMessenger(LXeDetectorConstruction*); + ~LXeDetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + LXeDetectorConstruction* LXeDetector; + G4UIdirectory* detectorDir; + G4UIdirectory* volumesDir; + G4UIcmdWith3VectorAndUnit* dimensionsCmd; + G4UIcmdWithADoubleAndUnit* housingThicknessCmd; + G4UIcmdWithADoubleAndUnit* pmtRadiusCmd; + G4UIcmdWithAnInteger* nxCmd; + G4UIcmdWithAnInteger* nyCmd; + G4UIcmdWithAnInteger* nzCmd; + G4UIcmdWithABool* sphereCmd; + G4UIcmdWithADouble* reflectivityCmd; + G4UIcmdWithABool* wlsCmd; + G4UIcmdWithABool* lxeCmd; + G4UIcmdWithAnInteger* nFibersCmd; + G4UIcommand* updateCmd; + G4UIcommand* defaultsCmd; + G4UIcmdWithADouble* MainScintYield; + G4UIcmdWithADouble* WLSScintYield; +}; + +#endif + diff --git a/examples/extended/optical/LXe/include/LXeEMPhysics.hh b/examples/extended/optical/LXe/include/LXeEMPhysics.hh new file mode 100644 index 0000000000..3ce5808082 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeEMPhysics.hh @@ -0,0 +1,79 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeEMPhysics_h +#define LXeEMPhysics_h 1 + +#include "globals.hh" +#include "G4ios.hh" + +#include "G4VPhysicsConstructor.hh" + +#include "G4PhotoElectricEffect.hh" +#include "G4ComptonScattering.hh" +#include "G4GammaConversion.hh" +#include "G4MultipleScattering.hh" +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +class LXeEMPhysics : public G4VPhysicsConstructor +{ + public: + LXeEMPhysics(const G4String& name ="EM"); + virtual ~LXeEMPhysics(); + + 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(); + + protected: + // Gamma physics + G4PhotoElectricEffect* thePhotoEffect; + G4ComptonScattering* theComptonEffect; + G4GammaConversion* thePairProduction; + + // Electron physics + G4MultipleScattering* theElectronMultipleScattering; + G4eIonisation* theElectronIonisation; + G4eBremsstrahlung* theElectronBremsStrahlung; + + //Positron physics + G4MultipleScattering* thePositronMultipleScattering; + G4eIonisation* thePositronIonisation; + G4eBremsstrahlung* thePositronBremsStrahlung; + G4eplusAnnihilation* theAnnihilation; +}; + + +#endif + + + + + diff --git a/examples/extended/optical/LXe/include/LXeEventAction.hh b/examples/extended/optical/LXe/include/LXeEventAction.hh new file mode 100644 index 0000000000..0614db50eb --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeEventAction.hh @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeEventAction_h +#define LXeEventAction_h 1 + +#include "LXeEventMessenger.hh" +#include "G4UserEventAction.hh" +#include "globals.hh" +#include "G4ThreeVector.hh" + +class G4Event; +class RecorderBase; + +class LXeEventAction : public G4UserEventAction +{ +public: + LXeEventAction(RecorderBase*); + ~LXeEventAction(); + +public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + + void SetSaveThreshold(G4int save); + + void SetEventVerbose(G4int v){verbose=v;} + + void SetPMTThreshold(G4int t){pmtThreshold=t;} + + void SetForceDrawPhotons(G4bool b){forcedrawphotons=b;} + void SetForceDrawNoPhotons(G4bool b){forcenophotons=b;} + +private: + RecorderBase* recorder; + LXeEventMessenger* eventMessenger; + + G4int saveThreshold; + + G4int scintCollID; + G4int pmtCollID; + + G4int verbose; + + G4int pmtThreshold; + + G4bool forcedrawphotons; + G4bool forcenophotons; + +}; + +#endif + + diff --git a/examples/extended/optical/LXe/include/LXeEventMessenger.hh b/examples/extended/optical/LXe/include/LXeEventMessenger.hh new file mode 100644 index 0000000000..56ae1bf448 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeEventMessenger.hh @@ -0,0 +1,52 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeEventMessenger_h +#define LXeEventMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class LXeEventAction; +class G4UIcmdWithAnInteger; +class G4UIcmdWithABool; + +class LXeEventMessenger: public G4UImessenger +{ +public: + LXeEventMessenger(LXeEventAction*); + ~LXeEventMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + LXeEventAction* LXeEvent; + G4UIcmdWithAnInteger* saveThresholdCmd; + G4UIcmdWithAnInteger* verboseCmd; + G4UIcmdWithAnInteger* pmtThresholdCmd; + G4UIcmdWithABool* forceDrawPhotonsCmd; + G4UIcmdWithABool* forceDrawNoPhotonsCmd; +}; + +#endif + diff --git a/examples/extended/electromagnetic/TestEm5/include/PhysListGeneral.hh b/examples/extended/optical/LXe/include/LXeGeneralPhysics.hh similarity index 70% rename from examples/extended/electromagnetic/TestEm5/include/PhysListGeneral.hh rename to examples/extended/optical/LXe/include/LXeGeneralPhysics.hh index fff29ad23d..adbb21989d 100644 --- a/examples/extended/electromagnetic/TestEm5/include/PhysListGeneral.hh +++ b/examples/extended/optical/LXe/include/LXeGeneralPhysics.hh @@ -20,39 +20,37 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListGeneral.hh,v 1.2 2003/10/07 11:58:29 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#ifndef LXeGeneralPhysics_h +#define LXeGeneralPhysics_h 1 -#ifndef PhysListGeneral_h -#define PhysListGeneral_h 1 +#include "globals.hh" +#include "G4ios.hh" #include "G4VPhysicsConstructor.hh" -#include "globals.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -class PhysListGeneral : public G4VPhysicsConstructor +#include "G4Decay.hh" + +class LXeGeneralPhysics : public G4VPhysicsConstructor { public: - PhysListGeneral(const G4String& name = "general"); - ~PhysListGeneral(); + LXeGeneralPhysics(const G4String& name = "general"); + virtual ~LXeGeneralPhysics(); public: - // This method is dummy for physics - void ConstructParticle() {}; + // 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 - void ConstructProcess(); + virtual void ConstructProcess(); + protected: + G4Decay* fDecayProcess; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif diff --git a/examples/extended/optical/LXe/include/LXeMainVolume.hh b/examples/extended/optical/LXe/include/LXeMainVolume.hh new file mode 100644 index 0000000000..91153f6aed --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeMainVolume.hh @@ -0,0 +1,102 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeMainVolume_H +#define LXeMainVolume_H 1 + +#include "G4PVPlacement.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4Sphere.hh" +#include "G4Material.hh" +#include "G4LogicalVolume.hh" +#include "G4OpticalSurface.hh" + +#include "LXeDetectorConstruction.hh" + +class LXeMainVolume : public G4PVPlacement +{ +public: + LXeMainVolume(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c); +private: + void VisAttributes(); + void SurfaceProperties(); + + void PlacePMTs(G4LogicalVolume* pmt_Log, + G4RotationMatrix* rot, G4double &a, G4double &b, G4double da, + G4double db, G4double amin, G4double bmin, G4int na, G4int nb, + G4double &x, G4double &y, G4double &z, G4int &k,LXePMTSD* sd); + + void CopyValues(); + + G4bool updated; + + LXeDetectorConstruction* constructor; + + G4double scint_x; + G4double scint_y; + G4double scint_z; + G4double d_mtl; + G4int nx; + G4int ny; + G4int nz; + G4double outerRadius_pmt; + G4bool sphereOn; + G4double refl; + + //Basic Volumes + // + G4Box* scint_box; + G4Box* housing_box; + G4Tubs* pmt; + G4Tubs* photocath; + G4Sphere* sphere; + + + // Logical volumes + // + G4LogicalVolume* scint_log; + static G4LogicalVolume* housing_log; + G4LogicalVolume* pmt_log; + G4LogicalVolume* photocath_log; + G4LogicalVolume* sphere_log; + + // Physical volumes + // + G4VPhysicalVolume* scint_phys; + //keeping pointers to these is pointless really since there are many of them + //but I'm doing it to be consistent + G4VPhysicalVolume* pmt_phys; + G4VPhysicalVolume* photocath_phys; + G4VPhysicalVolume* sphere_phys; + + //Sensitive Detectors + static LXeScintSD* scint_SD; + static LXePMTSD* pmt_SD; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeMuonPhysics.hh b/examples/extended/optical/LXe/include/LXeMuonPhysics.hh new file mode 100644 index 0000000000..a5001c4a83 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeMuonPhysics.hh @@ -0,0 +1,72 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeMuonPhysics_h +#define LXeMuonPhysics_h 1 + +#include "globals.hh" +#include "G4ios.hh" + +#include "G4VPhysicsConstructor.hh" +#include "G4MultipleScattering.hh" +#include "G4MuBremsstrahlung.hh" +#include "G4MuPairProduction.hh" +#include "G4MuIonisation.hh" +#include "G4hIonisation.hh" + +#include "G4MuonMinusCaptureAtRest.hh" + +class LXeMuonPhysics : public G4VPhysicsConstructor +{ + public: + LXeMuonPhysics(const G4String& name="muon"); + virtual ~LXeMuonPhysics(); + + 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(); + + protected: + // Muon physics + G4MuIonisation* fMuPlusIonisation; + G4MultipleScattering* fMuPlusMultipleScattering; + G4MuBremsstrahlung* fMuPlusBremsstrahlung ; + G4MuPairProduction* fMuPlusPairProduction; + + G4MuIonisation* fMuMinusIonisation; + G4MultipleScattering* fMuMinusMultipleScattering; + G4MuBremsstrahlung* fMuMinusBremsstrahlung ; + G4MuPairProduction* fMuMinusPairProduction; + + G4MuonMinusCaptureAtRest* fMuMinusCaptureAtRest; + +}; + + +#endif + diff --git a/examples/extended/optical/LXe/include/LXeOpPhysMessenger.hh b/examples/extended/optical/LXe/include/LXeOpPhysMessenger.hh new file mode 100644 index 0000000000..1c18730345 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeOpPhysMessenger.hh @@ -0,0 +1,50 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeOpPhysMessenger_h +#define LXeOpPhysMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class LXeOpticalPhysics; +class G4UIcmdWithADouble; + +class LXeOpPhysMessenger: public G4UImessenger +{ +public: + LXeOpPhysMessenger(LXeOpticalPhysics*); + ~LXeOpPhysMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + + LXeOpticalPhysics* OpPhys; + + G4UIcmdWithADouble* yieldCmd; + +}; + +#endif + diff --git a/examples/extended/electromagnetic/TestEm3/include/PhysListGeneral.hh b/examples/extended/optical/LXe/include/LXeOpticalPhysics.hh similarity index 66% rename from examples/extended/electromagnetic/TestEm3/include/PhysListGeneral.hh rename to examples/extended/optical/LXe/include/LXeOpticalPhysics.hh index 636aecf06f..320febe933 100644 --- a/examples/extended/electromagnetic/TestEm3/include/PhysListGeneral.hh +++ b/examples/extended/optical/LXe/include/LXeOpticalPhysics.hh @@ -20,39 +20,50 @@ // * statement, and all its terms. * // ******************************************************************** // -// -// $Id: PhysListGeneral.hh,v 1.2 2003/10/06 10:09:23 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -// -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -#ifndef PhysListGeneral_h -#define PhysListGeneral_h 1 +#ifndef LXeOpticalPhysics_h +#define LXeOpticalPhysics_h 1 + +#include "globals.hh" +#include "G4ios.hh" #include "G4VPhysicsConstructor.hh" -#include "globals.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +#include "G4Scintillation.hh" +#include "G4Cerenkov.hh" +#include "G4OpAbsorption.hh" +#include "G4OpRayleigh.hh" +#include "G4OpBoundaryProcess.hh" +#include "G4OpWLS.hh" -class PhysListGeneral : public G4VPhysicsConstructor +class LXeOpticalPhysics : public G4VPhysicsConstructor { - public: - PhysListGeneral(const G4String& name = "general"); - ~PhysListGeneral(); +public: + LXeOpticalPhysics(const G4String& name ="optical"); + virtual ~LXeOpticalPhysics(); - public: - // This method is dummy for physics - void ConstructParticle() {}; +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 - void ConstructProcess(); + virtual void ConstructProcess(); + void SetScintYieldFactor(G4double yf); + +protected: + + G4Scintillation* theScintProcess; + G4Cerenkov* theCerenkovProcess; + G4OpAbsorption* theAbsorptionProcess; + G4OpRayleigh* theRayleighScattering; + G4OpBoundaryProcess* theBoundaryProcess; + G4OpWLS* theWLSProcess; }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #endif @@ -60,6 +71,3 @@ class PhysListGeneral : public G4VPhysicsConstructor - - - diff --git a/examples/extended/optical/LXe/include/LXePMTHit.hh b/examples/extended/optical/LXe/include/LXePMTHit.hh new file mode 100644 index 0000000000..037421a6d1 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXePMTHit.hh @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXePMTHit_h +#define LXePMTHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4VPhysicalVolume.hh" + +class G4VTouchable; + +class LXePMTHit : public G4VHit +{ +public: + + LXePMTHit(); + ~LXePMTHit(); + LXePMTHit(const LXePMTHit &right); + + const LXePMTHit& operator=(const LXePMTHit &right); + G4int operator==(const LXePMTHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + + inline void SetDrawit(G4bool b){drawit=b;} + inline G4bool GetDrawit(){return drawit;} + + inline void IncPhotonCount(){photons++;} + inline G4int GetPhotonCount(){return photons;} + + inline void SetPMTNumber(G4int n) { pmtNumber = n; } + inline G4int GetPMTNumber() { return pmtNumber; } + + inline void SetPMTPhysVol(G4VPhysicalVolume* physVol){this->physVol=physVol;} + inline G4VPhysicalVolume* GetPMTPhysVol(){return physVol;} + + inline void SetPMTPos(G4double x,G4double y,G4double z){ + pos=G4ThreeVector(x,y,z); + } + + inline G4ThreeVector GetPMTPos(){return pos;} + +private: + G4int pmtNumber; + G4int photons; + G4ThreeVector pos; + G4VPhysicalVolume* physVol; + G4bool drawit; + +}; + +typedef G4THitsCollection LXePMTHitsCollection; + +extern G4Allocator LXePMTHitAllocator; + +inline void* LXePMTHit::operator new(size_t){ + void *aHit; + aHit = (void *) LXePMTHitAllocator.MallocSingle(); + return aHit; +} + +inline void LXePMTHit::operator delete(void *aHit){ + LXePMTHitAllocator.FreeSingle((LXePMTHit*) aHit); +} + +#endif + + diff --git a/examples/extended/optical/LXe/include/LXePMTSD.hh b/examples/extended/optical/LXe/include/LXePMTSD.hh new file mode 100644 index 0000000000..d1052d9394 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXePMTSD.hh @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXePMTSD_h +#define LXePMTSD_h 1 + +#include "G4DataVector.hh" +#include "G4VSensitiveDetector.hh" +#include "LXePMTHit.hh" +class G4Step; +class G4HCofThisEvent; + +class LXePMTSD : public G4VSensitiveDetector +{ + +public: + LXePMTSD(G4String name); + ~LXePMTSD(); + + void Initialize(G4HCofThisEvent* HCE); + G4bool ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist); + + //A version of processHits that keeps aStep constant + G4bool ProcessHits_constStep(const G4Step* aStep, + G4TouchableHistory* ROhist); + void EndOfEvent(G4HCofThisEvent* HCE); + void clear(); + void DrawAll(); + void PrintAll(); + + //Initialize the arrays to store pmt possitions + inline void InitPMTs(G4int nPMTs){ + if(pmtPositionsX)delete pmtPositionsX; + if(pmtPositionsY)delete pmtPositionsY; + if(pmtPositionsZ)delete pmtPositionsZ; + pmtPositionsX=new G4DataVector(nPMTs); + pmtPositionsY=new G4DataVector(nPMTs); + pmtPositionsZ=new G4DataVector(nPMTs); + } + + //Store a pmt position + inline void SetPMTPos(G4int n,G4double x,G4double y,G4double z){ + if(pmtPositionsX)pmtPositionsX->insertAt(n,x); + if(pmtPositionsY)pmtPositionsY->insertAt(n,y); + if(pmtPositionsZ)pmtPositionsZ->insertAt(n,z); + } + +private: + LXePMTHitsCollection* pmtHitCollection; + + G4DataVector* pmtPositionsX; + G4DataVector* pmtPositionsY; + G4DataVector* pmtPositionsZ; +}; + +#endif + diff --git a/examples/extended/optical/LXe/include/LXePhysicsList.hh b/examples/extended/optical/LXe/include/LXePhysicsList.hh new file mode 100644 index 0000000000..a694e4b039 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXePhysicsList.hh @@ -0,0 +1,47 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXePhysicsList_h +#define LXePhysicsList_h 1 + +#include "G4VModularPhysicsList.hh" +#include "globals.hh" + +class LXePhysicsList: public G4VModularPhysicsList +{ +public: + LXePhysicsList(); + virtual ~LXePhysicsList(); + +public: + // SetCuts() + virtual void SetCuts(); + + +}; + + +#endif + + + diff --git a/examples/extended/optical/LXe/include/LXePrimaryGeneratorAction.hh b/examples/extended/optical/LXe/include/LXePrimaryGeneratorAction.hh new file mode 100644 index 0000000000..5f7bde4f66 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXePrimaryGeneratorAction.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXePrimaryGeneratorAction_h +#define LXePrimaryGeneratorAction_h 1 + +#include "G4GeneralParticleSource.hh" +#include "G4VUserPrimaryGeneratorAction.hh" + +class G4ParticleGun; +class G4Event; + +class LXePrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ +public: + LXePrimaryGeneratorAction(); + ~LXePrimaryGeneratorAction(); + +public: + void GeneratePrimaries(G4Event* anEvent); + +private: + G4ParticleGun* particleGun; +}; + +#endif + + diff --git a/examples/extended/optical/LXe/include/LXeRunAction.hh b/examples/extended/optical/LXe/include/LXeRunAction.hh new file mode 100644 index 0000000000..8e5cc16e50 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeRunAction.hh @@ -0,0 +1,43 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "G4UserRunAction.hh" + +#ifndef LXeRunAction_h +#define LXeRunAction_h 1 + +class RecorderBase; + +class LXeRunAction : public G4UserRunAction +{ +public: + LXeRunAction(RecorderBase*); + ~LXeRunAction(); + + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run*); + +private: + RecorderBase* recorder; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeScintHit.hh b/examples/extended/optical/LXe/include/LXeScintHit.hh new file mode 100644 index 0000000000..68179c7ac2 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeScintHit.hh @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeScintHit_h +#define LXeScintHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4VPhysicalVolume.hh" + +class LXeScintHit : public G4VHit +{ +public: + + LXeScintHit(); + LXeScintHit(G4VPhysicalVolume* pVol); + ~LXeScintHit(); + LXeScintHit(const LXeScintHit &right); + const LXeScintHit& operator=(const LXeScintHit &right); + G4int operator==(const LXeScintHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + + inline void SetEdep(G4double de) { edep = de; } + inline void AddEdep(G4double de) { edep += de; } + inline G4double GetEdep() { return edep; } + + inline void SetPos(G4ThreeVector xyz) { pos = xyz; } + inline G4ThreeVector GetPos() { return pos; } + + inline const G4VPhysicalVolume * GetPhysV() { return physVol; } + +private: + G4double edep; + G4ThreeVector pos; + const G4VPhysicalVolume* physVol; + +}; + +typedef G4THitsCollection LXeScintHitsCollection; + +extern G4Allocator LXeScintHitAllocator; + +inline void* LXeScintHit::operator new(size_t) +{ + void *aHit; + aHit = (void *) LXeScintHitAllocator.MallocSingle(); + return aHit; +} + +inline void LXeScintHit::operator delete(void *aHit) +{ + LXeScintHitAllocator.FreeSingle((LXeScintHit*) aHit); +} + +#endif + + diff --git a/examples/extended/optical/LXe/include/LXeScintSD.hh b/examples/extended/optical/LXe/include/LXeScintSD.hh new file mode 100644 index 0000000000..1ad0bd7862 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeScintSD.hh @@ -0,0 +1,52 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeScintSD_h +#define LXeScintSD_h 1 + +#include "LXeScintHit.hh" + +#include "G4VSensitiveDetector.hh" + +class G4Step; +class G4HCofThisEvent; + +class LXeScintSD : public G4VSensitiveDetector +{ +public: + LXeScintSD(G4String name); + ~LXeScintSD(); + + void Initialize(G4HCofThisEvent* HCE); + G4bool ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist); + void EndOfEvent(G4HCofThisEvent* HCE); + void clear(); + void DrawAll(); + void PrintAll(); + +private: + LXeScintHitsCollection* scintCollection; + +}; + +#endif + diff --git a/examples/extended/optical/LXe/include/LXeStackingAction.hh b/examples/extended/optical/LXe/include/LXeStackingAction.hh new file mode 100644 index 0000000000..bb36cb42d4 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeStackingAction.hh @@ -0,0 +1,42 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeStackingAction_H +#define LXeStackingAction_H 1 + +#include "globals.hh" +#include "G4UserStackingAction.hh" + +class LXeStackingAction : public G4UserStackingAction +{ +public: + LXeStackingAction(); + ~LXeStackingAction(); + + virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track* aTrack); + virtual void NewStage(); + virtual void PrepareNewEvent(); + +private: +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeSteppingAction.hh b/examples/extended/optical/LXe/include/LXeSteppingAction.hh new file mode 100644 index 0000000000..087ad458b1 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeSteppingAction.hh @@ -0,0 +1,50 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeSteppingAction_H +#define LXeSteppingACtion_H 1 + +#include "globals.hh" +#include "G4UserSteppingAction.hh" + +class RecorderBase; +class LXeEventAction; +class LXeTrackingAction; +class LXeSteppingMessenger; + +class LXeSteppingAction : public G4UserSteppingAction +{ +public: + LXeSteppingAction(RecorderBase*); + ~LXeSteppingAction(); + virtual void UserSteppingAction(const G4Step*); + + void SetOneStepPrimaries(G4bool b){oneStepPrimaries=b;} + G4bool GetOneStepPrimaries(){return oneStepPrimaries;} + +private: + RecorderBase* recorder; + G4bool oneStepPrimaries; + LXeSteppingMessenger* steppingMessenger; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeSteppingMessenger.hh b/examples/extended/optical/LXe/include/LXeSteppingMessenger.hh new file mode 100644 index 0000000000..f5602cfec9 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeSteppingMessenger.hh @@ -0,0 +1,48 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeSteppingMessenger_h +#define LXeSteppingMessenger_h 1 + +#include "G4UImessenger.hh" +#include "globals.hh" + +class LXeSteppingAction; +class G4UIcmdWithABool; + +class LXeSteppingMessenger: public G4UImessenger +{ +public: + LXeSteppingMessenger(LXeSteppingAction*); + ~LXeSteppingMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + LXeSteppingAction* stepping; + G4UIcmdWithABool* oneStepPrimariesCmd; + +}; + +#endif + diff --git a/examples/extended/optical/LXe/include/LXeSteppingVerbose.hh b/examples/extended/optical/LXe/include/LXeSteppingVerbose.hh new file mode 100644 index 0000000000..ba0bc4fc6f --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeSteppingVerbose.hh @@ -0,0 +1,46 @@ +// +// ******************************************************************** +// * 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 LXeSteppingVerbose; + +#ifndef LXeSteppingVerbose_h +#define LXeSteppingVerbose_h 1 + +#include "G4SteppingVerbose.hh" + + +class LXeSteppingVerbose : public G4SteppingVerbose +{ + public: + + LXeSteppingVerbose(); + ~LXeSteppingVerbose(); + + void StepInfo(); + void TrackingStarted(); + +}; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +#endif diff --git a/examples/extended/optical/LXe/include/LXeTrackingAction.hh b/examples/extended/optical/LXe/include/LXeTrackingAction.hh new file mode 100644 index 0000000000..5c6cb71f64 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeTrackingAction.hh @@ -0,0 +1,46 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeTrackingAction_h +#define LXeTrackingAction_h 1 + +#include "G4UserTrackingAction.hh" +#include "globals.hh" + +class RecorderBase; + +class LXeTrackingAction : public G4UserTrackingAction { + +public: + LXeTrackingAction(RecorderBase*); + ~LXeTrackingAction() {}; + + void PreUserTrackingAction(const G4Track*); + void PostUserTrackingAction(const G4Track*); + +private: + RecorderBase* recorder; + +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeTrajectory.hh b/examples/extended/optical/LXe/include/LXeTrajectory.hh new file mode 100644 index 0000000000..778e23cd65 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeTrajectory.hh @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeTrajectory_h +#define LXeTrajectory_h 1 + +#include "G4Trajectory.hh" +#include "G4Allocator.hh" +#include "G4ios.hh" +#include "globals.hh" +#include "G4ParticleDefinition.hh" +#include "G4TrajectoryPoint.hh" +#include "G4Track.hh" +#include "G4Step.hh" + +class G4Polyline; // Forward declaration. + +class LXeTrajectory : public G4Trajectory +{ +public: + LXeTrajectory(); + LXeTrajectory(const G4Track* aTrack); + LXeTrajectory(LXeTrajectory &); + virtual ~LXeTrajectory(); + + virtual void DrawTrajectory(G4int i_mode=0) const; + + inline void* operator new(size_t); + inline void operator delete(void*); + + void SetDrawTrajectory(G4bool b){drawit=b;} + void WLS(){wls=true;} + void SetForceDrawTrajectory(G4bool b){forceDraw=b;} + void SetForceNoDrawTrajectory(G4bool b){forceNoDraw=b;} +private: + G4bool wls; + G4bool drawit; + G4bool forceNoDraw; + G4bool forceDraw; + G4ParticleDefinition* particleDefinition; +}; + +extern G4Allocator LXeTrajectoryAllocator; + +inline void* LXeTrajectory::operator new(size_t) +{ + void* aTrajectory; + aTrajectory = (void*)LXeTrajectoryAllocator.MallocSingle(); + return aTrajectory; +} + +inline void LXeTrajectory::operator delete(void* aTrajectory) +{ + LXeTrajectoryAllocator.FreeSingle((LXeTrajectory*)aTrajectory); +} + +#endif diff --git a/examples/extended/optical/LXe/include/LXeUserEventInformation.hh b/examples/extended/optical/LXe/include/LXeUserEventInformation.hh new file mode 100644 index 0000000000..a47242c496 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeUserEventInformation.hh @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "G4VUserEventInformation.hh" +#include "G4ThreeVector.hh" +#include "globals.hh" + +#ifndef LXeUserEventInformation_h +#define LXeUserEventInformation_h 1 + +class LXeUserEventInformation : public G4VUserEventInformation +{ +public: + LXeUserEventInformation(); + ~LXeUserEventInformation(); + + inline void Print()const{}; + + void IncPhotonCount_Scint(){photonCount_Scint++;} + void IncPhotonCount_Ceren(){photonCount_Ceren++;} + void IncEDep(G4double dep){totE+=dep;} + void IncAbsorption(){absorptionCount++;} + void IncBoundaryAbsorption(){boundaryAbsorptionCount++;} + void IncHitCount(G4int i=1){hitCount+=i;} + + void SetEWeightPos(const G4ThreeVector& p){eWeightPos=p;} + void SetReconPos(const G4ThreeVector& p){reconPos=p;} + void SetConvPos(const G4ThreeVector& p){convPos=p;convPosSet=true;} + void SetPosMax(const G4ThreeVector& p,G4double edep){posMax=p;edepMax=edep;} + + G4int GetPhotonCount_Scint()const {return photonCount_Scint;} + G4int GetPhotonCount_Ceren()const {return photonCount_Ceren;} + G4int GetHitCount()const {return hitCount;} + G4double GetEDep()const {return totE;} + G4int GetAbsorptionCount()const {return absorptionCount;} + G4int GetBoundaryAbsorptionCount() const {return boundaryAbsorptionCount;} + + G4ThreeVector GetEWeightPos(){return eWeightPos;} + G4ThreeVector GetReconPos(){return reconPos;} + G4ThreeVector GetConvPos(){return convPos;} + G4ThreeVector GetPosMax(){return posMax;} + G4double GetEDepMax(){return edepMax;} + G4double IsConvPosSet(){return convPosSet;} + + //Gets the total photon count produced + G4int GetPhotonCount(){return photonCount_Scint+photonCount_Ceren;} + + void IncPMTSAboveThreshold(){pmtsAboveThreshold++;} + G4int GetPMTSAboveThreshold(){return pmtsAboveThreshold;} + +private: + + G4int hitCount; + G4int photonCount_Scint; + G4int photonCount_Ceren; + G4int absorptionCount; + G4int boundaryAbsorptionCount; + + G4double totE; + + //These only have meaning if totE > 0 + //If totE = 0 then these wont be set by EndOfEventAction + G4ThreeVector eWeightPos; + G4ThreeVector reconPos; //Also relies on hitCount>0 + G4ThreeVector convPos;//true (initial) converstion position + G4bool convPosSet; + G4ThreeVector posMax; + G4double edepMax; + + G4int pmtsAboveThreshold; + +}; + +#endif + + + + + diff --git a/examples/extended/optical/LXe/include/LXeUserTrackInformation.hh b/examples/extended/optical/LXe/include/LXeUserTrackInformation.hh new file mode 100644 index 0000000000..2ea9b232b1 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeUserTrackInformation.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "G4VUserTrackInformation.hh" +#include "globals.hh" + +#ifndef LXeUserTrackInformation_h +#define LXeUserTrackInformation_h 1 + +enum LXeTrackStatus { active=1, hitPMT=2, absorbed=4, boundaryAbsorbed=8, + hitSphere=16, inactive=14}; + +/*LXeTrackStatus: + active: still being tracked + hitPMT: stopped by being detected in a PMT + absorbed: stopped by being absorbed with G4OpAbsorbtion + boundaryAbsorbed: stopped by being aborbed with G4OpAbsorbtion + hitSphere: track hit the sphere at some point + inactive: track is stopped for some reason + -This is the sum of all stopped flags so can be used to remove stopped flags + + */ + +class LXeUserTrackInformation : public G4VUserTrackInformation +{ +public: + LXeUserTrackInformation(); + ~LXeUserTrackInformation(); + + //Sets the track status to s (does not check validity of flags) + void SetTrackStatusFlags(int s){status=s;} + //Does a smart add of track status flags (disabling old flags that conflict) + //If s conflicts with itself it will not be detected + void AddTrackStatusFlag(int s); + + int GetTrackStatus()const {return status;} + + void IncReflections(){reflections++;} + G4int GetReflectionCount()const {return reflections;} + + void SetForceDrawTrajectory(G4bool b){forcedraw=b;} + G4bool GetForceDrawTrajectory(){return forcedraw;} + + inline void Print()const{}; +private: + int status; + G4int reflections; + G4bool forcedraw; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeVisManager.hh b/examples/extended/optical/LXe/include/LXeVisManager.hh new file mode 100644 index 0000000000..4496adb7d6 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeVisManager.hh @@ -0,0 +1,44 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifndef LXeVisManager_h +#define LXeVisManager_h 1 + +#ifdef G4VIS_USE + +#include "G4VisManager.hh" + +class LXeVisManager: public G4VisManager +{ +public: + + LXeVisManager (); + +private: + + void RegisterGraphicsSystems (); +}; + +#endif + +#endif diff --git a/examples/extended/optical/LXe/include/LXeWLSFiber.hh b/examples/extended/optical/LXe/include/LXeWLSFiber.hh new file mode 100644 index 0000000000..b3f08ae424 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeWLSFiber.hh @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeMainVolume_H +#define LXeMainVolume_H 1 + +#include "G4PVPlacement.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4Sphere.hh" +#include "G4Material.hh" +#include "G4LogicalVolume.hh" +#include "G4OpticalSurface.hh" + +#include "LXeDetectorConstruction.hh" + +class LXeWLSFiber : public G4PVPlacement +{ +public: + LXeWLSFiber(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c); +private: + + void CopyValues(); + + static G4LogicalVolume* clad2_log; + + G4bool updated; //does the fiber need to be rebuilt + + G4double fiber_rmin; + G4double fiber_rmax; + G4double fiber_z; + G4double fiber_sphi; + G4double fiber_ephi; + + G4double clad1_rmin; + G4double clad1_rmax; + G4double clad1_z; + G4double clad1_sphi; + G4double clad1_ephi; + + G4double clad2_rmin; + G4double clad2_rmax; + G4double clad2_z; + G4double clad2_sphi; + G4double clad2_ephi; + + LXeDetectorConstruction* constructor; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/LXeWLSSlab.hh b/examples/extended/optical/LXe/include/LXeWLSSlab.hh new file mode 100644 index 0000000000..6a47dbce97 --- /dev/null +++ b/examples/extended/optical/LXe/include/LXeWLSSlab.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef LXeWLSSlab_H +#define LXeWLSSlab_H 1 + +#include "G4PVPlacement.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4Material.hh" +#include "G4LogicalVolume.hh" +#include "G4OpticalSurface.hh" + +#include "LXeDetectorConstruction.hh" + +class LXeWLSSlab : public G4PVPlacement +{ +public: + LXeWLSSlab(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c); +private: + void CopyValues(); + + LXeDetectorConstruction* constructor; + + G4bool updated; + + static G4LogicalVolume* ScintSlab_log; + + G4int nfibers; + G4double scint_x; + G4double scint_y; + G4double scint_z; + G4double slab_z; +}; + +#endif diff --git a/examples/extended/optical/LXe/include/RecorderBase.hh b/examples/extended/optical/LXe/include/RecorderBase.hh new file mode 100644 index 0000000000..e0bbdb6f0f --- /dev/null +++ b/examples/extended/optical/LXe/include/RecorderBase.hh @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// RecorderBase.hh +// 1-Sep-1999 Bill Seligman + +// This is an abstract base class to be used with Geant 4.0.1 (and +// possibly higher, if the User classes don't change). + +// The concept of a Recorder object is that it records the activities of +// Geant in a manner that is useful to a physicist. Perhaps this record +// takes the form of histograms, or ntuples, or entries in an Objectivity +// database. This class does not care HOW the information is recorded; it +// abstracts the behavior of a generalized recorder of Geant variables. + +// No object should be instantiated from the Recorder class (in fact, any such +// object won't do anything). The user must define a new class (say, a class +// that creates histograms) and overload the methods of this class. + +// Why do this? First of all, it keeps all record-keeping in a single class: +// the class that inherits Recorder. The original Geant documentation suggests +// that recording activities should be split among many different classes +// (initialization in G4UserRunAction, recording in G4UserSteppingAction, etc.). +// If you use a Recorder class, than all the record-keeping details are kept in +// a single class instead of being spread out among many different classes. + +// Secondly, by using an abstract Recorder class, you hide the implementation +// details from the rest of Geant. If you change a couple of histograms, only +// the Recorder-derived class and main() re-compile. No other class knows or +// cares what or how you record. + +// The only time this class (i.e., this header file) changes is if new +// user action classes are added to Geant. + +#ifndef RECORDER_BASE_H_ +#define RECORDER_BASE_H_ + +// The following objects are the arguments to the methods +// invoked in the user action classes. In other words, they +// contain the variables that we are normally able to record +// in Geant. + +#include "G4Run.hh" +#include "G4Event.hh" +#include "G4Track.hh" +#include "G4Step.hh" + + +class RecorderBase { + +public: + + virtual ~RecorderBase() {}; + + // The following a list of methods that correspond to the available + // user action classes in Geant 4.0.1. In this base class, the + // methods are defined to do nothing. + + virtual void RecordBeginOfRun(const G4Run*) = 0; + virtual void RecordEndOfRun(const G4Run*) = 0; + virtual void RecordBeginOfEvent(const G4Event*) {}; + virtual void RecordEndOfEvent(const G4Event*) {}; + virtual void RecordTrack(const G4Track*) {}; + virtual void RecordStep(const G4Step*) {}; + +}; + +#endif diff --git a/examples/extended/optical/LXe/photon.mac b/examples/extended/optical/LXe/photon.mac new file mode 100644 index 0000000000..fc8864a753 --- /dev/null +++ b/examples/extended/optical/LXe/photon.mac @@ -0,0 +1,8 @@ +#This sets the gun up to shoot an optical photon + +/gun/particle opticalphoton +/gun/energy 7.07 eV +/gun/position 5 5 -5 +/gun/direction 0 0 1 +/gun/polarization 0 1 0 +/tracking/verbose 1 diff --git a/examples/extended/optical/LXe/random/goodCerenkov.rndm b/examples/extended/optical/LXe/random/goodCerenkov.rndm new file mode 100644 index 0000000000..e0e4cd656f --- /dev/null +++ b/examples/extended/optical/LXe/random/goodCerenkov.rndm @@ -0,0 +1,4 @@ +9876 +0.56681203842163085938 0.8818575739860534668 0.1730893254280090332 0.14319986104965209961 0.035721004009246826172 0.34925764799118041992 0.28501272201538085938 0.38132303953170776367 0.62201237678527832031 0.20565438270568847656 0.51734459400177001953 0.0018442273139953613281 0.83568513393402099609 0.67255008220672607422 0.022201955318450927734 0.31370401382446289062 0.65152716636657714844 0.51525962352752685547 0.13611382246017456055 0.39237362146377563477 0.17890757322311401367 0.018748521804809570312 0.74669891595840454102 0.63569098711013793945 0.073960602283477783203 0.33233171701431274414 0.69413357973098754883 0.82883942127227783203 0.59673321247100830078 0.41404730081558227539 0.89632904529571533203 0.4291197657585144043 0.70435327291488647461 0.37617194652557373047 0.4301236271858215332 0.99019861221313476562 0.5244274139404296875 0.8363087773323059082 0.8305816650390625 0.57788676023483276367 0.91085344552993774414 0.21985799074172973633 0.54762703180313110352 0.11778682470321655273 0.9188111424446105957 0.72943127155303955078 0.46844464540481567383 0.2827618718147277832 0.99514055252075195312 0.72067165374755859375 0.12396198511123657227 0.080310046672821044922 0.70882409811019897461 0.52431392669677734375 0.88081890344619750977 0.99685639142990112305 0.94265908002853393555 0.33713871240615844727 0.74416977167129516602 0.22824853658676147461 0.082926869392395019531 0.18564522266387939453 0.34945064783096313477 0.60222530364990234375 0.017525255680084228516 0.43096917867660522461 0.48324662446975708008 0.39256495237350463867 0.0072730183601379394531 0.63571560382843017578 0.17306280136108398438 0.97272169589996337891 0.7579097747802734375 0.55440682172775268555 0.14758986234664916992 0.41869682073593139648 0.79592418670654296875 0.86972385644912719727 0.54268193244934082031 0.997844696044921875 0.86584252119064331055 0.43902021646499633789 0.78208905458450317383 0.88179171085357666016 0.87943494319915771484 0.90155231952667236328 0.087386727333068847656 0.61781984567642211914 0.30473810434341430664 0.47076767683029174805 0.73844110965728759766 0.14166754484176635742 0.30390328168869018555 0.46929192543029785156 0.55683130025863647461 0.28227478265762329102 0.95229834318161010742 +0.76775765419006347656 0.45623308420181274414 0.99999982118606567383 +23 diff --git a/examples/extended/optical/LXe/random/run0.rndm b/examples/extended/optical/LXe/random/run0.rndm new file mode 100644 index 0000000000..1be7c1c9c4 --- /dev/null +++ b/examples/extended/optical/LXe/random/run0.rndm @@ -0,0 +1,4 @@ +9876 +0.92125302553176879883 0.51544678211212158203 0.67267376184463500977 0.99960952997207641602 0.73500490188598632812 0.14663052558898925781 0.327220916748046875 0.28244459629058837891 0.78949397802352905273 0.093892931938171386719 0.096919715404510498047 0.25809901952743530273 0.30182248353958129883 0.10896265506744384766 0.90281927585601806641 0.14277166128158569336 0.56514334678649902344 0.19390600919723510742 0.34528815746307373047 0.6997076869010925293 0.16365110874176025391 0.2057622075080871582 0.66192162036895751953 0.77415615320205688477 0.47197580337524414062 0.39650458097457885742 0.20748364925384521484 0.29045593738555908203 0.84009760618209838867 0.29163771867752075195 0.59290927648544311523 0.31230205297470092773 0.56357717514038085938 0.65972506999969482422 0.42169034481048583984 0.8014284968376159668 0.37207293510437011719 0.38072133064270019531 0.12004232406616210938 0.067275762557983398438 0.66892981529235839844 0.40911883115768432617 0.28658241033554077148 0.83672672510147094727 0.063057541847229003906 0.75380331277847290039 0.94101244211196899414 0.96997821331024169922 0.94666111469268798828 0.85202765464782714844 0.27402770519256591797 0.29762184619903564453 0.74813288450241088867 0.80445879697799682617 0.92037785053253173828 0.41038811206817626953 0.96435499191284179688 0.18090295791625976562 0.48866999149322509766 0.25927275419235229492 0.0071230530738830566406 0.92619866132736206055 0.45841747522354125977 0.47095978260040283203 0.65414857864379882812 0.59665590524673461914 0.28430700302124023438 0.14905124902725219727 0.33299231529235839844 0.83767873048782348633 0.87545442581176757812 0.99776959419250488281 0.89845907688140869141 0.17407262325286865234 0.3612766265869140625 0.35344660282135009766 0.39899152517318725586 0.875675201416015625 0.68153816461563110352 0.70409196615219116211 0.11360943317413330078 0.31014680862426757812 0.60188585519790649414 0.33334380388259887695 0.69083064794540405273 0.20584398508071899414 0.3993466496467590332 0.49265468120574951172 0.099120676517486572266 0.66696119308471679688 0.79467463493347167969 0.4049422144889831543 0.45345091819763183594 0.21245485544204711914 0.28231561183929443359 0.76128053665161132812 0.3698933720588684082 +0.55329096317291259766 0.45623308420181274414 0.99999982118606567383 +58 diff --git a/examples/extended/optical/LXe/reviewEvent.mac b/examples/extended/optical/LXe/reviewEvent.mac new file mode 100644 index 0000000000..1eeddc5851 --- /dev/null +++ b/examples/extended/optical/LXe/reviewEvent.mac @@ -0,0 +1,6 @@ +#quickly review a particular event +#replace file name with that of the correct event + +/random/resetEngineFrom random/run0.rndm +/tracking/verbose 1 +/run/beamOn diff --git a/examples/extended/optical/LXe/src/LXeDetectorConstruction.cc b/examples/extended/optical/LXe/src/LXeDetectorConstruction.cc new file mode 100644 index 0000000000..a2a629a681 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeDetectorConstruction.cc @@ -0,0 +1,359 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeDetectorConstruction.hh" +#include "LXePMTSD.hh" +#include "LXeScintSD.hh" +#include "LXeDetectorMessenger.hh" +#include "LXeMainVolume.hh" +#include "LXeWLSSlab.hh" + +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4LogicalBorderSurface.hh" +#include "G4LogicalSkinSurface.hh" +#include "G4OpticalSurface.hh" +#include "G4MaterialTable.hh" +#include "G4VisAttributes.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4Sphere.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "globals.hh" +#include "G4SolidStore.hh" +#include "G4LogicalVolumeStore.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4GeometryManager.hh" +#include "G4UImanager.hh" + +G4bool LXeDetectorConstruction::sphereOn = true; + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeDetectorConstruction::LXeDetectorConstruction(){ + SetDefaults(); + detectorMessenger = new LXeDetectorMessenger(this); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeDetectorConstruction::~LXeDetectorConstruction(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::DefineMaterials(){ + G4double a; // atomic mass + G4double z; // atomic number + G4double density; + + G4int polyPMMA = 1; + G4int nC_PMMA = 3+2*polyPMMA; + G4int nH_PMMA = 6+2*polyPMMA; + + G4int polyeth = 1; + G4int nC_eth = 2*polyeth; + G4int nH_eth = 4*polyeth; + + //***Elements + H = new G4Element("H", "H", z=1., a=1.01*g/mole); + C = new G4Element("C", "C", z=6., a=12.01*g/mole); + N = new G4Element("N", "N", z=7., a= 14.01*g/mole); + O = new G4Element("O" , "O", z=8., a= 16.00*g/mole); + + //***Materials + //Liquid Xenon + LXe = new G4Material("LXe",z=54.,a=131.29*g/mole,density=3.020*g/cm3); + //Aluminum + Al = new G4Material("Al",z=13.,a=26.98*g/mole,density=2.7*g/cm3); + //Vacuum + Vacuum = new G4Material("Vacuum",z=1.,a=1.01*g/mole, + density=universe_mean_density,kStateGas,0.1*kelvin, + 1.e-19*pascal); + //Air + Air = new G4Material("Air", density= 1.29*mg/cm3, 2); + Air->AddElement(N, 70*perCent); + Air->AddElement(O, 30*perCent); + //Glass + Glass = new G4Material("Glass", density=1.032*g/cm3,2); + Glass->AddElement(C,91.533*perCent); + Glass->AddElement(H,8.467*perCent); + //Polystyrene + Pstyrene = new G4Material("Polystyrene", density= 1.03*g/cm3, 2); + Pstyrene->AddElement(C, 8); + Pstyrene->AddElement(H, 8); + //Fiber(PMMA) + PMMA = new G4Material("PMMA", density=1190*kg/m3,3); + PMMA->AddElement(H,nH_PMMA); + PMMA->AddElement(C,nC_PMMA); + PMMA->AddElement(O,2); + //Cladding(polyethylene) + Pethylene = new G4Material("Pethylene", density=1200*kg/m3,2); + Pethylene->AddElement(H,nH_eth); + Pethylene->AddElement(C,nC_eth); + //Double cladding(flourinated polyethylene) + fPethylene = new G4Material("fPethylene", density=1400*kg/m3,2); + fPethylene->AddElement(H,nH_eth); + fPethylene->AddElement(C,nC_eth); + + //***Material properties tables + + const G4int LXe_NUMENTRIES = 3; + G4double LXe_Energy[LXe_NUMENTRIES] = { 7.0*eV , 7.07*eV, 7.14*eV }; + + G4double LXe_SCINT[LXe_NUMENTRIES] = { 0.1, 1.0, 0.1 }; + G4double LXe_RIND[LXe_NUMENTRIES] = { 1.59 , 1.57, 1.54 }; + G4double LXe_ABSL[LXe_NUMENTRIES] = { 35.*cm, 35.*cm, 35.*cm}; + LXe_mt = new G4MaterialPropertiesTable(); + LXe_mt->AddProperty("FASTCOMPONENT", LXe_Energy, LXe_SCINT, LXe_NUMENTRIES); + LXe_mt->AddProperty("SLOWCOMPONENT", LXe_Energy, LXe_SCINT, LXe_NUMENTRIES); + LXe_mt->AddProperty("RINDEX", LXe_Energy, LXe_RIND, LXe_NUMENTRIES); + LXe_mt->AddProperty("ABSLENGTH", LXe_Energy, LXe_ABSL, LXe_NUMENTRIES); + LXe_mt->AddConstProperty("SCINTILLATIONYIELD",12000./MeV); + LXe_mt->AddConstProperty("RESOLUTIONSCALE",1.0); + LXe_mt->AddConstProperty("FASTTIMECONSTANT",20.*ns); + LXe_mt->AddConstProperty("SLOWTIMECONSTANT",45.*ns); + LXe_mt->AddConstProperty("YIELDRATIO",1.0); + LXe->SetMaterialPropertiesTable(LXe_mt); + + G4double Glass_RIND[LXe_NUMENTRIES]={1.49,1.49,1.49}; + G4double Glass_AbsLength[LXe_NUMENTRIES]={420.*cm,420.*cm,420.*cm}; + G4MaterialPropertiesTable *Glass_mt = new G4MaterialPropertiesTable(); + Glass_mt->AddProperty("ABSLENGTH",LXe_Energy,Glass_AbsLength,LXe_NUMENTRIES); + Glass_mt->AddProperty("RINDEX",LXe_Energy,Glass_RIND,LXe_NUMENTRIES); + Glass->SetMaterialPropertiesTable(Glass_mt); + + G4double Vacuum_Energy[LXe_NUMENTRIES]={2.0*eV,7.0*eV,7.14*eV}; + G4double Vacuum_RIND[LXe_NUMENTRIES]={1.,1.,1.}; + G4MaterialPropertiesTable *Vacuum_mt = new G4MaterialPropertiesTable(); + Vacuum_mt->AddProperty("RINDEX", Vacuum_Energy, Vacuum_RIND,LXe_NUMENTRIES); + Vacuum->SetMaterialPropertiesTable(Vacuum_mt); + Air->SetMaterialPropertiesTable(Vacuum_mt);//Give air the same rindex + + const G4int WLS_NUMENTRIES = 4; + G4double WLS_Energy[] = {2.00*eV,2.87*eV,2.90*eV,3.47*eV}; + + G4double RIndexPstyrene[WLS_NUMENTRIES]={ 1.5, 1.5, 1.5, 1.5}; + G4double Absorption1[WLS_NUMENTRIES]={2.*cm, 2.*cm, 2.*cm, 2.*cm}; + G4double ScintilFast[WLS_NUMENTRIES]={1.00, 1.00, 0.00, 0.00}; + MPTPStyrene = new G4MaterialPropertiesTable(); + MPTPStyrene->AddProperty("RINDEX",WLS_Energy,RIndexPstyrene,WLS_NUMENTRIES); + MPTPStyrene->AddProperty("ABSLENGTH",WLS_Energy,Absorption1,WLS_NUMENTRIES); + MPTPStyrene->AddProperty("FASTCOMPONENT",WLS_Energy, ScintilFast, + WLS_NUMENTRIES); + MPTPStyrene->AddConstProperty("SCINTILLATIONYIELD",10./keV); + MPTPStyrene->AddConstProperty("RESOLUTIONSCALE",1.0); + MPTPStyrene->AddConstProperty("FASTTIMECONSTANT", 10.*ns); + Pstyrene->SetMaterialPropertiesTable(MPTPStyrene); + + G4double RefractiveIndexFiber[WLS_NUMENTRIES]={ 1.60, 1.60, 1.60, 1.60}; + G4double AbsFiber[WLS_NUMENTRIES]={0.1*mm,0.1*mm,9.00*m,9.00*m}; + G4double EmissionFib[WLS_NUMENTRIES]={0.0, 0.0,1.0, 1.0}; + G4MaterialPropertiesTable* MPTFiber = new G4MaterialPropertiesTable(); + MPTFiber->AddProperty("RINDEX",WLS_Energy,RefractiveIndexFiber, + WLS_NUMENTRIES); + MPTFiber->AddProperty("WLSABSLENGTH",WLS_Energy,AbsFiber,WLS_NUMENTRIES); + MPTFiber->AddProperty("WLSCOMPONENT",WLS_Energy,EmissionFib,WLS_NUMENTRIES); + MPTFiber->AddConstProperty("WLSTIMECONSTANT", 0.5*ns); + PMMA->SetMaterialPropertiesTable(MPTFiber); + + G4double RefractiveIndexClad1[WLS_NUMENTRIES]={ 1.49, 1.49, 1.49, 1.49}; + G4MaterialPropertiesTable* MPTClad1 = new G4MaterialPropertiesTable(); + MPTClad1->AddProperty("RINDEX",WLS_Energy,RefractiveIndexClad1, + WLS_NUMENTRIES); + MPTClad1->AddProperty("ABSLENGTH",WLS_Energy,AbsFiber,WLS_NUMENTRIES); + Pethylene->SetMaterialPropertiesTable(MPTClad1); + + G4double RefractiveIndexClad2[WLS_NUMENTRIES]={ 1.42, 1.42, 1.42, 1.42}; + G4MaterialPropertiesTable* MPTClad2 = new G4MaterialPropertiesTable(); + MPTClad2->AddProperty("RINDEX",WLS_Energy,RefractiveIndexClad2, + WLS_NUMENTRIES); + MPTClad2->AddProperty("ABSLENGTH",WLS_Energy,AbsFiber,WLS_NUMENTRIES); + fPethylene->SetMaterialPropertiesTable(MPTClad2); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4VPhysicalVolume* LXeDetectorConstruction::Construct(){ + DefineMaterials(); + return ConstructDetector(); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4VPhysicalVolume* LXeDetectorConstruction::ConstructDetector() +{ + //The experimental hall walls are all 1m away from housing walls + G4double expHall_x = scint_x+d_mtl+1.*m; + G4double expHall_y = scint_y+d_mtl+1.*m; + G4double expHall_z = scint_z+d_mtl+1.*m; + + //Create experimental hall + experimentalHall_box + = new G4Box("expHall_box",expHall_x,expHall_y,expHall_z); + experimentalHall_log = new G4LogicalVolume(experimentalHall_box, + Vacuum,"expHall_log",0,0,0); + experimentalHall_phys = new G4PVPlacement(0,G4ThreeVector(), + experimentalHall_log,"expHall",0,false,0); + + experimentalHall_log->SetVisAttributes(G4VisAttributes::Invisible); + + //Place the main volume + if(mainVolume){ + new LXeMainVolume(0,G4ThreeVector(),experimentalHall_log,false,0,this); + } + + //Place the WLS slab + if(WLSslab){ + G4VPhysicalVolume* slab = new LXeWLSSlab(0,G4ThreeVector(0.,0., + -scint_z/2.-slab_z-1.*cm), + experimentalHall_log,false,0, + this); + + //Surface properties for the WLS slab + G4OpticalSurface* ScintWrap = new G4OpticalSurface("ScintWrap"); + + new G4LogicalBorderSurface("ScintWrap", slab, + experimentalHall_phys, + ScintWrap); + + ScintWrap->SetType(dielectric_metal); + ScintWrap->SetFinish(polished); + ScintWrap->SetModel(glisur); + + const G4int NUM = 2; + + G4double pp[NUM] = {2.0*eV, 3.5*eV}; + G4double reflectivity[NUM] = {1., 1.}; + G4double efficiency[NUM] = {0.0, 0.0}; + + G4MaterialPropertiesTable* ScintWrapProperty + = new G4MaterialPropertiesTable(); + + ScintWrapProperty->AddProperty("REFLECTIVITY",pp,reflectivity,NUM); + ScintWrapProperty->AddProperty("EFFICIENCY",pp,efficiency,NUM); + ScintWrap->SetMaterialPropertiesTable(ScintWrapProperty); + } + + return experimentalHall_phys; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetDimensions(G4ThreeVector dims){ + this->scint_x=dims[0]; + this->scint_y=dims[1]; + this->scint_z=dims[2]; + updated=true; +} + + //_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetHousingThickness(G4double d_mtl){ + this->d_mtl=d_mtl; + updated=true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetNX(G4int nx){ + this->nx=nx; + updated=true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetNY(G4int ny){ + this->ny=ny; + updated=true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetNZ(G4int nz){ + this->nz=nz; + updated=true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetPMTRadius(G4double outerRadius_pmt){ + this->outerRadius_pmt=outerRadius_pmt; + updated=true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::SetDefaults(){ + //Resets to default values + d_mtl=0.0635*cm; + + scint_x = 17.8*cm; + scint_y = 17.8*cm; + scint_z = 22.6*cm; + + nx = 2; + ny = 2; + nz = 3; + + outerRadius_pmt = 2.3*cm; + + sphereOn = true; + refl=1.0; + + nfibers=15; + WLSslab=false; + mainVolume=true; + slab_z=2.5*mm; + + G4UImanager::GetUIpointer() + ->ApplyCommand("/LXe/detector/scintYieldFactor 1."); + + if(LXe_mt)LXe_mt->AddConstProperty("SCINTILLATIONYIELD",12000./MeV); + if(MPTPStyrene)MPTPStyrene->AddConstProperty("SCINTILLATIONYIELD",10./keV); + + updated=true; +} + + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorConstruction::UpdateGeometry(){ + + // clean-up previous geometry + G4GeometryManager::GetInstance()->OpenGeometry(); + + G4PhysicalVolumeStore::GetInstance()->Clean(); + G4LogicalVolumeStore::GetInstance()->Clean(); + G4SolidStore::GetInstance()->Clean(); + G4LogicalSkinSurface::CleanSurfaceTable(); + G4LogicalBorderSurface::CleanSurfaceTable(); + + //define new one + G4RunManager::GetRunManager()->DefineWorldVolume(ConstructDetector()); + G4RunManager::GetRunManager()->GeometryHasBeenModified(); + + updated=false; +} + +void LXeDetectorConstruction::SetMainScintYield(G4double y){ + LXe_mt->AddConstProperty("SCINTILLATIONYIELD",y/MeV); +} + +void LXeDetectorConstruction::SetWLSScintYield(G4double y){ + MPTPStyrene->AddConstProperty("SCINTILLATIONYIELD",y/MeV); +} + + + + + diff --git a/examples/extended/optical/LXe/src/LXeDetectorMessenger.cc b/examples/extended/optical/LXe/src/LXeDetectorMessenger.cc new file mode 100644 index 0000000000..3dc8d0b260 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeDetectorMessenger.cc @@ -0,0 +1,185 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeDetectorMessenger.hh" +#include "LXeDetectorConstruction.hh" + +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWith3VectorAndUnit.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcommand.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithABool.hh" +#include "G4UIcmdWithADouble.hh" +#include "G4Scintillation.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeDetectorMessenger::LXeDetectorMessenger(LXeDetectorConstruction* LXeDetect) +:LXeDetector(LXeDetect) +{ + //Setup a command directory for detector controls with guidance + detectorDir = new G4UIdirectory("/LXe/detector/"); + detectorDir->SetGuidance("Detector geometry control"); + + volumesDir = new G4UIdirectory("/LXe/detector/volumes/"); + volumesDir->SetGuidance("Enable/disable volumes"); + + //Various commands for modifying detector geometry + dimensionsCmd = + new G4UIcmdWith3VectorAndUnit("/LXe/detector/dimensions",this); + dimensionsCmd->SetGuidance("Set the dimensions of the detector volume."); + dimensionsCmd->SetParameterName("scint_x","scint_y","scint_z",false); + dimensionsCmd->SetDefaultUnit("cm"); + + housingThicknessCmd = new G4UIcmdWithADoubleAndUnit + ("/LXe/detector/housingThickness",this); + housingThicknessCmd->SetGuidance("Set the thickness of the housing."); + housingThicknessCmd->SetParameterName("d_mtl",false); + housingThicknessCmd->SetDefaultUnit("cm"); + + pmtRadiusCmd = new G4UIcmdWithADoubleAndUnit + ("/LXe/detector/pmtRadius",this); + pmtRadiusCmd->SetGuidance("Set the radius of the PMTs."); + pmtRadiusCmd->SetParameterName("radius",false); + pmtRadiusCmd->SetDefaultUnit("cm"); + + nxCmd = new G4UIcmdWithAnInteger("/LXe/detector/nx",this); + nxCmd->SetGuidance("Set the number of PMTs along the x-dimension."); + nxCmd->SetParameterName("nx",false); + + nyCmd = new G4UIcmdWithAnInteger("/LXe/detector/ny",this); + nyCmd->SetGuidance("Set the number of PMTs along the y-dimension."); + nyCmd->SetParameterName("ny",false); + + nzCmd = new G4UIcmdWithAnInteger("/LXe/detector/nz",this); + nzCmd->SetGuidance("Set the number of PMTs along the z-dimension."); + nzCmd->SetParameterName("nz",false); + + sphereCmd = new G4UIcmdWithABool("/LXe/detector/volumes/sphere",this); + sphereCmd->SetGuidance("Enable/Disable the sphere."); + + reflectivityCmd = new G4UIcmdWithADouble("/LXe/detector/reflectivity",this); + reflectivityCmd->SetGuidance("Set the reflectivity of the housing."); + + wlsCmd = new G4UIcmdWithABool("/LXe/detector/volumes/wls",this); + wlsCmd->SetGuidance("Enable/Disable the WLS slab"); + + lxeCmd = new G4UIcmdWithABool("/LXe/detector/volumes/lxe",this); + wlsCmd->SetGuidance("Enable/Disable the main detector volume."); + + nFibersCmd = new G4UIcmdWithAnInteger("/LXe/detector/nfibers",this); + nFibersCmd->SetGuidance("Set the number of WLS fibers in the WLS slab."); + + updateCmd = new G4UIcommand("/LXe/detector/update",this); + updateCmd->SetGuidance("Update the detector geometry with changed values."); + updateCmd->SetGuidance + ("Must be run before beamOn if detector has been changed."); + + defaultsCmd = new G4UIcommand("/LXe/detector/defaults",this); + defaultsCmd->SetGuidance("Set all detector geometry values to defaults."); + defaultsCmd->SetGuidance("(Update still required)"); + + MainScintYield=new G4UIcmdWithADouble("/LXe/detector/MainScintYield",this); + MainScintYield->SetGuidance("Set scinitillation yield of main volume."); + MainScintYield->SetGuidance("Specified in photons/MeV"); + + WLSScintYield = new G4UIcmdWithADouble("/LXe/detector/WLSScintYield",this); + WLSScintYield->SetGuidance("Set scintillation yield of WLS Slab"); + WLSScintYield->SetGuidance("Specified in photons/MeV"); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeDetectorMessenger::~LXeDetectorMessenger() +{ + delete dimensionsCmd; + delete housingThicknessCmd; + delete pmtRadiusCmd; + delete nxCmd; + delete nyCmd; + delete nzCmd; + delete updateCmd; + delete detectorDir; + delete volumesDir; + delete defaultsCmd; + delete sphereCmd; + delete wlsCmd; + delete lxeCmd; + delete nFibersCmd; + delete reflectivityCmd; + delete MainScintYield; + delete WLSScintYield; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeDetectorMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if( command == dimensionsCmd ){ + LXeDetector->SetDimensions(dimensionsCmd->GetNew3VectorValue(newValue)); + } + else if (command == housingThicknessCmd){ + LXeDetector->SetHousingThickness(housingThicknessCmd + ->GetNewDoubleValue(newValue)); + } + else if (command == pmtRadiusCmd){ + LXeDetector->SetPMTRadius(pmtRadiusCmd->GetNewDoubleValue(newValue)); + } + else if (command == nxCmd){ + LXeDetector->SetNX(nxCmd->GetNewIntValue(newValue)); + } + else if (command == nyCmd){ + LXeDetector->SetNY(nyCmd->GetNewIntValue(newValue)); + } + else if (command == nzCmd){ + LXeDetector->SetNZ(nzCmd->GetNewIntValue(newValue)); + } + else if (command == updateCmd){ + LXeDetector->UpdateGeometry(); + } + else if (command == defaultsCmd){ + LXeDetector->SetDefaults(); + } + else if (command == sphereCmd){ + LXeDetector->SetSphereOn(sphereCmd->GetNewBoolValue(newValue)); + } + else if (command == reflectivityCmd){ + LXeDetector + ->SetHousingReflectivity(reflectivityCmd->GetNewDoubleValue(newValue)); + } + else if (command == wlsCmd){ + LXeDetector->SetWLSSlabOn(wlsCmd->GetNewBoolValue(newValue)); + } + else if (command == lxeCmd){ + LXeDetector->SetMainVolumeOn(lxeCmd->GetNewBoolValue(newValue)); + } + else if (command == nFibersCmd){ + LXeDetector->SetNFibers(nFibersCmd->GetNewIntValue(newValue)); + } + else if (command == MainScintYield){ + LXeDetector->SetMainScintYield(MainScintYield->GetNewDoubleValue(newValue)); + } + else if (command == WLSScintYield){ + LXeDetector->SetWLSScintYield(WLSScintYield->GetNewDoubleValue(newValue)); + } +} + + + diff --git a/examples/extended/optical/LXe/src/LXeEMPhysics.cc b/examples/extended/optical/LXe/src/LXeEMPhysics.cc new file mode 100644 index 0000000000..1da64b6bb1 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeEMPhysics.cc @@ -0,0 +1,111 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeEMPhysics.hh" + +#include "globals.hh" +#include "G4ios.hh" +#include + + +LXeEMPhysics::LXeEMPhysics(const G4String& name) + : G4VPhysicsConstructor(name) +{ +} + +LXeEMPhysics::~LXeEMPhysics() +{ +} + +#include "G4ParticleDefinition.hh" +#include "G4ParticleTable.hh" + +#include "G4Gamma.hh" + +#include "G4Electron.hh" +#include "G4Positron.hh" + +#include "G4NeutrinoE.hh" +#include "G4AntiNeutrinoE.hh" + +void LXeEMPhysics::ConstructParticle() +{ + // gamma + G4Gamma::GammaDefinition(); + + // electron + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); + G4NeutrinoE::NeutrinoEDefinition(); + G4AntiNeutrinoE::AntiNeutrinoEDefinition(); +} + + +#include "G4ProcessManager.hh" + + +void LXeEMPhysics::ConstructProcess() +{ + thePhotoEffect = new G4PhotoElectricEffect(); + theComptonEffect = new G4ComptonScattering(); + thePairProduction = new G4GammaConversion(); + + // Electron physics + theElectronMultipleScattering = new G4MultipleScattering(); + theElectronIonisation = new G4eIonisation(); + theElectronBremsStrahlung = new G4eBremsstrahlung(); + + //Positron physics + thePositronMultipleScattering = new G4MultipleScattering(); + thePositronIonisation = new G4eIonisation(); + thePositronBremsStrahlung = new G4eBremsstrahlung(); + theAnnihilation = new G4eplusAnnihilation(); + + + G4ProcessManager * pManager = 0; + + // Gamma Physics + pManager = G4Gamma::Gamma()->GetProcessManager(); + pManager->AddDiscreteProcess(thePhotoEffect); + pManager->AddDiscreteProcess(theComptonEffect); + pManager->AddDiscreteProcess(thePairProduction); + + // Electron Physics + pManager = G4Electron::Electron()->GetProcessManager(); + + pManager->AddProcess(theElectronMultipleScattering, -1, 1, 1); + pManager->AddProcess(theElectronIonisation, -1, 2, 2); + pManager->AddProcess(theElectronBremsStrahlung, -1, 3, 3); + + + //Positron Physics + pManager = G4Positron::Positron()->GetProcessManager(); + + pManager->AddProcess(thePositronMultipleScattering, -1, 1, 1); + pManager->AddProcess(thePositronIonisation, -1, 2, 2); + pManager->AddProcess(thePositronBremsStrahlung, -1, 3, 3); + pManager->AddProcess(theAnnihilation, 0,-1, 4); + +} + + + diff --git a/examples/extended/optical/LXe/src/LXeEventAction.cc b/examples/extended/optical/LXe/src/LXeEventAction.cc new file mode 100644 index 0000000000..bb270ce8e2 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeEventAction.cc @@ -0,0 +1,207 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeEventAction.hh" +#include "LXeScintHit.hh" +#include "LXePMTHit.hh" +#include "LXeUserEventInformation.hh" +#include "LXeTrajectory.hh" +#include "RecorderBase.hh" + +#include "G4EventManager.hh" +#include "G4SDManager.hh" +#include "G4RunManager.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4ios.hh" +#include "G4UImanager.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeEventAction::LXeEventAction(RecorderBase* r) + :recorder(r),saveThreshold(0),scintCollID(-1),pmtCollID(-1),verbose(0), + pmtThreshold(1),forcedrawphotons(false),forcenophotons(false) +{ + eventMessenger=new LXeEventMessenger(this); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeEventAction::~LXeEventAction(){} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeEventAction::BeginOfEventAction(const G4Event* anEvent){ + + //New event, add the user information object + G4EventManager:: + GetEventManager()->SetUserInformation(new LXeUserEventInformation); + + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + if(scintCollID<0) + scintCollID=SDman->GetCollectionID("scintCollection"); + if(pmtCollID<0) + pmtCollID=SDman->GetCollectionID("pmtHitCollection"); + + if(recorder)recorder->RecordBeginOfEvent(anEvent); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeEventAction::EndOfEventAction(const G4Event* anEvent){ + + LXeUserEventInformation* eventInformation + =(LXeUserEventInformation*)anEvent->GetUserInformation(); + + G4TrajectoryContainer* trajectoryContainer=anEvent->GetTrajectoryContainer(); + + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + + // extract the trajectories and draw them + if (G4VVisManager::GetConcreteInstance()){ + for (G4int i=0; iGetTrajectoryContainer()))[i]); + if(trj->GetParticleName()=="opticalphoton"){ + trj->SetForceDrawTrajectory(forcedrawphotons); + trj->SetForceNoDrawTrajectory(forcenophotons); + } + trj->DrawTrajectory(50); + } + } + + LXeScintHitsCollection* SHC = 0; + LXePMTHitsCollection* PHC = 0; + G4HCofThisEvent* HCE = anEvent->GetHCofThisEvent(); + + //Get the hit collections + if(HCE){ + if(scintCollID>=0)SHC = (LXeScintHitsCollection*)(HCE->GetHC(scintCollID)); + if(pmtCollID>=0)PHC = (LXePMTHitsCollection*)(HCE->GetHC(pmtCollID)); + } + + //Hits in scintillator + if(SHC){ + int n_hit = SHC->entries(); + G4ThreeVector eWeightPos(0.); + G4double edep; + G4double edepMax=0; + + for(int i=0;iGetEdep(); + eventInformation->IncEDep(edep); //sum up the edep + eWeightPos += (*SHC)[i]->GetPos()*edep;//calculate energy weighted pos + if(edep>edepMax){ + edepMax=edep;//store max energy deposit + G4ThreeVector posMax=(*SHC)[i]->GetPos(); + eventInformation->SetPosMax(posMax,edep); + } + } + if(eventInformation->GetEDep()==0.){ + if(verbose>0)G4cout<<"No hits in the scintillator this event."<GetEDep(); + eventInformation->SetEWeightPos(eWeightPos); + if(verbose>0){ + G4cout << "\tEnergy weighted position of hits in LXe : " + << eWeightPos/mm << G4endl; + } + } + if(verbose>0){ + G4cout << "\tTotal energy deposition in scintillator : " + << eventInformation->GetEDep() / keV << " (keV)" << G4endl; + } + } + + if(PHC){ + G4ThreeVector reconPos=0.; + G4int pmts=PHC->entries(); + //Gather info from all PMTs + for(G4int i=0;iIncHitCount((*PHC)[i]->GetPhotonCount()); + reconPos+=(*PHC)[i]->GetPMTPos()*(*PHC)[i]->GetPhotonCount(); + if((*PHC)[i]->GetPhotonCount()>=pmtThreshold){ + eventInformation->IncPMTSAboveThreshold(); + } + else{//wasnt above the threshold, turn it back off + (*PHC)[i]->SetDrawit(false); + } + } + + if(eventInformation->GetHitCount()>0){//dont bother unless there were hits + reconPos/=eventInformation->GetHitCount(); + if(verbose>0){ + G4cout << "\tReconstructed position of hits in LXe : " + << reconPos/mm << G4endl; + } + eventInformation->SetReconPos(reconPos); + } + PHC->DrawAllHits(); + } + + if(verbose>0){ + //End of event output. later to be controlled by a verbose level + G4cout << "\tNumber of photons that hit PMTs in this event : " + << eventInformation->GetHitCount() << G4endl; + G4cout << "\tNumber of PMTs above threshold("<GetPMTSAboveThreshold() << G4endl; + G4cout << "\tNumber of photons produced by scintillation in this event : " + << eventInformation->GetPhotonCount_Scint() << G4endl; + G4cout << "\tNumber of photons produced by cerenkov in this event : " + << eventInformation->GetPhotonCount_Ceren() << G4endl; + G4cout << "\tNumber of photons absorbed (OpAbsorption) in this event : " + << eventInformation->GetAbsorptionCount() << G4endl; + G4cout << "\tNumber of photons absorbed at boundaries (OpBoundary) in " + << "this event : " << eventInformation->GetBoundaryAbsorptionCount() + << G4endl; + G4cout << "Unacounted for photons in this event : " + << (eventInformation->GetPhotonCount_Scint() + + eventInformation->GetPhotonCount_Ceren() - + eventInformation->GetAbsorptionCount() - + eventInformation->GetHitCount() - + eventInformation->GetBoundaryAbsorptionCount()) + << G4endl; + } + //If we have set the flag to save 'special' events, save here + if(saveThreshold&&eventInformation->GetPhotonCount() <= saveThreshold) + G4RunManager::GetRunManager()->rndmSaveThisEvent(); + + if(recorder)recorder->RecordEndOfEvent(anEvent); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeEventAction::SetSaveThreshold(G4int save){ +/*Sets the save threshold for the random number seed. If the number of photons +generated in an event is lower than this, then save the seed for this event +in a file called run###evt###.rndm +*/ + saveThreshold=save; + G4RunManager::GetRunManager()->SetRandomNumberStore(true); + G4RunManager::GetRunManager()->SetRandomNumberStoreDir("random/"); + // G4UImanager::GetUIpointer()->ApplyCommand("/random/setSavingFlag 1"); +} + + + + diff --git a/examples/extended/optical/LXe/src/LXeEventMessenger.cc b/examples/extended/optical/LXe/src/LXeEventMessenger.cc new file mode 100644 index 0000000000..4ba17de848 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeEventMessenger.cc @@ -0,0 +1,92 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeEventMessenger.hh" +#include "LXeEventAction.hh" + +#include "G4UIcmdWithABool.hh" +#include "G4UIcmdWithAnInteger.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeEventMessenger::LXeEventMessenger(LXeEventAction* event) +:LXeEvent(event) +{ + saveThresholdCmd = new G4UIcmdWithAnInteger("/LXe/saveThreshold",this); + saveThresholdCmd->SetGuidance("Set the photon count threshold for saving the random number seed for an event."); + saveThresholdCmd->SetParameterName("photons",true); + saveThresholdCmd->SetDefaultValue(4500); + saveThresholdCmd->AvailableForStates(G4State_PreInit,G4State_Idle); + + verboseCmd = new G4UIcmdWithAnInteger("/LXe/eventVerbose",this); + verboseCmd->SetGuidance("Set the verbosity of event data."); + verboseCmd->SetParameterName("verbose",true); + verboseCmd->SetDefaultValue(1); + + pmtThresholdCmd = new G4UIcmdWithAnInteger("/LXe/pmtThreshold",this); + pmtThresholdCmd->SetGuidance("Set the pmtThreshold (in # of photons)"); + + forceDrawPhotonsCmd=new G4UIcmdWithABool("/LXe/forceDrawPhotons",this); + forceDrawPhotonsCmd->SetGuidance("Force drawing of photons."); + forceDrawPhotonsCmd + ->SetGuidance("(Higher priority than /LXe/forceDrawNoPhotons)"); + + forceDrawNoPhotonsCmd=new G4UIcmdWithABool("/LXe/forceDrawNoPhotons",this); + forceDrawNoPhotonsCmd->SetGuidance("Force no drawing of photons."); + forceDrawNoPhotonsCmd + ->SetGuidance("(Lower priority than /LXe/forceDrawPhotons)"); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeEventMessenger::~LXeEventMessenger(){ + delete saveThresholdCmd; + delete verboseCmd; + delete pmtThresholdCmd; + delete forceDrawPhotonsCmd; + delete forceDrawNoPhotonsCmd; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeEventMessenger::SetNewValue(G4UIcommand* command, G4String newValue){ + if( command == saveThresholdCmd ){ + LXeEvent->SetSaveThreshold(saveThresholdCmd->GetNewIntValue(newValue)); + } + else if( command == verboseCmd ){ + LXeEvent->SetEventVerbose(verboseCmd->GetNewIntValue(newValue)); + } + else if( command == pmtThresholdCmd ){ + LXeEvent->SetPMTThreshold(pmtThresholdCmd->GetNewIntValue(newValue)); + } + else if(command == forceDrawPhotonsCmd){ + LXeEvent->SetForceDrawPhotons(forceDrawPhotonsCmd + ->GetNewBoolValue(newValue)); + } + else if(command == forceDrawNoPhotonsCmd){ + LXeEvent->SetForceDrawNoPhotons(forceDrawNoPhotonsCmd + ->GetNewBoolValue(newValue)); + G4cout<<"TEST"< + +LXeGeneralPhysics::LXeGeneralPhysics(const G4String& name) + : G4VPhysicsConstructor(name) +{ +} + +LXeGeneralPhysics::~LXeGeneralPhysics() +{ +} -#include "PhysListGeneral.hh" #include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" -#include "G4Decay.hh" +// Bosons +#include "G4ChargedGeantino.hh" +#include "G4Geantino.hh" -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListGeneral::PhysListGeneral(const G4String& name) - : G4VPhysicsConstructor(name) -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -PhysListGeneral::~PhysListGeneral() -{} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... - -void PhysListGeneral::ConstructProcess() +void LXeGeneralPhysics::ConstructParticle() { + // pseudo-particles + G4Geantino::GeantinoDefinition(); + G4ChargedGeantino::ChargedGeantinoDefinition(); +} + +void LXeGeneralPhysics::ConstructProcess() +{ + fDecayProcess = new G4Decay(); + // Add Decay Process - - G4Decay* fDecayProcess = new G4Decay(); - theParticleIterator->reset(); while( (*theParticleIterator)() ){ G4ParticleDefinition* particle = theParticleIterator->value(); G4ProcessManager* pmanager = particle->GetProcessManager(); - if (fDecayProcess->IsApplicable(*particle)) { - pmanager ->AddProcess(fDecayProcess); - // set ordering for PostStepDoIt and AtRestDoIt pmanager ->SetProcessOrdering(fDecayProcess, idxPostStep); pmanager ->SetProcessOrdering(fDecayProcess, idxAtRest); - } } } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/extended/optical/LXe/src/LXeMainVolume.cc b/examples/extended/optical/LXe/src/LXeMainVolume.cc new file mode 100644 index 0000000000..acf15bc1dc --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeMainVolume.cc @@ -0,0 +1,283 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeMainVolume.hh" +#include "globals.hh" +#include "G4SDManager.hh" +#include "G4LogicalSkinSurface.hh" +#include "G4LogicalBorderSurface.hh" +#include "LXePMTSD.hh" +#include "LXeScintSD.hh" + +LXeScintSD* LXeMainVolume::scint_SD; +LXePMTSD* LXeMainVolume::pmt_SD; + +G4LogicalVolume* LXeMainVolume::housing_log=NULL; + +LXeMainVolume::LXeMainVolume(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c) + //Pass info to the G4PVPlacement constructor + :G4PVPlacement(pRot,tlate, + //Temp logical volume must be created here + new G4LogicalVolume(new G4Box("temp",1,1,1), + G4Material::GetMaterial("Vacuum"), + "temp",0,0,0), + "housing",pMotherLogical,pMany,pCopyNo),constructor(c) +{ + CopyValues(); + + if(!housing_log || updated){ + + G4double housing_x=scint_x+d_mtl; + G4double housing_y=scint_y+d_mtl; + G4double housing_z=scint_z+d_mtl; + + //*************************** housing and scintillator + scint_box = new G4Box("scint_box",scint_x/2.,scint_y/2.,scint_z/2.); + housing_box = new G4Box("housing_box",housing_x/2.,housing_y/2., + housing_z/2.); + + scint_log = new G4LogicalVolume(scint_box,G4Material::GetMaterial("LXe"), + "scint_log",0,0,0); + housing_log = new G4LogicalVolume(housing_box, + G4Material::GetMaterial("Al"), + "housing_log",0,0,0); + + + scint_phys = new G4PVPlacement(0,G4ThreeVector(),scint_log,"scintillator", + housing_log,false,0); + + //*************** Miscellaneous sphere to demonstrate skin surfaces + sphere = new G4Sphere("sphere",0.*mm,2.*cm,0.*deg,360.*deg,0.*deg, + 360.*deg); + sphere_log = new G4LogicalVolume(sphere,G4Material::GetMaterial("Al"), + "sphere_log"); + if(sphereOn) + sphere_phys = new G4PVPlacement(0,G4ThreeVector(5.*cm,5.*cm,5.*cm), + sphere_log,"sphere",scint_log,false,0); + + + //****************** Build PMTs + G4double innerRadius_pmt = 0.*cm; + G4double height_pmt = d_mtl/2.; + G4double startAngle_pmt = 0.*deg; + G4double spanningAngle_pmt = 360.*deg; + + pmt = new G4Tubs("pmt_tube",innerRadius_pmt,outerRadius_pmt, + height_pmt,startAngle_pmt,spanningAngle_pmt); + + //the "photocathode" is a metal slab at the back of the glass that + //is only a very rough approximation of the real thing since it only + //absorbs or detects the photons based on the efficiency set below + photocath = new G4Tubs("photocath_tube",innerRadius_pmt,outerRadius_pmt, + height_pmt/2,startAngle_pmt,spanningAngle_pmt); + + pmt_log = new G4LogicalVolume(pmt,G4Material::GetMaterial("Glass"), + "pmt_log"); + photocath_log = new G4LogicalVolume(photocath, + G4Material::GetMaterial("Al"), + "photocath_log"); + + photocath_phys = new G4PVPlacement(0,G4ThreeVector(0,0,-height_pmt/2), + photocath_log,"photocath", + pmt_log,false,0); + + + + //***********Arrange pmts around the outside of housing********** + //---pmt sensitive detector + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + + if(!pmt_SD){ + pmt_SD = new LXePMTSD("/LXeDet/pmtSD"); + SDman->AddNewDetector(pmt_SD); + //Created here so it exists as pmts are being placed + } + pmt_SD->InitPMTs((nx*ny+nx*nz+ny*nz)*2); //let pmtSD know # of pmts + //------- + + G4double dx = scint_x/nx; + G4double dy = scint_y/ny; + G4double dz = scint_z/nz; + + G4double x,y,z; + G4double xmin = -scint_x/2. - dx/2.; + G4double ymin = -scint_y/2. - dy/2.; + G4double zmin = -scint_z/2. - dz/2.; + G4int k=0; + + z = -scint_z/2. - height_pmt; //front + PlacePMTs(pmt_log,0,x,y,dx,dy,xmin,ymin,nx,ny,x,y,z,k,pmt_SD); + G4RotationMatrix* rm_z = new G4RotationMatrix(); + rm_z->rotateY(180*deg); + z = scint_z/2. + height_pmt; //back + PlacePMTs(pmt_log,rm_z,x,y,dx,dy,xmin,ymin,nx,ny,x,y,z,k,pmt_SD); + + G4RotationMatrix* rm_y1 = new G4RotationMatrix(); + rm_y1->rotateY(-90*deg); + x = -scint_x/2. - height_pmt; //left + PlacePMTs(pmt_log,rm_y1,y,z,dy,dz,ymin,zmin,ny,nz,x,y,z,k,pmt_SD); + G4RotationMatrix* rm_y2 = new G4RotationMatrix(); + rm_y2->rotateY(90*deg); + x = scint_x/2. + height_pmt; //right + PlacePMTs(pmt_log,rm_y2,y,z,dy,dz,ymin,zmin,ny,nz,x,y,z,k,pmt_SD); + + G4RotationMatrix* rm_x1 = new G4RotationMatrix(); + rm_x1->rotateX(90*deg); + y = -scint_y/2. - height_pmt; //bottom + PlacePMTs(pmt_log,rm_x1,x,z,dx,dz,xmin,zmin,nx,nz,x,y,z,k,pmt_SD); + G4RotationMatrix* rm_x2 = new G4RotationMatrix(); + rm_x2->rotateX(-90*deg); + y = scint_y/2. + height_pmt; //top + PlacePMTs(pmt_log,rm_x2,x,z,dx,dz,xmin,zmin,nx,nz,x,y,z,k,pmt_SD); + + //**********Setup Sensitive Detectors*************** + if(!scint_SD){//determine if it has already been created + scint_SD = new LXeScintSD("/LXeDet/scintSD"); + SDman->AddNewDetector(scint_SD); + } + scint_log->SetSensitiveDetector(scint_SD); + + //sensitive detector is not actually on the photocathode. + //processHits gets done manually by the stepping action. + //It is used to detect when photons hit and get absorbed&detected at the + //boundary to the photocathode (which doesnt get done by attaching it to a + //logical volume. + //It does however need to be attached to something or else it doesnt get + //reset at the begining of events + photocath_log->SetSensitiveDetector(pmt_SD); + + VisAttributes(); + SurfaceProperties(); + } + + SetLogicalVolume(housing_log); +} + +void LXeMainVolume::CopyValues(){ + updated=constructor->GetUpdated(); + + scint_x=constructor->GetScintX(); + scint_y=constructor->GetScintY(); + scint_z=constructor->GetScintZ(); + d_mtl=constructor->GetHousingThickness(); + nx=constructor->GetNX(); + ny=constructor->GetNY(); + nz=constructor->GetNZ(); + outerRadius_pmt=constructor->GetPMTRadius(); + sphereOn=constructor->GetSphereOn(); + refl=constructor->GetHousingReflectivity(); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeMainVolume::PlacePMTs(G4LogicalVolume* pmt_log, + G4RotationMatrix *rot, + G4double &a, G4double &b, G4double da, + G4double db, G4double amin, + G4double bmin, G4int na, G4int nb, + G4double &x, G4double &y, G4double &z, + G4int &k,LXePMTSD* sd){ +/*PlacePMTs : a different way to parameterize placement that does not depend on + calculating the position from the copy number + + pmt_log = logical volume for pmts to be placed + rot = rotation matrix to apply + a,b = coordinates to vary(ie. if varying in the xy plane then pass x,y) + da,db = value to increment a,b by + amin,bmin = start values for a,b + na,nb = number of repitions in a and b + x,y,z = just pass x,y, and z by reference (the same ones passed for a,b) + k = copy number to start with + sd = sensitive detector for pmts +*/ + a=amin; + for(G4int j=1;j<=na;j++){ + a+=da; + b=bmin; + for(G4int i=1;i<=nb;i++){ + b+=db; + new G4PVPlacement(rot,G4ThreeVector(x,y,z),pmt_log,"pmt", + housing_log,false,k); + sd->SetPMTPos(k,x,y,z); + k++; + } + } +} + +void LXeMainVolume::VisAttributes(){ + G4VisAttributes* housing_va = new G4VisAttributes(G4Colour(0.8,0.8,0.8)); + housing_log->SetVisAttributes(housing_va); + + G4VisAttributes* sphere_va = new G4VisAttributes(); + sphere_va->SetForceSolid(true); + sphere_log->SetVisAttributes(sphere_va); +} + +void LXeMainVolume::SurfaceProperties(){ + const G4int num = 2; + G4double Ephoton[num] = {7.0*eV, 7.14*eV}; + + //**Scintillator housing properties + G4double Reflectivity[num] = {refl, refl}; + G4double Efficiency[num] = {0.0, 0.0}; + G4MaterialPropertiesTable* scintHsngPT = new G4MaterialPropertiesTable(); + scintHsngPT->AddProperty("REFLECTIVITY", Ephoton, Reflectivity, num); + scintHsngPT->AddProperty("EFFICIENCY", Ephoton, Efficiency, num); + G4OpticalSurface* OpScintHousingSurface = + new G4OpticalSurface("HousingSurface",unified,polished,dielectric_metal); + OpScintHousingSurface->SetMaterialPropertiesTable(scintHsngPT); + + //**Sphere surface properties + G4double SphereReflectivity[num] = {1.0, 1.0}; + G4double SphereEfficiency[num] = {0.0, 0.0}; + G4MaterialPropertiesTable* spherePT = new G4MaterialPropertiesTable(); + spherePT->AddProperty("REFLECTIVITY", Ephoton, SphereReflectivity, num); + spherePT->AddProperty("EFFICIENCY", Ephoton, SphereEfficiency, num); + G4OpticalSurface* OpSphereSurface = + new G4OpticalSurface("SphereSurface",unified,polished,dielectric_metal); + OpSphereSurface->SetMaterialPropertiesTable(spherePT); + + //**Photocathode surface properties + G4double photocath_EFF[num]={1.,1.}; //Enables 'detection' of photons + G4double photocath_REFL[num]={0.,0.}; + G4MaterialPropertiesTable* photocath_mt = new G4MaterialPropertiesTable(); + photocath_mt->AddProperty("EFFICIENCY",Ephoton,photocath_EFF,num); + photocath_mt->AddProperty("REFLECTIVITY",Ephoton,photocath_REFL,num); + G4OpticalSurface* photocath_opsurf= + new G4OpticalSurface("photocath_opsurf",glisur,polished, + dielectric_metal); + photocath_opsurf->SetMaterialPropertiesTable(photocath_mt); + + + //**Create logical skin surfaces + new G4LogicalSkinSurface("photocath_surf",housing_log, + OpScintHousingSurface); + new G4LogicalSkinSurface("sphere_surface",sphere_log,OpSphereSurface); + new G4LogicalSkinSurface("photocath_surf",photocath_log,photocath_opsurf); +} + + + diff --git a/examples/extended/optical/LXe/src/LXeMuonPhysics.cc b/examples/extended/optical/LXe/src/LXeMuonPhysics.cc new file mode 100644 index 0000000000..1b633c9efd --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeMuonPhysics.cc @@ -0,0 +1,96 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeMuonPhysics.hh" + +#include "globals.hh" +#include "G4ios.hh" +#include + + +LXeMuonPhysics::LXeMuonPhysics(const G4String& name) + : G4VPhysicsConstructor(name) +{ +} + +LXeMuonPhysics::~LXeMuonPhysics() +{ +} + +#include "G4ParticleDefinition.hh" +#include "G4ParticleTable.hh" + +#include "G4MuonPlus.hh" +#include "G4MuonMinus.hh" +#include "G4NeutrinoMu.hh" +#include "G4AntiNeutrinoMu.hh" + +void LXeMuonPhysics::ConstructParticle() +{ + // Mu + G4MuonPlus::MuonPlusDefinition(); + G4MuonMinus::MuonMinusDefinition(); + G4NeutrinoMu::NeutrinoMuDefinition(); + G4AntiNeutrinoMu::AntiNeutrinoMuDefinition(); +} + + +#include "G4ProcessManager.hh" + +void LXeMuonPhysics::ConstructProcess() +{ + fMuPlusIonisation = new G4MuIonisation(); + fMuPlusMultipleScattering = new G4MultipleScattering(); + fMuPlusBremsstrahlung=new G4MuBremsstrahlung(); + fMuPlusPairProduction= new G4MuPairProduction(); + + fMuMinusIonisation = new G4MuIonisation(); + fMuMinusMultipleScattering = new G4MultipleScattering; + fMuMinusBremsstrahlung = new G4MuBremsstrahlung(); + fMuMinusPairProduction = new G4MuPairProduction(); + + fMuMinusCaptureAtRest = new G4MuonMinusCaptureAtRest(); + + G4ProcessManager * pManager = 0; + + // Muon Plus Physics + pManager = G4MuonPlus::MuonPlus()->GetProcessManager(); + + pManager->AddProcess(fMuPlusMultipleScattering,-1, 1, 1); + pManager->AddProcess(fMuPlusIonisation, -1, 2, 2); + pManager->AddProcess(fMuPlusBremsstrahlung, -1, 3, 3); + pManager->AddProcess(fMuPlusPairProduction, -1, 4, 4); + + // Muon Minus Physics + pManager = G4MuonMinus::MuonMinus()->GetProcessManager(); + + pManager->AddProcess(fMuMinusMultipleScattering,-1, 1, 1); + pManager->AddProcess(fMuMinusIonisation, -1, 2, 2); + pManager->AddProcess(fMuMinusBremsstrahlung, -1, 3, 3); + pManager->AddProcess(fMuMinusPairProduction, -1, 4, 4); + + pManager->AddRestProcess(fMuMinusCaptureAtRest); + +} + + + diff --git a/examples/extended/optical/LXe/src/LXeOpPhysMessenger.cc b/examples/extended/optical/LXe/src/LXeOpPhysMessenger.cc new file mode 100644 index 0000000000..324b844b36 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeOpPhysMessenger.cc @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeOpPhysMessenger.hh" +#include "LXeOpticalPhysics.hh" + +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWith3VectorAndUnit.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcommand.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithABool.hh" +#include "G4UIcmdWithADouble.hh" +#include "G4Scintillation.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeOpPhysMessenger::LXeOpPhysMessenger(LXeOpticalPhysics* LXeOpPhys) +:OpPhys(LXeOpPhys) +{ + yieldCmd = new G4UIcmdWithADouble("/LXe/detector/scintYieldFactor",this); + yieldCmd->SetGuidance("Sets the yield factor for scintillation in all volumes"); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeOpPhysMessenger::~LXeOpPhysMessenger() +{ + delete yieldCmd; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeOpPhysMessenger::SetNewValue(G4UIcommand* command, G4String newValue) +{ + if (command == yieldCmd){ + OpPhys->SetScintYieldFactor(yieldCmd->GetNewDoubleValue(newValue)); + } +} + + diff --git a/examples/extended/optical/LXe/src/LXeOpticalPhysics.cc b/examples/extended/optical/LXe/src/LXeOpticalPhysics.cc new file mode 100644 index 0000000000..ef97c52f6e --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeOpticalPhysics.cc @@ -0,0 +1,100 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeOpticalPhysics.hh" +#include "LXeOpPhysMessenger.hh" + +#include "globals.hh" +#include "G4ios.hh" +#include + +#include "G4OpAbsorption.hh" +#include "G4OpRayleigh.hh" +#include "G4OpBoundaryProcess.hh" +#include "G4OpWLS.hh" + +LXeOpticalPhysics::LXeOpticalPhysics(const G4String& name) + : G4VPhysicsConstructor(name) +{ + // new LXeOpPhysMessenger(this); +} + +LXeOpticalPhysics::~LXeOpticalPhysics() +{ +} + +#include "G4ParticleDefinition.hh" +#include "G4ParticleTable.hh" + +#include "G4OpticalPhoton.hh" + +void LXeOpticalPhysics::ConstructParticle() +{ + G4OpticalPhoton::OpticalPhotonDefinition(); +} + + +#include "G4ProcessManager.hh" + +void LXeOpticalPhysics::ConstructProcess() +{ + theScintProcess = new G4Scintillation(); + theCerenkovProcess=new G4Cerenkov(); + theAbsorptionProcess=new G4OpAbsorption(); + theRayleighScattering=new G4OpRayleigh(); + theBoundaryProcess=new G4OpBoundaryProcess(); + theWLSProcess=new G4OpWLS(); + + G4ProcessManager * pManager = 0; + + pManager = G4OpticalPhoton::OpticalPhoton()->GetProcessManager(); + pManager->AddDiscreteProcess(theAbsorptionProcess); + pManager->AddDiscreteProcess(theRayleighScattering); + theBoundaryProcess->SetModel(unified); + pManager->AddDiscreteProcess(theBoundaryProcess); + pManager->AddDiscreteProcess(theWLSProcess); + + theScintProcess->SetScintillationYieldFactor(1.); + theScintProcess->SetScintillationExcitationRatio(0.0); + theScintProcess->SetTrackSecondariesFirst(true); + + theParticleIterator->reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator->value(); + pManager = particle->GetProcessManager(); + if(theCerenkovProcess->IsApplicable(*particle)){ + pManager->AddContinuousProcess(theCerenkovProcess); + } + if(theScintProcess->IsApplicable(*particle)){ + pManager->AddProcess(theScintProcess); + pManager->SetProcessOrderingToLast(theScintProcess,idxAtRest); + pManager->SetProcessOrderingToLast(theScintProcess,idxPostStep); + } + + } +} + +void LXeOpticalPhysics::SetScintYieldFactor(G4double yf){ + if(theScintProcess) + theScintProcess->SetScintillationYieldFactor(yf); +} + diff --git a/examples/extended/optical/LXe/src/LXePMTHit.cc b/examples/extended/optical/LXe/src/LXePMTHit.cc new file mode 100644 index 0000000000..47235f1166 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXePMTHit.cc @@ -0,0 +1,94 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXePMTHit.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" + +G4Allocator LXePMTHitAllocator; + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePMTHit::LXePMTHit() + :pmtNumber(-1),photons(0),physVol(0),drawit(false) +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePMTHit::~LXePMTHit() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePMTHit::LXePMTHit(const LXePMTHit &right) + : G4VHit() +{ + pmtNumber=right.pmtNumber; + photons=right.photons; + physVol=right.physVol; + drawit=right.drawit; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +const LXePMTHit& LXePMTHit::operator=(const LXePMTHit &right){ + pmtNumber = right.pmtNumber; + photons=right.photons; + physVol=right.physVol; + drawit=right.drawit; + return *this; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4int LXePMTHit::operator==(const LXePMTHit &right) const{ + return (pmtNumber==right.pmtNumber); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTHit::Draw(){ + if(drawit&&physVol){ //ReDraw only the PMTs that have hit counts > 0 + //Also need a physical volume to be able to draw anything + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if(pVVisManager){//Make sure that the VisManager exists + G4VisAttributes attribs(G4Colour(1.,0.,0.)); + attribs.SetForceSolid(true); + G4RotationMatrix rot; + if(physVol->GetRotation())//If a rotation is defined use it + rot=*(physVol->GetRotation()); + G4Transform3D trans(rot,physVol->GetTranslation());//Create transform + pVVisManager->Draw(*physVol,attribs,trans);//Draw it + } + } +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTHit::Print(){ +} + + + + + + + + + diff --git a/examples/extended/optical/LXe/src/LXePMTSD.cc b/examples/extended/optical/LXe/src/LXePMTSD.cc new file mode 100644 index 0000000000..022c806e6a --- /dev/null +++ b/examples/extended/optical/LXe/src/LXePMTSD.cc @@ -0,0 +1,138 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXePMTSD.hh" +#include "LXePMTHit.hh" +#include "LXeDetectorConstruction.hh" +#include "LXeUserTrackInformation.hh" + +#include "G4VPhysicalVolume.hh" +#include "G4LogicalVolume.hh" +#include "G4Track.hh" +#include "G4Step.hh" +#include "G4ParticleDefinition.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" +#include "G4ios.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleDefinition.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePMTSD::LXePMTSD(G4String name) + :G4VSensitiveDetector(name),pmtHitCollection(0),pmtPositionsX(0) + ,pmtPositionsY(0),pmtPositionsZ(0) +{ + collectionName.insert("pmtHitCollection"); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePMTSD::~LXePMTSD() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTSD::Initialize(G4HCofThisEvent* HCE){ + pmtHitCollection = new LXePMTHitsCollection + (SensitiveDetectorName,collectionName[0]); + //Store collection with event and keep ID + static G4int HCID = -1; + if(HCID<0){ + HCID = GetCollectionID(0); + } + HCE->AddHitsCollection( HCID, pmtHitCollection ); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4bool LXePMTSD::ProcessHits(G4Step* aStep,G4TouchableHistory* ROhist){ + return ProcessHits_constStep(aStep,ROhist); +} + +//Generates a hit and uses the postStepPoint's mother volume replica number +//PostStepPoint because the hit is generated manually when the photon is +//absorbed by the photocathode +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4bool LXePMTSD::ProcessHits_constStep(const G4Step* aStep, + G4TouchableHistory* ROhist){ + + //need to know if this is an optical photon + if(aStep->GetTrack()->GetDefinition() + != G4OpticalPhoton::OpticalPhotonDefinition()) return false; + + //User replica number 1 since photocathode is a daughter volume + //to the pmt which was replicated + G4int pmtNumber= + aStep->GetPostStepPoint()->GetTouchable()->GetReplicaNumber(1); + G4VPhysicalVolume* physVol= + aStep->GetPostStepPoint()->GetTouchable()->GetVolume(1); + + //Find the correct hit collection + G4int n=pmtHitCollection->entries(); + LXePMTHit* hit=NULL; + for(G4int i=0;iGetPMTNumber()==pmtNumber){ + hit=(*pmtHitCollection)[i]; + break; + } + } + + if(hit==NULL){//this pmt wasnt previously hit in this event + hit = new LXePMTHit(); //so create new hit + hit->SetPMTNumber(pmtNumber); + hit->SetPMTPhysVol(physVol); + pmtHitCollection->insert(hit); + hit->SetPMTPos((*pmtPositionsX)[pmtNumber],(*pmtPositionsY)[pmtNumber], + (*pmtPositionsZ)[pmtNumber]); + } + + hit->IncPhotonCount(); //increment hit for the selected pmt + + if(!LXeDetectorConstruction::GetSphereOn()){ + hit->SetDrawit(true); + //If the sphere is disabled then this hit is automaticaly drawn + } + else{//sphere enabled + LXeUserTrackInformation* trackInfo= + (LXeUserTrackInformation*)aStep->GetTrack()->GetUserInformation(); + if(trackInfo->GetTrackStatus()&hitSphere) + //only draw this hit if the photon has hit the sphere first + hit->SetDrawit(true); + } + + + return true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTSD::EndOfEvent(G4HCofThisEvent* HCE){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTSD::clear(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTSD::DrawAll(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePMTSD::PrintAll(){ +} + diff --git a/examples/extended/optical/LXe/src/LXePhysicsList.cc b/examples/extended/optical/LXe/src/LXePhysicsList.cc new file mode 100644 index 0000000000..49d46c8d3a --- /dev/null +++ b/examples/extended/optical/LXe/src/LXePhysicsList.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXePhysicsList.hh" + +#include "globals.hh" +#include "G4ParticleDefinition.hh" +#include "G4ProcessManager.hh" +#include "G4ProcessVector.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" + +#include "G4Material.hh" +#include "G4MaterialTable.hh" +#include "G4ios.hh" +#include + +#include "LXeGeneralPhysics.hh" +#include "LXeEMPhysics.hh" +#include "LXeMuonPhysics.hh" +#include "LXeOpticalPhysics.hh" + +LXePhysicsList::LXePhysicsList(): G4VModularPhysicsList() +{ + // default cut value (1.0mm) + defaultCutValue = 1.0*mm; + // SetVerboseLevel(1); + + // General Physics + RegisterPhysics( new LXeGeneralPhysics("general") ); + + // EM Physics + RegisterPhysics( new LXeEMPhysics("standard EM")); + + // Muon Physics + RegisterPhysics( new LXeMuonPhysics("muon")); + + // Optical Physics + RegisterPhysics( new LXeOpticalPhysics("optical")); + +} + +LXePhysicsList::~LXePhysicsList() +{ +} + +void LXePhysicsList::SetCuts(){ + // " G4VUserPhysicsList::SetCutsWithDefault" method sets + // the default cut value for all particle types + SetCutsWithDefault(); +} + + + + diff --git a/examples/extended/optical/LXe/src/LXePrimaryGeneratorAction.cc b/examples/extended/optical/LXe/src/LXePrimaryGeneratorAction.cc new file mode 100644 index 0000000000..d503bcf63d --- /dev/null +++ b/examples/extended/optical/LXe/src/LXePrimaryGeneratorAction.cc @@ -0,0 +1,57 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXePrimaryGeneratorAction.hh" + +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "globals.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePrimaryGeneratorAction::LXePrimaryGeneratorAction(){ + G4int n_particle = 1; + particleGun = new G4ParticleGun(n_particle); + + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + + G4String particleName; + particleGun->SetParticleDefinition(particleTable-> + FindParticle(particleName="gamma")); + //Default energy,position,momentum + particleGun->SetParticleEnergy(511.*keV); + particleGun->SetParticlePosition(G4ThreeVector(0.0 , 0.0, -20.0*cm)); + particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.)); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXePrimaryGeneratorAction::~LXePrimaryGeneratorAction(){ + delete particleGun; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXePrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent){ + particleGun->GeneratePrimaryVertex(anEvent); +} + + diff --git a/examples/extended/optical/LXe/src/LXeRunAction.cc b/examples/extended/optical/LXe/src/LXeRunAction.cc new file mode 100644 index 0000000000..7069e6f5b7 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeRunAction.cc @@ -0,0 +1,43 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeRunAction.hh" +#include "RecorderBase.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeRunAction::LXeRunAction(RecorderBase* r) + :recorder(r) +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeRunAction::~LXeRunAction() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeRunAction::BeginOfRunAction(const G4Run* aRun){ + if(recorder)recorder->RecordBeginOfRun(aRun); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeRunAction::EndOfRunAction(const G4Run* aRun){ + if(recorder)recorder->RecordEndOfRun(aRun); +} diff --git a/examples/extended/optical/LXe/src/LXeScintHit.cc b/examples/extended/optical/LXe/src/LXeScintHit.cc new file mode 100644 index 0000000000..c06748d708 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeScintHit.cc @@ -0,0 +1,85 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeScintHit.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" + +G4Allocator LXeScintHitAllocator; + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintHit::LXeScintHit() + :physVol(0) +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintHit::LXeScintHit(G4VPhysicalVolume* pVol) + :physVol(pVol) +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintHit::~LXeScintHit() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintHit::LXeScintHit(const LXeScintHit &right) + : G4VHit() +{ + edep = right.edep; + pos = right.pos; + physVol = right.physVol; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +const LXeScintHit& LXeScintHit::operator=(const LXeScintHit &right){ + edep = right.edep; + pos = right.pos; + physVol = right.physVol; + return *this; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4int LXeScintHit::operator==(const LXeScintHit &right) const{ + return false; + //returns false because there currently isnt need to check for equality yet +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintHit::Draw(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintHit::Print(){ +} + + + + + + + + + diff --git a/examples/extended/optical/LXe/src/LXeScintSD.cc b/examples/extended/optical/LXe/src/LXeScintSD.cc new file mode 100644 index 0000000000..4d4005cba4 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeScintSD.cc @@ -0,0 +1,99 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeScintSD.hh" +#include "LXeScintHit.hh" +#include "G4VPhysicalVolume.hh" +#include "G4LogicalVolume.hh" +#include "G4Track.hh" +#include "G4Step.hh" +#include "G4ParticleDefinition.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" +#include "G4ios.hh" +#include "G4VProcess.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintSD::LXeScintSD(G4String name) + :G4VSensitiveDetector(name) +{ + collectionName.insert("scintCollection"); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeScintSD::~LXeScintSD() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintSD::Initialize(G4HCofThisEvent* HCE){ + scintCollection = new LXeScintHitsCollection + (SensitiveDetectorName,collectionName[0]); + //A way to keep all the hits of this event in one place if needed + static G4int HCID = -1; + if(HCID<0){ + HCID = GetCollectionID(0); + } + HCE->AddHitsCollection( HCID, scintCollection ); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4bool LXeScintSD::ProcessHits(G4Step* aStep,G4TouchableHistory* ROhist){ + G4double edep = aStep->GetTotalEnergyDeposit(); + if(edep==0.) return false; //No edep so dont count as hit + + G4StepPoint* thePrePoint = aStep->GetPreStepPoint(); + G4TouchableHistory* theTouchable = + (G4TouchableHistory*)(aStep->GetPreStepPoint()->GetTouchable()); + G4VPhysicalVolume* thePrePV = theTouchable->GetVolume(); + + G4StepPoint* thePostPoint = aStep->GetPostStepPoint(); + + //Get the average position of the hit + G4ThreeVector pos = thePrePoint->GetPosition() + thePostPoint->GetPosition(); + pos/=2.; + + LXeScintHit* scintHit = new LXeScintHit(thePrePV); + + scintHit->SetEdep(edep); + scintHit->SetPos(pos); + + scintCollection->insert(scintHit); + + return true; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintSD::EndOfEvent(G4HCofThisEvent* HCE){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintSD::clear(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintSD::DrawAll(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeScintSD::PrintAll(){ +} + diff --git a/examples/extended/optical/LXe/src/LXeStackingAction.cc b/examples/extended/optical/LXe/src/LXeStackingAction.cc new file mode 100644 index 0000000000..129bff7d5e --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeStackingAction.cc @@ -0,0 +1,81 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeStackingAction.hh" +#include "LXeUserEventInformation.hh" +#include "LXeSteppingAction.hh" + +#include "G4ios.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleTypes.hh" +#include "G4Track.hh" +#include "G4RunManager.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeStackingAction::LXeStackingAction() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeStackingAction::~LXeStackingAction() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +G4ClassificationOfNewTrack +LXeStackingAction::ClassifyNewTrack(const G4Track * aTrack){ + + LXeUserEventInformation* eventInformation= + (LXeUserEventInformation*)G4EventManager::GetEventManager() + ->GetConstCurrentEvent()->GetUserInformation(); + + //Count what process generated the optical photons + if(aTrack->GetDefinition()==G4OpticalPhoton::OpticalPhotonDefinition()){ + // particle is optical photon + if(aTrack->GetParentID()>0){ + // particle is secondary + if(aTrack->GetCreatorProcess()->GetProcessName()=="Scintillation") + eventInformation->IncPhotonCount_Scint(); + else if(aTrack->GetCreatorProcess()->GetProcessName()=="Cerenkov") + eventInformation->IncPhotonCount_Ceren(); + } + } + else{ + } + return fUrgent; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeStackingAction::NewStage(){ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeStackingAction::PrepareNewEvent(){ +} + + + + + + + + diff --git a/examples/extended/optical/LXe/src/LXeSteppingAction.cc b/examples/extended/optical/LXe/src/LXeSteppingAction.cc new file mode 100644 index 0000000000..6a8902c65a --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeSteppingAction.cc @@ -0,0 +1,201 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeSteppingAction.hh" +#include "LXeEventAction.hh" +#include "LXeTrackingAction.hh" +#include "LXeTrajectory.hh" +#include "LXePMTSD.hh" +#include "LXeUserTrackInformation.hh" +#include "LXeUserEventInformation.hh" +#include "LXeSteppingMessenger.hh" +#include "RecorderBase.hh" + +#include "G4SteppingManager.hh" +#include "G4SDManager.hh" +#include "G4EventManager.hh" +#include "G4ProcessManager.hh" +#include "G4Track.hh" +#include "G4Step.hh" +#include "G4Event.hh" +#include "G4StepPoint.hh" +#include "G4TrackStatus.hh" +#include "G4VPhysicalVolume.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleTypes.hh" +#include "G4OpBoundaryProcess.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeSteppingAction::LXeSteppingAction(RecorderBase* r) + :recorder(r),oneStepPrimaries(false) +{ + steppingMessenger = new LXeSteppingMessenger(this); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeSteppingAction::~LXeSteppingAction() +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){ + G4Track* theTrack = theStep->GetTrack(); + + LXeUserTrackInformation* trackInformation + =(LXeUserTrackInformation*)theTrack->GetUserInformation(); + LXeUserEventInformation* eventInformation + =(LXeUserEventInformation*)G4EventManager::GetEventManager() + ->GetConstCurrentEvent()->GetUserInformation(); + + G4StepPoint* thePrePoint = theStep->GetPreStepPoint(); + G4VPhysicalVolume* thePrePV = thePrePoint->GetPhysicalVolume(); + + G4StepPoint* thePostPoint = theStep->GetPostStepPoint(); + G4VPhysicalVolume* thePostPV = thePostPoint->GetPhysicalVolume(); + + G4OpBoundaryProcessStatus boundaryStatus=Undefined; + static G4OpBoundaryProcess* boundary=NULL; + + //find the boundary process only once + if(!boundary){ + G4ProcessManager* pm + = theStep->GetTrack()->GetDefinition()->GetProcessManager(); + G4int nprocesses = pm->GetProcessListLength(); + G4ProcessVector* pv = pm->GetProcessList(); + G4int i; + for( i=0;iGetProcessName()=="OpBoundary"){ + boundary = (G4OpBoundaryProcess*)(*pv)[i]; + break; + } + } + } + + if(theTrack->GetParentID()==0){ + //This is a primary track + + G4TrackVector* fSecondary=fpSteppingManager->GetfSecondary(); + G4int tN2ndariesTot = fpSteppingManager->GetfN2ndariesAtRestDoIt() + + fpSteppingManager->GetfN2ndariesAlongStepDoIt() + + fpSteppingManager->GetfN2ndariesPostStepDoIt(); + + //If we havent already found the conversion position and there were + //secondaries generated, then search for it + if(!eventInformation->IsConvPosSet() && tN2ndariesTot>0 ){ + for(size_t lp1=(*fSecondary).size()-tN2ndariesTot; + lp1<(*fSecondary).size(); lp1++){ + const G4VProcess* creator=(*fSecondary)[lp1]->GetCreatorProcess(); + if(creator){ + G4String creatorName=creator->GetProcessName(); + if(creatorName=="phot"||creatorName=="compt"||creatorName=="conv"){ + //since this is happening before the secondary is being tracked + //the Vertex position has not been set yet(set in initial step) + eventInformation->SetConvPos((*fSecondary)[lp1]->GetPosition()); + } + } + } + } + + if(oneStepPrimaries&&thePrePV->GetName()=="scintillator") + theTrack->SetTrackStatus(fStopAndKill); + } + + if(!thePostPV){//out of world + return; + } + + G4ParticleDefinition* particleType = theTrack->GetDefinition(); + if(particleType==G4OpticalPhoton::OpticalPhotonDefinition()){ + //Optical photon only + + if(thePrePV->GetName()=="Slab") + //force drawing of photons in WLS slab + trackInformation->SetForceDrawTrajectory(true); + else if(thePostPV->GetName()=="expHall") + //Kill photons entering expHall from something other than Slab + theTrack->SetTrackStatus(fStopAndKill); + + //Was the photon absorbed by the absorption process + if(thePostPoint->GetProcessDefinedStep()->GetProcessName() + =="OpAbsorption"){ + eventInformation->IncAbsorption(); + trackInformation->AddTrackStatusFlag(absorbed); + } + + boundaryStatus=boundary->GetStatus(); + + //Check to see if the partcile was actually at a boundary + //Otherwise the boundary status may not be valid + //Prior to Geant4.6.0-p1 this would not have been enough to check + if(thePostPoint->GetStepStatus()==fGeomBoundary){ + switch(boundaryStatus){ + case Absorption: + trackInformation->AddTrackStatusFlag(boundaryAbsorbed); + eventInformation->IncBoundaryAbsorption(); + break; + case Detection: //Note, this assumes that the volume causing detection + //is the photocathode because it is the only one with + //non-zero efficiency + { + //Triger sensitive detector manually since photon is + //absorbed but status was Detection + G4SDManager* SDman = G4SDManager::GetSDMpointer(); + G4String sdName="/LXeDet/pmtSD"; + LXePMTSD* pmtSD = (LXePMTSD*)SDman + ->FindSensitiveDetector(sdName); + if(pmtSD) + pmtSD->ProcessHits_constStep(theStep,NULL); + trackInformation->AddTrackStatusFlag(hitPMT); + break; + } + case FresnelReflection: + case TotalInternalReflection: + case SpikeReflection: + trackInformation->IncReflections(); + break; + default: + break; + } + if(thePostPV->GetName()=="sphere") + trackInformation->AddTrackStatusFlag(hitSphere); + } + } + + if(recorder)recorder->RecordStep(theStep); +} + + + + + + + + + + + + + + + + + + diff --git a/examples/extended/optical/LXe/src/LXeSteppingMessenger.cc b/examples/extended/optical/LXe/src/LXeSteppingMessenger.cc new file mode 100644 index 0000000000..96c9ef7c5e --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeSteppingMessenger.cc @@ -0,0 +1,51 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeSteppingMessenger.hh" +#include "LXeSteppingAction.hh" + +#include "G4UIdirectory.hh" +#include "G4UIcmdWithABool.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeSteppingMessenger::LXeSteppingMessenger(LXeSteppingAction* step) +:stepping(step) +{ + oneStepPrimariesCmd = new G4UIcmdWithABool("/LXe/oneStepPrimaries",this); + oneStepPrimariesCmd->SetGuidance("Only allows primaries to go one step in the scintillator volume before being killed."); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeSteppingMessenger::~LXeSteppingMessenger(){ + delete oneStepPrimariesCmd; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void +LXeSteppingMessenger::SetNewValue(G4UIcommand* command,G4String newValue){ + if( command == oneStepPrimariesCmd ){ + stepping->SetOneStepPrimaries(oneStepPrimariesCmd + ->GetNewBoolValue(newValue)); + } +} + + diff --git a/examples/extended/optical/LXe/src/LXeSteppingVerbose.cc b/examples/extended/optical/LXe/src/LXeSteppingVerbose.cc new file mode 100644 index 0000000000..fbee60074b --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeSteppingVerbose.cc @@ -0,0 +1,217 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeSteppingVerbose.hh" + +#include "G4SteppingManager.hh" +#include "G4UnitsTable.hh" + +#include + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +LXeSteppingVerbose::LXeSteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +LXeSteppingVerbose::~LXeSteppingVerbose() +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void LXeSteppingVerbose::StepInfo() +{ + CopyState(); + + G4int prec = G4cout.precision(3); + + if( verboseLevel >= 1 ){ + G4int lengthLen=+G4UnitDefinition::GetUnitsTable()[G4BestUnit(0,"Length").GetIndexOfCategory()]->GetSymbMxLen(); + G4int energyLen=+G4UnitDefinition::GetUnitsTable()[G4BestUnit(0,"Energy").GetIndexOfCategory()]->GetSymbMxLen(); + + if( verboseLevel >= 4 ) VerboseTrack(); + if( verboseLevel >= 3 ){ + G4cout << G4endl; + G4cout << std::setw( 5) << "Step#" + << std::setw( 6) << "X" << std::setw(lengthLen+1)<<" " + << std::setw( 6) << "Y" << std::setw(lengthLen+1)<<" " + << std::setw( 6) << "Z" << std::setw(lengthLen+1)<<" " + << std::setw( 7) << "KineE" << std::setw(energyLen+1)<<" " + << std::setw( 7) << "dEStep"<< std::setw(energyLen+1)<<" " + << std::setw(10) << "StepLeng"<< std::setw(lengthLen+1)<<" " + << std::setw(10) << "TrakLeng"<< std::setw(lengthLen+1)<<" " + << std::setw(10) << "Volume" + << std::setw(10) << "Process" << G4endl; + } + + //This is a less clean way of outputing the data than normal but it + //produces nicer colums since G4BestUnit doesnt cooperate too well with + //field widths. + G4cout << std::setw(5) << fTrack->GetCurrentStepNumber(); + strstream out; + out.precision(3); + out.rdbuf()->seekpos(0); + out<GetPosition().x(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetPosition().y(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetPosition().z(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetKineticEnergy(),"Energy")<<'\0'; + G4cout<seekpos(0); + out<GetTotalEnergyDeposit(),"Energy")<<'\0'; + G4cout<seekpos(0); + out<GetStepLength(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetTrackLength(),"Length")<<'\0'; + G4cout<GetNextVolume() != 0 ) { + G4cout << " "<GetVolume()->GetName(); + } else { + G4cout << " OutOfWorld"; + } + + if(fStep->GetPostStepPoint()->GetProcessDefinedStep() != 0){ + G4cout << " " + << std::setw(10) + << fStep->GetPostStepPoint()->GetProcessDefinedStep() + ->GetProcessName(); + } else { + G4cout << " UserLimit"; + } + + G4cout << G4endl; + + if( verboseLevel == 2 ){ + G4int tN2ndariesTot = fN2ndariesAtRestDoIt + + fN2ndariesAlongStepDoIt + + fN2ndariesPostStepDoIt; + if(tN2ndariesTot>0){ + G4cout << " :----- List of 2ndaries - " + << "#SpawnInStep=" << std::setw(3) << tN2ndariesTot + << "(Rest=" << std::setw(2) << fN2ndariesAtRestDoIt + << ",Along=" << std::setw(2) << fN2ndariesAlongStepDoIt + << ",Post=" << std::setw(2) << fN2ndariesPostStepDoIt + << "), " + << "#SpawnTotal=" << std::setw(3) << (*fSecondary).size() + << " ---------------" + << G4endl; + + for(size_t lp1=(*fSecondary).size()-tN2ndariesTot; + lp1<(*fSecondary).size(); lp1++){ + G4cout << " : " + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().x(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().y(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetPosition().z(),"Length") + << std::setw(6) + << G4BestUnit((*fSecondary)[lp1]->GetKineticEnergy(),"Energy") + << std::setw(10) + << (*fSecondary)[lp1]->GetDefinition()->GetParticleName(); + G4cout << G4endl; + } + + G4cout << " :-----------------------------" + << "----------------------------------" + << "-- EndOf2ndaries Info ---------------" + << G4endl; + } + } + + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void LXeSteppingVerbose::TrackingStarted() +{ + + CopyState(); +G4int prec = G4cout.precision(3); + if( verboseLevel > 0 ){ + G4int lengthLen=+G4UnitDefinition::GetUnitsTable()[G4BestUnit(0,"Length").GetIndexOfCategory()]->GetSymbMxLen(); + G4int energyLen=+G4UnitDefinition::GetUnitsTable()[G4BestUnit(0,"Energy").GetIndexOfCategory()]->GetSymbMxLen(); + + G4cout << std::setw( 5) << "Step#" + << std::setw( 6) << "X" << std::setw(lengthLen+1)<<" " + << std::setw( 6) << "Y" << std::setw(lengthLen+1)<<" " + << std::setw( 6) << "Z" << std::setw(lengthLen+1)<<" " + << std::setw( 7) << "KineE" << std::setw(energyLen+1)<<" " + << std::setw( 7) << "dEStep"<< std::setw(energyLen+1)<<" " + << std::setw(10) << "StepLeng"<< std::setw(lengthLen+1)<<" " + << std::setw(10) << "TrakLeng"<< std::setw(lengthLen+1)<<" " + << std::setw(10) << "Volume" + << std::setw(10) << "Process" << G4endl; + + //This is a less clean way of outputing the data than normal but it + //produces nicer colums since G4BestUnit doesnt cooperate too well with + //field widths. + G4cout << std::setw( 5) << fTrack->GetCurrentStepNumber(); + strstream out; + out.precision(3); + out.rdbuf()->seekpos(0); + out<GetPosition().x(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetPosition().y(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetPosition().z(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetKineticEnergy(),"Energy")<<'\0'; + G4cout<seekpos(0); + out<GetTotalEnergyDeposit(),"Energy")<<'\0'; + G4cout<seekpos(0); + out<GetStepLength(),"Length")<<'\0'; + G4cout<seekpos(0); + out<GetTrackLength(),"Length")<<'\0'; + G4cout<GetNextVolume()){ + G4cout << " "<< fTrack->GetVolume()->GetName(); + } else { + G4cout << std::setw(11+lengthLen)<< "OutOfWorld"; + } + G4cout << " initStep" << G4endl; + } + G4cout.precision(prec); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + diff --git a/examples/extended/optical/LXe/src/LXeTrackingAction.cc b/examples/extended/optical/LXe/src/LXeTrackingAction.cc new file mode 100644 index 0000000000..f509cead76 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeTrackingAction.cc @@ -0,0 +1,105 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeTrajectory.hh" +#include "LXeTrackingAction.hh" +#include "LXeUserTrackInformation.hh" +#include "LXeDetectorConstruction.hh" +#include "RecorderBase.hh" + +#include "G4TrackingManager.hh" +#include "G4Track.hh" +#include "G4ParticleTypes.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeTrackingAction::LXeTrackingAction(RecorderBase* r) + :recorder(r) +{} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeTrackingAction::PreUserTrackingAction(const G4Track* aTrack) +{ + //Let this be up to the user via vis.mac + // fpTrackingManager->SetStoreTrajectory(true); + + //Use custom trajectory class + fpTrackingManager->SetTrajectory(new LXeTrajectory(aTrack)); + + //This user track information is only relevant to the photons + fpTrackingManager->SetUserTrackInformation(new LXeUserTrackInformation); + + /* const G4VProcess* creator = aTrack->GetCreatorProcess(); + if(creator) + G4cout<GetProcessName()<GimmeTrajectory(); + LXeUserTrackInformation* + trackInformation=(LXeUserTrackInformation*)aTrack->GetUserInformation(); + + //Lets choose to draw only the photons that hit the sphere and a pmt + if(aTrack->GetDefinition()==G4OpticalPhoton::OpticalPhotonDefinition()){ + + const G4VProcess* creator=aTrack->GetCreatorProcess(); + if(creator && creator->GetProcessName()=="OpWLS"){ + trajectory->WLS(); + trajectory->SetDrawTrajectory(true); + } + + if(LXeDetectorConstruction::GetSphereOn()){ + if((trackInformation->GetTrackStatus()&hitPMT)&& + (trackInformation->GetTrackStatus()&hitSphere)){ + trajectory->SetDrawTrajectory(true); + } + } + else{ + if(trackInformation->GetTrackStatus()&hitPMT) + trajectory->SetDrawTrajectory(true); + } + } + else //draw all other trajectories + trajectory->SetDrawTrajectory(true); + + if(trackInformation->GetForceDrawTrajectory()) + trajectory->SetDrawTrajectory(true); + + if(recorder)recorder->RecordTrack(aTrack); +} + + + + + + + + + + + + + + + + diff --git a/examples/extended/optical/LXe/src/LXeTrajectory.cc b/examples/extended/optical/LXe/src/LXeTrajectory.cc new file mode 100644 index 0000000000..2344ca113d --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeTrajectory.cc @@ -0,0 +1,151 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeTrajectory.hh" +#include "G4TrajectoryPoint.hh" +#include "G4Trajectory.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleTypes.hh" +#include "G4ThreeVector.hh" +#include "G4Polyline.hh" +#include "G4Circle.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4VVisManager.hh" +#include "G4Polymarker.hh" + +G4Allocator LXeTrajectoryAllocator; + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeTrajectory::LXeTrajectory() + :G4Trajectory(),wls(false),drawit(false),forceNoDraw(false),forceDraw(false) +{ + particleDefinition=0; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeTrajectory::LXeTrajectory(const G4Track* aTrack) + :G4Trajectory(aTrack),wls(false),drawit(false) +{ + particleDefinition=aTrack->GetDefinition(); +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeTrajectory::LXeTrajectory(LXeTrajectory &right) + :G4Trajectory(right),wls(right.wls),drawit(right.drawit) +{ + particleDefinition=right.particleDefinition; +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeTrajectory::~LXeTrajectory() +{ + +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeTrajectory::DrawTrajectory(G4int i_mode) const{ + //Taken from G4VTrajectory and modified to select colours based on particle + //type and to selectively eliminate drawing of certain trajectories. + + if(!forceDraw && (!drawit || forceNoDraw)) + return; + + // If i_mode>=0, draws a trajectory as a polyline and, if i_mode!=0, + // adds markers - yellow circles for step points and magenta squares + // for auxiliary points, if any - whose screen size in pixels is + // given by abs(i_mode)/1000. E.g: i_mode = 5000 gives easily + // visible markers. + + G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); + if (!pVVisManager) return; + + const G4double markerSize = abs(i_mode)/1000; + G4bool lineRequired (i_mode >= 0); + G4bool markersRequired (markerSize > 0.); + + G4Polyline trajectoryLine; + G4Polymarker stepPoints; + G4Polymarker auxiliaryPoints; + + for (G4int i = 0; i < GetPointEntries() ; i++) { + G4VTrajectoryPoint* aTrajectoryPoint = GetPoint(i); + const std::vector* auxiliaries + = aTrajectoryPoint->GetAuxiliaryPoints(); + if (auxiliaries) { + for (size_t iAux = 0; iAux < auxiliaries->size(); ++iAux) { + const G4ThreeVector pos((*auxiliaries)[iAux]); + if (lineRequired) { + trajectoryLine.push_back(pos); + } + if (markersRequired) { + auxiliaryPoints.push_back(pos); + } + } + } + const G4ThreeVector pos(aTrajectoryPoint->GetPosition()); + if (lineRequired) { + trajectoryLine.push_back(pos); + } + if (markersRequired) { + stepPoints.push_back(pos); + } + } + + if (lineRequired) { + G4Colour colour; + + if(particleDefinition==G4OpticalPhoton::OpticalPhotonDefinition()){ + if(wls) //WLS photons are red + colour = G4Colour(1.,0.,0.); + else{ //Scintillation and Cerenkov photons are green + colour = G4Colour(0.,1.,0.); + } + } + else //All other particles are blue + colour = G4Colour(0.,0.,1.); + + G4VisAttributes trajectoryLineAttribs(colour); + trajectoryLine.SetVisAttributes(&trajectoryLineAttribs); + pVVisManager->Draw(trajectoryLine); + } + if (markersRequired) { + auxiliaryPoints.SetMarkerType(G4Polymarker::squares); + auxiliaryPoints.SetScreenSize(markerSize); + auxiliaryPoints.SetFillStyle(G4VMarker::filled); + G4VisAttributes auxiliaryPointsAttribs(G4Colour(0.,1.,1.)); // Magenta + auxiliaryPoints.SetVisAttributes(&auxiliaryPointsAttribs); + pVVisManager->Draw(auxiliaryPoints); + + stepPoints.SetMarkerType(G4Polymarker::circles); + stepPoints.SetScreenSize(markerSize); + stepPoints.SetFillStyle(G4VMarker::filled); + G4VisAttributes stepPointsAttribs(G4Colour(1.,1.,0.)); // Yellow. + stepPoints.SetVisAttributes(&stepPointsAttribs); + pVVisManager->Draw(stepPoints); + } +} + + + + + diff --git a/examples/extended/optical/LXe/src/LXeUserEventInformation.cc b/examples/extended/optical/LXe/src/LXeUserEventInformation.cc new file mode 100644 index 0000000000..51f31f88fe --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeUserEventInformation.cc @@ -0,0 +1,37 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeUserEventInformation.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeUserEventInformation::LXeUserEventInformation() + :hitCount(0),photonCount_Scint(0),photonCount_Ceren(0),absorptionCount(0), + boundaryAbsorptionCount(0),totE(0.),eWeightPos(0.),reconPos(0.),convPos(0.), + convPosSet(false),posMax(0.),pmtsAboveThreshold(0) +{ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeUserEventInformation::~LXeUserEventInformation() +{ +} + diff --git a/examples/extended/optical/LXe/src/LXeUserTrackInformation.cc b/examples/extended/optical/LXe/src/LXeUserTrackInformation.cc new file mode 100644 index 0000000000..d4773ba223 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeUserTrackInformation.cc @@ -0,0 +1,44 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeUserTrackInformation.hh" + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeUserTrackInformation::LXeUserTrackInformation() + :status(active),reflections(0),forcedraw(false) +{ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeUserTrackInformation::~LXeUserTrackInformation() +{ +} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeUserTrackInformation::AddTrackStatusFlag(int s) +{ + if(s&active) //track is now active + status&=~inactive; //remove any flags indicating it is inactive + else if(s&inactive) //track is now inactive + status&=~active; //remove any flags indicating it is active + status|=s; //add new flags +} diff --git a/examples/extended/optical/LXe/src/LXeVisManager.cc b/examples/extended/optical/LXe/src/LXeVisManager.cc new file mode 100755 index 0000000000..9bbeefda20 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeVisManager.cc @@ -0,0 +1,137 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +#ifdef G4VIS_USE + +#include "LXeVisManager.hh" + +// Supported drivers... + +// Not needing external packages or libraries... +#include "G4ASCIITree.hh" +#include "G4DAWNFILE.hh" +#include "G4GAGTree.hh" +#include "G4HepRepFile.hh" +#include "G4HepRep.hh" +#include "G4RayTracer.hh" +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" + +// Needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +LXeVisManager::LXeVisManager () {} + +//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ +void LXeVisManager::RegisterGraphicsSystems () { + + // Graphics Systems not needing external packages or libraries... + RegisterGraphicsSystem (new G4ASCIITree); + RegisterGraphicsSystem (new G4DAWNFILE); + RegisterGraphicsSystem (new G4GAGTree); + RegisterGraphicsSystem (new G4HepRepFile); + RegisterGraphicsSystem (new G4HepRep); + RegisterGraphicsSystem (new G4RayTracer); + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); + + // Graphics systems needing external packages or libraries... + +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } +} + +#endif + + + + + diff --git a/examples/extended/optical/LXe/src/LXeWLSFiber.cc b/examples/extended/optical/LXe/src/LXeWLSFiber.cc new file mode 100644 index 0000000000..9a09876c0a --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeWLSFiber.cc @@ -0,0 +1,106 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeWLSFiber.hh" +#include "globals.hh" +#include "G4LogicalSkinSurface.hh" +#include "G4LogicalBorderSurface.hh" + +G4LogicalVolume* LXeWLSFiber::clad2_log=NULL; + +LXeWLSFiber::LXeWLSFiber(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c) + :G4PVPlacement(pRot,tlate, + new G4LogicalVolume(new G4Box("temp",1,1,1), + G4Material::GetMaterial("Vacuum"), + "temp",0,0,0), + "Cladding2",pMotherLogical,pMany,pCopyNo),constructor(c) +{ + CopyValues(); + + if(!clad2_log || updated){ + // The Fiber + // + G4Tubs* Fiber_tube = + new G4Tubs("Fiber",fiber_rmin,fiber_rmax,fiber_z,fiber_sphi,fiber_ephi); + + G4LogicalVolume* Fiber_log = + new G4LogicalVolume(Fiber_tube,G4Material::GetMaterial("PMMA"), + "Fiber",0,0,0); + + // Cladding (first layer) + // + G4Tubs* clad1_tube = + new G4Tubs("Cladding1",clad1_rmin,clad1_rmax,clad1_z,clad1_sphi, + clad1_ephi); + + G4LogicalVolume* clad1_log = + new G4LogicalVolume(clad1_tube,G4Material::GetMaterial("Pethylene"), + "Cladding1",0,0,0); + + // Cladding (second layer) + // + G4Tubs* clad2_tube = + new G4Tubs("Cladding2",clad2_rmin,clad2_rmax,clad2_z,clad2_sphi, + clad2_ephi); + + clad2_log = + new G4LogicalVolume(clad2_tube,G4Material::GetMaterial("fPethylene"), + "Cladding2",0,0,0); + + new G4PVPlacement(0,G4ThreeVector(0.,0.,0.),Fiber_log, + "Fiber", clad1_log,false,0); + new G4PVPlacement(0,G4ThreeVector(0.,0.,0.),clad1_log, + "Cladding1",clad2_log,false,0); + } + + SetLogicalVolume(clad2_log); +} + +void LXeWLSFiber::CopyValues(){ + updated=constructor->GetUpdated(); + + fiber_rmin = 0.00*cm; + fiber_rmax = 0.10*cm; + fiber_z = constructor->GetScintX()/2; + fiber_sphi = 0.00*deg; + fiber_ephi = 360.*deg; + + clad1_rmin = 0.;// fiber_rmax; + clad1_rmax = fiber_rmax + 0.015*fiber_rmax; + + clad1_z = fiber_z; + clad1_sphi = fiber_sphi; + clad1_ephi = fiber_ephi; + + clad2_rmin = 0.;//clad1_rmax; + clad2_rmax = clad1_rmax + 0.015*fiber_rmax; + + clad2_z = fiber_z; + clad2_sphi = fiber_sphi; + clad2_ephi = fiber_ephi; + +} diff --git a/examples/extended/optical/LXe/src/LXeWLSSlab.cc b/examples/extended/optical/LXe/src/LXeWLSSlab.cc new file mode 100644 index 0000000000..0020b5fff3 --- /dev/null +++ b/examples/extended/optical/LXe/src/LXeWLSSlab.cc @@ -0,0 +1,86 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#include "LXeWLSSlab.hh" +#include "LXeWLSFiber.hh" + +#include "globals.hh" +#include "G4LogicalSkinSurface.hh" +#include "G4LogicalBorderSurface.hh" + +G4LogicalVolume* LXeWLSSlab::ScintSlab_log=NULL; + +LXeWLSSlab::LXeWLSSlab(G4RotationMatrix *pRot, + const G4ThreeVector &tlate, + G4LogicalVolume *pMotherLogical, + G4bool pMany, + G4int pCopyNo, + LXeDetectorConstruction* c) + :G4PVPlacement(pRot,tlate, + new G4LogicalVolume(new G4Box("temp",1,1,1), + G4Material::GetMaterial("Vacuum"), + "temp",0,0,0), + "Slab",pMotherLogical,pMany,pCopyNo),constructor(c) +{ + CopyValues(); + + if(!ScintSlab_log || updated){ + + G4double slab_x = scint_x/2.; + G4double slab_y = scint_y/2.; + + G4Box* ScintSlab_box = new G4Box("Slab",slab_x,slab_y,slab_z); + + ScintSlab_log + = new G4LogicalVolume(ScintSlab_box, + G4Material::GetMaterial("Polystyrene"), + "Slab",0,0,0); + + G4double spacing = 2*slab_y/nfibers; + + G4RotationMatrix* rm = new G4RotationMatrix(); + rm->rotateY(90*deg); + + //Place fibers + for(G4int i=0;iGetUpdated(); + + scint_x=constructor->GetScintX(); + scint_y=constructor->GetScintY(); + scint_z=constructor->GetScintZ(); + nfibers=constructor->GetNFibers(); + slab_z=constructor->GetSlabZ(); +} + + + diff --git a/examples/extended/optical/LXe/vis.mac b/examples/extended/optical/LXe/vis.mac new file mode 100644 index 0000000000..8781becd0e --- /dev/null +++ b/examples/extended/optical/LXe/vis.mac @@ -0,0 +1,46 @@ +# +# Macro file for the initialization phase of "LXe.cc" +# when runing in interactive mode +# +# Sets some default verbose +# +/run/verbose 2 +/control/verbose 2 +# +# Create a scene handler/viewer for a specific graphics system +# The compound command "/vis/open " +# is equivalent to the following set of commands: +# +# /vis/sceneHandler/create +# /vis/viewer/create +# +# Create a scene handler and a viewer for the OGLIX driver +/vis/open OGLIX +# +/vis/viewer/set/style wireframe +# Set direction from target to camera. +/vis/viewer/set/viewpointVector 1 1.5 1.1 +#/vis/viewer/set/viewpointThetaPhi 90 180 deg +#/vis/viewer/zoom 1.4 +# +# The compound command "/vis/drawVolume" +# is equivalent to the following set of commands: +# +# /vis/scene/create +# /vis/scene/add/volume +# /vis/sceneHandler/attach +# Create an empty scene and add the detector geometry to it +/vis/drawVolume +# +# Store particle trajectories for visualization +# (if too many tracks cause core dump => storeTrajectory 0) +/tracking/storeTrajectory 1 +# +# Add trajectories to the current scene +# Note: This command is not necessary since the C++ method DrawTrajectory() +# is called in LXeEventAction::EndOfEventAction +#/vis/scene/add/trajectories +# +# Requests viewer to accumulate hits, tracks, etc. at end of event. +# detector remains or is redrawn. +/vis/scene/endOfEventAction accumulate diff --git a/examples/extended/optical/LXe/wls.mac b/examples/extended/optical/LXe/wls.mac new file mode 100644 index 0000000000..2cf08249ea --- /dev/null +++ b/examples/extended/optical/LXe/wls.mac @@ -0,0 +1,7 @@ +/control/execute defaults.mac +/LXe/detector/volumes/wls 1 +/LXe/detector/volumes/lxe 0 +/LXe/detector/update +/gun/particle e- +/gun/energy 511 keV + diff --git a/examples/extended/optical/README b/examples/extended/optical/README new file mode 100644 index 0000000000..6a9bb1e08b --- /dev/null +++ b/examples/extended/optical/README @@ -0,0 +1,13 @@ + + Optical processes + ----------------- + +This directory includes examples demonstrating the use of optical processes +in the simulation. + +LXe +---- +Multi-purpose detector setup implementing: +(1) scintillation inside a bulk scintillator with PMTs +(2) large wall of small PMTs opposite a Cerenkov slab to show the cone +(3) plastic scintillator with wave-length-shifting fiber readout. diff --git a/examples/extended/parallel/ExDiane/Brachy.cc b/examples/extended/parallel/ExDiane/Brachy.cc new file mode 100644 index 0000000000..46408b970f --- /dev/null +++ b/examples/extended/parallel/ExDiane/Brachy.cc @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: Brachy.cc +// GEANT4 tag $Name: geant4-06-02 $ +// +// -------------------------------------------------------------- +// GEANT 4 - ExDiane example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli + +#include "BrachySimulation.hh" +int main(int argc, char** argv){ + + BrachySimulation * simulation = new BrachySimulation(0); + + simulation -> initialize(argc,argv); + + G4String mn; + + if(argc>1) + mn = argv[1]; + + if(mn=="") + { + std::cerr << "error: please give a macro file name" << std::endl; + return -1; + } + + simulation -> executeMacro(mn); + + simulation -> finish(); + + delete simulation; + G4cout << "The job ends! " << G4endl; + return 0; +} diff --git a/examples/extended/parallel/ExDiane/GNUmakefile b/examples/extended/parallel/ExDiane/GNUmakefile new file mode 100644 index 0000000000..7f33f5dd2c --- /dev/null +++ b/examples/extended/parallel/ExDiane/GNUmakefile @@ -0,0 +1,30 @@ +# $Id: GNUmakefile,v 1.3 2004/05/25 12:46:46 guatelli Exp $ +# -------------------------------------------------------------- + +name := Brachy +G4TARGET := $(name) +G4EXLIB := true + +ifndef G4INSTALL + G4INSTALL = ../../.. +endif + +.PHONY: all + +ifdef G4DIANE_USE +G4LIB_BUILD_SHARED = 1 +all: lib bin + @echo "Linking DIANE libraries..." + @g++ -shared -o${G4WORKDIR}/tmp/${G4SYSTEM}/${name}/libDIANE_${name}.so -L${G4WORKDIR}/tmp/${G4SYSTEM}/${name} -l${name} ${LDFLAGS} ${LDLIBS} +else +all: lib bin +endif + +include $(G4INSTALL)/config/binmake.gmk +ifdef G4ANALYSIS_USE + CPPFLAGS += `aida-config --include` + LDFLAGS += `aida-config --lib` + LOADLIBS += `aida-config --lib` +endif + + diff --git a/examples/extended/parallel/ExDiane/History b/examples/extended/parallel/ExDiane/History new file mode 100644 index 0000000000..253de1f540 --- /dev/null +++ b/examples/extended/parallel/ExDiane/History @@ -0,0 +1,15 @@ +------------------------------------------------------------------- +$Id: History,v 1.1 2004/05/25 08:36:17 guatelli Exp $ +------------------------------------------------------------------- + + ========================================================= + Geant4 - ExDiane + ========================================================= + + Category History file + --------------------- + +25.5.2004 - Susanna Guatelli + Migration to AIDA 3.2.1 and PI 1.2.1 + Cleaning of the code for public release + \ No newline at end of file diff --git a/examples/extended/parallel/ExDiane/IodiumSourceMacro.mac b/examples/extended/parallel/ExDiane/IodiumSourceMacro.mac new file mode 100644 index 0000000000..7d94470867 --- /dev/null +++ b/examples/extended/parallel/ExDiane/IodiumSourceMacro.mac @@ -0,0 +1,8 @@ +# Iodium source +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +/source/switch Iodium +/run/energy Iodium +/run/initialize +/run/beamOn 500 diff --git a/examples/extended/parallel/ExDiane/IridiumSourceMacro.mac b/examples/extended/parallel/ExDiane/IridiumSourceMacro.mac new file mode 100644 index 0000000000..46a4564d09 --- /dev/null +++ b/examples/extended/parallel/ExDiane/IridiumSourceMacro.mac @@ -0,0 +1,6 @@ +# Iridium source +/control/verbose 1 +/run/verbose 1 +/event/verbose 0 +/run/initialize +/run/beamOn 500 diff --git a/examples/extended/parallel/ExDiane/README b/examples/extended/parallel/ExDiane/README new file mode 100644 index 0000000000..6ba13ab2b3 --- /dev/null +++ b/examples/extended/parallel/ExDiane/README @@ -0,0 +1,94 @@ + + ========================================================= + Geant4 - ExDiane example + ========================================================= + + README + --------------------- + +------------------------------------------------------------------------ +----> Introduction + +This example shows how to run a Geant4 application in a parallel mode +using DIANE (DIstributed ANalysis Environment). + +With DIANE the simulation may be run in sequential or parallel mode +without changing the code of the Geant4 application. Using a dedicated +cluster or geographically distributed resources (e.g. GRID) is +completely transparent for the user. + +For more details about DIANE, have a look at http://cern.ch/diane + +The ExDiane example derives from the Geant4 advanced example +brachytherapy. The original application code is the same. An +interface class (BrachySimulation) has been added to replace the +main() function. + +Please look at the documentation of the brachytherapy advanced example +to know details about the functionality of the application: + - geant4/examples/advanced/brachytherapy + - http://www.ge.infn.it/geant4/examples/index.html + +------------------------------------------------------------------------- +----> 2.SET-UP + + - example enviroment with the compiler 3.2.3 + compiler = gcc-3.2.3 + G4SYSTEM = linux-g++ + + - other environment variables which need to be set: + G4LEDATA: points to low energy data base - G4EMLOW2.3 + + - download DIANE + You need to have python 2.2 or greater. + + * AUTOMATIC INSTALLATION OF DIANE + Execute this command: + > python2 diane.installation.manager --packages=brachy DIANE-1.0.0 download + Get the diane.installation.manager script from + http://cern.ch/diane/download.html + + * MANUAL INSTALLATION OF DIANE + Make sure that you have AIDA 3.2.1, PI 1.2.1. Download them from + http://aida.freehep.org/ + http://www.cern.ch/PI + Download DIANE executing this command: + > python2 diane.installation.manager DIANE-1.0.0 download + +------------------------------------------------------------------------ +----> 3.How to compile the example. + +setenv G4ANALYSIS_USE 1 -> to activate the analysis +setenv G4DIANE_USE 1 -> to activate the use of DIANE +> gmake +------------------------------------------------------------------------ +----> 4.How to run the example. + +Two macros are provided as example: iridium.job and iodium.job +They correspond to the Geant4 macros: IridiumSourceMacro.mac and +IodiumSourceMacro.mac + +- batch mode running through DIANE: + diane.startjob --job=iodium.job -w 3@localhost --wms=xterm ^ ^ + input macro number of workers +------------------------------------------------------------------------ +----> 4. Simulation output + +if ANALYSIS_USE = 1 in the set-up, the output is brachytherapy.xml + + It contains: + 1)1Dhistogram with the primary particle energy + 2)2Dhistogram with the distribution of energy in the plane + (x,z,energy) containing the source + 3)1Dhistogram with the energy deposit along the X axis in the plane + containing the source. + +Units: the energy deposit is in MeV; + x, y, z in mm for histograms +------------------------------------------------------------------------- +Authors: Susanna Guatelli, Kuba Moscicki + +for comments, advices, doubts and questions: +guatelli@ge.infn.it, Jakub.Moscicki@cern.ch + +- last modified: Susanna Guatelli and Kuba Moscicki 25/5/2004 diff --git a/examples/extended/parallel/ExDiane/include/BrachyAnalysisManager.hh b/examples/extended/parallel/ExDiane/include/BrachyAnalysisManager.hh new file mode 100644 index 0000000000..0a5ac54d8a --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyAnalysisManager.hh @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: +// S.Guatelli +// +// +// $Id: BrachyAnalysisManager.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyAnalysisManager.hh * +// * * +// ********************************** +// +// +// the class Analysis creates and managed histograms and ntuples +// +#ifdef G4ANALYSIS_USE +#ifndef G4PROCESSTESTANALYSIS_HH +#define G4PROCESSTESTANALYSIS_HH + +#include "globals.hh" +#include +#include "G4ThreeVector.hh" +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" +#include "AIDA/IAnalysisFactory.h" + +namespace AIDA{ + class ITree; + class IHistogramFactory; + class IAnalysisFactory; + class ITupleFactory; + class ITuple; + class ITreeFactory; +}; + +class BrachyAnalysisManager +{ +private: + BrachyAnalysisManager(); + +public: + + ~BrachyAnalysisManager(); + static BrachyAnalysisManager* getInstance(); + void book(); + void FillHistogramWithEnergy(G4double,G4double,G4double); + void PrimaryParticleEnergySpectrum(G4double); + void DoseDistribution(G4double,G4double); + void finish(); + +private: + static BrachyAnalysisManager* instance; + +private: + AIDA::IAnalysisFactory* aFact; + AIDA::ITree* theTree; + AIDA::IHistogramFactory *histFact; + AIDA::ITreeFactory *treeFact; + AIDA::IHistogram2D *h1; + AIDA::IHistogram1D *h2; + AIDA::IHistogram1D *h3; +}; +#endif +#endif + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyDetectorConstruction.hh b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstruction.hh new file mode 100644 index 0000000000..274de4e9f5 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstruction.hh @@ -0,0 +1,114 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyDetectorConstruction.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// **************************************** +// * * +// * BrachyDetectorConstruction.hh * +// * * +// **************************************** + +#ifndef BrachyDetectorConstruction_H +#define BrachyDetectorConstruction_H 1 + +#include "globals.hh" +#include "G4VUserDetectorConstruction.hh" +#include "G4LogicalVolume.hh" + +class BrachyPhantomSD; +class BrachyDetectorMessenger; +class G4LogicalVolume; +class G4Material; +class G4Tubs; +class G4Box; +class G4Sphere; +class G4Tubs; +class G4Colour; +class G4VPhysicalVolume; +class BrachyPhantomSD; +class BrachyPhantomROGeometry; +class G4VPhysicalVolume; +class BrachyMaterial; +class BrachyFactory; +class BrachyVoxelParameterisation; + +class BrachyDetectorConstruction : public G4VUserDetectorConstruction +{ +public: + + BrachyDetectorConstruction(G4String&); + ~BrachyDetectorConstruction(); + + G4VPhysicalVolume* Construct(); + void SwitchBrachytherapicSeed(); + void SelectBrachytherapicSeed(G4String val); + void ConstructPhantom(); + void ConstructSensitiveDetector(); + void PrintDetectorParameters(); + void SetPhantomMaterial(G4String); + + const G4double VoxelWidth_X(){return phantomDimensionX/numberOfVoxelsAlongX;} + const G4double VoxelWidth_Z(){return phantomDimensionZ/numberOfVoxelsAlongZ;} + const G4int GetNumVoxelX() {return numberOfVoxelsAlongX;} + const G4int GetNumVoxelZ() {return numberOfVoxelsAlongZ;} + const G4double GetDimX() {return phantomDimensionX;} + const G4double GetBoxDim_Z() {return phantomDimensionZ;} + + void ComputeDimVoxel() {dimVoxel = phantomDimensionX/numberOfVoxelsAlongX;} + +private: + + G4int detectorChoice; //Select brachytherapic seed + BrachyPhantomSD* phantomSD;//pointer to sensitive detector + BrachyPhantomROGeometry* phantomROGeometry;//pointer to ROGeometry + BrachyFactory* factory; + + // World ... + G4Box* World; //pointer to the solid World + G4LogicalVolume* WorldLog; //pointer to the logical World + G4VPhysicalVolume* WorldPhys; //pointer to the physical World + + // Phantom ... + G4Box* Phantom; //pointer to solid phantom + G4LogicalVolume* PhantomLog; //pointer to logic phantom + G4VPhysicalVolume* PhantomPhys; //pointer to physical phantom + G4Material* phantomAbsorberMaterial; + + G4double phantomDimensionX; //Phantom XDimension + G4double phantomDimensionY; //Phantom YDimension + G4double phantomDimensionZ; //Phantom ZDimension + G4int numberOfVoxelsAlongX; //Number of voxels along x axis + G4int numberOfVoxelsAlongZ; //Number of voxels along z axis + G4double Worldx ; //World XDimension + G4double Worldy ; //World YDimension + G4double Worldz ; //World XDimension + G4String sensitiveDetectorName; + BrachyDetectorMessenger* detectorMessenger; + BrachyMaterial* pMaterial; + + G4double dimVoxel; +}; + +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionI.hh b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionI.hh new file mode 100644 index 0000000000..82836fbc38 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionI.hh @@ -0,0 +1,94 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyDetectorConstructionI.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// **************************************** +// * * +// * BrachyDetectorConstructionI.hh * +// * * +// **************************************** +//Author: Susanna Guatelli +// +#ifndef BrachyDetectorConstructionI_H +#define BrachyDetectorConstructionI_H 1 + +#include "globals.hh" +#include "G4VUserDetectorConstruction.hh" +#include "G4LogicalVolume.hh" + +class G4LogicalVolume; +class G4Tubs; +class G4Box; +class G4Sphere; +class G4Tubs; +class G4Colour; +class G4VPhysicalVolume; +class G4VPhysicalVolume; +class BrachyMaterial; + +class BrachyDetectorConstructionI +{ +public: + BrachyDetectorConstructionI(); + ~BrachyDetectorConstructionI(); + void ConstructIodium(G4VPhysicalVolume*);// Construct iodium source + +private: + //air tub ... + G4Tubs* defaultTub; + G4LogicalVolume* defaultTubLog; + G4VPhysicalVolume* defaultTubPhys; + + //source titanium capsule ... + G4Tubs* capsule ; + G4LogicalVolume* capsuleLog; + G4VPhysicalVolume* capsulePhys; + + G4Sphere* capsuleTip; + G4LogicalVolume* capsuleTipLog; + G4VPhysicalVolume* capsuleTipPhys1; + G4VPhysicalVolume* capsuleTipPhys2; + + //radioactive core ... + G4Tubs* iodiumCore; + G4LogicalVolume* iodiumCoreLog; + G4VPhysicalVolume* iodiumCorePhys; + + // golden marker ... + G4Tubs* marker; + G4LogicalVolume* markerLog; + G4VPhysicalVolume* markerPhys; + + BrachyMaterial* pMaterial; +}; +#endif + + + + + + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionIr.hh b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionIr.hh new file mode 100644 index 0000000000..5c83aa28ee --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionIr.hh @@ -0,0 +1,88 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyDetectorConstructionIr.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// **************************************** +// * * +// * BrachyDetectorConstructionIr.hh * +// * * +// **************************************** +// +// Author: Susanna Guatelli +// + +#ifndef BrachyDetectorConstructionIr_H +#define BrachyDetectorConstructionIr_H 1 + +#include "globals.hh" +#include "G4VUserDetectorConstruction.hh" +#include "G4LogicalVolume.hh" + + +class G4LogicalVolume; +class G4Tubs; +class G4Box; +class G4Sphere; +class G4Tubs; +class G4Colour; +class G4VPhysicalVolume; +class G4VPhysicalVolume; +class BrachyMaterial; + +class BrachyDetectorConstructionIr +{ +public: + BrachyDetectorConstructionIr(); + ~BrachyDetectorConstructionIr(); + void ConstructIridium(G4VPhysicalVolume*); + void CleanIridium(); + +private: + G4Tubs* capsule ; + G4LogicalVolume* capsuleLog; + G4VPhysicalVolume* capsulePhys; + G4Sphere* capsuleTip; + G4LogicalVolume* capsuleTipLog; + G4VPhysicalVolume* capsuleTipPhys; + + G4Tubs* iridiumCore; + G4LogicalVolume* iridiumCoreLog; + G4VPhysicalVolume* iridiumCorePhys; + + BrachyMaterial* pMat; + + G4VisAttributes* simpleCapsuleVisAtt; + G4VisAttributes* simpleCapsuleTipVisAtt; + G4VisAttributes* simpleIridiumVisAtt; +}; +#endif + + + + + + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionLeipzig.hh b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionLeipzig.hh new file mode 100644 index 0000000000..6a7ec0a948 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDetectorConstructionLeipzig.hh @@ -0,0 +1,84 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyDetectorConstructionLeipzig.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//Author: Susanna Guatelli +// +// ************************************************ +// * * +// * BrachyDetectorConstructionLeipzig.hh * +// * * +// ************************************************ +// +//Management of Leipzig applicator +// +#ifndef BrachyDetectorConstructionLeipzig_H +#define BrachyDetectorConstructionLeipzig_H 1 + +#include "globals.hh" +#include "G4VUserDetectorConstruction.hh" +#include "G4LogicalVolume.hh" + +class G4LogicalVolume; +class G4Tubs; +class G4Box; +class G4Sphere; +class G4Tubs; +class G4Colour; +class G4VPhysicalVolume; +class G4VPhysicalVolume; +class BrachyMaterial; + +class BrachyDetectorConstructionLeipzig +{ +public: + BrachyDetectorConstructionLeipzig(); + ~BrachyDetectorConstructionLeipzig(); + void ConstructLeipzig(G4VPhysicalVolume*); + +private: + G4Tubs* capsule ; + G4LogicalVolume* capsuleLog; + G4VPhysicalVolume* capsulePhys; + + G4Sphere* capsuleTip; + G4LogicalVolume* capsuleTipLog; + G4VPhysicalVolume* capsuleTipPhys; + + G4Tubs* iridiumCore; + G4LogicalVolume* iridiumCoreLog; + G4VPhysicalVolume* iridiumCorePhys; + + G4Tubs* applicator1; + G4LogicalVolume* applicator1Log ; + G4VPhysicalVolume* applicator1Phys; + + G4Tubs* applicator2; + G4LogicalVolume* applicator2Log ; + G4VPhysicalVolume* applicator2Phys; + + BrachyMaterial* pMaterial; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyDetectorMessenger.hh b/examples/extended/parallel/ExDiane/include/BrachyDetectorMessenger.hh new file mode 100644 index 0000000000..10969033fb --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDetectorMessenger.hh @@ -0,0 +1,66 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +//Author: Susanna Guatelli +// +// +// ***************************************** +// * * +// * BrachyDetectrorMessenger.hh * +// * * +// ***************************************** +// +// $Id: BrachyDetectorMessenger.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +#ifndef BrachyDetectorMessenger_h +#define BrachyDetectorMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class BrachyDetectorConstruction; +class BrachyFactoryIr; +class BrachyRunAction; +class G4UIdirectory; +class G4UIcmdWithAString; +class G4UIcmdWithAnInteger; +class G4UIcmdWithADoubleAndUnit; +class G4UIcmdWithoutParameter; + +class BrachyDetectorMessenger: public G4UImessenger +{ +public: + BrachyDetectorMessenger(BrachyDetectorConstruction* ); + ~BrachyDetectorMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + BrachyDetectorConstruction* detector;//pointer to detector + G4UIdirectory* detectorDir; + G4UIcmdWithAString* phantomMaterialCmd; // change phantom material + G4UIcmdWithAString* sourceCmd; //change brachytherapis source +}; +#endif + diff --git a/examples/extended/parallel/ExDiane/include/BrachyDummySD.hh b/examples/extended/parallel/ExDiane/include/BrachyDummySD.hh new file mode 100644 index 0000000000..332654f16d --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyDummySD.hh @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************** +// * * +// * BrachyDummySD.hh * +// * * +// ******************************** + +// Dummy sensitive used only to flag sensitivity in cells of RO geometry. + +#ifndef BrachyDummySD_h +#define BrachyDummySD_h 1 + +#include "G4VSensitiveDetector.hh" +class G4Step; + +class BrachyDummySD : public G4VSensitiveDetector +{ +public: + BrachyDummySD(); + ~BrachyDummySD() {}; + + void Initialize(G4HCofThisEvent* ) {}; + G4bool ProcessHits(G4Step* ,G4TouchableHistory*) {return false;} + void EndOfEvent(G4HCofThisEvent*) {}; + void clear() {}; + void DrawAll() {}; + void PrintAll() {}; +}; + +BrachyDummySD::BrachyDummySD() : G4VSensitiveDetector("dummySD") +{} +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyEventAction.hh b/examples/extended/parallel/ExDiane/include/BrachyEventAction.hh new file mode 100644 index 0000000000..12cc4ac018 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyEventAction.hh @@ -0,0 +1,61 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyEventAction.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// Code developed by: +// S.Guatelli +// +// ********************************** +// * * +// * BrachyEventAction.hh * +// * * +// ********************************** + +#ifndef BrachyEventAction_h +#define BrachyEventAction_h 1 + +#include "G4UserEventAction.hh" +#include "globals.hh" + +class BrachyDetectorConstruction; +class BrachyAnalysisManager; +class BrachyEventAction : public G4UserEventAction +{ +public: + BrachyEventAction(); + ~BrachyEventAction(); + +public: + void BeginOfEventAction(const G4Event*); + void EndOfEventAction(const G4Event*); + +private: + G4String drawFlag; //Visualisation flag +}; + +#endif + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyFactory.hh b/examples/extended/parallel/ExDiane/include/BrachyFactory.hh new file mode 100644 index 0000000000..d78815cae1 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyFactory.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: Susanna Guatelli +// +// $Id: BrachyFactory.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyFactory.hh * +// * * +// ********************************** +// +// this is the abstract class which manages the sources' realisation +// in terms of geometry and primary particle generated in the radioactive core + +#ifndef BrachyFactory_h +#define BrachyFactory_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class G4VPhysicalVolume; +class BrachyAnalysisManager; + +class BrachyFactory +{ +public: + + BrachyFactory(); + virtual ~BrachyFactory(); + + //Source primary particles' management ... + virtual G4VUserPrimaryGeneratorAction* CreatePrimaryGeneratorAction() = 0; + + // ... + // this function manages the creation of the source in terms of + // geometry ... + virtual void CreateSource(G4VPhysicalVolume*) = 0; + + // ... + // This function deletes the source in the geometry (phantom); to be + // used when the user needs to substitute one source with another one ... + virtual void CleanSource() = 0; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyFactoryI.hh b/examples/extended/parallel/ExDiane/include/BrachyFactoryI.hh new file mode 100644 index 0000000000..c8d051c632 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyFactoryI.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ******************************* +// * * +// * BrachyFactoryI.cc * +// * * +// ******************************* +// +// +// Code developed by: +// S.Guatelli +// +// +// $Id: BrachyFactoryI.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------- +#ifndef BrachyFactoryI_h +#define BrachyFactoryI_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "BrachyDetectorConstructionI.hh" +#include "BrachyFactory.hh" +#include "G4RunManager.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyFactory; +class BrachyPrimaryGeneratorActionI; +class BrachyDetectorConstructionI; + +// This class manages the creation of Bebig Isoseed I-125 source +// used in interstitial brachytherapy ... +class BrachyFactoryI:public BrachyFactory +{ +public: + BrachyFactoryI(); + ~BrachyFactoryI(); + + G4VUserPrimaryGeneratorAction* CreatePrimaryGeneratorAction(); + void CreateSource(G4VPhysicalVolume*); + void CleanSource(); + +private: + BrachyDetectorConstructionI* iodiumSource; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyFactoryIr.hh b/examples/extended/parallel/ExDiane/include/BrachyFactoryIr.hh new file mode 100644 index 0000000000..4e11236215 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyFactoryIr.hh @@ -0,0 +1,65 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyFactoryIr.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyFactoryIr.hh * +// * * +// ********************************** +// +// +// +#ifndef BrachyFactoryIr_h +#define BrachyFactoryIr_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "BrachyFactory.hh" +#include "G4RunManager.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyFactory; +class BrachyPrimaryGeneratorActionIr; +class BrachyDetectorConstructionIr; + +// This class manages the creation of iridum source used in endocavitary +// brachytherapy ... +class BrachyFactoryIr : public BrachyFactory +{ +public: + BrachyFactoryIr(); + ~BrachyFactoryIr(); + + G4VUserPrimaryGeneratorAction* CreatePrimaryGeneratorAction(); + void CreateSource(G4VPhysicalVolume*); + void CleanSource(); + +private: + BrachyDetectorConstructionIr* iridiumSource; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyFactoryLeipzig.hh b/examples/extended/parallel/ExDiane/include/BrachyFactoryLeipzig.hh new file mode 100644 index 0000000000..24adfeb795 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyFactoryLeipzig.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyFactoryLeipzig.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyFactoryLeipzig.hh * +// * * +// ********************************** +//code developed by: Susanna Guatelli +// +// This class manages the creation of iridum source used in superficial +// brachytherapy ... +#ifndef BrachyFactoryLeipzig_h +#define BrachyFactoryLeipzig_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" +#include "BrachyFactory.hh" +#include "G4RunManager.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyFactory; +class BrachyPrimaryGeneratorActionIr; +class BrachyDetectorConstructionLeipzig; + +class BrachyFactoryLeipzig : public BrachyFactory +{ +public: + BrachyFactoryLeipzig(); + ~BrachyFactoryLeipzig(); + + G4VUserPrimaryGeneratorAction* CreatePrimaryGeneratorAction(); + void CreateSource(G4VPhysicalVolume*); + void CleanSource(); + +private: + BrachyDetectorConstructionLeipzig* leipzigSource; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyMaterial.hh b/examples/extended/parallel/ExDiane/include/BrachyMaterial.hh new file mode 100644 index 0000000000..cb49325790 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyMaterial.hh @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyMaterial.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyMaterial.hh * +// * * +// ********************************** +// +//Code developed by: Susanna Guatelli +// +//This class manages the elements and materials needed by the simulation +// set-up ... +// +#ifndef BrachyMaterial_H +#define BrachyMaterial_H 1 +#include "globals.hh" +class G4Material; + +class BrachyMaterial +{ +public: + BrachyMaterial(); + ~ BrachyMaterial(); + +public: + void DefineMaterials(); + G4Material* GetMat(G4String); //returns the material + +private: + G4Material* matW; + G4Material* matplexiglass; + G4Material* matPb; + G4Material* matir192; + G4Material* Titanium; + G4Material* matAir; + G4Material* matH2O; + G4Material* soft; + G4Material* matsteel; + G4Material* gold; + G4Material* matI; + G4Material* ceramic; + G4Material*Vacuum; + G4Material* bone; + G4Material* muscle; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyPhantomHit.hh b/examples/extended/parallel/ExDiane/include/BrachyPhantomHit.hh new file mode 100644 index 0000000000..68e2ad1e37 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPhantomHit.hh @@ -0,0 +1,132 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPhantomHit.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ******************************** +// * * +// * BrachyPhantomHit.hh * +// * * +// ******************************** +// +//Code developed by: S. Guatelli +// +// It manages the hits and the enrgy deposit in the phantom associated with +// each hit ... + +#ifndef BrachyPhantomHit_h +#define BrachyPhantomHit_h 1 + +#include "G4VHit.hh" +#include "G4THitsCollection.hh" +#include "G4Allocator.hh" +#include "G4ThreeVector.hh" +#include "G4LogicalVolume.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" + +class BrachyPhantomHit : public G4VHit +{ +public: + BrachyPhantomHit(G4LogicalVolume* ,G4int ,G4int ,G4int ); + ~BrachyPhantomHit(); + BrachyPhantomHit(const BrachyPhantomHit &right); + const BrachyPhantomHit& operator = (const BrachyPhantomHit &right); + int operator == (const BrachyPhantomHit &right) const; + + inline void *operator new(size_t); + inline void operator delete(void *aHit); + + void Draw(); + void Print(); + +private: + const G4LogicalVolume* logicalVolume;// Logical volume where the hit happened + G4int xHitPosition; // Hit x coordinate + G4int zHitPosition; // Hit z coordinate + G4int yHitPosition; // Hit y coordinate + G4ThreeVector hitPosition; //position of the hit + G4RotationMatrix rotation; // rotation of the logical volume + G4double energyDeposit; // energy deposit associated with the hit + +public: + //... + // Set Hit position + inline void SetCellID(G4int XID,G4int YID,G4int ZID) + {xHitPosition = XID; zHitPosition = ZID; yHitPosition = YID; } + + inline G4int GetXID() // Get hit x coordinate + {return xHitPosition;} + + inline G4int GetZID() // Get hit z coordinate + {return zHitPosition;} + + inline G4int GetYID() // Get hit y coordinate + {return yHitPosition;} + + inline void SetEdep(G4double edep) //Set hit energy deposit + {energyDeposit = edep;} + + inline void AddEdep(G4double edep) // Add energy deposit + {energyDeposit += edep;} + + inline G4double GetEdep() // Get energy deposit + {return energyDeposit;} + + inline void SetPos(G4ThreeVector xyz) // Set hit position + {hitPosition = xyz;} + + inline G4ThreeVector GetPos() // Get hit position + {return hitPosition;} + + inline void SetRot(G4RotationMatrix rmat) //set rotation + {rotation = rmat;} + + inline G4RotationMatrix GetRot() //get rotation + {return rotation;} + + //... + // It returns the logical volume where the hit happened + inline const G4LogicalVolume * GetLogicalVolume() + {return logicalVolume;} +}; + +typedef G4THitsCollection BrachyPhantomHitsCollection; +extern G4Allocator BrachyPhantomHitAllocator; + +inline void* BrachyPhantomHit::operator new(size_t) +{ + void *aHit; + aHit = (void *) BrachyPhantomHitAllocator.MallocSingle(); + return aHit; +} + +inline void BrachyPhantomHit::operator delete(void *aHit) +{ + BrachyPhantomHitAllocator.FreeSingle((BrachyPhantomHit*) aHit); +} +#endif + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyPhantomROGeometry.hh b/examples/extended/parallel/ExDiane/include/BrachyPhantomROGeometry.hh new file mode 100644 index 0000000000..dd6543b492 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPhantomROGeometry.hh @@ -0,0 +1,60 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPhantomROGeometry.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ************************************ +// * * +// * BrachyPhantomROGeometry.hh * +// * * +// ************************************ +// +//The phantom is devided in voxels. the dimension of the voxel is 1mm +// +#ifndef BrachyPhantomROGeometry_h +#define BrachyPhantomROGeometry_h + +#include "G4VReadOutGeometry.hh" + +class BrachyPhantomROGeometry : public G4VReadOutGeometry +{ +public: + BrachyPhantomROGeometry(G4String aString, + G4double phantomDimX, + G4double phantomDimZ, + G4int numberOfVoxelsX, + G4int numberOfVoxelsZ); + ~BrachyPhantomROGeometry(); + +private: + G4VPhysicalVolume* Build(); + +private: + const G4double phantomDimensionX; + const G4double phantomDimensionZ; + const G4int numberOfVoxelsAlongX; + const G4int numberOfVoxelsAlongZ; + G4VPhysicalVolume *ROPhantomYDivisionPhys; +}; +#endif diff --git a/examples/extended/parallel/ExDiane/include/BrachyPhantomSD.hh b/examples/extended/parallel/ExDiane/include/BrachyPhantomSD.hh new file mode 100644 index 0000000000..77eff5e24c --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPhantomSD.hh @@ -0,0 +1,64 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPhantomSD.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ******************************** +// * * +// * BrachyPhantomSD.hh * +// * * +// ******************************** + +#ifndef BrachyPhantomSD_h +#define BrachyPhantomSD_h 1 + +#include "G4VSensitiveDetector.hh" +#include "BrachyPhantomHit.hh" + +class G4Step; +class G4HCofThisEvent; +class G4TouchableHistory; + +class BrachyPhantomSD : public G4VSensitiveDetector +{ +public: + BrachyPhantomSD(G4String name, G4int NumVoxelX, G4int NumVoxelZ); + ~BrachyPhantomSD(); + + void Initialize(G4HCofThisEvent*); + G4bool ProcessHits(G4Step*aStep,G4TouchableHistory*ROhist); + void EndOfEvent(G4HCofThisEvent*HCE); + void clear(); + void DrawAll(); + void PrintAll(); + +private: + const G4int numberOfVoxelsX; + const G4int numberOfVoxelsZ; + G4int *voxelID; + BrachyPhantomHitsCollection *phantomHitsCollection; +}; +#endif + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyPhysicsList.hh b/examples/extended/parallel/ExDiane/include/BrachyPhysicsList.hh new file mode 100644 index 0000000000..88896313bb --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPhysicsList.hh @@ -0,0 +1,80 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPhysicsList.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ********************************** +// * * +// * BrachyPhysicsList.hh * +// * * +// ********************************** +// +//Author: Susanna Guatelli +// +#ifndef BrachyPhysicsList_h +#define BrachyPhysicsList_h 1 + +#include "G4VUserPhysicsList.hh" +#include "globals.hh" + +class G4LowEnergyIonisation; +class G4LowEnergyPhotoElectric; +class G4LowEnergyBremsstrahlung; + +class BrachyPhysicsList: public G4VUserPhysicsList +{ +public: + BrachyPhysicsList(); + ~BrachyPhysicsList(); + +protected: + // Construct particle and physics + void ConstructParticle(); + void ConstructProcess(); + void SetCuts(); + +private: + G4double cutForGamma; + G4double cutForElectron; + G4double cutForPositron; + +protected: + // these methods Construct particles + void ConstructBosons(); + void ConstructLeptons(); + +protected: + // these methods Construct physics processes and register them + void ConstructGeneral(); + void ConstructEM(); + +private: + G4LowEnergyIonisation* loweIon; + G4LowEnergyPhotoElectric* lowePhot; + G4LowEnergyBremsstrahlung* loweBrem; +}; +#endif + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorAction.hh b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorAction.hh new file mode 100644 index 0000000000..31cec27bd8 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorAction.hh @@ -0,0 +1,56 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPrimaryGeneratorAction.hh,v 1.1 2004/05/25 07:32:35 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ******************************************** +// * * +// * BrachyPrimaryGeneratorAction.hh * +// * * +// ******************************************** + +// This class must be implemented because it is mandatory + +#ifndef BrachyPrimaryGeneratorAction_h +#define BrachyPrimaryGeneratorAction_h 1 + +#include "G4VUserPrimaryGeneratorAction.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction +{ + public: + BrachyPrimaryGeneratorAction(); + ~BrachyPrimaryGeneratorAction(); + + public: + virtual void GeneratePrimaries(G4Event* anEvent) = 0; +}; + +#endif + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionI.hh b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionI.hh new file mode 100644 index 0000000000..3616410a49 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionI.hh @@ -0,0 +1,68 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyPrimaryGeneratorActionI.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// +// ******************************************** +// * * +// * BrachyPrimaryGeneratorActionI.hh * +// * * +// ******************************************** +//Primary particles of the Iodium source. They are delivered from a random +//point of the radionuclide with random direction. The energy spectrum +// of the gamma delivered is activated + +#ifndef BrachyPrimaryGeneratorActionI_h +#define BrachyPrimaryGeneratorActionI_h 1 + +#include "globals.hh" +#include +#include "G4VUserPrimaryGeneratorAction.hh" +#include "BrachyPrimaryGeneratorAction.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyPrimaryGeneratorAction; + +class BrachyPrimaryGeneratorActionI : public G4VUserPrimaryGeneratorAction +{ + public: + BrachyPrimaryGeneratorActionI(); + ~BrachyPrimaryGeneratorActionI(); + + public: + void GeneratePrimaries(G4Event* anEvent); + G4double GetEnergy(); + + private: + G4ParticleGun* particleGun; + G4double primaryParticleEnergy; + std::vector energySpectrum; +}; +#endif + diff --git a/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionIr.hh b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionIr.hh new file mode 100644 index 0000000000..29819c6094 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyPrimaryGeneratorActionIr.hh @@ -0,0 +1,127 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +//Author: Susanna Guatelli +// +// $Id: BrachyPrimaryGeneratorActionIr.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ************************************************* +// * * +// * BrachyPrimaryGeneratorActionIr.hh" * +// * * +// ************************************************* +// +// +//Primary particles of the Iridium source. They are delivered from a random +//point of the radionuclide with random direction. + +#ifndef BrachyPrimaryGeneratorActionIr_h +#define BrachyPrimaryGeneratorActionIr_h 1 + +#include "globals.hh" +#include +#include "G4VUserPrimaryGeneratorAction.hh" +#include "BrachyPrimaryGeneratorAction.hh" + +class G4ParticleGun; +class G4Run; +class G4Event; +class BrachyAnalysisManager; +class BrachyPrimaryGeneratorAction; + +class BrachyPrimaryGeneratorActionIr: public G4VUserPrimaryGeneratorAction +{ +public: + BrachyPrimaryGeneratorActionIr(); + ~BrachyPrimaryGeneratorActionIr(); + + void GeneratePrimaries(G4Event* anEvent); + G4double GetEnergy(){return primaryParticleEnergy;}; + +private: + G4ParticleGun* particleGun; + G4double primaryParticleEnergy; +}; +#endif + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyRunAction.hh b/examples/extended/parallel/ExDiane/include/BrachyRunAction.hh new file mode 100644 index 0000000000..1843c7b66c --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyRunAction.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyRunAction.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//Author: Susanna Guatelli +// +// ******************************************** +// * * +// * BrachyRunAction.hh * +// * * +// ******************************************** +// +#ifndef BrachyRunAction_h +#define BrachyRunAction_h 1 + +#include "G4UserRunAction.hh" +#include "G4RunManager.hh" +#include "globals.hh" + +class G4Run; +class BrachyAnalysisManager; +class BrachyDetectorConstruction; +class BrachyRunMessenger; +class BrachyFactory; +class BrachyFactoryIr; +class BrachyFactoryI; + +class BrachyRunAction : public G4UserRunAction +{ +public: + BrachyRunAction(); + ~BrachyRunAction(); + +public: + void BeginOfRunAction(const G4Run*); + void EndOfRunAction(const G4Run* ); + void SelectEnergy(G4int); + +private: + BrachyRunMessenger* runMessenger; + BrachyFactory *factory; + G4int sourceChoice; //select primary particle +}; +#endif + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyRunMessenger.hh b/examples/extended/parallel/ExDiane/include/BrachyRunMessenger.hh new file mode 100644 index 0000000000..07d4c53567 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyRunMessenger.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyRunMessenger.hh,v 1.2 2004/05/25 08:36:17 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +//Author: Susanna Guatelli +// +// ******************************************** +// * * +// * BrachyRunMessenger.hh * +// * * +// ******************************************** +// This class permits to switch the energy of the gamma delivered from the +//radionuclides (Iodium/Iridium) +// + +#ifndef BrachyRunMessenger_h +#define BrachyRunMessenger_h 1 + +#include "globals.hh" +#include "G4UImessenger.hh" + +class BrachyRunAction; +class BrachyRunAction; +class G4UIdirectory; +class G4UIcmdWithAString; + +class BrachyRunMessenger: public G4UImessenger +{ +public: + BrachyRunMessenger(BrachyRunAction* ); + ~BrachyRunMessenger(); + + void SetNewValue(G4UIcommand*, G4String); + +private: + G4UIdirectory* runDir; + G4UIcmdWithAString* primaryParticleEnergySpectrumCmd; + BrachyRunAction* runManager; +}; +#endif + diff --git a/examples/extended/parallel/ExDiane/include/BrachySimulation.hh b/examples/extended/parallel/ExDiane/include/BrachySimulation.hh new file mode 100644 index 0000000000..9511cf2223 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachySimulation.hh @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachySimulation.hh +// GEANT4 tag $Name: geant4-06-02 $ +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli, K. Moscicki +// +// ******************************* +// * * +// * BrachySimulation.cc * +// * * +// ******************************* +// + +#include "globals.hh" + +#include "Randomize.hh" +#include "IG4Simulation.h" +#include "G4RunManager.hh" +class BrachySimulation : virtual public DIANE::IG4Simulation +{ +public: + BrachySimulation(G4int); + ~BrachySimulation(); + + void setSeed(G4int seed); + G4bool initialize(int argc, char** argv); + void executeMacro(std::string macroFileName); + std::string getOutputFilename(); + void finish(); + +private: + G4int seed; + G4RunManager* pRunManager; +}; + + + diff --git a/examples/extended/parallel/ExDiane/include/BrachyVisManager.hh b/examples/extended/parallel/ExDiane/include/BrachyVisManager.hh new file mode 100644 index 0000000000..4a793eb22e --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/BrachyVisManager.hh @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachyVisManager.hh,v 1.1 2004/05/25 07:32:36 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// +// ******************************************** +// * * +// * BrachyVisManager.hh * +// * * +// ******************************************** +// +//This class permits the visualisation of the experimerimental set up +// +#ifndef BrachyVisManager_h +#define BrachyVisManager_h 1 + +#ifdef G4VIS_USE + +#include "G4VisManager.hh" + +class BrachyVisManager: public G4VisManager +{ +public: + + BrachyVisManager (); + +private: + + void RegisterGraphicsSystems (); +}; +#endif +#endif + + + diff --git a/examples/extended/parallel/ExDiane/include/IG4Simulation.h b/examples/extended/parallel/ExDiane/include/IG4Simulation.h new file mode 100644 index 0000000000..843478d748 --- /dev/null +++ b/examples/extended/parallel/ExDiane/include/IG4Simulation.h @@ -0,0 +1,34 @@ +#ifndef IG4SIMULATION_H +#define IG4SIMULATION_H + +/* ========================================== + DIANE - Distributed Analysis Environment + Copyright (C) Jakub T. Moscicki, 2000-2003 + ------------------------------------------ + See $DIANE_TOP/LICENSE for details. + ========================================== +*/ + +#include "globals.hh" +namespace DIANE +{ + +class IG4Simulation +{ + +public: + + virtual void setSeed(G4int seed) = 0; + virtual G4bool initialize(int argc, char** argv) = 0; + virtual void executeMacro(std::string macroFileName) = 0; + virtual std::string getOutputFilename() = 0; + virtual void finish() = 0; + virtual ~IG4Simulation() {} +}; +} + +extern "C" +DIANE::IG4Simulation* createG4Simulation(int); + +#endif + diff --git a/examples/extended/parallel/ExDiane/iodium.job b/examples/extended/parallel/ExDiane/iodium.job new file mode 100644 index 0000000000..7ee38e89b8 --- /dev/null +++ b/examples/extended/parallel/ExDiane/iodium.job @@ -0,0 +1,25 @@ +#-*-python-*- + +Application = "G4Analysis" + +WorkerInitData = { + 'G4ApplicationComponentName' : "G4Brachy", + 'initMacroFile' : """ +/control/verbose 1 +/run/verbose 0 +/event/verbose 0 +/source/switch Iodium +/run/energy Iodium +/run/initialize +""" +} + +JobInitData = { + 'runParams' : { + 'seed' : 0 , + 'eventNumber' : 5000, + 'macroFileTemplate': "/run/beamOn " }, + 'eventsPerWorker' : 500, + 'workerInit' : WorkerInitData + } + diff --git a/examples/extended/parallel/ExDiane/iridium.job b/examples/extended/parallel/ExDiane/iridium.job new file mode 100644 index 0000000000..bf99cef7a0 --- /dev/null +++ b/examples/extended/parallel/ExDiane/iridium.job @@ -0,0 +1,23 @@ +#-*-python-*- + +Application = "G4Analysis" + +WorkerInitData = { + 'G4ApplicationComponentName' : "G4Brachy", + 'initMacroFile' : """ +/control/verbose 1 +/run/verbose 0 +/event/verbose 0 +/run/initialize +""" +} + +JobInitData = { + 'runParams' : { + 'seed' : 0 , + 'eventNumber' : 5000, + 'macroFileTemplate': "/run/beamOn " }, + 'eventsPerWorker' : 500, + 'workerInit' : WorkerInitData + } + diff --git a/examples/extended/parallel/ExDiane/src/BrachyAnalysisManager.cc b/examples/extended/parallel/ExDiane/src/BrachyAnalysisManager.cc new file mode 100644 index 0000000000..9567052a3b --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyAnalysisManager.cc @@ -0,0 +1,143 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyAnalysisManager.cc * +// * * +// ******************************* +// +// $Id: BrachyAnalysisManager.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#ifdef G4ANALYSIS_USE +#include +#include +#include "BrachyAnalysisManager.hh" + +#include "G4ios.hh" + +#include "AIDA/IHistogram1D.h" +#include "AIDA/IHistogram2D.h" + +#include "AIDA/IManagedObject.h" +#include "AIDA/IAnalysisFactory.h" +#include "AIDA/IHistogramFactory.h" +#include "AIDA/ITupleFactory.h" +#include "AIDA/ITreeFactory.h" +#include "AIDA/ITree.h" +#include "AIDA/ITuple.h" + +BrachyAnalysisManager* BrachyAnalysisManager::instance = 0; + +BrachyAnalysisManager::BrachyAnalysisManager() : + aFact(0), theTree(0), histFact(0), h1(0), h2(0) + +{ + //build up the factories + aFact = AIDA_createAnalysisFactory(); + + AIDA::ITreeFactory *treeFact = aFact -> createTreeFactory(); + + //parameters for the TreeFactory + + std::string fileName = "brachytherapy.xml"; + theTree = treeFact -> create(fileName,"xml",false, true, "uncompressed"); + + delete treeFact; + + histFact = aFact -> createHistogramFactory( *theTree ); +} + +BrachyAnalysisManager::~BrachyAnalysisManager() +{ + delete histFact; + histFact = 0; + + delete theTree; + histFact = 0; + + delete aFact; + aFact = 0; +} + +BrachyAnalysisManager* BrachyAnalysisManager::getInstance() +{ + if (instance == 0) instance = new BrachyAnalysisManager; + return instance; +} + +void BrachyAnalysisManager::book() +{ + //creating a 1D histogram ... + h1 = histFact -> createHistogram2D("10","Energy, pos", //histoID,histo name + 300 ,-150.,150., //bins'number,xmin,xmax + 300,-150.,150. );//bins'number,ymin,ymax + //creating a 2D histogram ... + h2 = histFact -> createHistogram1D("20","Initial Energy", //histoID,histo name + 100,0.,1.); //bins' number, xmin, xmax + + h3 = histFact -> createHistogram1D("30","Dose Distribution", + 300,-150.,150.); //bins' number, xmin, xmax +} + +void BrachyAnalysisManager::FillHistogramWithEnergy(G4double x, + G4double z, + G4double energyDeposit) +{ + h1 -> fill(x,z,energyDeposit); +} + +void BrachyAnalysisManager::PrimaryParticleEnergySpectrum(G4double primaryParticleEnergy) +{ + //1DHisotgram: energy spectrum of primary particles + h2 -> fill(primaryParticleEnergy); +} +void BrachyAnalysisManager::DoseDistribution(G4double x,G4double energy) +{ + //1DHisotgram: energy spectrum of primary particles + h3 -> fill(x,energy); +} + +void BrachyAnalysisManager::finish() +{ + // write all histograms to file ... + theTree -> commit(); + + // close (will again commit) ... + theTree -> close(); +} +#endif + + + + + + + + + + + diff --git a/examples/extended/parallel/ExDiane/src/BrachyDetectorConstruction.cc b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstruction.cc new file mode 100644 index 0000000000..f6630da28b --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstruction.cc @@ -0,0 +1,261 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +// +// **************************************** +// * * +// * BrachyDetectorConstruction.cc * +// * * +// **************************************** +// +// $Id: BrachyDetectorConstruction.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPhantomROGeometry.hh" +#include "BrachyPhantomSD.hh" +#include "BrachyDetectorMessenger.hh" +#include "BrachyDetectorConstruction.hh" +#include "G4CSGSolid.hh" +#include "G4Sphere.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4SDManager.hh" +#include "G4SubtractionSolid.hh" +#include "G4RunManager.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "globals.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4PVParameterised.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4FieldManager.hh" +#include "G4TransportationManager.hh" +#include "G4SDManager.hh" +#include "G4Colour.hh" +#include "G4UserLimits.hh" +#include "G4UnionSolid.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "BrachyMaterial.hh" +#include "BrachyFactoryLeipzig.hh" +#include "BrachyFactoryIr.hh" +#include "BrachyFactoryI.hh" + +BrachyDetectorConstruction::BrachyDetectorConstruction(G4String &SDName) +: detectorChoice(0), phantomSD(0), phantomROGeometry(0), factory(0), + World(0), WorldLog(0), WorldPhys(0), + Phantom(0), PhantomLog(0), PhantomPhys(0), + phantomAbsorberMaterial(0) +{ + phantomDimensionX = 15.*cm ; + phantomDimensionY = 15.*cm; + phantomDimensionZ = 15.*cm; + + numberOfVoxelsAlongX = 300; + numberOfVoxelsAlongZ = 300; + + ComputeDimVoxel(); + + Worldx = 4.0*m; + Worldy = 4.0*m; + Worldz = 4.0*m; + + sensitiveDetectorName = SDName; + + detectorMessenger = new BrachyDetectorMessenger(this); + + factory = new BrachyFactoryIr(); + + pMaterial = new BrachyMaterial(); +} + + +BrachyDetectorConstruction::~BrachyDetectorConstruction() +{ + delete pMaterial; + delete factory; + delete detectorMessenger; + if (phantomROGeometry) delete phantomROGeometry; +} + +G4VPhysicalVolume* BrachyDetectorConstruction::Construct() +{ + pMaterial -> DefineMaterials(); + ConstructPhantom(); + factory ->CreateSource(PhantomPhys); + ConstructSensitiveDetector(); + + return WorldPhys; +} + +void BrachyDetectorConstruction::SwitchBrachytherapicSeed() +{ + factory -> CleanSource(); + delete factory; + switch(detectorChoice) + { + case 1: + factory = new BrachyFactoryI(); + break; + case 2: + factory = new BrachyFactoryLeipzig(); + break; + case 3: + factory = new BrachyFactoryIr(); + break; + default: + factory = new BrachyFactoryIr(); + break; + } + factory -> CreateSource(PhantomPhys); + + // Notify run manager that the new geometry has been built + + G4RunManager::GetRunManager()->DefineWorldVolume( WorldPhys ); +} + +void BrachyDetectorConstruction::SelectBrachytherapicSeed(G4String val) +{ + if(val=="Iodium") + { + detectorChoice = 1; + } + else + { + if(val=="Leipzig") + { + detectorChoice = 2; + } + else + { + if(val=="Iridium") + { + detectorChoice = 3; + } + } + } + G4cout << "Now Detector is " << val << G4endl; +} + +void BrachyDetectorConstruction::ConstructPhantom() +{ + G4Colour lblue (0.0, 0.0, .75); + + G4Material* air = pMaterial -> GetMat("Air") ; + G4Material* water = pMaterial -> GetMat("Water"); + + ComputeDimVoxel(); + + // World volume + World = new G4Box("World",Worldx,Worldy,Worldz); + WorldLog = new G4LogicalVolume(World,air,"WorldLog",0,0,0); + WorldPhys = new G4PVPlacement(0,G4ThreeVector(),"WorldPhys",WorldLog,0,false,0); + + // Water Box + Phantom = new G4Box("Phantom",phantomDimensionX,phantomDimensionY,phantomDimensionZ); + PhantomLog = new G4LogicalVolume(Phantom,water,"PhantomLog",0,0,0); + PhantomPhys = new G4PVPlacement(0,G4ThreeVector(),"PhantomPhys",PhantomLog,WorldPhys,false,0); + + WorldLog->SetVisAttributes (G4VisAttributes::Invisible); + + G4VisAttributes* simpleBoxVisAtt = new G4VisAttributes(lblue); + simpleBoxVisAtt -> SetVisibility(true); + simpleBoxVisAtt -> SetForceWireframe(true); + PhantomLog -> SetVisAttributes(simpleBoxVisAtt); +} + +void BrachyDetectorConstruction::ConstructSensitiveDetector() +// Sensitive Detector and ReadOut geometry definition +{ + G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); + + if(!phantomSD) + { + phantomSD = new BrachyPhantomSD(sensitiveDetectorName, + numberOfVoxelsAlongX, + numberOfVoxelsAlongZ); + G4String ROGeometryName = "PhantomROGeometry"; + phantomROGeometry = new BrachyPhantomROGeometry(ROGeometryName, + phantomDimensionX, + phantomDimensionZ, + numberOfVoxelsAlongX, + numberOfVoxelsAlongZ); + phantomROGeometry -> BuildROGeometry(); + phantomSD -> SetROgeometry(phantomROGeometry); + pSDManager -> AddNewDetector(phantomSD); + PhantomLog -> SetSensitiveDetector(phantomSD); + } +} + +void BrachyDetectorConstruction::PrintDetectorParameters() +{ + G4cout << "-----------------------------------------------------------------------" + << G4endl + << "the detector is a box whose size is: " << G4endl + << phantomDimensionX/cm + << " cm * " + << phantomDimensionY/cm + << " cm * " + << phantomDimensionZ/cm + << " cm" << G4endl + << "numVoxel: " + << numberOfVoxelsAlongX < GetName() < SetMaterial(pttoMaterial); + PrintDetectorParameters(); + } + else + G4cout << "WARNING: material '" << materialChoice + << "' not available!" << G4endl; +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionI.cc b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionI.cc new file mode 100644 index 0000000000..c4788a7a03 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionI.cc @@ -0,0 +1,187 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +/// **************************************** +// * * +// * BrachyDetectorConstructionI.cc * +// * * +// **************************************** +// +// $Id: BrachyDetectorConstructionI.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "globals.hh" +#include "BrachyDetectorConstructionI.hh" +#include "G4CSGSolid.hh" +#include "G4Sphere.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4SDManager.hh" +#include "G4SubtractionSolid.hh" +#include "G4RunManager.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4PVParameterised.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4FieldManager.hh" +#include "G4TransportationManager.hh" +#include "G4UnionSolid.hh" +#include "BrachyMaterial.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +BrachyDetectorConstructionI::BrachyDetectorConstructionI() +: defaultTub(0), defaultTubLog(0), defaultTubPhys(0), + capsule(0), capsuleLog(0), capsulePhys(0), + capsuleTip(0), capsuleTipLog(0),capsuleTipPhys1(0), + capsuleTipPhys2(0), iodiumCore(0), iodiumCoreLog(0), + iodiumCorePhys(0), marker(0), markerLog(0), markerPhys(0) +{ + pMaterial = new BrachyMaterial(); +} + +BrachyDetectorConstructionI::~BrachyDetectorConstructionI() +{ + delete pMaterial; +} + +void BrachyDetectorConstructionI::ConstructIodium(G4VPhysicalVolume* mother) +{ + // source Bebig Isoseed I-125 ... + + //Get materials for source construction ... + G4Material* titanium = pMaterial -> GetMat("titanium"); + G4Material* air = pMaterial -> GetMat("Air"); + G4Material* iodium = pMaterial -> GetMat("Iodium"); + G4Material* gold = pMaterial -> GetMat("gold"); + + G4Colour red (1.0, 0.0, 0.0) ; + G4Colour magenta (1.0, 0.0, 1.0) ; + G4Colour lblue (0.0, 0.0, .75); + + defaultTub = new G4Tubs("DefaultTub",0.*mm,0.40*mm,1.84*mm,0.*deg,360.*deg); + defaultTubLog = new G4LogicalVolume(defaultTub,air,"DefaultTub_Log"); + defaultTubPhys = new G4PVPlacement(0, + G4ThreeVector(), + "defaultTub_Phys", + defaultTubLog, + mother, + false, + 0); + // Capsule main body ... + + G4double capsuleR = 0.35*mm; + capsule = new G4Tubs("Capsule", capsuleR,0.40*mm,1.84*mm,0.*deg,360.*deg); + capsuleLog = new G4LogicalVolume(capsule,titanium,"CapsuleLog"); + capsulePhys = new G4PVPlacement(0, + G4ThreeVector(), + "CapsulePhys", + capsuleLog, + defaultTubPhys, + false, + 0); + // Capsule tips + + capsuleTip = new G4Sphere("CapsuleTip", + 0.*mm, + 0.40*mm, + 0.*deg, + 360.*deg, + 0.*deg, + 90.*deg); + capsuleTipLog = new G4LogicalVolume(capsuleTip,titanium,"CapsuleTipLog"); + capsuleTipPhys1 = new G4PVPlacement(0, + G4ThreeVector(0.,0.,1.84*mm), + "CapsuleTipPhys1", + capsuleTipLog, + mother, + false, + 0); + + G4RotationMatrix* rotateMatrix = new G4RotationMatrix(); + rotateMatrix -> rotateX(180.0*deg); + capsuleTipPhys2 = new G4PVPlacement(rotateMatrix, + G4ThreeVector(0,0,-1.84*mm), + "CapsuleTipPhys2", + capsuleTipLog, + mother, + false, + 0); + + // radiactive core ... + iodiumCore = new G4Tubs("ICore",0.085*mm,0.35*mm,1.75*mm,0.*deg,360.*deg); + iodiumCoreLog = new G4LogicalVolume(iodiumCore,iodium,"iodiumCoreLog"); + iodiumCorePhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,0.), + "iodiumCorePhys", + iodiumCoreLog, + defaultTubPhys, + false, + 0); + // golden marker + marker = new G4Tubs("GoldenMarker",0.*mm,0.085*mm,1.75*mm,0.*deg,360.*deg); + markerLog = new G4LogicalVolume(marker,gold,"MarkerLog"); + markerPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,0.), + "MarkerPhys", + markerLog, + defaultTubPhys, + false, + 0); + // Visual attributes ... + G4VisAttributes* simpleMarkerVisAtt = new G4VisAttributes(lblue); + simpleMarkerVisAtt -> SetVisibility(true); + simpleMarkerVisAtt -> SetForceSolid(true); + markerLog -> SetVisAttributes(simpleMarkerVisAtt); + + G4VisAttributes* simpleiodiumVisAtt = new G4VisAttributes(magenta); + simpleiodiumVisAtt -> SetVisibility(true); + simpleiodiumVisAtt -> SetForceWireframe(true); + iodiumCoreLog -> SetVisAttributes(simpleiodiumVisAtt); + + G4VisAttributes* simpleCapsuleVisAtt = new G4VisAttributes(red); + simpleCapsuleVisAtt -> SetVisibility(true); + simpleCapsuleVisAtt -> SetForceWireframe(true); + capsuleLog -> SetVisAttributes(simpleCapsuleVisAtt); + + G4VisAttributes* simpleCapsuleTipVisAtt = new G4VisAttributes(red); + simpleCapsuleTipVisAtt -> SetVisibility(true); + simpleCapsuleTipVisAtt -> SetForceSolid(true); + capsuleTipLog -> SetVisAttributes(simpleCapsuleTipVisAtt); +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionIr.cc b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionIr.cc new file mode 100644 index 0000000000..bd033ac32b --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionIr.cc @@ -0,0 +1,188 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +// **************************************** +// * * +// * BrachyDetectorConstructionIr.cc * +// * * +// **************************************** +// +// $Id: BrachyDetectorConstructionIr.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "globals.hh" +#include "BrachyDetectorConstructionIr.hh" +#include "G4CSGSolid.hh" +#include "G4Sphere.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4SDManager.hh" +#include "G4SubtractionSolid.hh" +#include "G4RunManager.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4PVParameterised.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4FieldManager.hh" +#include "G4TransportationManager.hh" +#include "G4UnionSolid.hh" +#include "BrachyMaterial.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +BrachyDetectorConstructionIr::BrachyDetectorConstructionIr() + : capsule(0), capsuleLog(0), capsulePhys(0), + capsuleTip(0), capsuleTipLog(0), capsuleTipPhys(0), + iridiumCore(0), iridiumCoreLog(0), iridiumCorePhys(0), + simpleCapsuleVisAtt(0), simpleCapsuleTipVisAtt(0), simpleIridiumVisAtt(0) +{ + pMat = new BrachyMaterial(); +} + +BrachyDetectorConstructionIr::~BrachyDetectorConstructionIr() +{ + delete pMat; +} + +void BrachyDetectorConstructionIr::ConstructIridium(G4VPhysicalVolume* mother) +{ + G4Colour red (1.0, 0.0, 0.0) ; + G4Colour magenta (1.0, 0.0, 1.0) ; + + G4Material* capsuleMat = pMat -> GetMat("Stainless steel"); + G4Material* iridiumMat = pMat -> GetMat("Iridium"); + + // Capsule main body + capsule = new G4Tubs("Capsule",0,0.55*mm,3.725*mm,0.*deg,360.*deg); + capsuleLog = new G4LogicalVolume(capsule,capsuleMat,"CapsuleLog"); + capsulePhys= new G4PVPlacement(0, + G4ThreeVector(0,0,-1.975*mm), + "CapsulePhys", + capsuleLog, + mother, + false, + 0); + + // Capsule tip + capsuleTip = new G4Sphere("CapsuleTipIridium", + 0.*mm, + 0.55*mm, + 0.*deg, + 360.*deg, + 0.*deg, + 90.*deg); + capsuleTipLog = new G4LogicalVolume(capsuleTip, + capsuleMat, + "CapsuleTipIridumLog"); + capsuleTipPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,1.75*mm), + "CapsuleTipIridiumPhys", + capsuleTipLog, + mother, + false, + 0); + + // Iridium core + + iridiumCore = new G4Tubs("IrCore",0,0.30*mm,1.75*mm,0.*deg,360.*deg); + iridiumCoreLog = new G4LogicalVolume(iridiumCore, + iridiumMat, + "IridiumCoreLog"); + iridiumCorePhys = new G4PVPlacement(0, + G4ThreeVector(), + "IridiumCorePhys", + iridiumCoreLog, + capsulePhys, + false, + 0); + + simpleCapsuleVisAtt = new G4VisAttributes(red); + simpleCapsuleVisAtt -> SetVisibility(true); + simpleCapsuleVisAtt -> SetForceWireframe(true); + capsuleLog -> SetVisAttributes(simpleCapsuleVisAtt); + + simpleCapsuleTipVisAtt = new G4VisAttributes(red); + simpleCapsuleTipVisAtt -> SetVisibility(true); + simpleCapsuleTipVisAtt -> SetForceSolid(true); + capsuleTipLog -> SetVisAttributes(simpleCapsuleTipVisAtt); + + simpleIridiumVisAtt = new G4VisAttributes(magenta); + simpleIridiumVisAtt -> SetVisibility(true); + simpleIridiumVisAtt -> SetForceWireframe(true); + iridiumCoreLog -> SetVisAttributes(simpleIridiumVisAtt); +} + +void BrachyDetectorConstructionIr::CleanIridium() +{ + + delete simpleIridiumVisAtt; + simpleIridiumVisAtt = 0; + + delete iridiumCorePhys; + iridiumCorePhys = 0; + + delete iridiumCore; + iridiumCore = 0; + + delete iridiumCoreLog; + iridiumCoreLog = 0 ; + + delete simpleCapsuleTipVisAtt; + simpleCapsuleTipVisAtt = 0; + + delete capsuleTipPhys; + capsuleTipPhys = 0; + + delete capsuleTip; + capsuleTip = 0; + delete capsuleTipLog; + capsuleTipLog = 0; + + delete simpleCapsuleVisAtt; + simpleCapsuleVisAtt = 0; + + delete capsulePhys; + capsulePhys = 0; + + delete capsule; + capsule = 0; + + delete capsuleLog; + capsuleLog = 0; +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionLeipzig.cc b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionLeipzig.cc new file mode 100644 index 0000000000..aa6b0fb673 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyDetectorConstructionLeipzig.cc @@ -0,0 +1,163 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +// ******************************************* +// * * +// * BrachyDetectorConstructionLeipzig.cc * +// * * +// ******************************************* +// +// +// $Id: BrachyDetectorConstructionLeipzig.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "globals.hh" +#include "BrachyDetectorConstructionLeipzig.hh" +#include "G4CSGSolid.hh" +#include "G4Sphere.hh" +#include "G4MaterialPropertyVector.hh" +#include "G4SDManager.hh" +#include "G4SubtractionSolid.hh" +#include "G4RunManager.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Material.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4LogicalVolume.hh" +#include "G4ThreeVector.hh" +#include "G4PVPlacement.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4PVParameterised.hh" +#include "G4Transform3D.hh" +#include "G4RotationMatrix.hh" +#include "G4FieldManager.hh" +#include "G4TransportationManager.hh" +#include "G4UnionSolid.hh" +#include "BrachyMaterial.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +// Leipzig Applicator ... + +BrachyDetectorConstructionLeipzig::BrachyDetectorConstructionLeipzig() +: capsule(0), capsuleLog(0), capsulePhys(0), + capsuleTip(0), capsuleTipLog(0), capsuleTipPhys(0), + iridiumCore(0), iridiumCoreLog(0), iridiumCorePhys(0), + applicator1(0), applicator1Log(0), applicator1Phys(0), + applicator2(0), applicator2Log(0), applicator2Phys(0) +{ + pMaterial = new BrachyMaterial(); +} + +BrachyDetectorConstructionLeipzig::~BrachyDetectorConstructionLeipzig() +{ + delete pMaterial; +} + +void BrachyDetectorConstructionLeipzig::ConstructLeipzig(G4VPhysicalVolume* mother) +{ + G4Colour red (1.0, 0.0, 0.0) ; + + G4Material* capsuleMat = pMaterial -> GetMat("Stainless steel"); + G4Material* iridium = pMaterial -> GetMat("Iridium"); + G4Material* tungsten =pMaterial -> GetMat("Tungsten"); + + //Iridium source ... + + capsule = new G4Tubs("Capsule",0,0.55*mm,3.725*mm,0.*deg,360.*deg); + capsuleLog = new G4LogicalVolume(capsule,capsuleMat,"CapsuleLog"); + capsulePhys = new G4PVPlacement(0, + G4ThreeVector(0,0,-1.975*mm), + "CapsulePhys", + capsuleLog, + mother, //mother volume: phantom + false, + 0); + + // Capsule tip + capsuleTip = new G4Sphere("CapsuleTip",0.*mm,0.55*mm,0.*deg,360.*deg,0.*deg,90.*deg); + capsuleTipLog = new G4LogicalVolume(capsuleTip,capsuleMat,"CapsuleTipLog"); + capsuleTipPhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,1.75*mm), + "CapsuleTipPhys", + capsuleTipLog, + mother, + false, + 0); + // Iridium core + + iridiumCore = new G4Tubs("IrCore",0,0.30*mm,1.75*mm,0.*deg,360.*deg); + iridiumCoreLog = new G4LogicalVolume(iridiumCore, + iridium, + "IridiumCoreLog"); + iridiumCorePhys = new G4PVPlacement(0, + G4ThreeVector(0.,0.,1.975*mm), + "IridiumCorePhys", + iridiumCoreLog, + capsulePhys, + false, + 0); + // Applicator + //Leipzig Applicator is given by two different volumes + + applicator1 = new G4Tubs("Appl1",5*mm,10.5*mm,12*mm,0.*deg,360.*deg); + applicator1Log = new G4LogicalVolume(applicator1,tungsten,"Appl1Log"); + applicator1Phys = new G4PVPlacement(0, + G4ThreeVector(0,0,4.0*mm), + "Appl1Phys", + applicator1Log, + mother, + false, + 0); + + applicator2 = new G4Tubs("Appl2",0.55*mm,5.*mm,3.125*mm,0.*deg,360.*deg); + applicator2Log = new G4LogicalVolume(applicator2,tungsten,"Appl2"); + applicator2Phys = new G4PVPlacement(0, + G4ThreeVector(0,0,-4.875*mm), + "Appl2Phys", + applicator2Log, + mother, + false, + 0); + + G4VisAttributes* simpleCapsuleVisAtt = new G4VisAttributes(red); + simpleCapsuleVisAtt -> SetVisibility(true); + simpleCapsuleVisAtt -> SetForceSolid(true); + capsuleLog -> SetVisAttributes(simpleCapsuleVisAtt); + + G4VisAttributes* simpleCapsuleTipVisAtt = new G4VisAttributes(red); + simpleCapsuleTipVisAtt -> SetVisibility(true); + simpleCapsuleTipVisAtt -> SetForceSolid(true); + capsuleTipLog -> SetVisAttributes(simpleCapsuleTipVisAtt); +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyDetectorMessenger.cc b/examples/extended/parallel/ExDiane/src/BrachyDetectorMessenger.cc new file mode 100644 index 0000000000..62e8c73011 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyDetectorMessenger.cc @@ -0,0 +1,88 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: +// S.Guatelli +// +// ********************************* +// * * +// * BrachyDetectorMessenger.cc * +// * * +// ********************************* +// +// +// $Id: BrachyDetectorMessenger.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// + +#include "BrachyDetectorMessenger.hh" +#include "BrachyFactoryIr.hh" +#include "BrachyRunAction.hh" +#include "BrachyDetectorConstruction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" +#include "G4UIcmdWithAnInteger.hh" +#include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4UIcmdWithoutParameter.hh" + +BrachyDetectorMessenger::BrachyDetectorMessenger( BrachyDetectorConstruction* Det): detector(Det) +{ + detectorDir = new G4UIdirectory("/phantom/"); + detectorDir -> SetGuidance(" phantom control."); + + phantomMaterialCmd = new G4UIcmdWithAString("/phantom/selectMaterial",this); + phantomMaterialCmd -> SetGuidance("Select Material of the detector."); + phantomMaterialCmd -> SetParameterName("choice",false); + phantomMaterialCmd -> AvailableForStates(G4State_Idle); + + sourceCmd = new G4UIcmdWithAString("/source/switch",this); + sourceCmd -> SetGuidance("Assign the selected geometry to G4RunManager."); + sourceCmd -> SetParameterName("choice",true); + sourceCmd -> SetDefaultValue(" "); + sourceCmd -> SetCandidates("Iridium Iodium Leipzig "); + sourceCmd -> AvailableForStates(G4State_PreInit,G4State_Idle); + } + +BrachyDetectorMessenger::~BrachyDetectorMessenger() +{ + delete sourceCmd; + delete phantomMaterialCmd; + delete detectorDir; +} + +void BrachyDetectorMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if( command == phantomMaterialCmd ) + { detector -> SetPhantomMaterial(newValue);} + + if( command == sourceCmd ) + { + if(newValue=="Iodium" || newValue=="Iridium"|| newValue=="Leipzig") + { + detector -> SelectBrachytherapicSeed(newValue); + detector -> SwitchBrachytherapicSeed(); + } + } +} + diff --git a/examples/extended/parallel/ExDiane/src/BrachyEventAction.cc b/examples/extended/parallel/ExDiane/src/BrachyEventAction.cc new file mode 100644 index 0000000000..9c8ec3e9f6 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyEventAction.cc @@ -0,0 +1,79 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyEventAction.cc * +// * * +// ******************************* +// +// $Id: BrachyEventAction.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyEventAction.hh" +#include "G4Event.hh" +#include "G4EventManager.hh" +#include "G4TrajectoryContainer.hh" +#include "G4Trajectory.hh" +#include "G4VVisManager.hh" +#include "G4UImanager.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" + +BrachyEventAction::BrachyEventAction(): + drawFlag("all" ) +{ +} + +BrachyEventAction::~BrachyEventAction() +{ +} + +void BrachyEventAction::BeginOfEventAction(const G4Event*) +{ +} + +void BrachyEventAction::EndOfEventAction(const G4Event* evt) +{ + // extract the trajectories and draw them ... + + if (G4VVisManager::GetConcreteInstance()) + { + G4TrajectoryContainer * trajectoryContainer = evt->GetTrajectoryContainer(); + G4int n_trajectories = 0; + if (trajectoryContainer) n_trajectories = trajectoryContainer->entries(); + + for (G4int i=0; i GetTrajectoryContainer()))[i]); + if(drawFlag == "all") trj -> DrawTrajectory(50); + else if((drawFlag == "charged")&&(trj -> GetCharge() != 0.)) + trj -> DrawTrajectory(50); + else if ((drawFlag == "neutral")&&(trj -> GetCharge() == 0.)) + trj -> DrawTrajectory(50); + } + } +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyFactory.cc b/examples/extended/parallel/ExDiane/src/BrachyFactory.cc new file mode 100644 index 0000000000..251b29d158 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyFactory.cc @@ -0,0 +1,43 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: +// S.Guatelli +// +// +// ******************************* +// * * +// * BrachyFactory.cc * +// * * +// ******************************* +// +// $Id: BrachyFactory.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include"BrachyFactory.hh" + +BrachyFactory::BrachyFactory() +{;} + +BrachyFactory::~BrachyFactory() +{;} diff --git a/examples/extended/parallel/ExDiane/src/BrachyFactoryI.cc b/examples/extended/parallel/ExDiane/src/BrachyFactoryI.cc new file mode 100644 index 0000000000..d8d7beb591 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyFactoryI.cc @@ -0,0 +1,70 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyFactoryI.cc +// * * +// ******************************* +// +// $Id: BrachyFactoryI.cc,v 1.1 2004/05/25 07:32:36 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyFactoryI.hh" +#include "BrachyPrimaryGeneratorActionI.hh" +#include "BrachyDetectorConstructionI.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "globals.hh" +#include "G4RunManager.hh" + +BrachyFactoryI:: BrachyFactoryI() +{ + iodiumSource = new BrachyDetectorConstructionI(); +} + +BrachyFactoryI::~BrachyFactoryI() +{ + delete iodiumSource; +} + +G4VUserPrimaryGeneratorAction* BrachyFactoryI::CreatePrimaryGeneratorAction() +{ + G4VUserPrimaryGeneratorAction* iodiumPrimaryParticle = + new BrachyPrimaryGeneratorActionI(); + return iodiumPrimaryParticle; +} + +void BrachyFactoryI::CreateSource(G4VPhysicalVolume* mother) +{ + iodiumSource->ConstructIodium(mother); +} + +void BrachyFactoryI::CleanSource() +{;} diff --git a/examples/extended/parallel/ExDiane/src/BrachyFactoryIr.cc b/examples/extended/parallel/ExDiane/src/BrachyFactoryIr.cc new file mode 100644 index 0000000000..70f98d7142 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyFactoryIr.cc @@ -0,0 +1,72 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyFactoryIr * +// * * +// ******************************* +// +// $Id: BrachyFactoryIr.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "globals.hh" +#include "BrachyFactoryIr.hh" +#include "BrachyPrimaryGeneratorActionIr.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "G4RunManager.hh" +#include "BrachyDetectorMessenger.hh" +#include "BrachyDetectorConstructionIr.hh" + +BrachyFactoryIr:: BrachyFactoryIr() +{ + iridiumSource =new BrachyDetectorConstructionIr(); +} + +BrachyFactoryIr:: ~BrachyFactoryIr() +{ + delete iridiumSource; +} + +G4VUserPrimaryGeneratorAction* BrachyFactoryIr::CreatePrimaryGeneratorAction(){ + G4VUserPrimaryGeneratorAction* iridiumPrimaryParticle = + new BrachyPrimaryGeneratorActionIr(); + return iridiumPrimaryParticle; +} + +void BrachyFactoryIr::CreateSource(G4VPhysicalVolume* mother) +{ + iridiumSource -> ConstructIridium(mother); +} + +void BrachyFactoryIr::CleanSource() +{ + iridiumSource -> CleanIridium(); +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyFactoryLeipzig.cc b/examples/extended/parallel/ExDiane/src/BrachyFactoryLeipzig.cc new file mode 100644 index 0000000000..11680dcfc8 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyFactoryLeipzig.cc @@ -0,0 +1,74 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyFactoryLeipzig.cc * +// * * +// ******************************* +// +// $Id: BrachyFactoryLeipzig.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "globals.hh" +#include "BrachyFactoryLeipzig.hh" +#include"BrachyPrimaryGeneratorActionIr.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "G4RunManager.hh" +#include "BrachyDetectorMessenger.hh" +#include "BrachyDetectorConstructionLeipzig.hh" + +BrachyFactoryLeipzig:: BrachyFactoryLeipzig() +{ + leipzigSource = new BrachyDetectorConstructionLeipzig(); +} + +BrachyFactoryLeipzig:: ~BrachyFactoryLeipzig() +{ + delete leipzigSource; +} + +G4VUserPrimaryGeneratorAction* BrachyFactoryLeipzig::CreatePrimaryGeneratorAction() +{ + G4VUserPrimaryGeneratorAction* iridiumPrimaryParticle = + new BrachyPrimaryGeneratorActionIr(); + return iridiumPrimaryParticle; +} + +void BrachyFactoryLeipzig::CreateSource(G4VPhysicalVolume* mother) +{ + leipzigSource -> ConstructLeipzig(mother); +} + +void BrachyFactoryLeipzig::CleanSource() +{ + ; +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyMaterial.cc b/examples/extended/parallel/ExDiane/src/BrachyMaterial.cc new file mode 100644 index 0000000000..2bbb7351b3 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyMaterial.cc @@ -0,0 +1,237 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// ******************************* +// * * +// * BrachyMaterial.cc * +// * * +// ******************************* +// +// $Id: BrachyMaterial.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "G4MaterialPropertiesTable.hh" +#include "G4MaterialPropertyVector.hh" +#include "globals.hh" +#include "G4MaterialTable.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "BrachyMaterial.hh" + +BrachyMaterial::BrachyMaterial() +{;} + +BrachyMaterial::~BrachyMaterial() +{;} + +void BrachyMaterial::DefineMaterials() +{ + // Define required materials + + G4double A; // atomic mass + G4double Z; // atomic number + G4double d; // density + + // General elements + + A = 1.01*g/mole; + G4Element* elH = new G4Element ("Hydrogen","H",Z = 1.,A); + + A = 14.01*g/mole; + G4Element* elN = new G4Element("Nitrogen","N",Z = 7.,A); + + A = 16.00*g/mole; + + G4Element* elO = new G4Element("Oxygen","O",Z = 8.,A); + + A=26.98*g/mole; + G4Element* elAl = new G4Element("Aluminum","Al", Z = 13.,A); + + A = 12.011*g/mole; + G4Element* elC = new G4Element("Carbon","C",Z = 6.,A); + + A = 22.99*g/mole; + G4Element* elNa = new G4Element("Sodium","Na",Z = 11.,A); + + A = 24.305*g/mole; + G4Element* elMg = new G4Element("Magnesium","Mg",Z = 12.,A); + + A = 30.974*g/mole; + G4Element* elP = new G4Element("Phosphorus","P",Z = 15.,A); + + A = 32.06*g/mole; + G4Element* elS = new G4Element("Sulfur","S",Z = 16.,A); + + A = 35.453*g/mole; + G4Element* elCl = new G4Element("Chlorine","Cl",Z = 17.,A); + + A = 39.098*g/mole; + G4Element* elK = new G4Element("Potassium","K",Z = 19.,A); + + A = 40.08*g/mole; + G4Element* elCa = new G4Element("Calcium","Ca",Z = 20.,A); + + A = 65.38*g/mole; + G4Element* elZn = new G4Element("Zinc","Zn",Z = 30.,A); + + A = 54.94*g/mole; + G4Element* elMn = new G4Element("Manganese","Mn",Z = 25.,A); + + A = 28.09*g/mole; + G4Element* elSi = new G4Element("Silicon","Si",Z = 14.,A); + + A = 52.00*g/mole; + G4Element* elCr = new G4Element("Chromium","Cr",Z = 24.,A); + + A = 58.70*g/mole; + G4Element* elNi = new G4Element("Nickel","Ni",Z = 28.,A); + + A = 55.85*g/mole; + G4Element* elFe = new G4Element("Iron","Fe",Z = 26.,A); + + A = 183.84* g/mole; + d = 19.3*g/cm3; + matW = new G4Material("Tungsten",Z = 74.,A,d); + + // Perspex, plexiglass, lucite + d = 1.19*g/cm3; + matplexiglass = new G4Material("Plexiglass",d,3); + matplexiglass -> AddElement(elH,0.08); + matplexiglass -> AddElement(elC,0.60); + matplexiglass -> AddElement(elO,0.32); + + // Lead material + A = 207.19*g/mole; + Z = 82; + d = 11.35*g/cm3; + matPb = new G4Material("Lead",Z,A,d); + + // Iridium (Medical Physics, Vol 25, No 10, Oct 1998) + d = 22.42*g/cm3; + A = 191.96260*g/mole ; + Z = 77; + matir192 = new G4Material("Iridium",Z,A,d); + + //titanium + A = 47.88*g/mole; + d = 4.50*g/cm3; + Titanium = new G4Material("titanium" ,Z = 22.,A,d); + + // Air material + d = 1.290*mg/cm3; + G4Material* matAir = new G4Material("Air",d,2); + matAir -> AddElement(elN,0.7); + matAir -> AddElement(elO,0.3); + + // Water + d = 1.000*g/cm3; + matH2O = new G4Material("Water",d,2); + matH2O -> AddElement(elH,2); + matH2O -> AddElement(elO,1); + matH2O -> GetIonisation() -> SetMeanExcitationEnergy(75.0*eV); + + + //soft tissue(http://www.nist.gov) + d = 1.0*g/cm3; + soft = new G4Material("tissue",d,13); + soft -> AddElement(elH,0.104472); + soft -> AddElement(elC,0.23219); + soft -> AddElement(elN,0.02488); + soft -> AddElement(elO,0.630238); + soft -> AddElement(elNa,0.00113); + soft -> AddElement(elMg,0.00013); + soft -> AddElement(elP,0.00133); + soft -> AddElement(elS,0.00199); + soft -> AddElement(elCl,0.00134); + soft -> AddElement(elK,0.00199); + soft -> AddElement(elCa,0.00023); + soft -> AddElement(elFe,0.00005); + soft -> AddElement(elZn,0.00003); + + // Stainless steel (Medical Physics, Vol 25, No 10, Oct 1998) + d = 8.02*g/cm3 ; + matsteel = new G4Material("Stainless steel",d,5); + matsteel -> AddElement(elMn, 0.02); + matsteel -> AddElement(elSi, 0.01); + matsteel -> AddElement(elCr, 0.19); + matsteel -> AddElement(elNi, 0.10); + matsteel -> AddElement(elFe, 0.68); + + //gold(chimica degli elementi N.N Greenwood,A.Earnshaw) + A = 196.97*g/mole; + d = 19.32*g/cm3; + gold = new G4Material("gold",Z = 79.,A,d); + + //IodiumCore(chimica degli elementi N.N Greenwood,A.Earnshaw) + A = 124.9*g/mole; + d = 4.862*g/cm3; + matI = new G4Material("Iodium",Z = 53.,A,d); + + //ceramic(Medical Physics, May 2000) + d = 2.88*g/cm3; + ceramic = new G4Material("allumina",d,2); + ceramic -> AddElement(elAl,2); + ceramic -> AddElement(elO,3); + + G4double density = universe_mean_density; + G4double pressure = 3.e-18*pascal; + G4double temperature = 2.73*kelvin; + A=1.01*g/mole; + Vacuum = new G4Material("Galactic", Z = 1., A, + density,kStateGas,temperature,pressure); + + //compact bone (http://www.NIST.gov) + d = 1.85*g/cm3; + bone = new G4Material("bone",d,8); + bone -> AddElement(elH,0.063984); + bone -> AddElement(elC,0.278); + bone -> AddElement(elN,0.027); + bone -> AddElement(elO,0.410016); + bone -> AddElement(elMg,0.002); + bone -> AddElement(elP,0.07); + bone -> AddElement(elS,0.002); + bone -> AddElement(elCa,0.147); + + //muscle(http://www.NIST.gov) + muscle = new G4Material("muscle",d,9); + muscle -> AddElement(elH,0.101997); + muscle -> AddElement(elC,0.123); + muscle -> AddElement(elN,0.035); + muscle -> AddElement(elNa,0.0008); + muscle -> AddElement(elO,0.729); + muscle -> AddElement(elMg,0.0002); + muscle -> AddElement(elP,0.002); + muscle -> AddElement(elS,0.005); + muscle -> AddElement(elK,0.003); +} + +G4Material* BrachyMaterial::GetMat(G4String material) +{ + G4Material* pttoMaterial = G4Material::GetMaterial(material); + return pttoMaterial; +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyPhantomHit.cc b/examples/extended/parallel/ExDiane/src/BrachyPhantomHit.cc new file mode 100644 index 0000000000..7b8e8ede9e --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPhantomHit.cc @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli +// +// ******************************** +// * * +// * BrachyPhantomHit.cc * +// * * +// ******************************** +// +// $Id: BrachyPhantomHit.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPhantomHit.hh" +#include "G4ios.hh" +#include "G4VVisManager.hh" +#include "G4Colour.hh" +#include "G4VisAttributes.hh" +#include "G4LogicalVolume.hh" + +G4Allocator BrachyPhantomHitAllocator; + +BrachyPhantomHit::BrachyPhantomHit(G4LogicalVolume* logVol,G4int XID,G4int YID,G4int ZID): logicalVolume(logVol), + xHitPosition(XID), + zHitPosition(ZID), + yHitPosition(YID) +{ + energyDeposit = 0; +} + +BrachyPhantomHit::~BrachyPhantomHit() +{ +} + +BrachyPhantomHit::BrachyPhantomHit(const BrachyPhantomHit &right) + : G4VHit() +{ + xHitPosition = right.xHitPosition; + zHitPosition = right.zHitPosition; + yHitPosition = right.yHitPosition; + energyDeposit = right.energyDeposit; + hitPosition = right.hitPosition; + rotation = right.rotation; + logicalVolume = right.logicalVolume; +} + +const BrachyPhantomHit& BrachyPhantomHit::operator=(const BrachyPhantomHit &right) +{ + xHitPosition = right.xHitPosition; + zHitPosition = right.zHitPosition; + yHitPosition = right.yHitPosition; + energyDeposit = right.energyDeposit; + hitPosition = right.hitPosition; + rotation = right.rotation; + logicalVolume = right.logicalVolume; + return *this; +} + +int BrachyPhantomHit::operator==(const BrachyPhantomHit &right) const +{ + return((xHitPosition==right.xHitPosition)&&(zHitPosition==right.zHitPosition)&&(yHitPosition==right.yHitPosition)); +} + +void BrachyPhantomHit::Draw() +{ +} + +void BrachyPhantomHit::Print() +{ +} diff --git a/examples/extended/parallel/ExDiane/src/BrachyPhantomROGeometry.cc b/examples/extended/parallel/ExDiane/src/BrachyPhantomROGeometry.cc new file mode 100644 index 0000000000..100ac8c1d5 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPhantomROGeometry.cc @@ -0,0 +1,185 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli +// +// ************************************ +// * * +// * BrachyPhantomROGeometry.cc * +// * * +// ************************************ +// +// $Id: BrachyPhantomROGeometry.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPhantomROGeometry.hh" +#include "BrachyDummySD.hh" + +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PVPlacement.hh" +#include "G4PVReplica.hh" +#include "G4SDManager.hh" +#include "G4Box.hh" +#include "G4Tubs.hh" +#include "G4SubtractionSolid.hh" +#include "G4ThreeVector.hh" +#include "G4Material.hh" + +BrachyPhantomROGeometry::BrachyPhantomROGeometry(G4String aString, + G4double phantomDimX, + G4double phantomDimZ, + G4int numberOfVoxelsX, + G4int numberOfVoxelsZ): + G4VReadOutGeometry(aString), + phantomDimensionX(phantomDimX), + phantomDimensionZ(phantomDimZ), + numberOfVoxelsAlongX(numberOfVoxelsX), + numberOfVoxelsAlongZ(numberOfVoxelsZ) +{ +} + +BrachyPhantomROGeometry::~BrachyPhantomROGeometry() +{ +} + +G4VPhysicalVolume* BrachyPhantomROGeometry::Build() +{ + + // A dummy material is used to fill the volumes of the readout geometry. + // (It will be allowed to set a NULL pointer in volumes of such virtual + // division in future, since this material is irrelevant for tracking.) + + G4Material* dummyMat = new G4Material(name="dummyMat", 1., 1.*g/mole, 1.*g/cm3); + + G4double worldDimensionX = 4.0*m; + G4double worldDimensionY = 4.0*m; + G4double worldDimensionZ = 4.0*m; + + G4double halfPhantomDimensionX = phantomDimensionX; + G4double halfPhantomDimensionZ = phantomDimensionZ; + G4double halfPhantomDimensionY = phantomDimensionX; + + // variables for x division ... + G4double halfXVoxelDimensionX = halfPhantomDimensionX/numberOfVoxelsAlongX; + G4double halfXVoxelDimensionZ = halfPhantomDimensionZ; + G4double voxelXThickness = 2*halfXVoxelDimensionX; + + // world volume of ROGeometry ... + G4Box *ROWorld = new G4Box("ROWorld", + worldDimensionX, + worldDimensionY, + worldDimensionZ); + + G4LogicalVolume *ROWorldLog = new G4LogicalVolume(ROWorld, + dummyMat, + "ROWorldLog", + 0,0,0); + + G4VPhysicalVolume *ROWorldPhys = new G4PVPlacement(0, + G4ThreeVector(), + "ROWorldPhys", + ROWorldLog, + 0,false,0); + + // phantom ROGeometry ... + G4Box *ROPhantom = new G4Box("ROPhantom", + halfPhantomDimensionX, + halfPhantomDimensionY, + halfPhantomDimensionZ); + + G4LogicalVolume *ROPhantomLog = new G4LogicalVolume(ROPhantom, + dummyMat, + "ROPhantomLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomPhys = new G4PVPlacement(0, + G4ThreeVector(), + "PhantomPhys", + ROPhantomLog, + ROWorldPhys, + false,0); + + // ROGeomtry: Voxel division + + // X division first... + G4Box *ROPhantomXDivision = new G4Box("ROPhantomXDivision", + halfXVoxelDimensionX, + halfXVoxelDimensionZ, + halfXVoxelDimensionZ); + + G4LogicalVolume *ROPhantomXDivisionLog = new G4LogicalVolume(ROPhantomXDivision, + dummyMat, + "ROPhantomXDivisionLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomXDivisionPhys = new G4PVReplica("ROPhantomXDivisionPhys", + ROPhantomXDivisionLog, + ROPhantomPhys, + kXAxis, + numberOfVoxelsAlongX, + voxelXThickness); + // ...then Z division + + G4Box *ROPhantomZDivision = new G4Box("ROPhantomZDivision", + halfXVoxelDimensionX, + halfXVoxelDimensionZ, + halfXVoxelDimensionX); + + G4LogicalVolume *ROPhantomZDivisionLog = new G4LogicalVolume(ROPhantomZDivision, + dummyMat, + "ROPhantomZDivisionLog", + 0,0,0); + + G4VPhysicalVolume *ROPhantomZDivisionPhys = new G4PVReplica("ROPhantomZDivisionPhys", + ROPhantomZDivisionLog, + ROPhantomXDivisionPhys, + kZAxis, + numberOfVoxelsAlongZ, + voxelXThickness); + // ...then Y division + + G4Box *ROPhantomYDivision = new G4Box("ROPhantomYDivision", + halfXVoxelDimensionX, + halfXVoxelDimensionX, + halfXVoxelDimensionX); + + G4LogicalVolume *ROPhantomYDivisionLog = new G4LogicalVolume(ROPhantomYDivision, + dummyMat, + "ROPhantomYDivisionLog", + 0,0,0); + + ROPhantomYDivisionPhys = new G4PVReplica("ROPhantomYDivisionPhys", + ROPhantomYDivisionLog, + ROPhantomZDivisionPhys, + kYAxis, + numberOfVoxelsAlongZ, + voxelXThickness); + BrachyDummySD *dummySD = new BrachyDummySD; + ROPhantomYDivisionLog -> SetSensitiveDetector(dummySD); + + return ROWorldPhys; +} + + + diff --git a/examples/extended/parallel/ExDiane/src/BrachyPhantomSD.cc b/examples/extended/parallel/ExDiane/src/BrachyPhantomSD.cc new file mode 100644 index 0000000000..78d39c44d1 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPhantomSD.cc @@ -0,0 +1,120 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli +// +// ******************************** +// * * +// * BrachyPhantomSD.cc * +// * * +// ******************************** +// +// $Id: BrachyPhantomSD.cc,v 1.3 2004/05/25 12:39:09 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPhantomSD.hh" +#include "BrachyPhantomHit.hh" +#include "BrachyAnalysisManager.hh" +#include "BrachyDetectorConstruction.hh" +#include "G4Track.hh" +#include "G4LogicalVolume.hh" +#include "G4VPhysicalVolume.hh" +#include "G4Step.hh" +#include "G4VTouchable.hh" +#include "G4TouchableHistory.hh" +#include "G4SDManager.hh" +#include "G4ParticleDefinition.hh" + +BrachyPhantomSD::BrachyPhantomSD(G4String name, G4int NumVoxelX, G4int NumVoxelZ) + :G4VSensitiveDetector(name),numberOfVoxelsX(NumVoxelX), + numberOfVoxelsZ(NumVoxelZ) +{ +} + +BrachyPhantomSD::~BrachyPhantomSD() +{ +} + +void BrachyPhantomSD::Initialize(G4HCofThisEvent*) +{ +} + +G4bool BrachyPhantomSD::ProcessHits(G4Step* aStep, G4TouchableHistory* ROhist) +{ + if(!ROhist) + return false; + + if(aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName() != "PhantomPhys") + return false; + + G4double energyDeposit = aStep -> GetTotalEnergyDeposit(); + if(energyDeposit == 0.) + return false; + + if(energyDeposit != 0) + { +#ifdef G4ANALYSIS_USE + // Read Voxel indexes: i is the x index, k is the z index + G4int k = ROhist -> GetReplicaNumber(1); + G4int i = ROhist -> GetReplicaNumber(2); + G4int j = ROhist -> GetReplicaNumber(); + + G4int numberOfVoxelZ = 300; + G4double voxelWidthZ = 1. *mm; + + G4double x = (- numberOfVoxelZ+1+2*i)*voxelWidthZ/2; + G4double y = (- numberOfVoxelZ+1+2*j)*voxelWidthZ/2; + G4double z = (- numberOfVoxelZ+1+2*k)*voxelWidthZ/2; + + BrachyAnalysisManager* analysis = + BrachyAnalysisManager::getInstance(); + if (y < 0.8*mm && y > -0.8*mm) + { + analysis -> FillHistogramWithEnergy(x,z,energyDeposit/MeV); + + if (z < 0.8*mm && z > -0.8*mm) + analysis -> DoseDistribution(x,energyDeposit/MeV); + } +#endif + } + return true; +} + +void BrachyPhantomSD::EndOfEvent(G4HCofThisEvent*) +{ +} + +void BrachyPhantomSD::clear() +{ +} + +void BrachyPhantomSD::DrawAll() +{ +} + +void BrachyPhantomSD::PrintAll() +{ +} + + + diff --git a/examples/extended/parallel/ExDiane/src/BrachyPhysicsList.cc b/examples/extended/parallel/ExDiane/src/BrachyPhysicsList.cc new file mode 100644 index 0000000000..df9235257b --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPhysicsList.cc @@ -0,0 +1,159 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// Code developed by: S.Guatelli +// +// ********************************** +// * * +// * BrachyPhysicsList.cc * +// * * +// ********************************** +// +// $Id: BrachyPhysicsList.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPhysicsList.hh" + +#include "G4ParticleDefinition.hh" +#include "G4ParticleWithCuts.hh" +#include "G4ProcessManager.hh" +#include "G4ParticleTypes.hh" +#include "G4ParticleTable.hh" +#include "G4Material.hh" +#include "G4UnitsTable.hh" +#include "G4ios.hh" + + +BrachyPhysicsList::BrachyPhysicsList(): G4VUserPhysicsList() +{ + defaultCutValue = 0.1*mm; + cutForGamma = defaultCutValue; + cutForElectron = defaultCutValue; + cutForPositron = defaultCutValue; + + SetVerboseLevel(1); +} + +BrachyPhysicsList::~BrachyPhysicsList() +{ +} + +void BrachyPhysicsList::ConstructParticle() +{ + // In this method, static member functions should be called + // for all particles which you want to use. + // This ensures that objects of these particle types will be + // created in the program. + + ConstructBosons(); + ConstructLeptons(); +} + +void BrachyPhysicsList::ConstructBosons() +{ + // gamma + G4Gamma::GammaDefinition(); + +} + +void BrachyPhysicsList::ConstructLeptons() +{ + // leptons + G4Electron::ElectronDefinition(); + G4Positron::PositronDefinition(); +} + +void BrachyPhysicsList::ConstructProcess() +{ + AddTransportation(); + ConstructEM(); +} + +#include "G4MultipleScattering.hh" +// gamma +#include "G4LowEnergyRayleigh.hh" +#include "G4LowEnergyPhotoElectric.hh" +#include "G4LowEnergyCompton.hh" +#include "G4LowEnergyGammaConversion.hh" +// e- +#include "G4LowEnergyIonisation.hh" +#include "G4LowEnergyBremsstrahlung.hh" +// e+ +#include "G4eIonisation.hh" +#include "G4eBremsstrahlung.hh" +#include "G4eplusAnnihilation.hh" + +void BrachyPhysicsList::ConstructEM() +{ + theParticleIterator -> reset(); + while( (*theParticleIterator)() ){ + G4ParticleDefinition* particle = theParticleIterator -> value(); + G4ProcessManager* pmanager = particle -> GetProcessManager(); + G4String particleName = particle -> GetParticleName(); + + //processes + + if (particleName == "gamma") { + //gamma + lowePhot = new G4LowEnergyPhotoElectric("LowEnPhotoElec"); + pmanager -> AddDiscreteProcess(new G4LowEnergyRayleigh); + pmanager -> AddDiscreteProcess(lowePhot); + pmanager -> AddDiscreteProcess(new G4LowEnergyCompton); + pmanager -> AddDiscreteProcess(new G4LowEnergyGammaConversion); + + } else if (particleName == "e-") { + //electron + loweIon = new G4LowEnergyIonisation("LowEnergyIoni"); + loweBrem = new G4LowEnergyBremsstrahlung("LowEnBrem"); + loweBrem -> SetAngularGenerator("tsai"); + + pmanager -> AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager -> AddProcess(loweIon, -1, 2,2); + pmanager -> AddProcess(loweBrem, -1,-1,3); + + } else if (particleName == "e+") { + //positron + pmanager -> AddProcess(new G4MultipleScattering, -1, 1,1); + pmanager -> AddProcess(new G4eIonisation, -1, 2,2); + pmanager -> AddProcess(new G4eBremsstrahlung, -1,-1,3); + pmanager -> AddProcess(new G4eplusAnnihilation, 0,-1,4); + + } + } +} + +void BrachyPhysicsList::SetCuts() +{ + if (verboseLevel >0){ + G4cout << "BrachyPhysicsList::SetCuts:"; + G4cout << "CutLength : " << G4BestUnit(defaultCutValue,"Length") << G4endl; + } + + SetCutValue(cutForGamma, "gamma"); + SetCutValue(cutForElectron, "e-"); + SetCutValue(cutForPositron, "e+"); + + if (verboseLevel>0) DumpCutValuesTable(); +} + + diff --git a/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorAction.cc b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorAction.cc new file mode 100644 index 0000000000..a568bd7538 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorAction.cc @@ -0,0 +1,58 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: +// S.Guatelli +// +// ******************************************** +// * * +// * BrachyPrimaryGeneratorAction.cc * +// * * +// ******************************************** +// +// $Id: BrachyPrimaryGeneratorAction.cc,v 1.1 2004/05/25 07:32:37 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "globals.hh" +#include "BrachyPrimaryGeneratorAction.hh" +#include "BrachyAnalysisManager.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "G4RunManager.hh" + +BrachyPrimaryGeneratorAction::BrachyPrimaryGeneratorAction() +{;} + +BrachyPrimaryGeneratorAction::~BrachyPrimaryGeneratorAction() +{;} + +void BrachyPrimaryGeneratorAction::GeneratePrimaries(G4Event*) +{;} diff --git a/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionI.cc b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionI.cc new file mode 100644 index 0000000000..0168dc2cce --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionI.cc @@ -0,0 +1,144 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +// ******************************************** +// * * +// * BrachyPrimaryGeneratorActionI.cc * +// * * +// ******************************************** +// +// $Id: BrachyPrimaryGeneratorActionI.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPrimaryGeneratorActionI.hh" + +#ifdef G4ANALYSIS_USE +#include "BrachyAnalysisManager.hh" +#endif + +#include "globals.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "G4RunManager.hh" + +BrachyPrimaryGeneratorActionI::BrachyPrimaryGeneratorActionI() +{ + G4int numberParticles = 1; + + particleGun = new G4ParticleGun(numberParticles); + + // Gamma energy spectrum ... + energySpectrum.push_back(0.783913); + energySpectrum.push_back(0.170416); + energySpectrum.push_back(0.045671); +} + +BrachyPrimaryGeneratorActionI::~BrachyPrimaryGeneratorActionI() +{ + if(particleGun) + delete particleGun; +} + +void BrachyPrimaryGeneratorActionI::GeneratePrimaries(G4Event* anEvent) +{ +#ifdef G4ANALYSIS_USE + BrachyAnalysisManager* analysis = BrachyAnalysisManager::getInstance(); +#endif + + G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); + G4String ParticleName = "gamma"; + G4ParticleDefinition* particle = particleTable -> FindParticle(ParticleName); + + particleGun->SetParticleDefinition(particle); + + // Random generation of gamma source point inside the Iodium core ... + G4double x,y,z; + G4double radiuMax = 0.30*mm; + G4double radiusMin = 0.085*mm; + + do{ + x = (G4UniformRand()-0.5)*(radiuMax)/0.5; + y = (G4UniformRand()-0.5)*(radiuMax)/0.5; + }while(((x*x+y*y )> (radiuMax*radiuMax))||((x*x+y*y)<(radiusMin*radiusMin))); + + z = (G4UniformRand()-0.5)*1.75*mm/0.5 ; + + G4ThreeVector position(x,y,z); + particleGun -> SetParticlePosition(position); + + // Random generation of the impulse direction of primary particles ... + G4double a,b,c; + G4double n; + do{ + a = (G4UniformRand()-0.5)/0.5; + b = (G4UniformRand()-0.5)/0.5; + c = (G4UniformRand()-0.5)/0.5; + n = a*a+b*b+c*c; + }while(n > 1 || n == 0.0); + n = sqrt(n); + a /= n; + b /= n; + c /= n; + + G4ThreeVector direction(a,b,c); + particleGun -> SetParticleMomentumDirection(direction); + + G4double random = G4UniformRand(); + G4double sum = 0; + G4int i = 0; + while(sum SetParticleEnergy(primaryParticleEnergy); + + // Fill 1D histogram with gamma energy spectrum ... +#ifdef G4ANALYSIS_USE + analysis -> PrimaryParticleEnergySpectrum(primaryParticleEnergy); +#endif + + // generate primary particle + particleGun -> GeneratePrimaryVertex(anEvent); +} + +G4double BrachyPrimaryGeneratorActionI::GetEnergy() +{ + return primaryParticleEnergy; +} + diff --git a/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionIr.cc b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionIr.cc new file mode 100644 index 0000000000..96807a013b --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyPrimaryGeneratorActionIr.cc @@ -0,0 +1,115 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli +// +// ******************************************** +// * * +// * BrachyPrimaryGeneratorActionIr.cc * +// * * +// ******************************************** +// +// $Id: BrachyPrimaryGeneratorActionIr.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#include "BrachyPrimaryGeneratorActionIr.hh" + +#ifdef G4ANALYSIS_USE +#include "BrachyAnalysisManager.hh" +#endif + +#include "globals.hh" +#include "G4ParticleTable.hh" +#include "Randomize.hh" +#include "G4Event.hh" +#include "G4ParticleGun.hh" +#include "G4IonTable.hh" +#include "G4UImanager.hh" +#include "G4RunManager.hh" + +BrachyPrimaryGeneratorActionIr::BrachyPrimaryGeneratorActionIr() +{ + G4int NumParticles = 1; + particleGun = new G4ParticleGun(NumParticles); +} + +BrachyPrimaryGeneratorActionIr::~BrachyPrimaryGeneratorActionIr() +{ + if(particleGun) + delete particleGun; +} + +void BrachyPrimaryGeneratorActionIr::GeneratePrimaries(G4Event* anEvent) +{ +#ifdef G4ANALYSIS_USE + BrachyAnalysisManager* analysis = BrachyAnalysisManager::getInstance(); +#endif + + G4ParticleTable* pParticleTable = G4ParticleTable::GetParticleTable(); + G4String ParticleName = "gamma"; + G4ParticleDefinition* pParticle = pParticleTable->FindParticle(ParticleName); + particleGun->SetParticleDefinition(pParticle); + + // Random generation of gamma source point inside the Iodium core + G4double x,y,z; + G4double radius = 0.30*mm; + do{ + x = (G4UniformRand()-0.5)*(radius)/0.5; + y = (G4UniformRand()-0.5)*(radius)/0.5; + }while(x*x+y*y > radius*radius); + + z = (G4UniformRand()-0.5)*1.75*mm/0.5 -1.975*mm ; + + G4ThreeVector position(x,y,z); + particleGun->SetParticlePosition(position); + // Random generation of the impulse direction + G4double a,b,c; + G4double n; + do{ + a = (G4UniformRand()-0.5)/0.5; + b = (G4UniformRand()-0.5)/0.5; + c = (G4UniformRand()-0.5)/0.5; + n = a*a+b*b+c*c; + }while(n > 1 || n == 0.0); + n = sqrt(n); + a /= n; + b /= n; + c /= n; + + G4ThreeVector direction(a,b,c); + particleGun -> SetParticleMomentumDirection(direction); + + primaryParticleEnergy = 356*keV; + particleGun -> SetParticleEnergy(primaryParticleEnergy); + + //1D Histogram of primary particle energy ... +#ifdef G4ANALYSIS_USE + analysis -> PrimaryParticleEnergySpectrum(primaryParticleEnergy); +#endif + particleGun -> GeneratePrimaryVertex(anEvent); +} + diff --git a/examples/extended/parallel/ExDiane/src/BrachyRunAction.cc b/examples/extended/parallel/ExDiane/src/BrachyRunAction.cc new file mode 100644 index 0000000000..66e9e1c233 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyRunAction.cc @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: +// S.Guatelli +// +// +// ******************************* +// * * +// * BrachyRunAction.cc * +// * * +// ******************************* +// +// $Id: BrachyRunAction.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#include "BrachyRunAction.hh" +#include "BrachyEventAction.hh" + +#ifdef G4ANALYSIS_USE +#include "BrachyAnalysisManager.hh" +#endif + +#include "G4Run.hh" +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4ios.hh" +#include "BrachyDetectorConstruction.hh" +#include "BrachyRunMessenger.hh" +#include "G4SDManager.hh" +#include "G4Timer.hh" +#include "BrachyFactoryIr.hh" +#include "BrachyFactoryI.hh" +#include "BrachyFactory.hh" +#include "BrachyRunAction.hh" + +BrachyRunAction::BrachyRunAction() +{ + runMessenger = new BrachyRunMessenger(this); +} + +BrachyRunAction::~BrachyRunAction() +{ + delete runMessenger; +} +void BrachyRunAction::BeginOfRunAction(const G4Run*) +{ +#ifdef G4ANALYSIS_USE + BrachyAnalysisManager* analysis = BrachyAnalysisManager::getInstance(); + analysis -> book(); +#endif + G4RunManager* runManager = G4RunManager::GetRunManager(); + + if(runManager) + { switch(sourceChoice) + { + case 1: + factory = new BrachyFactoryI; + break; + default: + factory = new BrachyFactoryIr; + } + G4VUserPrimaryGeneratorAction* sourcePrimaryParicle = + factory -> CreatePrimaryGeneratorAction(); + + if(sourcePrimaryParicle) runManager -> SetUserAction(sourcePrimaryParicle); + } +} + +void BrachyRunAction::SelectEnergy(G4int choice) +{ + sourceChoice = choice; + if (sourceChoice == 1) factory = new BrachyFactoryI; + else factory = new BrachyFactoryIr; +} + +void BrachyRunAction::EndOfRunAction(const G4Run* aRun) +{ +#ifdef G4ANALYSIS_USE + BrachyAnalysisManager* analysis = BrachyAnalysisManager::getInstance(); +#endif + G4cout << "number of event = " << aRun -> GetNumberOfEvent() << G4endl; + +#ifdef G4ANALYSIS_USE + analysis -> finish(); +#endif + + delete factory; +} + + + + diff --git a/examples/extended/parallel/ExDiane/src/BrachyRunMessenger.cc b/examples/extended/parallel/ExDiane/src/BrachyRunMessenger.cc new file mode 100644 index 0000000000..90a514e41f --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyRunMessenger.cc @@ -0,0 +1,73 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Code developed by: +// S.Guatelli +// +// $Id: BrachyRunMessenger.cc,v 1.2 2004/05/25 08:36:18 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// +// ******************************* +// * * +// * BrachyRunMessenger.cc * +// * * +// ******************************* + +#include "BrachyRunMessenger.hh" +#include "BrachyRunAction.hh" +#include "G4UIdirectory.hh" +#include "G4UIcmdWithAString.hh" + +BrachyRunMessenger::BrachyRunMessenger( BrachyRunAction* pBrachyRun): + runManager(pBrachyRun) +{ + runDir = new G4UIdirectory("/run/"); + runDir -> SetGuidance("Control gamma energy spectrum."); + + primaryParticleEnergySpectrumCmd = + new G4UIcmdWithAString("/run/energy",this); + primaryParticleEnergySpectrumCmd -> SetGuidance("Select the energy of gamma emitted by the source."); + primaryParticleEnergySpectrumCmd -> SetGuidance(" Iodium: Iodium Source "); + primaryParticleEnergySpectrumCmd -> SetGuidance(" Iridium: Iridium Source " ); + primaryParticleEnergySpectrumCmd -> SetParameterName("choice",true); + primaryParticleEnergySpectrumCmd -> SetDefaultValue("Iridium"); + primaryParticleEnergySpectrumCmd -> SetCandidates("Iridium / Iodium"); + primaryParticleEnergySpectrumCmd -> AvailableForStates(G4State_PreInit,G4State_Idle); +} + +BrachyRunMessenger::~BrachyRunMessenger() +{ + delete primaryParticleEnergySpectrumCmd; + delete runDir; +} + +void BrachyRunMessenger::SetNewValue(G4UIcommand* command,G4String newValue) +{ + if(command == primaryParticleEnergySpectrumCmd) + { + if (newValue == "Iodium") runManager -> SelectEnergy(1); + else runManager -> SelectEnergy(0); + } +} + diff --git a/examples/extended/parallel/ExDiane/src/BrachySimulation.cc b/examples/extended/parallel/ExDiane/src/BrachySimulation.cc new file mode 100644 index 0000000000..8f7601789c --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachySimulation.cc @@ -0,0 +1,151 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: BrachySimulation.cc +// GEANT4 tag $Name: geant4-06-02 $ +// +// -------------------------------------------------------------- +// GEANT 4 - Brachytherapy example +// -------------------------------------------------------------- +// +// Code developed by: S.Guatelli, K. Moscicki +// +// +// ******************************* +// * * +// * BrachySimualtion.cc * +// * * +// ******************************* +// +#include "G4RunManager.hh" +#include "G4UImanager.hh" +#include "G4UIterminal.hh" +#include "G4UItcsh.hh" +#include "BrachyFactoryIr.hh" +#ifdef G4UI_USE_XM +#include "G4UIXm.hh" +#endif + +#ifdef G4VIS_USE +#include "BrachyVisManager.hh" +#endif + +#include "BrachyEventAction.hh" +#include "BrachyDetectorConstruction.hh" +#include "BrachyPhysicsList.hh" +#include "BrachyPhantomSD.hh" +#include "BrachyPrimaryGeneratorActionIr.hh" +#include "G4SDManager.hh" +#include "BrachyRunAction.hh" +#include "Randomize.hh" +#include "G4RunManager.hh" +#include "G4SDManager.hh" +#include "G4UImanager.hh" +#include "G4UImessenger.hh" +#include "BrachySimulation.hh" + +BrachySimulation::BrachySimulation(G4int sd) +{ + pRunManager = 0; + seed = sd; +} + +BrachySimulation::~BrachySimulation() + +{ } +void BrachySimulation::setSeed(G4int sd) +{ + seed = sd; + HepRandom ::setTheSeed(seed); +} + +G4bool BrachySimulation::initialize(int ,char** ) +{ + HepRandom::setTheEngine(new RanecuEngine); + + G4cout << "G4 initializing" << G4endl; + + pRunManager = new G4RunManager; + + G4String sensitiveDetectorName = "Phantom"; + + BrachyDetectorConstruction *pDetectorConstruction = new BrachyDetectorConstruction(sensitiveDetectorName); + + pRunManager -> SetUserInitialization(pDetectorConstruction); + pRunManager -> SetUserInitialization(new BrachyPhysicsList); + + // output environment variables: +#ifdef G4ANALYSIS_USE + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " Using AIDA 3.2.1 analysis " << G4endl; +# else + G4cout << G4endl << G4endl << G4endl + << " User Environment " << G4endl + << " G4ANALYSIS_USE environment variable not set, NO ANALYSIS " + << G4endl; +#endif + + BrachyEventAction *pEventAction = new BrachyEventAction(); + pRunManager -> SetUserAction(pEventAction ); + + BrachyRunAction *pRunAction = new BrachyRunAction(); + pRunManager -> SetUserAction(pRunAction); + + //Initialize G4 kernel + pRunManager -> Initialize(); + + return true; +} +void BrachySimulation::executeMacro(std::string macroFileName) +{ + G4UImanager* UI = G4UImanager::GetUIpointer(); + + // Batch mode + + std::string fileName = macroFileName; + G4cout << fileName << " <---------- in batch -----------------" << G4endl; + G4cout << macroFileName << " executed"< ApplyCommand(command+fileName); +} +std::string BrachySimulation::getOutputFilename() +{ + return "brachytherapy.xml"; +} + +void BrachySimulation::finish() +{ + delete pRunManager; +} + +//// This is all the application needs to run in parallel mode through DIANE +extern "C" +DIANE::IG4Simulation* createG4Simulation(int seed) +{return new BrachySimulation(seed); } +/////////// diff --git a/examples/extended/parallel/ExDiane/src/BrachyVisManager.cc b/examples/extended/parallel/ExDiane/src/BrachyVisManager.cc new file mode 100644 index 0000000000..1d4d486672 --- /dev/null +++ b/examples/extended/parallel/ExDiane/src/BrachyVisManager.cc @@ -0,0 +1,151 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// +// ******************************* +// * * +// * BrachyVisManager.cc * +// * * +// ******************************* +// +// $Id: BrachyVisManager.cc,v 1.1 2004/05/25 07:32:37 guatelli Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// + +#ifdef G4VIS_USE + +#include "BrachyVisManager.hh" + +// Supported drivers... + +#ifdef G4VIS_USE_DAWN +#include "G4FukuiRenderer.hh" +#endif + +#ifdef G4VIS_USE_DAWNFILE +#include "G4DAWNFILE.hh" +#endif + +#ifdef G4VIS_USE_OPENGLX +#include "G4OpenGLImmediateX.hh" +#include "G4OpenGLStoredX.hh" +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 +#include "G4OpenGLImmediateWin32.hh" +#include "G4OpenGLStoredWin32.hh" +#endif + +#ifdef G4VIS_USE_OPENGLXM +#include "G4OpenGLImmediateXm.hh" +#include "G4OpenGLStoredXm.hh" +#endif + +#ifdef G4VIS_USE_OIX +#include "G4OpenInventorX.hh" +#endif + +#ifdef G4VIS_USE_OIWIN32 +#include "G4OpenInventorWin32.hh" +#endif + +#ifdef G4VIS_USE_VRML +#include "G4VRML1.hh" +#include "G4VRML2.hh" +#endif + +#ifdef G4VIS_USE_VRMLFILE +#include "G4VRML1File.hh" +#include "G4VRML2File.hh" +#endif + +#ifdef G4VIS_USE_RAYTRACER +#include "G4RayTracer.hh" +#endif + +BrachyVisManager::BrachyVisManager () +{} + +void BrachyVisManager::RegisterGraphicsSystems () +{ +#ifdef G4VIS_USE_DAWN + RegisterGraphicsSystem (new G4FukuiRenderer); +#endif + +#ifdef G4VIS_USE_DAWNFILE + RegisterGraphicsSystem (new G4DAWNFILE); +#endif + +#ifdef G4VIS_USE_OPENGLX + RegisterGraphicsSystem (new G4OpenGLImmediateX); + RegisterGraphicsSystem (new G4OpenGLStoredX); +#endif + +#ifdef G4VIS_USE_OPENGLWIN32 + RegisterGraphicsSystem (new G4OpenGLImmediateWin32); + RegisterGraphicsSystem (new G4OpenGLStoredWin32); +#endif + +#ifdef G4VIS_USE_OPENGLXM + RegisterGraphicsSystem (new G4OpenGLImmediateXm); + RegisterGraphicsSystem (new G4OpenGLStoredXm); +#endif + +#ifdef G4VIS_USE_OIX + RegisterGraphicsSystem (new G4OpenInventorX); +#endif + +#ifdef G4VIS_USE_OIWIN32 + RegisterGraphicsSystem (new G4OpenInventorWin32); +#endif + +#ifdef G4VIS_USE_VRML + RegisterGraphicsSystem (new G4VRML1); + RegisterGraphicsSystem (new G4VRML2); +#endif + +#ifdef G4VIS_USE_VRMLFILE + RegisterGraphicsSystem (new G4VRML1File); + RegisterGraphicsSystem (new G4VRML2File); +#endif + +#ifdef G4VIS_USE_RAYTRACER + RegisterGraphicsSystem (new G4RayTracer); +#endif + + if (fVerbose > 0) { + G4cout << + "\nYou have successfully chosen to use the following graphics systems." + << G4endl; + PrintAvailableGraphicsSystems (); + } + +} +#endif + + + + + + + diff --git a/examples/extended/parallel/ParN02/History b/examples/extended/parallel/ParN02/History index 62bc7131fd..c8a5512dfd 100644 --- a/examples/extended/parallel/ParN02/History +++ b/examples/extended/parallel/ParN02/History @@ -1,4 +1,4 @@ -$Id: History,v 1.4 2003/12/03 14:15:02 gcosmo Exp $ +$Id: History,v 1.5 2004/06/21 09:46:23 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +June 20th, 2004 G.Cooperman +---------------------------- +- Fixed bug in ParRunManager class, showing up with Geant4 6.1. + Dec 2nd, 2003 G.Cosmo ---------------------- - Brought up-to-date classes from exampleN02. diff --git a/examples/extended/parallel/ParN02/src/ParRunManager.cc b/examples/extended/parallel/ParN02/src/ParRunManager.cc index eee506b8d2..5190695e03 100644 --- a/examples/extended/parallel/ParN02/src/ParRunManager.cc +++ b/examples/extended/parallel/ParN02/src/ParRunManager.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: ParRunManager.cc,v 1.5 2003/06/16 16:49:34 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ParRunManager.cc,v 1.6 2004/06/19 20:50:42 cooperma Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------------- // Parallel Library for Geant4 @@ -168,7 +168,8 @@ TOPC_BUF ParRunManager::DoEvent( void *input_buf ) ParMarshaledRandomState buf = ParMarshaledRandomState( input_buf ); buf.unmarshalEventIDandSetState( i_event ); - stateManager->SetNewState(G4State_EventProc); + // removed for Geant4.6 + // stateManager->SetNewState(G4State_EventProc); currentEvent = GenerateEvent(i_event); @@ -184,7 +185,11 @@ TOPC_ACTION ParRunManager::CheckEventResult( void * input_buf, void *output_buf MarshaledObj buf = MarshaledObj(input_buf); buf.Unmarshal(i_event); - stateManager->SetNewState(G4State_EventProc); + // removed for Geant4.6 + //stateManager->SetNewState(G4State_EventProc); + // Geant4.6 requires the state to be G4State_GeomClosed + // before calling EventManager::ProcessOneEvent(..) + if(!userPrimaryGeneratorAction) { G4Exception @@ -201,6 +206,7 @@ TOPC_ACTION ParRunManager::CheckEventResult( void * input_buf, void *output_buf // When Geant4 4.0 sees empty event, it still calls userStackingAction. // On master, only trivial events exist, so we delete userStackingAction SetUserAction( (G4UserStackingAction*)NULL ); + eventManager->ProcessOneEvent(currentEvent); // Processing the trivial event // Called with output_buf and no size, creates object for unmarshaling diff --git a/examples/extended/parallel/ParN04/History b/examples/extended/parallel/ParN04/History index 64e3f30d4e..251ddcdb82 100644 --- a/examples/extended/parallel/ParN04/History +++ b/examples/extended/parallel/ParN04/History @@ -1,4 +1,4 @@ -$Id: History,v 1.3 2003/12/03 14:28:03 gcosmo Exp $ +$Id: History,v 1.4 2004/06/21 09:46:23 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,10 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +June 20th, 2004 G.Cooperman +---------------------------- +- Fixed bug in ParRunManager class, showing up with Geant4 6.1. + December 2nd, 2003 G.Cosmo --------------------------- - Brought classes up-to-date with exampleN04. diff --git a/examples/extended/parallel/ParN04/src/ParRunManager.cc b/examples/extended/parallel/ParN04/src/ParRunManager.cc index d33ea41afe..eb58c466d0 100644 --- a/examples/extended/parallel/ParN04/src/ParRunManager.cc +++ b/examples/extended/parallel/ParN04/src/ParRunManager.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: ParRunManager.cc,v 1.5 2003/06/16 16:49:43 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ParRunManager.cc,v 1.6 2004/06/19 20:51:09 cooperma Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------------- // Parallel Library for Geant4 @@ -70,7 +70,7 @@ G4StateManager* ParRunManager::stateManager; G4int ParRunManager::n_event; G4int ParRunManager::n_select; G4String ParRunManager::msg; -ParRunManager* ParRunManager::myRunManager = 0; +ParRunManager* ParRunManager::myRunManager = NULL; // TOP-C callbacks (static functions) // If this->*(&ParRunManager::GenerateEventInput), created a thunk, @@ -101,7 +101,7 @@ void ParRunManager::DoEventLoop(G4int n_event,const char* macroFile,G4int n_sele { timer->Start(); } G4String msg; - if(macroFile!=0) + if(macroFile!=NULL) { if(n_select<0) n_select = n_event; msg = "/control/execute "; @@ -122,7 +122,7 @@ void ParRunManager::DoEventLoop(G4int n_event,const char* macroFile,G4int n_sele if ( eventManager->GetUserEventAction() ) { origUserEventAction = eventManager->GetUserEventAction(); - SetUserAction( (G4UserEventAction *)0 ); + SetUserAction( (G4UserEventAction *)NULL ); } // Make these variables accessible to TOP-C callback functions @@ -130,7 +130,7 @@ void ParRunManager::DoEventLoop(G4int n_event,const char* macroFile,G4int n_sele // This is where all the parallelism occurs i_event = -1; // ParRunManager::GenerateEventInput() will increment this. - TOPC_master_slave(MyGenerateEventInput, MyDoEvent, MyCheckEventResult, 0); + TOPC_master_slave(MyGenerateEventInput, MyDoEvent, MyCheckEventResult, NULL); if(verboseLevel>0) { @@ -168,7 +168,8 @@ TOPC_BUF ParRunManager::DoEvent( void *input_buf ) ParMarshaledRandomState buf = ParMarshaledRandomState( input_buf ); buf.unmarshalEventIDandSetState( i_event ); - stateManager->SetNewState(G4State_EventProc); + // removed for Geant4.6 + // stateManager->SetNewState(G4State_EventProc); currentEvent = GenerateEvent(i_event); @@ -184,7 +185,11 @@ TOPC_ACTION ParRunManager::CheckEventResult( void * input_buf, void *output_buf MarshaledObj buf = MarshaledObj(input_buf); buf.Unmarshal(i_event); - stateManager->SetNewState(G4State_EventProc); + // removed for Geant4.6 + //stateManager->SetNewState(G4State_EventProc); + // Geant4.6 requires the state to be G4State_GeomClosed + // before calling EventManager::ProcessOneEvent(..) + if(!userPrimaryGeneratorAction) { G4Exception @@ -200,7 +205,8 @@ TOPC_ACTION ParRunManager::CheckEventResult( void * input_buf, void *output_buf // When Geant4 4.0 sees empty event, it still calls userStackingAction. // On master, only trivial events exist, so we delete userStackingAction - SetUserAction( (G4UserStackingAction*)0 ); + SetUserAction( (G4UserStackingAction*)NULL ); + eventManager->ProcessOneEvent(currentEvent); // Processing the trivial event // Called with output_buf and no size, creates object for unmarshaling @@ -217,7 +223,7 @@ TOPC_ACTION ParRunManager::CheckEventResult( void * input_buf, void *output_buf if(i_eventApplyCommand(msg); stateManager->SetNewState(G4State_GeomClosed); StackPreviousEvent(currentEvent); - currentEvent = 0; + currentEvent = NULL; // Move this to GenerateEventInput: // if(runAborted) break; return NO_ACTION; diff --git a/examples/extended/parallel/README b/examples/extended/parallel/README new file mode 100644 index 0000000000..3caa5c5195 --- /dev/null +++ b/examples/extended/parallel/README @@ -0,0 +1,14 @@ + + Examples for event parallelism + ------------------------------ + +This directory includes example applications to demonstrate the usage of +different techniques for achieving event parallelism with Geant4. + +- ParN02 and ParN04 are modified versions of the novice examples N02 and N04 + adapted to be run together with the TOP-C communication layer application + on either a cluster of systems or multi-processor machines. + +- ExDiane is a simplified version of the advanced application "brachytherapy" + showing how to run Geant4 in a parallel mode using DIANE (DIstributed + ANalysis Environment). diff --git a/examples/extended/parallel/README.html b/examples/extended/parallel/info/README.html similarity index 100% rename from examples/extended/parallel/README.html rename to examples/extended/parallel/info/README.html diff --git a/examples/novice/N01/exampleN01.out b/examples/novice/N01/exampleN01.out index 053ed5f02b..aee3077b5b 100644 --- a/examples/novice/N01/exampleN01.out +++ b/examples/novice/N01/exampleN01.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -11,22 +11,22 @@ Index : 0 used in the geometry : Yes recalculation needed : No Material : ArgonGas - Range cuts : gamma 1 mm e- 1 mm e+ 0 fm - Energy thresholds : gamma 990 eV e- 990 eV e+ -1 MeV + Range cuts : gamma 1 mm e- 1 mm e+ 1 mm + Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV Region(s) which use this couple : DefaultRegionForTheWorld Index : 1 used in the geometry : Yes recalculation needed : No Material : Aluminum - Range cuts : gamma 1 mm e- 1 mm e+ 0 fm - Energy thresholds : gamma 6.88731 keV e- 596.68 keV e+ -1 MeV + Range cuts : gamma 1 mm e- 1 mm e+ 1 mm + Energy thresholds : gamma 6.88731 keV e- 596.68 keV e+ 568.011 keV Region(s) which use this couple : DefaultRegionForTheWorld Index : 2 used in the geometry : Yes recalculation needed : No Material : Lead - Range cuts : gamma 1 mm e- 1 mm e+ 0 fm - Energy thresholds : gamma 100.511 keV e- 1.37814 MeV e+ -1 MeV + Range cuts : gamma 1 mm e- 1 mm e+ 1 mm + Energy thresholds : gamma 100.511 keV e- 1.37814 MeV e+ 1.28002 MeV Region(s) which use this couple : DefaultRegionForTheWorld @@ -222,5 +222,5 @@ Terminate current event processing. Run terminated. Run Summary Number of events processed : 3 - User=0.03s Real=0.05s Sys=0.02s + User=0.02s Real=0.05s Sys=0.03s G4 kernel has come to Quit state. diff --git a/examples/novice/N02/History b/examples/novice/N02/History index e039c736ec..6a9eef302a 100644 --- a/examples/novice/N02/History +++ b/examples/novice/N02/History @@ -1,4 +1,4 @@ -$Id: History,v 1.34 2004/03/08 15:14:46 maire Exp $ +$Id: History,v 1.36 2004/04/05 16:21:20 maire Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,12 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +05-04-04 mma (exampleN02-V06-01-00) +- ExN02DetectorConstruction: correct definition of XenonGas + +19-03-04 mma (exampleN02-V06-00-01) +- ExN02PhysicsList: cleanup of include + 08-03-04 mma (exampleN02-V06-00-00) - ExN02RunAction: removed ApplyCommand("/vis/...") statements. diff --git a/examples/novice/N02/exampleN02.out b/examples/novice/N02/exampleN02.out index 2e86ff8e21..d8d016b7dd 100644 --- a/examples/novice/N02/exampleN02.out +++ b/examples/novice/N02/exampleN02.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -33,7 +33,7 @@ The materials defined are : Material: Lead density: 11.350 g/cm3 temperature: 273.15 K pressure: 1.00 atm RadLength: 5.612 mm ---> Element: Lead Z = 82.0 N = 207.2 A = 207.19 g/mole fractionMass: 100.00 % Abundance 100.00 % - Material: XenonGas density: 5.458 mg/cm3 temperature: 632420632.24 K pressure: 0.00 atm RadLength: 15.539 m + Material: XenonGas density: 5.458 mg/cm3 temperature: 293.15 K pressure: 1.00 atm RadLength: 15.539 m ---> Element: XenonGas Z = 54.0 N = 131.3 A = 131.29 g/mole fractionMass: 100.00 % Abundance 100.00 % @@ -90,8 +90,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -100,7 +100,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -118,7 +118,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -159,2205 +159,2069 @@ Index : 2 used in the geometry : Yes recalculation needed : No Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm -2.91 m 200 MeV 0 eV 0 fm 0 fm World initStep - 1 62.8 mum 517 mum -2.86 m 200 MeV 7.67 keV 4.79 cm 4.79 cm World eIoni - 2 -282 mum 713 mum -2.45 m 200 MeV 93 keV 41.2 cm 46 cm World Transportation - 3 -285 mum 708 mum -2.45 m 79.4 MeV 3.01 MeV 370 mum 46 cm Target eBrem - 4 -274 mum 692 mum -2.45 m 65.1 MeV 1.69 MeV 1.32 mm 46.2 cm Target eBrem - 5 -292 mum 692 mum -2.45 m 62.9 MeV 133 keV 117 mum 46.2 cm Target eBrem - 6 -480 mum 782 mum -2.45 m 60.2 MeV 2.34 MeV 1.56 mm 46.3 cm Target eBrem - 7 -639 mum 845 mum -2.45 m 55.7 MeV 788 keV 602 mum 46.4 cm Target eBrem - 8 -653 mum 857 mum -2.45 m 55 MeV 259 keV 211 mum 46.4 cm Target eBrem - 9 -676 mum 868 mum -2.45 m 50.3 MeV 347 keV 264 mum 46.4 cm Target eBrem - 10 -821 mum 963 mum -2.44 m 46.9 MeV 1.25 MeV 810 mum 46.5 cm Target eBrem - 11 -879 mum 1.02 mm -2.44 m 42.7 MeV 351 keV 330 mum 46.6 cm Target eBrem - 12 -1.01 mm 919 mum -2.44 m 22.9 MeV 3.51 MeV 976 mum 46.7 cm Target eBrem - 13 -1.73 mm 1.01 mm -2.44 m 18.4 MeV 2.47 MeV 1.91 mm 46.8 cm Target eBrem - 14 -2.85 mm -291 mum -2.44 m 13.3 MeV 3.23 MeV 1.97 mm 47 cm Target eBrem - 15 -2.85 mm -424 mum -2.44 m 8.07 MeV 417 keV 348 mum 47.1 cm Target eBrem - 16 -4.01 mm -874 mum -2.44 m 5.63 MeV 1.82 MeV 1.71 mm 47.2 cm Target eBrem - 17 -4.16 mm -946 mum -2.44 m 5.05 MeV 148 keV 168 mum 47.3 cm Target eBrem - 18 -4.53 mm -1.74 mm -2.44 m 0 eV 5.05 MeV 3.98 mm 47.7 cm Target eIoni - 19 -4.53 mm -1.74 mm -2.44 m 0 eV 0 eV 0 fm 47.7 cm Target annihil + 1 62.8 mum 517 mum -2.86 m 200 MeV 7.69 keV 4.81 cm 4.81 cm World eIoni + 2 -218 mum 715 mum -2.45 m 200 MeV 92.9 keV 41.2 cm 46 cm World Transportation + 3 -221 mum 711 mum -2.45 m 79.4 MeV 3.01 MeV 370 mum 46 cm Target eBrem + 4 -211 mum 692 mum -2.45 m 65.1 MeV 1.69 MeV 1.32 mm 46.2 cm Target eBrem + 5 -229 mum 694 mum -2.45 m 62.9 MeV 133 keV 117 mum 46.2 cm Target eBrem + 6 -400 mum 795 mum -2.45 m 60.2 MeV 2.34 MeV 1.56 mm 46.3 cm Target eBrem + 7 -548 mum 869 mum -2.45 m 55.7 MeV 788 keV 602 mum 46.4 cm Target eBrem + 8 -562 mum 882 mum -2.45 m 55 MeV 259 keV 211 mum 46.4 cm Target eBrem + 9 -583 mum 895 mum -2.45 m 50.3 MeV 347 keV 264 mum 46.4 cm Target eBrem + 10 -713 mum 998 mum -2.44 m 46.9 MeV 1.25 MeV 810 mum 46.5 cm Target eBrem + 11 -762 mum 1.06 mm -2.44 m 42.7 MeV 351 keV 330 mum 46.6 cm Target eBrem + 12 -896 mum 1 mm -2.44 m 22.9 MeV 3.51 MeV 976 mum 46.7 cm Target eBrem + 13 -1.55 mm 1.13 mm -2.44 m 18.4 MeV 2.47 MeV 1.91 mm 46.8 cm Target eBrem + 14 -2.62 mm 71.8 mum -2.44 m 13.3 MeV 3.23 MeV 1.97 mm 47 cm Target eBrem + 15 -2.62 mm -61 mum -2.44 m 8.07 MeV 417 keV 348 mum 47.1 cm Target eBrem + 16 -3.87 mm -410 mum -2.44 m 5.63 MeV 1.83 MeV 1.71 mm 47.2 cm Target eBrem + 17 -4.03 mm -468 mum -2.44 m 5.05 MeV 148 keV 168 mum 47.3 cm Target eBrem + 18 -4.5 mm -1.21 mm -2.44 m 0 eV 5.05 MeV 3.98 mm 47.7 cm Target eIoni + 19 -4.5 mm -1.21 mm -2.44 m 0 eV 0 eV 0 fm 47.7 cm Target annihil ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 19, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.53 mm -1.74 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.78 mm -2.7 mm -2.44 m 435 keV 0 eV 1.95 mm 1.95 mm Target compt - 2 -5.89 mm -5.07 mm -2.44 m 168 keV 0 eV 2.91 mm 4.86 mm Target compt - 3 -5.94 mm -4.08 mm -2.44 m 0 eV 88 keV 1.02 mm 5.88 mm Target phot + 0 -4.5 mm -1.21 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.76 mm -2.18 mm -2.44 m 435 keV 0 eV 1.95 mm 1.95 mm Target compt + 2 -5.87 mm -4.55 mm -2.44 m 168 keV 0 eV 2.91 mm 4.86 mm Target compt + 3 -5.92 mm -3.55 mm -2.44 m 0 eV 88 keV 1.02 mm 5.88 mm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 22, Parent ID = 19 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.94 mm -4.08 mm -2.44 m 80.4 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.94 mm -4.07 mm -2.44 m 0 eV 80.4 keV 19.4 mum 19.4 mum Target eIoni + 0 -5.92 mm -3.55 mm -2.44 m 80.4 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.92 mm -3.55 mm -2.44 m 0 eV 80.4 keV 19.4 mum 19.4 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 21, Parent ID = 19 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.89 mm -5.07 mm -2.44 m 267 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.89 mm -5.08 mm -2.44 m 0 eV 267 keV 125 mum 125 mum Target eIoni + 0 -5.87 mm -4.55 mm -2.44 m 267 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.87 mm -4.56 mm -2.44 m 0 eV 267 keV 125 mum 125 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 20, Parent ID = 19 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.78 mm -2.7 mm -2.44 m 76 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.78 mm -2.7 mm -2.44 m 0 eV 76 keV 17.7 mum 17.7 mum Target eIoni + 0 -4.76 mm -2.18 mm -2.44 m 76 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.76 mm -2.18 mm -2.44 m 0 eV 76 keV 17.7 mum 17.7 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 18, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.53 mm -1.74 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.29 mm 2.96 mm -2.45 m 0 eV 88 keV 9.51 mm 9.51 mm Target phot + 0 -4.5 mm -1.21 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.27 mm 3.48 mm -2.45 m 0 eV 88 keV 9.51 mm 9.51 mm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 23, Parent ID = 18 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.29 mm 2.96 mm -2.45 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.28 mm 2.96 mm -2.45 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.27 mm 3.48 mm -2.45 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.26 mm 3.48 mm -2.45 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 17, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.16 mm -946 mum -2.44 m 429 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.84 mm -1.67 mm -2.44 m 359 keV 0 eV 997 mum 997 mum Target compt - 2 -1.3 cm -4.51 mm -2.45 m 0 eV 88 keV 1.07 cm 1.17 cm Target phot + 0 -4.03 mm -468 mum -2.44 m 429 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.8 mm -1.09 mm -2.44 m 359 keV 0 eV 997 mum 997 mum Target compt + 2 -1.36 cm -3.08 mm -2.45 m 0 eV 88 keV 1.07 cm 1.17 cm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 25, Parent ID = 17 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.3 cm -4.51 mm -2.45 m 271 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.3 cm -4.51 mm -2.45 m 0 eV 271 keV 129 mum 129 mum Target eIoni + 0 -1.36 cm -3.08 mm -2.45 m 271 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.36 cm -3.08 mm -2.45 m 0 eV 271 keV 129 mum 129 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 24, Parent ID = 17 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.84 mm -1.67 mm -2.44 m 69.9 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.84 mm -1.67 mm -2.44 m 0 eV 69.9 keV 15.5 mum 15.5 mum Target eIoni + 0 -4.8 mm -1.09 mm -2.44 m 69.9 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.8 mm -1.09 mm -2.44 m 0 eV 69.9 keV 15.5 mum 15.5 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 16, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.01 mm -874 mum -2.44 m 618 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.07 mm -2.46 mm -2.44 m 502 keV 0 eV 2.72 mm 2.72 mm Target compt - 2 -9.25 mm -2.45 mm -2.44 m 0 eV 88 keV 3.35 mm 6.07 mm Target phot + 0 -3.87 mm -410 mum -2.44 m 618 keV 0 eV 0 fm 0 fm Target initStep + 1 -6.06 mm -1.78 mm -2.44 m 502 keV 0 eV 2.72 mm 2.72 mm Target compt + 2 -9.21 mm -1.45 mm -2.44 m 0 eV 88 keV 3.35 mm 6.07 mm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 27, Parent ID = 16 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -9.25 mm -2.45 mm -2.44 m 414 keV 0 eV 0 fm 0 fm Target initStep - 1 -9.27 mm -2.45 mm -2.44 m 0 eV 414 keV 234 mum 234 mum Target eIoni + 0 -9.21 mm -1.45 mm -2.44 m 414 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.22 mm -1.46 mm -2.44 m 0 eV 414 keV 234 mum 234 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 26, Parent ID = 16 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.07 mm -2.46 mm -2.44 m 116 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.07 mm -2.46 mm -2.44 m 0 eV 116 keV 35.2 mum 35.2 mum Target eIoni + 0 -6.06 mm -1.78 mm -2.44 m 116 keV 0 eV 0 fm 0 fm Target initStep + 1 -6.06 mm -1.79 mm -2.44 m 0 eV 116 keV 35.2 mum 35.2 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 15, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.85 mm -424 mum -2.44 m 4.84 MeV 0 eV 0 fm 0 fm Target initStep - 1 -4.23 mm -8.48 mm -2.43 m 0 eV 0 eV 1.25 cm 1.25 cm Target conv + 0 -2.62 mm -61 mum -2.44 m 4.84 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.78 mm -7.82 mm -2.43 m 0 eV 0 eV 1.25 cm 1.25 cm Target conv ********************************************************************************************************* * G4Track Information: Particle = e+, Track ID = 29, Parent ID = 15 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.23 mm -8.48 mm -2.43 m 1.08 MeV 0 eV 0 fm 0 fm Target initStep - 1 -4.23 mm -8.55 mm -2.43 m 0 eV 1.08 MeV 800 mum 800 mum Target eIoni - 2 -4.23 mm -8.55 mm -2.43 m 0 eV 0 eV 0 fm 800 mum Target annihil + 0 -4.78 mm -7.82 mm -2.43 m 1.08 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.78 mm -7.89 mm -2.43 m 0 eV 1.08 MeV 801 mum 801 mum Target eIoni + 2 -4.78 mm -7.89 mm -2.43 m 0 eV 0 eV 0 fm 801 mum Target annihil ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 31, Parent ID = 29 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.23 mm -8.55 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.58 mm -8.62 mm -2.43 m 193 keV 0 eV 565 mum 565 mum Target compt - 2 -4.06 mm -8.78 mm -2.43 m 0 eV 88 keV 547 mum 1.11 mm Target phot + 0 -4.78 mm -7.89 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.13 mm -7.96 mm -2.43 m 193 keV 0 eV 565 mum 565 mum Target compt + 2 -4.61 mm -8.11 mm -2.43 m 0 eV 88 keV 547 mum 1.11 mm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 33, Parent ID = 31 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.06 mm -8.78 mm -2.43 m 105 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.06 mm -8.78 mm -2.43 m 0 eV 105 keV 29.8 mum 29.8 mum Target eIoni + 0 -4.61 mm -8.11 mm -2.43 m 105 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.61 mm -8.11 mm -2.43 m 0 eV 105 keV 29.8 mum 29.8 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 32, Parent ID = 31 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.58 mm -8.62 mm -2.43 m 318 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.59 mm -8.62 mm -2.43 m 0 eV 318 keV 162 mum 162 mum Target eIoni + 0 -5.13 mm -7.96 mm -2.43 m 318 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.14 mm -7.96 mm -2.43 m 0 eV 318 keV 162 mum 162 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 30, Parent ID = 29 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.23 mm -8.55 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.63 mm -8.23 mm -2.43 m 0 eV 88 keV 2.58 mm 2.58 mm Target phot + 0 -4.78 mm -7.89 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.18 mm -7.56 mm -2.43 m 0 eV 88 keV 2.58 mm 2.58 mm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 34, Parent ID = 30 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.63 mm -8.23 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.61 mm -8.23 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.18 mm -7.56 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.17 mm -7.56 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 28, Parent ID = 15 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.23 mm -8.48 mm -2.43 m 2.74 MeV 0 eV 0 fm 0 fm Target initStep - 1 -4.27 mm -8.63 mm -2.43 m 0 eV 2.74 MeV 2.15 mm 2.15 mm Target eIoni + 0 -4.78 mm -7.82 mm -2.43 m 2.74 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.84 mm -7.96 mm -2.43 m 0 eV 2.74 MeV 2.15 mm 2.15 mm Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 14, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.85 mm -291 mum -2.44 m 1.88 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.83 mm -8.14 mm -2.42 m 289 keV 0 eV 1.9 cm 1.9 cm Target compt - 2 -5.11 mm -2.35 mm -2.42 m 0 eV 88 keV 6.71 mm 2.57 cm Target phot + 0 -2.62 mm 71.8 mum -2.44 m 1.88 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.48 mm -7.69 mm -2.42 m 289 keV 0 eV 1.9 cm 1.9 cm Target compt + 2 -5.09 mm -1.57 mm -2.42 m 0 eV 88 keV 6.71 mm 2.57 cm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 36, Parent ID = 14 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.11 mm -2.35 mm -2.42 m 201 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.1 mm -2.35 mm -2.42 m 0 eV 201 keV 82.4 mum 82.4 mum Target eIoni + 0 -5.09 mm -1.57 mm -2.42 m 201 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.09 mm -1.58 mm -2.42 m 0 eV 201 keV 82.4 mum 82.4 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 35, Parent ID = 14 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.83 mm -8.14 mm -2.42 m 1.59 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.83 mm -8.17 mm -2.42 m 1.02 MeV 31.7 keV 36.1 mum 36.1 mum Target eBrem - 2 -1.7 mm -8.08 mm -2.42 m 232 keV 449 keV 345 mum 381 mum Target eBrem - 3 -1.71 mm -8.08 mm -2.42 m 0 eV 232 keV 102 mum 483 mum Target eIoni + 0 -2.48 mm -7.69 mm -2.42 m 1.59 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.47 mm -7.71 mm -2.42 m 1.02 MeV 31.7 keV 36.1 mum 36.1 mum Target eBrem + 2 -2.56 mm -7.65 mm -2.42 m 210 keV 450 keV 345 mum 381 mum Target eBrem + 3 -2.57 mm -7.65 mm -2.42 m 0 eV 210 keV 88.1 mum 469 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 38, Parent ID = 35 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.7 mm -8.08 mm -2.42 m 336 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.83 mm -7.88 mm -2.43 m 0 eV 88 keV 1.82 mm 1.82 mm Target phot + 0 -2.56 mm -7.65 mm -2.42 m 357 keV 0 eV 0 fm 0 fm Target initStep + 1 -2 cm -1.36 cm -2.43 m 171 keV 0 eV 1.89 cm 1.89 cm Target compt + 2 -1.99 cm -1.36 cm -2.43 m 0 eV 88 keV 156 mum 1.91 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 40, Parent ID = 38 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.99 cm -1.36 cm -2.43 m 82.8 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.99 cm -1.36 cm -2.43 m 0 eV 82.8 keV 20.4 mum 20.4 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 39, Parent ID = 38 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.83 mm -7.88 mm -2.43 m 248 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.83 mm -7.88 mm -2.43 m 0 eV 248 keV 113 mum 113 mum Target eIoni + 0 -2 cm -1.36 cm -2.43 m 186 keV 0 eV 0 fm 0 fm Target initStep + 1 -2 cm -1.36 cm -2.43 m 0 eV 186 keV 73.6 mum 73.6 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 37, Parent ID = 35 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.83 mm -8.17 mm -2.42 m 539 keV 0 eV 0 fm 0 fm Target initStep - 1 7.35 mm 2.03 mm -2.42 m 0 eV 88 keV 1.58 cm 1.58 cm Target phot + 0 -2.47 mm -7.71 mm -2.42 m 539 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.97 mm -7.26 mm -2.42 m 237 keV 0 eV 773 mum 773 mum Target compt + 2 -1.57 mm -8.3 mm -2.42 m 0 eV 88 keV 1.14 mm 1.91 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 40, Parent ID = 37 +* G4Track Information: Particle = e-, Track ID = 42, Parent ID = 37 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.35 mm 2.03 mm -2.42 m 451 keV 0 eV 0 fm 0 fm Target initStep - 1 7.36 mm 2.03 mm -2.42 m 0 eV 451 keV 263 mum 263 mum Target eIoni + 0 -1.57 mm -8.3 mm -2.42 m 149 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.57 mm -8.3 mm -2.42 m 0 eV 149 keV 52.2 mum 52.2 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 41, Parent ID = 37 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.97 mm -7.26 mm -2.42 m 302 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.97 mm -7.25 mm -2.42 m 0 eV 302 keV 150 mum 150 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 13, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.73 mm 1.01 mm -2.44 m 1.99 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.75 mm -857 mum -2.44 m 1.45 MeV 0 eV 3.92 mm 3.92 mm Target compt - 2 -2.76 mm -3.48 mm -2.44 m 897 keV 0 eV 3.42 mm 7.34 mm Target compt - 3 -963 mum -5.69 mm -2.43 m 769 keV 0 eV 1.02 cm 1.75 cm Target compt - 4 9.37 mm -5.38 mm -2.41 m 200 keV 0 eV 1.96 cm 3.71 cm Target compt - 5 9.33 mm -5.39 mm -2.41 m 0 eV 88 keV 512 mum 3.76 cm Target phot + 0 -1.55 mm 1.13 mm -2.44 m 1.99 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.04 mm -2.45 mm -2.43 m 1.08 MeV 0 eV 8.2 mm 8.2 mm Target compt + 2 -1.84 cm -1.82 cm -2.43 m 835 keV 0 eV 2.27 cm 3.08 cm Target compt + 3 -1.97 cm -2.09 cm -2.43 m 220 keV 0 eV 3.08 mm 3.39 cm Target compt + 4 -1.97 cm -1.98 cm -2.43 m 0 eV 88 keV 1.7 mm 3.56 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 13 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.97 cm -1.98 cm -2.43 m 132 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.97 cm -1.98 cm -2.43 m 0 eV 132 keV 42.8 mum 42.8 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 45, Parent ID = 13 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 9.33 mm -5.39 mm -2.41 m 112 keV 0 eV 0 fm 0 fm Target initStep - 1 9.33 mm -5.39 mm -2.41 m 0 eV 112 keV 33.3 mum 33.3 mum Target eIoni + 0 -1.97 cm -2.09 cm -2.43 m 615 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.98 cm -2.1 cm -2.43 m 0 eV 615 keV 396 mum 396 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 44, Parent ID = 13 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 9.37 mm -5.38 mm -2.41 m 569 keV 0 eV 0 fm 0 fm Target initStep - 1 9.38 mm -5.38 mm -2.41 m 0 eV 569 keV 358 mum 358 mum Target eIoni + 0 -1.84 cm -1.82 cm -2.43 m 249 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.84 cm -1.82 cm -2.43 m 0 eV 249 keV 113 mum 113 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 43, Parent ID = 13 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -963 mum -5.69 mm -2.43 m 128 keV 0 eV 0 fm 0 fm Target initStep - 1 -965 mum -5.69 mm -2.43 m 0 eV 128 keV 41 mum 41 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 42, Parent ID = 13 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.76 mm -3.48 mm -2.44 m 556 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.77 mm -3.5 mm -2.44 m 0 eV 556 keV 348 mum 348 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 41, Parent ID = 13 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.75 mm -857 mum -2.44 m 539 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.77 mm -853 mum -2.44 m 0 eV 539 keV 333 mum 333 mum Target eIoni + 0 -4.04 mm -2.45 mm -2.43 m 908 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.74 mm -2.37 mm -2.43 m 286 keV 622 keV 570 mum 570 mum Target eBrem + 2 -3.73 mm -2.37 mm -2.43 m 0 eV 286 keV 139 mum 709 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 12, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.01 mm 919 mum -2.44 m 16.3 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.15 mm 529 mum -2.44 m 0 eV 0 eV 1.84 mm 1.84 mm Target conv + 0 -896 mum 1 mm -2.44 m 16.3 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3 mm -3.31 mm -2.42 m 0 eV 0 eV 2.16 cm 2.16 cm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 47, Parent ID = 12 +* G4Track Information: Particle = e+, Track ID = 48, Parent ID = 12 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.15 mm 529 mum -2.44 m 5.05 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.99 mm -64.3 mum -2.44 m 3.28 MeV 1.44 MeV 1.41 mm 1.41 mm Target eBrem - 2 -1.59 mm -131 mum -2.44 m 0 eV 3.28 MeV 2.62 mm 4.03 mm Target eIoni - 3 -1.59 mm -131 mum -2.44 m 0 eV 0 eV 0 fm 4.03 mm Target annihil + 0 -3 mm -3.31 mm -2.42 m 8.15 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.88 mm -4.07 mm -2.42 m 3.53 MeV 4.22 MeV 3.42 mm 3.42 mm Target eBrem + 2 -4.09 mm -4.2 mm -2.42 m 2.82 MeV 353 keV 420 mum 3.84 mm Target eBrem + 3 -3.79 mm -4.57 mm -2.42 m 2.02 MeV 799 keV 894 mum 4.73 mm Target eBrem + 4 -3.57 mm -4.6 mm -2.42 m 0 eV 2.02 MeV 1.6 mm 6.33 mm Target eIoni + 5 -3.57 mm -4.6 mm -2.42 m 0 eV 0 eV 0 fm 6.33 mm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 50, Parent ID = 47 +* G4Track Information: Particle = gamma, Track ID = 52, Parent ID = 48 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.59 mm -131 mum -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 1.12 mm 2.69 mm -2.44 m 0 eV 88 keV 3.96 mm 3.96 mm Target phot + 0 -3.57 mm -4.6 mm -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.71 mm -3.68 mm -2.42 m 0 eV 88 keV 3.84 mm 3.84 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 50 +* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 52 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.12 mm 2.69 mm -2.44 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 1.14 mm 2.69 mm -2.44 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.71 mm -3.68 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.71 mm -3.67 mm -2.42 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 49, Parent ID = 47 +* G4Track Information: Particle = gamma, Track ID = 51, Parent ID = 48 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.59 mm -131 mum -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.51 mm -5.25 mm -2.44 m 0 eV 88 keV 7.18 mm 7.18 mm Target phot + 0 -3.57 mm -4.6 mm -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.28 mm -6.48 mm -2.43 m 0 eV 88 keV 7.8 mm 7.8 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 52, Parent ID = 49 +* G4Track Information: Particle = e-, Track ID = 54, Parent ID = 51 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.51 mm -5.25 mm -2.44 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.51 mm -5.26 mm -2.44 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.28 mm -6.48 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.28 mm -6.49 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 48, Parent ID = 47 +* G4Track Information: Particle = gamma, Track ID = 50, Parent ID = 48 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.99 mm -64.3 mum -2.44 m 328 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.49 mm -34.9 mum -2.44 m 0 eV 88 keV 546 mum 546 mum Target phot + 0 -4.09 mm -4.2 mm -2.42 m 355 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.47 mm -3.63 mm -2.42 m 0 eV 88 keV 1.1 mm 1.1 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 53, Parent ID = 48 +* G4Track Information: Particle = e-, Track ID = 55, Parent ID = 50 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.49 mm -34.9 mum -2.44 m 240 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.49 mm -35.7 mum -2.44 m 0 eV 240 keV 108 mum 108 mum Target eIoni + 0 -3.47 mm -3.63 mm -2.42 m 267 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.47 mm -3.62 mm -2.42 m 0 eV 267 keV 126 mum 126 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 12 +* G4Track Information: Particle = gamma, Track ID = 49, Parent ID = 48 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.15 mm 529 mum -2.44 m 10.2 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.21 mm 451 mum -2.44 m 9.65 MeV 225 keV 218 mum 218 mum Target eBrem - 2 -1.36 mm 402 mum -2.44 m 8.88 MeV 306 keV 307 mum 524 mum Target eBrem - 3 -1.64 mm 127 mum -2.44 m 3.76 MeV 498 keV 474 mum 998 mum Target eBrem - 4 -1.46 mm -142 mum -2.44 m 2.28 MeV 545 keV 585 mum 1.58 mm Target eBrem - 5 -1.51 mm -332 mum -2.44 m 0 eV 2.28 MeV 1.79 mm 3.37 mm Target eIoni + 0 -3.88 mm -4.07 mm -2.42 m 403 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.9 mm -3.93 mm -2.42 m 320 keV 0 eV 2.04 mm 2.04 mm Target compt + 2 -2.01 mm -4.66 mm -2.42 m 252 keV 0 eV 2.83 mm 4.88 mm Target compt + 3 -1.34 mm -3.9 mm -2.43 m 0 eV 88 keV 1.17 mm 6.05 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 57, Parent ID = 46 +* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 49 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.46 mm -142 mum -2.44 m 930 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.08 mm -6.84 mm -2.44 m 518 keV 0 eV 7.2 mm 7.2 mm Target compt - 2 -4.09 mm -6.86 mm -2.44 m 0 eV 88 keV 27.9 mum 7.23 mm Target phot + 0 -1.34 mm -3.9 mm -2.43 m 164 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.33 mm -3.9 mm -2.43 m 0 eV 164 keV 60.1 mum 60.1 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 59, Parent ID = 57 +* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 49 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.09 mm -6.86 mm -2.44 m 430 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.1 mm -6.87 mm -2.44 m 0 eV 430 keV 247 mum 247 mum Target eIoni + 0 -2.01 mm -4.66 mm -2.42 m 68.8 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.01 mm -4.66 mm -2.42 m 0 eV 68.8 keV 15.2 mum 15.2 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 58, Parent ID = 57 +* G4Track Information: Particle = e-, Track ID = 56, Parent ID = 49 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.08 mm -6.84 mm -2.44 m 412 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.09 mm -6.86 mm -2.44 m 0 eV 412 keV 232 mum 232 mum Target eIoni + 0 -3.9 mm -3.93 mm -2.42 m 82.3 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.9 mm -3.93 mm -2.42 m 0 eV 82.3 keV 20.2 mum 20.2 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 56, Parent ID = 46 +* G4Track Information: Particle = e-, Track ID = 47, Parent ID = 12 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.64 mm 127 mum -2.44 m 4.62 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.89 mm -247 mum -2.44 m 521 keV 0 eV 559 mum 559 mum Target compt - 2 -925 mum -7.44 mm -2.45 m 0 eV 88 keV 9.03 mm 9.59 mm Target phot + 0 -3 mm -3.31 mm -2.42 m 7.07 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.05 mm -3.33 mm -2.42 m 4.75 MeV 356 keV 275 mum 275 mum Target eBrem + 2 -3.58 mm -431 mum -2.42 m 1.02 MeV 3.44 MeV 3.17 mm 3.44 mm Target eBrem + 3 -3.59 mm -429 mum -2.42 m 0 eV 1.02 MeV 735 mum 4.18 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 56 +* G4Track Information: Particle = gamma, Track ID = 60, Parent ID = 47 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -925 mum -7.44 mm -2.45 m 433 keV 0 eV 0 fm 0 fm Target initStep - 1 -924 mum -7.46 mm -2.45 m 0 eV 433 keV 249 mum 249 mum Target eIoni + 0 -3.58 mm -431 mum -2.42 m 298 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.94 mm 106 mum -2.42 m 0 eV 88 keV 2.52 mm 2.52 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 60, Parent ID = 56 +* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 60 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.89 mm -247 mum -2.44 m 4.1 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.86 mm -290 mum -2.44 m 1.81 MeV 1.43 MeV 1.25 mm 1.25 mm Target eBrem - 2 -2.82 mm -411 mum -2.44 m 0 eV 1.81 MeV 1.4 mm 2.65 mm Target eIoni + 0 -1.94 mm 106 mum -2.42 m 210 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.93 mm 103 mum -2.42 m 0 eV 210 keV 88.1 mum 88.1 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 62, Parent ID = 60 +* G4Track Information: Particle = gamma, Track ID = 59, Parent ID = 47 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.86 mm -290 mum -2.44 m 859 keV 0 eV 0 fm 0 fm Target initStep - 1 4.08 mm -2.5 cm -2.43 m 859 keV 0 eV 2.71 cm 2.71 cm Target Transportation - 2 3.01 cm -11.8 cm -2.4 m 859 keV 0 eV 10.2 cm 12.9 cm World Transportation - 3 67.1 cm -2.4 m -1.61 m 859 keV 0 eV 2.5 m 2.63 m Tracker Transportation - 4 81.4 cm -2.91 m -1.43 m 859 keV 0 eV 55.9 cm 3.19 m OutOfWorld Transportation + 0 -3.05 mm -3.33 mm -2.42 m 1.97 MeV 0 eV 0 fm 0 fm Target initStep + 1 -8.95 mm 208 mum -2.41 m 312 keV 0 eV 1.28 cm 1.28 cm Target compt + 2 -9.82 mm 1.31 mm -2.41 m 0 eV 88 keV 2.36 mm 1.51 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 55, Parent ID = 46 +* G4Track Information: Particle = e-, Track ID = 63, Parent ID = 59 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.36 mm 402 mum -2.44 m 469 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.64 mm -3.36 mm -2.43 m 171 keV 0 eV 9.27 mm 9.27 mm Target compt - 2 -5.36 mm -2.7 mm -2.43 m 0 eV 88 keV 862 mum 1.01 cm Target phot + 0 -9.82 mm 1.31 mm -2.41 m 224 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.82 mm 1.32 mm -2.41 m 0 eV 224 keV 97.1 mum 97.1 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 55 +* G4Track Information: Particle = e-, Track ID = 62, Parent ID = 59 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.36 mm -2.7 mm -2.43 m 83.1 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.36 mm -2.7 mm -2.43 m 0 eV 83.1 keV 20.5 mum 20.5 mum Target eIoni + 0 -8.95 mm 208 mum -2.41 m 1.66 MeV 0 eV 0 fm 0 fm Target initStep + 1 -8.88 mm 149 mum -2.41 m 740 keV 422 keV 251 mum 251 mum Target eBrem + 2 -8.91 mm 144 mum -2.41 m 0 eV 740 keV 500 mum 751 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 63, Parent ID = 55 +* G4Track Information: Particle = gamma, Track ID = 64, Parent ID = 62 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.64 mm -3.36 mm -2.43 m 298 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.65 mm -3.37 mm -2.43 m 0 eV 298 keV 148 mum 148 mum Target eIoni + 0 -8.88 mm 149 mum -2.41 m 495 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.65 cm 1.51 mm -2.41 m 0 eV 88 keV 8.11 mm 8.11 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 54, Parent ID = 46 +* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 64 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.21 mm 451 mum -2.44 m 300 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.88 mm -1.29 mm -2.44 m 0 eV 88 keV 4.98 mm 4.98 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 54 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.88 mm -1.29 mm -2.44 m 212 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.88 mm -1.29 mm -2.44 m 0 eV 212 keV 89.3 mum 89.3 mum Target eIoni + 0 -1.65 cm 1.51 mm -2.41 m 407 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.66 cm 1.52 mm -2.41 m 0 eV 407 keV 228 mum 228 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 11, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -879 mum 1.02 mm -2.44 m 3.89 MeV 0 eV 0 fm 0 fm Target initStep - 1 -5.59 mm 2.06 mm -2.41 m 0 eV 0 eV 3.03 cm 3.03 cm Target conv - -********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 67, Parent ID = 11 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.59 mm 2.06 mm -2.41 m 889 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.56 mm 2.02 mm -2.41 m 0 eV 889 keV 634 mum 634 mum Target eIoni - 2 -5.56 mm 2.02 mm -2.41 m 0 eV 0 eV 0 fm 634 mum Target annihil - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 69, Parent ID = 67 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.56 mm 2.02 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.25 mm 2.12 mm -2.42 m 484 keV 0 eV 802 mum 802 mum Target compt - 2 -4.03 mm 4.02 mm -2.42 m 238 keV 0 eV 4.37 mm 5.18 mm Target compt - 3 -3.93 mm 3.77 mm -2.42 m 0 eV 88 keV 281 mum 5.46 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 72, Parent ID = 69 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.93 mm 3.77 mm -2.42 m 150 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.93 mm 3.77 mm -2.42 m 0 eV 150 keV 52.7 mum 52.7 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 71, Parent ID = 69 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.03 mm 4.02 mm -2.42 m 246 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.02 mm 4.03 mm -2.42 m 0 eV 246 keV 111 mum 111 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 70, Parent ID = 69 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.25 mm 2.12 mm -2.42 m 26.9 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.25 mm 2.12 mm -2.42 m 0 eV 26.9 keV 3.28 mum 3.28 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 68, Parent ID = 67 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.56 mm 2.02 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.6 mm 1.69 mm -2.41 m 186 keV 0 eV 2.75 mm 2.75 mm Target compt - 2 -6.63 mm 1.65 mm -2.41 m 0 eV 88 keV 142 mum 2.9 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 68 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.63 mm 1.65 mm -2.41 m 97.7 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.63 mm 1.65 mm -2.41 m 0 eV 97.7 keV 26.6 mum 26.6 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 68 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.6 mm 1.69 mm -2.41 m 325 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.6 mm 1.69 mm -2.41 m 0 eV 325 keV 167 mum 167 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 11 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.59 mm 2.06 mm -2.41 m 1.98 MeV 0 eV 0 fm 0 fm Target initStep - 1 -5.66 mm 2.11 mm -2.41 m 0 eV 1.98 MeV 1.54 mm 1.54 mm Target eIoni + 0 -762 mum 1.06 mm -2.44 m 3.89 MeV 0 eV 0 fm 0 fm Target initStep + 1 -7.35 mm 3.37 mm -2.4 m 3.89 MeV 0 eV 4.5 cm 4.5 cm Target Transportation + 2 -12.6 cm 4.48 cm -1.6 m 3.89 MeV 0 eV 81 cm 85.5 cm Tracker Transportation + 3 -15.5 cm 5.52 cm -1.4 m 3.89 MeV 0 eV 20.2 cm 1.06 m Chamber Transportation + 4 -24.4 cm 8.63 cm -80 cm 3.89 MeV 0 eV 60.7 cm 1.66 m Tracker Transportation + 5 -27.4 cm 9.66 cm -60 cm 3.89 MeV 0 eV 20.2 cm 1.87 m Chamber Transportation + 6 -36.2 cm 12.8 cm 0 fm 3.89 MeV 0 eV 60.7 cm 2.47 m Tracker Transportation + 7 -39.2 cm 13.8 cm 20 cm 3.89 MeV 0 eV 20.2 cm 2.68 m Chamber Transportation + 8 -48.1 cm 16.9 cm 80 cm 3.89 MeV 0 eV 60.7 cm 3.28 m Tracker Transportation + 9 -51 cm 18 cm 1 m 3.89 MeV 0 eV 20.2 cm 3.49 m Chamber Transportation + 10 -59.9 cm 21.1 cm 1.6 m 3.89 MeV 0 eV 60.7 cm 4.09 m Tracker Transportation + 11 -62.9 cm 22.1 cm 1.8 m 3.89 MeV 0 eV 20.2 cm 4.3 m Chamber Transportation + 12 -71.8 cm 25.2 cm 2.4 m 3.89 MeV 0 eV 60.7 cm 4.9 m Tracker Transportation + 13 -79.3 cm 27.8 cm 2.91 m 3.89 MeV 0 eV 51.6 cm 5.42 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 10, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -821 mum 963 mum -2.44 m 2.12 MeV 0 eV 0 fm 0 fm Target initStep - 1 -7.49 mm 5.22 mm -2.4 m 2.12 MeV 0 eV 4.55 cm 4.55 cm Target Transportation - 2 -12.7 cm 8.12 cm -1.6 m 2.12 MeV 0 eV 81.2 cm 85.8 cm Tracker Transportation - 3 -15.6 cm 10 cm -1.4 m 2.12 MeV 0 eV 20.3 cm 1.06 m Chamber Transportation - 4 -24.6 cm 15.7 cm -80 cm 2.12 MeV 0 eV 60.9 cm 1.67 m Tracker Transportation - 5 -27.5 cm 17.6 cm -60 cm 2.12 MeV 0 eV 20.3 cm 1.87 m Chamber Transportation - 6 -36.5 cm 23.3 cm 0 fm 2.12 MeV 0 eV 60.9 cm 2.48 m Tracker Transportation - 7 -39.4 cm 25.2 cm 20 cm 2.12 MeV 0 eV 20.3 cm 2.69 m Chamber Transportation - 8 -48.4 cm 30.9 cm 80 cm 2.12 MeV 0 eV 60.9 cm 3.29 m Tracker Transportation - 9 -51.3 cm 32.8 cm 1 m 2.12 MeV 0 eV 20.3 cm 3.5 m Chamber Transportation - 10 -60.3 cm 38.5 cm 1.6 m 2.12 MeV 0 eV 60.9 cm 4.11 m Tracker Transportation - 11 -63.2 cm 40.4 cm 1.8 m 2.12 MeV 0 eV 20.3 cm 4.31 m Chamber Transportation - 12 -72.2 cm 46.1 cm 2.4 m 2.12 MeV 0 eV 60.9 cm 4.92 m Tracker Transportation - 13 -79.8 cm 51 cm 2.91 m 2.12 MeV 0 eV 51.8 cm 5.44 m OutOfWorld Transportation + 0 -713 mum 998 mum -2.44 m 2.12 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.5 mm 1.62 mm -2.44 m 0 eV 88 keV 5.97 mm 5.97 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 66, Parent ID = 10 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.5 mm 1.62 mm -2.44 m 2.03 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.51 mm 1.39 mm -2.44 m 1.03 MeV 652 keV 372 mum 372 mum Target eBrem + 2 -1.51 mm 1.44 mm -2.44 m 0 eV 1.03 MeV 747 mum 1.12 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 67, Parent ID = 66 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.51 mm 1.39 mm -2.44 m 346 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.51 mm 2.54 mm -2.44 m 0 eV 88 keV 1.41 mm 1.41 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 68, Parent ID = 67 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.51 mm 2.54 mm -2.44 m 258 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.52 mm 2.55 mm -2.44 m 0 eV 258 keV 120 mum 120 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 9, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -676 mum 868 mum -2.45 m 4.34 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.57 mm 1.03 mm -2.44 m 0 eV 0 eV 6.43 mm 6.43 mm Target conv + 0 -583 mum 895 mum -2.45 m 4.34 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.99 mm 1.57 mm -2.43 m 0 eV 0 eV 1.84 cm 1.84 cm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 76, Parent ID = 9 +* G4Track Information: Particle = e+, Track ID = 70, Parent ID = 9 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.57 mm 1.03 mm -2.44 m 1.78 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.4 mm 1.56 mm -2.44 m 569 keV 1.21 MeV 1.1 mm 1.1 mm Target eBrem - 2 -2.38 mm 1.53 mm -2.44 m 0 eV 569 keV 359 mum 1.46 mm Target eIoni - 3 -2.38 mm 1.53 mm -2.44 m 0 eV 0 eV 0 fm 1.46 mm Target annihil + 0 -2.99 mm 1.57 mm -2.43 m 1.02 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.98 mm 1.59 mm -2.43 m 0 eV 1.02 MeV 751 mum 751 mum Target eIoni + 2 -2.98 mm 1.59 mm -2.43 m 0 eV 0 eV 0 fm 751 mum Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 78, Parent ID = 76 +* G4Track Information: Particle = gamma, Track ID = 72, Parent ID = 70 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.38 mm 1.53 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 938 nm 4.92 mm -2.44 m 0 eV 88 keV 4.59 mm 4.59 mm Target phot + 0 -2.98 mm 1.59 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -647 mum 207 mum -2.43 m 389 keV 0 eV 4.33 mm 4.33 mm Target compt + 2 -486 mum 313 mum -2.43 m 0 eV 88 keV 240 mum 4.57 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 79, Parent ID = 78 +* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 72 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 938 nm 4.92 mm -2.44 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 4.65 mum 4.93 mm -2.44 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -486 mum 313 mum -2.43 m 301 keV 0 eV 0 fm 0 fm Target initStep + 1 -481 mum 316 mum -2.43 m 0 eV 301 keV 150 mum 150 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 77, Parent ID = 76 +* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 72 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.38 mm 1.53 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.98 mm -2.14 mm -2.44 m 364 keV 0 eV 4.99 mm 4.99 mm Target compt - 2 -5.82 mm -3.12 mm -2.44 m 0 eV 88 keV 1.45 mm 6.44 mm Target phot + 0 -647 mum 207 mum -2.43 m 122 keV 0 eV 0 fm 0 fm Target initStep + 1 -646 mum 205 mum -2.43 m 0 eV 122 keV 37.9 mum 37.9 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 81, Parent ID = 77 +* G4Track Information: Particle = gamma, Track ID = 71, Parent ID = 70 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.82 mm -3.12 mm -2.44 m 276 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.83 mm -3.11 mm -2.44 m 0 eV 276 keV 132 mum 132 mum Target eIoni + 0 -2.98 mm 1.59 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.11 mm 1.66 mm -2.43 m 211 keV 0 eV 228 mum 228 mum Target compt + 2 -4.36 mm 1.16 mm -2.43 m 0 eV 88 keV 2.39 mm 2.62 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 80, Parent ID = 77 +* G4Track Information: Particle = e-, Track ID = 76, Parent ID = 71 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.98 mm -2.14 mm -2.44 m 147 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.98 mm -2.14 mm -2.44 m 0 eV 147 keV 51.2 mum 51.2 mum Target eIoni + 0 -4.36 mm 1.16 mm -2.43 m 123 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.36 mm 1.16 mm -2.43 m 0 eV 123 keV 38.2 mum 38.2 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 75, Parent ID = 9 +* G4Track Information: Particle = e-, Track ID = 75, Parent ID = 71 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.57 mm 1.03 mm -2.44 m 1.54 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.15 mm 1.56 mm -2.44 m 443 keV 1.09 MeV 834 mum 834 mum Target eBrem - 2 -1.13 mm 1.57 mm -2.44 m 0 eV 443 keV 257 mum 1.09 mm Target eIoni + 0 -3.11 mm 1.66 mm -2.43 m 300 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.11 mm 1.67 mm -2.43 m 0 eV 300 keV 149 mum 149 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 9 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.99 mm 1.57 mm -2.43 m 2.3 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.13 mm 1.88 mm -2.43 m 104 keV 1.82 MeV 1.47 mm 1.47 mm Target eBrem + 2 -2.13 mm 1.88 mm -2.43 m 0 eV 104 keV 29.4 mum 1.5 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 77, Parent ID = 69 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.13 mm 1.88 mm -2.43 m 375 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.22 mm 5.36 mm -2.43 m 0 eV 88 keV 3.64 mm 3.64 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 78, Parent ID = 77 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.22 mm 5.36 mm -2.43 m 287 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.22 mm 5.37 mm -2.43 m 0 eV 287 keV 140 mum 140 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 8, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -653 mum 857 mum -2.45 m 446 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.02 mm 1.3 mm -2.44 m 0 eV 88 keV 5.22 mm 5.22 mm Target phot + 0 -562 mum 882 mum -2.45 m 446 keV 0 eV 0 fm 0 fm Target initStep + 1 -669 mum 1.04 mm -2.44 m 0 eV 88 keV 1.74 mm 1.74 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 82, Parent ID = 8 +* G4Track Information: Particle = e-, Track ID = 79, Parent ID = 8 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.02 mm 1.3 mm -2.44 m 358 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.02 mm 1.31 mm -2.44 m 0 eV 358 keV 191 mum 191 mum Target eIoni + 0 -669 mum 1.04 mm -2.44 m 358 keV 0 eV 0 fm 0 fm Target initStep + 1 -668 mum 1.03 mm -2.44 m 0 eV 358 keV 191 mum 191 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -639 mum 845 mum -2.45 m 3.77 MeV 0 eV 0 fm 0 fm Target initStep - 1 -5.85 mm 2.46 mm -2.4 m 0 eV 0 eV 4.43 cm 4.43 cm Target conv + 0 -548 mum 869 mum -2.45 m 3.77 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.14 mm 1.93 mm -2.42 m 366 keV 0 eV 2.31 cm 2.31 cm Target compt + 2 -9.45 mm 1.39 mm -2.43 m 0 eV 88 keV 6.8 mm 2.99 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 84, Parent ID = 7 +* G4Track Information: Particle = e-, Track ID = 81, Parent ID = 7 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.85 mm 2.46 mm -2.4 m 1.23 MeV 0 eV 0 fm 0 fm Target initStep - 1 -5.87 mm 2.46 mm -2.4 m 0 eV 1.23 MeV 929 mum 929 mum Target eIoni - 2 -5.87 mm 2.46 mm -2.4 m 0 eV 0 eV 0 fm 929 mum Target annihil + 0 -9.45 mm 1.39 mm -2.43 m 278 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.46 mm 1.39 mm -2.43 m 0 eV 278 keV 133 mum 133 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 86, Parent ID = 84 +* G4Track Information: Particle = e-, Track ID = 80, Parent ID = 7 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.87 mm 2.46 mm -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.1 mm 2.03 mm -2.4 m 0 eV 88 keV 1.05 mm 1.05 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 87, Parent ID = 86 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.1 mm 2.03 mm -2.4 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.1 mm 2.02 mm -2.4 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 85, Parent ID = 84 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.87 mm 2.46 mm -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.36 mm 3.42 mm -2.4 m 511 keV 0 eV 2.32 mm 2.32 mm Target Transportation - 2 78.6 cm 1.5 m 80 cm 511 keV 0 eV 3.62 m 3.62 m Tracker Transportation - 3 80.5 cm 1.54 m 87.4 cm 511 keV 0 eV 8.33 cm 3.71 m Chamber Transportation - 4 98.4 cm 1.88 m 1.6 m 511 keV 0 eV 82.2 cm 4.53 m Tracker Transportation - 5 1.03 m 1.97 m 1.8 m 511 keV 0 eV 22.2 cm 4.75 m Chamber Transportation - 6 1.18 m 2.25 m 2.4 m 511 keV 0 eV 68.3 cm 5.43 m Tracker Transportation - 7 1.31 m 2.49 m 2.91 m 511 keV 0 eV 57.7 cm 6.01 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 83, Parent ID = 7 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.85 mm 2.46 mm -2.4 m 1.52 MeV 0 eV 0 fm 0 fm Target initStep - 1 -5.87 mm 2.46 mm -2.4 m 0 eV 1.52 MeV 1.16 mm 1.16 mm Target eIoni + 0 -3.14 mm 1.93 mm -2.42 m 3.4 MeV 0 eV 0 fm 0 fm Target initStep + 1 -5.19 mm 3.47 mm -2.42 m 608 keV 2.8 MeV 2.62 mm 2.62 mm Target eBrem + 2 -5.21 mm 3.47 mm -2.42 m 0 eV 608 keV 390 mum 3.01 mm Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -480 mum 782 mum -2.45 m 300 keV 0 eV 0 fm 0 fm Target initStep - 1 -590 mum 813 mum -2.45 m 0 eV 88 keV 727 mum 727 mum Target phot + 0 -400 mum 795 mum -2.45 m 300 keV 0 eV 0 fm 0 fm Target initStep + 1 -759 mum 930 mum -2.44 m 0 eV 88 keV 2.54 mm 2.54 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 88, Parent ID = 6 +* G4Track Information: Particle = e-, Track ID = 82, Parent ID = 6 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -590 mum 813 mum -2.45 m 212 keV 0 eV 0 fm 0 fm Target initStep - 1 -593 mum 815 mum -2.45 m 0 eV 212 keV 89.2 mum 89.2 mum Target eIoni + 0 -759 mum 930 mum -2.44 m 212 keV 0 eV 0 fm 0 fm Target initStep + 1 -762 mum 930 mum -2.44 m 0 eV 212 keV 89.2 mum 89.2 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -292 mum 692 mum -2.45 m 2.16 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.34 mm 1.08 mm -2.44 m 289 keV 0 eV 7.49 mm 7.49 mm Target compt - 2 2.83 mm -4.16 mm -2.44 m 248 keV 0 eV 7.37 mm 1.49 cm Target compt - 3 2.77 mm -4.41 mm -2.44 m 0 eV 88 keV 317 mum 1.52 cm Target phot + 0 -229 mum 694 mum -2.45 m 2.16 MeV 0 eV 0 fm 0 fm Target initStep + 1 -895 mum 1 mm -2.44 m 0 eV 0 eV 5.15 mm 5.15 mm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 91, Parent ID = 5 +* G4Track Information: Particle = e+, Track ID = 84, Parent ID = 5 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.77 mm -4.41 mm -2.44 m 160 keV 0 eV 0 fm 0 fm Target initStep - 1 2.77 mm -4.41 mm -2.44 m 0 eV 160 keV 57.8 mum 57.8 mum Target eIoni + 0 -895 mum 1 mm -2.44 m 321 keV 0 eV 0 fm 0 fm Target initStep + 1 -898 mum 1 mm -2.44 m 0 eV 321 keV 161 mum 161 mum Target eIoni + 2 -898 mum 1 mm -2.44 m 0 eV 0 eV 0 fm 161 mum Target annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 90, Parent ID = 5 +* G4Track Information: Particle = gamma, Track ID = 86, Parent ID = 84 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.83 mm -4.16 mm -2.44 m 41.7 keV 0 eV 0 fm 0 fm Target initStep - 1 2.83 mm -4.16 mm -2.44 m 0 eV 41.7 keV 6.69 mum 6.69 mum Target eIoni + 0 -898 mum 1 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.19 mm -2.5 cm -2.44 m 511 keV 0 eV 2.71 cm 2.71 cm Target Transportation + 2 -13.7 cm -48.3 cm -2.4 m 511 keV 0 eV 47.7 cm 50.4 cm World Transportation + 3 -67.4 cm -2.4 m -2.23 m 511 keV 0 eV 2 m 2.5 m Tracker Transportation + 4 -81.7 cm -2.91 m -2.18 m 511 keV 0 eV 53.2 cm 3.03 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 89, Parent ID = 5 +* G4Track Information: Particle = gamma, Track ID = 85, Parent ID = 84 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.34 mm 1.08 mm -2.44 m 1.87 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.3 mm 1.08 mm -2.44 m 1.23 MeV 130 keV 117 mum 117 mum Target eBrem - 2 -1.3 mm 1.01 mm -2.44 m 0 eV 1.23 MeV 915 mum 1.03 mm Target eIoni + 0 -898 mum 1 mm -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.73 mm 1.04 cm -2.44 m 324 keV 0 eV 9.75 mm 9.75 mm Target compt + 2 1.76 mm 1.04 cm -2.44 m 0 eV 88 keV 135 mum 9.89 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 92, Parent ID = 89 +* G4Track Information: Particle = e-, Track ID = 88, Parent ID = 85 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.3 mm 1.08 mm -2.44 m 509 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.64 mm -2.5 cm -2.44 m 509 keV 0 eV 2.65 cm 2.65 cm Target Transportation - 2 -2.45 cm -25.8 cm -2.4 m 509 keV 0 eV 23.6 cm 26.3 cm World Transportation - 3 -21.7 cm -2.4 m -2.06 m 509 keV 0 eV 2.18 m 2.44 m Tracker Transportation - 4 -26.3 cm -2.91 m -1.98 m 509 keV 0 eV 51.8 cm 2.96 m OutOfWorld Transportation + 0 1.76 mm 1.04 cm -2.44 m 236 keV 0 eV 0 fm 0 fm Target initStep + 1 1.76 mm 1.04 cm -2.44 m 0 eV 236 keV 105 mum 105 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 87, Parent ID = 85 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.73 mm 1.04 cm -2.44 m 187 keV 0 eV 0 fm 0 fm Target initStep + 1 1.73 mm 1.04 cm -2.44 m 0 eV 187 keV 73.7 mum 73.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 83, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -895 mum 1 mm -2.44 m 815 keV 0 eV 0 fm 0 fm Target initStep + 1 -897 mum 1.01 mm -2.44 m 0 eV 815 keV 564 mum 564 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -274 mum 692 mum -2.45 m 12.6 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.43 mm 1.09 mm -2.43 m 0 eV 0 eV 1.65 cm 1.65 cm Target conv + 0 -211 mum 692 mum -2.45 m 12.6 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.72 mm 1.4 mm -2.43 m 0 eV 0 eV 2.04 cm 2.04 cm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 94, Parent ID = 4 +* G4Track Information: Particle = e+, Track ID = 90, Parent ID = 4 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.43 mm 1.09 mm -2.43 m 1.9 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.58 mm 1.2 mm -2.43 m 0 eV 1.9 MeV 1.5 mm 1.5 mm Target eIoni - 2 -2.58 mm 1.2 mm -2.43 m 0 eV 0 eV 0 fm 1.5 mm Target annihil + 0 -2.72 mm 1.4 mm -2.43 m 8.65 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.3 mm 1.73 mm -2.43 m 3.43 MeV 1.44 MeV 1.16 mm 1.16 mm Target eBrem + 2 -3.93 mm 1.61 mm -2.43 m 0 eV 1.99 MeV 1.85 mm 3.01 mm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 96, Parent ID = 94 +* G4Track Information: Particle = gamma, Track ID = 93, Parent ID = 90 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.58 mm 1.2 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.86 mm 1.68 mm -2.43 m 0 eV 88 keV 1.03 mm 1.03 mm Target phot + 0 -3.93 mm 1.61 mm -2.43 m 1.99 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.85 mm 3.48 mm -2.43 m 1.75 MeV 0 eV 6.14 mm 6.14 mm Target compt + 2 -878 mum 8.96 mm -2.44 m 1.67 MeV 0 eV 1.26 cm 1.88 cm Target compt + 3 128 mum 1.08 cm -2.45 m 1.67 MeV 0 eV 6.11 mm 2.49 cm Target Transportation + 4 8.1 cm 16.2 cm -2.91 m 1.67 MeV 0 eV 49.1 cm 51.6 cm OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 97, Parent ID = 96 +* G4Track Information: Particle = e-, Track ID = 95, Parent ID = 93 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.86 mm 1.68 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.87 mm 1.69 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -878 mum 8.96 mm -2.44 m 72.3 keV 0 eV 0 fm 0 fm Target initStep + 1 -877 mum 8.96 mm -2.44 m 0 eV 72.3 keV 16.4 mum 16.4 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 95, Parent ID = 94 +* G4Track Information: Particle = e-, Track ID = 94, Parent ID = 93 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.58 mm 1.2 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 475 mum -3.91 mm -2.42 m 0 eV 88 keV 1.09 cm 1.09 cm Target phot + 0 -3.85 mm 3.48 mm -2.43 m 247 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.86 mm 3.48 mm -2.43 m 0 eV 247 keV 112 mum 112 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 98, Parent ID = 95 +* G4Track Information: Particle = gamma, Track ID = 92, Parent ID = 90 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 475 mum -3.91 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 475 mum -3.91 mm -2.42 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.93 mm 1.61 mm -2.43 m 467 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.35 mm 2.19 mm -2.43 m 0 eV 88 keV 877 mum 877 mum Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 93, Parent ID = 4 +* G4Track Information: Particle = e-, Track ID = 96, Parent ID = 92 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.43 mm 1.09 mm -2.43 m 9.66 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.44 mm 1.08 mm -2.43 m 5.42 MeV 72 keV 94.3 mum 94.3 mum Target eBrem - 2 -1.99 mm 1.15 mm -2.43 m 2.62 MeV 1.31 MeV 714 mum 808 mum Target eBrem - 3 -2.36 mm 1.23 mm -2.43 m 1.02 MeV 1.1 MeV 982 mum 1.79 mm Target eBrem - 4 -2.35 mm 1.2 mm -2.43 m 0 eV 1.02 MeV 734 mum 2.52 mm Target eIoni + 0 -4.35 mm 2.19 mm -2.43 m 379 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.36 mm 2.18 mm -2.43 m 0 eV 379 keV 207 mum 207 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 101, Parent ID = 93 +* G4Track Information: Particle = gamma, Track ID = 91, Parent ID = 90 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.36 mm 1.23 mm -2.43 m 499 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.47 mm -2.28 mm -2.44 m 0 eV 88 keV 1.14 cm 1.14 cm Target phot + 0 -2.3 mm 1.73 mm -2.43 m 3.79 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.84 mm 798 mum -2.42 m 0 eV 0 eV 7.79 mm 7.79 mm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 102, Parent ID = 101 +* G4Track Information: Particle = e+, Track ID = 98, Parent ID = 91 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.47 mm -2.28 mm -2.44 m 411 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.46 mm -2.28 mm -2.44 m 0 eV 411 keV 231 mum 231 mum Target eIoni + 0 -3.84 mm 798 mum -2.42 m 471 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.82 mm 823 mum -2.42 m 0 eV 471 keV 278 mum 278 mum Target eIoni + 2 -3.82 mm 823 mum -2.42 m 0 eV 0 eV 0 fm 278 mum Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 100, Parent ID = 93 +* G4Track Information: Particle = gamma, Track ID = 100, Parent ID = 98 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.99 mm 1.15 mm -2.43 m 1.5 MeV 0 eV 0 fm 0 fm Target initStep - 1 1.25 cm 9.79 mm -2.42 m 1.23 MeV 0 eV 2.19 cm 2.19 cm Target compt - 2 2.5 cm 1.45 cm -2.41 m 1.23 MeV 0 eV 1.42 cm 3.61 cm Target Transportation - 3 5.95 cm 2.77 cm -2.4 m 1.23 MeV 0 eV 3.91 cm 7.52 cm World Transportation - 4 2.4 m 91.6 cm -1.53 m 1.23 MeV 0 eV 2.65 m 2.73 m Tracker Transportation - 5 2.91 m 1.11 m -1.34 m 1.23 MeV 0 eV 57.8 cm 3.3 m OutOfWorld Transportation + 0 -3.82 mm 823 mum -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 4.23 mm -1.05 cm -2.42 m 184 keV 0 eV 1.39 cm 1.39 cm Target compt + 2 3.53 mm -1.02 cm -2.42 m 0 eV 88 keV 859 mum 1.48 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 103, Parent ID = 100 +* G4Track Information: Particle = e-, Track ID = 102, Parent ID = 100 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.25 cm 9.79 mm -2.42 m 271 keV 0 eV 0 fm 0 fm Target initStep - 1 1.25 cm 9.79 mm -2.42 m 0 eV 271 keV 128 mum 128 mum Target eIoni + 0 3.53 mm -1.02 cm -2.42 m 96.3 keV 0 eV 0 fm 0 fm Target initStep + 1 3.54 mm -1.02 cm -2.42 m 0 eV 96.3 keV 26 mum 26 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 99, Parent ID = 93 +* G4Track Information: Particle = e-, Track ID = 101, Parent ID = 100 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.44 mm 1.08 mm -2.43 m 4.16 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.18 mm 450 mum -2.43 m 0 eV 0 eV 4.63 mm 4.63 mm Target conv + 0 4.23 mm -1.05 cm -2.42 m 327 keV 0 eV 0 fm 0 fm Target initStep + 1 4.23 mm -1.05 cm -2.42 m 0 eV 327 keV 168 mum 168 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 105, Parent ID = 99 +* G4Track Information: Particle = gamma, Track ID = 99, Parent ID = 98 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.18 mm 450 mum -2.43 m 270 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.18 mm 452 mum -2.43 m 0 eV 270 keV 125 mum 125 mum Target eIoni - 2 -2.18 mm 452 mum -2.43 m 0 eV 0 eV 0 fm 125 mum Target annihil + 0 -3.82 mm 823 mum -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.95 mm 3.82 mm -2.42 m 0 eV 88 keV 3.69 mm 3.69 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 107, Parent ID = 105 +* G4Track Information: Particle = e-, Track ID = 103, Parent ID = 99 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.18 mm 452 mum -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -915 mum 3.83 mm -2.43 m 0 eV 88 keV 3.69 mm 3.69 mm Target phot + 0 -5.95 mm 3.82 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.95 mm 3.84 mm -2.42 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 108, Parent ID = 107 +* G4Track Information: Particle = e-, Track ID = 97, Parent ID = 91 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -915 mum 3.83 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -902 mum 3.84 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -3.84 mm 798 mum -2.42 m 2.29 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.92 mm 692 mum -2.42 m 0 eV 2.29 MeV 1.79 mm 1.79 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 106, Parent ID = 105 +* G4Track Information: Particle = e-, Track ID = 89, Parent ID = 4 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.18 mm 452 mum -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.36 mm -5.35 mm -2.43 m 264 keV 0 eV 6.34 mm 6.34 mm Target compt - 2 -3.33 mm -5.51 mm -2.43 m 0 eV 88 keV 1.87 mm 8.21 mm Target phot + 0 -2.72 mm 1.4 mm -2.43 m 2.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.8 mm 1.03 mm -2.43 m 133 keV 759 keV 536 mum 536 mum Target eBrem + 2 -2.8 mm 1.03 mm -2.43 m 0 eV 133 keV 43.5 mum 580 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 110, Parent ID = 106 +* G4Track Information: Particle = gamma, Track ID = 104, Parent ID = 89 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.33 mm -5.51 mm -2.43 m 176 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.33 mm -5.51 mm -2.43 m 0 eV 176 keV 67.4 mum 67.4 mum Target eIoni + 0 -2.8 mm 1.03 mm -2.43 m 2.01 MeV 0 eV 0 fm 0 fm Target initStep + 1 -5.02 mm 3.8 mm -2.43 m 1.32 MeV 0 eV 4.64 mm 4.64 mm Target compt + 2 -5.1 mm 8.7 mm -2.43 m 481 keV 0 eV 6.05 mm 1.07 cm Target compt + 3 -7.95 mm 1.31 cm -2.43 m 0 eV 88 keV 5.97 mm 1.67 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 109, Parent ID = 106 +* G4Track Information: Particle = e-, Track ID = 107, Parent ID = 104 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.36 mm -5.35 mm -2.43 m 247 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.37 mm -5.35 mm -2.43 m 0 eV 247 keV 112 mum 112 mum Target eIoni + 0 -7.95 mm 1.31 cm -2.43 m 393 keV 0 eV 0 fm 0 fm Target initStep + 1 -7.97 mm 1.31 cm -2.43 m 0 eV 393 keV 218 mum 218 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 104, Parent ID = 99 +* G4Track Information: Particle = e-, Track ID = 106, Parent ID = 104 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.18 mm 450 mum -2.43 m 2.87 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.47 mm 798 mum -2.43 m 1.69 MeV 1.19 MeV 1.15 mm 1.15 mm Target eBrem - 2 -1.41 mm 835 mum -2.43 m 0 eV 1.69 MeV 1.25 mm 2.4 mm Target eBrem + 0 -5.1 mm 8.7 mm -2.43 m 842 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.09 mm 8.72 mm -2.43 m 0 eV 842 keV 587 mum 587 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 105, Parent ID = 104 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.02 mm 3.8 mm -2.43 m 686 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.05 mm 3.81 mm -2.43 m 0 eV 686 keV 455 mum 455 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = gamma, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -285 mum 708 mum -2.45 m 117 MeV 0 eV 0 fm 0 fm Target initStep - 1 -527 mum 1.03 mm -2.44 m 0 eV 0 eV 7.08 mm 7.08 mm Target conv + 0 -221 mum 711 mum -2.45 m 117 MeV 0 eV 0 fm 0 fm Target initStep + 1 -580 mum 1.32 mm -2.44 m 0 eV 0 eV 1.37 cm 1.37 cm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 112, Parent ID = 3 +* G4Track Information: Particle = e+, Track ID = 109, Parent ID = 3 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -527 mum 1.03 mm -2.44 m 92.3 MeV 0 eV 0 fm 0 fm Target initStep - 1 -567 mum 1.07 mm -2.44 m 88.2 MeV 2.53 MeV 543 mum 543 mum Target eBrem - 2 -583 mum 1.09 mm -2.44 m 69.4 MeV 298 keV 212 mum 755 mum Target eBrem - 3 -591 mum 1.11 mm -2.44 m 61.8 MeV 125 keV 109 mum 865 mum Target eBrem - 4 -774 mum 1.22 mm -2.44 m 47.9 MeV 1.91 MeV 1.5 mm 2.36 mm Target eBrem - 5 -923 mum 1.44 mm -2.44 m 40.6 MeV 1.5 MeV 1.22 mm 3.59 mm Target eBrem - 6 -906 mum 1.46 mm -2.44 m 37.8 MeV 643 keV 544 mum 4.13 mm Target eBrem - 7 -789 mum 1.31 mm -2.44 m 19.8 MeV 1.14 MeV 1.03 mm 5.16 mm Target eBrem - 8 -691 mum 1.11 mm -2.44 m 18.5 MeV 611 keV 585 mum 5.75 mm Target eBrem - 9 -688 mum 1.11 mm -2.44 m 16.6 MeV 22.2 keV 13.7 mum 5.76 mm Target eBrem - 10 -20.6 mum 86.6 mum -2.44 m 13.6 MeV 2.68 MeV 1.69 mm 7.45 mm Target eBrem - 11 -1.79 mm -355 mum -2.43 m 2.14 MeV 8.15 MeV 5.61 mm 1.31 cm Target eBrem - 12 -1.98 mm -346 mum -2.43 m 0 eV 2.14 MeV 1.7 mm 1.48 cm Target eIoni - 13 -1.98 mm -346 mum -2.43 m 0 eV 0 eV 0 fm 1.48 cm Target annihil + 0 -580 mum 1.32 mm -2.44 m 49.8 MeV 0 eV 0 fm 0 fm Target initStep + 1 -586 mum 1.36 mm -2.44 m 47.9 MeV 434 keV 384 mum 384 mum Target eBrem + 2 -571 mum 1.43 mm -2.43 m 45 MeV 741 keV 680 mum 1.06 mm Target eBrem + 3 -571 mum 1.43 mm -2.43 m 31.8 MeV 88.3 keV 89 mum 1.15 mm Target eBrem + 4 -158 mum 1.85 mm -2.43 m 27.7 MeV 3.67 MeV 2.08 mm 3.23 mm Target eBrem + 5 -240 mum 1.71 mm -2.43 m 24.9 MeV 643 keV 598 mum 3.83 mm Target eBrem + 6 1.08 mm -46.9 mum -2.43 m 14.1 MeV 8.07 MeV 4.63 mm 8.46 mm Target eBrem + 7 2.26 mm 714 mum -2.43 m 11.3 MeV 2.59 MeV 2.18 mm 1.06 cm Target eBrem + 8 2.66 mm -106 mum -2.43 m 9.53 MeV 1.28 MeV 1.02 mm 1.17 cm Target eBrem + 9 3.11 mm -1.33 mm -2.43 m 7.56 MeV 1.66 MeV 1.41 mm 1.31 cm Target eBrem + 10 2.73 mm -3.24 mm -2.43 m 4.88 MeV 2.19 MeV 1.82 mm 1.49 cm Target eBrem + 11 3.91 mm -5.12 mm -2.43 m 1.22 MeV 3.66 MeV 2.37 mm 1.72 cm Target eBrem + 12 4 mm -5.17 mm -2.43 m 0 eV 1.22 MeV 922 mum 1.82 cm Target eIoni + 13 4 mm -5.17 mm -2.43 m 0 eV 0 eV 0 fm 1.82 cm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 125, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 121, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.98 mm -346 mum -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -2 mm -412 mum -2.43 m 0 eV 88 keV 80.2 mum 80.2 mum Target phot + 0 4 mm -5.17 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -607 mum -6.26 mm -2.43 m 0 eV 88 keV 7.43 mm 7.43 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 126, Parent ID = 125 +* G4Track Information: Particle = e-, Track ID = 122, Parent ID = 121 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2 mm -412 mum -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.01 mm -426 mum -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -607 mum -6.26 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -615 mum -6.26 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 124, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 120, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.98 mm -346 mum -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -522 mum 4.58 mm -2.44 m 387 keV 0 eV 5.97 mm 5.97 mm Target compt - 2 188 mum 5.11 mm -2.44 m 0 eV 88 keV 885 mum 6.85 mm Target phot + 0 4 mm -5.17 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.73 cm -2.02 mm -2.41 m 482 keV 0 eV 2.14 cm 2.14 cm Target compt + 2 1.91 cm -631 mum -2.41 m 394 keV 0 eV 2.99 mm 2.44 cm Target compt + 3 2.5 cm 3.38 mm -2.41 m 394 keV 0 eV 7.13 mm 3.15 cm Target Transportation + 4 2.91 m 1.97 m -2.46 m 394 keV 0 eV 3.49 m 3.52 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 128, Parent ID = 124 +* G4Track Information: Particle = e-, Track ID = 124, Parent ID = 120 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 188 mum 5.11 mm -2.44 m 299 keV 0 eV 0 fm 0 fm Target initStep - 1 182 mum 5.12 mm -2.44 m 0 eV 299 keV 148 mum 148 mum Target eIoni + 0 1.91 cm -631 mum -2.41 m 88.3 keV 0 eV 0 fm 0 fm Target initStep + 1 1.91 cm -631 mum -2.41 m 0 eV 88.3 keV 22.7 mum 22.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 127, Parent ID = 124 +* G4Track Information: Particle = e-, Track ID = 123, Parent ID = 120 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -522 mum 4.58 mm -2.44 m 124 keV 0 eV 0 fm 0 fm Target initStep - 1 -524 mum 4.58 mm -2.44 m 0 eV 124 keV 38.9 mum 38.9 mum Target eIoni + 0 1.73 cm -2.02 mm -2.41 m 28.7 keV 0 eV 0 fm 0 fm Target initStep + 1 1.73 cm -2.02 mm -2.41 m 0 eV 28.7 keV 3.65 mum 3.65 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 123, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 119, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.79 mm -355 mum -2.43 m 3.31 MeV 0 eV 0 fm 0 fm Target initStep - 1 -6.07 mm 86.8 mum -2.44 m 0 eV 0 eV 5.65 mm 5.65 mm Target conv + 0 2.73 mm -3.24 mm -2.43 m 488 keV 0 eV 0 fm 0 fm Target initStep + 1 2 mm -4.35 mm -2.42 m 367 keV 0 eV 1.62 mm 1.62 mm Target compt + 2 2.89 mm -5.75 mm -2.42 m 288 keV 0 eV 2.61 mm 4.23 mm Target compt + 3 2.91 mm -5.75 mm -2.42 m 0 eV 88 keV 15 mum 4.24 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 130, Parent ID = 123 +* G4Track Information: Particle = e-, Track ID = 127, Parent ID = 119 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.07 mm 86.8 mum -2.44 m 1.03 MeV 0 eV 0 fm 0 fm Target initStep - 1 -6.14 mm 99.2 mum -2.44 m 0 eV 1.03 MeV 754 mum 754 mum Target eIoni - 2 -6.14 mm 99.2 mum -2.44 m 0 eV 0 eV 0 fm 754 mum Target annihil + 0 2.91 mm -5.75 mm -2.42 m 200 keV 0 eV 0 fm 0 fm Target initStep + 1 2.91 mm -5.75 mm -2.42 m 0 eV 200 keV 81.4 mum 81.4 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 132, Parent ID = 130 +* G4Track Information: Particle = e-, Track ID = 126, Parent ID = 119 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.14 mm 99.2 mum -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.06 mm 173 mum -2.44 m 199 keV 0 eV 153 mum 153 mum Target compt - 2 -5.54 mm -344 mum -2.44 m 180 keV 0 eV 1.24 mm 1.4 mm Target compt - 3 -5.65 mm -515 mum -2.44 m 0 eV 88 keV 346 mum 1.74 mm Target phot + 0 2.89 mm -5.75 mm -2.42 m 79.5 keV 0 eV 0 fm 0 fm Target initStep + 1 2.89 mm -5.75 mm -2.42 m 0 eV 79.5 keV 19 mum 19 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 135, Parent ID = 132 +* G4Track Information: Particle = e-, Track ID = 125, Parent ID = 119 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.65 mm -515 mum -2.44 m 92.3 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.65 mm -516 mum -2.44 m 0 eV 92.3 keV 24.3 mum 24.3 mum Target eIoni + 0 2 mm -4.35 mm -2.42 m 121 keV 0 eV 0 fm 0 fm Target initStep + 1 2 mm -4.35 mm -2.42 m 0 eV 121 keV 37.5 mum 37.5 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 118, Parent ID = 109 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 3.11 mm -1.33 mm -2.43 m 312 keV 0 eV 0 fm 0 fm Target initStep + 1 3.06 mm -1.47 mm -2.43 m 0 eV 88 keV 210 mum 210 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 128, Parent ID = 118 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 3.06 mm -1.47 mm -2.43 m 224 keV 0 eV 0 fm 0 fm Target initStep + 1 3.06 mm -1.47 mm -2.43 m 0 eV 224 keV 97.4 mum 97.4 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 117, Parent ID = 109 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.66 mm -106 mum -2.43 m 446 keV 0 eV 0 fm 0 fm Target initStep + 1 5.89 mm -1.04 cm -2.42 m 0 eV 88 keV 1.44 cm 1.44 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 129, Parent ID = 117 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.89 mm -1.04 cm -2.42 m 358 keV 0 eV 0 fm 0 fm Target initStep + 1 5.9 mm -1.04 cm -2.42 m 0 eV 358 keV 191 mum 191 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 116, Parent ID = 109 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.26 mm 714 mum -2.43 m 291 keV 0 eV 0 fm 0 fm Target initStep + 1 2.34 mm -161 mum -2.43 m 0 eV 88 keV 1.22 mm 1.22 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 130, Parent ID = 116 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.34 mm -161 mum -2.43 m 203 keV 0 eV 0 fm 0 fm Target initStep + 1 2.34 mm -166 mum -2.43 m 0 eV 203 keV 83.7 mum 83.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 115, Parent ID = 109 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.08 mm -46.9 mum -2.43 m 2.64 MeV 0 eV 0 fm 0 fm Target initStep + 1 5.44 mm 8.4 mm -2.42 m 0 eV 88 keV 1.14 cm 1.14 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 131, Parent ID = 115 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.44 mm 8.4 mm -2.42 m 2.56 MeV 0 eV 0 fm 0 fm Target initStep + 1 5.27 mm 8.28 mm -2.42 m 869 keV 1.02 MeV 1.04 mm 1.04 mm Target eBrem + 2 5.3 mm 8.31 mm -2.42 m 0 eV 869 keV 609 mum 1.65 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 132, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.27 mm 8.28 mm -2.42 m 669 keV 0 eV 0 fm 0 fm Target initStep + 1 1.69 cm 6.04 mm -2.44 m 422 keV 0 eV 2.14 cm 2.14 cm Target compt + 2 1.78 cm 5.2 mm -2.44 m 0 eV 88 keV 1.19 mm 2.26 cm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 134, Parent ID = 132 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.54 mm -344 mum -2.44 m 18.3 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.54 mm -344 mum -2.44 m 0 eV 18.3 keV 1.78 mum 1.78 mum Target eIoni + 0 1.78 cm 5.2 mm -2.44 m 334 keV 0 eV 0 fm 0 fm Target initStep + 1 1.78 cm 5.19 mm -2.44 m 0 eV 334 keV 173 mum 173 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 133, Parent ID = 132 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.06 mm 173 mum -2.44 m 312 keV 0 eV 0 fm 0 fm Target initStep - 1 -6.06 mm 178 mum -2.44 m 0 eV 312 keV 158 mum 158 mum Target eIoni + 0 1.69 cm 6.04 mm -2.44 m 248 keV 0 eV 0 fm 0 fm Target initStep + 1 1.69 cm 6.04 mm -2.44 m 0 eV 248 keV 112 mum 112 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 131, Parent ID = 130 +* G4Track Information: Particle = gamma, Track ID = 114, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.14 mm 99.2 mum -2.44 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.38 mm -1.1 mm -2.44 m 467 keV 0 eV 2.49 mm 2.49 mm Target compt - 2 -1.25 cm -4.57 mm -2.43 m 167 keV 0 eV 6.7 mm 9.19 mm Target compt - 3 -1.18 cm -4.31 mm -2.43 m 0 eV 88 keV 862 mum 1.01 cm Target phot + 0 -240 mum 1.71 mm -2.43 m 2.17 MeV 0 eV 0 fm 0 fm Target initStep + 1 -668 mum 1.1 mm -2.42 m 1.21 MeV 0 eV 1.18 cm 1.18 cm Target compt + 2 1.95 mm -1.33 mm -2.42 m 977 keV 0 eV 6.1 mm 1.79 cm Target compt + 3 1.75 cm -1.16 cm -2.41 m 587 keV 0 eV 2.13 cm 3.92 cm Target compt + 4 1.85 cm -1.12 cm -2.4 m 0 eV 88 keV 2.32 mm 4.15 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 138, Parent ID = 131 +* G4Track Information: Particle = e-, Track ID = 138, Parent ID = 114 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.18 cm -4.31 mm -2.43 m 78.7 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.18 cm -4.3 mm -2.43 m 0 eV 78.7 keV 18.7 mum 18.7 mum Target eIoni + 0 1.85 cm -1.12 cm -2.4 m 499 keV 0 eV 0 fm 0 fm Target initStep + 1 1.85 cm -1.12 cm -2.4 m 0 eV 499 keV 301 mum 301 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 137, Parent ID = 131 +* G4Track Information: Particle = e-, Track ID = 137, Parent ID = 114 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.25 cm -4.57 mm -2.43 m 300 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.25 cm -4.57 mm -2.43 m 0 eV 300 keV 149 mum 149 mum Target eIoni + 0 1.75 cm -1.16 cm -2.41 m 390 keV 0 eV 0 fm 0 fm Target initStep + 1 1.75 cm -1.16 cm -2.41 m 0 eV 390 keV 215 mum 215 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 136, Parent ID = 131 +* G4Track Information: Particle = e-, Track ID = 136, Parent ID = 114 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.38 mm -1.1 mm -2.44 m 44.2 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.38 mm -1.1 mm -2.44 m 0 eV 44.2 keV 7.35 mum 7.35 mum Target eIoni + 0 1.95 mm -1.33 mm -2.42 m 237 keV 0 eV 0 fm 0 fm Target initStep + 1 1.94 mm -1.33 mm -2.42 m 0 eV 237 keV 106 mum 106 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 129, Parent ID = 123 +* G4Track Information: Particle = e-, Track ID = 135, Parent ID = 114 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.07 mm 86.8 mum -2.44 m 1.26 MeV 0 eV 0 fm 0 fm Target initStep - 1 -6.13 mm 88.7 mum -2.44 m 0 eV 1.26 MeV 939 mum 939 mum Target eIoni + 0 -668 mum 1.1 mm -2.42 m 957 keV 0 eV 0 fm 0 fm Target initStep + 1 -691 mum 1.11 mm -2.42 m 0 eV 957 keV 684 mum 684 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 122, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 113, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -20.6 mum 86.6 mum -2.44 m 290 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.45 mm -322 mum -2.43 m 0 eV 88 keV 1.74 mm 1.74 mm Target phot + 0 -158 mum 1.85 mm -2.43 m 417 keV 0 eV 0 fm 0 fm Target initStep + 1 -295 mum 1.33 mm -2.43 m 330 keV 0 eV 2.67 mm 2.67 mm Target compt + 2 -39.7 mum -1.03 mm -2.43 m 0 eV 88 keV 2.8 mm 5.46 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 139, Parent ID = 122 +* G4Track Information: Particle = e-, Track ID = 140, Parent ID = 113 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.45 mm -322 mum -2.43 m 202 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.45 mm -326 mum -2.43 m 0 eV 202 keV 83.1 mum 83.1 mum Target eIoni + 0 -39.7 mum -1.03 mm -2.43 m 242 keV 0 eV 0 fm 0 fm Target initStep + 1 -36.8 mum -1.03 mm -2.43 m 0 eV 242 keV 109 mum 109 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 121, Parent ID = 112 +* G4Track Information: Particle = e-, Track ID = 139, Parent ID = 113 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -688 mum 1.11 mm -2.44 m 1.87 MeV 0 eV 0 fm 0 fm Target initStep - 1 3.82 mm -4.71 mm -2.42 m 1.35 MeV 0 eV 2.05 cm 2.05 cm Target compt - 2 1.14 mm -4.98 mm -2.4 m 1.35 MeV 0 eV 1.81 cm 3.85 cm Target Transportation - 3 -11.9 cm -1.71 cm -1.6 m 1.35 MeV 0 eV 80.9 cm 84.8 cm Tracker Transportation - 4 -14.9 cm -2.01 cm -1.4 m 1.35 MeV 0 eV 20.2 cm 1.05 m Chamber Transportation - 5 -23.9 cm -2.92 cm -80 cm 1.35 MeV 0 eV 60.7 cm 1.66 m Tracker Transportation - 6 -26.9 cm -3.22 cm -60 cm 1.35 MeV 0 eV 20.2 cm 1.86 m Chamber Transportation - 7 -35.9 cm -4.13 cm 0 fm 1.35 MeV 0 eV 60.7 cm 2.47 m Tracker Transportation - 8 -38.9 cm -4.43 cm 20 cm 1.35 MeV 0 eV 20.2 cm 2.67 m Chamber Transportation - 9 -47.9 cm -5.34 cm 80 cm 1.35 MeV 0 eV 60.7 cm 3.27 m Tracker Transportation - 10 -50.9 cm -5.64 cm 1 m 1.35 MeV 0 eV 20.2 cm 3.48 m Chamber Transportation - 11 -59.9 cm -6.55 cm 1.6 m 1.35 MeV 0 eV 60.7 cm 4.08 m Tracker Transportation - 12 -62.9 cm -6.85 cm 1.8 m 1.35 MeV 0 eV 20.2 cm 4.29 m Chamber Transportation - 13 -72 cm -7.76 cm 2.4 m 1.35 MeV 0 eV 60.7 cm 4.89 m Tracker Transportation - 14 -79.6 cm -8.53 cm 2.91 m 1.35 MeV 0 eV 51.6 cm 5.41 m OutOfWorld Transportation + 0 -295 mum 1.33 mm -2.43 m 86.9 keV 0 eV 0 fm 0 fm Target initStep + 1 -295 mum 1.33 mm -2.43 m 0 eV 86.9 keV 22.1 mum 22.1 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 140, Parent ID = 121 +* G4Track Information: Particle = gamma, Track ID = 112, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.82 mm -4.71 mm -2.42 m 521 keV 0 eV 0 fm 0 fm Target initStep - 1 3.83 mm -4.73 mm -2.42 m 0 eV 521 keV 319 mum 319 mum Target eIoni + 0 -571 mum 1.43 mm -2.43 m 13.1 MeV 0 eV 0 fm 0 fm Target initStep + 1 -539 mum 1.71 mm -2.43 m 0 eV 0 eV 3.02 mm 3.02 mm Target conv ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 120, Parent ID = 112 +* G4Track Information: Particle = e+, Track ID = 142, Parent ID = 112 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -691 mum 1.11 mm -2.44 m 724 keV 0 eV 0 fm 0 fm Target initStep - 1 4.24 mm -1.55 mm -2.42 m 239 keV 0 eV 1.87 cm 1.87 cm Target compt - 2 5.6 mm 82.6 mum -2.42 m 188 keV 0 eV 2.45 mm 2.11 cm Target compt - 3 5.73 mm 263 mum -2.42 m 0 eV 88 keV 274 mum 2.14 cm Target phot + 0 -539 mum 1.71 mm -2.43 m 5.13 MeV 0 eV 0 fm 0 fm Target initStep + 1 -476 mum 1.79 mm -2.43 m 4.29 MeV 395 keV 301 mum 301 mum Target eBrem + 2 -1.14 mm 3.01 mm -2.43 m 1.85 MeV 2.06 MeV 1.59 mm 1.89 mm Target eBrem + 3 -947 mum 2.93 mm -2.43 m 0 eV 1.85 MeV 940 mum 2.83 mm Target eBrem + 4 -947 mum 2.93 mm -2.43 m 0 eV 0 eV 0 fm 2.83 mm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 143, Parent ID = 120 +* G4Track Information: Particle = gamma, Track ID = 146, Parent ID = 142 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 5.73 mm 263 mum -2.42 m 99.9 keV 0 eV 0 fm 0 fm Target initStep - 1 5.73 mm 263 mum -2.42 m 0 eV 99.9 keV 27.5 mum 27.5 mum Target eIoni + 0 -947 mum 2.93 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.77 mm 1.71 mm -2.43 m 184 keV 0 eV 2.16 mm 2.16 mm Target compt + 2 -1.23 mm 1.69 mm -2.43 m 0 eV 88 keV 774 mum 2.93 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 142, Parent ID = 120 +* G4Track Information: Particle = e-, Track ID = 148, Parent ID = 146 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 5.6 mm 82.6 mum -2.42 m 51.5 keV 0 eV 0 fm 0 fm Target initStep - 1 5.6 mm 82.7 mum -2.42 m 0 eV 51.5 keV 9.4 mum 9.4 mum Target eIoni + 0 -1.23 mm 1.69 mm -2.43 m 96 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.23 mm 1.69 mm -2.43 m 0 eV 96 keV 25.9 mum 25.9 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 141, Parent ID = 120 +* G4Track Information: Particle = e-, Track ID = 147, Parent ID = 146 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 4.24 mm -1.55 mm -2.42 m 484 keV 0 eV 0 fm 0 fm Target initStep - 1 4.24 mm -1.55 mm -2.42 m 0 eV 484 keV 289 mum 289 mum Target eIoni + 0 -1.77 mm 1.71 mm -2.43 m 327 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.78 mm 1.7 mm -2.43 m 0 eV 327 keV 168 mum 168 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 119, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 145, Parent ID = 142 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -789 mum 1.31 mm -2.44 m 16.9 MeV 0 eV 0 fm 0 fm Target initStep - 1 2.45 mm -3.7 mm -2.41 m 0 eV 0 eV 2.61 cm 2.61 cm Target conv + 0 -947 mum 2.93 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.19 mm 6.1 mm -2.44 m 0 eV 88 keV 5.57 mm 5.57 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 145, Parent ID = 119 +* G4Track Information: Particle = e-, Track ID = 149, Parent ID = 145 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.45 mm -3.7 mm -2.41 m 1.38 MeV 0 eV 0 fm 0 fm Target initStep - 1 2.42 mm -3.63 mm -2.41 m 0 eV 1.38 MeV 1.06 mm 1.06 mm Target eIoni - 2 2.42 mm -3.63 mm -2.41 m 0 eV 0 eV 0 fm 1.06 mm Target annihil + 0 1.19 mm 6.1 mm -2.44 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 1.2 mm 6.1 mm -2.44 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 147, Parent ID = 145 +* G4Track Information: Particle = gamma, Track ID = 144, Parent ID = 142 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.42 mm -3.63 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 7.94 mm 2.85 mm -2.41 m 392 keV 0 eV 8.53 mm 8.53 mm Target compt - 2 1 cm 4.48 mm -2.41 m 0 eV 88 keV 3.51 mm 1.2 cm Target phot + 0 -1.14 mm 3.01 mm -2.43 m 379 keV 0 eV 0 fm 0 fm Target initStep + 1 335 mum 2.3 mm -2.43 m 0 eV 88 keV 1.69 mm 1.69 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 149, Parent ID = 147 +* G4Track Information: Particle = e-, Track ID = 150, Parent ID = 144 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1 cm 4.48 mm -2.41 m 304 keV 0 eV 0 fm 0 fm Target initStep - 1 1.01 cm 4.49 mm -2.41 m 0 eV 304 keV 152 mum 152 mum Target eIoni + 0 335 mum 2.3 mm -2.43 m 291 keV 0 eV 0 fm 0 fm Target initStep + 1 344 mum 2.3 mm -2.43 m 0 eV 291 keV 143 mum 143 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 148, Parent ID = 147 +* G4Track Information: Particle = gamma, Track ID = 143, Parent ID = 142 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.94 mm 2.85 mm -2.41 m 119 keV 0 eV 0 fm 0 fm Target initStep - 1 7.94 mm 2.85 mm -2.41 m 0 eV 119 keV 36.6 mum 36.6 mum Target eIoni + 0 -476 mum 1.79 mm -2.43 m 449 keV 0 eV 0 fm 0 fm Target initStep + 1 -547 mum 1.92 mm -2.43 m 193 keV 0 eV 744 mum 744 mum Target compt + 2 -649 mum 2.09 mm -2.43 m 0 eV 88 keV 270 mum 1.01 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 146, Parent ID = 145 +* G4Track Information: Particle = e-, Track ID = 152, Parent ID = 143 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.42 mm -3.63 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.17 mm -1.14 cm -2.41 m 0 eV 88 keV 1.02 cm 1.02 cm Target phot + 0 -649 mum 2.09 mm -2.43 m 104 keV 0 eV 0 fm 0 fm Target initStep + 1 -650 mum 2.09 mm -2.43 m 0 eV 104 keV 29.7 mum 29.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 150, Parent ID = 146 +* G4Track Information: Particle = e-, Track ID = 151, Parent ID = 143 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.17 mm -1.14 cm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.17 mm -1.14 cm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -547 mum 1.92 mm -2.43 m 256 keV 0 eV 0 fm 0 fm Target initStep + 1 -547 mum 1.92 mm -2.43 m 0 eV 256 keV 118 mum 118 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 144, Parent ID = 119 +* G4Track Information: Particle = e-, Track ID = 141, Parent ID = 112 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.45 mm -3.7 mm -2.41 m 14.5 MeV 0 eV 0 fm 0 fm Target initStep - 1 2.44 mm -3.75 mm -2.41 m 11.1 MeV 589 keV 541 mum 541 mum Target eBrem - 2 2.54 mm -3.88 mm -2.41 m 9.86 MeV 237 keV 189 mum 731 mum Target eBrem - 3 1.54 mm -5.32 mm -2.41 m 5.49 MeV 3.32 MeV 2.85 mm 3.58 mm Target eBrem - 4 2.26 mm -5.51 mm -2.41 m 2.86 MeV 1.13 MeV 645 mum 4.22 mm Target eBrem - 5 2.44 mm -5.3 mm -2.41 m 0 eV 2.86 MeV 2.25 mm 6.47 mm Target eIoni + 0 -539 mum 1.71 mm -2.43 m 6.96 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.7 mm 1.09 mm -2.43 m 1.81 MeV 4.78 MeV 3.56 mm 3.56 mm Target eBrem + 2 -3.79 mm 1.21 mm -2.43 m 269 keV 348 keV 303 mum 3.86 mm Target eBrem + 3 -3.79 mm 1.21 mm -2.43 m 0 eV 269 keV 127 mum 3.99 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 154, Parent ID = 144 +* G4Track Information: Particle = gamma, Track ID = 154, Parent ID = 141 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.26 mm -5.51 mm -2.41 m 1.5 MeV 0 eV 0 fm 0 fm Target initStep - 1 2.5 cm 2.02 cm -2.41 m 1.5 MeV 0 eV 3.47 cm 3.47 cm Target Transportation - 2 2.24 m 2.52 m -2.91 m 1.5 MeV 0 eV 3.37 m 3.41 m OutOfWorld Transportation + 0 -3.79 mm 1.21 mm -2.43 m 1.19 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.1 cm -349 mum -2.41 m 992 keV 0 eV 1.7 cm 1.7 cm Target compt + 2 -2.39 cm -8.93 mm -2.4 m 992 keV 0 eV 2.15 cm 3.85 cm Target Transportation + 3 -2.4 m -1.59 m 34.2 cm 992 keV 0 eV 3.96 m 4 m Tracker Transportation + 4 -2.91 m -1.93 m 93.1 cm 992 keV 0 eV 84.9 cm 4.85 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 153, Parent ID = 144 +* G4Track Information: Particle = e-, Track ID = 155, Parent ID = 154 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.54 mm -5.32 mm -2.41 m 1.05 MeV 0 eV 0 fm 0 fm Target initStep - 1 1.27 cm -9.04 mm -2.4 m 1.05 MeV 0 eV 1.51 cm 1.51 cm Target Transportation - 2 2.4 m -80.8 cm -36.8 cm 1.05 MeV 0 eV 3.24 m 3.25 m Tracker Transportation - 3 2.91 m -97.9 cm 6.63 cm 1.05 MeV 0 eV 69.1 cm 3.94 m OutOfWorld Transportation + 0 -1.1 cm -349 mum -2.41 m 197 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.09 cm -346 mum -2.41 m 0 eV 197 keV 79.6 mum 79.6 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 152, Parent ID = 144 +* G4Track Information: Particle = gamma, Track ID = 153, Parent ID = 141 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.54 mm -3.88 mm -2.41 m 1.05 MeV 0 eV 0 fm 0 fm Target initStep - 1 8.82 mm -5.29 mm -2.4 m 824 keV 0 eV 1.1 cm 1.1 cm Target compt - 2 1.04 cm -7.52 mm -2.4 m 824 keV 0 eV 3.68 mm 1.47 cm Target Transportation - 3 1.7 m -2.4 m 25.4 cm 824 keV 0 eV 3.95 m 3.97 m Tracker Transportation - 4 2.06 m -2.91 m 82 cm 824 keV 0 eV 84.2 cm 4.81 m OutOfWorld Transportation + 0 -3.7 mm 1.09 mm -2.43 m 380 keV 0 eV 0 fm 0 fm Target initStep + 1 -1 cm -1.37 mm -2.43 m 0 eV 88 keV 7.47 mm 7.47 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 155, Parent ID = 152 +* G4Track Information: Particle = e-, Track ID = 156, Parent ID = 153 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 8.82 mm -5.29 mm -2.4 m 227 keV 0 eV 0 fm 0 fm Target initStep - 1 8.82 mm -5.29 mm -2.4 m 0 eV 227 keV 98.9 mum 98.9 mum Target eIoni + 0 -1 cm -1.37 mm -2.43 m 292 keV 0 eV 0 fm 0 fm Target initStep + 1 -1 cm -1.37 mm -2.43 m 0 eV 292 keV 143 mum 143 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 151, Parent ID = 144 +* G4Track Information: Particle = gamma, Track ID = 111, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.44 mm -3.75 mm -2.41 m 2.76 MeV 0 eV 0 fm 0 fm Target initStep - 1 7.57 mm -1.33 cm -2.41 m 0 eV 0 eV 1.18 cm 1.18 cm Target conv + 0 -571 mum 1.43 mm -2.43 m 2.15 MeV 0 eV 0 fm 0 fm Target initStep + 1 -624 mum 1.68 mm -2.43 m 0 eV 0 eV 6.31 mm 6.31 mm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 157, Parent ID = 151 +* G4Track Information: Particle = e+, Track ID = 158, Parent ID = 111 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.57 mm -1.33 cm -2.41 m 615 keV 0 eV 0 fm 0 fm Target initStep - 1 7.58 mm -1.33 cm -2.41 m 0 eV 615 keV 398 mum 398 mum Target eIoni - 2 7.58 mm -1.33 cm -2.41 m 0 eV 0 eV 0 fm 398 mum Target annihil + 0 -624 mum 1.68 mm -2.43 m 920 keV 0 eV 0 fm 0 fm Target initStep + 1 -613 mum 1.72 mm -2.43 m 0 eV 920 keV 661 mum 661 mum Target eIoni + 2 -613 mum 1.72 mm -2.43 m 0 eV 0 eV 0 fm 661 mum Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 159, Parent ID = 157 +* G4Track Information: Particle = gamma, Track ID = 160, Parent ID = 158 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.58 mm -1.33 cm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 7.01 mm -1.54 cm -2.41 m 375 keV 0 eV 6.23 mm 6.23 mm Target compt - 2 9.01 mm -1.86 cm -2.41 m 314 keV 0 eV 4.16 mm 1.04 cm Target compt - 3 8.98 mm -2.04 cm -2.42 m 157 keV 0 eV 4.18 mm 1.46 cm Target compt - 4 8.98 mm -2.04 cm -2.42 m 0 eV 88 keV 18.6 mum 1.46 cm Target phot + 0 -613 mum 1.72 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.37 mm 4.27 mm -2.43 m 338 keV 0 eV 9.39 mm 9.39 mm Target compt + 2 -1.41 cm 2.22 mm -2.43 m 0 eV 88 keV 6.21 mm 1.56 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 162, Parent ID = 160 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.41 cm 2.22 mm -2.43 m 250 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.41 cm 2.23 mm -2.43 m 0 eV 250 keV 114 mum 114 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 161, Parent ID = 160 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.37 mm 4.27 mm -2.43 m 173 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.38 mm 4.27 mm -2.43 m 0 eV 173 keV 65.8 mum 65.8 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 159, Parent ID = 158 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -613 mum 1.72 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -230 mum 1.61 mm -2.43 m 178 keV 0 eV 410 mum 410 mum Target compt + 2 -1.04 mm 2.43 mm -2.43 m 0 eV 88 keV 1.17 mm 1.58 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 164, Parent ID = 159 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.04 mm 2.43 mm -2.43 m 89.9 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.04 mm 2.43 mm -2.43 m 0 eV 89.9 keV 23.4 mum 23.4 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 163, Parent ID = 159 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 8.98 mm -2.04 cm -2.42 m 68.8 keV 0 eV 0 fm 0 fm Target initStep - 1 8.98 mm -2.04 cm -2.42 m 0 eV 68.8 keV 15.1 mum 15.1 mum Target eIoni + 0 -230 mum 1.61 mm -2.43 m 333 keV 0 eV 0 fm 0 fm Target initStep + 1 -220 mum 1.6 mm -2.43 m 0 eV 333 keV 173 mum 173 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 162, Parent ID = 159 +* G4Track Information: Particle = e-, Track ID = 157, Parent ID = 111 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 8.98 mm -2.04 cm -2.42 m 157 keV 0 eV 0 fm 0 fm Target initStep - 1 8.98 mm -2.04 cm -2.42 m 0 eV 157 keV 56.4 mum 56.4 mum Target eIoni + 0 -624 mum 1.68 mm -2.43 m 208 keV 0 eV 0 fm 0 fm Target initStep + 1 -625 mum 1.67 mm -2.43 m 0 eV 208 keV 86.5 mum 86.5 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 161, Parent ID = 159 +* G4Track Information: Particle = gamma, Track ID = 110, Parent ID = 109 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 9.01 mm -1.86 cm -2.41 m 61 keV 0 eV 0 fm 0 fm Target initStep - 1 9.01 mm -1.86 cm -2.41 m 0 eV 61 keV 12.4 mum 12.4 mum Target eIoni + 0 -586 mum 1.36 mm -2.44 m 1.53 MeV 0 eV 0 fm 0 fm Target initStep + 1 -640 mum 1.48 mm -2.43 m 1.24 MeV 0 eV 2.67 mm 2.67 mm Target compt + 2 -1.42 mm -409 mum -2.43 m 1.2 MeV 0 eV 5.76 mm 8.43 mm Target compt + 3 -1.46 mm -4.82 mm -2.41 m 0 eV 88 keV 1.94 cm 2.78 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 160, Parent ID = 159 +* G4Track Information: Particle = e-, Track ID = 167, Parent ID = 110 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.01 mm -1.54 cm -2.41 m 136 keV 0 eV 0 fm 0 fm Target initStep - 1 7.01 mm -1.54 cm -2.41 m 0 eV 136 keV 45.2 mum 45.2 mum Target eIoni + 0 -1.46 mm -4.82 mm -2.41 m 1.11 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.45 mm -4.84 mm -2.41 m 0 eV 1.11 MeV 813 mum 813 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 158, Parent ID = 157 +* G4Track Information: Particle = e-, Track ID = 166, Parent ID = 110 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.58 mm -1.33 cm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 7.74 mm -1.27 cm -2.41 m 0 eV 88 keV 1.78 mm 1.78 mm Target phot + 0 -1.42 mm -409 mum -2.43 m 42.4 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.42 mm -409 mum -2.43 m 0 eV 42.4 keV 6.87 mum 6.87 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 164, Parent ID = 158 +* G4Track Information: Particle = e-, Track ID = 165, Parent ID = 110 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.74 mm -1.27 cm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 7.73 mm -1.27 cm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 -640 mum 1.48 mm -2.43 m 292 keV 0 eV 0 fm 0 fm Target initStep + 1 -638 mum 1.49 mm -2.43 m 0 eV 292 keV 144 mum 144 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 156, Parent ID = 151 +* G4Track Information: Particle = e-, Track ID = 108, Parent ID = 3 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.57 mm -1.33 cm -2.41 m 1.13 MeV 0 eV 0 fm 0 fm Target initStep - 1 7.6 mm -1.33 cm -2.41 m 0 eV 1.13 MeV 827 mum 827 mum Target eIoni + 0 -580 mum 1.32 mm -2.44 m 66.6 MeV 0 eV 0 fm 0 fm Target initStep + 1 -512 mum 1.45 mm -2.43 m 63.8 MeV 2.01 MeV 1.35 mm 1.35 mm Target eBrem + 2 -660 mum 2.22 mm -2.43 m 3.28 MeV 5.36 MeV 2.57 mm 3.92 mm Target eBrem + 3 -644 mum 2.22 mm -2.43 m 2.52 MeV 186 keV 52.2 mum 3.97 mm Target eBrem + 4 -544 mum 2.28 mm -2.43 m 0 eV 2.52 MeV 1.98 mm 5.95 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 118, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 170, Parent ID = 108 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -906 mum 1.46 mm -2.44 m 2.12 MeV 0 eV 0 fm 0 fm Target initStep - 1 5.17 mm 683 mum -2.4 m 2.12 MeV 0 eV 3.9 cm 3.9 cm Target Transportation - 2 13.1 cm -1.56 cm -1.6 m 2.12 MeV 0 eV 81 cm 84.9 cm Tracker Transportation - 3 16.3 cm -1.96 cm -1.4 m 2.12 MeV 0 eV 20.3 cm 1.05 m Chamber Transportation - 4 25.8 cm -3.18 cm -80 cm 2.12 MeV 0 eV 60.8 cm 1.66 m Tracker Transportation - 5 28.9 cm -3.59 cm -60 cm 2.12 MeV 0 eV 20.3 cm 1.86 m Chamber Transportation - 6 38.4 cm -4.8 cm 0 fm 2.12 MeV 0 eV 60.8 cm 2.47 m Tracker Transportation - 7 41.6 cm -5.21 cm 20 cm 2.12 MeV 0 eV 20.3 cm 2.67 m Chamber Transportation - 8 51 cm -6.43 cm 80 cm 2.12 MeV 0 eV 60.8 cm 3.28 m Tracker Transportation - 9 54.2 cm -6.83 cm 1 m 2.12 MeV 0 eV 20.3 cm 3.48 m Chamber Transportation - 10 63.7 cm -8.05 cm 1.6 m 2.12 MeV 0 eV 60.8 cm 4.09 m Tracker Transportation - 11 66.8 cm -8.46 cm 1.8 m 2.12 MeV 0 eV 20.3 cm 4.29 m Chamber Transportation - 12 76.3 cm -9.67 cm 2.4 m 2.12 MeV 0 eV 60.8 cm 4.9 m Tracker Transportation - 13 84.3 cm -10.7 cm 2.91 m 2.12 MeV 0 eV 51.6 cm 5.42 m OutOfWorld Transportation + 0 -644 mum 2.22 mm -2.43 m 577 keV 0 eV 0 fm 0 fm Target initStep + 1 2.86 mm 3.74 mm -2.43 m 0 eV 88 keV 7.55 mm 7.55 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 117, Parent ID = 112 +* G4Track Information: Particle = e-, Track ID = 171, Parent ID = 170 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -923 mum 1.44 mm -2.44 m 5.78 MeV 0 eV 0 fm 0 fm Target initStep - 1 -584 mum 1.27 mm -2.43 m 0 eV 0 eV 5.77 mm 5.77 mm Target conv + 0 2.86 mm 3.74 mm -2.43 m 489 keV 0 eV 0 fm 0 fm Target initStep + 1 2.88 mm 3.74 mm -2.43 m 0 eV 489 keV 293 mum 293 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 166, Parent ID = 117 +* G4Track Information: Particle = gamma, Track ID = 169, Parent ID = 108 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -584 mum 1.27 mm -2.43 m 3.29 MeV 0 eV 0 fm 0 fm Target initStep - 1 -138 mum 1.16 mm -2.43 m 1.09 MeV 1.55 MeV 1.32 mm 1.32 mm Target eBrem - 2 -104 mum 1.19 mm -2.43 m 0 eV 1.09 MeV 809 mum 2.13 mm Target eIoni - 3 -104 mum 1.19 mm -2.43 m 0 eV 0 eV 0 fm 2.13 mm Target annihil + 0 -660 mum 2.22 mm -2.43 m 55.1 MeV 0 eV 0 fm 0 fm Target initStep + 1 241 mum 5.19 mm -2.42 m 0 eV 0 eV 1.55 cm 1.55 cm Target conv ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 169, Parent ID = 166 +* G4Track Information: Particle = e+, Track ID = 173, Parent ID = 169 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -104 mum 1.19 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.14 mm -2.81 mm -2.44 m 0 eV 88 keV 9.7 mm 9.7 mm Target phot + 0 241 mum 5.19 mm -2.42 m 28.7 MeV 0 eV 0 fm 0 fm Target initStep + 1 413 mum 5.92 mm -2.42 m 26.1 MeV 2 MeV 1.8 mm 1.8 mm Target eBrem + 2 451 mum 5.99 mm -2.42 m 21.3 MeV 233 keV 183 mum 1.98 mm Target eBrem + 3 561 mum 6.5 mm -2.41 m 16.4 MeV 1.32 MeV 978 mum 2.96 mm Target eBrem + 4 757 mum 6.59 mm -2.41 m 14.5 MeV 350 keV 368 mum 3.33 mm Target eBrem + 5 1.68 mm 7.46 mm -2.41 m 12.3 MeV 1.93 MeV 1.67 mm 4.99 mm Target eBrem + 6 1.7 mm 7.55 mm -2.41 m 10.5 MeV 255 keV 176 mum 5.17 mm Target eBrem + 7 2.18 mm 8.05 mm -2.41 m 9.23 MeV 1.32 MeV 900 mum 6.07 mm Target eBrem + 8 2.18 mm 8.05 mm -2.41 m 7.59 MeV 6.36 keV 5.27 mum 6.08 mm Target eBrem + 9 812 mum 7.68 mm -2.41 m 1.89 MeV 5.38 MeV 3.68 mm 9.76 mm Target eBrem + 10 755 mum 7.62 mm -2.41 m 1.42 MeV 90.9 keV 111 mum 9.87 mm Target eBrem + 11 682 mum 7.6 mm -2.41 m 0 eV 1.42 MeV 1.09 mm 1.1 cm Target eIoni + 12 682 mum 7.6 mm -2.41 m 0 eV 0 eV 0 fm 1.1 cm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 170, Parent ID = 169 +* G4Track Information: Particle = gamma, Track ID = 184, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.14 mm -2.81 mm -2.44 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.15 mm -2.83 mm -2.44 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 168, Parent ID = 166 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -104 mum 1.19 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 3.9 mm 5.17 mm -2.43 m 452 keV 0 eV 9.63 mm 9.63 mm Target compt - 2 1.22 cm 5.2 mm -2.42 m 224 keV 0 eV 1.17 cm 2.13 cm Target compt - 3 1.22 cm 5.21 mm -2.42 m 0 eV 88 keV 5.44 mum 2.13 cm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 173, Parent ID = 168 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.22 cm 5.21 mm -2.42 m 136 keV 0 eV 0 fm 0 fm Target initStep - 1 1.22 cm 5.21 mm -2.42 m 0 eV 136 keV 45 mum 45 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 172, Parent ID = 168 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.22 cm 5.2 mm -2.42 m 228 keV 0 eV 0 fm 0 fm Target initStep - 1 1.22 cm 5.2 mm -2.42 m 0 eV 228 keV 99.7 mum 99.7 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 171, Parent ID = 168 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.9 mm 5.17 mm -2.43 m 59.3 keV 0 eV 0 fm 0 fm Target initStep - 1 3.9 mm 5.17 mm -2.43 m 0 eV 59.3 keV 11.9 mum 11.9 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 167, Parent ID = 166 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -138 mum 1.16 mm -2.43 m 656 keV 0 eV 0 fm 0 fm Target initStep - 1 899 mum 1.95 mm -2.44 m 0 eV 88 keV 2.4 mm 2.4 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 174, Parent ID = 167 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 899 mum 1.95 mm -2.44 m 568 keV 0 eV 0 fm 0 fm Target initStep - 1 911 mum 1.94 mm -2.44 m 0 eV 568 keV 357 mum 357 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 165, Parent ID = 117 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -584 mum 1.27 mm -2.43 m 1.46 MeV 0 eV 0 fm 0 fm Target initStep - 1 -780 mum -269 mum -2.43 m 151 keV 1.31 MeV 1.1 mm 1.1 mm Target eBrem - 2 -782 mum -272 mum -2.43 m 0 eV 151 keV 53.1 mum 1.15 mm Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 116, Parent ID = 112 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -774 mum 1.22 mm -2.44 m 12 MeV 0 eV 0 fm 0 fm Target initStep - 1 -919 mum 3.35 mm -2.43 m 0 eV 0 eV 1.11 cm 1.11 cm Target conv - -********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 176, Parent ID = 116 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -919 mum 3.35 mm -2.43 m 4.39 MeV 0 eV 0 fm 0 fm Target initStep - 1 -990 mum 3.42 mm -2.43 m 2.83 MeV 195 keV 201 mum 201 mum Target eBrem - 2 -1.45 mm 2.31 mm -2.43 m 1.37 MeV 1.47 MeV 1.48 mm 1.68 mm Target eBrem - 3 -1.39 mm 2.34 mm -2.43 m 0 eV 1.37 MeV 1.05 mm 2.73 mm Target eIoni - 4 -1.39 mm 2.34 mm -2.43 m 0 eV 0 eV 0 fm 2.73 mm Target annihil - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 179, Parent ID = 176 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.39 mm 2.34 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.06 mm 1.75 mm -2.43 m 0 eV 88 keV 1.15 mm 1.15 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 180, Parent ID = 179 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.06 mm 1.75 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.07 mm 1.74 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 178, Parent ID = 176 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.39 mm 2.34 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.89 mm 3.22 mm -2.43 m 0 eV 88 keV 1.73 mm 1.73 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 181, Parent ID = 178 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.89 mm 3.22 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.89 mm 3.23 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 177, Parent ID = 176 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -990 mum 3.42 mm -2.43 m 1.36 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.5 cm 2.06 mm -2.41 m 1.36 MeV 0 eV 3.3 cm 3.3 cm Target Transportation - 2 -3.18 cm 1.67 mm -2.4 m 1.36 MeV 0 eV 9.42 mm 4.25 cm World Transportation - 3 -2.4 m -13.3 cm -16.5 cm 1.36 MeV 0 eV 3.26 m 3.3 m Tracker Transportation - 4 -2.91 m -16.2 cm 31.6 cm 1.36 MeV 0 eV 70.2 cm 4 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 175, Parent ID = 116 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -919 mum 3.35 mm -2.43 m 6.57 MeV 0 eV 0 fm 0 fm Target initStep - 1 -914 mum 3.38 mm -2.43 m 4.51 MeV 92.7 keV 71.8 mum 71.8 mum Target eBrem - 2 -842 mum 3.52 mm -2.43 m 3.84 MeV 238 keV 209 mum 280 mum Target eBrem - 3 -946 mum 3.27 mm -2.43 m 1.3 MeV 484 keV 485 mum 766 mum Target eBrem - 4 -988 mum 3.2 mm -2.43 m 0 eV 1.3 MeV 976 mum 1.74 mm Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 184, Parent ID = 175 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -946 mum 3.27 mm -2.43 m 2.06 MeV 0 eV 0 fm 0 fm Target initStep - 1 -6.01 mm -1.35 mm -2.43 m 523 keV 0 eV 6.94 mm 6.94 mm Target compt - 2 -7.39 mm -2.07 mm -2.43 m 0 eV 88 keV 3.59 mm 1.05 cm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 186, Parent ID = 184 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.39 mm -2.07 mm -2.43 m 435 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.4 mm -2.07 mm -2.43 m 0 eV 435 keV 251 mum 251 mum Target eIoni + 0 682 mum 7.6 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.2 cm 6.67 mm -2.42 m 0 eV 88 keV 1.67 cm 1.67 cm Target phot ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 185, Parent ID = 184 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.01 mm -1.35 mm -2.43 m 1.53 MeV 0 eV 0 fm 0 fm Target initStep - 1 -6.27 mm -994 mum -2.43 m 233 keV 934 keV 735 mum 735 mum Target eBrem - 2 -6.27 mm -998 mum -2.43 m 0 eV 233 keV 103 mum 838 mum Target eIoni + 0 1.2 cm 6.67 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 1.2 cm 6.67 mm -2.42 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 187, Parent ID = 185 +* G4Track Information: Particle = gamma, Track ID = 183, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -6.27 mm -994 mum -2.43 m 365 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.17 mm -2.68 mm -2.43 m 0 eV 88 keV 4.01 mm 4.01 mm Target phot + 0 682 mum 7.6 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.1 mm 7.82 mm -2.41 m 0 eV 88 keV 4.12 mm 4.12 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 188, Parent ID = 187 +* G4Track Information: Particle = e-, Track ID = 186, Parent ID = 183 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.17 mm -2.68 mm -2.43 m 277 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.17 mm -2.68 mm -2.43 m 0 eV 277 keV 133 mum 133 mum Target eIoni + 0 -2.1 mm 7.82 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.12 mm 7.82 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 183, Parent ID = 175 +* G4Track Information: Particle = gamma, Track ID = 182, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -842 mum 3.52 mm -2.43 m 432 keV 0 eV 0 fm 0 fm Target initStep - 1 3.25 mm 856 mum -2.42 m 244 keV 0 eV 9.82 mm 9.82 mm Target compt - 2 3.49 mm 310 mum -2.42 m 0 eV 88 keV 639 mum 1.05 cm Target phot + 0 755 mum 7.62 mm -2.41 m 383 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.84 mm 6.58 mm -2.41 m 0 eV 88 keV 3.46 mm 3.46 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 190, Parent ID = 183 +* G4Track Information: Particle = e-, Track ID = 187, Parent ID = 182 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.49 mm 310 mum -2.42 m 156 keV 0 eV 0 fm 0 fm Target initStep - 1 3.49 mm 308 mum -2.42 m 0 eV 156 keV 55.7 mum 55.7 mum Target eIoni + 0 -1.84 mm 6.58 mm -2.41 m 295 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.84 mm 6.58 mm -2.41 m 0 eV 295 keV 145 mum 145 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 189, Parent ID = 183 +* G4Track Information: Particle = gamma, Track ID = 181, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.25 mm 856 mum -2.42 m 188 keV 0 eV 0 fm 0 fm Target initStep - 1 3.25 mm 856 mum -2.42 m 0 eV 188 keV 74.4 mum 74.4 mum Target eIoni + 0 812 mum 7.68 mm -2.41 m 321 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.41 mm 3.83 mm -2.42 m 0 eV 88 keV 1.35 cm 1.35 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 182, Parent ID = 175 +* G4Track Information: Particle = e-, Track ID = 188, Parent ID = 181 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -914 mum 3.38 mm -2.43 m 1.96 MeV 0 eV 0 fm 0 fm Target initStep - 1 -861 mum 7.34 mm -2.42 m 294 keV 0 eV 9.1 mm 9.1 mm Target compt - 2 -356 mum 7.7 mm -2.42 m 0 eV 88 keV 904 mum 1 cm Target phot + 0 -8.41 mm 3.83 mm -2.42 m 233 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.42 mm 3.83 mm -2.42 m 0 eV 233 keV 103 mum 103 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 192, Parent ID = 182 +* G4Track Information: Particle = gamma, Track ID = 180, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -356 mum 7.7 mm -2.42 m 206 keV 0 eV 0 fm 0 fm Target initStep - 1 -351 mum 7.7 mm -2.42 m 0 eV 206 keV 85.2 mum 85.2 mum Target eIoni + 0 2.18 mm 8.05 mm -2.41 m 1.63 MeV 0 eV 0 fm 0 fm Target initStep + 1 7.07 mm 9.65 mm -2.4 m 844 keV 0 eV 1.22 cm 1.22 cm Target compt + 2 6.83 mm 8.98 mm -2.4 m 844 keV 0 eV 1.67 mm 1.39 cm Target Transportation + 3 -37.5 cm -1.06 m 0 fm 844 keV 0 eV 2.66 m 2.67 m Tracker Transportation + 4 -39 cm -1.1 m 9.76 cm 844 keV 0 eV 10.8 cm 2.78 m Chamber Transportation + 5 -50.2 cm -1.42 m 80 cm 844 keV 0 eV 77.7 cm 3.55 m Tracker Transportation + 6 -53.4 cm -1.51 m 1 m 844 keV 0 eV 22.1 cm 3.78 m Chamber Transportation + 7 -62.9 cm -1.77 m 1.6 m 844 keV 0 eV 66.4 cm 4.44 m Tracker Transportation + 8 -66.1 cm -1.86 m 1.8 m 844 keV 0 eV 22.1 cm 4.66 m Chamber Transportation + 9 -75.6 cm -2.13 m 2.4 m 844 keV 0 eV 66.4 cm 5.32 m Tracker Transportation + 10 -83.7 cm -2.36 m 2.91 m 844 keV 0 eV 56.4 cm 5.89 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 191, Parent ID = 182 +* G4Track Information: Particle = e-, Track ID = 189, Parent ID = 180 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -861 mum 7.34 mm -2.42 m 1.67 MeV 0 eV 0 fm 0 fm Target initStep - 1 -870 mum 7.39 mm -2.42 m 0 eV 1.67 MeV 1.28 mm 1.28 mm Target eIoni + 0 7.07 mm 9.65 mm -2.4 m 782 keV 0 eV 0 fm 0 fm Target initStep + 1 7.1 mm 9.67 mm -2.4 m 0 eV 782 keV 536 mum 536 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 115, Parent ID = 112 +* G4Track Information: Particle = gamma, Track ID = 179, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -591 mum 1.11 mm -2.44 m 7.53 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.14 mm 3.23 mm -2.43 m 4.24 MeV 0 eV 1.63 cm 1.63 cm Target compt - 2 -3.62 mm 1.57 cm -2.4 m 4.24 MeV 0 eV 2.85 cm 4.48 cm Target Transportation - 3 -39.3 cm 1.96 m 1.6 m 4.24 MeV 0 eV 4.47 m 4.51 m Tracker Transportation - 4 -39.4 cm 1.97 m 1.61 m 4.24 MeV 0 eV 1.27 cm 4.52 m Chamber Transportation - 5 -47 cm 2.35 m 2.4 m 4.24 MeV 0 eV 88 cm 5.4 m Tracker Transportation - 6 -52 cm 2.6 m 2.91 m 4.24 MeV 0 eV 56.9 cm 5.97 m OutOfWorld Transportation + 0 1.7 mm 7.55 mm -2.41 m 1.45 MeV 0 eV 0 fm 0 fm Target initStep + 1 6.5 mm 1.07 cm -2.4 m 228 keV 0 eV 1 cm 1 cm Target compt + 2 6.4 mm 1.05 cm -2.41 m 0 eV 88 keV 1.25 mm 1.13 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 193, Parent ID = 115 +* G4Track Information: Particle = e-, Track ID = 191, Parent ID = 179 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.14 mm 3.23 mm -2.43 m 3.29 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.05 mm 3.2 mm -2.43 m 1.1 MeV 175 keV 179 mum 179 mum Target eBrem - 2 -1.1 mm 3.25 mm -2.43 m 0 eV 1.1 MeV 803 mum 982 mum Target eIoni + 0 6.4 mm 1.05 cm -2.41 m 140 keV 0 eV 0 fm 0 fm Target initStep + 1 6.4 mm 1.05 cm -2.41 m 0 eV 140 keV 47.4 mum 47.4 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 194, Parent ID = 193 +* G4Track Information: Particle = e-, Track ID = 190, Parent ID = 179 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.05 mm 3.2 mm -2.43 m 2.02 MeV 0 eV 0 fm 0 fm Target initStep - 1 -8.78 mm 8.17 mm -2.42 m 567 keV 0 eV 9.46 mm 9.46 mm Target compt - 2 -8.93 mm 8.09 mm -2.42 m 0 eV 88 keV 180 mum 9.64 mm Target phot + 0 6.5 mm 1.07 cm -2.4 m 1.22 MeV 0 eV 0 fm 0 fm Target initStep + 1 6.53 mm 1.07 cm -2.4 m 0 eV 1.22 MeV 910 mum 910 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 196, Parent ID = 194 +* G4Track Information: Particle = gamma, Track ID = 178, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -8.93 mm 8.09 mm -2.42 m 479 keV 0 eV 0 fm 0 fm Target initStep - 1 -8.94 mm 8.08 mm -2.42 m 0 eV 479 keV 285 mum 285 mum Target eIoni + 0 1.68 mm 7.46 mm -2.41 m 288 keV 0 eV 0 fm 0 fm Target initStep + 1 1.93 mm 7.95 mm -2.41 m 171 keV 0 eV 894 mum 894 mum Target compt + 2 1.45 mm 8.03 mm -2.41 m 0 eV 88 keV 490 mum 1.38 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 195, Parent ID = 194 +* G4Track Information: Particle = e-, Track ID = 193, Parent ID = 178 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -8.78 mm 8.17 mm -2.42 m 1.45 MeV 0 eV 0 fm 0 fm Target initStep - 1 -8.84 mm 8.24 mm -2.42 m 0 eV 1.45 MeV 1.1 mm 1.1 mm Target eIoni + 0 1.45 mm 8.03 mm -2.41 m 82.6 keV 0 eV 0 fm 0 fm Target initStep + 1 1.45 mm 8.03 mm -2.41 m 0 eV 82.6 keV 20.3 mum 20.3 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 114, Parent ID = 112 +* G4Track Information: Particle = e-, Track ID = 192, Parent ID = 178 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -583 mum 1.09 mm -2.44 m 18.5 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.24 mm 5.94 mm -2.41 m 0 eV 0 eV 3.35 cm 3.35 cm Target conv + 0 1.93 mm 7.95 mm -2.41 m 117 keV 0 eV 0 fm 0 fm Target initStep + 1 1.93 mm 7.95 mm -2.41 m 0 eV 117 keV 35.8 mum 35.8 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 198, Parent ID = 114 +* G4Track Information: Particle = gamma, Track ID = 177, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.24 mm 5.94 mm -2.41 m 8.69 MeV 0 eV 0 fm 0 fm Target initStep - 1 -3.41 mm 6.33 mm -2.41 m 4.88 MeV 1.96 MeV 1.82 mm 1.82 mm Target eBrem - 2 -4.34 mm 8.01 mm -2.41 m 1.73 MeV 3.15 MeV 1.33 mm 3.15 mm Target eBrem - 3 -3.72 mm 8.21 mm -2.41 m 738 keV 988 keV 830 mum 3.98 mm Target eBrem - 4 -3.73 mm 8.21 mm -2.41 m 0 eV 738 keV 503 mum 4.49 mm Target eIoni - 5 -3.73 mm 8.21 mm -2.41 m 0 eV 0 eV 0 fm 4.49 mm Target annihil + 0 757 mum 6.59 mm -2.41 m 1.53 MeV 0 eV 0 fm 0 fm Target initStep + 1 5.64 mm 1.16 cm -2.4 m 1.53 MeV 0 eV 1.59 cm 1.59 cm Target Transportation + 2 55.4 cm 56.9 cm -80 cm 1.53 MeV 0 eV 1.78 m 1.8 m Tracker Transportation + 3 62.2 cm 63.8 cm -60 cm 1.53 MeV 0 eV 22.3 cm 2.02 m Chamber Transportation + 4 82.8 cm 84.7 cm 0 fm 1.53 MeV 0 eV 66.8 cm 2.69 m Tracker Transportation + 5 89.6 cm 91.7 cm 20 cm 1.53 MeV 0 eV 22.3 cm 2.91 m Chamber Transportation + 6 1.1 m 1.13 m 80 cm 1.53 MeV 0 eV 66.8 cm 3.58 m Tracker Transportation + 7 1.17 m 1.2 m 1 m 1.53 MeV 0 eV 22.3 cm 3.8 m Chamber Transportation + 8 1.38 m 1.4 m 1.6 m 1.53 MeV 0 eV 66.8 cm 4.47 m Tracker Transportation + 9 1.44 m 1.47 m 1.8 m 1.53 MeV 0 eV 22.3 cm 4.69 m Chamber Transportation + 10 1.65 m 1.68 m 2.4 m 1.53 MeV 0 eV 66.8 cm 5.36 m Tracker Transportation + 11 1.82 m 1.86 m 2.91 m 1.53 MeV 0 eV 56.8 cm 5.93 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 201, Parent ID = 198 +* G4Track Information: Particle = gamma, Track ID = 176, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.73 mm 8.21 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.66 mm 8.21 mm -2.41 m 0 eV 88 keV 162 mum 162 mum Target phot + 0 561 mum 6.5 mm -2.41 m 3.58 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.98 mm 8.59 mm -2.41 m 0 eV 0 eV 5.74 mm 5.74 mm Target conv ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 202, Parent ID = 201 +* G4Track Information: Particle = e+, Track ID = 195, Parent ID = 176 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.66 mm 8.21 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.66 mm 8.21 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + 0 2.98 mm 8.59 mm -2.41 m 322 keV 0 eV 0 fm 0 fm Target initStep + 1 2.98 mm 8.59 mm -2.41 m 0 eV 322 keV 162 mum 162 mum Target eIoni + 2 2.98 mm 8.59 mm -2.41 m 0 eV 0 eV 0 fm 162 mum Target annihil ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 200, Parent ID = 198 +* G4Track Information: Particle = gamma, Track ID = 197, Parent ID = 195 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.73 mm 8.21 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -7.45 mm 8.26 mm -2.4 m 511 keV 0 eV 8.62 mm 8.62 mm Target Transportation - 2 -1.92 m 3.23 cm 1.6 m 511 keV 0 eV 4.43 m 4.44 m Tracker Transportation - 3 -1.97 m 3.29 cm 1.7 m 511 keV 0 eV 11.2 cm 4.55 m Chamber Transportation - 4 -2.3 m 3.71 cm 2.4 m 511 keV 0 eV 77.5 cm 5.33 m Tracker Transportation - 5 -2.55 m 4.01 cm 2.91 m 511 keV 0 eV 56.5 cm 5.89 m OutOfWorld Transportation + 0 2.98 mm 8.59 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.23 mm 8.42 mm -2.41 m 0 eV 88 keV 4.95 mm 4.95 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 199, Parent ID = 198 +* G4Track Information: Particle = e-, Track ID = 198, Parent ID = 197 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.41 mm 6.33 mm -2.41 m 1.85 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.18 mm 1.37 cm -2.4 m 0 eV 88 keV 9.89 mm 9.89 mm Target phot + 0 -1.23 mm 8.42 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.24 mm 8.43 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 203, Parent ID = 199 +* G4Track Information: Particle = gamma, Track ID = 196, Parent ID = 195 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.18 mm 1.37 cm -2.4 m 1.76 MeV 0 eV 0 fm 0 fm Target initStep - 1 -908 mum 1.37 cm -2.4 m 1.04 MeV 340 keV 424 mum 424 mum Target eBrem - 2 -941 mum 1.38 cm -2.4 m 0 eV 1.04 MeV 755 mum 1.18 mm Target eIoni + 0 2.98 mm 8.59 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 8.81 mm 8.82 mm -2.41 m 0 eV 88 keV 6.86 mm 6.86 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 204, Parent ID = 203 +* G4Track Information: Particle = e-, Track ID = 199, Parent ID = 196 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -908 mum 1.37 cm -2.4 m 379 keV 0 eV 0 fm 0 fm Target initStep - 1 -920 mum 1.38 cm -2.4 m 0 eV 88 keV 48.5 mum 48.5 mum Target phot + 0 8.81 mm 8.82 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 8.81 mm 8.81 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 205, Parent ID = 204 +* G4Track Information: Particle = e-, Track ID = 194, Parent ID = 176 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -920 mum 1.38 cm -2.4 m 291 keV 0 eV 0 fm 0 fm Target initStep - 1 -926 mum 1.38 cm -2.4 m 0 eV 291 keV 143 mum 143 mum Target eIoni + 0 2.98 mm 8.59 mm -2.41 m 2.24 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.77 mm 8.98 mm -2.41 m 733 keV 746 keV 686 mum 686 mum Target eBrem + 2 2.8 mm 8.97 mm -2.41 m 0 eV 733 keV 495 mum 1.18 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 197, Parent ID = 114 +* G4Track Information: Particle = gamma, Track ID = 200, Parent ID = 194 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.24 mm 5.94 mm -2.41 m 8.8 MeV 0 eV 0 fm 0 fm Target initStep - 1 -2.28 mm 6.06 mm -2.41 m 8.17 MeV 351 keV 295 mum 295 mum Target eBrem - 2 -2.17 mm 6.04 mm -2.41 m 7.19 MeV 309 keV 263 mum 558 mum Target eBrem - 3 2.78 mm 6.56 mm -2.41 m 1.87 MeV 4.83 MeV 4.12 mm 4.68 mm Target eBrem - 4 2.79 mm 6.57 mm -2.41 m 1.44 MeV 10.1 keV 12.4 mum 4.69 mm Target eBrem - 5 2.86 mm 6.64 mm -2.41 m 0 eV 1.44 MeV 1.09 mm 5.78 mm Target eIoni + 0 2.77 mm 8.98 mm -2.41 m 761 keV 0 eV 0 fm 0 fm Target initStep + 1 2.89 mm 8.91 mm -2.41 m 702 keV 0 eV 136 mum 136 mum Target compt + 2 8.52 mm 7.85 mm -2.41 m 255 keV 0 eV 5.82 mm 5.95 mm Target compt + 3 8.51 mm 7.92 mm -2.41 m 0 eV 88 keV 71.1 mum 6.03 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 209, Parent ID = 197 +* G4Track Information: Particle = e-, Track ID = 203, Parent ID = 200 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.79 mm 6.57 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 4.11 mm 7.95 mm -2.41 m 198 keV 0 eV 2.11 mm 2.11 mm Target compt - 2 3.51 mm 7.99 mm -2.41 m 0 eV 88 keV 649 mum 2.76 mm Target phot + 0 8.51 mm 7.92 mm -2.41 m 167 keV 0 eV 0 fm 0 fm Target initStep + 1 8.51 mm 7.92 mm -2.41 m 0 eV 167 keV 62.3 mum 62.3 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 211, Parent ID = 209 +* G4Track Information: Particle = e-, Track ID = 202, Parent ID = 200 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 3.51 mm 7.99 mm -2.41 m 110 keV 0 eV 0 fm 0 fm Target initStep - 1 3.51 mm 7.99 mm -2.41 m 0 eV 110 keV 32.2 mum 32.2 mum Target eIoni + 0 8.52 mm 7.85 mm -2.41 m 447 keV 0 eV 0 fm 0 fm Target initStep + 1 8.53 mm 7.84 mm -2.41 m 0 eV 447 keV 260 mum 260 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 210, Parent ID = 209 +* G4Track Information: Particle = e-, Track ID = 201, Parent ID = 200 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 4.11 mm 7.95 mm -2.41 m 225 keV 0 eV 0 fm 0 fm Target initStep - 1 4.12 mm 7.95 mm -2.41 m 0 eV 225 keV 98 mum 98 mum Target eIoni + 0 2.89 mm 8.91 mm -2.41 m 58.8 keV 0 eV 0 fm 0 fm Target initStep + 1 2.89 mm 8.91 mm -2.41 m 0 eV 58.8 keV 11.7 mum 11.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 208, Parent ID = 197 +* G4Track Information: Particle = gamma, Track ID = 175, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.78 mm 6.56 mm -2.41 m 483 keV 0 eV 0 fm 0 fm Target initStep - 1 4.95 mm 8.47 mm -2.41 m 0 eV 88 keV 2.92 mm 2.92 mm Target phot + 0 451 mum 5.99 mm -2.42 m 4.64 MeV 0 eV 0 fm 0 fm Target initStep + 1 5.39 mm 1.4 cm -2.4 m 4.64 MeV 0 eV 1.8 cm 1.8 cm Target Transportation + 2 1.48 m 2.4 m 2.18 m 4.64 MeV 0 eV 5.37 m 5.39 m Tracker Transportation + 3 1.72 m 2.78 m 2.91 m 4.64 MeV 0 eV 85.8 cm 6.25 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 212, Parent ID = 208 +* G4Track Information: Particle = gamma, Track ID = 174, Parent ID = 173 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 4.95 mm 8.47 mm -2.41 m 395 keV 0 eV 0 fm 0 fm Target initStep - 1 4.97 mm 8.47 mm -2.41 m 0 eV 395 keV 219 mum 219 mum Target eIoni + 0 413 mum 5.92 mm -2.42 m 513 keV 0 eV 0 fm 0 fm Target initStep + 1 1.46 mm 7.26 mm -2.41 m 296 keV 0 eV 4.14 mm 4.14 mm Target compt + 2 -1.47 mm 4.33 mm -2.41 m 167 keV 0 eV 5.38 mm 9.53 mm Target compt + 3 -14.1 mum 3.31 mm -2.41 m 0 eV 88 keV 1.88 mm 1.14 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 207, Parent ID = 197 +* G4Track Information: Particle = e-, Track ID = 206, Parent ID = 174 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.17 mm 6.04 mm -2.41 m 674 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.06 mm 6.09 mm -2.41 m 328 keV 0 eV 318 mum 318 mum Target compt - 2 -2.06 mm 8.85 mm -2.41 m 295 keV 0 eV 2.77 mm 3.09 mm Target compt - 3 -898 mum 1.4 cm -2.41 m 0 eV 88 keV 6.05 mm 9.13 mm Target phot + 0 -14.1 mum 3.31 mm -2.41 m 79.2 keV 0 eV 0 fm 0 fm Target initStep + 1 -14.2 mum 3.31 mm -2.41 m 0 eV 79.2 keV 18.9 mum 18.9 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 215, Parent ID = 207 +* G4Track Information: Particle = e-, Track ID = 205, Parent ID = 174 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -898 mum 1.4 cm -2.41 m 207 keV 0 eV 0 fm 0 fm Target initStep - 1 -894 mum 1.4 cm -2.41 m 0 eV 207 keV 86 mum 86 mum Target eIoni + 0 -1.47 mm 4.33 mm -2.41 m 129 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.47 mm 4.33 mm -2.41 m 0 eV 129 keV 41.4 mum 41.4 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 214, Parent ID = 207 +* G4Track Information: Particle = e-, Track ID = 204, Parent ID = 174 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.06 mm 8.85 mm -2.41 m 33.2 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.06 mm 8.85 mm -2.41 m 0 eV 33.2 keV 4.62 mum 4.62 mum Target eIoni + 0 1.46 mm 7.26 mm -2.41 m 217 keV 0 eV 0 fm 0 fm Target initStep + 1 1.46 mm 7.26 mm -2.41 m 0 eV 217 keV 92.7 mum 92.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 213, Parent ID = 207 +* G4Track Information: Particle = e-, Track ID = 172, Parent ID = 169 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.06 mm 6.09 mm -2.41 m 346 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.06 mm 6.08 mm -2.41 m 0 eV 346 keV 182 mum 182 mum Target eIoni + 0 241 mum 5.19 mm -2.42 m 25.5 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.03 mm 5.02 mm -2.41 m 21.9 MeV 3.14 MeV 2.47 mm 2.47 mm Target eBrem + 2 687 mum 4.52 mm -2.41 m 17 MeV 952 keV 781 mum 3.25 mm Target eBrem + 3 672 mum 4.42 mm -2.41 m 15 MeV 267 keV 187 mum 3.43 mm Target eBrem + 4 676 mum 4.38 mm -2.41 m 13.8 MeV 81.5 keV 62.5 mum 3.5 mm Target eBrem + 5 1.04 mm 2.91 mm -2.41 m 10.6 MeV 2.49 MeV 2.13 mm 5.63 mm Target eBrem + 6 2.3 mm 1.67 mm -2.41 m 8.19 MeV 1.85 MeV 1.72 mm 7.34 mm Target eBrem + 7 2.23 mm 1.53 mm -2.41 m 4.64 MeV 319 keV 281 mum 7.62 mm Target eBrem + 8 2.24 mm 1.52 mm -2.41 m 3.23 MeV 114 keV 27.9 mum 7.65 mm Target eBrem + 9 2.29 mm 1.32 mm -2.41 m 0 eV 3.23 MeV 2.54 mm 1.02 cm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 206, Parent ID = 197 +* G4Track Information: Particle = gamma, Track ID = 214, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.28 mm 6.06 mm -2.41 m 285 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.84 mm 6.14 mm -2.41 m 0 eV 88 keV 2.59 mm 2.59 mm Target phot + 0 2.24 mm 1.52 mm -2.41 m 1.3 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.64 mm 212 mum -2.41 m 408 keV 0 eV 2.35 mm 2.35 mm Target compt + 2 3.25 mm 5.55 mm -2.41 m 0 eV 88 keV 7.21 mm 9.56 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 216, Parent ID = 206 +* G4Track Information: Particle = e-, Track ID = 216, Parent ID = 214 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.84 mm 6.14 mm -2.41 m 197 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.84 mm 6.15 mm -2.41 m 0 eV 197 keV 79.9 mum 79.9 mum Target eIoni + 0 3.25 mm 5.55 mm -2.41 m 320 keV 0 eV 0 fm 0 fm Target initStep + 1 3.25 mm 5.56 mm -2.41 m 0 eV 320 keV 163 mum 163 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 113, Parent ID = 112 +* G4Track Information: Particle = e-, Track ID = 215, Parent ID = 214 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -567 mum 1.07 mm -2.44 m 1.58 MeV 0 eV 0 fm 0 fm Target initStep - 1 -1.48 mm 4.09 mm -2.42 m 1.01 MeV 0 eV 2.31 cm 2.31 cm Target compt - 2 -4.48 mm 6 mm -2.42 m 589 keV 0 eV 5.42 mm 2.86 cm Target compt - 3 -2.13 cm 5.63 mm -2.41 m 521 keV 0 eV 1.69 cm 4.55 cm Target compt - 4 -2.5 cm 4.46 mm -2.41 m 521 keV 0 eV 4.05 mm 4.95 cm Target Transportation - 5 -1.8 m -55.2 cm -2.91 m 521 keV 0 eV 1.92 m 1.97 m OutOfWorld Transportation + 0 2.64 mm 212 mum -2.41 m 888 keV 0 eV 0 fm 0 fm Target initStep + 1 2.65 mm 174 mum -2.41 m 0 eV 888 keV 625 mum 625 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 219, Parent ID = 113 +* G4Track Information: Particle = gamma, Track ID = 213, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2.13 cm 5.63 mm -2.41 m 68.3 keV 0 eV 0 fm 0 fm Target initStep - 1 -2.13 cm 5.63 mm -2.41 m 0 eV 68.3 keV 14.9 mum 14.9 mum Target eIoni + 0 2.23 mm 1.53 mm -2.41 m 3.23 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.81 mm 718 mum -2.41 m 331 keV 0 eV 1.85 mm 1.85 mm Target compt + 2 4.43 mm -2.38 mm -2.42 m 187 keV 0 eV 6.16 mm 8.01 mm Target compt + 3 4.53 mm -2.72 mm -2.42 m 0 eV 88 keV 495 mum 8.51 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 218, Parent ID = 113 +* G4Track Information: Particle = e-, Track ID = 219, Parent ID = 213 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -4.48 mm 6 mm -2.42 m 420 keV 0 eV 0 fm 0 fm Target initStep - 1 -4.48 mm 6.01 mm -2.41 m 0 eV 420 keV 239 mum 239 mum Target eIoni + 0 4.53 mm -2.72 mm -2.42 m 99.1 keV 0 eV 0 fm 0 fm Target initStep + 1 4.53 mm -2.72 mm -2.42 m 0 eV 99.1 keV 27.2 mum 27.2 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 217, Parent ID = 113 +* G4Track Information: Particle = e-, Track ID = 218, Parent ID = 213 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.48 mm 4.09 mm -2.42 m 574 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.47 mm 4.09 mm -2.42 m 0 eV 574 keV 362 mum 362 mum Target eIoni + 0 4.43 mm -2.38 mm -2.42 m 144 keV 0 eV 0 fm 0 fm Target initStep + 1 4.44 mm -2.38 mm -2.42 m 0 eV 144 keV 49.2 mum 49.2 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 111, Parent ID = 3 +* G4Track Information: Particle = e-, Track ID = 217, Parent ID = 213 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -527 mum 1.03 mm -2.44 m 24.1 MeV 0 eV 0 fm 0 fm Target initStep - 1 -137 mum 927 mum -2.44 m 20.8 MeV 1.84 MeV 1.54 mm 1.54 mm Target eBrem - 2 -140 mum 875 mum -2.44 m 17.9 MeV 569 keV 521 mum 2.06 mm Target eBrem - 3 -234 mum 610 mum -2.44 m 14.1 MeV 1.48 MeV 762 mum 2.83 mm Target eBrem - 4 -229 mum 80.7 mum -2.44 m 11.3 MeV 1.25 MeV 895 mum 3.72 mm Target eBrem - 5 -94.5 mum -230 mum -2.44 m 10 MeV 932 keV 621 mum 4.34 mm Target eBrem - 6 279 mum -1.53 mm -2.44 m 5.52 MeV 2.84 MeV 1.67 mm 6.01 mm Target eBrem - 7 -14.3 mum -1.47 mm -2.44 m 4.42 MeV 428 keV 422 mum 6.44 mm Target eBrem - 8 25.5 mum -1.53 mm -2.44 m 2.31 MeV 194 keV 203 mum 6.64 mm Target eBrem - 9 6.47 mum -1.63 mm -2.44 m 0 eV 2.31 MeV 1.81 mm 8.45 mm Target eIoni + 0 2.81 mm 718 mum -2.41 m 2.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 3.25 mm 179 mum -2.41 m 853 keV 940 keV 954 mum 954 mum Target eBrem + 2 3.25 mm 166 mum -2.41 m 0 eV 853 keV 595 mum 1.55 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 227, Parent ID = 111 +* G4Track Information: Particle = gamma, Track ID = 220, Parent ID = 217 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 25.5 mum -1.53 mm -2.44 m 1.91 MeV 0 eV 0 fm 0 fm Target initStep - 1 -558 mum -5.72 mm -2.43 m 875 keV 0 eV 9.73 mm 9.73 mm Target compt - 2 -663 mum -6.63 mm -2.43 m 204 keV 0 eV 956 mum 1.07 cm Target compt - 3 -756 mum -6.22 mm -2.43 m 0 eV 88 keV 421 mum 1.11 cm Target phot + 0 3.25 mm 179 mum -2.41 m 1.11 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.07 mm -175 mum -2.41 m 472 keV 0 eV 6.86 mm 6.86 mm Target compt + 2 -4.06 mm 7.01 mm -2.4 m 374 keV 0 eV 9.96 mm 1.68 cm Target compt + 3 -4.04 mm 7.57 mm -2.4 m 0 eV 88 keV 564 mum 1.74 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 230, Parent ID = 227 +* G4Track Information: Particle = e-, Track ID = 223, Parent ID = 220 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -756 mum -6.22 mm -2.43 m 116 keV 0 eV 0 fm 0 fm Target initStep - 1 -756 mum -6.22 mm -2.43 m 0 eV 116 keV 34.9 mum 34.9 mum Target eIoni + 0 -4.04 mm 7.57 mm -2.4 m 286 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.03 mm 7.57 mm -2.4 m 0 eV 286 keV 139 mum 139 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 229, Parent ID = 227 +* G4Track Information: Particle = e-, Track ID = 222, Parent ID = 220 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -663 mum -6.63 mm -2.43 m 671 keV 0 eV 0 fm 0 fm Target initStep - 1 -665 mum -6.66 mm -2.43 m 0 eV 671 keV 443 mum 443 mum Target eIoni + 0 -4.06 mm 7.01 mm -2.4 m 98.2 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.06 mm 7.01 mm -2.4 m 0 eV 98.2 keV 26.8 mum 26.8 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 228, Parent ID = 227 +* G4Track Information: Particle = e-, Track ID = 221, Parent ID = 220 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -558 mum -5.72 mm -2.43 m 1.03 MeV 0 eV 0 fm 0 fm Target initStep - 1 -559 mum -5.72 mm -2.43 m 0 eV 1.03 MeV 749 mum 749 mum Target eIoni + 0 2.07 mm -175 mum -2.41 m 635 keV 0 eV 0 fm 0 fm Target initStep + 1 2.07 mm -187 mum -2.41 m 0 eV 635 keV 412 mum 412 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 226, Parent ID = 111 +* G4Track Information: Particle = gamma, Track ID = 212, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -14.3 mum -1.47 mm -2.44 m 672 keV 0 eV 0 fm 0 fm Target initStep - 1 6.35 mm -775 mum -2.43 m 214 keV 0 eV 1.38 cm 1.38 cm Target compt - 2 6.8 mm -893 mum -2.43 m 0 eV 88 keV 1.12 mm 1.49 cm Target phot + 0 2.3 mm 1.67 mm -2.41 m 520 keV 0 eV 0 fm 0 fm Target initStep + 1 3.4 mm -2.72 mm -2.41 m 0 eV 88 keV 9.88 mm 9.88 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 232, Parent ID = 226 +* G4Track Information: Particle = e-, Track ID = 224, Parent ID = 212 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 6.8 mm -893 mum -2.43 m 126 keV 0 eV 0 fm 0 fm Target initStep - 1 6.8 mm -894 mum -2.43 m 0 eV 126 keV 40.1 mum 40.1 mum Target eIoni + 0 3.4 mm -2.72 mm -2.41 m 432 keV 0 eV 0 fm 0 fm Target initStep + 1 3.4 mm -2.73 mm -2.41 m 0 eV 432 keV 248 mum 248 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 231, Parent ID = 226 +* G4Track Information: Particle = gamma, Track ID = 211, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 6.35 mm -775 mum -2.43 m 458 keV 0 eV 0 fm 0 fm Target initStep - 1 6.36 mm -774 mum -2.43 m 0 eV 458 keV 268 mum 268 mum Target eIoni + 0 1.04 mm 2.91 mm -2.41 m 793 keV 0 eV 0 fm 0 fm Target initStep + 1 5.04 mm -2.47 mm -2.41 m 0 eV 88 keV 8.35 mm 8.35 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 225, Parent ID = 111 +* G4Track Information: Particle = e-, Track ID = 225, Parent ID = 211 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 279 mum -1.53 mm -2.44 m 1.64 MeV 0 eV 0 fm 0 fm Target initStep - 1 -655 mum -1.54 mm -2.43 m 643 keV 0 eV 3.7 mm 3.7 mm Target compt - 2 -1.58 cm -848 mum -2.43 m 0 eV 88 keV 1.58 cm 1.95 cm Target phot + 0 5.04 mm -2.47 mm -2.41 m 705 keV 0 eV 0 fm 0 fm Target initStep + 1 5.05 mm -2.48 mm -2.41 m 0 eV 705 keV 471 mum 471 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 234, Parent ID = 225 +* G4Track Information: Particle = gamma, Track ID = 210, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -1.58 cm -848 mum -2.43 m 555 keV 0 eV 0 fm 0 fm Target initStep - 1 -1.59 cm -775 mum -2.43 m 339 keV 216 keV 203 mum 203 mum Target eBrem - 2 -1.59 cm -769 mum -2.43 m 0 eV 339 keV 177 mum 380 mum Target eIoni + 0 676 mum 4.38 mm -2.41 m 1.11 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.55 mm -4.16 mm -2.4 m 1.11 MeV 0 eV 1.66 cm 1.66 cm Target Transportation + 2 52.9 cm -2.4 m 1.54 m 1.11 MeV 0 eV 4.65 m 4.66 m Tracker Transportation + 3 64.1 cm -2.91 m 2.38 m 1.11 MeV 0 eV 98.9 cm 5.65 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 233, Parent ID = 225 +* G4Track Information: Particle = gamma, Track ID = 209, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -655 mum -1.54 mm -2.43 m 998 keV 0 eV 0 fm 0 fm Target initStep - 1 -647 mum -1.54 mm -2.43 m 0 eV 998 keV 719 mum 719 mum Target eIoni + 0 672 mum 4.42 mm -2.41 m 1.72 MeV 0 eV 0 fm 0 fm Target initStep + 1 885 mum -4.17 mm -2.4 m 995 keV 0 eV 1.45 cm 1.45 cm Target compt + 2 1.27 mm -5.55 mm -2.4 m 591 keV 0 eV 1.5 mm 1.61 cm Target compt + 3 -7.39 mm -1.83 cm -2.4 m 591 keV 0 eV 1.55 cm 3.16 cm Target Transportation + 4 -1.63 m -2.4 m -2.04 m 591 keV 0 eV 2.9 m 2.94 m Tracker Transportation + 5 -1.98 m -2.91 m -1.96 m 591 keV 0 eV 62.2 cm 3.56 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 224, Parent ID = 111 +* G4Track Information: Particle = e-, Track ID = 227, Parent ID = 209 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -94.5 mum -230 mum -2.44 m 413 keV 0 eV 0 fm 0 fm Target initStep - 1 455 mum -478 mum -2.44 m 0 eV 88 keV 1.64 mm 1.64 mm Target phot + 0 1.27 mm -5.55 mm -2.4 m 404 keV 0 eV 0 fm 0 fm Target initStep + 1 1.28 mm -5.56 mm -2.4 m 0 eV 404 keV 226 mum 226 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 235, Parent ID = 224 +* G4Track Information: Particle = e-, Track ID = 226, Parent ID = 209 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 455 mum -478 mum -2.44 m 325 keV 0 eV 0 fm 0 fm Target initStep - 1 463 mum -471 mum -2.44 m 0 eV 325 keV 167 mum 167 mum Target eIoni + 0 885 mum -4.17 mm -2.4 m 727 keV 0 eV 0 fm 0 fm Target initStep + 1 878 mum -4.17 mm -2.4 m 0 eV 727 keV 489 mum 489 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 223, Parent ID = 111 +* G4Track Information: Particle = gamma, Track ID = 208, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -229 mum 80.7 mum -2.44 m 1.48 MeV 0 eV 0 fm 0 fm Target initStep - 1 -242 mum 16.1 mum -2.44 m 683 keV 0 eV 275 mum 275 mum Target compt - 2 -3.26 mm -2.61 mm -2.44 m 0 eV 88 keV 4.45 mm 4.72 mm Target phot + 0 687 mum 4.52 mm -2.41 m 3.93 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.57 mm -6.84 mm -2.4 m 0 eV 88 keV 1.62 cm 1.62 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 237, Parent ID = 223 +* G4Track Information: Particle = e-, Track ID = 228, Parent ID = 208 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -3.26 mm -2.61 mm -2.44 m 595 keV 0 eV 0 fm 0 fm Target initStep - 1 -3.29 mm -2.61 mm -2.44 m 0 eV 595 keV 379 mum 379 mum Target eIoni + 0 -3.57 mm -6.84 mm -2.4 m 3.85 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.33 mm -7.6 mm -2.4 m 2.15 MeV 1.35 MeV 1.01 mm 1.01 mm Target eBrem + 2 -3.91 mm -7.42 mm -2.4 m 558 keV 1.31 MeV 1.33 mm 2.34 mm Target eBrem + 3 -3.88 mm -7.41 mm -2.4 m 0 eV 558 keV 349 mum 2.69 mm Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 236, Parent ID = 223 +* G4Track Information: Particle = gamma, Track ID = 230, Parent ID = 228 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -242 mum 16.1 mum -2.44 m 801 keV 0 eV 0 fm 0 fm Target initStep - 1 -228 mum 18 mum -2.44 m 0 eV 801 keV 552 mum 552 mum Target eIoni + 0 -3.91 mm -7.42 mm -2.4 m 289 keV 0 eV 0 fm 0 fm Target initStep + 1 23.3 mum -8.02 mm -2.4 m 181 keV 0 eV 4.02 mm 4.02 mm Target compt + 2 -35.6 mum -8.3 mm -2.4 m 0 eV 88 keV 283 mum 4.3 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 222, Parent ID = 111 +* G4Track Information: Particle = e-, Track ID = 232, Parent ID = 230 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -234 mum 610 mum -2.44 m 2.35 MeV 0 eV 0 fm 0 fm Target initStep - 1 448 mum -6.58 mm -2.41 m 241 keV 0 eV 2.7 cm 2.7 cm Target compt - 2 415 mum -6.58 mm -2.41 m 0 eV 88 keV 77.9 mum 2.71 cm Target phot + 0 -35.6 mum -8.3 mm -2.4 m 93.2 keV 0 eV 0 fm 0 fm Target initStep + 1 -35.3 mum -8.3 mm -2.4 m 0 eV 93.2 keV 24.7 mum 24.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 239, Parent ID = 222 +* G4Track Information: Particle = e-, Track ID = 231, Parent ID = 230 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 415 mum -6.58 mm -2.41 m 153 keV 0 eV 0 fm 0 fm Target initStep - 1 412 mum -6.58 mm -2.41 m 0 eV 153 keV 54.4 mum 54.4 mum Target eIoni + 0 23.3 mum -8.02 mm -2.4 m 107 keV 0 eV 0 fm 0 fm Target initStep + 1 25.2 mum -8.02 mm -2.4 m 0 eV 107 keV 31 mum 31 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 238, Parent ID = 222 +* G4Track Information: Particle = gamma, Track ID = 229, Parent ID = 228 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 448 mum -6.58 mm -2.41 m 2.11 MeV 0 eV 0 fm 0 fm Target initStep - 1 1.36 mm -8 mm -2.41 m 293 keV 1.82 MeV 1.15 mm 1.15 mm Target eBrem - 2 1.35 mm -8 mm -2.41 m 0 eV 293 keV 144 mum 1.29 mm Target eIoni + 0 -3.33 mm -7.6 mm -2.4 m 346 keV 0 eV 0 fm 0 fm Target initStep + 1 -7.87 mm -7.9 mm -2.4 m 0 eV 88 keV 5.3 mm 5.3 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 221, Parent ID = 111 +* G4Track Information: Particle = e-, Track ID = 233, Parent ID = 229 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -140 mum 875 mum -2.44 m 2.33 MeV 0 eV 0 fm 0 fm Target initStep - 1 1.06 mm -1.28 mm -2.43 m 2.23 MeV 0 eV 8.76 mm 8.76 mm Target compt - 2 7.92 mm -9.6 mm -2.41 m 986 keV 0 eV 2.67 cm 3.55 cm Target compt - 3 1.02 cm -1.79 cm -2.4 m 0 eV 88 keV 9.43 mm 4.49 cm Target phot + 0 -7.87 mm -7.9 mm -2.4 m 258 keV 0 eV 0 fm 0 fm Target initStep + 1 -7.88 mm -7.9 mm -2.4 m 0 eV 258 keV 120 mum 120 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 242, Parent ID = 221 +* G4Track Information: Particle = gamma, Track ID = 207, Parent ID = 172 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.02 cm -1.79 cm -2.4 m 898 keV 0 eV 0 fm 0 fm Target initStep - 1 1.02 cm -1.79 cm -2.4 m 0 eV 898 keV 634 mum 634 mum Target eIoni + 0 1.03 mm 5.02 mm -2.41 m 415 keV 0 eV 0 fm 0 fm Target initStep + 1 -989 mum 10.5 mum -2.41 m 0 eV 88 keV 7.42 mm 7.42 mm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 241, Parent ID = 221 +* G4Track Information: Particle = e-, Track ID = 234, Parent ID = 207 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.92 mm -9.6 mm -2.41 m 1.24 MeV 0 eV 0 fm 0 fm Target initStep - 1 7.95 mm -9.49 mm -2.41 m 660 keV 199 keV 170 mum 170 mum Target eBrem - 2 7.95 mm -9.47 mm -2.41 m 0 eV 660 keV 433 mum 603 mum Target eIoni + 0 -989 mum 10.5 mum -2.41 m 327 keV 0 eV 0 fm 0 fm Target initStep + 1 -993 mum 338 nm -2.41 m 0 eV 327 keV 168 mum 168 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 243, Parent ID = 241 +* G4Track Information: Particle = gamma, Track ID = 168, Parent ID = 108 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.95 mm -9.49 mm -2.41 m 381 keV 0 eV 0 fm 0 fm Target initStep - 1 7.84 mm -8.86 mm -2.41 m 0 eV 88 keV 923 mum 923 mum Target phot + 0 -512 mum 1.45 mm -2.43 m 833 keV 0 eV 0 fm 0 fm Target initStep + 1 -497 mum 1.59 mm -2.43 m 615 keV 0 eV 658 mum 658 mum Target compt + 2 458 mum -405 mum -2.43 m 269 keV 0 eV 4.73 mm 5.39 mm Target compt + 3 -4.35 mm 1.21 mm -2.43 m 0 eV 88 keV 5.28 mm 1.07 cm Target phot ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 244, Parent ID = 243 +* G4Track Information: Particle = e-, Track ID = 237, Parent ID = 168 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.84 mm -8.86 mm -2.41 m 293 keV 0 eV 0 fm 0 fm Target initStep - 1 7.84 mm -8.86 mm -2.41 m 0 eV 293 keV 144 mum 144 mum Target eIoni + 0 -4.35 mm 1.21 mm -2.43 m 181 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.35 mm 1.2 mm -2.43 m 0 eV 181 keV 70.7 mum 70.7 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 240, Parent ID = 221 +* G4Track Information: Particle = e-, Track ID = 236, Parent ID = 168 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.06 mm -1.28 mm -2.43 m 106 keV 0 eV 0 fm 0 fm Target initStep - 1 1.06 mm -1.28 mm -2.43 m 0 eV 106 keV 30.3 mum 30.3 mum Target eIoni + 0 458 mum -405 mum -2.43 m 345 keV 0 eV 0 fm 0 fm Target initStep + 1 465 mum -411 mum -2.43 m 0 eV 345 keV 182 mum 182 mum Target eIoni ********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 220, Parent ID = 111 +* G4Track Information: Particle = e-, Track ID = 235, Parent ID = 168 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -137 mum 927 mum -2.44 m 1.46 MeV 0 eV 0 fm 0 fm Target initStep - 1 2.84 mm -1.13 mm -2.43 m 0 eV 0 eV 1.52 cm 1.52 cm Target conv - -********************************************************************************************************* -* G4Track Information: Particle = e+, Track ID = 246, Parent ID = 220 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.84 mm -1.13 mm -2.43 m 278 keV 0 eV 0 fm 0 fm Target initStep - 1 2.83 mm -1.12 mm -2.43 m 0 eV 278 keV 130 mum 130 mum Target eIoni - 2 2.83 mm -1.12 mm -2.43 m 0 eV 0 eV 0 fm 130 mum Target annihil - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 248, Parent ID = 246 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.83 mm -1.12 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 6.27 mm -547 mum -2.43 m 0 eV 88 keV 3.54 mm 3.54 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 249, Parent ID = 248 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 6.27 mm -547 mum -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 6.28 mm -539 mum -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = gamma, Track ID = 247, Parent ID = 246 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.83 mm -1.12 mm -2.43 m 511 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.16 mm -2.44 mm -2.43 m 0 eV 88 keV 8.23 mm 8.23 mm Target phot - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 250, Parent ID = 247 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -5.16 mm -2.44 mm -2.43 m 423 keV 0 eV 0 fm 0 fm Target initStep - 1 -5.16 mm -2.46 mm -2.43 m 0 eV 423 keV 241 mum 241 mum Target eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 245, Parent ID = 220 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 2.84 mm -1.13 mm -2.43 m 158 keV 0 eV 0 fm 0 fm Target initStep - 1 2.84 mm -1.13 mm -2.43 m 0 eV 158 keV 56.9 mum 56.9 mum Target eIoni + 0 -497 mum 1.59 mm -2.43 m 218 keV 0 eV 0 fm 0 fm Target initStep + 1 -499 mum 1.59 mm -2.43 m 0 eV 218 keV 93.2 mum 93.2 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 @@ -2376,161 +2240,2240 @@ Step# X Y Z KineE dEStep StepLeng TrakLeng Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm -2.91 m 1 TeV 0 eV 0 fm 0 fm World initStep - 1 -87.3 nm 53.9 nm -2.65 m 1e+03 GeV 60.3 keV 26 cm 26 cm World MuIoni - 2 -168 nm 6.16 nm -2.45 m 1e+03 GeV 50.5 keV 20 cm 46 cm World Transportation - 3 -212 nm -4.22 nm -2.4 m 1e+03 GeV 85.3 MeV 5 cm 51 cm Target Transportation - 4 1.22 mum -1.79 mum -2.31 m 1e+03 GeV 22.2 keV 8.97 cm 60 cm Tracker MuIoni - 5 12.3 mum -16.1 mum -1.6 m 1e+03 GeV 166 keV 71 cm 1.31 m Tracker Transportation - 6 15.3 mum -20.1 mum -1.4 m 1e+03 GeV 204 keV 20 cm 1.51 m Chamber Transportation - 7 16.3 mum -21.4 mum -1.34 m 1e+03 GeV 21.2 keV 6.27 cm 1.57 m Tracker MuIoni - 8 17 mum -22.5 mum -1.29 m 1e+03 GeV 11.1 keV 5.06 cm 1.62 m Tracker MuIoni - 9 24.3 mum -32.9 mum -80 cm 1e+03 GeV 113 keV 48.7 cm 2.11 m Tracker Transportation - 10 27.3 mum -37.3 mum -60 cm 1e+03 GeV 229 keV 20 cm 2.31 m Chamber Transportation - 11 30.8 mum -43.1 mum -33.9 cm 1e+03 GeV 64.4 keV 26.1 cm 2.57 m Tracker MuIoni - 12 31.7 mum -44.7 mum -26.9 cm 1e+03 GeV 16.6 keV 7 cm 2.64 m Tracker MuIoni - 13 33.5 mum -47.6 mum -14.1 cm 1e+03 GeV 23.4 keV 12.8 cm 2.77 m Tracker MuIoni - 14 35.4 mum -50.8 mum0.0284 fm 1e+03 GeV 31.5 keV 14.1 cm 2.91 m Tracker Transportation - 15 36.7 mum -52.9 mum 9.47 cm 1e+03 GeV 84.9 keV 9.47 cm 3 m Chamber MuIoni - 16 38 mum -55.4 mum 20 cm 1e+03 GeV 157 keV 10.5 cm 3.11 m Chamber Transportation - 17 40.8 mum -61.2 mum 43.7 cm 1e+03 GeV 45.8 keV 23.7 cm 3.35 m Tracker MuIoni - 18 44.6 mum -68.5 mum 73.4 cm 1e+03 GeV 70.7 keV 29.7 cm 3.64 m Tracker MuIoni - 19 45.4 mum -70.2 mum 80 cm 1e+03 GeV 11.9 keV 6.62 cm 3.71 m Tracker Transportation - 20 47.9 mum -75.1 mum 1 m 1e+03 GeV 210 keV 20 cm 3.91 m Chamber Transportation - 21 55.5 mum -90 mum 1.6 m 1e+03 GeV 141 keV 60 cm 4.51 m Tracker Transportation - 22 58.1 mum -94.8 mum 1.8 m 1e+03 GeV 168 keV 20 cm 4.71 m Chamber Transportation - 23 63.9 mum -108 mum 2.3 m 1e+03 GeV 119 keV 49.6 cm 5.21 m Tracker MuIoni - 24 65.2 mum -110 mum 2.4 m 1e+03 GeV 27.6 keV 10.4 cm 5.31 m Tracker Transportation - 25 71.5 mum -123 mum 2.91 m 1e+03 GeV 122 keV 51 cm 5.82 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 12, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 63.9 mum -108 mum 2.3 m 14 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -60 mum -2.03 mm 2.3 m 0 eV 14 keV 4.08 mm 4.08 mm Tracker eIoni + 1 -19.4 nm -3.38 nm -2.82 m 1e+03 GeV 20.1 keV 8.65 cm 8.65 cm World MuIoni + 2 19.9 nm 29.3 nm -2.69 m 1e+03 GeV 35.7 keV 13.2 cm 21.8 cm World MuIoni + 3 24 nm 53.9 nm -2.45 m 1e+03 GeV 60.4 keV 24.2 cm 46 cm World Transportation + 4 -156 nm -787 nm -2.42 m 1e+03 GeV 40.3 MeV 2.98 cm 49 cm Target MuPairProd + 5 -1.59 mum -585 nm -2.4 m 1e+03 GeV 31.3 MeV 2.02 cm 51 cm Target Transportation + 6 -49.3 mum 36.3 mum -1.6 m 1e+03 GeV 174 keV 80 cm 1.31 m Tracker Transportation + 7 -61.4 mum 45.3 mum -1.4 m 1e+03 GeV 121 keV 20 cm 1.51 m Chamber Transportation + 8 -96.3 mum 72 mum -80 cm 1e+03 GeV 150 keV 60 cm 2.11 m Tracker Transportation + 9 -108 mum 80.8 mum -60 cm 1e+03 GeV 148 keV 20 cm 2.31 m Chamber Transportation + 10 -142 mum 107 mum 0.114 fm 1e+03 GeV 137 keV 60 cm 2.91 m Tracker Transportation + 11 -152 mum 114 mum 17.3 cm 1e+03 GeV 144 keV 17.3 cm 3.08 m Chamber MuIoni + 12 -154 mum 115 mum 20 cm 1e+03 GeV 10.2 keV 2.71 cm 3.11 m Chamber Transportation + 13 -182 mum 138 mum 69 cm 1e+03 GeV 108 keV 49 cm 3.6 m Tracker MuIoni + 14 -185 mum 141 mum 75.5 cm 1e+03 GeV 17.8 keV 6.5 cm 3.66 m Tracker MuIoni + 15 -188 mum 143 mum 80 cm 1e+03 GeV 11.5 keV 4.55 cm 3.71 m Tracker Transportation + 16 -199 mum 152 mum 1 m 1e+03 GeV 165 keV 20 cm 3.91 m Chamber Transportation + 17 -233 mum 179 mum 1.6 m 1e+03 GeV 134 keV 60 cm 4.51 m Tracker Transportation + 18 -245 mum 188 mum 1.8 m 1e+03 GeV 174 keV 20 cm 4.71 m Chamber Transportation + 19 -254 mum 196 mum 1.97 m 1e+03 GeV 35.3 keV 16.5 cm 4.88 m Tracker MuIoni + 20 -258 mum 200 mum 2.05 m 1e+03 GeV 16.2 keV 8.64 cm 4.96 m Tracker MuIoni + 21 -277 mum 218 mum 2.4 m 1e+03 GeV 82.3 keV 34.9 cm 5.31 m Tracker Transportation + 22 -298 mum 236 mum 2.78 m 1e+03 GeV 92 keV 37.9 cm 5.69 m World MuIoni + 23 -305 mum 242 mum 2.91 m 1e+03 GeV 27.2 keV 13.1 cm 5.82 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 11, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 44.6 mum -68.5 mum 73.4 cm 52 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -1.92 cm 4.86 mm 73.8 cm 0 eV 52 keV 4.28 cm 4.28 cm Tracker eIoni + 0 -298 mum 236 mum 2.78 m 9.64 keV 0 eV 0 fm 0 fm World initStep + 1 662 mum -20.1 mum 2.78 m 0 eV 9.64 keV 2.13 mm 2.13 mm World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 10, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 40.8 mum -61.2 mum 43.7 cm 8.14 keV 0 eV 0 fm 0 fm Tracker initStep - 1 738 mum -300 mum 43.7 cm 0 eV 8.14 keV 1.58 mm 1.58 mm Tracker eIoni + 0 -258 mum 200 mum 2.05 m 21.5 keV 0 eV 0 fm 0 fm Tracker initStep + 1 3.49 mm -4.7 mm 2.05 m 15.4 keV 6.16 keV 5.29 mm 5.29 mm Tracker eIoni + 2 5.01 mm -4.04 mm 2.05 m 0 eV 15.4 keV 4.79 mm 1.01 cm Tracker eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 9, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 36.7 mum -52.9 mum 9.47 cm 234 keV 0 eV 0 fm 0 fm Chamber initStep - 1 4.58 mm 1.71 cm 10.3 cm 0 eV 234 keV 19.8 cm 19.8 cm Chamber eIoni + 0 -254 mum 196 mum 1.97 m 67.1 keV 0 eV 0 fm 0 fm Tracker initStep + 1 1.97 cm 2.42 cm 1.97 m 0 eV 67.1 keV 6.78 cm 6.78 cm Tracker eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 8, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 33.5 mum -47.6 mum -14.1 cm 12.1 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -386 mum -1.48 mm -14 cm 0 eV 12.1 keV 3.17 mm 3.17 mm Tracker eIoni + 0 -185 mum 141 mum 75.5 cm 25.3 keV 0 eV 0 fm 0 fm Tracker initStep + 1 -2.72 mm -4.73 mm 75.5 cm 0 eV 25.3 keV 1.16 cm 1.16 cm Tracker eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 31.7 mum -44.7 mum -26.9 cm 329 keV 0 eV 0 fm 0 fm Tracker initStep - 1 29.1 cm 13.6 cm -14.7 cm 230 keV 83.2 keV 37.2 cm 37.2 cm Tracker eIoni - 2 45.9 cm 15.6 cm -19.1 cm 161 keV 57.7 keV 16.6 cm 53.8 cm Tracker eIoni - 3 53.1 cm 28.1 cm -21.7 cm 0 eV 161 keV 31.2 cm 85 cm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 14, Parent ID = 7 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 45.9 cm 15.6 cm -19.1 cm 10.9 keV 0 eV 0 fm 0 fm Tracker initStep - 1 45.9 cm 15.6 cm -19 cm 0 eV 10.9 keV 2.65 mm 2.65 mm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 13, Parent ID = 7 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 29.1 cm 13.6 cm -14.7 cm 15.5 keV 0 eV 0 fm 0 fm Tracker initStep - 1 29.1 cm 13.6 cm -14.4 cm 0 eV 15.5 keV 4.84 mm 4.84 mm Tracker eIoni + 0 -182 mum 138 mum 69 cm 10.7 keV 0 eV 0 fm 0 fm Tracker initStep + 1 336 mum -940 mum 69 cm 0 eV 10.7 keV 2.55 mm 2.55 mm Tracker eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 30.8 mum -43.1 mum -33.9 cm 95.6 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -2 mm -1.71 mm -33.7 cm 65.4 keV 719 eV 2.86 mm 2.86 mm Tracker eIoni - 2 -3.19 cm -8.02 mm -33.4 cm 0 eV 65.4 keV 6.47 cm 6.75 cm Tracker eIoni + 0 -152 mum 114 mum 17.3 cm 167 keV 0 eV 0 fm 0 fm Chamber initStep + 1 1.04 cm -1.96 mm 17.7 cm 0 eV 167 keV 11.6 cm 11.6 cm Chamber eIoni ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 15, Parent ID = 6 +* G4Track Information: Particle = e+, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -2 mm -1.71 mm -33.7 cm 29.4 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -8.18 mm -9.07 mm -33.2 cm 16.9 keV 12.5 keV 8.82 mm 8.82 mm Tracker eIoni - 2 -7.02 mm -1.13 cm -33.1 cm 0 eV 16.9 keV 5.71 mm 1.45 cm Tracker eIoni + 0 -156 nm -787 nm -2.42 m 308 MeV 0 eV 0 fm 0 fm Target initStep + 1 -10.4 mum -1.59 mum -2.42 m 307 MeV 987 keV 722 mum 722 mum Target eBrem + 2 -35 mum 21.1 mum -2.42 m 306 MeV 1.19 MeV 1.01 mm 1.73 mm Target eBrem + 3 -37.1 mum 21.5 mum -2.42 m 292 MeV 92.1 keV 66.2 mum 1.8 mm Target eBrem + 4 -50 mum 21.5 mum -2.42 m 289 MeV 417 keV 297 mum 2.1 mm Target eBrem + 5 -50.6 mum 21.7 mum -2.42 m 288 MeV 102 keV 101 mum 2.2 mm Target eBrem + 6 -53.4 mum 23 mum -2.42 m 285 MeV 606 keV 478 mum 2.68 mm Target eBrem + 7 -56.6 mum 30.1 mum -2.42 m 282 MeV 480 keV 379 mum 3.06 mm Target eBrem + 8 -50.6 mum 32.8 mum -2.42 m 201 MeV 607 keV 360 mum 3.42 mm Target eBrem + 9 -50.1 mum 30.7 mum -2.42 m 198 MeV 239 keV 186 mum 3.6 mm Target eBrem + 10 -79.9 mum 15.8 mum -2.42 m 184 MeV 1.74 MeV 1.09 mm 4.69 mm Target eBrem + 11 -119 mum 29 mum -2.41 m 177 MeV 1.28 MeV 754 mum 5.44 mm Target eBrem + 12 -128 mum 32 mum -2.41 m 176 MeV 208 keV 165 mum 5.61 mm Target eBrem + 13 -162 mum 14.6 mum -2.41 m 174 MeV 1.31 MeV 1.06 mm 6.67 mm Target eBrem + 14 -260 mum -6.53 mum -2.41 m 168 MeV 4.99 MeV 786 mum 7.46 mm Target eBrem + 15 -300 mum -4.2 mum -2.41 m 167 MeV 615 keV 388 mum 7.85 mm Target eBrem + 16 -331 mum 944 nm -2.41 m 162 MeV 455 keV 309 mum 8.15 mm Target eBrem + 17 -479 mum 28.5 nm -2.41 m 153 MeV 1.27 MeV 1.1 mm 9.25 mm Target eBrem + 18 -531 mum 4.5 mum -2.41 m 152 MeV 971 keV 840 mum 1.01 cm Target eBrem + 19 -595 mum -19.6 mum -2.41 m 150 MeV 977 keV 550 mum 1.06 cm Target eBrem + 20 -606 mum -20.8 mum -2.41 m 128 MeV 88.8 keV 80.3 mum 1.07 cm Target eBrem + 21 -667 mum -26.8 mum -2.41 m 105 MeV 414 keV 347 mum 1.11 cm Target eBrem + 22 -817 mum -65.5 mum -2.41 m 101 MeV 1.21 MeV 1.08 mm 1.21 cm Target eBrem + 23 -866 mum -57.6 mum -2.41 m 98 MeV 825 keV 208 mum 1.24 cm Target eBrem + 24 -962 mum -57.8 mum -2.41 m 96.8 MeV 483 keV 398 mum 1.28 cm Target eBrem + 25 -998 mum -47.4 mum -2.41 m 96.2 MeV 237 keV 141 mum 1.29 cm Target eBrem + 26 -1.18 mm -40.4 mum -2.41 m 82.7 MeV 1.1 MeV 596 mum 1.35 cm Target eBrem + 27 -1.26 mm -42.4 mum -2.41 m 52.7 MeV 428 keV 348 mum 1.38 cm Target eBrem + 28 -1.37 mm -28.2 mum -2.41 m 44.5 MeV 754 keV 668 mum 1.45 cm Target eBrem + 29 -2.43 mm 37.4 mum -2.4 m 40.5 MeV 3.3 MeV 1.96 mm 1.65 cm Target eBrem + 30 -2.69 mm -13 mum -2.4 m 18 MeV 2.01 MeV 934 mum 1.74 cm Target eBrem + 31 -2.8 mm -39.1 mum -2.4 m 14.8 MeV 310 keV 237 mum 1.76 cm Target eBrem + 32 -2.96 mm -124 mum -2.4 m 5.42 MeV 1.35 MeV 330 mum 1.8 cm Target eBrem + 33 -3.49 mm 9.28 mum -2.4 m 0 eV 5.42 MeV 2.41 mm 2.04 cm Target eBrem + 34 -3.49 mm 9.28 mum -2.4 m 0 eV 0 eV 0 fm 2.04 cm Target annihil ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 5, Parent ID = 1 +* G4Track Information: Particle = gamma, Track ID = 45, Parent ID = 5 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 17 mum -22.5 mum -1.29 m 11.9 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -1.38 mm -343 mum -1.29 m 0 eV 11.9 keV 3.05 mm 3.05 mm Tracker eIoni + 0 -3.49 mm 9.28 mum -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.41 mm -136 mum -2.4 m 192 keV 0 eV 4.93 mm 4.93 mm Target compt + 2 -8.02 mm 328 mum -2.4 m 0 eV 88 keV 606 mum 5.53 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 47, Parent ID = 45 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -8.02 mm 328 mum -2.4 m 104 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.02 mm 326 mum -2.4 m 0 eV 104 keV 29.3 mum 29.3 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 46, Parent ID = 45 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -8.41 mm -136 mum -2.4 m 319 keV 0 eV 0 fm 0 fm Target initStep + 1 -8.42 mm -138 mum -2.4 m 0 eV 319 keV 162 mum 162 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 44, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.49 mm 9.28 mum -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 5.75 mm 282 mum -2.4 m 0 eV 88 keV 9.26 mm 9.26 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 48, Parent ID = 44 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.75 mm 282 mum -2.4 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 5.76 mm 275 mum -2.4 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 43, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.96 mm -124 mum -2.4 m 8.03 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.96 mm 381 mum -2.4 m 8.03 MeV 0 eV 3.52 mm 3.52 mm Target Transportation + 2 -2.4 m 60.5 cm 1.02 m 8.03 MeV 0 eV 4.22 m 4.22 m Tracker Transportation + 3 -2.91 m 73.3 cm 1.75 m 8.03 MeV 0 eV 89.8 cm 5.12 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 42, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.8 mm -39.1 mum -2.4 m 2.93 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.71 mm -435 mum -2.4 m 2.93 MeV 0 eV 3.69 mm 3.69 mm Target Transportation + 2 -2.4 m -49.9 cm 1.54 m 2.93 MeV 0 eV 4.64 m 4.64 m Tracker Transportation + 3 -2.91 m -60.5 cm 2.38 m 2.93 MeV 0 eV 98.8 cm 5.63 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 41, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.69 mm -13 mum -2.4 m 20.4 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.39 mm -530 mum -2.4 m 20.4 MeV 0 eV 3.78 mm 3.78 mm Target Transportation + 2 -2.4 m -72.8 cm 2.3 m 20.4 MeV 0 eV 5.32 m 5.33 m Tracker Transportation + 3 -2.71 m -82.3 cm 2.91 m 20.4 MeV 0 eV 69.2 cm 6.02 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 40, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.43 mm 37.4 mum -2.4 m 670 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.76 mm -69.6 mum -2.4 m 448 keV 0 eV 900 mum 900 mum Target compt + 2 -1.15 cm -1.81 mm -2.4 m 0 eV 88 keV 9.23 mm 1.01 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 50, Parent ID = 40 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.15 cm -1.81 mm -2.4 m 360 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.15 cm -1.82 mm -2.4 m 0 eV 360 keV 193 mum 193 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 49, Parent ID = 40 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.76 mm -69.6 mum -2.4 m 221 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.76 mm -69.6 mum -2.4 m 0 eV 221 keV 95.3 mum 95.3 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 39, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.37 mm -28.2 mum -2.41 m 7.48 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.39 mm -32.1 mum -2.41 m 646 keV 0 eV 36 mum 36 mum Target compt + 2 -335 mum 1.57 mm -2.4 m 0 eV 88 keV 2.49 mm 2.53 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 52, Parent ID = 39 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -335 mum 1.57 mm -2.4 m 558 keV 0 eV 0 fm 0 fm Target initStep + 1 -331 mum 1.59 mm -2.4 m 0 eV 558 keV 349 mum 349 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 51, Parent ID = 39 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.39 mm -32.1 mum -2.41 m 6.84 MeV 0 eV 0 fm 0 fm Target initStep + 1 -236 mum 3.15 mm -2.4 m 935 keV 5.34 MeV 4.14 mm 4.14 mm Target eBrem + 2 -266 mum 2.86 mm -2.4 m 113 keV 822 keV 603 mum 4.74 mm Target eBrem + 3 -267 mum 2.86 mm -2.4 m 0 eV 113 keV 33.7 mum 4.78 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 53, Parent ID = 51 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -236 mum 3.15 mm -2.4 m 559 keV 0 eV 0 fm 0 fm Target initStep + 1 -680 mum 1.41 mm -2.4 m 369 keV 0 eV 1.82 mm 1.82 mm Target compt + 2 -9.7 mm -3.8 mm -2.42 m 0 eV 88 keV 1.85 cm 2.03 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 55, Parent ID = 53 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -9.7 mm -3.8 mm -2.42 m 281 keV 0 eV 0 fm 0 fm Target initStep + 1 -9.71 mm -3.8 mm -2.42 m 0 eV 281 keV 136 mum 136 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 54, Parent ID = 53 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -680 mum 1.41 mm -2.4 m 190 keV 0 eV 0 fm 0 fm Target initStep + 1 -679 mum 1.41 mm -2.4 m 0 eV 190 keV 75.6 mum 75.6 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 38, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.26 mm -42.4 mum -2.41 m 29.5 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.77 mm 26 mum -2.4 m 29.5 MeV 0 eV 6.69 mm 6.69 mm Target Transportation + 2 -18.7 cm 8.42 mm -1.6 m 29.5 MeV 0 eV 82.1 cm 82.8 cm Tracker Transportation + 3 -23.4 cm 1.05 cm -1.4 m 29.5 MeV 0 eV 20.5 cm 1.03 m Chamber Transportation + 4 -37.2 cm 1.68 cm -80 cm 29.5 MeV 0 eV 61.6 cm 1.65 m Tracker Transportation + 5 -41.8 cm 1.89 cm -60 cm 29.5 MeV 0 eV 20.5 cm 1.85 m Chamber Transportation + 6 -55.7 cm 2.52 cm 0.114 fm 29.5 MeV 0 eV 61.6 cm 2.47 m Tracker Transportation + 7 -60.3 cm 2.73 cm 20 cm 29.5 MeV 0 eV 20.5 cm 2.68 m Chamber Transportation + 8 -74.1 cm 3.36 cm 80 cm 29.5 MeV 0 eV 61.6 cm 3.29 m Tracker Transportation + 9 -78.8 cm 3.57 cm 1 m 29.5 MeV 0 eV 20.5 cm 3.5 m Chamber Transportation + 10 -92.6 cm 4.2 cm 1.6 m 29.5 MeV 0 eV 61.6 cm 4.11 m Tracker Transportation + 11 -97.2 cm 4.41 cm 1.8 m 29.5 MeV 0 eV 20.5 cm 4.32 m Chamber Transportation + 12 -1.11 m 5.04 cm 2.4 m 29.5 MeV 0 eV 61.6 cm 4.93 m Tracker Transportation + 13 -1.23 m 5.57 cm 2.91 m 29.5 MeV 0 eV 52.3 cm 5.46 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 37, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.18 mm -40.4 mum -2.41 m 12.4 MeV 0 eV 0 fm 0 fm Target initStep + 1 -3.03 mm 52.2 mum -2.4 m 12.4 MeV 0 eV 7.1 mm 7.1 mm Target Transportation + 2 -21.8 cm 1.09 cm -1.6 m 12.4 MeV 0 eV 82.9 cm 83.6 cm Tracker Transportation + 3 -24 cm 1.19 cm -1.52 m 12.4 MeV 0 eV 8.34 cm 91.9 cm Chamber Transportation + 4 -43.4 cm 2.17 cm -80 cm 12.4 MeV 0 eV 74.5 cm 1.66 m Tracker Transportation + 5 -48.7 cm 2.44 cm -60 cm 12.4 MeV 0 eV 20.7 cm 1.87 m Chamber Transportation + 6 -64.9 cm 3.25 cm -0.114 fm 12.4 MeV 0 eV 62.1 cm 2.49 m Tracker Transportation + 7 -70.3 cm 3.52 cm 20 cm 12.4 MeV 0 eV 20.7 cm 2.7 m Chamber Transportation + 8 -86.4 cm 4.33 cm 80 cm 12.4 MeV 0 eV 62.1 cm 3.32 m Tracker Transportation + 9 -91.8 cm 4.6 cm 1 m 12.4 MeV 0 eV 20.7 cm 3.53 m Chamber Transportation + 10 -1.08 m 5.41 cm 1.6 m 12.4 MeV 0 eV 62.1 cm 4.15 m Tracker Transportation + 11 -1.13 m 5.68 cm 1.8 m 12.4 MeV 0 eV 20.7 cm 4.36 m Chamber Transportation + 12 -1.29 m 6.49 cm 2.4 m 12.4 MeV 0 eV 62.1 cm 4.98 m Tracker Transportation + 13 -1.43 m 7.18 cm 2.91 m 12.4 MeV 0 eV 52.8 cm 5.51 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 36, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -998 mum -47.4 mum -2.41 m 417 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.49 mm 162 mum -2.4 m 0 eV 88 keV 5.33 mm 5.33 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 56, Parent ID = 36 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.49 mm 162 mum -2.4 m 329 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.49 mm 156 mum -2.4 m 0 eV 329 keV 170 mum 170 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 35, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -962 mum -57.8 mum -2.41 m 704 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.08 mm 417 mum -2.4 m 704 keV 0 eV 7.87 mm 7.87 mm Target Transportation + 2 -22.8 cm 5.07 cm -1.6 m 704 keV 0 eV 83.2 cm 84 cm Tracker Transportation + 3 -24 cm 5.34 cm -1.56 m 704 keV 0 eV 4.55 cm 88.6 cm Chamber Transportation + 4 -45.2 cm 10.1 cm -80 cm 704 keV 0 eV 78.7 cm 1.67 m Tracker Transportation + 5 -50.9 cm 11.3 cm -60 cm 704 keV 0 eV 20.8 cm 1.88 m Chamber Transportation + 6 -67.7 cm 15.1 cm -0.114 fm 704 keV 0 eV 62.4 cm 2.51 m Tracker Transportation + 7 -73.3 cm 16.4 cm 20 cm 704 keV 0 eV 20.8 cm 2.71 m Chamber Transportation + 8 -90.2 cm 20.1 cm 80 cm 704 keV 0 eV 62.4 cm 3.34 m Tracker Transportation + 9 -95.8 cm 21.4 cm 1 m 704 keV 0 eV 20.8 cm 3.55 m Chamber Transportation + 10 -1.13 m 25.2 cm 1.6 m 704 keV 0 eV 62.4 cm 4.17 m Tracker Transportation + 11 -1.18 m 26.4 cm 1.8 m 704 keV 0 eV 20.8 cm 4.38 m Chamber Transportation + 12 -1.35 m 30.2 cm 2.4 m 704 keV 0 eV 62.4 cm 5 m Tracker Transportation + 13 -1.49 m 33.4 cm 2.91 m 704 keV 0 eV 53.1 cm 5.53 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 34, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -866 mum -57.6 mum -2.41 m 1.73 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.93 mm 160 mum -2.4 m 1.73 MeV 0 eV 8.21 mm 8.21 mm Target Transportation + 2 -21.1 cm 2.21 cm -1.6 m 1.73 MeV 0 eV 82.7 cm 83.5 cm Tracker Transportation + 3 -24 cm 2.52 cm -1.49 m 1.73 MeV 0 eV 11.6 cm 95.1 cm Chamber Transportation + 4 -41.9 cm 4.4 cm -80 cm 1.73 MeV 0 eV 71.1 cm 1.66 m Tracker Transportation + 5 -47.1 cm 4.95 cm -60 cm 1.73 MeV 0 eV 20.7 cm 1.87 m Chamber Transportation + 6 -62.7 cm 6.6 cm 0.114 fm 1.73 MeV 0 eV 62 cm 2.49 m Tracker Transportation + 7 -67.9 cm 7.15 cm 20 cm 1.73 MeV 0 eV 20.7 cm 2.7 m Chamber Transportation + 8 -83.5 cm 8.79 cm 80 cm 1.73 MeV 0 eV 62 cm 3.32 m Tracker Transportation + 9 -88.7 cm 9.34 cm 1 m 1.73 MeV 0 eV 20.7 cm 3.52 m Chamber Transportation + 10 -1.04 m 11 cm 1.6 m 1.73 MeV 0 eV 62 cm 4.14 m Tracker Transportation + 11 -1.09 m 11.5 cm 1.8 m 1.73 MeV 0 eV 20.7 cm 4.35 m Chamber Transportation + 12 -1.25 m 13.2 cm 2.4 m 1.73 MeV 0 eV 62 cm 4.97 m Tracker Transportation + 13 -1.38 m 14.6 cm 2.91 m 1.73 MeV 0 eV 52.7 cm 5.5 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 33, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -817 mum -65.5 mum -2.41 m 3.39 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.51 mm -29.7 mum -2.41 m 0 eV 0 eV 3.1 mm 3.1 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 58, Parent ID = 33 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.51 mm -29.7 mum -2.41 m 1.17 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.53 mm -32.5 mum -2.41 m 0 eV 1.17 MeV 882 mum 882 mum Target eIoni + 2 -1.53 mm -32.5 mum -2.41 m 0 eV 0 eV 0 fm 882 mum Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 60, Parent ID = 58 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.53 mm -32.5 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 119 mum -4.89 mm -2.42 m 225 keV 0 eV 1.18 cm 1.18 cm Target compt + 2 257 mum -4.8 mm -2.42 m 0 eV 88 keV 166 mum 1.19 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 62, Parent ID = 60 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 257 mum -4.8 mm -2.42 m 137 keV 0 eV 0 fm 0 fm Target initStep + 1 259 mum -4.8 mm -2.42 m 0 eV 137 keV 45.9 mum 45.9 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 61, Parent ID = 60 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 119 mum -4.89 mm -2.42 m 286 keV 0 eV 0 fm 0 fm Target initStep + 1 118 mum -4.89 mm -2.42 m 0 eV 286 keV 139 mum 139 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 59, Parent ID = 58 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.53 mm -32.5 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.25 mm 2.11 mm -2.4 m 187 keV 0 eV 5.19 mm 5.19 mm Target compt + 2 -2.13 mm 2.22 mm -2.4 m 0 eV 88 keV 389 mum 5.58 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 64, Parent ID = 59 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.13 mm 2.22 mm -2.4 m 98.6 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.13 mm 2.22 mm -2.4 m 0 eV 98.6 keV 27 mum 27 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 63, Parent ID = 59 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.25 mm 2.11 mm -2.4 m 324 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.25 mm 2.11 mm -2.4 m 0 eV 324 keV 166 mum 166 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 57, Parent ID = 33 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.51 mm -29.7 mum -2.41 m 1.19 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.54 mm -26.1 mum -2.41 m 0 eV 1.19 MeV 884 mum 884 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 32, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -667 mum -26.8 mum -2.41 m 22.7 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.35 mm -467 mum -2.4 m 22.7 MeV 0 eV 9.37 mm 9.37 mm Target Transportation + 2 -14.9 cm -3.87 cm -1.6 m 22.7 MeV 0 eV 81.4 cm 82.4 cm Tracker Transportation + 3 -18.5 cm -4.82 cm -1.4 m 22.7 MeV 0 eV 20.4 cm 1.03 m Chamber Transportation + 4 -29.5 cm -7.69 cm -80 cm 22.7 MeV 0 eV 61.1 cm 1.64 m Tracker Transportation + 5 -33.2 cm -8.64 cm -60 cm 22.7 MeV 0 eV 20.4 cm 1.84 m Chamber Transportation + 6 -44.1 cm -11.5 cm 0.114 fm 22.7 MeV 0 eV 61.1 cm 2.45 m Tracker Transportation + 7 -47.8 cm -12.5 cm 20 cm 22.7 MeV 0 eV 20.4 cm 2.66 m Chamber Transportation + 8 -58.8 cm -15.3 cm 80 cm 22.7 MeV 0 eV 61.1 cm 3.27 m Tracker Transportation + 9 -62.4 cm -16.3 cm 1 m 22.7 MeV 0 eV 20.4 cm 3.47 m Chamber Transportation + 10 -73.4 cm -19.1 cm 1.6 m 22.7 MeV 0 eV 61.1 cm 4.08 m Tracker Transportation + 11 -77.1 cm -20.1 cm 1.8 m 22.7 MeV 0 eV 20.4 cm 4.28 m Chamber Transportation + 12 -88 cm -23 cm 2.4 m 22.7 MeV 0 eV 61.1 cm 4.89 m Tracker Transportation + 13 -97.4 cm -25.4 cm 2.91 m 22.7 MeV 0 eV 51.9 cm 5.41 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 31, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -606 mum -20.8 mum -2.41 m 21.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.98 mm -361 mum -2.4 m 2.28 MeV 0 eV 7.94 mm 7.94 mm Target compt + 2 -1.15 mm -870 mum -2.4 m 2.28 MeV 0 eV 1.99 mm 9.93 mm Target Transportation + 3 1.52 m -93.7 cm 80 cm 2.28 MeV 0 eV 3.66 m 3.67 m Tracker Transportation + 4 1.54 m -94.9 cm 84.1 cm 2.28 MeV 0 eV 4.67 cm 3.72 m Chamber Transportation + 5 1.9 m -1.17 m 1.6 m 2.28 MeV 0 eV 86.9 cm 4.59 m Tracker Transportation + 6 1.97 m -1.22 m 1.75 m 2.28 MeV 0 eV 17.4 cm 4.76 m Chamber Transportation + 7 2.28 m -1.4 m 2.4 m 2.28 MeV 0 eV 74.2 cm 5.5 m Tracker Transportation + 8 2.52 m -1.55 m 2.91 m 2.28 MeV 0 eV 58.4 cm 6.09 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 65, Parent ID = 31 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.98 mm -361 mum -2.4 m 19.7 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.05 mm -333 mum -2.4 m 19 MeV 371 keV 266 mum 266 mum Target eBrem + 2 -2.18 mm -429 mum -2.4 m 16.6 MeV 576 keV 449 mum 715 mum Target eBrem + 3 -2.17 mm -428 mum -2.4 m 11.1 MeV 446 keV 118 mum 833 mum Target eBrem + 4 -2.2 mm -525 mum -2.4 m 9.84 MeV 1.24 MeV 1.17 mm 2 mm Target Transportation + 5 12.5 cm 3.03 cm -2.17 m 7.13 MeV 53.3 keV 26.6 cm 26.8 cm Tracker eIoni + 6 13.5 cm 3.12 cm -2.16 m 7.11 MeV 2.58 keV 1.5 cm 28.3 cm Tracker eIoni + 7 13.7 cm 3.14 cm -2.15 m 7.09 MeV 658 eV 3.5 mm 28.6 cm Tracker eIoni + 8 31.1 cm 4.37 cm -1.93 m 6.98 MeV 43 keV 28.3 cm 57 cm Tracker eIoni + 9 1.37 m 19.2 cm -52.2 cm 6.63 MeV 333 keV 1.78 m 2.35 m Tracker eIoni + 10 1.41 m 19.8 cm -46.9 cm 6.61 MeV 9.39 keV 6.45 cm 2.41 m Tracker eIoni + 11 1.83 m 25.4 cm 8.12 cm 6.42 MeV 136 keV 69.9 cm 3.11 m Tracker eIoni + 12 2.4 m 23.5 cm 1.01 m 6.22 MeV 207 keV 1.1 m 4.21 m Tracker Transportation + 13 2.91 m 32.9 cm 1.96 m 6.01 MeV 202 keV 1.09 m 5.3 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 75, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.83 m 25.4 cm 8.12 cm 53.2 keV 0 eV 0 fm 0 fm Tracker initStep + 1 1.85 m 25.9 cm 7.46 cm 0 eV 53.2 keV 4.48 cm 4.48 cm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 74, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.41 m 19.8 cm -46.9 cm 11.4 keV 0 eV 0 fm 0 fm Tracker initStep + 1 1.41 m 19.9 cm -47 cm 0 eV 11.4 keV 2.86 mm 2.86 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 73, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.37 m 19.2 cm -52.2 cm 9.64 keV 0 eV 0 fm 0 fm Tracker initStep + 1 1.37 m 19.3 cm -52.2 cm 0 eV 9.64 keV 2.12 mm 2.12 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 72, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 31.1 cm 4.37 cm -1.93 m 73.7 keV 0 eV 0 fm 0 fm Tracker initStep + 1 29.5 cm 2.79 cm -1.9 m 35.7 keV 29 keV 5.4 cm 5.4 cm Tracker eIoni + 2 30.3 cm 2.89 cm -1.9 m 0 eV 35.7 keV 2.18 cm 7.57 cm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 76, Parent ID = 72 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 29.5 cm 2.79 cm -1.9 m 9.02 keV 0 eV 0 fm 0 fm Tracker initStep + 1 29.5 cm 2.87 cm -1.9 m 0 eV 9.02 keV 1.9 mm 1.9 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 71, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 13.7 cm 3.14 cm -2.15 m 17.7 keV 0 eV 0 fm 0 fm Tracker initStep + 1 13.8 cm 2.88 cm -2.15 m 0 eV 17.7 keV 6.21 mm 6.21 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 70, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 13.5 cm 3.12 cm -2.16 m 13.3 keV 0 eV 0 fm 0 fm Tracker initStep + 1 13.6 cm 2.98 cm -2.16 m 0 eV 13.3 keV 3.76 mm 3.76 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 69, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 12.5 cm 3.03 cm -2.17 m 2.66 MeV 0 eV 0 fm 0 fm Tracker initStep + 1 12.6 cm 3.62 cm -2.09 m 2.53 MeV 10.1 keV 8.11 cm 8.11 cm Tracker eIoni + 2 12.8 cm 4 cm -1.98 m 2.49 MeV 14 keV 11 cm 19.2 cm Tracker eIoni + 3 13.1 cm 4.11 cm -1.6 m 2.43 MeV 61.1 keV 38.1 cm 57.3 cm Tracker Transportation + 4 14.5 cm 9.12 cm -1.4 m 2.29 MeV 148 keV 24.1 cm 81.4 cm Chamber Transportation + 5 33.2 cm -1.59 cm -1.33 m 2.25 MeV 37.9 keV 22.7 cm 1.04 m Tracker eIoni + 6 1.07 m -29.4 cm -1.18 m 2.11 MeV 135 keV 81.7 cm 1.86 m Tracker eIoni + 7 1.99 m -53.2 cm -1.36 m 1.93 MeV 165 keV 97 cm 2.83 m Tracker eIoni + 8 2.05 m -52.3 cm -1.36 m 1.92 MeV 9.05 keV 5.74 cm 2.89 m Tracker eIoni + 9 2.4 m -47.6 cm -1.29 m 1.87 MeV 57.9 keV 36.9 cm 3.25 m Tracker Transportation + 10 2.7 m -41.8 cm -1.18 m 1.81 MeV 45.4 keV 32.1 cm 3.58 m World eIoni + 11 2.74 m -40.7 cm -1.16 m 1.8 MeV 10.3 keV 5.21 cm 3.63 m World eIoni + 12 2.91 m -35.3 cm -1.08 m 1.78 MeV 25.1 keV 19.5 cm 3.82 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 80, Parent ID = 69 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.7 m -41.8 cm -1.18 m 8.82 keV 0 eV 0 fm 0 fm World initStep + 1 2.7 m -41.9 cm -1.18 m 0 eV 8.82 keV 1.83 mm 1.83 mm World eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 79, Parent ID = 69 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.99 m -53.2 cm -1.36 m 13.4 keV 0 eV 0 fm 0 fm Tracker initStep + 1 1.99 m -53.4 cm -1.36 m 0 eV 13.4 keV 3.77 mm 3.77 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 78, Parent ID = 69 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 12.8 cm 4 cm -1.98 m 18.5 keV 0 eV 0 fm 0 fm Tracker initStep + 1 12.9 cm 3.69 cm -1.98 m 0 eV 18.5 keV 6.71 mm 6.71 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 77, Parent ID = 69 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 12.6 cm 3.62 cm -2.09 m 124 keV 0 eV 0 fm 0 fm Tracker initStep + 1 14.7 cm 15.3 cm -2.1 m 48.8 keV 59.7 keV 13.9 cm 13.9 cm Tracker eIoni + 2 14 cm 16.4 cm -2.11 m 0 eV 48.8 keV 3.82 cm 17.7 cm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 81, Parent ID = 77 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 14.7 cm 15.3 cm -2.1 m 15.7 keV 0 eV 0 fm 0 fm Tracker initStep + 1 14.7 cm 15.5 cm -2.09 m 0 eV 15.7 keV 4.96 mm 4.96 mm Tracker eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 68, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.17 mm -428 mum -2.4 m 5.08 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.24 mm -492 mum -2.4 m 5.08 MeV 0 eV 965 mum 965 mum Target Transportation + 2 -6.39 cm -5.4 cm -1.6 m 5.08 MeV 0 eV 80.4 cm 80.5 cm Tracker Transportation + 3 -7.93 cm -6.73 cm -1.4 m 5.08 MeV 0 eV 20.1 cm 1.01 m Chamber Transportation + 4 -12.6 cm -10.7 cm -80 cm 5.08 MeV 0 eV 60.3 cm 1.61 m Tracker Transportation + 5 -14.1 cm -12.1 cm -60 cm 5.08 MeV 0 eV 20.1 cm 1.81 m Chamber Transportation + 6 -18.7 cm -16.1 cm 0 fm 5.08 MeV 0 eV 60.3 cm 2.41 m Tracker Transportation + 7 -20.3 cm -17.4 cm 20 cm 5.08 MeV 0 eV 20.1 cm 2.61 m Chamber Transportation + 8 -24.9 cm -21.4 cm 80 cm 5.08 MeV 0 eV 60.3 cm 3.22 m Tracker Transportation + 9 -26.4 cm -22.8 cm 1 m 5.08 MeV 0 eV 20.1 cm 3.42 m Chamber Transportation + 10 -31.1 cm -26.8 cm 1.6 m 5.08 MeV 0 eV 60.3 cm 4.02 m Tracker Transportation + 11 -32.6 cm -28.1 cm 1.8 m 5.08 MeV 0 eV 20.1 cm 4.22 m Chamber Transportation + 12 -37.2 cm -32.1 cm 2.4 m 5.08 MeV 0 eV 60.3 cm 4.83 m Tracker Transportation + 13 -41.1 cm -35.5 cm 2.91 m 5.08 MeV 0 eV 51.3 cm 5.34 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 67, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.18 mm -429 mum -2.4 m 1.8 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2.2 mm -430 mum -2.4 m 1.8 MeV 0 eV 1.08 mm 1.08 mm Target Transportation + 2 -1.68 cm -1.33 mm -1.6 m 1.8 MeV 0 eV 80 cm 80.1 cm Tracker Transportation + 3 -2.05 cm -1.55 mm -1.4 m 1.8 MeV 0 eV 20 cm 1 m Chamber Transportation + 4 -3.14 cm -2.22 mm -80 cm 1.8 MeV 0 eV 60 cm 1.6 m Tracker Transportation + 5 -3.51 cm -2.45 mm -60 cm 1.8 MeV 0 eV 20 cm 1.8 m Chamber Transportation + 6 -4.6 cm -3.12 mm 0 fm 1.8 MeV 0 eV 60 cm 2.4 m Tracker Transportation + 7 -4.97 cm -3.34 mm 20 cm 1.8 MeV 0 eV 20 cm 2.6 m Chamber Transportation + 8 -6.06 cm -4.02 mm 80 cm 1.8 MeV 0 eV 60 cm 3.2 m Tracker Transportation + 9 -6.43 cm -4.24 mm 1 m 1.8 MeV 0 eV 20 cm 3.4 m Chamber Transportation + 10 -7.52 cm -4.91 mm 1.6 m 1.8 MeV 0 eV 60 cm 4 m Tracker Transportation + 11 -7.89 cm -5.14 mm 1.8 m 1.8 MeV 0 eV 20 cm 4.2 m Chamber Transportation + 12 -8.98 cm -5.81 mm 2.4 m 1.8 MeV 0 eV 60 cm 4.8 m Tracker Transportation + 13 -9.91 cm -6.38 mm 2.91 m 1.8 MeV 0 eV 51 cm 5.31 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 66, Parent ID = 65 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.05 mm -333 mum -2.4 m 320 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.29 mm -393 mum -2.4 m 0 eV 88 keV 1.2 mm 1.2 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 82, Parent ID = 66 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.29 mm -393 mum -2.4 m 232 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.29 mm -394 mum -2.4 m 0 eV 232 keV 102 mum 102 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 30, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -595 mum -19.6 mum -2.41 m 329 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.14 mm -126 mum -2.41 m 0 eV 88 keV 3.78 mm 3.78 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 83, Parent ID = 30 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.14 mm -126 mum -2.41 m 241 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.14 mm -132 mum -2.41 m 0 eV 241 keV 108 mum 108 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 29, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -531 mum 4.5 mum -2.41 m 349 keV 0 eV 0 fm 0 fm Target initStep + 1 -716 mum -53.1 mum -2.41 m 0 eV 88 keV 1.9 mm 1.9 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 84, Parent ID = 29 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -716 mum -53.1 mum -2.41 m 261 keV 0 eV 0 fm 0 fm Target initStep + 1 -718 mum -56.4 mum -2.41 m 0 eV 261 keV 122 mum 122 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 28, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -479 mum 28.5 nm -2.41 m 7.65 MeV 0 eV 0 fm 0 fm Target initStep + 1 -527 mum 8.38 mum -2.41 m 909 keV 0 eV 554 mum 554 mum Target compt + 2 786 mum 6.28 mm -2.41 m 0 eV 88 keV 7.45 mm 8 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 86, Parent ID = 28 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 786 mum 6.28 mm -2.41 m 821 keV 0 eV 0 fm 0 fm Target initStep + 1 807 mum 6.32 mm -2.41 m 0 eV 821 keV 569 mum 569 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 85, Parent ID = 28 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -527 mum 8.38 mum -2.41 m 6.74 MeV 0 eV 0 fm 0 fm Target initStep + 1 -540 mum 17.6 mum -2.41 m 6.11 MeV 108 keV 90.5 mum 90.5 mum Target eBrem + 2 -529 mum -22.6 mum -2.41 m 5.08 MeV 384 keV 205 mum 296 mum Target eBrem + 3 -220 mum -251 mum -2.41 m 3.59 MeV 838 keV 740 mum 1.04 mm Target eBrem + 4 28.1 mum 785 mum -2.41 m 914 keV 2.07 MeV 1.9 mm 2.94 mm Target eBrem + 5 49.7 mum 820 mum -2.41 m 0 eV 914 keV 647 mum 3.59 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 90, Parent ID = 85 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 28.1 mum 785 mum -2.41 m 605 keV 0 eV 0 fm 0 fm Target initStep + 1 6.07 mm 1.08 cm -2.4 m 605 keV 0 eV 1.45 cm 1.45 cm Target Transportation + 2 1.44 m 2.4 m -36.4 cm 605 keV 0 eV 3.45 m 3.47 m Tracker Transportation + 3 1.75 m 2.91 m 7.09 cm 605 keV 0 eV 73.7 cm 4.2 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 89, Parent ID = 85 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -220 mum -251 mum -2.41 m 658 keV 0 eV 0 fm 0 fm Target initStep + 1 2.5 cm 5.52 mm -2.41 m 658 keV 0 eV 2.59 cm 2.59 cm Target Transportation + 2 2.91 m 66.6 cm -2.43 m 658 keV 0 eV 2.96 m 2.99 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 88, Parent ID = 85 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -529 mum -22.6 mum -2.41 m 641 keV 0 eV 0 fm 0 fm Target initStep + 1 -460 mum -22.6 mum -2.41 m 0 eV 88 keV 78.2 mum 78.2 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 91, Parent ID = 88 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -460 mum -22.6 mum -2.41 m 553 keV 0 eV 0 fm 0 fm Target initStep + 1 -437 mum -19.4 mum -2.41 m 0 eV 553 keV 345 mum 345 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 87, Parent ID = 85 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -540 mum 17.6 mum -2.41 m 529 keV 0 eV 0 fm 0 fm Target initStep + 1 1.89 mm -978 mum -2.4 m 0 eV 88 keV 8.15 mm 8.15 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 92, Parent ID = 87 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.89 mm -978 mum -2.4 m 441 keV 0 eV 0 fm 0 fm Target initStep + 1 1.89 mm -970 mum -2.4 m 0 eV 441 keV 255 mum 255 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 27, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -331 mum 944 nm -2.41 m 4.8 MeV 0 eV 0 fm 0 fm Target initStep + 1 -886 mum 60.1 mum -2.41 m 0 eV 0 eV 5.65 mm 5.65 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 94, Parent ID = 27 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -886 mum 60.1 mum -2.41 m 2.34 MeV 0 eV 0 fm 0 fm Target initStep + 1 -882 mum 60 mum -2.41 m 0 eV 2.34 MeV 1.87 mm 1.87 mm Target eIoni + 2 -882 mum 60 mum -2.41 m 0 eV 0 eV 0 fm 1.87 mm Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 96, Parent ID = 94 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -882 mum 60 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.23 mm 1.93 mm -2.41 m 221 keV 0 eV 1.92 mm 1.92 mm Target compt + 2 -762 mum 1.15 mm -2.4 m 0 eV 88 keV 1.88 mm 3.8 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 98, Parent ID = 96 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -762 mum 1.15 mm -2.4 m 133 keV 0 eV 0 fm 0 fm Target initStep + 1 -760 mum 1.15 mm -2.4 m 0 eV 133 keV 43.7 mum 43.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 97, Parent ID = 96 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.23 mm 1.93 mm -2.41 m 290 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.24 mm 1.93 mm -2.41 m 0 eV 290 keV 142 mum 142 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 95, Parent ID = 94 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -882 mum 60 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -441 mum -2.28 mm -2.41 m 352 keV 0 eV 2.41 mm 2.41 mm Target compt + 2 962 mum -4.22 mm -2.4 m 0 eV 88 keV 3.26 mm 5.68 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 100, Parent ID = 95 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 962 mum -4.22 mm -2.4 m 264 keV 0 eV 0 fm 0 fm Target initStep + 1 961 mum -4.23 mm -2.4 m 0 eV 264 keV 124 mum 124 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 99, Parent ID = 95 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -441 mum -2.28 mm -2.41 m 159 keV 0 eV 0 fm 0 fm Target initStep + 1 -442 mum -2.29 mm -2.41 m 0 eV 159 keV 57.4 mum 57.4 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 93, Parent ID = 27 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -886 mum 60.1 mum -2.41 m 1.43 MeV 0 eV 0 fm 0 fm Target initStep + 1 -618 mum 102 mum -2.41 m 288 keV 746 keV 533 mum 533 mum Target eBrem + 2 -627 mum 98.8 mum -2.41 m 0 eV 288 keV 141 mum 674 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 101, Parent ID = 93 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -618 mum 102 mum -2.41 m 400 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.44 mm -44.5 mum -2.41 m 258 keV 0 eV 1.19 mm 1.19 mm Target compt + 2 -3.62 mm 375 mum -2.41 m 133 keV 0 eV 2.45 mm 3.64 mm Target compt + 3 -2.88 mm -182 mum -2.41 m 97.7 keV 0 eV 935 mum 4.58 mm Target compt + 4 -2.88 mm -181 mum -2.41 m 0 eV 88 keV 2.06 mum 4.58 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 105, Parent ID = 101 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.88 mm -181 mum -2.41 m 9.74 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.88 mm -180 mum -2.41 m 0 eV 9.74 keV 674 nm 674 nm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 104, Parent ID = 101 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.88 mm -182 mum -2.41 m 35.3 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.88 mm -182 mum -2.41 m 0 eV 35.3 keV 5.11 mum 5.11 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 103, Parent ID = 101 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.62 mm 375 mum -2.41 m 125 keV 0 eV 0 fm 0 fm Target initStep + 1 -3.63 mm 376 mum -2.41 m 0 eV 125 keV 39.2 mum 39.2 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 102, Parent ID = 101 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.44 mm -44.5 mum -2.41 m 143 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.44 mm -45.3 mum -2.41 m 0 eV 143 keV 48.7 mum 48.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 26, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -300 mum -4.2 mum -2.41 m 451 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.25 mm 86.4 mum -2.4 m 199 keV 0 eV 8.73 mm 8.73 mm Target compt + 2 -507 mum -22.1 mum -2.4 m 0 eV 88 keV 802 mum 9.53 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 107, Parent ID = 26 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -507 mum -22.1 mum -2.4 m 111 keV 0 eV 0 fm 0 fm Target initStep + 1 -506 mum -23.7 mum -2.4 m 0 eV 111 keV 32.6 mum 32.6 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 106, Parent ID = 26 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.25 mm 86.4 mum -2.4 m 252 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.26 mm 86.9 mum -2.4 m 0 eV 252 keV 115 mum 115 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 25, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -260 mum -6.53 mum -2.41 m 349 keV 0 eV 0 fm 0 fm Target initStep + 1 -409 mum -4.01 mum -2.41 m 0 eV 88 keV 1.19 mm 1.19 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 108, Parent ID = 25 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -409 mum -4.01 mum -2.41 m 261 keV 0 eV 0 fm 0 fm Target initStep + 1 -407 mum -4.23 mum -2.41 m 0 eV 261 keV 121 mum 121 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 24, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -162 mum 14.6 mum -2.41 m 1.12 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.21 mm -7.46 mum -2.41 m 0 eV 88 keV 8.09 mm 8.09 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 109, Parent ID = 24 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.21 mm -7.46 mum -2.41 m 1.03 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.21 mm -3.52 mum -2.41 m 0 eV 1.03 MeV 749 mum 749 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 23, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -128 mum 32 mum -2.41 m 983 keV 0 eV 0 fm 0 fm Target initStep + 1 -385 mum 24.2 mum -2.41 m 830 keV 0 eV 5.53 mm 5.53 mm Target compt + 2 -5.1 mm -1.01 mm -2.4 m 830 keV 0 eV 1.03 cm 1.58 cm Target Transportation + 3 -2.4 m -52.7 cm 2.23 m 830 keV 0 eV 5.24 m 5.26 m Tracker Transportation + 4 -2.75 m -60.4 cm 2.91 m 830 keV 0 eV 76.5 cm 6.02 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 110, Parent ID = 23 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -385 mum 24.2 mum -2.41 m 153 keV 0 eV 0 fm 0 fm Target initStep + 1 -382 mum 24.9 mum -2.41 m 0 eV 153 keV 54.1 mum 54.1 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 22, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -119 mum 29 mum -2.41 m 5.79 MeV 0 eV 0 fm 0 fm Target initStep + 1 -985 mum 147 mum -2.4 m 5.79 MeV 0 eV 1.48 cm 1.48 cm Target Transportation + 2 -4.78 cm 6.55 mm -1.6 m 5.79 MeV 0 eV 80.1 cm 81.6 cm Tracker Transportation + 3 -5.95 cm 8.15 mm -1.4 m 5.79 MeV 0 eV 20 cm 1.02 m Chamber Transportation + 4 -9.46 cm 1.3 cm -80 cm 5.79 MeV 0 eV 60.1 cm 1.62 m Tracker Transportation + 5 -10.6 cm 1.46 cm -60 cm 5.79 MeV 0 eV 20 cm 1.82 m Chamber Transportation + 6 -14.1 cm 1.94 cm 0.114 fm 5.79 MeV 0 eV 60.1 cm 2.42 m Tracker Transportation + 7 -15.3 cm 2.1 cm 20 cm 5.79 MeV 0 eV 20 cm 2.62 m Chamber Transportation + 8 -18.8 cm 2.58 cm 80 cm 5.79 MeV 0 eV 60.1 cm 3.22 m Tracker Transportation + 9 -20 cm 2.74 cm 1 m 5.79 MeV 0 eV 20 cm 3.42 m Chamber Transportation + 10 -23.5 cm 3.22 cm 1.6 m 5.79 MeV 0 eV 60.1 cm 4.02 m Tracker Transportation + 11 -24.7 cm 3.38 cm 1.8 m 5.79 MeV 0 eV 20 cm 4.22 m Chamber Transportation + 12 -28.2 cm 3.86 cm 2.4 m 5.79 MeV 0 eV 60.1 cm 4.82 m Tracker Transportation + 13 -31.2 cm 4.26 cm 2.91 m 5.79 MeV 0 eV 51.1 cm 5.33 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 21, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -79.9 mum 15.8 mum -2.42 m 12.4 MeV 0 eV 0 fm 0 fm Target initStep + 1 -250 mum 43 mum -2.41 m 6.62 MeV 0 eV 5.41 mm 5.41 mm Target compt + 2 -1.34 mm -336 mum -2.41 m 0 eV 0 eV 3.95 mm 9.36 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 113, Parent ID = 21 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.34 mm -336 mum -2.41 m 3.26 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.2 mm -842 mum -2.41 m 2.04 MeV 899 keV 708 mum 708 mum Target eBrem + 2 -998 mum -725 mum -2.41 m 0 eV 2.04 MeV 1.62 mm 2.33 mm Target eIoni + 3 -998 mum -725 mum -2.41 m 0 eV 0 eV 0 fm 2.33 mm Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 116, Parent ID = 113 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -998 mum -725 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -683 mum -1.42 mm -2.41 m 0 eV 88 keV 773 mum 773 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 117, Parent ID = 116 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -683 mum -1.42 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -677 mum -1.43 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 115, Parent ID = 113 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -998 mum -725 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.01 mm 5.93 mm -2.41 m 0 eV 88 keV 7.37 mm 7.37 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 118, Parent ID = 115 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.01 mm 5.93 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.01 mm 5.94 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 114, Parent ID = 113 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.2 mm -842 mum -2.41 m 321 keV 0 eV 0 fm 0 fm Target initStep + 1 5.84 mm 1.91 mm -2.41 m 259 keV 0 eV 7.57 mm 7.57 mm Target compt + 2 6.24 mm 1.76 mm -2.41 m 0 eV 88 keV 535 mum 8.11 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 120, Parent ID = 114 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 6.24 mm 1.76 mm -2.41 m 171 keV 0 eV 0 fm 0 fm Target initStep + 1 6.24 mm 1.75 mm -2.41 m 0 eV 171 keV 64.6 mum 64.6 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 119, Parent ID = 114 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.84 mm 1.91 mm -2.41 m 61.6 keV 0 eV 0 fm 0 fm Target initStep + 1 5.84 mm 1.91 mm -2.41 m 0 eV 61.6 keV 12.6 mum 12.6 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 112, Parent ID = 21 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.34 mm -336 mum -2.41 m 2.33 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.39 mm -312 mum -2.41 m 0 eV 2.33 MeV 1.83 mm 1.83 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 111, Parent ID = 21 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -250 mum 43 mum -2.41 m 5.76 MeV 0 eV 0 fm 0 fm Target initStep + 1 -198 mum -9.31 mum -2.41 m 5.06 MeV 350 keV 226 mum 226 mum Target eBrem + 2 1.19 mm -862 mum -2.41 m 2.25 MeV 2.18 MeV 1.94 mm 2.16 mm Target eBrem + 3 1.15 mm -784 mum -2.41 m 1.81 MeV 150 keV 128 mum 2.29 mm Target eBrem + 4 1.18 mm -695 mum -2.41 m 0 eV 1.81 MeV 1.4 mm 3.69 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 123, Parent ID = 111 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.15 mm -784 mum -2.41 m 289 keV 0 eV 0 fm 0 fm Target initStep + 1 1.43 mm -90.3 mum -2.41 m 0 eV 88 keV 971 mum 971 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 124, Parent ID = 123 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.43 mm -90.3 mum -2.41 m 201 keV 0 eV 0 fm 0 fm Target initStep + 1 1.44 mm -91.3 mum -2.41 m 0 eV 201 keV 82.4 mum 82.4 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 122, Parent ID = 111 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.19 mm -862 mum -2.41 m 629 keV 0 eV 0 fm 0 fm Target initStep + 1 1.18 mm -824 mum -2.41 m 386 keV 0 eV 37.4 mum 37.4 mum Target compt + 2 2.47 mm 925 mum -2.41 m 0 eV 88 keV 3.85 mm 3.88 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 126, Parent ID = 122 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.47 mm 925 mum -2.41 m 298 keV 0 eV 0 fm 0 fm Target initStep + 1 2.48 mm 918 mum -2.41 m 0 eV 298 keV 147 mum 147 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 125, Parent ID = 122 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.18 mm -824 mum -2.41 m 243 keV 0 eV 0 fm 0 fm Target initStep + 1 1.18 mm -819 mum -2.41 m 0 eV 243 keV 109 mum 109 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 121, Parent ID = 111 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -198 mum -9.31 mum -2.41 m 355 keV 0 eV 0 fm 0 fm Target initStep + 1 -912 mum -2.35 mm -2.41 m 0 eV 88 keV 3.93 mm 3.93 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 127, Parent ID = 121 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -912 mum -2.35 mm -2.41 m 267 keV 0 eV 0 fm 0 fm Target initStep + 1 -916 mum -2.35 mm -2.41 m 0 eV 267 keV 126 mum 126 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 20, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -50.1 mum 30.7 mum -2.42 m 2.1 MeV 0 eV 0 fm 0 fm Target initStep + 1 -65 mum 36.5 mum -2.42 m 456 keV 0 eV 1.37 mm 1.37 mm Target compt + 2 216 mum -278 mum -2.42 m 0 eV 88 keV 425 mum 1.79 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 129, Parent ID = 20 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 216 mum -278 mum -2.42 m 368 keV 0 eV 0 fm 0 fm Target initStep + 1 218 mum -287 mum -2.42 m 0 eV 368 keV 199 mum 199 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 128, Parent ID = 20 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -65 mum 36.5 mum -2.42 m 1.64 MeV 0 eV 0 fm 0 fm Target initStep + 1 260 mum -187 mum -2.42 m 929 keV 714 keV 738 mum 738 mum Target eBrem + 2 275 mum -138 mum -2.42 m 0 eV 929 keV 660 mum 1.4 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 19, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -50.6 mum 32.8 mum -2.42 m 80.6 MeV 0 eV 0 fm 0 fm Target initStep + 1 -34.9 mum 32 mum -2.41 m 0 eV 0 eV 2.27 mm 2.27 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 131, Parent ID = 19 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -34.9 mum 32 mum -2.41 m 42.7 MeV 0 eV 0 fm 0 fm Target initStep + 1 -32.1 mum -26.6 mum -2.41 m 31.6 MeV 682 keV 614 mum 614 mum Target eBrem + 2 1.13 mm -763 mum -2.41 m 27.6 MeV 3.63 MeV 3.25 mm 3.86 mm Target eBrem + 3 1.1 mm -735 mum -2.41 m 25.8 MeV 293 keV 288 mum 4.15 mm Target eBrem + 4 1.1 mm -722 mum -2.41 m 23.1 MeV 160 keV 147 mum 4.29 mm Target eBrem + 5 1.15 mm -867 mum -2.41 m 10.4 MeV 12.7 MeV 1.81 mm 6.1 mm Target eBrem + 6 67.4 mum -98.2 mum -2.41 m 6.42 MeV 2.79 MeV 2.19 mm 8.29 mm Target eBrem + 7 -305 mum -960 mum -2.41 m 3.38 MeV 2.36 MeV 1.48 mm 9.77 mm Target eBrem + 8 -126 mum -1.05 mm -2.41 m 2.83 MeV 196 keV 213 mum 9.98 mm Target eBrem + 9 -464 mum -1.77 mm -2.41 m 708 keV 2.13 MeV 1.66 mm 1.16 cm Target eBrem + 10 -414 mum -1.76 mm -2.41 m 0 eV 708 keV 477 mum 1.21 cm Target eIoni + 11 -414 mum -1.76 mm -2.41 m 0 eV 0 eV 0 fm 1.21 cm Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 140, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -414 mum -1.76 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 45.9 mum -1.79 mm -2.41 m 0 eV 88 keV 473 mum 473 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 141, Parent ID = 140 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 45.9 mum -1.79 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 58.6 mum -1.8 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 139, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -414 mum -1.76 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.34 mm -1.51 mm -2.41 m 486 keV 0 eV 5.07 mm 5.07 mm Target compt + 2 -7.94 mm -2.21 mm -2.41 m 0 eV 88 keV 2.71 mm 7.78 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 143, Parent ID = 139 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -7.94 mm -2.21 mm -2.41 m 398 keV 0 eV 0 fm 0 fm Target initStep + 1 -7.95 mm -2.21 mm -2.41 m 0 eV 398 keV 221 mum 221 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 142, Parent ID = 139 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.34 mm -1.51 mm -2.41 m 25.3 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.34 mm -1.51 mm -2.41 m 0 eV 25.3 keV 2.95 mum 2.95 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 138, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -126 mum -1.05 mm -2.41 m 350 keV 0 eV 0 fm 0 fm Target initStep + 1 4.39 mm 3.39 mm -2.4 m 350 keV 0 eV 1.07 cm 1.07 cm Target Transportation + 2 2.4 m 2.36 m 2.15 m 350 keV 0 eV 5.66 m 5.67 m Tracker Transportation + 3 2.8 m 2.76 m 2.91 m 350 keV 0 eV 94.8 cm 6.61 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 137, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -305 mum -960 mum -2.41 m 676 keV 0 eV 0 fm 0 fm Target initStep + 1 1.65 mm -1.5 mm -2.41 m 615 keV 0 eV 2.03 mm 2.03 mm Target compt + 2 9.91 mm -7.86 mm -2.41 m 312 keV 0 eV 1.04 cm 1.25 cm Target compt + 3 8.19 mm -1.13 cm -2.41 m 0 eV 88 keV 3.89 mm 1.63 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 146, Parent ID = 137 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 8.19 mm -1.13 cm -2.41 m 224 keV 0 eV 0 fm 0 fm Target initStep + 1 8.18 mm -1.13 cm -2.41 m 0 eV 224 keV 97.1 mum 97.1 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 145, Parent ID = 137 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 9.91 mm -7.86 mm -2.41 m 303 keV 0 eV 0 fm 0 fm Target initStep + 1 9.92 mm -7.86 mm -2.41 m 0 eV 303 keV 151 mum 151 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 144, Parent ID = 137 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.65 mm -1.5 mm -2.41 m 62 keV 0 eV 0 fm 0 fm Target initStep + 1 1.65 mm -1.5 mm -2.41 m 0 eV 62 keV 12.7 mum 12.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 136, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 67.4 mum -98.2 mum -2.41 m 1.21 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.67 mm -1.47 cm -2.41 m 1.1 MeV 0 eV 1.54 cm 1.54 cm Target compt + 2 -981 mum -2.5 cm -2.41 m 1.1 MeV 0 eV 1.03 cm 2.57 cm Target Transportation + 3 19.3 cm -2.91 m -2.6 m 1.1 MeV 0 eV 2.9 m 2.92 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 147, Parent ID = 136 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.67 mm -1.47 cm -2.41 m 111 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.67 mm -1.47 cm -2.41 m 0 eV 111 keV 33 mum 33 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 135, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.1 mm -722 mum -2.41 m 2.48 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.39 mm 1.37 mm -2.4 m 2.48 MeV 0 eV 1.09 cm 1.09 cm Target Transportation + 2 2.32 cm 15.7 cm -1.6 m 2.48 MeV 0 eV 81.5 cm 82.6 cm Tracker Transportation + 3 2.87 cm 19.7 cm -1.4 m 2.48 MeV 0 eV 20.4 cm 1.03 m Chamber Transportation + 4 4.5 cm 31.4 cm -80 cm 2.48 MeV 0 eV 61.2 cm 1.64 m Tracker Transportation + 5 5.05 cm 35.3 cm -60 cm 2.48 MeV 0 eV 20.4 cm 1.85 m Chamber Transportation + 6 6.68 cm 47 cm 0 fm 2.48 MeV 0 eV 61.2 cm 2.46 m Tracker Transportation + 7 7.23 cm 50.9 cm 20 cm 2.48 MeV 0 eV 20.4 cm 2.66 m Chamber Transportation + 8 8.86 cm 62.6 cm 80 cm 2.48 MeV 0 eV 61.2 cm 3.27 m Tracker Transportation + 9 9.41 cm 66.5 cm 1 m 2.48 MeV 0 eV 20.4 cm 3.48 m Chamber Transportation + 10 11 cm 78.2 cm 1.6 m 2.48 MeV 0 eV 61.2 cm 4.09 m Tracker Transportation + 11 11.6 cm 82.1 cm 1.8 m 2.48 MeV 0 eV 20.4 cm 4.29 m Chamber Transportation + 12 13.2 cm 93.8 cm 2.4 m 2.48 MeV 0 eV 61.2 cm 4.9 m Tracker Transportation + 13 14.6 cm 1.04 m 2.91 m 2.48 MeV 0 eV 52 cm 5.42 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 134, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.1 mm -735 mum -2.41 m 1.57 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.34 mm 347 mum -2.4 m 1.57 MeV 0 eV 1.09 cm 1.09 cm Target Transportation + 2 1.9 cm 8.01 cm -1.6 m 1.57 MeV 0 eV 80.4 cm 81.5 cm Tracker Transportation + 3 2.34 cm 10 cm -1.4 m 1.57 MeV 0 eV 20.1 cm 1.02 m Chamber Transportation + 4 3.67 cm 16 cm -80 cm 1.57 MeV 0 eV 60.3 cm 1.62 m Tracker Transportation + 5 4.11 cm 18 cm -60 cm 1.57 MeV 0 eV 20.1 cm 1.82 m Chamber Transportation + 6 5.44 cm 24 cm 0.114 fm 1.57 MeV 0 eV 60.3 cm 2.42 m Tracker Transportation + 7 5.88 cm 25.9 cm 20 cm 1.57 MeV 0 eV 20.1 cm 2.62 m Chamber Transportation + 8 7.2 cm 31.9 cm 80 cm 1.57 MeV 0 eV 60.3 cm 3.23 m Tracker Transportation + 9 7.65 cm 33.9 cm 1 m 1.57 MeV 0 eV 20.1 cm 3.43 m Chamber Transportation + 10 8.97 cm 39.9 cm 1.6 m 1.57 MeV 0 eV 60.3 cm 4.03 m Tracker Transportation + 11 9.41 cm 41.9 cm 1.8 m 1.57 MeV 0 eV 20.1 cm 4.23 m Chamber Transportation + 12 10.7 cm 47.9 cm 2.4 m 1.57 MeV 0 eV 60.3 cm 4.84 m Tracker Transportation + 13 11.9 cm 52.9 cm 2.91 m 1.57 MeV 0 eV 51.3 cm 5.35 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 133, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.13 mm -763 mum -2.41 m 365 keV 0 eV 0 fm 0 fm Target initStep + 1 856 mum -426 mum -2.41 m 0 eV 88 keV 1.93 mm 1.93 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 148, Parent ID = 133 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 856 mum -426 mum -2.41 m 277 keV 0 eV 0 fm 0 fm Target initStep + 1 856 mum -419 mum -2.41 m 0 eV 277 keV 133 mum 133 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 132, Parent ID = 131 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -32.1 mum -26.6 mum -2.41 m 10.4 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.52 mm -541 mum -2.4 m 10.4 MeV 0 eV 1.42 cm 1.42 cm Target Transportation + 2 14.9 cm -3 cm -1.6 m 10.4 MeV 0 eV 81.4 cm 82.8 cm Tracker Transportation + 3 18.6 cm -3.74 cm -1.4 m 10.4 MeV 0 eV 20.3 cm 1.03 m Chamber Transportation + 4 29.5 cm -5.95 cm -80 cm 10.4 MeV 0 eV 61 cm 1.64 m Tracker Transportation + 5 33.2 cm -6.69 cm -60 cm 10.4 MeV 0 eV 20.3 cm 1.85 m Chamber Transportation + 6 44.2 cm -8.9 cm -0.114 fm 10.4 MeV 0 eV 61 cm 2.46 m Tracker Transportation + 7 47.8 cm -9.64 cm 20 cm 10.4 MeV 0 eV 20.3 cm 2.66 m Chamber Transportation + 8 58.8 cm -11.8 cm 80 cm 10.4 MeV 0 eV 61 cm 3.27 m Tracker Transportation + 9 62.5 cm -12.6 cm 1 m 10.4 MeV 0 eV 20.3 cm 3.47 m Chamber Transportation + 10 73.5 cm -14.8 cm 1.6 m 10.4 MeV 0 eV 61 cm 4.08 m Tracker Transportation + 11 77.1 cm -15.5 cm 1.8 m 10.4 MeV 0 eV 20.3 cm 4.29 m Chamber Transportation + 12 88.1 cm -17.7 cm 2.4 m 10.4 MeV 0 eV 61 cm 4.9 m Tracker Transportation + 13 97.4 cm -19.6 cm 2.91 m 10.4 MeV 0 eV 51.9 cm 5.42 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 130, Parent ID = 19 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -34.9 mum 32 mum -2.41 m 36.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 -58.3 mum 17.4 mum -2.41 m 27.3 MeV 516 keV 394 mum 394 mum Target eBrem + 2 -3.03 mum 13.9 mum -2.41 m 26.4 MeV 513 keV 451 mum 845 mum Target eBrem + 3 28.5 mum 427 mum -2.41 m 11.6 MeV 1.42 MeV 1.29 mm 2.13 mm Target eBrem + 4 2.58 mum 448 mum -2.41 m 9.09 MeV 78.1 keV 75.9 mum 2.21 mm Target eBrem + 5 -2.86 mm 980 mum -2.41 m 3.9 MeV 3.41 MeV 3.03 mm 5.24 mm Target eBrem + 6 -2.85 mm 968 mum -2.41 m 3.52 MeV 22.7 keV 26.8 mum 5.26 mm Target eBrem + 7 -2.9 mm 1.6 mm -2.41 m 915 keV 1.93 MeV 1.55 mm 6.81 mm Target eBrem + 8 -2.91 mm 1.56 mm -2.41 m 0 eV 915 keV 649 mum 7.46 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 155, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.9 mm 1.6 mm -2.41 m 672 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.18 mm -2.05 mm -2.41 m 567 keV 0 eV 6.27 mm 6.27 mm Target compt + 2 -5.98 mm -3.71 mm -2.4 m 0 eV 88 keV 8.27 mm 1.45 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 157, Parent ID = 155 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.98 mm -3.71 mm -2.4 m 479 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.98 mm -3.72 mm -2.4 m 0 eV 479 keV 285 mum 285 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 156, Parent ID = 155 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.18 mm -2.05 mm -2.41 m 104 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.19 mm -2.05 mm -2.41 m 0 eV 104 keV 29.6 mum 29.6 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 154, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.85 mm 968 mum -2.41 m 362 keV 0 eV 0 fm 0 fm Target initStep + 1 -597 mum -3.38 mm -2.42 m 0 eV 88 keV 7.49 mm 7.49 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 158, Parent ID = 154 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -597 mum -3.38 mm -2.42 m 274 keV 0 eV 0 fm 0 fm Target initStep + 1 -595 mum -3.38 mm -2.42 m 0 eV 274 keV 131 mum 131 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 153, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -2.86 mm 980 mum -2.41 m 1.77 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.24 mm -8.57 mm -2.42 m 0 eV 0 eV 1.27 cm 1.27 cm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 160, Parent ID = 153 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.24 mm -8.57 mm -2.42 m 688 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.23 mm -8.61 mm -2.42 m 0 eV 688 keV 460 mum 460 mum Target eIoni + 2 -4.23 mm -8.61 mm -2.42 m 0 eV 0 eV 0 fm 460 mum Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 162, Parent ID = 160 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.23 mm -8.61 mm -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.23 mm -8.67 mm -2.42 m 0 eV 88 keV 54.3 mum 54.3 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 163, Parent ID = 162 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.23 mm -8.67 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.33 mm -8.63 mm -2.42 m 142 keV 281 keV 207 mum 207 mum Target eBrem + 2 -4.33 mm -8.63 mm -2.42 m 0 eV 142 keV 48.1 mum 255 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 161, Parent ID = 160 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.23 mm -8.61 mm -2.42 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.21 mm -7.06 mm -2.42 m 0 eV 88 keV 1.57 mm 1.57 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 164, Parent ID = 161 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.21 mm -7.06 mm -2.42 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.23 mm -7.06 mm -2.42 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 159, Parent ID = 153 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -4.24 mm -8.57 mm -2.42 m 64.8 keV 0 eV 0 fm 0 fm Target initStep + 1 -4.24 mm -8.57 mm -2.42 m 0 eV 64.8 keV 13.7 mum 13.7 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 152, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.58 mum 448 mum -2.41 m 2.39 MeV 0 eV 0 fm 0 fm Target initStep + 1 -5.12 mm 3.46 mm -2.4 m 2.39 MeV 0 eV 1.38 cm 1.38 cm Target Transportation + 2 -66.3 cm 39 cm -80 cm 2.39 MeV 0 eV 1.77 m 1.79 m Tracker Transportation + 3 -67.2 cm 39.5 cm -77.8 cm 2.39 MeV 0 eV 2.4 cm 1.81 m Chamber Transportation + 4 -99.2 cm 58.3 cm -0.114 fm 2.39 MeV 0 eV 86.2 cm 2.67 m Tracker Transportation + 5 -1.07 m 63.2 cm 20 cm 2.39 MeV 0 eV 22.2 cm 2.89 m Chamber Transportation + 6 -1.32 m 77.6 cm 80 cm 2.39 MeV 0 eV 66.5 cm 3.56 m Tracker Transportation + 7 -1.4 m 82.5 cm 1 m 2.39 MeV 0 eV 22.2 cm 3.78 m Chamber Transportation + 8 -1.65 m 97 cm 1.6 m 2.39 MeV 0 eV 66.5 cm 4.45 m Tracker Transportation + 9 -1.73 m 1.02 m 1.8 m 2.39 MeV 0 eV 22.2 cm 4.67 m Chamber Transportation + 10 -1.98 m 1.16 m 2.4 m 2.39 MeV 0 eV 66.5 cm 5.33 m Tracker Transportation + 11 -2.19 m 1.29 m 2.91 m 2.39 MeV 0 eV 56.5 cm 5.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 151, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 28.5 mum 427 mum -2.41 m 13.5 MeV 0 eV 0 fm 0 fm Target initStep + 1 -4.3 mm 2.88 mm -2.4 m 13.5 MeV 0 eV 1.35 cm 1.35 cm Target Transportation + 2 -55.7 cm 31.6 cm -80 cm 13.5 MeV 0 eV 1.72 m 1.73 m Tracker Transportation + 3 -62.6 cm 35.5 cm -60 cm 13.5 MeV 0 eV 21.5 cm 1.95 m Chamber Transportation + 4 -83.4 cm 47.2 cm 0.114 fm 13.5 MeV 0 eV 64.6 cm 2.6 m Tracker Transportation + 5 -90.3 cm 51.1 cm 20 cm 13.5 MeV 0 eV 21.5 cm 2.81 m Chamber Transportation + 6 -1.11 m 62.9 cm 80 cm 13.5 MeV 0 eV 64.6 cm 3.46 m Tracker Transportation + 7 -1.18 m 66.8 cm 1 m 13.5 MeV 0 eV 21.5 cm 3.67 m Chamber Transportation + 8 -1.39 m 78.5 cm 1.6 m 13.5 MeV 0 eV 64.6 cm 4.32 m Tracker Transportation + 9 -1.46 m 82.4 cm 1.8 m 13.5 MeV 0 eV 21.5 cm 4.53 m Chamber Transportation + 10 -1.66 m 94.2 cm 2.4 m 13.5 MeV 0 eV 64.6 cm 5.18 m Tracker Transportation + 11 -1.84 m 1.04 m 2.91 m 13.5 MeV 0 eV 54.9 cm 5.73 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 150, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -3.03 mum 13.9 mum -2.41 m 382 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.71 mum 15.5 mum -2.41 m 0 eV 88 keV 22.1 mum 22.1 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 165, Parent ID = 150 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.71 mum 15.5 mum -2.41 m 294 keV 0 eV 0 fm 0 fm Target initStep + 1 6.54 mum 11.4 mum -2.41 m 0 eV 294 keV 145 mum 145 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 149, Parent ID = 130 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -58.3 mum 17.4 mum -2.41 m 9.07 MeV 0 eV 0 fm 0 fm Target initStep + 1 201 mum -331 mum -2.4 m 0 eV 0 eV 1.24 cm 1.24 cm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 167, Parent ID = 149 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 201 mum -331 mum -2.4 m 2.8 MeV 0 eV 0 fm 0 fm Target initStep + 1 429 mum -1.43 mm -2.4 m 433 keV 2.36 MeV 2.04 mm 2.04 mm Target eBrem + 2 442 mum -1.45 mm -2.4 m 0 eV 433 keV 247 mum 2.29 mm Target eIoni + 3 442 mum -1.45 mm -2.4 m 0 eV 0 eV 0 fm 2.29 mm Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 169, Parent ID = 167 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 442 mum -1.45 mm -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 43.3 mum -1.23 mm -2.4 m 215 keV 0 eV 586 mum 586 mum Target compt + 2 -44.6 mum -1.12 mm -2.4 m 0 eV 88 keV 476 mum 1.06 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 171, Parent ID = 169 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -44.6 mum -1.12 mm -2.4 m 127 keV 0 eV 0 fm 0 fm Target initStep + 1 -46.5 mum -1.11 mm -2.4 m 0 eV 127 keV 40.2 mum 40.2 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 170, Parent ID = 169 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 43.3 mum -1.23 mm -2.4 m 296 keV 0 eV 0 fm 0 fm Target initStep + 1 38.5 mum -1.23 mm -2.4 m 0 eV 296 keV 146 mum 146 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 168, Parent ID = 167 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 442 mum -1.45 mm -2.4 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.37 mm -1.96 mm -2.4 m 361 keV 0 eV 1.37 mm 1.37 mm Target compt + 2 1.47 mm -1.96 mm -2.4 m 0 eV 88 keV 102 mum 1.47 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 173, Parent ID = 168 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.47 mm -1.96 mm -2.4 m 273 keV 0 eV 0 fm 0 fm Target initStep + 1 1.48 mm -1.96 mm -2.4 m 0 eV 273 keV 130 mum 130 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 172, Parent ID = 168 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.37 mm -1.96 mm -2.4 m 150 keV 0 eV 0 fm 0 fm Target initStep + 1 1.37 mm -1.97 mm -2.4 m 0 eV 150 keV 52.4 mum 52.4 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 166, Parent ID = 149 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 201 mum -331 mum -2.4 m 5.25 MeV 0 eV 0 fm 0 fm Target initStep + 1 275 mum -310 mum -2.4 m 2.25 MeV 235 keV 227 mum 227 mum Target eBrem + 2 529 mum -717 mum -2.4 m 1.24 MeV 1.01 MeV 758 mum 986 mum Target eBrem + 3 130 mum -712 mum -2.4 m 155 keV 1.08 MeV 722 mum 1.71 mm Target eBrem + 4 129 mum -710 mum -2.4 m 0 eV 155 keV 55.1 mum 1.76 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 174, Parent ID = 166 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 275 mum -310 mum -2.4 m 2.77 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.08 mm 41.3 mum -2.4 m 2.77 MeV 0 eV 1.83 mm 1.83 mm Target Transportation + 2 2.4 m 1.05 m 2.4 m 2.77 MeV 0 eV 5.47 m 5.47 m Tracker Transportation + 3 2.65 m 1.16 m 2.91 m 2.77 MeV 0 eV 58.1 cm 6.05 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 18, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -56.6 mum 30.1 mum -2.42 m 2.86 MeV 0 eV 0 fm 0 fm Target initStep + 1 -5.51 mum 38.6 mum -2.41 m 1.19 MeV 0 eV 5.74 mm 5.74 mm Target compt + 2 -1.65 mm -796 mum -2.41 m 280 keV 0 eV 2.81 mm 8.56 mm Target compt + 3 -1.97 mm 2.61 mm -2.41 m 180 keV 0 eV 3.5 mm 1.21 cm Target compt + 4 216 mum 3.17 mm -2.41 m 0 eV 88 keV 2.97 mm 1.5 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 178, Parent ID = 18 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 216 mum 3.17 mm -2.41 m 91.6 keV 0 eV 0 fm 0 fm Target initStep + 1 216 mum 3.17 mm -2.41 m 0 eV 91.6 keV 24.1 mum 24.1 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 177, Parent ID = 18 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.97 mm 2.61 mm -2.41 m 101 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.97 mm 2.62 mm -2.41 m 0 eV 101 keV 27.8 mum 27.8 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 176, Parent ID = 18 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.65 mm -796 mum -2.41 m 907 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.68 mm -820 mum -2.41 m 0 eV 907 keV 642 mum 642 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 175, Parent ID = 18 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.51 mum 38.6 mum -2.41 m 1.67 MeV 0 eV 0 fm 0 fm Target initStep + 1 36.3 mum 59.2 mum -2.41 m 0 eV 1.67 MeV 1.29 mm 1.29 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 17, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -53.4 mum 23 mum -2.42 m 2.03 MeV 0 eV 0 fm 0 fm Target initStep + 1 -122 mum 95.7 mum -2.41 m 0 eV 0 eV 9.24 mm 9.24 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 180, Parent ID = 17 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -122 mum 95.7 mum -2.41 m 626 keV 0 eV 0 fm 0 fm Target initStep + 1 -116 mum 97.2 mum -2.41 m 0 eV 626 keV 407 mum 407 mum Target eIoni + 2 -116 mum 97.2 mum -2.41 m 0 eV 0 eV 0 fm 407 mum Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 182, Parent ID = 180 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -116 mum 97.2 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 5.33 mm -5.15 mm -2.4 m 0 eV 88 keV 1.05 cm 1.05 cm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 183, Parent ID = 182 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 5.33 mm -5.15 mm -2.4 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 5.35 mm -5.16 mm -2.4 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 181, Parent ID = 180 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -116 mum 97.2 mum -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 -465 mum 433 mum -2.41 m 0 eV 88 keV 674 mum 674 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 184, Parent ID = 181 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -465 mum 433 mum -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 -480 mum 428 mum -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 179, Parent ID = 17 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -122 mum 95.7 mum -2.41 m 381 keV 0 eV 0 fm 0 fm Target initStep + 1 -125 mum 95.4 mum -2.41 m 0 eV 381 keV 209 mum 209 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 16, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -50.6 mum 21.7 mum -2.42 m 1.35 MeV 0 eV 0 fm 0 fm Target initStep + 1 -111 mum 56.9 mum -2.41 m 1.03 MeV 0 eV 3.63 mm 3.63 mm Target compt + 2 1.08 mm -544 mum -2.41 m 0 eV 88 keV 2.94 mm 6.56 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 186, Parent ID = 16 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.08 mm -544 mum -2.41 m 940 keV 0 eV 0 fm 0 fm Target initStep + 1 1.11 mm -560 mum -2.41 m 0 eV 940 keV 669 mum 669 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 185, Parent ID = 16 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -111 mum 56.9 mum -2.41 m 322 keV 0 eV 0 fm 0 fm Target initStep + 1 -119 mum 60.6 mum -2.41 m 0 eV 322 keV 164 mum 164 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 15, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -50 mum 21.5 mum -2.42 m 1.85 MeV 0 eV 0 fm 0 fm Target initStep + 1 -155 mum -9.9 mum -2.41 m 1.41 MeV 0 eV 9.67 mm 9.67 mm Target compt + 2 -2.97 mm 2.58 mm -2.4 m 1.41 MeV 0 eV 9.3 mm 1.9 cm Target Transportation + 3 -53.4 cm 49 cm -80 cm 1.41 MeV 0 eV 1.75 m 1.77 m Tracker Transportation + 4 -60 cm 55.1 cm -60 cm 1.41 MeV 0 eV 21.9 cm 1.99 m Chamber Transportation + 5 -79.9 cm 73.4 cm -0.114 fm 1.41 MeV 0 eV 65.8 cm 2.65 m Tracker Transportation + 6 -86.6 cm 79.5 cm 20 cm 1.41 MeV 0 eV 21.9 cm 2.87 m Chamber Transportation + 7 -1.06 m 97.8 cm 80 cm 1.41 MeV 0 eV 65.8 cm 3.53 m Tracker Transportation + 8 -1.13 m 1.04 m 1 m 1.41 MeV 0 eV 21.9 cm 3.75 m Chamber Transportation + 9 -1.33 m 1.22 m 1.6 m 1.41 MeV 0 eV 65.8 cm 4.41 m Tracker Transportation + 10 -1.4 m 1.28 m 1.8 m 1.41 MeV 0 eV 21.9 cm 4.63 m Chamber Transportation + 11 -1.6 m 1.47 m 2.4 m 1.41 MeV 0 eV 65.8 cm 5.28 m Tracker Transportation + 12 -1.76 m 1.62 m 2.91 m 1.41 MeV 0 eV 55.9 cm 5.84 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 187, Parent ID = 15 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -155 mum -9.9 mum -2.41 m 438 keV 0 eV 0 fm 0 fm Target initStep + 1 -146 mum -18.4 mum -2.41 m 0 eV 438 keV 253 mum 253 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 14, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -37.1 mum 21.5 mum -2.42 m 13.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 -725 mum 99.9 mum -2.4 m 13.9 MeV 0 eV 1.85 cm 1.85 cm Target Transportation + 2 -3.06 cm 3.5 mm -1.6 m 13.9 MeV 0 eV 80.1 cm 81.9 cm Tracker Transportation + 3 -3.8 cm 4.35 mm -1.4 m 13.9 MeV 0 eV 20 cm 1.02 m Chamber Transportation + 4 -6.04 cm 6.9 mm -80 cm 13.9 MeV 0 eV 60 cm 1.62 m Tracker Transportation + 5 -6.78 cm 7.75 mm -60 cm 13.9 MeV 0 eV 20 cm 1.82 m Chamber Transportation + 6 -9.02 cm 1.03 cm 0 fm 13.9 MeV 0 eV 60 cm 2.42 m Tracker Transportation + 7 -9.77 cm 1.11 cm 20 cm 13.9 MeV 0 eV 20 cm 2.62 m Chamber Transportation + 8 -12 cm 1.37 cm 80 cm 13.9 MeV 0 eV 60 cm 3.22 m Tracker Transportation + 9 -12.7 cm 1.45 cm 1 m 13.9 MeV 0 eV 20 cm 3.42 m Chamber Transportation + 10 -15 cm 1.71 cm 1.6 m 13.9 MeV 0 eV 60 cm 4.02 m Tracker Transportation + 11 -15.7 cm 1.79 cm 1.8 m 13.9 MeV 0 eV 20 cm 4.22 m Chamber Transportation + 12 -18 cm 2.05 cm 2.4 m 13.9 MeV 0 eV 60 cm 4.82 m Tracker Transportation + 13 -19.9 cm 2.27 cm 2.91 m 13.9 MeV 0 eV 51 cm 5.33 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 13, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -35 mum 21.1 mum -2.42 m 312 keV 0 eV 0 fm 0 fm Target initStep + 1 -115 mum 25.7 mum -2.42 m 204 keV 0 eV 2.9 mm 2.9 mm Target compt + 2 -768 mum -491 mum -2.42 m 0 eV 88 keV 838 mum 3.73 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 189, Parent ID = 13 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -768 mum -491 mum -2.42 m 116 keV 0 eV 0 fm 0 fm Target initStep + 1 -770 mum -490 mum -2.42 m 0 eV 116 keV 34.9 mum 34.9 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 188, Parent ID = 13 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -115 mum 25.7 mum -2.42 m 108 keV 0 eV 0 fm 0 fm Target initStep + 1 -114 mum 26.5 mum -2.42 m 0 eV 108 keV 31.5 mum 31.5 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 12, Parent ID = 5 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -10.4 mum -1.59 mum -2.42 m 400 keV 0 eV 0 fm 0 fm Target initStep + 1 -37.8 mum 3.47 mum -2.42 m 0 eV 88 keV 1.25 mm 1.25 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 190, Parent ID = 12 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -37.8 mum 3.47 mum -2.42 m 312 keV 0 eV 0 fm 0 fm Target initStep + 1 -39.6 mum 8.54 mum -2.42 m 0 eV 312 keV 157 mum 157 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 16.3 mum -21.4 mum -1.34 m 15.5 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -2.2 mm 587 mum -1.34 m 0 eV 15.5 keV 4.87 mm 4.87 mm Tracker eIoni + 0 -156 nm -787 nm -2.42 m 53.5 MeV 0 eV 0 fm 0 fm Target initStep + 1 -32.3 mum -3.98 mum -2.42 m 52.5 MeV 576 keV 513 mum 513 mum Target eBrem + 2 -382 mum -157 mum -2.42 m 47.6 MeV 3.57 MeV 2.42 mm 2.93 mm Target eBrem + 3 -365 mum -182 mum -2.42 m 46.5 MeV 657 keV 212 mum 3.14 mm Target eBrem + 4 -361 mum -246 mum -2.42 m 42.6 MeV 483 keV 398 mum 3.54 mm Target eBrem + 5 -353 mum -388 mum -2.42 m 38.9 MeV 951 keV 748 mum 4.29 mm Target eBrem + 6 -353 mum -1.72 mm -2.41 m 30.1 MeV 3.85 MeV 2.77 mm 7.06 mm Target eBrem + 7 -141 mum -1.86 mm -2.41 m 28.8 MeV 376 keV 302 mum 7.37 mm Target eBrem + 8 88.9 mum -1.98 mm -2.41 m 6.87 MeV 850 keV 313 mum 7.68 mm Target eBrem + 9 2.08 mm -531 mum -2.41 m 3.32 MeV 3.05 MeV 2.64 mm 1.03 cm Target eBrem + 10 2.06 mm -475 mum -2.41 m 1.82 MeV 1.1 MeV 703 mum 1.1 cm Target eBrem + 11 2.09 mm -1.11 mm -2.41 m 708 keV 1.11 MeV 1.13 mm 1.22 cm Target eBrem + 12 2.12 mm -1.13 mm -2.41 m 0 eV 708 keV 474 mum 1.26 cm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 200, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.06 mm -475 mum -2.41 m 401 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.5 mm -2.25 mm -2.41 m 0 eV 88 keV 4.01 mm 4.01 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 201, Parent ID = 200 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.5 mm -2.25 mm -2.41 m 313 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.51 mm -2.26 mm -2.41 m 0 eV 313 keV 158 mum 158 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 199, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.08 mm -531 mum -2.41 m 506 keV 0 eV 0 fm 0 fm Target initStep + 1 -433 mum -3.76 mm -2.41 m 0 eV 88 keV 6.98 mm 6.98 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 202, Parent ID = 199 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -433 mum -3.76 mm -2.41 m 418 keV 0 eV 0 fm 0 fm Target initStep + 1 -426 mum -3.77 mm -2.41 m 0 eV 418 keV 237 mum 237 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 198, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 88.9 mum -1.98 mm -2.41 m 21.1 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.84 mm -3.26 mm -2.41 m 0 eV 0 eV 3.72 mm 3.72 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 204, Parent ID = 198 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.84 mm -3.26 mm -2.41 m 5.28 MeV 0 eV 0 fm 0 fm Target initStep + 1 3.05 mm -3.27 mm -2.41 m 4.47 MeV 308 keV 282 mum 282 mum Target eBrem + 2 2.73 mm -2.82 mm -2.41 m 1.12 MeV 1.07 MeV 835 mum 1.12 mm Target eBrem + 3 2.98 mm -3.1 mm -2.41 m 34.4 keV 635 keV 702 mum 1.82 mm Target eBrem + 4 2.98 mm -3.1 mm -2.41 m 0 eV 34.4 keV 4.25 mum 1.82 mm Target eIoni + 5 2.98 mm -3.1 mm -2.41 m 0 eV 0 eV 0 fm 1.82 mm Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 209, Parent ID = 204 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.98 mm -3.1 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 3.09 mm -2.84 mm -2.41 m 0 eV 88 keV 290 mum 290 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 210, Parent ID = 209 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 3.09 mm -2.84 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 3.08 mm -2.82 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 208, Parent ID = 204 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.98 mm -3.1 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 1.66 mm -6.38 mm -2.41 m 0 eV 88 keV 3.65 mm 3.65 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 211, Parent ID = 208 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 1.66 mm -6.38 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 1.65 mm -6.4 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 207, Parent ID = 204 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.98 mm -3.1 mm -2.41 m 451 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.99 mm -3.14 mm -2.41 m 0 eV 88 keV 5.24 mm 5.24 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 212, Parent ID = 207 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.99 mm -3.14 mm -2.41 m 363 keV 0 eV 0 fm 0 fm Target initStep + 1 -2.01 mm -3.14 mm -2.41 m 0 eV 363 keV 195 mum 195 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 206, Parent ID = 204 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.73 mm -2.82 mm -2.41 m 2.28 MeV 0 eV 0 fm 0 fm Target initStep + 1 -1.94 mm -1.38 cm -2.41 m 809 keV 0 eV 1.25 cm 1.25 cm Target compt + 2 5.4 mm -2.5 cm -2.4 m 809 keV 0 eV 1.39 cm 2.65 cm Target Transportation + 3 1.15 cm -3.43 cm -2.4 m 809 keV 0 eV 1.16 cm 3.81 cm World Transportation + 4 1.56 m -2.4 m -1.61 m 809 keV 0 eV 2.93 m 2.97 m Tracker Transportation + 5 1.89 m -2.91 m -1.44 m 809 keV 0 eV 63.3 cm 3.6 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 213, Parent ID = 206 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.94 mm -1.38 cm -2.41 m 1.47 MeV 0 eV 0 fm 0 fm Target initStep + 1 -2 mm -1.38 cm -2.41 m 0 eV 1.47 MeV 1.12 mm 1.12 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 205, Parent ID = 204 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 3.05 mm -3.27 mm -2.41 m 499 keV 0 eV 0 fm 0 fm Target initStep + 1 2.4 mm -3.4 mm -2.41 m 0 eV 88 keV 1.64 mm 1.64 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 214, Parent ID = 205 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.4 mm -3.4 mm -2.41 m 411 keV 0 eV 0 fm 0 fm Target initStep + 1 2.4 mm -3.4 mm -2.41 m 0 eV 411 keV 232 mum 232 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 203, Parent ID = 198 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.84 mm -3.26 mm -2.41 m 14.8 MeV 0 eV 0 fm 0 fm Target initStep + 1 2.99 mm -3.32 mm -2.41 m 10.5 MeV 337 keV 187 mum 187 mum Target eBrem + 2 625 mum -3.39 mm -2.41 m 3.97 MeV 6.51 MeV 4.96 mm 5.15 mm Target eBrem + 3 715 mum -3.58 mm -2.41 m 0 eV 3.97 MeV 3.11 mm 8.26 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 215, Parent ID = 203 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 2.99 mm -3.32 mm -2.41 m 4.01 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.32 cm -7.99 mm -2.4 m 4.01 MeV 0 eV 1.58 cm 1.58 cm Target Transportation + 2 2.4 m -1.1 m 19.9 cm 4.01 MeV 0 eV 3.69 m 3.71 m Tracker Transportation + 3 2.91 m -1.34 m 75.4 cm 4.01 MeV 0 eV 78.9 cm 4.5 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 197, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -141 mum -1.86 mm -2.41 m 887 keV 0 eV 0 fm 0 fm Target initStep + 1 6.12 mm -5.58 mm -2.41 m 0 eV 88 keV 8.47 mm 8.47 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 216, Parent ID = 197 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 6.12 mm -5.58 mm -2.41 m 799 keV 0 eV 0 fm 0 fm Target initStep + 1 6.15 mm -5.6 mm -2.41 m 0 eV 799 keV 550 mum 550 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 196, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -353 mum -1.72 mm -2.41 m 4.92 MeV 0 eV 0 fm 0 fm Target initStep + 1 562 mum -2.43 mm -2.41 m 0 eV 0 eV 1.42 mm 1.42 mm Target conv + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 218, Parent ID = 196 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 562 mum -2.43 mm -2.41 m 455 keV 0 eV 0 fm 0 fm Target initStep + 1 573 mum -2.46 mm -2.41 m 0 eV 455 keV 265 mum 265 mum Target eIoni + 2 573 mum -2.46 mm -2.41 m 0 eV 0 eV 0 fm 265 mum Target annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 220, Parent ID = 218 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 573 mum -2.46 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 665 mum -5.24 mm -2.41 m 0 eV 88 keV 3.41 mm 3.41 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 221, Parent ID = 220 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 665 mum -5.24 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 656 mum -5.24 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 219, Parent ID = 218 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 573 mum -2.46 mm -2.41 m 511 keV 0 eV 0 fm 0 fm Target initStep + 1 567 mum -2.29 mm -2.41 m 0 eV 88 keV 206 mum 206 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 222, Parent ID = 219 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 567 mum -2.29 mm -2.41 m 423 keV 0 eV 0 fm 0 fm Target initStep + 1 562 mum -2.29 mm -2.41 m 0 eV 423 keV 241 mum 241 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 217, Parent ID = 196 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 562 mum -2.43 mm -2.41 m 3.44 MeV 0 eV 0 fm 0 fm Target initStep + 1 1.81 mm -2.12 mm -2.41 m 1.15 MeV 2.29 MeV 1.87 mm 1.87 mm Target eBrem + 2 1.86 mm -2.1 mm -2.41 m 0 eV 1.15 MeV 846 mum 2.72 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 195, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -353 mum -388 mum -2.42 m 2.77 MeV 0 eV 0 fm 0 fm Target initStep + 1 -82.6 mum -4.79 mm -2.4 m 2.77 MeV 0 eV 1.66 cm 1.66 cm Target Transportation + 2 1.34 cm -22.4 cm -1.6 m 2.77 MeV 0 eV 83 cm 84.6 cm Tracker Transportation + 3 1.44 cm -24 cm -1.54 m 2.77 MeV 0 eV 5.86 cm 90.5 cm Chamber Transportation + 4 2.69 cm -44.4 cm -80 cm 2.77 MeV 0 eV 77.1 cm 1.68 m Tracker Transportation + 5 3.03 cm -49.9 cm -60 cm 2.77 MeV 0 eV 20.7 cm 1.88 m Chamber Transportation + 6 4.04 cm -66.4 cm 0 fm 2.77 MeV 0 eV 62.2 cm 2.51 m Tracker Transportation + 7 4.38 cm -71.9 cm 20 cm 2.77 MeV 0 eV 20.7 cm 2.71 m Chamber Transportation + 8 5.39 cm -88.4 cm 80 cm 2.77 MeV 0 eV 62.2 cm 3.34 m Tracker Transportation + 9 5.73 cm -93.8 cm 1 m 2.77 MeV 0 eV 20.7 cm 3.54 m Chamber Transportation + 10 6.74 cm -1.1 m 1.6 m 2.77 MeV 0 eV 62.2 cm 4.17 m Tracker Transportation + 11 7.07 cm -1.16 m 1.8 m 2.77 MeV 0 eV 20.7 cm 4.37 m Chamber Transportation + 12 8.09 cm -1.32 m 2.4 m 2.77 MeV 0 eV 62.2 cm 4.99 m Tracker Transportation + 13 8.95 cm -1.46 m 2.91 m 2.77 MeV 0 eV 52.9 cm 5.52 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 194, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -361 mum -246 mum -2.42 m 3.38 MeV 0 eV 0 fm 0 fm Target initStep + 1 359 mum -4.13 mm -2.4 m 482 keV 0 eV 1.44 cm 1.44 cm Target compt + 2 -5.74 mm -2.96 mm -2.4 m 246 keV 0 eV 6.33 mm 2.07 cm Target compt + 3 -5.19 mm -2.04 mm -2.4 m 246 keV 0 eV 1.99 mm 2.27 cm Target Transportation + 4 1.44 m 2.4 m 2.01 m 246 keV 0 eV 5.23 m 5.25 m Tracker Transportation + 5 1.73 m 2.89 m 2.91 m 246 keV 0 eV 1.07 m 6.31 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 224, Parent ID = 194 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -5.74 mm -2.96 mm -2.4 m 236 keV 0 eV 0 fm 0 fm Target initStep + 1 -5.74 mm -2.96 mm -2.4 m 0 eV 236 keV 105 mum 105 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 223, Parent ID = 194 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 359 mum -4.13 mm -2.4 m 2.9 MeV 0 eV 0 fm 0 fm Target initStep + 1 116 mum -4.31 mm -2.4 m 1.93 MeV 589 keV 491 mum 491 mum Target eBrem + 2 221 mum -4.25 mm -2.4 m 0 eV 1.93 MeV 1.5 mm 1.99 mm Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 225, Parent ID = 223 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 116 mum -4.31 mm -2.4 m 383 keV 0 eV 0 fm 0 fm Target initStep + 1 447 mum -4.07 mm -2.4 m 0 eV 88 keV 544 mum 544 mum Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 226, Parent ID = 225 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 447 mum -4.07 mm -2.4 m 295 keV 0 eV 0 fm 0 fm Target initStep + 1 454 mum -4.07 mm -2.4 m 0 eV 295 keV 145 mum 145 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 193, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -365 mum -182 mum -2.42 m 483 keV 0 eV 0 fm 0 fm Target initStep + 1 -352 mum -217 mum -2.42 m 248 keV 0 eV 360 mum 360 mum Target compt + 2 -1.6 mm -463 mum -2.42 m 0 eV 88 keV 1.28 mm 1.64 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 228, Parent ID = 193 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.6 mm -463 mum -2.42 m 160 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.61 mm -462 mum -2.42 m 0 eV 160 keV 57.8 mum 57.8 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 227, Parent ID = 193 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -352 mum -217 mum -2.42 m 235 keV 0 eV 0 fm 0 fm Target initStep + 1 -349 mum -217 mum -2.42 m 0 eV 235 keV 104 mum 104 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 192, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -382 mum -157 mum -2.42 m 1.33 MeV 0 eV 0 fm 0 fm Target initStep + 1 -115 mum -654 mum -2.41 m 298 keV 0 eV 6.48 mm 6.48 mm Target compt + 2 -1.1 mm 795 mum -2.41 m 0 eV 88 keV 1.81 mm 8.29 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 230, Parent ID = 192 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -1.1 mm 795 mum -2.41 m 210 keV 0 eV 0 fm 0 fm Target initStep + 1 -1.11 mm 797 mum -2.41 m 0 eV 210 keV 88.4 mum 88.4 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 229, Parent ID = 192 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -115 mum -654 mum -2.41 m 1.03 MeV 0 eV 0 fm 0 fm Target initStep + 1 -106 mum -668 mum -2.41 m 0 eV 1.03 MeV 746 mum 746 mum Target eIoni + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 191, Parent ID = 4 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -32.3 mum -3.98 mum -2.42 m 465 keV 0 eV 0 fm 0 fm Target initStep + 1 -789 nm -154 mum -2.42 m 0 eV 88 keV 2.99 mm 2.99 mm Target phot + +********************************************************************************************************* +* G4Track Information: Particle = e-, Track ID = 231, Parent ID = 191 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 -789 nm -154 mum -2.42 m 377 keV 0 eV 0 fm 0 fm Target initStep + 1 -6.8 mum -146 mum -2.42 m 0 eV 377 keV 206 mum 206 mum Target eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 1.22 mum -1.79 mum -2.31 m 50 keV 0 eV 0 fm 0 fm Tracker initStep - 1 -1.21 cm 1.4 cm -2.31 m 0 eV 50 keV 3.98 cm 3.98 cm Tracker eIoni + 0 19.9 nm 29.3 nm -2.69 m 9.33 keV 0 eV 0 fm 0 fm World initStep + 1 561 mum 755 mum -2.69 m 0 eV 9.33 keV 2.01 mm 2.01 mm World eIoni ********************************************************************************************************* * G4Track Information: Particle = e-, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -87.3 nm 53.9 nm -2.65 m 342 keV 0 eV 0 fm 0 fm World initStep - 1 -7.03 cm 15.4 cm -2.48 m 260 keV 53.4 keV 25.2 cm 25.2 cm World eIoni - 2 -13.4 cm 17.2 cm -2.4 m 233 keV 27.3 keV 11.7 cm 37 cm World Transportation - 3 -19.6 cm 18.6 cm -2.3 m 201 keV 31.5 keV 11.4 cm 48.3 cm Tracker msc - 4 -17.6 cm 15.6 cm -2.22 m 165 keV 35.6 keV 11.4 cm 59.7 cm Tracker msc - 5 -18.4 cm 7.01 cm -2.18 m 124 keV 42 keV 11.4 cm 71.1 cm Tracker msc - 6 -15 cm 7.81 cm -2.23 m 82.8 keV 40.7 keV 11.4 cm 82.5 cm Tracker msc - 7 -14 cm 7.31 cm -2.18 m 0 eV 82.8 keV 9.83 cm 92.3 cm Tracker eIoni - -********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 16, Parent ID = 2 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 -7.03 cm 15.4 cm -2.48 m 28.3 keV 0 eV 0 fm 0 fm World initStep - 1 -7.26 cm 14.8 cm -2.48 m 0 eV 28.3 keV 1.44 cm 1.44 cm World eIoni + 0 -19.4 nm -3.38 nm -2.82 m 9.5 keV 0 eV 0 fm 0 fm World initStep + 1 -949 mum 193 mum -2.82 m 0 eV 9.5 keV 2.07 mm 2.07 mm World eIoni >>> Event 0 0 trajectories stored in this event. ### Run 2 start. diff --git a/examples/novice/N02/src/ExN02DetectorConstruction.cc b/examples/novice/N02/src/ExN02DetectorConstruction.cc index 1d0d46ed3e..8c44705fe5 100644 --- a/examples/novice/N02/src/ExN02DetectorConstruction.cc +++ b/examples/novice/N02/src/ExN02DetectorConstruction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN02DetectorConstruction.cc,v 1.13 2003/10/06 08:59:40 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ExN02DetectorConstruction.cc,v 1.14 2004/04/05 16:21:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -95,7 +95,7 @@ G4VPhysicalVolume* ExN02DetectorConstruction::Construct() //Xenon gas G4Material* Xenon = new G4Material("XenonGas", z=54., a=131.29*g/mole, density= 5.458*mg/cm3, - kStateGas, temperature= 1*atmosphere, pressure= 293.15*kelvin); + kStateGas, temperature= 293.15*kelvin, pressure= 1*atmosphere); // Print all the materials defined. // diff --git a/examples/novice/N02/src/ExN02DetectorMessenger.cc b/examples/novice/N02/src/ExN02DetectorMessenger.cc index dc83696e76..9710ef8662 100644 --- a/examples/novice/N02/src/ExN02DetectorMessenger.cc +++ b/examples/novice/N02/src/ExN02DetectorMessenger.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN02DetectorMessenger.cc,v 1.9 2002/12/16 16:31:43 maire Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ExN02DetectorMessenger.cc,v 1.10 2004/04/05 16:21:23 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -60,7 +60,6 @@ ExN02DetectorMessenger::ExN02DetectorMessenger(ExN02DetectorConstruction* myDet) FieldCmd->SetGuidance("Define magnetic field."); FieldCmd->SetGuidance("Magnetic field will be in X direction."); FieldCmd->SetParameterName("Bx",false); - FieldCmd->SetDefaultUnit("tesla"); FieldCmd->SetUnitCategory("Magnetic flux density"); FieldCmd->AvailableForStates(G4State_PreInit,G4State_Idle); } diff --git a/examples/novice/N02/src/ExN02PhysicsList.cc b/examples/novice/N02/src/ExN02PhysicsList.cc index 8f81c2b934..621e5d8a0b 100644 --- a/examples/novice/N02/src/ExN02PhysicsList.cc +++ b/examples/novice/N02/src/ExN02PhysicsList.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN02PhysicsList.cc,v 1.17 2003/10/24 12:27:53 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ExN02PhysicsList.cc,v 1.18 2004/03/19 14:08:03 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -30,14 +30,8 @@ #include "globals.hh" #include "ExN02PhysicsList.hh" -#include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" -#include "G4ProcessVector.hh" #include "G4ParticleTypes.hh" -#include "G4ParticleTable.hh" -#include "G4Material.hh" -#include "G4ios.hh" -#include //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -65,7 +59,6 @@ void ExN02PhysicsList::ConstructParticle() ConstructLeptons(); ConstructMesons(); ConstructBaryons(); - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -202,7 +195,7 @@ void ExN02PhysicsList::ConstructEM() //all others charged particles except geantino pmanager->AddProcess(new G4MultipleScattering,-1, 1,1); pmanager->AddProcess(new G4hIonisation, -1, 2,2); - ///pmanager->AddProcess(new G4hUserSpecialCuts, -1,-1,3); + ///pmanager->AddProcess(new G4UserSpecialCuts, -1,-1,3); } } } diff --git a/examples/novice/N03/History b/examples/novice/N03/History index abf5d0c68f..2e9d7da536 100644 --- a/examples/novice/N03/History +++ b/examples/novice/N03/History @@ -1,4 +1,4 @@ -$Id: History,v 1.72 2003/12/01 21:09:20 perl Exp $ +$Id: History,v 1.75 2004/06/14 08:30:32 gcosmo Exp $ -------------------------------------------------- ========================================================= @@ -14,7 +14,16 @@ track of all tags. ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- - + +08-04-04 Guy Barrand (exampleN03-V06-01-00) +- exampleN03.cc : Windows : Have G4UI_USE_WIN32 in order to have + a default Windows GUI coworking with the OpenGL Windows driver. +- exN03Vis9.mac : demo of the OpenGL Windows driver. +- gui.mac : change menu items in order to reflect the used vis driver. + +19-03-04 M.Maire (exampleN03-V06-00-00) +- ExN03PhysicsList: cleanup of include. + 01-12-03 J.Perl (exampleN03-V05-02-08) - Removed extraneous flushes from visTutor/heprep.mac to match new endOfRunAction behavior. diff --git a/examples/novice/N03/exampleN03.cc b/examples/novice/N03/exampleN03.cc index 4e67abe097..ef0f15780d 100644 --- a/examples/novice/N03/exampleN03.cc +++ b/examples/novice/N03/exampleN03.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: exampleN03.cc,v 1.19 2003/09/15 15:38:08 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: exampleN03.cc,v 1.20 2004/04/08 09:03:32 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -37,6 +37,10 @@ #include "G4UIXm.hh" #endif +#ifdef G4UI_USE_WIN32 +#include "G4UIWin32.hh" +#endif + #include "Randomize.hh" #ifdef G4VIS_USE @@ -74,14 +78,14 @@ int main(int argc,char** argv) { if (argc==1) // Define UI session for interactive mode. { // G4UIterminal is a (dumb) terminal. -#ifdef G4UI_USE_XM +#if defined(G4UI_USE_XM) session = new G4UIXm(argc,argv); -#else -#ifdef G4UI_USE_TCSH +#elif defined(G4UI_USE_WIN32) + session = new G4UIWin32(); +#elif defined(G4UI_USE_TCSH) session = new G4UIterminal(new G4UItcsh); #else session = new G4UIterminal(); -#endif #endif } @@ -108,8 +112,8 @@ int main(int argc,char** argv) { { // G4UIterminal is a (dumb) terminal. UI->ApplyCommand("/control/execute vis.mac"); -#ifdef G4UI_USE_XM - // Customize the G4UIXm menubar with a macro file : +#if defined(G4UI_USE_XM) || defined(G4UI_USE_WIN32) + // Customize the G4UIXm,Win32 menubar with a macro file : UI->ApplyCommand("/control/execute visTutor/gui.mac"); #endif session->SessionStart(); diff --git a/examples/novice/N03/exampleN03.out b/examples/novice/N03/exampleN03.out index 1cf9bc57e0..6fae830e2e 100644 --- a/examples/novice/N03/exampleN03.out +++ b/examples/novice/N03/exampleN03.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -127,8 +127,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -137,7 +137,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -159,7 +159,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -201,8 +201,8 @@ Index : 2 used in the geometry : Yes recalculation needed : No Current couple of seeds = 9876, 54321 ---------------------------------------- ---> End of event: 0 - Absorber: total energy: 280.51911 MeV total track length: 19.264691 cm - Gap: total energy: 11.548292 MeV total track length: 5.5307824 cm + Absorber: total energy: 262.11291 MeV total track length: 18.054157 cm + Gap: total energy: 7.119194 MeV total track length: 3.1139096 cm Transportation, hIoni, msc, eIoni eBrem, annihil, conv, compt phot, MuIoni, MuBrems, MuPairProd @@ -213,11 +213,11 @@ Index : 2 used in the geometry : Yes recalculation needed : No --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 582988679, 2123498096 + Current couple of seeds = 977069010, 720029362 ---------------------------------------- ---> End of event: 0 - Absorber: total energy: 266.10483 MeV total track length: 19.130814 cm - Gap: total energy: 25.780135 MeV total track length: 13.01794 cm + Absorber: total energy: 286.12027 MeV total track length: 19.333389 cm + Gap: total energy: 13.035624 MeV total track length: 6.0435656 cm ------------------------------------------------------------ ---> The calorimeter is 30 layers of: [ 20mm of Aluminium + 50mm of Aerogel ] @@ -266,8 +266,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -276,7 +276,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -298,7 +298,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -311,10 +311,10 @@ msc: Model variant of multiple scattering for pi- --------- Ranecu engine status --------- Initial seed (index) = 0 - Current couple of seeds = 627474132, 1958347498 + Current couple of seeds = 2081483369, 416920707 ---------------------------------------- ---> End of event: 0 - Absorber: total energy: 413.90611 MeV total track length: 98.024553 cm - Gap: total energy: 84.19009 MeV total track length: 2.3895934 m + Absorber: total energy: 370.42362 MeV total track length: 88.544994 cm + Gap: total energy: 75.314808 MeV total track length: 2.1344949 m Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/novice/N03/src/ExN03PhysicsList.cc b/examples/novice/N03/src/ExN03PhysicsList.cc index 24ac78729b..2d6d715d8d 100644 --- a/examples/novice/N03/src/ExN03PhysicsList.cc +++ b/examples/novice/N03/src/ExN03PhysicsList.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN03PhysicsList.cc,v 1.17 2003/10/24 12:34:15 maire Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: ExN03PhysicsList.cc,v 1.18 2004/03/19 14:58:21 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -31,13 +31,8 @@ #include "ExN03PhysicsList.hh" -#include "G4ParticleDefinition.hh" #include "G4ProcessManager.hh" -#include "G4ProcessVector.hh" #include "G4ParticleTypes.hh" -#include "G4ParticleTable.hh" -#include "G4Material.hh" -#include "G4ios.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/examples/novice/N03/visTutor/exN03Vis10.mac b/examples/novice/N03/visTutor/exN03Vis10.mac new file mode 100644 index 0000000000..0f74a53b61 --- /dev/null +++ b/examples/novice/N03/visTutor/exN03Vis10.mac @@ -0,0 +1,66 @@ +####################################################################### +# MACRO FILE NAME: exN03Vis10.mac # +# # +# AUTHOR(S): Guy Barrand # +# # +# DATE: June 09, 2000 # +# # +# CONTENTS: A basic macro for demonstrating Inventor driver # +# # +# USAGE: % $G4BINDIR/exampleN03 visTutor/exN03Vis6.mac # +# # +# REQUIRED PLATFORMS & SOFTWARES: Windows, # +# some Inventor (TGS, SGI, Coin) # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR INSTALLATION: # +# (See geant4/source/visualization/README for details.) # +# # +# G4VIS_BUILD_OIWIN32_DRIVER # +# G4UI_BUILD_WIN32_SESSION # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR COMPILATION: # +# (See geant4/source/visualization/README for details.) # +# # +# G4VIS_USE_OIWIN32 # +# G4UI_USE_WIN32 # +# # +# ADDITIONAL NOTES: # +# # +####################################################################### + +# Create "scene-0" +/vis/scene/create + +# Invoke the OpenInventor driver +/vis/sceneHandler/create OIWin32 +/vis/viewer/create + +# Add the world volume to the current scene +/vis/scene/add/volume +#/vis/scene/add/trajectories +/tracking/storeTrajectory 1 + +# Bird-eye view of events +/vis/viewer/reset +/vis/viewer/set/viewpointThetaPhi 45 45 + +# Attach the just created Go scene graph to the viewer. +/vis/viewer/update +# Attach the just created Go scene graph to the viewer. +/vis/viewer/update +/vis/scene/notifyHandlers + +/run/beamOn 1 + +####################################################################### +# Controls on an Inventor examiner viewer are : # +# - in picking mode (cursor is the upper left arrow) # +# Ctrl + pick an volume : see daughters. # +# Shift + pick an volume : see mother. # +# - in viewing mode (cursor is the hand) # +# Left-button + pointer move : rotate. # +# Ctrl+Left-button + pointer move : pane. # +# Ctrl+Shift+Left-button + pointer move : scale. # +# Middle-button + pointer move : pane. # +# # +####################################################################### diff --git a/examples/novice/N03/visTutor/exN03Vis11.mac b/examples/novice/N03/visTutor/exN03Vis11.mac new file mode 100644 index 0000000000..c4902c4806 --- /dev/null +++ b/examples/novice/N03/visTutor/exN03Vis11.mac @@ -0,0 +1,157 @@ +####################################################################### +# MACRO FILE NAME: exN03Vis1.mac # +# # +# AUTHOR(S): Guy Barrand dd # +# # +# DATE: # +# April 08, 2004 # +# # +# CONTENTS: A basic macro for visualization of detector geometry # +# # +# USAGE: % gmake visclean # +# % $G4BINDIR/exampleN03 # +# Idle> /control/execute visTutor/exN03Vis11.mac # +# # +# REQUIRED PLATFORMS & SOFTWARES: Unix, X-window, OpenGL, # +# DAWN (version 3.85 or after) # +# gv (Ghostview), Tcl/Tk # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR INSTALLATION: # +# (See geant4/source/visualization/README for details.) # +# # +# % setenv OGLHOME ... (e.g. /usr/X11R6) # +# % setenv G4VIS_BUILD_OPENGLX_DRIVER 1 # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR COMPILATION: # +# (See geant4/source/visualization/README for details.) # +# # +# % setenv G4VIS_USE_OPENGLX 1 # +# # +# ADDITIONAL NOTES: # +# The compound command "/vis/open " # +# is equivalent to the following set of commands: # +# # +# /vis/sceneHandler/create $1 # +# /vis/viewer/create # +# # +# The compound command "/vis/drawVolume " # +# is equivalent to the following set of commands: # +# # +# /vis/scene/create # +# /vis/scene/add/volume $1 # +# /vis/sceneHandler/attach # +# # +####################################################################### + +########################################### +# Visualization of detector geometry +# with the OGLSXm (OpenGL Stored Motif) driver +########################################### + +# Invoke the OGLSXm driver +/vis/open OGLSXm + +# Bird's-eye view of the detector geometry +# +# viewpoint : (theta,phi) = (20*deg, 70*deg), +# zoom factor: 0.8 of the full screen size +# +/vis/viewer/reset +/vis/viewer/set/viewpointThetaPhi 20 70 +/vis/viewer/zoom 0.8 +/vis/drawVolume + +# The following two commands "flush" +# the action of the current viewer. +# They are required for the post-processing drivers +# such as DAWNFILE, VRMLFILE, HepRep drivers, etc. +# For OpenGL drivers, these commands are not required +# but harmless even if they are described. +/vis/viewer/flush + +########################################################## +# Visualization with the DAWNFILE driver +# +# * Each visualized view is saved to a file "g4_XX.eps" +# with the "vectorized" PostScript format. +# +# * Set an environmental variable if you wish to +# skip DAWN GUI: +# % setenv G4DAWNFILE_VIEWER "dawn -d" +########################################################## + +# Invoke the DAWNFILE driver +/vis/open DAWNFILE + +# Bird's-eye view of a detector component (Absorber) +# viewpoint : (theta,phi) = (35*deg, 35*deg), +# zoom factor: 1.1 of the full screen size +# coordinate axes: +# x-axis:red, y-axis:green, z-axis:blue +# origin: (0,0,0), length: 500 +# Scale: length = 10 cm, Orientation = z, color = red, +# placing_algorithm = manual, +# center = (-2.5 cm , -5 cm, 0 cm) +# +/vis/viewer/reset +/vis/viewer/zoom 1.1 +/vis/viewer/set/viewpointThetaPhi 35 35 +/vis/drawVolume Absorber +/vis/scene/add/axes 0 0 0 500 mm +/vis/scene/add/text 0 0 0 mm 40 -100 -140 Absorber +/vis/scene/add/scale 10 cm z 1 0 0 manual -2.5 -5 0 cm + +# "Flush the action of all the existing viewers. +# Note: You should execute these commands, e.g., +# when the current scene is modified. +/vis/scene/notifyHandlers +/vis/viewer/update + +# FOR FUTURE UPDATION +#/vis/viewer/flushAll + +# Bird's-eye view of a detector component (Gap) +/vis/viewer/reset +/vis/viewer/zoom 1.1 +/vis/viewer/set/viewpointThetaPhi 35 35 +/vis/drawVolume Gap +/vis/scene/add/axes 0 0 0 500 mm +/vis/scene/add/text 0 0 0 mm 50 -100 -140 Gap +/vis/scene/add/scale 10 cm z 1 0 0 manual -2.5 -5 0 cm + +# "Flush the action of all the existing viewers. +/vis/scene/notifyHandlers +/vis/viewer/update + +# FOR FUTURE UPDATION +#/vis/viewer/flushAll + + +# Bird's-eye view of the whole detector components (world) +# * The argument "world" of the command +# "/vis/scene/add/volume" is omittable. +# * "/vis/viewer/set/culling false" makes the invisible +# world volume visible. +# (The invisibility of the world volume is set +# in ExN03DetectorConstruction.cc.) +/vis/viewer/reset +/vis/viewer/zoom 1.1 +/vis/viewer/set/viewpointThetaPhi 35 35 +/vis/viewer/set/culling global false +/vis/drawVolume +/vis/scene/add/axes 0 0 0 500 mm +/vis/scene/add/text 0 0 0 mm 50 -100 -240 World +/vis/scene/add/scale 10 cm x 1 0 0 + +# "Flush the action of all the existing viewers. +/vis/scene/notifyHandlers +/vis/viewer/update + +# FOR FUTURE UPDATION +#/vis/viewer/flushAll + + +# Make the culling on for next visualization +# Note: You may also use "/vis/viewer/reset" +# for this initialization. +/vis/viewer/set/culling global true diff --git a/examples/novice/N03/visTutor/exN03Vis9.mac b/examples/novice/N03/visTutor/exN03Vis9.mac new file mode 100644 index 0000000000..0e218c1805 --- /dev/null +++ b/examples/novice/N03/visTutor/exN03Vis9.mac @@ -0,0 +1,101 @@ +####################################################################### +# MACRO FILE NAME: exN03Vis9.mac # +# # +# AUTHOR(S): Guy Barrand +# # +# DATE: # +# Appril 08, 2004 # +# # +# CONTENTS: A simplest macro to demonstrate visualization of # +# detector geometry and events # +# # +# USAGE: % gmake visclean # +# % $G4BINDIR/exampleN03 # +# Idle> /control/execute visTutor/exN03Vis9.mac # +# # +# REQUIRED PLATFORMS & SOFTWARES: Windows, OpenGL # +# OPTIONAL : DAWN (version 3.85 or after) # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR INSTALLATION: # +# (See geant4/source/visualization/README for details.) # +# # +# G4VIS_BUILD_OPENGLWIN32_DRIVER # +# (G4UI_BUILD_WIN32_SESSION) # +# # +# ENVIRONMENTAL VARIABLES (C-MACROS) FOR COMPILATION: # +# (See geant4/source/visualization/README for details.) # +# # +# G4VIS_USE_OPENGLWIN32 # +# (G4UI_USE_WIN32) # +# # +# ADDITIONAL NOTES: # +# The compound command "/vis/open " # +# is equivalent to the following set of commands: # +# # +# /vis/sceneHandler/create $1 # +# /vis/viewer/create # +# # +# The compound command "/vis/drawVolume " # +# is equivalent to the following set of commands: # +# # +# /vis/scene/create # +# /vis/scene/add/volume $1 # +# /vis/sceneHandler/attach # +# # +####################################################################### + +############################################## +# Visualization of detector geometry +# with the OGLIWin32 (OpenGL Immediate Windows) driver +############################################## + +# Invoke the OGLIWin32 driver +/vis/open OGLIWin32 +#/vis/open DAWNFILE + +# Set camera +/vis/viewer/reset +/vis/viewer/set/viewpointThetaPhi 70 20 + +# Create an empty scene and add the detector geometry to it +/vis/drawVolume + +# The following command "flush" +# the action of the current viewer. +# They are required for the post-processing drivers +# such as DAWNFILE, VRMLFILE, HepRep drivers, etc. +# For OpenGL drivers, these commands are not required +# but harmless even if they are described. +/vis/viewer/flush + +######################################################### +# Visualization of events with the DAWNFILE driver +# +# * Each visualized view is saved to a file "g4_XX.eps" +# with the "vectorized" PostScript format. +# +# * Set an environmental variable if you wish to +# skip DAWN GUI: +# % setenv G4DAWNFILE_VIEWER "dawn -d" +########################################################## + +# Invoke the DAWNFILE driver +/vis/open DAWNFILE + +# Add the world volume to the current scene +/vis/drawVolume + +# Add trajectories to the current scene +# Note: This command is not necessary in exampleN03, +# since the C++ method DrawTrajectory() is +# described in the event action. +#/vis/scene/add/trajectories + +# Set camera +/vis/viewer/reset +/vis/viewer/zoom 1.5 +/vis/viewer/set/viewpointThetaPhi 70 20 + +# Visualize events added to the current scene +/tracking/storeTrajectory 1 +/run/beamOn 3 diff --git a/examples/novice/N03/visTutor/gui.mac b/examples/novice/N03/visTutor/gui.mac index d56a05c37e..a8b45d74f2 100644 --- a/examples/novice/N03/visTutor/gui.mac +++ b/examples/novice/N03/visTutor/gui.mac @@ -15,15 +15,18 @@ # # Vis menu : /gui/addMenu vis Vis -/gui/addButton vis Vis0 "/control/execute visTutor/exN03Vis0.mac" -/gui/addButton vis Vis1 "/control/execute visTutor/exN03Vis1.mac" -/gui/addButton vis Vis2 "/control/execute visTutor/exN03Vis2.mac" -/gui/addButton vis Vis3 "/control/execute visTutor/exN03Vis3.mac" -/gui/addButton vis Vis4 "/control/execute visTutor/exN03Vis4.mac" -/gui/addButton vis Vis5 "/control/execute visTutor/exN03Vis5.mac" -/gui/addButton vis Vis6 "/control/execute visTutor/exN03Vis6.mac" -/gui/addButton vis Vis7 "/control/execute visTutor/exN03Vis7.mac" -/gui/addButton vis Vis8 "/control/execute visTutor/exN03Vis8.mac" +/gui/addButton vis Vis0(OGLIX) "/control/execute visTutor/exN03Vis0.mac" +/gui/addButton vis Vis1(OGLSX) "/control/execute visTutor/exN03Vis1.mac" +/gui/addButton vis Vis2(OGLSX) "/control/execute visTutor/exN03Vis2.mac" +/gui/addButton vis Vis3(OGLSX) "/control/execute visTutor/exN03Vis3.mac" +/gui/addButton vis Vis4(OGLIX) "/control/execute visTutor/exN03Vis4.mac" +/gui/addButton vis Vis5(OIX) "/control/execute visTutor/exN03Vis5.mac" +/gui/addButton vis Vis6(VRML2FILE) "/control/execute visTutor/exN03Vis6.mac" +/gui/addButton vis Vis7(DAWNFILE) "/control/execute visTutor/exN03Vis7.mac" +/gui/addButton vis Vis8(DAWNFILE) "/control/execute visTutor/exN03Vis8.mac" +/gui/addButton vis Vis9(OGLIWIN) "/control/execute visTutor/exN03Vis9.mac" +/gui/addButton vis Vis10(OIWin32) "/control/execute visTutor/exN03Vis10.mac" +/gui/addButton vis Vis11(OGLSXm) "/control/execute visTutor/exN03Vis11.mac" # # To limit the output flow in the "dump" widget : /event/printModulo 100 diff --git a/examples/novice/N04/exampleN04.EMtest.out b/examples/novice/N04/exampleN04.EMtest.out index 7ff10e5d82..b610dee5aa 100644 --- a/examples/novice/N04/exampleN04.EMtest.out +++ b/examples/novice/N04/exampleN04.EMtest.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -73,8 +73,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -87,7 +87,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -105,7 +105,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -116,24 +116,24 @@ msc: Model variant of multiple scattering for pi- Stage 0->1 : 1 hits found in the muon chamber. Stage 1->2 : 1 isolated muon found. >>> Event 0 - 15 hits are stored in ExN04TrackerHitsCollection. + 13 hits are stored in ExN04TrackerHitsCollection. 4 hits are stored in ExN04CalorimeterHitsCollection. - Total energy deposition in calorimeter : 0.24128837 (GeV) + Total energy deposition in calorimeter : 0.29510933 (GeV) 1 hits are stored in ExN04MuonHitsCollection. ### Run 1 start. Stage 0->1 : 1 hits found in the muon chamber. Stage 1->2 : 1 isolated muon found. >>> Event 0 - 13 hits are stored in ExN04TrackerHitsCollection. - 16 hits are stored in ExN04CalorimeterHitsCollection. - Total energy deposition in calorimeter : 13.986915 (GeV) + 5 hits are stored in ExN04TrackerHitsCollection. + 20 hits are stored in ExN04CalorimeterHitsCollection. + Total energy deposition in calorimeter : 3.4592753 (GeV) 1 hits are stored in ExN04MuonHitsCollection. Stage 0->1 : 1 hits found in the muon chamber. Stage 1->2 : 1 isolated muon found. >>> Event 1 5 hits are stored in ExN04TrackerHitsCollection. - 19 hits are stored in ExN04CalorimeterHitsCollection. - Total energy deposition in calorimeter : 4.1824336 (GeV) + 7 hits are stored in ExN04CalorimeterHitsCollection. + Total energy deposition in calorimeter : 0.18738473 (GeV) 1 hits are stored in ExN04MuonHitsCollection. Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/novice/N04/exampleN04.out b/examples/novice/N04/exampleN04.out index a65a3ef693..775aa17690 100644 --- a/examples/novice/N04/exampleN04.out +++ b/examples/novice/N04/exampleN04.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -76,8 +76,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -90,7 +90,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -108,7 +108,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -160,9 +160,9 @@ Start Run processing. Stage 0->1 : 1 hits found in the muon chamber. Stage 1->2 : 1 isolated muon found. >>> Event 0 - 98 hits are stored in ExN04TrackerHitsCollection. - 45 hits are stored in ExN04CalorimeterHitsCollection. - Total energy deposition in calorimeter : 0.84056457 (GeV) + 126 hits are stored in ExN04TrackerHitsCollection. + 54 hits are stored in ExN04CalorimeterHitsCollection. + Total energy deposition in calorimeter : 0.70332516 (GeV) 1 hits are stored in ExN04MuonHitsCollection. Stage 0->1 : 0 hits found in the muon chamber. ++++++++ event aborted @@ -175,14 +175,14 @@ Stage 0->1 : 1 hits found in the muon chamber. Stage 1->2 : 0 isolated muon found. ++++++++ event aborted >>> Event 2 - 85 hits are stored in ExN04TrackerHitsCollection. + 90 hits are stored in ExN04TrackerHitsCollection. 13 hits are stored in ExN04CalorimeterHitsCollection. - Total energy deposition in calorimeter : 0.3340763 (GeV) + Total energy deposition in calorimeter : 0.33411182 (GeV) 1 hits are stored in ExN04MuonHitsCollection. Run terminated. Run Summary Number of events processed : 3 - User=2.26s Real=4.71s Sys=0.13s + User=3.09s Real=3.38s Sys=0.1s G4 kernel has come to Quit state. Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/novice/N05/exampleN05.out b/examples/novice/N05/exampleN05.out index d050b9cd45..cab3e62d9a 100644 --- a/examples/novice/N05/exampleN05.out +++ b/examples/novice/N05/exampleN05.out @@ -1,9 +1,9 @@ RunManager construction starting.... ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -72,8 +72,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -82,7 +82,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -104,7 +104,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -133,13 +133,13 @@ ExN05EMShowerModel::DoIt ExN05EMShowerModel::DoIt >>> Event 3 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999919 (GeV) + Total energy deposition in EM calorimeter crytals : 0.999916 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 4 - 10 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999918 (GeV) + 9 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999916 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) number of event = 5 @@ -147,279 +147,279 @@ number of event = 5 ExN05EMShowerModel::DoIt >>> Event 0 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999929 (GeV) + Total energy deposition in EM calorimeter crytals : 0.999926 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 1 - 11 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999924 (GeV) + 9 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999911 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 2 - 6 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999875 (GeV) + 8 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999901 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 3 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999928 (GeV) + Total energy deposition in EM calorimeter crytals : 0.999926 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 4 8 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999929 (GeV) + Total energy deposition in EM calorimeter crytals : 0.999886 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) number of event = 5 ### Run 2 start. ExN05EMShowerModel::DoIt >>> Event 0 - 8 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99992 (GeV) + 9 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999918 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 1 - 7 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999923 (GeV) - 0 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0 (GeV) -ExN05EMShowerModel::DoIt ->>> Event 2 - 10 hits are stored in EM ExN05CalorimeterHitsCollection. + 6 hits are stored in EM ExN05CalorimeterHitsCollection. Total energy deposition in EM calorimeter crytals : 0.999927 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt +>>> Event 2 + 6 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999917 (GeV) + 0 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0 (GeV) +ExN05EMShowerModel::DoIt >>> Event 3 - 13 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999928 (GeV) + 10 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999333 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 4 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999886 (GeV) + Total energy deposition in EM calorimeter crytals : 0.999919 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) number of event = 5 ### Run 3 start. ExN05EMShowerModel::DoIt >>> Event 0 - 10 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99991 (GeV) + 9 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99989 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 1 - 11 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999911 (GeV) + 10 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999908 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 2 - 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999887 (GeV) + 10 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999918 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 3 - 12 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999916 (GeV) + 10 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999908 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ExN05EMShowerModel::DoIt >>> Event 4 - 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.999909 (GeV) + 10 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.999907 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) number of event = 5 ### Run 4 start. ExN05PionShowerModel::DoIt >>> Event 0 - 9 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.339935 (GeV) - 10 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.559892 (GeV) + 8 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.319984 (GeV) + 8 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0.57997 (GeV) ExN05PionShowerModel::DoIt >>> Event 1 - 14 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.479926 (GeV) - 12 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 1.37984 (GeV) + 12 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.539969 (GeV) + 13 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 1.21993 (GeV) ExN05PionShowerModel::DoIt >>> Event 2 - 16 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.719911 (GeV) + 17 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.819952 (GeV) 14 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 2.0798 (GeV) + Total energy deposition in HAD calorimeter towers : 1.83989 (GeV) ExN05PionShowerModel::DoIt >>> Event 3 - 18 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.879903 (GeV) - 15 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 2.85976 (GeV) + 20 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.07993 (GeV) + 14 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 2.39984 (GeV) ExN05PionShowerModel::DoIt >>> Event 4 - 22 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.01989 (GeV) - 15 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 3.63968 (GeV) + 23 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.21992 (GeV) + 14 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 3.1798 (GeV) number of event = 5 ### Run 5 start. ExN05PionShowerModel::DoIt >>> Event 0 - 23 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.05988 (GeV) + 25 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.24003 (GeV) 27 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 4.59963 (GeV) + Total energy deposition in HAD calorimeter towers : 4.13957 (GeV) ExN05PionShowerModel::DoIt >>> Event 1 - 24 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.05989 (GeV) - 30 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 5.59958 (GeV) + 27 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.29991 (GeV) + 32 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 5.03953 (GeV) ExN05PionShowerModel::DoIt >>> Event 2 - 24 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.07989 (GeV) - 31 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 6.57954 (GeV) + 28 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.31991 (GeV) + 34 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 6.01944 (GeV) ExN05PionShowerModel::DoIt >>> Event 3 - 26 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.11988 (GeV) - 32 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 7.53943 (GeV) + 28 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.31991 (GeV) + 34 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 7.01939 (GeV) ExN05PionShowerModel::DoIt >>> Event 4 - 26 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.11988 (GeV) - 33 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 8.53938 (GeV) + 29 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.33991 (GeV) + 36 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 7.97934 (GeV) number of event = 5 ### Run 6 start. ExN05PionShowerModel::DoIt >>> Event 0 - 27 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.17988 (GeV) - 42 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 9.47934 (GeV) + 31 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.37991 (GeV) + 48 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 8.9193 (GeV) ExN05PionShowerModel::DoIt >>> Event 1 - 27 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.17988 (GeV) - 47 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 10.4793 (GeV) + 32 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.41991 (GeV) + 55 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 9.87924 (GeV) ExN05PionShowerModel::DoIt >>> Event 2 - 27 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.17988 (GeV) - 50 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 11.4792 (GeV) + 34 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.4599 (GeV) + 58 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 10.8392 (GeV) ExN05PionShowerModel::DoIt >>> Event 3 - 31 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.25987 (GeV) - 53 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 12.3792 (GeV) + 34 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.4799 (GeV) + 60 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 11.8191 (GeV) ExN05PionShowerModel::DoIt >>> Event 4 34 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.31987 (GeV) - 54 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 13.3191 (GeV) + Total energy deposition in EM calorimeter crytals : 1.4799 (GeV) + 60 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 12.8191 (GeV) number of event = 5 ### Run 7 start. ExN05PionShowerModel::DoIt >>> Event 0 - 40 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.65983 (GeV) - 63 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 13.8391 (GeV) + 42 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.69989 (GeV) + 68 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 13.479 (GeV) ExN05PionShowerModel::DoIt >>> Event 1 - 50 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 1.97981 (GeV) + 49 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 1.93988 (GeV) 70 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 14.479 (GeV) + Total energy deposition in HAD calorimeter towers : 14.239 (GeV) ExN05PionShowerModel::DoIt >>> Event 2 - 57 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 2.2798 (GeV) - 71 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 14.999 (GeV) + 54 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 2.09987 (GeV) + 70 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 15.019 (GeV) ExN05PionShowerModel::DoIt >>> Event 3 - 60 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 2.45978 (GeV) + 58 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 2.25986 (GeV) 71 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 15.7189 (GeV) + Total energy deposition in HAD calorimeter towers : 15.8389 (GeV) ExN05PionShowerModel::DoIt >>> Event 4 - 62 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 2.59978 (GeV) + 60 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 2.41984 (GeV) 71 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 16.5589 (GeV) + Total energy deposition in HAD calorimeter towers : 16.5988 (GeV) number of event = 5 ### Run 8 start. >>> Event 0 - 43 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.98069092 (GeV) - 1 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.00056525422 (GeV) ->>> Event 1 - 42 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99472913 (GeV) - 1 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0013748933 (GeV) ->>> Event 2 - 36 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.9957721 (GeV) + 32 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99330835 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) +>>> Event 1 + 38 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99811658 (GeV) + 0 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0 (GeV) +>>> Event 2 + 43 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.98617167 (GeV) + 4 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0.0064424094 (GeV) >>> Event 3 - 40 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.98993594 (GeV) + 44 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99232857 (GeV) 2 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0052252367 (GeV) + Total energy deposition in HAD calorimeter towers : 0.0010400262 (GeV) >>> Event 4 - 36 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99238524 (GeV) - 3 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0040379066 (GeV) + 38 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.9915164 (GeV) + 2 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0.0025251281 (GeV) number of event = 5 ### Run 9 start. >>> Event 0 - 28 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99421781 (GeV) + 32 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99429177 (GeV) + 4 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0.0044671332 (GeV) +>>> Event 1 + 25 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99725261 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) ->>> Event 1 - 28 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99703461 (GeV) - 2 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0028761706 (GeV) >>> Event 2 - 23 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99861816 (GeV) - 1 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0012911788 (GeV) + 18 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99820361 (GeV) + 0 hits are stored in HAD ExN05CalorimeterHitsCollection. + Total energy deposition in HAD calorimeter towers : 0 (GeV) >>> Event 3 - 26 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99827802 (GeV) + 20 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.98879591 (GeV) 0 hits are stored in HAD ExN05CalorimeterHitsCollection. Total energy deposition in HAD calorimeter towers : 0 (GeV) >>> Event 4 - 22 hits are stored in EM ExN05CalorimeterHitsCollection. - Total energy deposition in EM calorimeter crytals : 0.99173935 (GeV) + 23 hits are stored in EM ExN05CalorimeterHitsCollection. + Total energy deposition in EM calorimeter crytals : 0.99889974 (GeV) 1 hits are stored in HAD ExN05CalorimeterHitsCollection. - Total energy deposition in HAD calorimeter towers : 0.0068364568 (GeV) + Total energy deposition in HAD calorimeter towers : 0.0010145261 (GeV) number of event = 5 Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/novice/N06/History b/examples/novice/N06/History index 2bb86c3f1d..071f29fb2f 100644 --- a/examples/novice/N06/History +++ b/examples/novice/N06/History @@ -1,4 +1,4 @@ -$Id: History,v 1.20 2004/03/17 22:40:58 gum Exp $ +$Id: History,v 1.23 2004/06/01 08:24:39 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -15,6 +15,13 @@ track of all tags. * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +June 1, 2004 Peter Gunplinger (exampleN06-V06-01-01) +- Updated README file. + +April 2, 2004 Michel Maire (exampleN06-V06-01-00) +- PrimaryGenerator: e+ 500 keV +- Removed vis commands from RunAction + March 17, 2004 Peter Gumplinger (exampleN06-V06-00-00) - DetectorConstruction: change surface model between OpWaterSurface and OpAirSurface @@ -25,62 +32,61 @@ December 1, 2003 Peter Gumplinger (exampleN06-V05-02-02) November 13, 2003 John Allison - Removed OPACS from Vis Manager. -October 24, 2003 mma (exampleN06-V05-02-01) +October 24, 2003 Michel Maire (exampleN06-V05-02-01) - PhysicsList: AddProcess(Bremsstrahlung,-1,3,3) ..etc.. -October 06, 2003 mma (exampleN06-V05-02-00) -- cosmetic cleanup of material definition +October 06, 2003 Michel Maire (exampleN06-V05-02-00) +- Cosmetic cleanup of material definition April 17, 2003 Peter Gumplinger (exampleN06-V05-00-03) -- changed OpWaterSurface to dielectric_dielectric in class +- Changed OpWaterSurface to dielectric_dielectric in class ExN06DetectorConstruction March 26, 2003 Michel Maire (exampleN06-V05-00-02) - G4PVPlacement in logical mother Febuary 11, 2003 Michel Maire (exampleN06-V05-00-01) -- add a blank in steppingVerbose ! +- Added a blank in steppingVerbose ! January 23, 2003 Michel Maire (exampleN06-V05-00-00) -- added tools for interactive session : UItcsh, visualisation of tracks. -- added 2 messenger classes : PhysicsList and PrimaryGenerator +- Added tools for interactive session : UItcsh, visualisation of tracks. +- Added 2 messenger classes : PhysicsList and PrimaryGenerator - exampleN06.in changed --> exampleN06.out reduced November 21, 2002 Peter Gumplinger (exampleN06-V04-01-02) - exampleN06.out output changed because of small change in G4Scintillation November 14, 2002 Peter Gumplinger (exampleN06-V04-01-01) -- reduced the scintillation photon yield to reduce the output size +- Reduced the scintillation photon yield to reduce the output size November 12, 2002 Peter Gumplinger (exampleN06-V04-01-00) -- add ExN06StackingAction -- change user interface to new version of G4Scintillation +- Added ExN06StackingAction +- Changed user interface to new version of G4Scintillation -May 30, 2002 Gabriele Cosmo (exampleN06-V04-00-02) +May 30, 2002 Gabriele Cosmo (exampleN06-V04-00-02) - Renamed file ExN06PrimaryGeneratoraction.cc to ExN06PrimaryGeneratorAction.cc to be consistent with class name. -May 16, 2002 Peter Gumplinger (exampleN06-V04-00-01) -- Add G4Scintillation to the example and update reference output +May 16, 2002 Peter Gumplinger (exampleN06-V04-00-01) +- Added G4Scintillation to the example and update reference output -Oct 19, 2001 Steve O'Neale (examples-V03-02-00) -- Update reference output +Oct 19, 2001 Steve O'Neale (examples-V03-02-00) +- Updated reference output 06-02-2001 Update reference output for op-V03-00-05 S.W.O'Neale -June 17, 2000 John Allison (exampleN06-V01-01-00) +June 17, 2000 John Allison (exampleN06-V01-01-00) - Updated exampleN06.out for geant4-01-01-ref-06. -16th April 1999 H.Kurashige -- modify ExN06RunAction -- modify ExN06PhysicsList::SetCuts +16th April 1999 Hisaya Kurashige +- Modified ExN06RunAction +- Modified ExN06PhysicsList::SetCuts -21st August 1998 John Allison +21st August 1998 John Allison - Changed file names from N06* to ExN06*. -9th August 1998 John Allison +9th August 1998 John Allison - Changed G4UIterminal to G4UIGAG. -April 09, 98 G. Cosmo - +April 09, 98 Gabriele Cosmo - Created. diff --git a/examples/novice/N06/README b/examples/novice/N06/README index 9a2cd2e269..67edee9572 100644 --- a/examples/novice/N06/README +++ b/examples/novice/N06/README @@ -1,4 +1,4 @@ -$Id: README,v 1.4 2003/01/23 15:31:39 maire Exp $ +$Id: README,v 1.5 2004/05/31 18:13:04 gum Exp $ ------------------------------------------------------------------- ========================================================= @@ -10,7 +10,9 @@ $Id: README,v 1.4 2003/01/23 15:31:39 maire Exp $ This example presently illustrates the following basic concepts, and in particular (indicated with ***), how to use G4 for optical photon -generation and transport: +generation and transport. An extended example of what is possible +in Geant4 with optical photons can be found at +examples/extended/optical/LXe. main() ------ diff --git a/examples/novice/N06/exampleN06.in b/examples/novice/N06/exampleN06.in index 090ca64eb0..f74d8fab49 100644 --- a/examples/novice/N06/exampleN06.in +++ b/examples/novice/N06/exampleN06.in @@ -1,8 +1,12 @@ /control/verbose 2 /tracking/verbose 1 # -/gun/particle e- +/gun/particle e+ /gun/energy 500 keV # /run/beamOn 1 - +# +/process/inactivate Scintillation +/N06/phys/verbose 0 +# +/run/beamOn 1 diff --git a/examples/novice/N06/exampleN06.out b/examples/novice/N06/exampleN06.out index 9a47307d9f..f7767502ae 100644 --- a/examples/novice/N06/exampleN06.out +++ b/examples/novice/N06/exampleN06.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -34,7 +34,7 @@ Equal AddDiscreteProcess to OpticalPhoton /tracking/verbose 1 # -/gun/particle e- +/gun/particle e+ /gun/energy 500 keV # /run/beamOn 1 @@ -78,8 +78,8 @@ msc: Model variant of multiple scattering for proton hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for mu+ Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -88,7 +88,7 @@ msc: Model variant of multiple scattering for mu+ MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -106,7 +106,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -116,882 +116,1295 @@ msc: Model variant of multiple scattering for pi- ### Run 0 start. ********************************************************************************************************* -* G4Track Information: Particle = e-, Track ID = 1, Parent ID = 0 +* G4Track Information: Particle = e+, Track ID = 1, Parent ID = 0 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process 0 0 fm 0 fm 0 fm 500 keV 0 eV 0 fm 0 fm Tank initStep - Exiting from G4Cerenkov::DoIt -- NumberOfSecondaries = 39 + Exiting from G4Cerenkov::DoIt -- NumberOfSecondaries = 25 - Exiting from G4Scintillation::DoIt -- NumberOfSecondaries = 18 - 1 201 mum 0 fm 0 fm 0 eV 500 keV 1.76 mm 1.76 mm Tank eIoni - 2 201 mum 0 fm 0 fm 0 eV 0 eV 0 fm 1.76 mm Tank Scintillation + Exiting from G4Scintillation::DoIt -- NumberOfSecondaries = 28 + 1 840 mum 0 fm 0 fm 0 eV 500 keV 1.74 mm 1.74 mm Tank eIoni + 2 840 mum 0 fm 0 fm 0 eV 0 eV 0 fm 1.74 mm Tank annihil ********************************************************************************************************* -* G4Track Information: Particle = opticalphoton, Track ID = 58, Parent ID = 1 +* G4Track Information: Particle = gamma, Track ID = 56, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 160 mum 0 fm 0 fm 3.3 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (-0.985954,0.102222,0.132081) - Old Polarization: (0.0757615,-0.431046,0.899144) - New Momentum Direction: (-0.974006,0.138642,0.179139) - New Polarization: (-0.102904,-0.975324,0.19533) - *** FresnelRefraction *** - 1 -5 m 51.8 cm 67 cm 3.3 eV 0 eV 5.07 m 5.07 m Tank Transportation - 2 -10 m 1.23 m 1.59 m 3.3 eV 0 eV 5.13 m 10.2 m OutOfWorld Transportation + 0 840 mum 0 fm 0 fm 511 keV 0 eV 0 fm 0 fm Tank initStep + 1 -4.46 m -1.61 m 5 m 511 keV 0 eV 6.89 m 6.89 m Tank Transportation + 2 -8.91 m -3.23 m 10 m 511 keV 0 eV 6.89 m 13.8 m OutOfWorld Transportation ********************************************************************************************************* -* G4Track Information: Particle = opticalphoton, Track ID = 57, Parent ID = 1 +* G4Track Information: Particle = gamma, Track ID = 55, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 173 mum 0 fm 0 fm 3.72 eV 0 eV 0 fm 0 fm Tank initStep -Scattering Photon! -Old Momentum Direction: (0.86539246,-0.49681618,-0.065341949) -Old Polarization: (-0.49263728,-0.81966575,-0.29232956) -New Polarization: (0.55887933,0.82503864,-0.08345732) -Polarization Change: (0.55887933,0.82503864,-0.08345732) -New Momentum Direction: (-0.068195499,0.14602872,0.98692704) -Momentum Change: (-0.068195499,0.14602872,0.98692704) - 1 3.4 m -1.95 m -25.7 cm 3.72 eV 0 eV 3.93 m 3.93 m Tank OpRayleigh - Photon at Boundary! - Old Momentum Direction: (-0.068195499,0.14602872,0.98692704) - Old Polarization: (0.55887933,0.82503864,-0.08345732) - New Momentum Direction: (-0.092666034,0.19842809,0.97572501) - New Polarization: (0.9888286,-0.096564842,0.11354839) - *** FresnelRefraction *** - 2 3.04 m -1.17 m 5 m 3.72 eV 0 eV 5.33 m 9.25 m Tank Transportation - 3 2.56 m -15.7 cm 10 m 3.72 eV 0 eV 5.12 m 14.4 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = opticalphoton, Track ID = 56, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 194 mum 0 fm 0 fm 3.36 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.69295142,-0.51044537,0.50917959) - Old Polarization: (0.71997421,0.45254145,-0.52615908) - New Momentum Direction: (0.2074461,-0.69258288,0.69086545) - New Polarization: (0.97725791,0.11497887,-0.17817643) - *** FresnelRefraction *** - 1 5 m -3.68 m 3.67 m 3.36 eV 0 eV 7.22 m 7.22 m Tank Transportation - 2 6.89 m -10 m 9.98 m 3.36 eV 0 eV 9.12 m 16.3 m OutOfWorld Transportation - -********************************************************************************************************* -* G4Track Information: Particle = opticalphoton, Track ID = 55, Parent ID = 1 -********************************************************************************************************* - -Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 130 mum 0 fm 0 fm 2.39 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (-0.97341876,0.19864121,-0.114007) - Old Polarization: (0.21300473,0.96810819,-0.13189205) - New Momentum Direction: (-0.95114662,0.26777149,-0.15368323) - New Polarization: (-0.28726641,-0.58516384,0.75832796) - *** FresnelRefraction *** - 1 -5 m 1.02 m -58.6 cm 2.39 eV 0 eV 5.14 m 5.14 m Tank Transportation - 2 -10 m 2.43 m -1.39 m 2.39 eV 0 eV 5.26 m 10.4 m OutOfWorld Transportation + 0 840 mum 0 fm 0 fm 511 keV 0 eV 0 fm 0 fm Tank initStep + 1 4.46 m 1.61 m -5 m 511 keV 0 eV 6.89 m 6.89 m Tank Transportation + 2 8.91 m 3.23 m -10 m 511 keV 0 eV 6.89 m 13.8 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 54, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 128 mum 0 fm 0 fm 3.07 eV 0 eV 0 fm 0 fm Tank initStep + 0 403 mum 0 fm 0 fm 3.22 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.080235619,-0.87750316,0.47281122) - Old Polarization: (-0.91431716,0.12411729,0.3855114) - New Momentum Direction: (0.10870154,-0.76017996,0.64055476) - New Polarization: (-0.98449445,-0.17156766,-0.03654057) + Old Momentum Direction: (-0.039667021,0.23525975,-0.97112274) + Old Polarization: (-0.72823979,-0.67227019,-0.13311501) + New Momentum Direction: (-0.039667021,0.23525975,0.97112274) + New Polarization: (-0.77760583,-0.61760754,0.11785625) + *** SpikeReflection *** + 1 -20.4 cm 1.21 m -5 m 3.22 eV 0 eV 5.15 m 5.15 m Tank Transportation + 2 -20.4 cm 1.21 m -5 m 3.22 eV 0 eV 0 fm 5.15 m World Transportation + Photon at Boundary! + Old Momentum Direction: (-0.039667021,0.23525975,0.97112274) + Old Polarization: (-0.77760583,-0.61760754,0.11785625) + New Momentum Direction: (-0.053777489,0.31894703,0.94624562) + New Polarization: (-0.77859685,-0.60671707,0.16025398) *** FresnelRefraction *** - 1 45.7 cm -5 m 2.69 m 3.07 eV 0 eV 5.7 m 5.7 m Tank Transportation - 2 1.17 m -10 m 6.91 m 3.07 eV 0 eV 6.58 m 12.3 m OutOfWorld Transportation + 3 -38.8 cm 2.3 m -50 cm 3.22 eV 0 eV 4.63 m 9.78 m Tank Transportation + Photon at Boundary! + Old Momentum Direction: (-0.053777489,0.31894703,0.94624562) + Old Polarization: (-0.77859685,-0.60671707,0.16025398) + New Momentum Direction: (-0.039667021,0.23525975,0.97112274) + New Polarization: (-0.77548502,-0.62013518,0.11855521) + *** FresnelRefraction *** + 4 -44.4 cm 2.64 m 50 cm 3.22 eV 0 eV 1.06 m 10.8 m Bubble Transportation + Photon at Boundary! + Old Momentum Direction: (-0.039667021,0.23525975,0.97112274) + Old Polarization: (-0.77548502,-0.62013518,0.11855521) + New Momentum Direction: (-0.053777489,0.31894703,0.94624562) + New Polarization: (-0.77647953,-0.60917426,0.16120255) + *** FresnelRefraction *** + 5 -62.8 cm 3.73 m 5 m 3.22 eV 0 eV 4.63 m 15.5 m Tank Transportation + 6 -91.2 cm 5.41 m 10 m 3.22 eV 0 eV 5.28 m 20.8 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 53, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 123 mum 0 fm 0 fm 2.92 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.84920788,0.34612392,-0.39880347) - Old Polarization: (0.36403908,0.16334417,0.91694833) - New Momentum Direction: (0.6992675,0.46856569,-0.53988069) - New Polarization: (0.50029768,0.21867231,0.83778556) - *** FresnelRefraction *** - 1 5 m 2.04 m -2.35 m 2.92 eV 0 eV 5.89 m 5.89 m Tank Transportation - 2 10 m 5.39 m -6.21 m 2.92 eV 0 eV 7.15 m 13 m OutOfWorld Transportation + 0 362 mum 0 fm 0 fm 3.87 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 -51.8 cm 22.8 cm 3.16 cm 3.87 eV 0 eV 56.8 cm 56.8 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 52, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 145 mum 0 fm 0 fm 2.97 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (-0.91907449,0.28088298,0.27641785) - Old Polarization: (0.33248258,0.17612355,0.92651812) - New Momentum Direction: (-0.84571561,0.38034716,0.37430087) - New Polarization: (-0.45182994,-0.88357883,-0.12303721) - *** FresnelRefraction *** - 1 -5 m 1.53 m 1.5 m 2.97 eV 0 eV 5.44 m 5.44 m Tank Transportation - 2 -10 m 3.78 m 3.72 m 2.97 eV 0 eV 5.91 m 11.4 m OutOfWorld Transportation + 0 670 mum 0 fm 0 fm 2.32 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 -2.76 m -57.4 cm -1.93 m 2.32 eV 0 eV 3.41 m 3.41 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 51, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 187 mum 0 fm 0 fm 4.03 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 45.3 cm 46.1 cm 77.4 cm 4.03 eV 0 eV 1.01 m 1.01 m Tank OpAbsorption + 0 122 mum 0 fm 0 fm 3.81 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.028828687,0.99938122,-0.020151615) + Old Polarization: (0.59237132,-0.033319467,-0.8049758) + New Momentum Direction: (0.039183773,0.99885656,-0.027389951) + New Polarization: (-0.95906875,0.045287986,0.2795284) + *** FresnelRefraction *** + 1 5.78 cm 2 m -4.03 cm 3.81 eV 0 eV 2 m 2 m Tank Transportation + Photon at Boundary! + Old Momentum Direction: (0.039183773,0.99885656,-0.027389951) + Old Polarization: (-0.95906875,0.045287986,0.2795284) + New Momentum Direction: (0.028828687,0.99938122,-0.020151615) + New Polarization: (-0.95946931,0.033320014,0.27983643) + *** FresnelRefraction *** + 2 9.7 cm 3 m -6.77 cm 3.81 eV 0 eV 1 m 3 m Bubble Transportation + Photon at Boundary! + Old Momentum Direction: (0.028828687,0.99938122,-0.020151615) + Old Polarization: (-0.95946931,0.033320014,0.27983643) + New Momentum Direction: (0.039183773,0.99885656,-0.027389951) + New Polarization: (-0.95905514,0.045288729,0.27957497) + *** FresnelRefraction *** + 3 15.5 cm 5 m -10.8 cm 3.81 eV 0 eV 2 m 5 m Tank Transportation + 4 35.1 cm 10 m -24.5 cm 3.81 eV 0 eV 5.01 m 10 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 50, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 95.1 mum 0 fm 0 fm 3.2 eV 0 eV 0 fm 0 fm Tank initStep + 0 648 mum 0 fm 0 fm 2.54 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (-0.61717235,-0.085375032,0.78218246) - Old Polarization: (-0.7424677,0.39226338,-0.54302041) - New Momentum Direction: (-0.83666479,-0.11573798,0.53534732) - New Polarization: (0.40392209,0.52975078,0.74579559) + Old Momentum Direction: (-0.67976209,-0.25444015,0.6878835) + Old Polarization: (0.70131468,0.049014812,0.71116472) + New Momentum Direction: (0.21255617,-0.61432624,-0.75988364) + New Polarization: (-0.95021626,0.051371137,-0.30732728) + *** LambertianReflection *** + 1 -4.94 m -1.85 m 5 m 2.54 eV 0 eV 7.27 m 7.27 m Tank Transportation + 2 -4.94 m -1.85 m 5 m 2.54 eV 0 eV 0 fm 7.27 m World Transportation + Photon at Boundary! + Old Momentum Direction: (0.21255617,-0.61432624,-0.75988364) + Old Polarization: (-0.95021626,0.051371137,-0.30732728) + New Momentum Direction: (-0.21255617,0.61432624,0.75988364) + New Polarization: (0.95021626,-0.051371137,0.30732728) + *** BackScattering *** + 3 -3.85 m -5 m 1.1 m 2.54 eV 0 eV 5.13 m 12.4 m Tank Transportation + 4 -3.85 m -5 m 1.1 m 2.54 eV 0 eV 0 fm 12.4 m World Transportation + Photon at Boundary! + Old Momentum Direction: (-0.21255617,0.61432624,0.75988364) + Old Polarization: (0.95021626,-0.051371137,0.30732728) + New Momentum Direction: (-0.28697604,0.82941328,0.47928944) + New Polarization: (0.89763117,0.058109916,0.43689989) *** FresnelRefraction *** - 1 -3.95 m -54.6 cm 5 m 3.2 eV 0 eV 6.39 m 6.39 m Tank Transportation - 2 -10 m -1.38 m 8.87 m 3.2 eV 0 eV 7.24 m 13.6 m OutOfWorld Transportation + 5 -4.94 m -1.85 m 5 m 2.54 eV 0 eV 5.13 m 17.5 m Tank Transportation + 6 -7.93 m 6.8 m 10 m 2.54 eV 0 eV 10.4 m 28 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 49, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 33.7 mum 0 fm 0 fm 3.15 eV 0 eV 0 fm 0 fm Tank initStep + 0 569 mum 0 fm 0 fm 4.1 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (-0.50468398,-0.57407264,0.64477491) - Old Polarization: (-0.81797565,0.079150931,-0.56978151) - New Momentum Direction: (-0.50468398,-0.57407264,-0.64477491) - New Polarization: (0.81797565,-0.079150931,-0.56978151) - *** LobeReflection *** - 1 -3.91 m -4.45 m 5 m 3.15 eV 0 eV 7.75 m 7.75 m Tank Transportation - 2 -3.91 m -4.45 m 5 m 3.15 eV 0 eV 0 fm 7.75 m World Transportation + Old Momentum Direction: (-0.085301626,0.99623032,0.015772581) + Old Polarization: (0.99209262,0.086388787,-0.091045097) + New Momentum Direction: (-0.11605984,0.99301037,0.021459888) + New Polarization: (0.9889353,0.1175395,-0.090506599) + *** FresnelRefraction *** + 1 -17.1 cm 2 m 3.17 cm 4.1 eV 0 eV 2.01 m 2.01 m Tank Transportation Photon at Boundary! - Old Momentum Direction: (-0.50468398,-0.57407264,-0.64477491) - Old Polarization: (0.81797565,-0.079150931,-0.56978151) - New Momentum Direction: (-0.50468398,0.57407264,-0.64477491) - New Polarization: (-0.81797565,-0.079150931,0.56978151) - *** LobeReflection *** - 3 -4.4 m -5 m 4.38 m 3.15 eV 0 eV 95.5 cm 8.71 m Tank Transportation - 4 -4.4 m -5 m 4.38 m 3.15 eV 0 eV 0 fm 8.71 m World Transportation + Old Momentum Direction: (-0.11605984,0.99301037,0.021459888) + Old Polarization: (0.9889353,0.1175395,-0.090506599) + New Momentum Direction: (-0.085301626,0.99623032,0.015772581) + New Polarization: (0.99208438,0.086389492,-0.091134158) + *** FresnelRefraction *** + 2 -28.8 cm 3 m 5.33 cm 4.1 eV 0 eV 1.01 m 3.01 m Bubble Transportation Photon at Boundary! - Old Momentum Direction: (-0.50468398,0.57407264,-0.64477491) - Old Polarization: (-0.81797565,-0.079150931,0.56978151) - New Momentum Direction: (0.50468398,0.57407264,-0.64477491) - New Polarization: (-0.81797565,0.079150931,-0.56978151) - *** LobeReflection *** - 5 -5 m -4.31 m 3.61 m 3.15 eV 0 eV 1.2 m 9.91 m Tank Transportation - 6 -5 m -4.31 m 3.61 m 3.15 eV 0 eV 0 fm 9.91 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.50468398,0.57407264,-0.64477491) - Old Polarization: (-0.81797565,0.079150931,-0.56978151) - New Momentum Direction: (0.50468398,0.57407264,0.64477491) - New Polarization: (0.81797565,-0.079150931,-0.56978151) - *** SpikeReflection *** - 7 1.74 m 3.36 m -5 m 3.15 eV 0 eV 13.4 m 23.3 m Tank Transportation - 8 1.74 m 3.36 m -5 m 3.15 eV 0 eV 0 fm 23.3 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.50468398,0.57407264,0.64477491) - Old Polarization: (0.81797565,-0.079150931,-0.56978151) - New Momentum Direction: (0.80115714,-0.54488965,-0.24747223) - New Polarization: (-0.58495273,-0.80033461,-0.13150974) - *** LambertianReflection *** - 9 3.19 m 5 m -3.15 m 3.15 eV 0 eV 2.87 m 26.1 m Tank Transportation - 10 3.19 m 5 m -3.15 m 3.15 eV 0 eV 0 fm 26.1 m World Transportation - -** Photon absorbed! ** - 11 4.06 m 4.4 m -3.42 m 3.15 eV 0 eV 1.09 m 27.2 m Tank OpAbsorption + Old Momentum Direction: (-0.085301626,0.99623032,0.015772581) + Old Polarization: (0.99208438,0.086389492,-0.091134158) + New Momentum Direction: (-0.11605984,0.99301037,0.021459888) + New Polarization: (0.98892703,0.11754045,-0.090595612) + *** FresnelRefraction *** + 3 -45.9 cm 5 m 8.49 cm 4.1 eV 0 eV 2.01 m 5.02 m Tank Transportation + 4 -1.04 m 10 m 19.3 cm 4.1 eV 0 eV 5.04 m 10.1 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 48, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 43.6 mum 0 fm 0 fm 2.89 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.56271694,0.32954926,0.75812066) - Old Polarization: (0.58654938,-0.8054132,-0.085260773) - New Momentum Direction: (0.56271694,0.32954926,-0.75812066) - New Polarization: (0.52540392,-0.85061246,0.020227624) - *** LobeReflection *** - 1 3.71 m 2.17 m 5 m 2.89 eV 0 eV 6.6 m 6.6 m Tank Transportation - 2 3.71 m 2.17 m 5 m 2.89 eV 0 eV 0 fm 6.6 m World Transportation + 0 418 mum 0 fm 0 fm 4.09 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 3 4.33 m 2.54 m 4.16 m 2.89 eV 0 eV 1.11 m 7.7 m Tank OpAbsorption + 1 -6.8 cm -20.8 cm 3.49 cm 4.09 eV 0 eV 22.2 cm 22.2 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 47, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 136 mum 0 fm 0 fm 2.46 eV 0 eV 0 fm 0 fm Tank initStep + 0 456 mum 0 fm 0 fm 2.88 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (-0.53906468,-0.51233467,0.6685226) - Old Polarization: (0.32811584,-0.85875565,-0.39354635) - New Momentum Direction: (-0.53906468,-0.51233467,-0.6685226) - New Polarization: (-0.32811584,0.85875565,-0.39354635) - *** LobeReflection *** - 1 -4.03 m -3.83 m 5 m 2.46 eV 0 eV 7.48 m 7.48 m Tank Transportation - 2 -4.03 m -3.83 m 5 m 2.46 eV 0 eV 0 fm 7.48 m World Transportation - Photon at Boundary! - Old Momentum Direction: (-0.53906468,-0.51233467,-0.6685226) - Old Polarization: (-0.32811584,0.85875565,-0.39354635) - New Momentum Direction: (0.53906468,-0.51233467,-0.6685226) - New Polarization: (-0.32811584,-0.85875565,0.39354635) - *** SpikeReflection *** - 3 -5 m -4.75 m 3.8 m 2.46 eV 0 eV 1.8 m 9.28 m Tank Transportation - 4 -5 m -4.75 m 3.8 m 2.46 eV 0 eV 0 fm 9.28 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.53906468,-0.51233467,-0.6685226) - Old Polarization: (-0.32811584,-0.85875565,0.39354635) - New Momentum Direction: (0.92465712,0.37564885,0.062427127) - New Polarization: (0.01292113,0.13289156,-0.99104635) - *** LambertianReflection *** - 5 -4.74 m -5 m 3.48 m 2.46 eV 0 eV 48.4 cm 9.76 m Tank Transportation - 6 -4.74 m -5 m 3.48 m 2.46 eV 0 eV 0 fm 9.76 m World Transportation - -** Photon absorbed! ** - 7 -2.02 m -3.89 m 3.66 m 2.46 eV 0 eV 2.94 m 12.7 m Tank OpAbsorption + Old Momentum Direction: (-0.64218903,0.7587243,0.10922766) + Old Polarization: (-0.1556018,-0.26855483,0.95061369) + New Momentum Direction: (-0.86919216,0.47185694,0.14783781) + New Polarization: (0.35396295,0.384972,0.85235368) + *** FresnelRefraction *** + 1 -4.23 m 5 m 72 cm 2.88 eV 0 eV 6.59 m 6.59 m Tank Transportation + 2 -10 m 8.13 m 1.7 m 2.88 eV 0 eV 6.64 m 13.2 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 46, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 62.5 mum 0 fm 0 fm 2.31 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 42.6 cm 89.1 cm 1.69 m 2.31 eV 0 eV 1.96 m 1.96 m Tank OpAbsorption + 0 699 mum 0 fm 0 fm 3.48 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.3191864,0.28562051,-0.90362656) + Old Polarization: (-0.94760845,0.10884696,-0.30031743) + New Momentum Direction: (0.4332881,0.38772318,-0.81359213) + New Polarization: (-0.90025675,0.14370886,-0.41095687) + *** FresnelRefraction *** + 1 1.77 m 1.58 m -5 m 3.48 eV 0 eV 5.53 m 5.53 m Tank Transportation + 2 4.43 m 3.96 m -10 m 3.48 eV 0 eV 6.15 m 11.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 45, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 126 mum 0 fm 0 fm 3.1 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (-0.35833645,-0.75490345,-0.5492866) - Old Polarization: (0.91033841,-0.41303267,-0.026229732) - New Momentum Direction: (-0.48553664,-0.45860395,-0.74426917) - New Polarization: (0.79578131,-0.58431077,-0.15910071) - *** FresnelRefraction *** - 1 -2.37 m -5 m -3.64 m 3.1 eV 0 eV 6.62 m 6.62 m Tank Transportation - 2 -6.52 m -8.92 m -10 m 3.1 eV 0 eV 8.55 m 15.2 m OutOfWorld Transportation + 0 771 mum 0 fm 0 fm 3.29 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 8.87 cm 7.18 cm -1.3 cm 3.29 eV 0 eV 11.4 cm 11.4 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 44, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 76.8 mum 0 fm 0 fm 3.24 eV 0 eV 0 fm 0 fm Tank initStep + 0 742 mum 0 fm 0 fm 3.41 eV 0 eV 0 fm 0 fm Tank initStep +Scattering Photon! +Old Momentum Direction: (0.43844391,0.89657956,-0.062546253) +Old Polarization: (0.69282795,-0.29283549,0.65896646) +New Polarization: (0.74394422,-0.41664507,0.52244989) +Polarization Change: (0.74394422,-0.41664507,0.52244989) +New Momentum Direction: (0.19702907,-0.61030778,-0.76727046) +Momentum Change: (0.19702907,-0.61030778,-0.76727046) + 1 1.2 m 2.46 m -17.1 cm 3.41 eV 0 eV 2.74 m 2.74 m Tank OpRayleigh Photon at Boundary! - Old Momentum Direction: (-0.29726426,-0.90136946,-0.31490803) - Old Polarization: (-0.33380386,-0.21089389,0.91874847) - New Momentum Direction: (-0.40304627,-0.80947608,-0.4269686) - New Polarization: (-0.35869609,-0.28948848,0.88743086) + Old Momentum Direction: (0.19702907,-0.61030778,-0.76727046) + Old Polarization: (0.74394422,-0.41664507,0.52244989) + New Momentum Direction: (0.26737895,-0.82822021,-0.49250359) + New Polarization: (0.40180596,0.56038671,-0.72423664) *** FresnelRefraction *** - 1 -1.65 m -5 m -1.75 m 3.24 eV 0 eV 5.55 m 5.55 m Tank Transportation - 2 -4.14 m -10 m -4.38 m 3.24 eV 0 eV 6.18 m 11.7 m OutOfWorld Transportation + 2 2.44 m -1.38 m -5 m 3.41 eV 0 eV 6.29 m 9.03 m Tank Transportation + 3 5.16 m -9.79 m -10 m 3.41 eV 0 eV 10.2 m 19.2 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 43, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 5.28 mum 0 fm 0 fm 2.93 eV 0 eV 0 fm 0 fm Tank initStep + 0 647 mum 0 fm 0 fm 4.02 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (-0.6895524,-0.4540972,0.56419253) - Old Polarization: (-0.034816033,-0.75733277,-0.65210039) - New Momentum Direction: (0.6895524,-0.4540972,0.56419253) - New Polarization: (-0.023663883,-0.79272854,-0.60911533) - *** SpikeReflection *** - 1 -5 m -3.29 m 4.09 m 2.93 eV 0 eV 7.25 m 7.25 m Tank Transportation - 2 -5 m -3.29 m 4.09 m 2.93 eV 0 eV 0 fm 7.25 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.6895524,-0.4540972,0.56419253) - Old Polarization: (-0.023663883,-0.79272854,-0.60911533) - New Momentum Direction: (0.6895524,-0.4540972,-0.56419253) - New Polarization: (0.023663883,0.79272854,-0.60911533) - *** LobeReflection *** - 3 -3.89 m -4.02 m 5 m 2.93 eV 0 eV 1.61 m 8.86 m Tank Transportation - 4 -3.89 m -4.02 m 5 m 2.93 eV 0 eV 0 fm 8.86 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.6895524,-0.4540972,-0.56419253) - Old Polarization: (0.023663883,0.79272854,-0.60911533) - New Momentum Direction: (0.6895524,0.4540972,-0.56419253) - New Polarization: (-0.023663883,0.79272854,0.60911533) - *** LobeReflection *** - 5 -2.41 m -5 m 3.79 m 2.93 eV 0 eV 2.15 m 11 m Tank Transportation - 6 -2.41 m -5 m 3.79 m 2.93 eV 0 eV 0 fm 11 m World Transportation - Photon at Boundary! - Old Momentum Direction: (0.6895524,0.4540972,-0.56419253) - Old Polarization: (-0.023663883,0.79272854,0.60911533) - New Momentum Direction: (0.19668889,0.61475399,-0.76380037) - New Polarization: (0.03787231,0.77367274,0.63245252) + Old Momentum Direction: (0.71269582,0.67722866,0.18282783) + Old Polarization: (-0.23374276,0.47501327,-0.84836709) + New Momentum Direction: (0.29961162,0.92108666,0.24866088) + New Polarization: (0.35459097,0.13445769,-0.9253034) *** FresnelRefraction *** - 7 5 m -12.2 cm -2.27 m 2.93 eV 0 eV 10.7 m 21.8 m Tank Transportation - 8 6.99 m 6.1 m -10 m 2.93 eV 0 eV 10.1 m 31.9 m OutOfWorld Transportation + 1 5 m 4.75 m 1.28 m 4.02 eV 0 eV 7.01 m 7.01 m Tank Transportation + 2 6.71 m 10 m 2.7 m 4.02 eV 0 eV 5.7 m 12.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 42, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 188 mum 0 fm 0 fm 2.93 eV 0 eV 0 fm 0 fm Tank initStep + 0 135 mum 0 fm 0 fm 3.24 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.21874766,0.86910968,0.44361901) - Old Polarization: (-0.64959203,-0.20954336,0.73083635) - New Momentum Direction: (0.29615288,0.74268263,0.60059635) - New Polarization: (-0.95078483,0.28921103,0.1111989) + Old Momentum Direction: (0.40741802,0.69626168,0.59095705) + Old Polarization: (0.3782559,-0.7176375,0.58473831) + New Momentum Direction: (0.55238675,0.22998747,0.8012332) + New Polarization: (-0.14500002,0.97304308,-0.17933809) *** FresnelRefraction *** - 1 1.26 m 5 m 2.55 m 2.93 eV 0 eV 5.75 m 5.75 m Tank Transportation - 2 3.25 m 10 m 6.6 m 2.93 eV 0 eV 6.73 m 12.5 m OutOfWorld Transportation + 1 2.93 m 5 m 4.24 m 3.24 eV 0 eV 7.18 m 7.18 m Tank Transportation + 2 6.89 m 6.65 m 10 m 3.24 eV 0 eV 7.18 m 14.4 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 41, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 103 mum 0 fm 0 fm 3.03 eV 0 eV 0 fm 0 fm Tank initStep + 0 515 mum 0 fm 0 fm 3.44 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (-0.35201719,0.56511873,-0.74613988) - Old Polarization: (0.900738,-0.012196349,-0.43419156) - New Momentum Direction: (-0.47681713,0.76546913,-0.43209076) - New Polarization: (0.77664944,0.13666732,-0.61492901) - *** FresnelRefraction *** - 1 -2.36 m 3.79 m -5 m 3.03 eV 0 eV 6.7 m 6.7 m Tank Transportation - 2 -6.23 m 10 m -8.51 m 3.03 eV 0 eV 8.12 m 14.8 m OutOfWorld Transportation + Old Momentum Direction: (0.61105452,0.27895939,0.74080634) + Old Polarization: (-0.084101052,0.95342929,-0.28965427) + New Momentum Direction: (0.61105452,0.27895939,-0.74080634) + New Polarization: (-0.30325042,0.94694671,0.1064477) + *** SpikeReflection *** + 1 4.12 m 1.88 m 5 m 3.44 eV 0 eV 6.75 m 6.75 m Tank Transportation + 2 4.12 m 1.88 m 5 m 3.44 eV 0 eV 0 fm 6.75 m World Transportation + Photon at Boundary! + Old Momentum Direction: (0.61105452,0.27895939,-0.74080634) + Old Polarization: (-0.30325042,0.94694671,0.1064477) + New Momentum Direction: (-0.61105452,0.27895939,-0.74080634) + New Polarization: (-0.30325042,-0.94694671,-0.1064477) + *** LobeReflection *** + 3 5 m 2.28 m 3.94 m 3.44 eV 0 eV 1.43 m 8.18 m Tank Transportation + 4 5 m 2.28 m 3.94 m 3.44 eV 0 eV 0 fm 8.18 m World Transportation + +** Photon absorbed! ** + 5 4.05 m 2.71 m 2.79 m 3.44 eV 0 eV 1.55 m 9.73 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 40, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 30.7 mum 0 fm 0 fm 3.88 eV 0 eV 0 fm 0 fm Tank initStep + 0 206 mum 0 fm 0 fm 3.91 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85247191,0.1295654,0.50646268) - Old Polarization: (-0.52277302,0.21127882,0.82587507) - New Momentum Direction: (0.70348617,0.17614392,0.68853506) - New Polarization: (0.71070895,-0.17435381,-0.68153763) + Old Momentum Direction: (0.15420853,-0.98795999,-0.012441754) + Old Polarization: (-0.89175948,-0.14459267,0.42878665) + New Momentum Direction: (-0.15420853,0.98795999,0.012441754) + New Polarization: (0.89175948,0.14459267,-0.42878665) + *** BackScattering *** + 1 78.1 cm -5 m -6.3 cm 3.91 eV 0 eV 5.06 m 5.06 m Tank Transportation + 2 78.1 cm -5 m -6.3 cm 3.91 eV 0 eV 0 fm 5.06 m World Transportation + Photon at Boundary! + Old Momentum Direction: (-0.15420853,0.98795999,0.012441754) + Old Polarization: (0.89175948,0.14459267,-0.42878665) + New Momentum Direction: (-0.20966717,0.97762647,0.016916233) + New Polarization: (0.88235741,0.19663293,-0.42752883) *** FresnelRefraction *** - 1 5 m 76 cm 2.97 m 3.88 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m 2.01 m 7.86 m 3.88 eV 0 eV 7.11 m 13 m OutOfWorld Transportation + 3 -31.2 cm 2 m 2.52 cm 3.91 eV 0 eV 7.09 m 12.1 m Tank Transportation + Photon at Boundary! + Old Momentum Direction: (-0.20966717,0.97762647,0.016916233) + Old Polarization: (0.88235741,0.19663293,-0.42752883) + New Momentum Direction: (-0.69486096,0.71903647,0.012441754) + New Polarization: (-0.66648564,-0.63738581,-0.38669914) + *** FresnelRefraction *** + 4 -50 cm 2.88 m 4.04 cm 3.91 eV 0 eV 89.7 cm 13 m Bubble Transportation + Photon at Boundary! + Old Momentum Direction: (-0.69486096,0.71903647,0.012441754) + Old Polarization: (-0.66648564,-0.63738581,-0.38669914) + New Momentum Direction: (-0.94475663,0.32733583,0.016916233) + New Polarization: (0.29868447,0.88102199,-0.36686216) + *** FresnelRefraction *** + 5 -2.55 m 5 m 7.71 cm 3.91 eV 0 eV 2.95 m 16 m Tank Transportation + 6 -10 m 7.58 m 21 cm 3.91 eV 0 eV 7.88 m 23.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 39, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 93.3 mum 0 fm 0 fm 3.87 eV 0 eV 0 fm 0 fm Tank initStep + 0 454 mum 0 fm 0 fm 2.16 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85248781,-0.38235925,0.35646309) - Old Polarization: (-0.5227471,-0.6235455,0.58131444) - New Momentum Direction: (0.70353517,-0.51980699,0.48460186) - New Polarization: (0.71066045,0.51459526,-0.47974311) + Old Momentum Direction: (-0.54325085,-0.82649986,-0.14756858) + Old Polarization: (-0.81899119,0.48300711,0.30977019) + New Momentum Direction: (-0.73080113,-0.65308622,-0.19851471) + New Polarization: (0.4143463,-0.65555162,0.63132339) *** FresnelRefraction *** - 1 5 m -2.24 m 2.09 m 3.87 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m -5.94 m 5.53 m 3.87 eV 0 eV 7.11 m 13 m OutOfWorld Transportation + 1 -3.29 m -5 m -89.3 cm 2.16 eV 0 eV 6.05 m 6.05 m Tank Transportation + 2 -8.88 m -10 m -2.41 m 2.16 eV 0 eV 7.66 m 13.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 38, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 180 mum 0 fm 0 fm 4.09 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 59.7 cm 20.4 cm -30.5 cm 4.09 eV 0 eV 70.1 cm 70.1 cm Tank OpAbsorption + 0 88.3 mum 0 fm 0 fm 3.03 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.19798401,0.96839314,0.15171373) + Old Polarization: (0.51346623,-0.23430376,0.82550238) + New Momentum Direction: (0.26817286,0.94119791,0.20549894) + New Polarization: (-0.90992302,0.3175281,-0.26686328) + *** FresnelRefraction *** + 1 40.9 cm 2 m 31.3 cm 3.03 eV 0 eV 2.07 m 2.07 m Tank Transportation + Photon at Boundary! + Old Momentum Direction: (0.26817286,0.94119791,0.20549894) + Old Polarization: (-0.90992302,0.3175281,-0.26686328) + New Momentum Direction: (0.70296151,0.6948583,0.15171373) + New Polarization: (0.68051247,-0.59511207,-0.42748614) + *** FresnelRefraction *** + 2 50 cm 2.32 m 38.3 cm 3.03 eV 0 eV 33.9 cm 2.4 m Bubble Transportation + Photon at Boundary! + Old Momentum Direction: (0.70296151,0.6948583,0.15171373) + Old Polarization: (0.68051247,-0.59511207,-0.42748614) + New Momentum Direction: (0.95217385,0.22613082,0.20549894) + New Polarization: (-0.084954475,0.84194209,-0.53283792) + *** FresnelRefraction *** + 3 3.21 m 5 m 96.8 cm 3.03 eV 0 eV 3.86 m 6.26 m Tank Transportation + 4 10 m 6.61 m 2.43 m 3.03 eV 0 eV 7.13 m 13.4 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 37, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 58.8 mum 0 fm 0 fm 2.42 eV 0 eV 0 fm 0 fm Tank initStep + 0 337 mum 0 fm 0 fm 3.59 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.8595015,-0.44787952,0.24629478) - Old Polarization: (-0.51113323,-0.75313654,0.4141596) - New Momentum Direction: (0.72456979,-0.60391144,0.33209877) - New Polarization: (0.68920143,0.6349029,-0.34914137) + Old Momentum Direction: (-0.17437712,0.97416294,0.14352417) + Old Polarization: (-0.96075518,-0.13638901,-0.24155232) + New Momentum Direction: (-0.23684526,0.95178929,0.19493968) + New Polarization: (-0.061082465,0.18566376,-0.98071296) *** FresnelRefraction *** - 1 5 m -2.61 m 1.43 m 2.42 eV 0 eV 5.82 m 5.82 m Tank Transportation - 2 10 m -6.77 m 3.72 m 2.42 eV 0 eV 6.9 m 12.7 m OutOfWorld Transportation + 1 -35.8 cm 2 m 29.5 cm 3.59 eV 0 eV 2.05 m 2.05 m Tank Transportation + Photon at Boundary! + Old Momentum Direction: (-0.23684526,0.95178929,0.19493968) + Old Polarization: (-0.061082465,0.18566376,-0.98071296) + New Momentum Direction: (-0.69881656,0.70075404,0.14352417) + New Polarization: (-0.052228775,0.15012561,-0.98728641) + *** FresnelRefraction *** + 2 -50 cm 2.57 m 41.2 cm 3.59 eV 0 eV 60.1 cm 2.65 m Bubble Transportation + Photon at Boundary! + Old Momentum Direction: (-0.69881656,0.70075404,0.14352417) + Old Polarization: (-0.052228775,0.15012561,-0.98728641) + New Momentum Direction: (-0.94915773,0.24718034,0.19493968) + New Polarization: (-0.1367181,0.2341255,-0.96254528) + *** FresnelRefraction *** + 3 -2.92 m 5 m 90.9 cm 3.59 eV 0 eV 3.46 m 6.12 m Tank Transportation + 4 -10 m 6.84 m 2.36 m 3.59 eV 0 eV 7.46 m 13.6 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 36, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 141 mum 0 fm 0 fm 2.72 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.85724849,-0.1900385,-0.4785503) - Old Polarization: (-0.51490292,-0.31639017,-0.79672595) - New Momentum Direction: (0.71793601,-0.25691743,-0.64696316) - New Polarization: (0.69610911,0.26497322,0.66724906) - *** FresnelRefraction *** - 1 5 m -1.11 m -2.79 m 2.72 eV 0 eV 5.83 m 5.83 m Tank Transportation - 2 10 m -2.9 m -7.3 m 2.72 eV 0 eV 6.96 m 12.8 m OutOfWorld Transportation + 0 725 mum 0 fm 0 fm 2.2 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 1.02 m -1.04 m 7.59 cm 2.2 eV 0 eV 1.46 m 1.46 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 35, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 191 mum 0 fm 0 fm 4.13 eV 0 eV 0 fm 0 fm Tank initStep + 0 386 mum 0 fm 0 fm 3.36 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85168109,-0.020373577,0.52366424) - Old Polarization: (-0.52406042,-0.033110285,0.85103724) - New Momentum Direction: (0.70104127,-0.027723558,0.7125816) - New Polarization: (0.7131207,0.027253953,-0.7005113) + Old Momentum Direction: (0.71235308,-0.69839193,0.069295049) + Old Polarization: (-0.2513067,-0.34602053,-0.90394399) + New Momentum Direction: (0.30531744,-0.94759761,0.094021451) + New Polarization: (0.37833907,0.030104544,-0.92517742) *** FresnelRefraction *** - 1 5 m -12 cm 3.07 m 4.13 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m -31.7 cm 8.16 m 4.13 eV 0 eV 7.13 m 13 m OutOfWorld Transportation + 1 5 m -4.9 m 48.6 cm 3.36 eV 0 eV 7.02 m 7.02 m Tank Transportation + 2 6.64 m -10 m 99.2 cm 3.36 eV 0 eV 5.38 m 12.4 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 34, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 94.5 mum 0 fm 0 fm 2.59 eV 0 eV 0 fm 0 fm Tank initStep + 0 734 mum 0 fm 0 fm 4.09 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85813547,0.50155418,-0.10975845) - Old Polarization: (-0.51342332,0.83829739,-0.18345021) - New Momentum Direction: (0.72056118,0.67736178,-0.1482316) - New Polarization: (0.69339136,-0.70390349,0.1540399) - *** FresnelRefraction *** - 1 5 m 2.92 m -64 cm 2.59 eV 0 eV 5.83 m 5.83 m Tank Transportation - 2 10 m 7.62 m -1.67 m 2.59 eV 0 eV 6.94 m 12.8 m OutOfWorld Transportation + Old Momentum Direction: (0.67591971,0.45034008,0.58337498) + Old Polarization: (0.71971555,-0.23304715,-0.65398666) + New Momentum Direction: (-0.67591971,0.45034008,0.58337498) + New Polarization: (0.71971555,0.23304715,0.65398666) + *** LobeReflection *** + 1 5 m 3.33 m 4.31 m 4.09 eV 0 eV 7.4 m 7.4 m Tank Transportation + 2 5 m 3.33 m 4.31 m 4.09 eV 0 eV 0 fm 7.4 m World Transportation + Photon at Boundary! + Old Momentum Direction: (-0.67591971,0.45034008,0.58337498) + Old Polarization: (0.71971555,0.23304715,0.65398666) + New Momentum Direction: (0.67591971,-0.45034008,-0.58337498) + New Polarization: (-0.71971555,-0.23304715,-0.65398666) + *** BackScattering *** + 3 4.21 m 3.86 m 5 m 4.09 eV 0 eV 1.17 m 8.57 m Tank Transportation + 4 4.21 m 3.86 m 5 m 4.09 eV 0 eV 0 fm 8.57 m World Transportation + Photon at Boundary! + Old Momentum Direction: (0.67591971,-0.45034008,-0.58337498) + Old Polarization: (-0.71971555,-0.23304715,-0.65398666) + New Momentum Direction: (-0.67591971,-0.45034008,-0.58337498) + New Polarization: (-0.71971555,0.23304715,0.65398666) + *** LobeReflection *** + 5 5 m 3.33 m 4.31 m 4.09 eV 0 eV 1.17 m 9.75 m Tank Transportation + 6 5 m 3.33 m 4.31 m 4.09 eV 0 eV 0 fm 9.75 m World Transportation + +** Photon absorbed! ** + 7 -3.46 m -2.31 m -2.99 m 4.09 eV 0 eV 12.5 m 22.3 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 33, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 74 mum 0 fm 0 fm 2.17 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 4.95 m 2.83 m -71.7 cm 2.17 eV 0 eV 5.75 m 5.75 m Tank OpAbsorption + 0 563 mum 0 fm 0 fm 4.01 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.36643756,0.83837074,-0.4035567) + Old Polarization: (0.26041278,0.32398155,0.90951698) + New Momentum Direction: (0.49837158,0.67110629,-0.54885528) + New Polarization: (0.31416242,0.45025313,0.83580745) + *** FresnelRefraction *** + 1 2.19 m 5 m -2.41 m 4.01 eV 0 eV 5.96 m 5.96 m Tank Transportation + 2 5.9 m 10 m -6.5 m 4.01 eV 0 eV 7.45 m 13.4 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 32, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 96.8 mum 0 fm 0 fm 2.21 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.86103311,-0.50406594,-0.067375947) - Old Polarization: (-0.5085489,-0.85344292,-0.1140754) - New Momentum Direction: (0.72901566,-0.67846303,-0.090686726) - New Polarization: (0.68449702,0.72258923,0.096584852) - *** FresnelRefraction *** - 1 5 m -2.93 m -39.1 cm 2.21 eV 0 eV 5.81 m 5.81 m Tank Transportation - 2 10 m -7.58 m -1.01 m 2.21 eV 0 eV 6.86 m 12.7 m OutOfWorld Transportation + 0 272 mum 0 fm 0 fm 4.13 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 -90 cm -3.5 cm 31.6 cm 4.13 eV 0 eV 95.5 cm 95.5 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 31, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 143 mum 0 fm 0 fm 2.3 eV 0 eV 0 fm 0 fm Tank initStep + 0 181 mum 0 fm 0 fm 2.48 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.8603348,0.15836832,-0.48450336) - Old Polarization: (-0.50972937,0.26729826,-0.81775767) - New Momentum Direction: (0.72699497,0.21333372,-0.6526615) - New Polarization: (0.68664278,-0.22587078,0.6910167) + Old Momentum Direction: (-0.081608771,0.96169841,0.26167953) + Old Polarization: (0.21004477,-0.24006296,0.94776103) + New Momentum Direction: (-0.1101012,0.92910703,0.35304087) + New Polarization: (0.70153815,0.32426254,-0.63458492) *** FresnelRefraction *** - 1 5 m 92 cm -2.82 m 2.3 eV 0 eV 5.81 m 5.81 m Tank Transportation - 2 10 m 2.39 m -7.3 m 2.3 eV 0 eV 6.88 m 12.7 m OutOfWorld Transportation + 1 -42.4 cm 5 m 1.36 m 2.48 eV 0 eV 5.2 m 5.2 m Tank Transportation + 2 -1.02 m 10 m 3.26 m 2.48 eV 0 eV 5.38 m 10.6 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 30, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 133 mum 0 fm 0 fm 2.8 eV 0 eV 0 fm 0 fm Tank initStep + 0 54.7 mum 0 fm 0 fm 2.21 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85672622,-0.50882352,0.084373071) - Old Polarization: (-0.51577145,-0.8451853,0.14014855) - New Momentum Direction: (0.7163819,-0.68830957,0.11413543) - New Polarization: (0.69770837,0.70673156,-0.11719017) + Old Momentum Direction: (0.10144571,-0.75895524,0.64319181) + Old Polarization: (0.022224895,0.64809479,0.76123531) + New Momentum Direction: (0.13654397,-0.4815372,0.86572378) + New Polarization: (-0.16413349,-0.8728272,-0.45960078) *** FresnelRefraction *** - 1 5 m -2.97 m 49.2 cm 2.8 eV 0 eV 5.84 m 5.84 m Tank Transportation - 2 10 m -7.77 m 1.29 m 2.8 eV 0 eV 6.98 m 12.8 m OutOfWorld Transportation + 1 66.8 cm -5 m 4.24 m 2.21 eV 0 eV 6.59 m 6.59 m Tank Transportation + 2 1.58 m -8.21 m 10 m 2.21 eV 0 eV 6.66 m 13.2 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 29, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 90.8 mum 0 fm 0 fm 2.03 eV 0 eV 0 fm 0 fm Tank initStep + 0 42.2 mum 0 fm 0 fm 3.56 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 1 1.5 m 69.4 cm -53.7 cm 2.03 eV 0 eV 1.73 m 1.73 m Tank OpAbsorption + 1 1.9 m 1.99 m -94.3 cm 3.56 eV 0 eV 2.91 m 2.91 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 28, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 13.7 mum 0 fm 0 fm 3.6 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.85323787,-0.50655797,0.12403288) - Old Polarization: (-0.52152194,-0.82875602,0.20292445) - New Momentum Direction: (0.70583968,-0.68804639,0.16847109) - New Polarization: (0.70837161,0.68558711,-0.16786893) - *** FresnelRefraction *** - 1 5 m -2.97 m 72.7 cm 3.6 eV 0 eV 5.86 m 5.86 m Tank Transportation - 2 10 m -7.84 m 1.92 m 3.6 eV 0 eV 7.08 m 12.9 m OutOfWorld Transportation + 0 306 mum 0 fm 0 fm 2.03 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 5.11 cm 6.56 cm 10.2 cm 2.03 eV 0 eV 13.2 cm 13.2 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 27, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 141 mum 0 fm 0 fm 4.07 eV 0 eV 0 fm 0 fm Tank initStep + 0 598 mum 0 fm 0 fm 3.95 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85189856,-0.27616861,-0.44497161) - Old Polarization: (-0.52370682,-0.4492354,-0.7238223) - New Momentum Direction: (0.70171514,-0.3757034,-0.60534521) - New Polarization: (0.71245763,0.37003851,0.59621777) + Old Momentum Direction: (-0.021135295,-0.91329033,-0.40676045) + Old Polarization: (-0.43102505,0.37542315,-0.82053328) + New Momentum Direction: (-0.028739619,-0.83261244,-0.5531099) + New Polarization: (-0.34281971,-0.51156811,0.78789131) *** FresnelRefraction *** - 1 5 m -1.62 m -2.61 m 4.07 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m -4.3 m -6.92 m 4.07 eV 0 eV 7.13 m 13 m OutOfWorld Transportation + 1 -11.5 cm -5 m -2.23 m 3.95 eV 0 eV 5.47 m 5.47 m Tank Transportation + 2 -28.8 cm -10 m -5.55 m 3.95 eV 0 eV 6.01 m 11.5 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 26, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 11.9 mum 0 fm 0 fm 3.94 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 41.8 cm 24.9 cm 6.28 cm 3.94 eV 0 eV 49.1 cm 49.1 cm Tank OpAbsorption + 0 814 mum 0 fm 0 fm 2.16 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.8614644,0.18526703,-0.47281625) + Old Polarization: (-0.50781796,0.31428772,-0.80208737) + New Momentum Direction: (0.73025845,0.24924101,-0.63608295) + New Polarization: (0.68317098,-0.26641991,0.67992488) + *** FresnelRefraction *** + 1 5 m 1.08 m -2.74 m 2.16 eV 0 eV 5.8 m 5.8 m Tank Transportation + 2 10 m 2.78 m -7.1 m 2.16 eV 0 eV 6.85 m 12.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 25, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 41.1 mum 0 fm 0 fm 3.97 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 1.22 m -29.4 cm -69.2 cm 3.97 eV 0 eV 1.44 m 1.44 m Tank OpAbsorption + 0 761 mum 0 fm 0 fm 2.65 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.85771274,0.49374885,-0.14332104) + Old Polarization: (-0.51412921,0.82371254,-0.23909997) + New Momentum Direction: (0.71931225,0.66714913,-0.19365414) + New Polarization: (0.6946869,-0.69079832,0.20051881) + *** FresnelRefraction *** + 1 5 m 2.88 m -83.5 cm 2.65 eV 0 eV 5.83 m 5.83 m Tank Transportation + 2 10 m 7.52 m -2.18 m 2.65 eV 0 eV 6.95 m 12.8 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 24, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 68.4 mum 0 fm 0 fm 4.12 eV 0 eV 0 fm 0 fm Tank initStep + 0 775 mum 0 fm 0 fm 3.36 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85169957,0.45236164,-0.26453125) - Old Polarization: (-0.52403038,0.73521734,-0.4299391) - New Momentum Direction: (0.70109859,0.61554248,-0.35995586) - New Polarization: (0.71306435,-0.60521321,0.35391552) + Old Momentum Direction: (0.85414724,0.43698842,0.28191065) + Old Polarization: (-0.52003124,0.71775006,0.46303603) + New Momentum Direction: (0.70861551,0.5929197,0.38250527) + New Polarization: (0.70559482,-0.59545802,-0.3841428) *** FresnelRefraction *** - 1 5 m 2.66 m -1.55 m 4.12 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m 7.05 m -4.12 m 4.12 eV 0 eV 7.13 m 13 m OutOfWorld Transportation + 1 5 m 2.56 m 1.65 m 3.36 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m 6.74 m 4.35 m 3.36 eV 0 eV 7.06 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 23, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 131 mum 0 fm 0 fm 3.49 eV 0 eV 0 fm 0 fm Tank initStep + 0 597 mum 0 fm 0 fm 3.21 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85368378,-0.50525028,0.12627812) - Old Polarization: (-0.52079172,-0.8282082,0.20699558) - New Momentum Direction: (0.70720326,-0.68591173,0.17143116) - New Polarization: (0.70701028,0.68609895,-0.17147796) + Old Momentum Direction: (0.85486238,-0.41739089,0.30821285) + Old Polarization: (-0.51885481,-0.68769097,0.50780982) + New Momentum Direction: (0.71078467,-0.56585538,0.41784309) + New Polarization: (0.70340967,0.57178817,-0.42222402) *** FresnelRefraction *** - 1 5 m -2.96 m 74 cm 3.49 eV 0 eV 5.86 m 5.86 m Tank Transportation - 2 10 m -7.81 m 1.95 m 3.49 eV 0 eV 7.07 m 12.9 m OutOfWorld Transportation + 1 5 m -2.44 m 1.8 m 3.21 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m -6.42 m 4.74 m 3.21 eV 0 eV 7.03 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 22, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 113 mum 0 fm 0 fm 3.75 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 2.74 m -1.6 m 49.4 cm 3.75 eV 0 eV 3.21 m 3.21 m Tank OpAbsorption + 0 590 mum 0 fm 0 fm 3.18 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.85499089,0.21837555,0.47042821) + Old Polarization: (-0.51864302,0.3599954,0.77550804) + New Momentum Direction: (0.71117318,0.29600648,0.63766204) + New Polarization: (0.70301686,-0.29944071,-0.64506012) + *** FresnelRefraction *** + 1 5 m 1.28 m 2.75 m 3.18 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m 3.36 m 7.23 m 3.18 eV 0 eV 7.03 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 21, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 109 mum 0 fm 0 fm 2.4 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 2.13 m 1.22 m 35.1 cm 2.4 eV 0 eV 2.48 m 2.48 m Tank OpAbsorption + 0 247 mum 0 fm 0 fm 2.51 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.85868991,0.2552028,-0.44443578) + Old Polarization: (-0.5124955,0.42759413,-0.74465537) + New Momentum Direction: (0.72219318,0.34443538,-0.59983437) + New Polarization: (0.69169141,-0.35962408,0.62628549) + *** FresnelRefraction *** + 1 5 m 1.49 m -2.59 m 2.51 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m 3.87 m -6.74 m 2.51 eV 0 eV 6.92 m 12.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 20, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 45.4 mum 0 fm 0 fm 3.16 eV 0 eV 0 fm 0 fm Tank initStep + 0 343 mum 0 fm 0 fm 3.44 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 1 1.42 m 47 cm 72.4 cm 3.16 eV 0 eV 1.66 m 1.66 m Tank OpAbsorption + 1 3.59 m -2.19 m -2.8 cm 3.44 eV 0 eV 4.2 m 4.2 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 19, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 134 mum 0 fm 0 fm 3.76 eV 0 eV 0 fm 0 fm Tank initStep + 0 121 mum 0 fm 0 fm 3.76 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85278639,0.41130284,-0.32184678) - Old Polarization: (-0.52225988,0.67160714,-0.52553636) - New Momentum Direction: (0.70445415,0.55895924,-0.43738875) - New Polarization: (0.7097495,-0.55478892,0.43412545) + Old Momentum Direction: (0.85279769,-0.32424198,-0.40939375) + Old Polarization: (-0.52224142,-0.52947315,-0.66852231) + New Momentum Direction: (0.70448889,-0.44063797,-0.55635742) + New Polarization: (0.70971501,0.43739325,0.55226058) *** FresnelRefraction *** - 1 5 m 2.41 m -1.89 m 3.76 eV 0 eV 5.86 m 5.86 m Tank Transportation - 2 10 m 6.38 m -4.99 m 3.76 eV 0 eV 7.1 m 13 m OutOfWorld Transportation + 1 5 m -1.9 m -2.4 m 3.76 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -5.03 m -6.35 m 3.76 eV 0 eV 7.1 m 13 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 18, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 164 mum 0 fm 0 fm 2.48 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 99.1 cm 51.7 cm -28.6 cm 2.48 eV 0 eV 1.15 m 1.15 m Tank OpAbsorption + 0 142 mum 0 fm 0 fm 2.3 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.86036636,0.50948848,0.013827935) + Old Polarization: (-0.50967609,0.86004966,0.023342452) + New Momentum Direction: (0.72708653,0.6862931,0.018626557) + New Polarization: (0.68654583,-0.72681889,-0.01972646) + *** FresnelRefraction *** + 1 5 m 2.96 m 8.04 cm 2.3 eV 0 eV 5.81 m 5.81 m Tank Transportation + 2 10 m 7.68 m 20.8 cm 2.3 eV 0 eV 6.88 m 12.7 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 17, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 25.4 mum 0 fm 0 fm 3.72 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 1.01 m -36.4 cm -49.9 cm 3.72 eV 0 eV 1.18 m 1.18 m Tank OpAbsorption + 0 756 mum 0 fm 0 fm 2.63 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.85790484,-0.37315496,-0.35320626) + Old Polarization: (-0.51380861,-0.62305582,-0.58974753) + New Momentum Direction: (0.71988027,-0.50409083,-0.47714235) + New Polarization: (0.69409826,0.52281509,0.49486563) + *** FresnelRefraction *** + 1 5 m -2.17 m -2.06 m 2.63 eV 0 eV 5.83 m 5.83 m Tank Transportation + 2 10 m -5.68 m -5.37 m 2.63 eV 0 eV 6.95 m 12.8 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 16, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 56.6 mum 0 fm 0 fm 2.25 eV 0 eV 0 fm 0 fm Tank initStep + 0 83.9 mum 0 fm 0 fm 2.31 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 1 95.1 cm 33 cm -45.5 cm 2.25 eV 0 eV 1.11 m 1.11 m Tank OpAbsorption + 1 2.22 m 1.31 m 16.8 cm 2.31 eV 0 eV 2.59 m 2.59 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 15, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 26.8 mum 0 fm 0 fm 2.16 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.8615111,-0.051191657,0.50515149) - Old Polarization: (-0.50773873,-0.08685999,0.85712118) - New Momentum Direction: (0.73039278,-0.068864754,0.67954693) - New Polarization: (0.68302737,0.07364027,-0.72667099) - *** FresnelRefraction *** - 1 5 m -29.7 cm 2.93 m 2.16 eV 0 eV 5.8 m 5.8 m Tank Transportation - 2 10 m -76.9 cm 7.58 m 2.16 eV 0 eV 6.85 m 12.6 m OutOfWorld Transportation + 0 433 mum 0 fm 0 fm 3.94 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 1.8 m -1.09 m -13.6 cm 3.94 eV 0 eV 2.11 m 2.11 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 14, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 181 mum 0 fm 0 fm 2.69 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.8574164,0.16457695,0.48759773) - Old Polarization: (-0.51462328,0.27420247,0.812389) - New Momentum Direction: (0.71843431,0.22245179,0.6590655) - New Polarization: (0.69559481,-0.22975588,-0.68070559) - *** FresnelRefraction *** - 1 5 m 96 cm 2.84 m 2.69 eV 0 eV 5.83 m 5.83 m Tank Transportation - 2 10 m 2.51 m 7.43 m 2.69 eV 0 eV 6.96 m 12.8 m OutOfWorld Transportation + 0 376 mum 0 fm 0 fm 3.35 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 1.12 m -68.2 cm -2.45 cm 3.35 eV 0 eV 1.31 m 1.31 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 13, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 126 mum 0 fm 0 fm 2.2 eV 0 eV 0 fm 0 fm Tank initStep + 0 74.3 mum 0 fm 0 fm 2.61 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.86112833,0.26833694,-0.43180236) - Old Polarization: (-0.50838764,0.45452037,-0.73140498) - New Momentum Direction: (0.7292904,0.3611364,-0.58113339) - New Polarization: (0.68420429,-0.38493373,0.61942757) + Old Momentum Direction: (0.85803548,-0.33212135,-0.39175315) + Old Polarization: (-0.51359042,-0.55486218,-0.6544867) + New Momentum Direction: (0.7202661,-0.44859067,-0.52913434) + New Polarization: (0.69369787,0.46577144,0.54939988) *** FresnelRefraction *** - 1 5 m 1.56 m -2.51 m 2.2 eV 0 eV 5.81 m 5.81 m Tank Transportation - 2 10 m 4.03 m -6.49 m 2.2 eV 0 eV 6.86 m 12.7 m OutOfWorld Transportation + 1 5 m -1.94 m -2.28 m 2.61 eV 0 eV 5.83 m 5.83 m Tank Transportation + 2 10 m -5.05 m -5.96 m 2.61 eV 0 eV 6.94 m 12.8 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 12, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 54.5 mum 0 fm 0 fm 2.74 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.85714229,-0.33130843,-0.3943879) - Old Polarization: (-0.51507969,-0.55132919,-0.6562995) - New Momentum Direction: (0.71762049,-0.44795899,-0.53324814) - New Polarization: (0.69643437,0.46158628,0.54946999) - *** FresnelRefraction *** - 1 5 m -1.93 m -2.3 m 2.74 eV 0 eV 5.83 m 5.83 m Tank Transportation - 2 10 m -5.05 m -6.02 m 2.74 eV 0 eV 6.97 m 12.8 m OutOfWorld Transportation + 0 746 mum 0 fm 0 fm 3.87 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 53.4 cm -31.1 cm -9.87 cm 3.87 eV 0 eV 62.5 cm 62.5 cm Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 11, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 175 mum 0 fm 0 fm 3.12 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.85523123,0.44391052,-0.26743782) - Old Polarization: (-0.5182466,0.73255887,-0.44133656) - New Momentum Direction: (0.71189876,0.60154841,-0.36240815) - New Polarization: (0.70228211,-0.60978567,0.36737077) - *** FresnelRefraction *** - 1 5 m 2.6 m -1.56 m 3.12 eV 0 eV 5.85 m 5.85 m Tank Transportation - 2 10 m 6.82 m -4.11 m 3.12 eV 0 eV 7.02 m 12.9 m OutOfWorld Transportation + 0 137 mum 0 fm 0 fm 3.56 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 1.18 m -11.9 cm -70.9 cm 3.56 eV 0 eV 1.38 m 1.38 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 10, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 145 mum 0 fm 0 fm 3.03 eV 0 eV 0 fm 0 fm Tank initStep + 0 744 mum 0 fm 0 fm 4.06 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 1 47.7 cm -19 cm -21.7 cm 3.03 eV 0 eV 55.7 cm 55.7 cm Tank OpAbsorption + 1 1.02 m -48.6 cm -39.3 cm 4.06 eV 0 eV 1.19 m 1.19 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 9, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 183 mum 0 fm 0 fm 2.92 eV 0 eV 0 fm 0 fm Tank initStep + 0 214 mum 0 fm 0 fm 3.56 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85606959,-0.076741873,-0.51113162) - Old Polarization: (-0.51686057,-0.12710659,-0.84658081) - New Momentum Direction: (0.71441919,-0.10389198,-0.6919622) - New Polarization: (0.69971796,0.10607477,0.70650047) + Old Momentum Direction: (0.85337283,-0.27498308,-0.44287597) + Old Polarization: (-0.52130108,-0.45014887,-0.72499047) + New Momentum Direction: (0.70625288,-0.37344432,-0.60145341) + New Polarization: (0.70795965,0.37254401,0.60000341) *** FresnelRefraction *** - 1 5 m -44.8 cm -2.99 m 2.92 eV 0 eV 5.84 m 5.84 m Tank Transportation - 2 10 m -1.18 m -7.83 m 2.92 eV 0 eV 7 m 12.8 m OutOfWorld Transportation + 1 5 m -1.61 m -2.59 m 3.56 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -4.25 m -6.85 m 3.56 eV 0 eV 7.08 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 8, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 127 mum 0 fm 0 fm 2.08 eV 0 eV 0 fm 0 fm Tank initStep + 0 356 mum 0 fm 0 fm 3.89 eV 0 eV 0 fm 0 fm Tank initStep ** Photon absorbed! ** - 1 2.26 m -1.02 m -84.8 cm 2.08 eV 0 eV 2.62 m 2.62 m Tank OpAbsorption + 1 2.16 m -98.3 cm 88.5 cm 3.89 eV 0 eV 2.53 m 2.53 m Tank OpAbsorption ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 7, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 151 mum 0 fm 0 fm 3.69 eV 0 eV 0 fm 0 fm Tank initStep + 0 19.9 mum 0 fm 0 fm 3.42 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.8529732,-0.33722403,-0.3983926) - Old Polarization: (-0.52195471,-0.55108817,-0.65104924) - New Momentum Direction: (0.70502805,-0.45818601,-0.54129569) - New Polarization: (0.70917942,0.4555039,0.53812708) + Old Momentum Direction: (0.85399031,-0.52001286,-0.016946191) + Old Polarization: (-0.52028891,-0.85353721,-0.02781509) + New Momentum Direction: (0.70813791,-0.70569953,-0.022997352) + New Polarization: (0.70607415,0.70776219,0.02306457) *** FresnelRefraction *** - 1 5 m -1.98 m -2.34 m 3.69 eV 0 eV 5.86 m 5.86 m Tank Transportation - 2 10 m -5.23 m -6.17 m 3.69 eV 0 eV 7.09 m 13 m OutOfWorld Transportation + 1 5 m -3.04 m -9.92 cm 3.42 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m -8.03 m -26.2 cm 3.42 eV 0 eV 7.06 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 6, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 7.17 mum 0 fm 0 fm 4.13 eV 0 eV 0 fm 0 fm Tank initStep - -** Photon absorbed! ** - 1 3.74 m -50.1 cm 2.24 m 4.13 eV 0 eV 4.39 m 4.39 m Tank OpAbsorption + 0 663 mum 0 fm 0 fm 3.51 eV 0 eV 0 fm 0 fm Tank initStep + Photon at Boundary! + Old Momentum Direction: (0.85358018,0.11602502,-0.50787702) + Old Polarization: (-0.52096149,0.19010361,-0.83214166) + New Momentum Direction: (0.7068869,0.157531,-0.68956138) + New Polarization: (0.7073266,-0.15743307,0.68913273) + *** FresnelRefraction *** + 1 5 m 68 cm -2.97 m 3.51 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 1.79 m -7.85 m 3.51 eV 0 eV 7.07 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 5, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 187 mum 0 fm 0 fm 3.19 eV 0 eV 0 fm 0 fm Tank initStep + 0 376 mum 0 fm 0 fm 4.12 eV 0 eV 0 fm 0 fm Tank initStep +Scattering Photon! +Old Momentum Direction: (0.85169757,-0.43324649,-0.29480287) +Old Polarization: (-0.52403364,-0.7041437,-0.47913505) +New Polarization: (0.67908503,0.0034355302,0.73405158) +Polarization Change: (0.67908503,0.0034355302,0.73405158) +New Momentum Direction: (0.059482971,0.99644297,-0.059692406) +Momentum Change: (0.059482971,0.99644297,-0.059692406) + 1 3.02 m -1.54 m -1.05 m 4.12 eV 0 eV 3.55 m 3.55 m Tank OpRayleigh Photon at Boundary! - Old Momentum Direction: (0.85494202,0.16692248,0.4911324) - Old Polarization: (-0.51872357,0.27511578,0.80946721) - New Momentum Direction: (0.71102548,0.22627515,0.66576446) - New Polarization: (0.70316624,-0.22880421,-0.67320567) + Old Momentum Direction: (0.059482971,0.99644297,-0.059692406) + Old Polarization: (0.67908503,0.0034355302,0.73405158) + New Momentum Direction: (0.08094051,0.99340377,-0.081225495) + New Polarization: (0.67915861,0.0046770222,0.73397664) *** FresnelRefraction *** - 1 5 m 97.6 cm 2.87 m 3.19 eV 0 eV 5.85 m 5.85 m Tank Transportation - 2 10 m 2.57 m 7.55 m 3.19 eV 0 eV 7.03 m 12.9 m OutOfWorld Transportation + 2 3.41 m 5 m -1.44 m 4.12 eV 0 eV 6.56 m 10.1 m Tank Transportation + 3 3.82 m 10 m -1.85 m 4.12 eV 0 eV 5.03 m 15.1 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 4, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 172 mum 0 fm 0 fm 2.76 eV 0 eV 0 fm 0 fm Tank initStep + 0 379 mum 0 fm 0 fm 2.37 eV 0 eV 0 fm 0 fm Tank initStep +Scattering Photon! +Old Momentum Direction: (0.85984173,-0.39473035,-0.32382117) +Old Polarization: (-0.51056067,-0.66477041,-0.54535136) +New Polarization: (0.6049506,-0.39923248,-0.68894717) +Polarization Change: (0.6049506,-0.39923248,-0.68894717) +New Momentum Direction: (-0.75441473,-0.56417499,-0.33550709) +Momentum Change: (-0.75441473,-0.56417499,-0.33550709) + 1 4.74 m -2.18 m -1.79 m 2.37 eV 0 eV 5.52 m 5.52 m Tank OpRayleigh Photon at Boundary! - Old Momentum Direction: (0.85707317,-0.51512259,0.0086191797) - Old Polarization: (-0.5151947,-0.85695322,0.014338788) - New Momentum Direction: (0.71741501,-0.69654854,0.011654851) - New Polarization: (0.69664604,0.7173146,-0.012002315) + Old Momentum Direction: (-0.75441473,-0.56417499,-0.33550709) + Old Polarization: (0.6049506,-0.39923248,-0.68894717) + New Momentum Direction: (0.75441473,0.56417499,0.33550709) + New Polarization: (-0.6049506,0.39923248,0.68894717) + *** BackScattering *** + 2 97.1 cm -5 m -3.46 m 2.37 eV 0 eV 5 m 10.5 m Tank Transportation + 3 97.1 cm -5 m -3.46 m 2.37 eV 0 eV 0 fm 10.5 m World Transportation + Photon at Boundary! + Old Momentum Direction: (0.75441473,0.56417499,0.33550709) + Old Polarization: (-0.6049506,0.39923248,0.68894717) + New Momentum Direction: (0.4661166,0.76042082,0.45221178) + New Polarization: (0.82352441,-0.55971404,0.092345705) *** FresnelRefraction *** - 1 5 m -3.01 m 5.03 cm 2.76 eV 0 eV 5.83 m 5.83 m Tank Transportation - 2 10 m -7.86 m 13.2 cm 2.76 eV 0 eV 6.97 m 12.8 m OutOfWorld Transportation + 4 5 m -1.99 m -1.67 m 2.37 eV 0 eV 5.34 m 15.9 m Tank Transportation + 5 10 m 6.17 m 3.18 m 2.37 eV 0 eV 10.7 m 26.6 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 3, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 11.3 mum 0 fm 0 fm 3.95 eV 0 eV 0 fm 0 fm Tank initStep + 0 289 mum 0 fm 0 fm 3.56 eV 0 eV 0 fm 0 fm Tank initStep Photon at Boundary! - Old Momentum Direction: (0.85228219,-0.15036622,-0.50100407) - Old Polarization: (-0.52308228,-0.24499865,-0.81630913) - New Momentum Direction: (0.70290101,-0.2044681,-0.68126571) - New Polarization: (0.71128769,0.20205725,0.67323301) + Old Momentum Direction: (0.85337681,0.18084146,-0.48892165) + Old Polarization: (-0.52129456,0.29604359,-0.80038127) + New Momentum Direction: (0.70626507,0.24559293,-0.66398325) + New Polarization: (0.70794749,-0.24500929,0.66240532) *** FresnelRefraction *** - 1 5 m -88.2 cm -2.94 m 3.95 eV 0 eV 5.87 m 5.87 m Tank Transportation - 2 10 m -2.34 m -7.79 m 3.95 eV 0 eV 7.11 m 13 m OutOfWorld Transportation + 1 5 m 1.06 m -2.86 m 3.56 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 2.8 m -7.57 m 3.56 eV 0 eV 7.08 m 12.9 m OutOfWorld Transportation ********************************************************************************************************* * G4Track Information: Particle = opticalphoton, Track ID = 2, Parent ID = 1 ********************************************************************************************************* Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process - 0 25.3 mum 0 fm 0 fm 3.21 eV 0 eV 0 fm 0 fm Tank initStep - Photon at Boundary! - Old Momentum Direction: (0.85488208,-0.42780514,0.29352921) - Old Polarization: (-0.51882235,-0.70490977,0.48365854) - New Momentum Direction: (0.71084424,-0.57996058,0.39792736) - New Polarization: (0.70334946,0.58614055,-0.40216762) - *** FresnelRefraction *** - 1 5 m -2.5 m 1.72 m 3.21 eV 0 eV 5.85 m 5.85 m Tank Transportation - 2 10 m -6.58 m 4.52 m 3.21 eV 0 eV 7.03 m 12.9 m OutOfWorld Transportation -Number of optical photons produces in this event : 57 -number of event = 1 User=0.08s Real=0.23s Sys=0.14s + 0 766 mum 0 fm 0 fm 3.74 eV 0 eV 0 fm 0 fm Tank initStep + +** Photon absorbed! ** + 1 2.21 m 96.4 cm -95.1 cm 3.74 eV 0 eV 2.59 m 2.59 m Tank OpAbsorption +Number of optical photons produces in this event : 53 +number of event = 1 User=0.1s Real=0.23s Sys=0.13s +# +/process/inactivate Scintillation +/N06/phys/verbose 0 +# +/run/beamOn 1 +### Run 1 start. + +********************************************************************************************************* +* G4Track Information: Particle = e+, Track ID = 1, Parent ID = 0 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 0 fm 0 fm 0 fm 500 keV 0 eV 0 fm 0 fm Tank initStep + 1 607 mum 0 fm 0 fm 0 eV 500 keV 1.74 mm 1.74 mm Tank eIoni + 2 607 mum 0 fm 0 fm 0 eV 0 eV 0 fm 1.74 mm Tank annihil + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 41, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 607 mum 0 fm 0 fm 511 keV 0 eV 0 fm 0 fm Tank initStep + 1 -2.08 m -1.45 m 5 m 511 keV 0 eV 5.61 m 5.61 m Tank Transportation + 2 -4.17 m -2.91 m 10 m 511 keV 0 eV 5.61 m 11.2 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = gamma, Track ID = 40, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 607 mum 0 fm 0 fm 511 keV 0 eV 0 fm 0 fm Tank initStep + 1 2.09 m 1.45 m -5 m 511 keV 0 eV 5.61 m 5.61 m Tank Transportation + 2 4.17 m 2.91 m -10 m 511 keV 0 eV 5.61 m 11.2 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 39, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 350 mum 0 fm 0 fm 4.08 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 92.4 cm 2.93 m 4.08 eV 0 eV 5.87 m 5.87 m Tank Transportation + 2 10 m 2.45 m 7.77 m 4.08 eV 0 eV 7.13 m 13 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 38, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 201 mum 0 fm 0 fm 2.45 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.91 m -63.8 cm 2.45 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m -7.56 m -1.66 m 2.45 eV 0 eV 6.91 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 37, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 70.3 mum 0 fm 0 fm 3.47 eV 0 eV 0 fm 0 fm Tank initStep + 1 3.21 m 58.8 cm -1.86 m 3.47 eV 0 eV 3.75 m 3.75 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 36, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 164 mum 0 fm 0 fm 2.38 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.07 m 2.13 m 2.38 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m 5.38 m 5.53 m 2.38 eV 0 eV 6.89 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 35, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 562 mum 0 fm 0 fm 3.59 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -14.7 cm -3.05 m 3.59 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -38.9 cm -8.06 m 3.59 eV 0 eV 7.08 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 34, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 423 mum 0 fm 0 fm 3.99 eV 0 eV 0 fm 0 fm Tank initStep + 1 1.28 m -44.6 cm -64.4 cm 3.99 eV 0 eV 1.5 m 1.5 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 33, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 518 mum 0 fm 0 fm 3.81 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -3.05 m -25.5 cm 3.81 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -8.08 m -67.5 cm 3.81 eV 0 eV 7.1 m 13 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 32, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 559 mum 0 fm 0 fm 2.86 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 16.6 cm -3.01 m 2.86 eV 0 eV 5.84 m 5.84 m Tank Transportation + 2 10 m 43.5 cm -7.89 m 2.86 eV 0 eV 6.99 m 12.8 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 31, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 507 mum 0 fm 0 fm 3.27 eV 0 eV 0 fm 0 fm Tank initStep + 1 3.92 m 16.1 cm 2.37 m 3.27 eV 0 eV 4.58 m 4.58 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 30, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 602 mum 0 fm 0 fm 3.88 eV 0 eV 0 fm 0 fm Tank initStep + 1 6.59 cm 4 cm 816 mum 3.88 eV 0 eV 7.66 cm 7.66 cm Tank OpRayleigh + 2 77.6 cm 1.04 m -5 m 3.88 eV 0 eV 5.15 m 5.23 m Tank Transportation + 3 1.77 m 2.44 m -10 m 3.88 eV 0 eV 5.29 m 10.5 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 29, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 109 mum 0 fm 0 fm 3.09 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.16 m -2.12 m 3.09 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m -5.67 m -5.58 m 3.09 eV 0 eV 7.02 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 28, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 512 mum 0 fm 0 fm 2.42 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -45.2 cm -2.94 m 2.42 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m -1.17 m -7.64 m 2.42 eV 0 eV 6.9 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 27, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 85.6 mum 0 fm 0 fm 2.4 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -41.9 cm 2.94 m 2.4 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m -1.09 m 7.64 m 2.4 eV 0 eV 6.9 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 26, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 546 mum 0 fm 0 fm 3.32 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.3 m -1.98 m 3.32 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m 6.07 m -5.23 m 3.32 eV 0 eV 7.05 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 25, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 316 mum 0 fm 0 fm 2.78 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.8 m 1.09 m 2.78 eV 0 eV 5.83 m 5.83 m Tank Transportation + 2 10 m -7.33 m 2.85 m 2.78 eV 0 eV 6.97 m 12.8 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 24, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 235 mum 0 fm 0 fm 2.22 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.86 m -73 cm 2.22 eV 0 eV 5.81 m 5.81 m Tank Transportation + 2 10 m -7.41 m -1.89 m 2.22 eV 0 eV 6.86 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 23, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 48.4 mum 0 fm 0 fm 3.63 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 76.4 cm 2.96 m 3.63 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 2.02 m 7.82 m 3.63 eV 0 eV 7.09 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 22, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 500 mum 0 fm 0 fm 3.13 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 96.4 cm -2.87 m 3.13 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m 2.53 m -7.55 m 3.13 eV 0 eV 7.02 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 21, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 4.2 mum 0 fm 0 fm 2.44 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.93 m -52.4 cm 2.44 eV 0 eV 5.82 m 5.82 m Tank Transportation + 2 10 m 7.62 m -1.36 m 2.44 eV 0 eV 6.91 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 20, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 59.3 mum 0 fm 0 fm 2.14 eV 0 eV 0 fm 0 fm Tank initStep + 1 2.15 m -1.04 m 72.3 cm 2.14 eV 0 eV 2.49 m 2.49 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 19, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 220 mum 0 fm 0 fm 2.1 eV 0 eV 0 fm 0 fm Tank initStep + 1 87.1 cm 12.3 cm 49.7 cm 2.1 eV 0 eV 1.01 m 1.01 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 18, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 399 mum 0 fm 0 fm 2.84 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.5 m -1.68 m 2.84 eV 0 eV 5.84 m 5.84 m Tank Transportation + 2 10 m 6.55 m -4.4 m 2.84 eV 0 eV 6.99 m 12.8 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 17, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 311 mum 0 fm 0 fm 3.24 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.76 m -1.27 m 3.24 eV 0 eV 5.85 m 5.85 m Tank Transportation + 2 10 m 7.25 m -3.35 m 3.24 eV 0 eV 7.04 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 16, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 213 mum 0 fm 0 fm 3.44 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.45 m -1.81 m 3.44 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -6.46 m -4.78 m 3.44 eV 0 eV 7.06 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 15, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 269 mum 0 fm 0 fm 2.97 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -2.98 m 47.7 cm 2.97 eV 0 eV 5.84 m 5.84 m Tank Transportation + 2 10 m -7.83 m 1.25 m 2.97 eV 0 eV 7 m 12.8 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 14, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 460 mum 0 fm 0 fm 2.75 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -3 m 11.9 cm 2.75 eV 0 eV 5.83 m 5.83 m Tank Transportation + 2 10 m -7.85 m 31.2 cm 2.75 eV 0 eV 6.97 m 12.8 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 13, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 21.1 mum 0 fm 0 fm 4.02 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 3.04 m 42.1 cm 4.02 eV 0 eV 5.87 m 5.87 m Tank Transportation + 2 10 m 8.06 m 1.12 m 4.02 eV 0 eV 7.12 m 13 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 12, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 517 mum 0 fm 0 fm 2.26 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.96 m -1.07 cm 2.26 eV 0 eV 5.81 m 5.81 m Tank Transportation + 2 10 m 7.67 m -2.77 cm 2.26 eV 0 eV 6.87 m 12.7 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 11, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 358 mum 0 fm 0 fm 3.5 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 80 cm -2.94 m 3.5 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 2.11 m -7.77 m 3.5 eV 0 eV 7.07 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 10, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 51.8 mum 0 fm 0 fm 2.28 eV 0 eV 0 fm 0 fm Tank initStep + 1 4.97 m 1.42 m 2.58 m 2.28 eV 0 eV 5.77 m 5.77 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 9, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 237 mum 0 fm 0 fm 3.78 eV 0 eV 0 fm 0 fm Tank initStep + 1 1.98 m 1.12 m -47 cm 3.78 eV 0 eV 2.33 m 2.33 m Tank OpRayleigh + 2 1.7 m 5 m -2.17 m 3.78 eV 0 eV 4.24 m 6.57 m Tank Transportation + 3 1.15 m 10 m -5.43 m 3.78 eV 0 eV 5.99 m 12.6 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 8, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 589 mum 0 fm 0 fm 2.05 eV 0 eV 0 fm 0 fm Tank initStep + 1 4.4 m 1.51 m -2.1 m 2.05 eV 0 eV 5.1 m 5.1 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 7, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 139 mum 0 fm 0 fm 3.48 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m -15.6 cm 3.05 m 3.48 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m -41.1 cm 8.04 m 3.48 eV 0 eV 7.07 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 6, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 602 mum 0 fm 0 fm 3.62 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 1.49 m -2.67 m 3.62 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 3.93 m -7.06 m 3.62 eV 0 eV 7.09 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 5, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 176 mum 0 fm 0 fm 4.08 eV 0 eV 0 fm 0 fm Tank initStep + 1 3.76 m 2.31 m 19.8 cm 4.08 eV 0 eV 4.42 m 4.42 m Tank OpAbsorption + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 4, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 503 mum 0 fm 0 fm 3.75 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.8 m -1.23 m 3.75 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 7.41 m -3.26 m 3.75 eV 0 eV 7.1 m 13 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 3, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 364 mum 0 fm 0 fm 3.53 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 2.02 m -2.29 m 3.53 eV 0 eV 5.86 m 5.86 m Tank Transportation + 2 10 m 5.33 m -6.05 m 3.53 eV 0 eV 7.08 m 12.9 m OutOfWorld Transportation + +********************************************************************************************************* +* G4Track Information: Particle = opticalphoton, Track ID = 2, Parent ID = 1 +********************************************************************************************************* + +Step# X Y Z KineE dEStep StepLeng TrakLeng Volume Process + 0 433 mum 0 fm 0 fm 2.27 eV 0 eV 0 fm 0 fm Tank initStep + 1 5 m 1.84 m 2.32 m 2.27 eV 0 eV 5.81 m 5.81 m Tank Transportation + 2 10 m 4.77 m 6.01 m 2.27 eV 0 eV 6.87 m 12.7 m OutOfWorld Transportation +Number of optical photons produces in this event : 38 +number of event = 1 User=0.04s Real=0.11s Sys=0.07s Graphics systems deleted. Visualization Manager deleting... diff --git a/examples/novice/N06/src/ExN06PrimaryGeneratoraction.cc b/examples/novice/N06/src/ExN06PrimaryGeneratoraction.cc index e6f0c29603..1da12e6012 100644 --- a/examples/novice/N06/src/ExN06PrimaryGeneratoraction.cc +++ b/examples/novice/N06/src/ExN06PrimaryGeneratoraction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN06PrimaryGeneratorAction.cc,v 1.2 2003/01/23 15:34:32 maire Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ExN06PrimaryGeneratorAction.cc,v 1.3 2004/04/02 11:54:29 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -48,7 +48,7 @@ ExN06PrimaryGeneratorAction::ExN06PrimaryGeneratorAction() //default kinematic // G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); - G4ParticleDefinition* particle = particleTable->FindParticle("e-"); + G4ParticleDefinition* particle = particleTable->FindParticle("e+"); particleGun->SetParticleDefinition(particle); particleGun->SetParticleTime(0.0*ns); diff --git a/examples/novice/N06/src/ExN06RunAction.cc b/examples/novice/N06/src/ExN06RunAction.cc index f0c6a2120f..b6a94dda76 100644 --- a/examples/novice/N06/src/ExN06RunAction.cc +++ b/examples/novice/N06/src/ExN06RunAction.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: ExN06RunAction.cc,v 1.8 2003/01/23 15:34:32 maire Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: ExN06RunAction.cc,v 1.9 2004/04/02 12:14:12 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -32,10 +32,7 @@ #include "ExN06RunAction.hh" -#include "G4ios.hh" #include "G4Run.hh" -#include "G4UImanager.hh" -#include "G4VVisManager.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -57,22 +54,12 @@ void ExN06RunAction::BeginOfRunAction(const G4Run* aRun) { G4cout << "### Run " << aRun->GetRunID() << " start." << G4endl; timer->Start(); - - if (G4VVisManager::GetConcreteInstance()) - { - G4UImanager::GetUIpointer()->ApplyCommand("/vis/scene/notifyHandlers"); - } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void ExN06RunAction::EndOfRunAction(const G4Run* aRun) -{ - if (G4VVisManager::GetConcreteInstance()) - { - G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update"); - } - +{ timer->Stop(); G4cout << "number of event = " << aRun->GetNumberOfEvent() << " " << *timer << G4endl; diff --git a/examples/novice/N07/exampleN07.out b/examples/novice/N07/exampleN07.out index dba3a486a9..07ab8276a8 100644 --- a/examples/novice/N07/exampleN07.out +++ b/examples/novice/N07/exampleN07.out @@ -1,8 +1,8 @@ ************************************************************* - Geant4 version $Name: geant4-06-01 $ (25-March-2004) + Geant4 version $Name: geant4-06-02 $ (25-June-2004) Copyright : Geant4 Collaboration - Reference : NIM A 506 (2003), 250-303. + Reference : NIM A 506 (2003), 250-303 WWW : http://cern.ch/geant4 ************************************************************* @@ -119,8 +119,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -129,7 +129,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -151,7 +151,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -216,7 +216,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 10 - User=9.71s Real=10.97s Sys=1.26s + User=12.22s Real=13.81s Sys=1.57s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -224,55 +224,55 @@ Region : Calor-A Production thresholds : gamma 1 mm e- 1 mm e+ 1 mm Energy deposition in an event : - Absorber 3.5698078 GeV Gap 399.11869 MeV + Absorber 4.0514349 GeV Gap 454.87297 MeV Number of secondaries in an event : - gamma in Absorber 1356.8 in Gap 79.5 - e- in Absorber 2221.6 in Gap 212.3 - e+ in Absorber 128.8 in Gap 4.8 + gamma in Absorber 1665.2 in Gap 103.3 + e- in Absorber 2707.6 in Gap 258 + e+ in Absorber 163.6 in Gap 5.8 Minimum kinetic energy of generated secondaries : - gamma in Absorber 100.52917 keV in Gap 6.1833932 keV - e- in Absorber 7.6997225 eV in Gap 3.3126821 eV - e+ in Absorber 4.6863273 keV in Gap 85.901005 keV + gamma in Absorber 100.52617 keV in Gap 6.3022604 keV + e- in Absorber 3.8775507 eV in Gap 125.72603 eV + e+ in Absorber 24.090179 keV in Gap 196.56451 keV Total track length of e+/e- in an event : - Absorber 1.536778 m Gap 70.748844 cm + Absorber 1.8696939 m Gap 92.563629 cm Total number of steps of e+/e- in an event : - Absorber 3762.6 Gap 348.6 + Absorber 4602.9 Gap 446.9 ############################################################ Region : Calor-B Production thresholds : gamma 1 cm e- 1 cm e+ 1 cm Energy deposition in an event : - Absorber 3.0830239 GeV Gap 367.49381 MeV + Absorber 3.3139735 GeV Gap 384.1284 MeV Number of secondaries in an event : - gamma in Absorber 682.1 in Gap 54.2 - e- in Absorber 1246.5 in Gap 123.3 - e+ in Absorber 93 in Gap 3.2 + gamma in Absorber 795.8 in Gap 52.4 + e- in Absorber 1465.3 in Gap 139.1 + e+ in Absorber 112.8 in Gap 3.2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 275.87046 keV in Gap 19.193117 keV - e- in Absorber 131.06424 eV in Gap 606.061 eV - e+ in Absorber 17.243665 keV in Gap 221.98504 keV + gamma in Absorber 282.65425 keV in Gap 19.220151 keV + e- in Absorber 3.6037396 eV in Gap 138.53441 eV + e+ in Absorber 3.3475272 keV in Gap 229.63059 keV Total track length of e+/e- in an event : - Absorber 1.0394047 m Gap 53.180664 cm + Absorber 1.1966492 m Gap 60.639809 cm Total number of steps of e+/e- in an event : - Absorber 2040.7 Gap 210.4 + Absorber 2386.4 Gap 231.6 ############################################################ Region : Calor-C Production thresholds : gamma 10 cm e- 10 cm e+ 10 cm Energy deposition in an event : - Absorber 2.68175 GeV Gap 295.38661 MeV + Absorber 3.3134129 GeV Gap 336.74772 MeV Number of secondaries in an event : - gamma in Absorber 145.7 in Gap 12.9 - e- in Absorber 272 in Gap 21.8 - e+ in Absorber 40.4 in Gap 1 + gamma in Absorber 287.4 in Gap 22.1 + e- in Absorber 513.8 in Gap 44.3 + e+ in Absorber 80.7 in Gap 2.1 Minimum kinetic energy of generated secondaries : - gamma in Absorber 294.51634 keV in Gap 60.683825 keV - e- in Absorber 227.86926 eV in Gap 1.0693232 keV - e+ in Absorber 49.693397 keV in Gap 271.89523 keV + gamma in Absorber 303.46728 keV in Gap 57.737363 keV + e- in Absorber 100.16145 eV in Gap 120.20529 eV + e+ in Absorber 36.398897 keV in Gap 1.485119 MeV Total track length of e+/e- in an event : - Absorber 36.805667 cm Gap 18.527049 cm + Absorber 73.418911 cm Gap 32.296349 cm Total number of steps of e+/e- in an event : - Absorber 448.4 Gap 44.8 + Absorber 856.2 Gap 87.3 ############################################################ /run/dumpCouples @@ -397,8 +397,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -407,7 +407,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -429,7 +429,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -494,7 +494,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 10 - User=18.82s Real=21.25s Sys=2.43s + User=13.15s Real=14.77s Sys=1.62s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -502,55 +502,55 @@ Region : Calor-A Production thresholds : gamma 200 mum e- 200 mum e+ 200 mum Energy deposition in an event : - Absorber 5.3906582 GeV Gap 597.82239 MeV + Absorber 2.7911611 GeV Gap 353.13569 MeV Number of secondaries in an event : - gamma in Absorber 3102.6 in Gap 198.4 - e- in Absorber 5011.6 in Gap 543.7 - e+ in Absorber 239.7 in Gap 7.3 + gamma in Absorber 1121.6 in Gap 71 + e- in Absorber 1912.6 in Gap 240.6 + e+ in Absorber 79.1 in Gap 2.2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 47.186667 keV in Gap 2.7967027 keV - e- in Absorber 9.1846611 eV in Gap 6.7405087 eV - e+ in Absorber 4.1679186 keV in Gap 263.28511 keV + gamma in Absorber 47.190639 keV in Gap 2.8045814 keV + e- in Absorber 16.44242 eV in Gap 29.153153 eV + e+ in Absorber 2.4910148 keV in Gap 611.6431 keV Total track length of e+/e- in an event : - Absorber 2.9490364 m Gap 1.5463281 m + Absorber 1.0873323 m Gap 58.051913 cm Total number of steps of e+/e- in an event : - Absorber 8709.5 Gap 939.1 + Absorber 3260.8 Gap 389.7 ############################################################ Region : Calor-B Production thresholds : gamma 2 mm e- 2 mm e+ 2 mm Energy deposition in an event : - Absorber 2.3883408 GeV Gap 301.41317 MeV + Absorber 3.1845776 GeV Gap 372.8885 MeV Number of secondaries in an event : - gamma in Absorber 553 in Gap 40 - e- in Absorber 944.9 in Gap 90.5 - e+ in Absorber 52.1 in Gap 1.9 + gamma in Absorber 1026.7 in Gap 65.2 + e- in Absorber 1692.5 in Gap 167.4 + e+ in Absorber 106.4 in Gap 3 Minimum kinetic energy of generated secondaries : - gamma in Absorber 120.61778 keV in Gap 9.2529622 keV - e- in Absorber 141.52806 eV in Gap 54.412125 eV - e+ in Absorber 23.123346 keV in Gap 293.67961 keV + gamma in Absorber 120.59437 keV in Gap 8.7032788 keV + e- in Absorber 9.4193489 eV in Gap 35.502872 eV + e+ in Absorber 49.061095 keV in Gap 186.24094 keV Total track length of e+/e- in an event : - Absorber 67.535771 cm Gap 33.824092 cm + Absorber 1.2199314 m Gap 61.846931 cm Total number of steps of e+/e- in an event : - Absorber 1573.3 Gap 154.3 + Absorber 2860.3 Gap 284.4 ############################################################ Region : Calor-C Production thresholds : gamma 2 cm e- 2 cm e+ 2 cm Energy deposition in an event : - Absorber 3.2883756 GeV Gap 380.86518 MeV + Absorber 3.3318885 GeV Gap 367.66243 MeV Number of secondaries in an event : - gamma in Absorber 666.6 in Gap 42.4 - e- in Absorber 1255.3 in Gap 109.1 - e+ in Absorber 103.7 in Gap 3.3 + gamma in Absorber 671.6 in Gap 46.7 + e- in Absorber 1281.2 in Gap 114.4 + e+ in Absorber 107.4 in Gap 2.6 Minimum kinetic energy of generated secondaries : - gamma in Absorber 279.37463 keV in Gap 27.732988 keV - e- in Absorber 54.318231 eV in Gap 361.55198 eV - e+ in Absorber 11.745428 keV in Gap 203.05609 keV + gamma in Absorber 269.35888 keV in Gap 27.171611 keV + e- in Absorber 115.53078 eV in Gap 240.5145 eV + e+ in Absorber 7.2108567 keV in Gap 134.98331 keV Total track length of e+/e- in an event : - Absorber 1.107667 m Gap 53.146751 cm + Absorber 1.1550558 m Gap 52.360971 cm Total number of steps of e+/e- in an event : - Absorber 2021.8 Gap 184.2 + Absorber 2062.9 Gap 198.4 ############################################################ /run/dumpCouples @@ -674,8 +674,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -684,7 +684,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -706,7 +706,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -801,7 +801,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 10 - User=2.09s Real=2.29s Sys=0.2s + User=1.94s Real=2.08s Sys=0.14s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -809,55 +809,55 @@ Region : Calor-A Production thresholds : gamma 200 mum e- 200 mum e+ 200 mum Energy deposition in an event : - Absorber 530.89224 MeV Gap 245.61737 MeV + Absorber 547.35259 MeV Gap 250.61784 MeV Number of secondaries in an event : - gamma in Absorber 40.7 in Gap 14.4 - e- in Absorber 245.9 in Gap 135.9 - e+ in Absorber 1.3 in Gap 0.2 + gamma in Absorber 36.2 in Gap 13.8 + e- in Absorber 277.9 in Gap 143.3 + e+ in Absorber 1.7 in Gap 0.2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 3.241818 keV in Gap 1.4901227 keV - e- in Absorber 2.5513339 eV in Gap 47.476054 eV - e+ in Absorber 720.17793 keV in Gap 21.362409 MeV + gamma in Absorber 3.2364352 keV in Gap 1.4930913 keV + e- in Absorber 12.765121 eV in Gap 19.735358 eV + e+ in Absorber 314.99166 keV in Gap 6.4368825 MeV Total track length of e+/e- in an event : - Absorber 34.317977 cm Gap 30.776585 cm + Absorber 37.719231 cm Gap 32.939047 cm Total number of steps of e+/e- in an event : - Absorber 330.2 Gap 181.9 + Absorber 369.2 Gap 198.1 ############################################################ Region : Calor-B Production thresholds : gamma 2 mm e- 2 mm e+ 2 mm Energy deposition in an event : - Absorber 592.804 MeV Gap 268.57333 MeV + Absorber 528.66644 MeV Gap 229.81281 MeV Number of secondaries in an event : - gamma in Absorber 41.9 in Gap 14.9 - e- in Absorber 219.3 in Gap 101.1 - e+ in Absorber 1.4 in Gap 0.4 + gamma in Absorber 24.7 in Gap 8.6 + e- in Absorber 134.7 in Gap 57 + e+ in Absorber 0.8 in Gap 0 Minimum kinetic energy of generated secondaries : - gamma in Absorber 9.5727922 keV in Gap 4.0718826 keV - e- in Absorber 8.2763167 eV in Gap 9.38021 eV - e+ in Absorber 319.74689 keV in Gap 796.74612 keV + gamma in Absorber 9.7464274 keV in Gap 3.930575 keV + e- in Absorber 6.8768875 eV in Gap 212.51763 eV + e+ in Absorber 259.66099 keV in Gap 2.8802232e+295 J Total track length of e+/e- in an event : - Absorber 41.82471 cm Gap 37.273703 cm + Absorber 27.03255 cm Gap 20.877273 cm Total number of steps of e+/e- in an event : - Absorber 292.3 Gap 139.8 + Absorber 177.8 Gap 81 ############################################################ Region : Calor-C Production thresholds : gamma 2 cm e- 2 cm e+ 2 cm Energy deposition in an event : - Absorber 531.91777 MeV Gap 243.43474 MeV + Absorber 536.61802 MeV Gap 237.58731 MeV Number of secondaries in an event : - gamma in Absorber 18 in Gap 8.1 - e- in Absorber 127.6 in Gap 50.6 + gamma in Absorber 16.1 in Gap 8.4 + e- in Absorber 104.5 in Gap 46.4 e+ in Absorber 0.9 in Gap 0.2 Minimum kinetic energy of generated secondaries : - gamma in Absorber 28.527699 keV in Gap 11.125069 keV - e- in Absorber 1.0657592 eV in Gap 13.801217 eV - e+ in Absorber 588.49192 keV in Gap 15.727466 MeV + gamma in Absorber 28.524556 keV in Gap 14.154467 keV + e- in Absorber 5.1675192 eV in Gap 6.7878977 eV + e+ in Absorber 380.88375 keV in Gap 7.1779823 MeV Total track length of e+/e- in an event : - Absorber 17.328551 cm Gap 20.703812 cm + Absorber 17.313979 cm Gap 18.787794 cm Total number of steps of e+/e- in an event : - Absorber 159.9 Gap 66.7 + Absorber 133.6 Gap 64.6 ############################################################ /run/dumpCouples @@ -1012,8 +1012,8 @@ annihil: Total cross section from Heilter formula(annihilation into 2 photons). hIoni: tables are built for proton dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 - Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 + Bether-Bloch model for Escaled > 2 MeV, parametrisation of Bragg peak below, Integral mode 1 msc: Model variant of multiple scattering for proton Lambda tables from 100 eV to 100 TeV in 120 bins. @@ -1022,7 +1022,7 @@ msc: Model variant of multiple scattering for proton MuIoni: tables are built for mu+ dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -1044,7 +1044,7 @@ MuPairProd: tables are built for mu+ MuIoni: tables are built for mu- dE/dx and range tables from 100 eV to 100 TeV in 120 bins. Lambda tables from threshold to 100 TeV in 120 bins. - Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 0 + Step function: finalRange(mm)= 1, dRoverRange= 0.2, integral: 1 Bether-Bloch model for E > 0.2 MeV, parametrisation of Bragg peak below, radiative corrections for E > 1 GeV @@ -1139,7 +1139,7 @@ Start Run processing. Run terminated. Run Summary Number of events processed : 10 - User=8.35s Real=9.61s Sys=1.26s + User=8.51s Real=9.95s Sys=1.44s ############################################################ Run Summary - Number of events : 10 ############################################################ @@ -1147,55 +1147,55 @@ Region : Calor-A Production thresholds : gamma 10 mum e- 10 mum e+ 10 mum Energy deposition in an event : - Absorber 620.67224 MeV Gap 271.13621 MeV + Absorber 572.40374 MeV Gap 265.27788 MeV Number of secondaries in an event : - gamma in Absorber 80.4 in Gap 25.3 - e- in Absorber 1189.3 in Gap 2025.5 - e+ in Absorber 2.4 in Gap 1 + gamma in Absorber 65.1 in Gap 21.8 + e- in Absorber 1044.7 in Gap 2017.3 + e+ in Absorber 1.4 in Gap 0.4 Minimum kinetic energy of generated secondaries : - gamma in Absorber 1.0004691 keV in Gap 1.0047908 keV - e- in Absorber 2.5510019 eV in Gap 1.8161365 eV - e+ in Absorber 349.81463 keV in Gap 561.3888 keV + gamma in Absorber 1.0025028 keV in Gap 1.0031887 keV + e- in Absorber 17.142253 eV in Gap 7.9280003 eV + e+ in Absorber 665.80551 keV in Gap 1.1627031 MeV Total track length of e+/e- in an event : - Absorber 59.53211 cm Gap 48.835686 cm + Absorber 47.798725 cm Gap 45.809723 cm Total number of steps of e+/e- in an event : - Absorber 1634.1 Gap 2705.2 + Absorber 1447.9 Gap 3025.7 ############################################################ Region : Calor-B Production thresholds : gamma 100 mum e- 100 mum e+ 100 mum Energy deposition in an event : - Absorber 568.66098 MeV Gap 263.57502 MeV + Absorber 717.27801 MeV Gap 309.71493 MeV Number of secondaries in an event : - gamma in Absorber 44.9 in Gap 13 - e- in Absorber 378.8 in Gap 205.2 - e+ in Absorber 1.4 in Gap 0.1 + gamma in Absorber 94.6 in Gap 29.6 + e- in Absorber 604 in Gap 298.4 + e+ in Absorber 4.1 in Gap 0.9 Minimum kinetic energy of generated secondaries : - gamma in Absorber 1.2890955 keV in Gap 1.1375624 keV - e- in Absorber 8.21886 eV in Gap 28.110346 eV - e+ in Absorber 243.92767 keV in Gap 2.6608565 MeV + gamma in Absorber 2.3165527 keV in Gap 1.1265939 keV + e- in Absorber 2.55373 eV in Gap 23.392195 eV + e+ in Absorber 176.37501 keV in Gap 2.0225778 MeV Total track length of e+/e- in an event : - Absorber 61.227905 cm Gap 49.540263 cm + Absorber 81.517666 cm Gap 65.539464 cm Total number of steps of e+/e- in an event : - Absorber 523.5 Gap 294.4 + Absorber 859.1 Gap 432.3 ############################################################ Region : Calor-C Production thresholds : gamma 1 mm e- 1 mm e+ 1 mm Energy deposition in an event : - Absorber 681.18829 MeV Gap 324.85771 MeV + Absorber 514.81651 MeV Gap 239.63939 MeV Number of secondaries in an event : - gamma in Absorber 67.9 in Gap 23.5 - e- in Absorber 376.2 in Gap 168 - e+ in Absorber 4 in Gap 0.6 + gamma in Absorber 21.3 in Gap 6.7 + e- in Absorber 131.4 in Gap 65.5 + e+ in Absorber 0.4 in Gap 0.6 Minimum kinetic energy of generated secondaries : - gamma in Absorber 2.9458519 keV in Gap 3.0285963 keV - e- in Absorber 10.230535 eV in Gap 4.2810446 eV - e+ in Absorber 806.66206 keV in Gap 631.6393 keV + gamma in Absorber 3.0168786 keV in Gap 3.928508 keV + e- in Absorber 3.3421996 eV in Gap 17.267778 eV + e+ in Absorber 5.3886037 MeV in Gap 452.23867 keV Total track length of e+/e- in an event : - Absorber 89.269193 cm Gap 79.209387 cm + Absorber 39.723386 cm Gap 32.59092 cm Total number of steps of e+/e- in an event : - Absorber 512.4 Gap 256 + Absorber 190 Gap 102.3 ############################################################ /run/dumpCouples diff --git a/source/GNUmakefile b/source/GNUmakefile index e4e58bf25c..11c12ccaab 100644 --- a/source/GNUmakefile +++ b/source/GNUmakefile @@ -1,10 +1,11 @@ -# $Id: GNUmakefile,v 1.41 2003/12/05 07:44:10 gcosmo Exp $ +# $Id: GNUmakefile,v 1.61 2004/06/11 14:08:57 gcosmo Exp $ # ----------------------------------------------------------------- # "gmake" makes default libraries for each subdomain. # "gmake global" makes global libraries for each subdomain. # Composite libraries are built. # "gmake includes" places header files .h/.hh in $G4INCLUDE # "gmake libmap" forces rebuilding of map-file for granular libraries. +# "gmake dll" forces building of DLLs global libraries and generates DLLs on WIN32 # "gmake clean_libs" removes just archive (.a) and shared (.so) libraries # of current platform installation. # "gmake clean" removes installation of current platform. @@ -12,10 +13,10 @@ # # (The .o files(s) are made by implicit rules.) -SUBDIR1 = global particles processes geometry digits_hits -SUBDIR2 = event tracking track materials run graphics_reps intercoms -SUBDIR2 += parameterisations persistency readout -SUBDIR3 = interfaces visualization +SUBDIR1 = global intercoms graphics_reps materials +SUBDIR2 = geometry particles track digits_hits processes +SUBDIR2 += parameterisations tracking event run readout +SUBDIR3 = persistency interfaces visualization SUBDIR4 = g3tog4 ifndef G4INSTALL @@ -28,25 +29,28 @@ G4LIBDIR := $(G4LIB)/$(G4SYSTEM) G4TMPDIR := $(G4TMP)/$(G4SYSTEM) unique := $(shell echo $$$$) -.PHONY: all glob global libmap includes clean_libs clean clean_lists clean_all +.PHONY: all glob global kernel_global kernel libmap dll win32def includes clean_libs clean clean_lists clean_all -all: - @for dir in $(SUBDIR1); do (cd $$dir && $(MAKE)); done;: - @for dir in $(SUBDIR2); do (cd $$dir && $(MAKE)); done;: - @for dir in $(SUBDIR3); do (cd $$dir && $(MAKE)); done;: +all: kernel ifdef G4USE_G3TOG4 @for dir in $(SUBDIR4); do (cd $$dir && $(MAKE)); done;: endif $(MAKE) libmap -glob global: - @for dir in $(SUBDIR1); do (cd $$dir && $(MAKE) global); done;: - @for dir in $(SUBDIR2); do (cd $$dir && $(MAKE)); done;: - @for dir in $(SUBDIR3); do (cd $$dir && $(MAKE)); done;: +glob global: kernel_global ifdef G4USE_G3TOG4 @for dir in $(SUBDIR4); do (cd $$dir && $(MAKE)); done;: endif +kernel_global: + @for dir in $(SUBDIR1); do (cd $$dir && $(MAKE) global); done;: + @for dir in $(SUBDIR2); do (cd $$dir && $(MAKE) global); done;: + @for dir in $(SUBDIR3); do (cd $$dir && $(MAKE) global); done;: + +kernel: + @for dir in $(SUBDIR1); do (cd $$dir && $(MAKE)); done;: + @for dir in $(SUBDIR2); do (cd $$dir && $(MAKE)); done;: + @for dir in $(SUBDIR3); do (cd $$dir && $(MAKE)); done;: libmap: $(G4LIBDIR)/liblist @echo "WARNING: Making a library map of granular libraries." @@ -55,12 +59,12 @@ libmap: $(G4LIBDIR)/liblist @echo " To do this it needs a complete set of dependency" @echo " files, e.g., after gmake in the source/ directory." @echo "Searching $(G4INSTALL)/source" - @echo ' for GNUmakefiles containing "name" and sorting...' + @echo ' for GNUmakefiles containing "name" and sorting ...' @find $(G4INSTALL)/source \ -name GNUmakefile -exec $(GREP) -l '^ *name *:=' {} \; \ | sort \ > /tmp/G4_all_lib_makefiles.$(unique); - @echo "Weeding out /test[s]/, global level GNUmakefiles, etc..." + @echo "Weeding out /test[s]/, global level GNUmakefiles, etc ..." @for i in `cat /tmp/G4_all_lib_makefiles.$(unique)`; \ do \ echo $$i | $(GREP) -q '/tests\?/' || \ @@ -68,7 +72,7 @@ libmap: $(G4LIBDIR)/liblist $(GREP) -q G4hepgeometry $$i || \ echo $$i >> /tmp/G4_granlib_makefiles.$(unique); \ done - @echo "Making libname.map starter file..." + @echo "Making libname.map starter file ..." @touch /tmp/G4libname.map.starter.$(unique); @for i in `cat /tmp/G4_granlib_makefiles.$(unique)`; \ do \ @@ -76,7 +80,7 @@ libmap: $(G4LIBDIR)/liblist >> /tmp/G4libname.map.starter.$(unique); \ echo $$i >> /tmp/G4libname.map.starter.$(unique); \ done - @echo "Making libname.map..." + @echo "Making libname.map ..." @rm -f $(G4LIBDIR)/libname.map; @G4TMP=$(G4TMP); export G4TMP; \ $(G4LIBDIR)/liblist -l -d $(G4TMPDIR) \ @@ -87,9 +91,37 @@ libmap: $(G4LIBDIR)/liblist @rm -f /tmp/G4libname.map.starter.$(unique); $(G4LIBDIR)/liblist: $(G4INSTALL)/config/liblist.c - @echo "Compiling liblist.c..." + @echo "Building library management utility liblist ..." @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ;fi - $(CC) $(CCFLAGS) -o $(G4LIBDIR)/liblist $(G4INSTALL)/config/liblist.c + @$(CC) $(CCFLAGS) -o $(G4LIBDIR)/liblist $(G4INSTALL)/config/liblist.c + +dll: win32def +ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) + @echo "Verifying existence of global libraries for DLLs ..." + @$(MAKE) kernel_global G4LIB_BUILD_DLL=1 + @echo "Building Windows DLL libraries ..." + @$(MAKE) kernel_global G4LIB_BUILD_DLL=1 G4LIB_BUILD_SHARED=1 + @echo "Clearing temporary DLL objects and temporaries ..." + @rm -rf $(G4LIBDIR)/*.def $(G4LIBDIR)/*.exp + @rm -rf $(G4TMPDIR)/* +ifdef G4USE_G3TOG4 + @for dir in $(SUBDIR4); do (cd $$dir && $(MAKE)); done;: + @mv $(G4LIBDIR)/libG3toG4.a $(G4LIBDIR)/libG3toG4.lib +endif + @echo "Done !" +else + @echo "Sorry !" +endif + +win32def: $(G4INSTALL)/config/win32def.c +ifneq (,$(findstring WIN32-VC,$(G4SYSTEM))) + @echo "Building DLL management utility win32def ..." + @if [ ! -d $(G4LIBDIR) ] ; then mkdir $(G4LIBDIR) ;fi + @$(CC) $(CCFLAGS) -o $(G4LIBDIR)/win32def $(G4INSTALL)/config/win32def.c +else + @echo "Build of DLLs is only supported on Windows platforms !" + @echo "The system you have currently selected is $(G4SYSTEM)." +endif includes: @echo Installing includes files in $(G4INCLUDE) ... diff --git a/source/digits_hits/GNUmakefile b/source/digits_hits/GNUmakefile index a9ec29d701..9dbb9943d9 100644 --- a/source/digits_hits/GNUmakefile +++ b/source/digits_hits/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 2003/10/03 10:24:01 gcosmo Exp $ +# $Id: GNUmakefile,v 1.3 2004/06/01 15:34:51 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for digits+hits library. Makoto Asai, 1/11/96. # -------------------------------------------------------------- @@ -8,6 +8,9 @@ name := G4digits_hits SUBDIRS := detector hits digits SUBLIBS = G4detector G4digits G4hits +GLOBLIBS = libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4intercoms.lib libG4global.lib + ifndef G4INSTALL G4INSTALL = ../.. endif diff --git a/source/digits_hits/History b/source/digits_hits/History index 831ed50b43..4e5d6dffcc 100644 --- a/source/digits_hits/History +++ b/source/digits_hits/History @@ -1,4 +1,4 @@ -$Id: History,v 1.4 2004/03/15 19:16:05 asaim Exp $ +$Id: History,v 1.8 2004/06/11 14:46:49 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -16,6 +16,31 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +Jun 11, 2004, G.Cosmo (digits_hits-V06-01-03) +- Use global flag G4DIGI_ALLOC_EXPORT to export extern symbols for DLLs. + Modified granular GNUmakefiles and rearranged usage of extern symbols + in classes. + +Jun 9, 2004, G.Cosmo (digits_hits-V06-01-02) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Coworks with "global-V06-01-02b". + +Jun 7, 2004, G.Cosmo (digits_hits-V06-01-01) +- G4THitsCollection, G4HCofThisEvent, G4TDigiCollection, G4DCofThisEvent: + export extern symbols for allowing support of DLLs. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +May 3, 2004, G.Cosmo (digits_hits-V06-01-00) +- G4SDManager, G4SDStructure: added optional argument 'warning' to + FindSensitiveDetector(pathName, warning), defaulted to TRUE, to + eventually exclude warning issued by G4SDManager when sensitive + detector is not found. + The fix has been requested by ALICE to deactivate the warning when + a new sensitive-detector is created automatically in their framework. + Mar 15, 2004, M.Asai (digits_hits-V06-00-01) - Fix errors in the previous tag. diff --git a/source/digits_hits/detector/GNUmakefile b/source/digits_hits/detector/GNUmakefile index e07a60976d..90fd3730ba 100644 --- a/source/digits_hits/detector/GNUmakefile +++ b/source/digits_hits/detector/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 2003/10/03 10:29:19 gcosmo Exp $ +# $Id: GNUmakefile,v 1.3 2004/06/11 14:10:29 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for digits+hits library. Makoto Asai, 1/11/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4DIGI_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/management/include \ diff --git a/source/digits_hits/detector/History b/source/digits_hits/detector/History index 0495712bcc..114501b943 100644 --- a/source/digits_hits/detector/History +++ b/source/digits_hits/detector/History @@ -1,4 +1,4 @@ -$Id: History,v 1.2 2003/10/03 10:29:19 gcosmo Exp $ +$Id: History,v 1.3 2004/05/03 08:14:01 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,14 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +May, 3rd 2004 G.Cosmo +- G4SDManager, G4SDStructure: added optional argument 'warning' to + FindSensitiveDetector(pathName, warning), defaulted to TRUE, to + eventually exclude warning issued by G4SDManager when sensitive + detector is not found. + The fix has been requested by ALICE to deactivate the warning when + a new sensitive-detector is created automatically in their framework. + Oct, 4th 2003 G.Cosmo - Imported from digits+hits directory. diff --git a/source/digits_hits/detector/include/G4SDManager.hh b/source/digits_hits/detector/include/G4SDManager.hh index 40d76aea6b..8c8812e14e 100644 --- a/source/digits_hits/detector/include/G4SDManager.hh +++ b/source/digits_hits/detector/include/G4SDManager.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SDManager.hh,v 1.1 2003/10/03 10:08:25 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4SDManager.hh,v 1.2 2004/05/03 08:14:01 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4SDManager_h @@ -71,7 +71,7 @@ class G4SDManager // These two methods return the ID number of the sensitive detector. public: - G4VSensitiveDetector* FindSensitiveDetector(G4String dName); + G4VSensitiveDetector* FindSensitiveDetector(G4String dName, G4bool warning = true); G4HCofThisEvent* PrepareNewEvent(); void TerminateCurrentEvent(G4HCofThisEvent* HCE); diff --git a/source/digits_hits/detector/include/G4SDStructure.hh b/source/digits_hits/detector/include/G4SDStructure.hh index b31e1a717e..c1763fc0fc 100644 --- a/source/digits_hits/detector/include/G4SDStructure.hh +++ b/source/digits_hits/detector/include/G4SDStructure.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SDStructure.hh,v 1.1 2003/10/03 10:08:42 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4SDStructure.hh,v 1.2 2004/05/03 08:14:01 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4SDStructure_h @@ -54,7 +54,7 @@ class G4SDStructure void Activate(G4String aName, G4bool sensitiveFlag); void Initialize(G4HCofThisEvent*HCE); void Terminate(G4HCofThisEvent*HCE); - G4VSensitiveDetector* FindSensitiveDetector(G4String aName); + G4VSensitiveDetector* FindSensitiveDetector(G4String aName, G4bool warning = true); G4VSensitiveDetector* GetSD(G4String aName); void ListTree(); diff --git a/source/digits_hits/detector/src/G4SDManager.cc b/source/digits_hits/detector/src/G4SDManager.cc index befe340a37..95514fc318 100644 --- a/source/digits_hits/detector/src/G4SDManager.cc +++ b/source/digits_hits/detector/src/G4SDManager.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SDManager.cc,v 1.1 2003/10/03 10:11:26 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4SDManager.cc,v 1.2 2004/05/03 08:14:01 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4SDManager.hh" @@ -101,11 +101,11 @@ void G4SDManager::Activate(G4String dName, G4bool activeFlag) treeTop->Activate(pathName,activeFlag); } -G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName) +G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName, G4bool warning) { G4String pathName = dName; if( pathName(0) != '/' ) pathName.prepend("/"); - return treeTop->FindSensitiveDetector(pathName); + return treeTop->FindSensitiveDetector(pathName, warning); } G4int G4SDManager::GetCollectionID(G4String colName) diff --git a/source/digits_hits/detector/src/G4SDStructure.cc b/source/digits_hits/detector/src/G4SDStructure.cc index 40679654fe..c7f0e5a76c 100644 --- a/source/digits_hits/detector/src/G4SDStructure.cc +++ b/source/digits_hits/detector/src/G4SDStructure.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SDStructure.cc,v 1.1 2003/10/03 10:11:40 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4SDStructure.cc,v 1.2 2004/05/03 08:14:02 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G4SDStructure @@ -160,7 +160,7 @@ void G4SDStructure::Activate(G4String aName, G4bool sensitiveFlag) } } -G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector(G4String aName) +G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector(G4String aName, G4bool warning) { G4String aPath = aName; aPath.remove(0,pathName.length()); @@ -170,7 +170,8 @@ G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector(G4String aName) G4SDStructure* tgtSDS = FindSubDirectory(subD); if( tgtSDS == 0 ) { // The subdirectory is not found - G4cout << subD << " is not found in " << pathName << G4endl; + if (warning) + G4cout << subD << " is not found in " << pathName << G4endl; return 0; } else @@ -183,7 +184,8 @@ G4VSensitiveDetector* G4SDStructure::FindSensitiveDetector(G4String aName) G4VSensitiveDetector* tgtSD = GetSD(aPath); if( tgtSD == 0 ) { // The detector is not found. - G4cout << aPath << " is not found in " << pathName << G4endl; + if (warning) + G4cout << aPath << " is not found in " << pathName << G4endl; } return tgtSD; } diff --git a/source/digits_hits/digits/GNUmakefile b/source/digits_hits/digits/GNUmakefile index 6978d8fd15..30774d3336 100644 --- a/source/digits_hits/digits/GNUmakefile +++ b/source/digits_hits/digits/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 2003/10/03 10:13:29 gcosmo Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:10:29 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for digits+hits library. Makoto Asai, 1/11/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4DIGI_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/management/include \ diff --git a/source/digits_hits/digits/include/G4DCofThisEvent.hh b/source/digits_hits/digits/include/G4DCofThisEvent.hh index 16f5501d23..cdd8ea72dd 100644 --- a/source/digits_hits/digits/include/G4DCofThisEvent.hh +++ b/source/digits_hits/digits/include/G4DCofThisEvent.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DCofThisEvent.hh,v 1.1 2003/10/03 10:14:01 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4DCofThisEvent.hh,v 1.4 2004/06/11 14:10:30 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4DCofThisEvent_h @@ -85,7 +85,11 @@ class G4DCofThisEvent } }; -extern G4Allocator anDCoTHAllocator; +#if defined G4DIGI_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator anDCoTHAllocator; +#else + extern G4DLLIMPORT G4Allocator anDCoTHAllocator; +#endif inline void* G4DCofThisEvent::operator new(size_t) { diff --git a/source/digits_hits/digits/include/G4TDigiCollection.hh b/source/digits_hits/digits/include/G4TDigiCollection.hh index 87c50e2c31..b7659ccac7 100644 --- a/source/digits_hits/digits/include/G4TDigiCollection.hh +++ b/source/digits_hits/digits/include/G4TDigiCollection.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TDigiCollection.hh,v 1.1 2003/10/03 10:14:17 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4TDigiCollection.hh,v 1.4 2004/06/11 14:10:30 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4TDigiCollection_h @@ -55,7 +55,11 @@ class G4DigiCollection : public G4VDigiCollection void* theCollection; }; -extern G4Allocator aDCAllocator; +#if defined G4DIGI_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aDCAllocator; +#else + extern G4DLLIMPORT G4Allocator aDCAllocator; +#endif template class G4TDigiCollection : public G4DigiCollection { diff --git a/source/digits_hits/digits/src/G4DCofThisEvent.cc b/source/digits_hits/digits/src/G4DCofThisEvent.cc index 2bc77eeb0f..52d879c1dd 100644 --- a/source/digits_hits/digits/src/G4DCofThisEvent.cc +++ b/source/digits_hits/digits/src/G4DCofThisEvent.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DCofThisEvent.cc,v 1.1 2003/10/03 10:15:09 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4DCofThisEvent.cc,v 1.3 2004/06/11 14:10:31 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4DCofThisEvent.hh" diff --git a/source/digits_hits/digits/src/G4TDigiCollection.cc b/source/digits_hits/digits/src/G4TDigiCollection.cc index 1b4082a9fe..6cd231947e 100644 --- a/source/digits_hits/digits/src/G4TDigiCollection.cc +++ b/source/digits_hits/digits/src/G4TDigiCollection.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TDigiCollection.cc,v 1.1 2003/10/03 10:15:24 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4TDigiCollection.cc,v 1.3 2004/06/11 14:10:31 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4TDigiCollection.hh" diff --git a/source/digits_hits/hits/GNUmakefile b/source/digits_hits/hits/GNUmakefile index d5b06a00a9..850c13b668 100644 --- a/source/digits_hits/hits/GNUmakefile +++ b/source/digits_hits/hits/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 2003/10/03 10:16:22 gcosmo Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:10:32 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for digits+hits library. Makoto Asai, 1/11/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4DIGI_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/management/include \ diff --git a/source/digits_hits/hits/include/G4HCofThisEvent.hh b/source/digits_hits/hits/include/G4HCofThisEvent.hh index 480300f15d..a7e5ce3a08 100644 --- a/source/digits_hits/hits/include/G4HCofThisEvent.hh +++ b/source/digits_hits/hits/include/G4HCofThisEvent.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4HCofThisEvent.hh,v 1.1 2003/10/03 10:16:54 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HCofThisEvent.hh,v 1.4 2004/06/11 14:10:32 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4HCofThisEvent_h @@ -84,7 +84,11 @@ class G4HCofThisEvent } }; -extern G4Allocator anHCoTHAllocator; +#if defined G4DIGI_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator anHCoTHAllocator; +#else + extern G4DLLIMPORT G4Allocator anHCoTHAllocator; +#endif inline void* G4HCofThisEvent::operator new(size_t) { diff --git a/source/digits_hits/hits/include/G4THitsCollection.hh b/source/digits_hits/hits/include/G4THitsCollection.hh index 193ae4a7b1..fc90680837 100644 --- a/source/digits_hits/hits/include/G4THitsCollection.hh +++ b/source/digits_hits/hits/include/G4THitsCollection.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4THitsCollection.hh,v 1.1 2003/10/03 10:17:08 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4THitsCollection.hh,v 1.4 2004/06/11 14:10:32 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4THitsCollection_h @@ -56,7 +56,11 @@ class G4HitsCollection : public G4VHitsCollection void* theCollection; }; -extern G4Allocator anHCAllocator; +#if defined G4DIGI_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator anHCAllocator; +#else + extern G4DLLIMPORT G4Allocator anHCAllocator; +#endif template class G4THitsCollection : public G4HitsCollection { diff --git a/source/digits_hits/hits/src/G4HCofThisEvent.cc b/source/digits_hits/hits/src/G4HCofThisEvent.cc index 8c5f1be4d8..b465a3df5a 100644 --- a/source/digits_hits/hits/src/G4HCofThisEvent.cc +++ b/source/digits_hits/hits/src/G4HCofThisEvent.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4HCofThisEvent.cc,v 1.1 2003/10/03 10:18:00 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HCofThisEvent.cc,v 1.3 2004/06/11 14:10:33 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4HCofThisEvent.hh" diff --git a/source/digits_hits/hits/src/G4THitsCollection.cc b/source/digits_hits/hits/src/G4THitsCollection.cc index 345354b2ac..cfdf3c13a6 100644 --- a/source/digits_hits/hits/src/G4THitsCollection.cc +++ b/source/digits_hits/hits/src/G4THitsCollection.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4THitsCollection.cc,v 1.1 2003/10/03 10:18:14 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4THitsCollection.cc,v 1.3 2004/06/11 14:10:33 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4THitsCollection.hh" diff --git a/source/event/GNUmakefile b/source/event/GNUmakefile index c9b72fe800..40ecb95f68 100644 --- a/source/event/GNUmakefile +++ b/source/event/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/10/03 14:12:14 gcosmo Exp $ +# $Id: GNUmakefile,v 1.7 2004/06/11 14:11:15 gcosmo Exp $ # ------------------------------------------------------------ # GNUmakefile for events library. Makoto Asai, 5/9/95. # ------------------------------------------------------------ @@ -9,8 +9,14 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4EVENT_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/event/History b/source/event/History index a9a440a2ce..5dafe4b8ec 100644 --- a/source/event/History +++ b/source/event/History @@ -1,4 +1,4 @@ -$Id: History,v 1.71 2004/03/16 00:04:25 asaim Exp $ +$Id: History,v 1.79 2004/06/11 14:52:16 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,49 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 11, 2004, G.Cosmo (event-V06-01-07) +- Use global flag G4EVENT_ALLOC_EXPORT to export extern symbols for DLLs. + Modified GNUmakefile and rearranged usage of extern symbols in classes. + +Jun 9, 2004, G.Cosmo (event-V06-01-06) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Coworks with "global-V06-01-02b". + +Jun 7, 2004, G.Cosmo (event-V06-01-05) +- Export extern symbols for allowing support of DLLs on Windows. Modified files: + G4Event.hh, G4HEPEvtParticle.hh, G4PrimaryParticle.hh, G4PrimaryVertex.hh, + G4StackedTrack.hh, G4TrajectoryContainer.hh. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +May 26, 2004, M.Asai (event-V06-01-04) +- Fix incorrect behaviour of event abortion requested by BeginOfEventAction. + +May 04, 2004, M.Asai (event-V06-01-03) +- Access methods to G4TrackingManager and G4StackManager are added + to G4EventManager. + +Apr, 26, 2004, F. Lei (event-V06-01-02) +- Restored a few methods to G4GeneralParticleSource.hh to maintain backward + compatibility. + +Apr, 5, 2004, F. Lei (event-V06-01-01) +- Added "UserWRTSurace = true", "UserAngRef= flase" to constructor of + G4SPSAngDistribution. +- Apply the Max/Min angle limits to the User defined angular distribution case. +- New formula for conevrting integral spectrum to differential one. + +Apr, 1, 2004, F. Lei (event-V06-01-00) +- Major design iteration of the G4GeneralParticleSource class. The following + new classes have been added: + - G4SingleParticleSource + - G4SPSEneDistribution + - G4SPSAngDistribution + - G4SPSPosDistribution + - G4SPSRandomGenerator + See http://reat.space.qinetiq.com/gps for more details of the changes. + Mar. 15, 2004, M.Asai (event-V06-00-01) - LocateGlobalPointAndSetup() method of G4Navigator is now invoked at the beginning of each event to reset the navigator. diff --git a/source/event/include/G4Event.hh b/source/event/include/G4Event.hh index b24a1b2020..1f49649be9 100644 --- a/source/event/include/G4Event.hh +++ b/source/event/include/G4Event.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Event.hh,v 1.7 2003/09/09 20:09:17 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4Event.hh,v 1.10 2004/06/11 14:11:15 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4Event_h @@ -155,7 +155,11 @@ class G4Event // Set and Get method of G4VUserEventInformation }; -extern G4Allocator anEventAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator anEventAllocator; +#else + extern G4DLLIMPORT G4Allocator anEventAllocator; +#endif inline void* G4Event::operator new(size_t) { diff --git a/source/event/include/G4EventManager.hh b/source/event/include/G4EventManager.hh index 34d26daf0a..7136958852 100644 --- a/source/event/include/G4EventManager.hh +++ b/source/event/include/G4EventManager.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4EventManager.hh,v 1.12 2003/09/09 20:09:17 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4EventManager.hh,v 1.14 2004/05/26 17:08:33 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -126,6 +126,7 @@ class G4EventManager G4SDManager* sdManager; G4PrimaryTransformer* transformer; G4bool tracking; + G4bool abortRequested; G4EvManMessenger* theMessenger; @@ -146,6 +147,7 @@ class G4EventManager public: // with description inline void AbortCurrentEvent() { + abortRequested = true; trackContainer->clear(); if(tracking) trackManager->EventAborted(); } @@ -173,6 +175,11 @@ class G4EventManager void SetNumberOfAdditionalWaitingStacks(G4int iAdd) { trackContainer->SetNumberOfAdditionalWaitingStacks(iAdd); } + inline G4StackManager* GetStackManager() const + { return trackContainer; } + inline G4TrackingManager* GetTrackingManager() const + { return trackManager; } + public: // with description inline G4int GetVerboseLevel() { return verboseLevel; } diff --git a/source/event/include/G4GeneralParticleSource.hh b/source/event/include/G4GeneralParticleSource.hh index aca40c4894..7dae9c8c3a 100644 --- a/source/event/include/G4GeneralParticleSource.hh +++ b/source/event/include/G4GeneralParticleSource.hh @@ -22,647 +22,184 @@ // /////////////////////////////////////////////////////////////////////////////// // -// MODULE: G4GeneralParticleSource.hh +// MODULE: G4GeneralParticleSource.hh // -// Version: 1.1 -// Date: 18/10/00 -// Author: C Ferguson, F Lei & P Truscott -// Organisation: University of Southampton / DERA -// Customer: ESA/ESTEC +// Version: 2.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +// Documentation avaialable at http://reat.space.qinetiq.com/gps +// These include: +// User Requirement Document (URD) +// Software Specification Documents (SSD) +// Software User Manual (SUM): on-line version available +// Technical Note (TN) on the physics and algorithms // /////////////////////////////////////////////////////////////////////////////// -// $Id: G4GeneralParticleSource.hh,v 1.8 2003/10/13 09:21:27 flei Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// +// CHANGE HISTORY +// -------------- +// +// Version 2.0, 05/02/2004, Fan Lei, Created. +// based on version 1.1 in Geant4 v6.0 +// - Mutilple particle source definition +// - Re-structured commands +// - Split the task into smaller classes +// +// - old commonds have been retained for backward compatibility, but will +// be removed in the future. +// /////////////////////////////////////////////////////////////////////////////// // // Class Description: // -// The General Particle Source is designed to extend the functionality of the -// G4ParticleGun class. It is designed to allow specification of input -// particles in terms of position, direction (or angular) and energy -// distributions. This class is derived from G4VPrimaryGenerator. +// The General Particle Source is designed to replace the G4ParticleGun class. +// It is designed to allow specification of mutiple particle sources, each with +// independent definitions of particle type, position, direction (or angular) +// and energy distributions. // /////////////////////////////////////////////////////////////////////////////// // // MEMBER FUNCTIONS // ---------------- // -// G4GeneralParticleSource () -// Constructor: Initializes variables and instantiates the -// Messenger and Navigator classes +// G4GeneralParticleSource() +// Constructor: Initializes variables and instantiates the +// Messenger and generator classes // -// ~G4GeneralParticleSource () -// Destructor: deletes Messenger and prints out run information. +// ~G4GeneralParticleSourceMessenger() +// Destructor: deletes Messenger and others // -// void GeneratePrimaryVertex(G4Event *evt) -// Generate the particles initial parameters. +// G4int GetNumberofSource() +// Return the number of particle gun defined // -// void SetPosDisType(G4String) -// Allows user to choose Point, Plane, Surface or Volume source -// position distributions. +// void ListSource() +// List the particle guns defined // -// void SetPosDisShape(G4String) -// Allows the user to choose the particular shape they wish for the -// position distribution. Choices are Square, Circle, Ellipse, Rectangle, -// Sphere, Ellipsoid, Cylinder, Parallelepiped. +// void SetCurrentSourceto(G4int) +// set the current gun to the specified one so its definition can be changed // -// void SetCentreCoords(G4ThreeVector) -// Sets the co-ordinates of the centre of the position distribution. -// -// void SetPosRot1(G4ThreeVector) -// Used to specify the co-ordinate system for the position distribution -// along with SetPosRot2. SetPosRot1 sets the vector x' and need not be -// a unit vector. -// -// void SetPosRot2(G4ThreeVector) -// Used in connection with SetPosRot1. This sets a vector in the plane -// x'y'. By a series of cross products x', y', z' are generated. Again -// need not be a unit vector. +// void SetCurrentSourceIntensity(G4double) +// change the current particle gun strength +// +// G4SingleParticleSource* GetCurrentSource() +// return the pointer to current particle gun // -// void SetHalfX(G4double) -// Sets the half length in x. +// G4int GetCurrentSourceIndex() +// return the index of the current particle gun // -// void SetHalfY(G4double) -// Sets the half length in y. +// G4double GetCurrentSourceIntensity() +// return the strength of the current gun // -// void SetHalfZ(G4double) -// Sets the half length in z. +// void ClearAll() +// remove all defined aprticle gun // -// void SetRadius(G4double) -// Sets the radius where appropriate for source distribution shapes. +// void AddaSource (G4double) +// add a new particle gun with the specified strength // -// void SetRadius0(G4double) -// Sets the inner radius where appropriate for source distribution shapes. +// void DeleteaSource(G4int); +// delete the specified particle gun // -// void SetParAlpha(G4double) -// Sets the angle Alpha in the Parallelepiped shapes. +// void SetParticleDefinition (); +// G4ParticleDefinition * GetParticleDefinition () +// Get/Set the particle definition of the primary track // -// void SetParTheta(G4double) -// Sets the angle Theta in the Parallelepiped shapes. +// void SetParticleCharge(G4double aCharge) +// set the charge state of the primary track // -// void SetParPhi(G4double) -// Sets the angle Phi in the Parallelepiped shapes. +// inline void SetParticlePolarization (G4ThreeVector aVal) +// inline G4ThreeVector GetParticlePolarization () +// Set/Get the polarization state of the primary track // -// void ConfineSourceToVolume(G4String) -// Used to confine the start positions to a particular volume. +// inline void SetParticleTime(G4double aTime) { particle_time = aTime; }; +// inline G4double GetParticleTime() { return particle_time; }; +// Set/Get the Time. // -// void GenerateRotationMatrices() -// This is used to calculate the cross products and determine the -// vectors x', y', z' for the position distribution. +// inline void SetNumberOfParticles(G4int i) +// inline G4int GetNumberOfParticles() +// set/get the number of particles to be generated in the primary track // -// void GeneratePointSource() -// Generates a point source. -// -// void GeneratePointsInPlane() -// Generates starting positions confined to a plane source. -// -// void GeneratePointsOnSurface() -// Generates starting positions confined to the surface of a shape. -// -// void GeneratePointsInVolume() -// Generates starting positions within the volume of a shape. -// -// G4bool IsSourceConfined() -// Checks the source is confined to the requested volume. -// -// Angular Distribution Methods: -// -// void SetAngDistType(G4String) -// Used to set the type of angular distribution wanted. Arguments -// are iso, cos and user for isotropic, cosine-law and user-defined -// respectively. -// -// void DefineAngRefAxes(G4String, G4ThreeVector) -// DefineAngRefAxes is used in a similar way as SetPosRot to -// define vectors, one x' and one in the plane x'y', to create -// a rotated set of axes for the angular distribution. -// -// void SetMinTheta(G4double) -// Sets the minimum value for the angle theta. -// -// void SetMinPhi(G4double) -// Sets the minimum value for phi. -// -// void SetMaxTheta(G4double) -// Sets the maximum value for theta. -// -// void SetMaxPhi(G4double) -// Sets the maximum value for phi. -// -// void UserDefAngTheta(G4ThreeVector) -// This method allows the user to define a histogram in Theta. -// -// void UserDefAngPhi(G4ThreeVector) -// This method allows the user to define a histogram in phi. -// -// void GenerateIsotropicFlux() -// This method generates momentum vectors for particles according -// to an isotropic distribution. -// -// void GenerateCosineLawFlux() -// This method generates momentum vectors for particles according -// to a cosine-law distribution. -// -// void GenerateUserDefFlux() -// Controls generation of momentum vectors according to user-defined -// distributions. -// -// G4double GenerateUserDefTheta() -// Generates the theta angle according to a user-defined distribution. -// -// G4double GenerateUserDefPhi() -// Generates phi according to a user-defined distribution. -// -// void SetUserWRTSurface(G4bool) -// Allows user to have user-defined spectra either with respect to the -// co-ordinate system (default) or with respect to the surface normal. -// -// Energy Distribution methods: -// -// void SetEnergyDisType(G4String) -// Allows the user to choose the energy distribution type. The arguments -// are Mono (mono-energetic), Lin (linear), Pow (power-law), Exp -// (exponential), Brem (bremsstrahlung), BBody (black-body), Cdg -// (cosmic diffuse gamma-ray), User (user-defined), Arb (arbitrary -// point-wise), Epn (energy per nucleon). -// -// void SetEmin(G4double) -// Sets the minimum energy. -// -// void SetEmax(G4double) -// Sets the maximum energy. -// -// void SetMonoEnergy(G4double) -// Sets energy for mono-energetic distribution. -// -// void SetAlpha(G4double) -// Sets alpha for a power-law distribution. -// -// void SetTemp(G4double) -// Sets Temperature for a Brem or BBody distributions. -// -// void SetEzero(G4double) -// Sets Ezero for an exponential distribution. -// -// void SetGradient(G4double) -// Sets gradient for a linear distribution. -// -// void SetInterCept(G4double) -// Sets intercept for a linear distribution. -// -// void UserEnergyHisto(G4ThreeVector) -// Allows user to defined a histogram for the energy distribution. -// -// void ArbEnergyHisto(G4ThreeVector) -// Allows the user to define an Arbitrary set of points for the -// energy distribution. -// -// void EpnEnergyHisto(G4ThreeVector) -// Allows the user to define an Energy per nucleon histogram. -// -// void Calculate() -// Controls the calculation of Integral PDF for the Cdg and BBody -// distributions. -// -// void CalculateCdgSpectrum() -// Calculates the integral PDF for the Cdg distribution. -// -// void CalculateBbodySpectrum() -// Calculates the Integral PDF for the Bbody distribution. -// -// void InputEnergySpectra(G4bool) -// Allows the user to choose between momentum and energy histograms -// for user-defined histograms and arbitrary point-wise spectr. -// The default is true (energy). -// -// void InputDifferentialSpectra(G4bool) -// Allows the user to choose between integral and differential -// distributions when using the arbitrary point-wise option. -// -// void ArbInterpolate(G4String) -// ArbInterpolate allows the user to specify the type of function to -// interpolate the Arbitrary points spectrum with. -// -// void LinearInterpolation() -// Interpolates arbitrary points with a series of line segments. -// -// void LogInterpolation() -// Interpolates arbitrary points with a series of power-laws. -// -// void ExpInterpolation() -// Interpolates arbitrary points with a series of exponentials. -// -// void SplineInterpolation() -// Interpolates arbitrary points using cubic splines. -// -// void GenerateMonoEnergetic() -// Generates a mono-energetic source. -// -// void GenerateLinearEnergies() -// Generates particle energies according to a linear distribution. -// -// void GeneratePowEnergies() -// Generates particle energies according to a power-law distribution. -// -// void GenerateExpEnergies() -// Generates particle energies according to an exponential distribution. -// -// void GenerateBremEnergies() -// Generates particle energies according to a bremsstrahlung distribution. -// -// void GenerateBbodyEnergies() -// Generates particle energies according to a black-body distribution. -// -// void GenerateCdgEnergies() -// Generates particle energies according to a Cdg distribution. -// -// void GenUserHistEnergies() -// Generates particle energies according to a user-defined distribution. -// -// void GenEpnHistEnergies() -// Generates particle energies according to a energy per nucleon -// distribution. -// -// void GenArbPointEnergies() -// Generates particle energies according to an arbitrary point-wise -// spectrum. -// -// void ConvertEPNToEnergy() -// Converts energy per nucleon histograms to energy histograms. -// -// Biasing Methods: -// -// void SetXBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate x co-ordinates. -// -// void SetYBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate y co-ordinates. -// -// void SetZBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate z co-ordinates. -// -// void SetThetaBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate values of theta. -// -// void SetPhiBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate values of phi. -// -// void SetEnergyBias(G4ThreeVector) -// Allows the user to re-distribute the random -// numbers used to generate the energies. -// -// G4double GenRandX() -// Generates the random number for x, with or without biasing. -// -// G4double GenRandY() -// Generates the random number for y, with or without biasing. -// -// G4double GenRandZ() -// Generates the random number for z, with or without biasing. -// -// G4double GenRandTheta() -// Generates the random number for theta, with or without biasing. -// -// G4double GenRandPhi() -// Generates the random number for phi, with or without biasing. -// -// G4double GenRandEnergy() -// Generates the random number for energy, with or without biasing. -// -// void SetVerbosity(G4int) -// Sets the verbosity level. +// inline G4ThreeVector GetParticlePosition() +// inline G4ThreeVector GetParticleMomentumDirection() +// inline G4double GetParticleEnergy() +// get the position, direction, and energy of the current particle // /////////////////////////////////////////////////////////////////////////////// // -// -// CHANGE HISTORY -// -------------- -// -// Version 1.0, 28 February 2000, C Ferguson, Created. -// -// Version 1.1, 18 October 2000, Modified to inherit from G4VPrimaryGenerator. -// New name at the request of M. Asai. -// -/////////////////////////////////////////////////////////////////////////////// -// -#ifndef G4GeneralParticleSource_h -#define G4GeneralParticleSource_h 1 +#ifndef G4GeneralParticleSource_H +#define G4GeneralParticleSource_H 1 -#include "G4VPrimaryGenerator.hh" -#include "G4Navigator.hh" -#include "G4PhysicsOrderedFreeVector.hh" -#include "G4ParticleMomentum.hh" -#include "G4ParticleDefinition.hh" -#include "G4DataInterpolation.hh" +#include "globals.hh" +#include +#include "G4Event.hh" +#include "G4SingleParticleSource.hh" +// #include "G4GeneralParticleSourceMessenger.hh" -class G4GeneralParticleSource : public G4VPrimaryGenerator +class G4GeneralParticleSource { + // public: - G4GeneralParticleSource (); - ~G4GeneralParticleSource (); - void GeneratePrimaryVertex(G4Event *evt); - // methods to create source position dist. - void SetPosDisType(G4String); // Point, Plane, Surface, Volume - inline G4String GetPosDisType() - { return SourcePosType; } - void SetPosDisShape(G4String); - inline G4String GetPosDisShape() - { return Shape; } - // SetPosDisShape - Square, Circle, Annulus, Ellipse, Rectangle, Sphere, - // Ellipsoid, Cylinder, Right (parallelepiped). - void SetCentreCoords(G4ThreeVector); - inline G4ThreeVector GetCentreCoords() - { return CentreCoords; } - void SetPosRot1(G4ThreeVector); - void SetPosRot2(G4ThreeVector); - void SetHalfX(G4double); - inline G4double GetHalfX() - { return halfx; } - void SetHalfY(G4double); - inline G4double GetHalfY() - { return halfy; } - void SetHalfZ(G4double); - inline G4double GetHalfZ() - { return halfz; } - void SetRadius(G4double); - inline G4double GetRadius() - { return Radius; } - void SetRadius0(G4double); - void SetBeamSigmaInR(G4double); - void SetBeamSigmaInX(G4double); - void SetBeamSigmaInY(G4double); - void SetParAlpha(G4double); - void SetParTheta(G4double); - void SetParPhi(G4double); - void ConfineSourceToVolume(G4String); - void GenerateRotationMatrices(); - // the following routines generate the source position - void GeneratePointSource(); - void GeneratePointsInBeam(); - void GeneratePointsInPlane(); - void GeneratePointsOnSurface(); - void GeneratePointsInVolume(); + G4GeneralParticleSource(); + ~G4GeneralParticleSource(); - G4bool IsSourceConfined(); + void GeneratePrimaryVertex(G4Event*); - // Angular Distribution Methods - void SetAngDistType(G4String); - void DefineAngRefAxes(G4String, G4ThreeVector); - void SetMinTheta(G4double); - void SetMinPhi(G4double); - void SetMaxTheta(G4double); - void SetMaxPhi(G4double); - void SetBeamSigmaInAngR(G4double); - void SetBeamSigmaInAngX(G4double); - void SetBeamSigmaInAngY(G4double); - void UserDefAngTheta(G4ThreeVector); - void UserDefAngPhi(G4ThreeVector); - inline void SetParticleMomentumDirection - (G4ParticleMomentum aMomentumDirection) - { particle_momentum_direction = aMomentumDirection.unit(); } - // These methods generate the momentum vectors for the particles. - void GenerateIsotropicFlux(); - void GenerateCosineLawFlux(); - void GenerateBeamFlux(); - void GeneratePlanarFlux(); - void GenerateUserDefFlux(); - G4double GenerateUserDefTheta(); - G4double GenerateUserDefPhi(); - void SetUseUserAngAxis(G4bool); - void SetUserWRTSurface(G4bool); - - // Energy Distribution methods - void SetEnergyDisType(G4String); - inline G4String GetEnergyDisType() - {return EnergyDisType;} - void SetEmin(G4double); - inline G4double GetEmin() - {return Emin;} - inline G4double GetArbEmin() - {return ArbEmin;} - void SetEmax(G4double); - inline G4double GetEmax() - {return Emax;} - inline G4double GetArbEmax() - {return ArbEmax;} - void SetMonoEnergy(G4double); - void SetAlpha(G4double); - void SetTemp(G4double); - void SetBeamSigmaInE(G4double); - void SetEzero(G4double); - void SetGradient(G4double); - void SetInterCept(G4double); - void UserEnergyHisto(G4ThreeVector); - void ArbEnergyHisto(G4ThreeVector); - void EpnEnergyHisto(G4ThreeVector); - void Calculate(); - void CalculateCdgSpectrum(); - void CalculateBbodySpectrum(); - void InputEnergySpectra(G4bool); - void InputDifferentialSpectra(G4bool); - void ArbInterpolate(G4String); - inline G4String GetIntType() - {return IntType;} - void LinearInterpolation(); - void LogInterpolation(); - void ExpInterpolation(); - void SplineInterpolation(); - // The following methods generate energies according to the spectral - // parameters defined above. - void GenerateMonoEnergetic(); - void GenerateLinearEnergies(); - void GeneratePowEnergies(); - void GenerateExpEnergies(); - void GenerateGaussEnergies(); - void GenerateBremEnergies(); - void GenerateBbodyEnergies(); - void GenerateCdgEnergies(); - void GenUserHistEnergies(); - void GenEpnHistEnergies(); - void GenArbPointEnergies(); - // converts energy per nucleon to energy. - void ConvertEPNToEnergy(); - - // Biasing Methods - void SetXBias(G4ThreeVector); - void SetYBias(G4ThreeVector); - void SetZBias(G4ThreeVector); - void SetThetaBias(G4ThreeVector); - void SetPhiBias(G4ThreeVector); - void SetEnergyBias(G4ThreeVector); - G4double GenRandX(); - G4double GenRandY(); - G4double GenRandZ(); - G4double GenRandTheta(); - G4double GenRandPhi(); - G4double GenRandEnergy(); - - // method to re-set the histograms - void ReSetHist(G4String); + G4int GetNumberofSource() { return G4int(sourceVector.size()); }; + void ListSource(); + void SetCurrentSourceto(G4int) ; + void SetCurrentSourceIntensity(G4double); + G4SingleParticleSource* GetCurrentSource() {return currentSource;}; + G4int GetCurrentSourceIndex() { return currentSourceIdx; }; + G4double GetCurrentSourceIntensity() { return sourceIntensity[currentSourceIdx]; }; + void ClearAll(); + void AddaSource (G4double); + void DeleteaSource(G4int); // Set the verbosity level. - void SetVerbosity(G4int); + inline void SetVerbosity(G4int i) {currentSource->SetVerbosity(i);} ; // Set the particle species - void SetParticleDefinition (G4ParticleDefinition * aParticleDefinition); - inline G4ParticleDefinition * GetParticleDefinition () - {return particle_definition;} + inline void SetParticleDefinition (G4ParticleDefinition * aParticleDefinition) + {currentSource->SetParticleDefinition(aParticleDefinition); } ; - // SR1.3 - allowing user to define an isotope by A,Z,energy. - // void SetNucleus(Nucleus theIon1); // Sets the isotope. - //inline Nucleus GetNucleus() {return theIon;} // Returns the isotope. + inline G4ParticleDefinition * GetParticleDefinition () { return currentSource->GetParticleDefinition();} ; - inline void SetParticleCharge(G4double aCharge) - { particle_charge = aCharge; } + inline void SetParticleCharge(G4double aCharge) { currentSource->SetParticleCharge(aCharge); } ; // Set polarization - inline void SetParticlePolarization (G4ThreeVector aVal) - {particle_polarization = aVal;} - inline G4ThreeVector GetParticlePolarization () - {return particle_polarization;} + inline void SetParticlePolarization (G4ThreeVector aVal) {currentSource->SetParticlePolarization(aVal);}; + inline G4ThreeVector GetParticlePolarization () {return currentSource->GetParticlePolarization();}; // Set Time. - inline void SetParticleTime(G4double aTime) - { particle_time = aTime; } - inline G4double GetParticleTime() - { return particle_time; } + inline void SetParticleTime(G4double aTime) { currentSource->SetParticleTime(aTime); }; + inline G4double GetParticleTime() { return currentSource->GetParticleTime(); }; - inline void SetNumberOfParticles(G4int i) - { NumberOfParticlesToBeGenerated = i; } - inline G4int GetNumberOfParticles() - { return NumberOfParticlesToBeGenerated; } - - inline G4ThreeVector GetParticlePosition() - { return particle_position;} - - inline G4ThreeVector GetParticleMomentumDirection() - { return particle_momentum_direction;} - - inline G4double GetTheta() - { return Theta;} - - inline G4double GetPhi() - { return Phi;} - - inline G4double GetParticleEnergy() - {return particle_energy;} + inline void SetNumberOfParticles(G4int i) { currentSource->SetNumberOfParticles(i); }; + // + inline G4int GetNumberOfParticles() { return currentSource->GetNumberOfParticles(); }; + inline G4ThreeVector GetParticlePosition() { return currentSource->GetParticlePosition();}; + inline G4ThreeVector GetParticleMomentumDirection() { return currentSource->GetParticleMomentumDirection();}; + inline G4double GetParticleEnergy() {return currentSource->GetParticleEnergy();}; private: - // Position distribution Variables - G4String SourcePosType; //Point,Plane,Surface,Volume - G4String Shape; //Circle,Square,Rectangle etc.. - G4double halfx, halfy, halfz; //half lengths - G4double Radius; //Radius for circles or spheres - G4double Radius0; // The inner radius of an annulus - G4double SR,SX,SY; // Standard deviation in raduial, x, y for beam type source - G4ThreeVector CentreCoords; // Coords of centre of input shape - G4ThreeVector Rotx, Roty, Rotz; // Unit vectors defining rotation matrix - G4double ParAlpha, ParTheta, ParPhi; //Angle for Right Parallellepipeds - G4bool Confine; //If true confines source distribution to VolName - G4String VolName; - G4ThreeVector SideRefVec1,SideRefVec2,SideRefVec3; //Side rotation matrices - - // Angular distribution variables. - G4String AngDistType; // String to hold Ang dist type iso, cos, user - G4ThreeVector AngRef1, AngRef2, AngRef3; // Reference axes for ang dist - G4double MinTheta, MaxTheta, MinPhi, MaxPhi; // min/max theta/phi - G4double DR,DX,DY ; // Standard deviation for beam divergence - G4double Theta, Phi; // Store these for use with DEBUG - G4bool IPDFThetaExist, IPDFPhiExist; // tell whether IPDF histos exist - G4PhysicsOrderedFreeVector UDefThetaH; // Theta histo data - G4PhysicsOrderedFreeVector IPDFThetaH; //Cumulative Theta histogram. - G4PhysicsOrderedFreeVector UDefPhiH; // Phi histo bins - G4PhysicsOrderedFreeVector IPDFPhiH; // Cumulative phi histogram. - G4String UserDistType; //String to hold user distributions - G4bool UserWRTSurface; // G4bool to tell whether user wants distribution wrt - // surface normals or co-ordinate system - G4bool UserAngRef; // Set to true when user defines aaa new coordinates - - // Energy Distribution variables - G4String EnergyDisType; // energy dis type Variable - Mono,Lin,Exp,etc - G4double MonoEnergy; //Mono-energteic energy - G4double SE ; // Standard deviation for Gaussion distrbution in energy - G4double Emin, Emax; // emin and emax - G4double alpha, Ezero, Temp; // alpha (pow), E0 (exp) and Temp (bbody,brem) - G4double grad, cept; // gradient and intercept for linear spectra - G4bool EnergySpec; // true - energy spectra, false - momentum spectra - G4bool DiffSpec; // true - differential spec, false integral spec - G4bool ApplyRig; // false no rigidity cutoff, true then apply one - G4double ERig; // energy of rigidity cutoff - G4PhysicsOrderedFreeVector UDefEnergyH; // energy hist data - G4PhysicsOrderedFreeVector IPDFEnergyH; - G4bool IPDFEnergyExist, IPDFArbExist, Epnflag; - G4PhysicsOrderedFreeVector ArbEnergyH; // Arb x,y histogram - G4PhysicsOrderedFreeVector IPDFArbEnergyH; // IPDF for Arb - G4PhysicsOrderedFreeVector EpnEnergyH; - G4double CDGhist[3]; // cumulative histo for cdg - G4double BBHist[10001], Bbody_x[10001]; - G4String IntType; // Interpolation type - G4double Arb_grad[1024], Arb_cept[1024]; // grad and cept for 1024 segments - G4double Arb_alpha[1024], Arb_Const[1024]; // alpha and constants - G4double Arb_ezero[1024]; // ezero - G4double ArbEmin, ArbEmax; // Emin and Emax for the whole arb distribution - //use primarily for debug. - - // Bias variables - G4bool XBias, IPDFXBias; - G4PhysicsOrderedFreeVector XBiasH; - G4PhysicsOrderedFreeVector IPDFXBiasH; - G4bool YBias, IPDFYBias; - G4PhysicsOrderedFreeVector YBiasH; - G4PhysicsOrderedFreeVector IPDFYBiasH; - G4bool ZBias, IPDFZBias; - G4PhysicsOrderedFreeVector ZBiasH; - G4PhysicsOrderedFreeVector IPDFZBiasH; - G4bool ThetaBias, IPDFThetaBias; - G4PhysicsOrderedFreeVector ThetaBiasH; - G4PhysicsOrderedFreeVector IPDFThetaBiasH; - G4bool PhiBias, IPDFPhiBias; - G4PhysicsOrderedFreeVector PhiBiasH; - G4PhysicsOrderedFreeVector IPDFPhiBiasH; - G4bool EnergyBias, IPDFEnergyBias; - G4PhysicsOrderedFreeVector EnergyBiasH; - G4PhysicsOrderedFreeVector IPDFEnergyBiasH; - G4double bweights[6], bweight; //record x,y,z,theta,phi,energy weights - - // Other particle properties - G4int NumberOfParticlesToBeGenerated; - G4ParticleDefinition * particle_definition; - G4ParticleMomentum particle_momentum_direction; - G4double particle_energy; - G4double particle_charge; - G4ThreeVector particle_position; - G4double particle_time; - G4ThreeVector particle_polarization; - - // Verbosity - G4int verbosityLevel; + void IntensityNormalization(); private: - - G4PhysicsOrderedFreeVector ZeroPhysVector ; // for re-set only + G4bool normalised; + G4int currentSourceIdx; + G4SingleParticleSource* currentSource; + std::vector sourceVector; + std::vector sourceIntensity; + std::vector sourceProbability; - G4DataInterpolation *SplineInt; // holds Spline stuff - - G4GeneralParticleSourceMessenger *theMessenger; - G4Navigator *gNavigator; - - // Nucleus theIon; + G4GeneralParticleSourceMessenger* theMessenger; }; - #endif - - - - diff --git a/source/event/include/G4GeneralParticleSourceMessenger.hh b/source/event/include/G4GeneralParticleSourceMessenger.hh index 186ff0a8e2..50709c9b1b 100644 --- a/source/event/include/G4GeneralParticleSourceMessenger.hh +++ b/source/event/include/G4GeneralParticleSourceMessenger.hh @@ -24,23 +24,32 @@ // // MODULE: G4GeneralParticleSourceMessenger.hh // -// Version: 1.1 -// Date: 19/10/00 -// Author: C Ferguson, F Lei and P Truscott -// Organisation: University of Southampton / DERA +// Version: 2.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. // Customer: ESA/ESTEC // /////////////////////////////////////////////////////////////////////////////// -// $Id: G4GeneralParticleSourceMessenger.hh,v 1.8 2002/02/26 16:34:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// +// CHANGE HISTORY +// -------------- +// +// Version 2.0, 05/02/2004, Fan Lei, Created. +// After changes to version 1.1 as in Geant4 v6.0 +// - Mutilple particle source definition +// - Re-structured commands +// - old commonds have been retained for backward compatibility, will be +// removed in the future. +// /////////////////////////////////////////////////////////////////////////////// // +// // Class Description: // // The function of the G4GeneralParticleSourceMessenger is to allow the user to // enter commands either in interactive command line mode or through macros to -// control the G4GeneralParticleSource. The G4GeneralParticleSourceMessenger -// class is based on G4ParticleGunMessenger. +// control the G4GeneralParticleSource. // /////////////////////////////////////////////////////////////////////////////// // @@ -53,32 +62,22 @@ // ~G4GeneralParticleSourceMessenger() // Destructor: Deletes commands. // +// void SetParticleGun(G4SingleParticleSource *fpg) { fParticleGun = fpg; } ; +// To selecte the particle gun to be defined/modified. // void SetNewValue(G4UIcommand *command, G4String newValues) // Uses the appropriate methods in the G4GeneralParticleSource to carry out // the user commands. -// // G4String GetCurrentValue(G4UIcommand *command) // Allows the user to retrieve the current values of parameters. // Not implemented yet. // /////////////////////////////////////////////////////////////////////////////// // -// CHANGE HISTORY -// -------------- -// -// Version 1.0, 28 February 2000, C Ferguson, Created. -// -// Version 1.1, 19 October 2000, Modified to inherit from G4VPrimaryGenerator. -// New name at the request of M. Asai. -// -/////////////////////////////////////////////////////////////////////////////// -// #ifndef G4GeneralParticleSourceMessenger_h #define G4GeneralParticleSourceMessenger_h 1 #include "G4UImessenger.hh" #include "globals.hh" -//#include "UIcmdWithNucleusAndUnit.hh" class G4ParticleTable; class G4UIcommand; @@ -93,14 +92,17 @@ class G4UIcmdWithADouble; class G4UIcmdWithABool; class G4UIcmdWithoutParameter; +class G4SingleParticleSource; class G4GeneralParticleSource; class G4GeneralParticleSourceMessenger: public G4UImessenger { public: - G4GeneralParticleSourceMessenger(G4GeneralParticleSource *fPtclGun); + G4GeneralParticleSourceMessenger(G4GeneralParticleSource*); ~G4GeneralParticleSourceMessenger(); - + + void SetParticleGun(G4SingleParticleSource *fpg) { fParticleGun = fpg; } ; + // To selecte the particle gun to be defined/modified. void SetNewValue(G4UIcommand *command, G4String newValues); // Identifies the command which has been invoked by the user, extracts the // parameters associated with that command (held in newValues), and uses @@ -111,13 +113,42 @@ private: void IonCommand(G4String newValues); private: - G4GeneralParticleSource *fParticleGun; + G4GeneralParticleSource *fGPS; + G4SingleParticleSource *fParticleGun; G4ParticleTable *particleTable; G4String histtype; private: //commands G4UIdirectory *gpsDirectory; - + // multiple source control commands + G4UIdirectory *sourceDirectory; + G4UIcmdWithADouble *addsourceCmd; + G4UIcmdWithoutParameter *listsourceCmd; + G4UIcmdWithoutParameter *clearsourceCmd; + G4UIcmdWithoutParameter *getsourceCmd; + G4UIcmdWithAnInteger *setsourceCmd; + G4UIcmdWithADouble *setintensityCmd; + G4UIcmdWithAnInteger *deletesourceCmd; + // positional commands + G4UIdirectory *positionDirectory; + G4UIcmdWithAString *typeCmd1; + G4UIcmdWithAString *shapeCmd1; + G4UIcmdWith3VectorAndUnit *centreCmd1; + G4UIcmdWith3Vector *posrot1Cmd1; + G4UIcmdWith3Vector *posrot2Cmd1; + G4UIcmdWithADoubleAndUnit *halfxCmd1; + G4UIcmdWithADoubleAndUnit *halfyCmd1; + G4UIcmdWithADoubleAndUnit *halfzCmd1; + G4UIcmdWithADoubleAndUnit *radiusCmd1; + G4UIcmdWithADoubleAndUnit *radius0Cmd1; + G4UIcmdWithADoubleAndUnit *possigmarCmd1; + G4UIcmdWithADoubleAndUnit *possigmaxCmd1; + G4UIcmdWithADoubleAndUnit *possigmayCmd1; + G4UIcmdWithADoubleAndUnit *paralpCmd1; + G4UIcmdWithADoubleAndUnit *partheCmd1; + G4UIcmdWithADoubleAndUnit *parphiCmd1; + G4UIcmdWithAString *confineCmd1; + //old ones, will be reomved soon G4UIcmdWithAString *typeCmd; G4UIcmdWithAString *shapeCmd; G4UIcmdWith3VectorAndUnit *centreCmd; @@ -135,7 +166,21 @@ private: //commands G4UIcmdWithADoubleAndUnit *partheCmd; G4UIcmdWithADoubleAndUnit *parphiCmd; G4UIcmdWithAString *confineCmd; - + // angular commands + G4UIdirectory *angularDirectory; + G4UIcmdWithAString *angtypeCmd1; + G4UIcmdWith3Vector *angrot1Cmd1; + G4UIcmdWith3Vector *angrot2Cmd1; + G4UIcmdWithADoubleAndUnit *minthetaCmd1; + G4UIcmdWithADoubleAndUnit *maxthetaCmd1; + G4UIcmdWithADoubleAndUnit *minphiCmd1; + G4UIcmdWithADoubleAndUnit *maxphiCmd1; + G4UIcmdWithADoubleAndUnit *angsigmarCmd1; + G4UIcmdWithADoubleAndUnit *angsigmaxCmd1; + G4UIcmdWithADoubleAndUnit *angsigmayCmd1; + G4UIcmdWithABool *useuserangaxisCmd1; + G4UIcmdWithABool *surfnormCmd1; + // old ones, will be removed soon G4UIcmdWithAString *angtypeCmd; G4UIcmdWith3Vector *angrot1Cmd; G4UIcmdWith3Vector *angrot2Cmd; @@ -148,7 +193,22 @@ private: //commands G4UIcmdWithADoubleAndUnit *angsigmayCmd; G4UIcmdWithABool *useuserangaxisCmd; G4UIcmdWithABool *surfnormCmd; - + // energy commands + G4UIdirectory *energyDirectory; + G4UIcmdWithAString *energytypeCmd1; + G4UIcmdWithADoubleAndUnit *eminCmd1; + G4UIcmdWithADoubleAndUnit *emaxCmd1; + G4UIcmdWithADoubleAndUnit *monoenergyCmd1; + G4UIcmdWithADoubleAndUnit *engsigmaCmd1; + G4UIcmdWithADouble *alphaCmd1; + G4UIcmdWithADouble *tempCmd1; + G4UIcmdWithADouble *ezeroCmd1; + G4UIcmdWithADouble *gradientCmd1; + G4UIcmdWithADouble *interceptCmd1; + G4UIcmdWithoutParameter *calculateCmd1; + G4UIcmdWithABool *energyspecCmd1; + G4UIcmdWithABool *diffspecCmd1; + // old ones, will be removed soon G4UIcmdWithAString *energytypeCmd; G4UIcmdWithADoubleAndUnit *eminCmd; G4UIcmdWithADoubleAndUnit *emaxCmd; @@ -162,24 +222,28 @@ private: //commands G4UIcmdWithoutParameter *calculateCmd; G4UIcmdWithABool *energyspecCmd; G4UIcmdWithABool *diffspecCmd; - + // histogram commands + G4UIdirectory *histDirectory; G4UIcmdWith3Vector *histpointCmd; G4UIcmdWithAString *histnameCmd; G4UIcmdWithAString *arbintCmd; - G4UIcmdWithAString *resethistCmd; + // old ones, will be removed soon + G4UIcmdWith3Vector *histpointCmd1; + G4UIcmdWithAString *histnameCmd1; + G4UIcmdWithAString *arbintCmd1; + G4UIcmdWithAString *resethistCmd1; + // G4UIcmdWithAnInteger *verbosityCmd; // below are commands from G4ParticleGun G4UIcommand *ionCmd; - G4UIcmdWithAString *particleCmd; G4UIcmdWithADoubleAndUnit *timeCmd; G4UIcmdWith3Vector *polCmd; G4UIcmdWithAnInteger *numberCmd; - G4UIcmdWith3VectorAndUnit *positionCmd; G4UIcmdWith3Vector *directionCmd; G4UIcmdWithADoubleAndUnit *energyCmd; diff --git a/source/event/include/G4HEPEvtParticle.hh b/source/event/include/G4HEPEvtParticle.hh index f52ae1a693..860de53b32 100644 --- a/source/event/include/G4HEPEvtParticle.hh +++ b/source/event/include/G4HEPEvtParticle.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4HEPEvtParticle.hh,v 1.5 2001/07/13 15:01:45 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4HEPEvtParticle.hh,v 1.8 2004/06/11 14:11:15 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -75,7 +75,11 @@ class G4HEPEvtParticle { return JDAHEP2; } }; -extern G4Allocator aHEPEvtParticleAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aHEPEvtParticleAllocator; +#else + extern G4DLLIMPORT G4Allocator aHEPEvtParticleAllocator; +#endif inline void * G4HEPEvtParticle::operator new(size_t) { diff --git a/source/event/include/G4PrimaryParticle.hh b/source/event/include/G4PrimaryParticle.hh index 1840058dcc..6a68f88993 100644 --- a/source/event/include/G4PrimaryParticle.hh +++ b/source/event/include/G4PrimaryParticle.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PrimaryParticle.hh,v 1.11 2003/09/12 21:51:32 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PrimaryParticle.hh,v 1.14 2004/06/11 14:11:16 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -188,7 +188,11 @@ class G4PrimaryParticle } }; -extern G4Allocator aPrimaryParticleAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aPrimaryParticleAllocator; +#else + extern G4DLLIMPORT G4Allocator aPrimaryParticleAllocator; +#endif inline void * G4PrimaryParticle::operator new(size_t) { diff --git a/source/event/include/G4PrimaryVertex.hh b/source/event/include/G4PrimaryVertex.hh index 79678fd098..6e24231c73 100644 --- a/source/event/include/G4PrimaryVertex.hh +++ b/source/event/include/G4PrimaryVertex.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PrimaryVertex.hh,v 1.8 2003/09/12 21:51:32 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PrimaryVertex.hh,v 1.11 2004/06/11 14:11:17 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -139,7 +139,11 @@ class G4PrimaryVertex { return userInfo; } }; -extern G4Allocator aPrimaryVertexAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aPrimaryVertexAllocator; +#else + extern G4DLLIMPORT G4Allocator aPrimaryVertexAllocator; +#endif inline void * G4PrimaryVertex::operator new(size_t) { diff --git a/source/event/include/G4SPSAngDistribution.hh b/source/event/include/G4SPSAngDistribution.hh new file mode 100644 index 0000000000..2dc08f09e7 --- /dev/null +++ b/source/event/include/G4SPSAngDistribution.hh @@ -0,0 +1,223 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSAngDistribution.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +// Class Description: +// +// To generate the direction of a primary vertex according to the defined distribution +// +/////////////////////////////////////////////////////////////////////////////// +// +// MEMBER FUNCTIONS +// ---------------- +// +// G4SPSAngDistribution () +// Constructor: Initializes variables +// +// ~G4SPSAngDistribution () +// Destructor: +// +// void SetAngDistType(G4String) +// Used to set the type of angular distribution wanted. Arguments +// are iso, cos, beam and user for isotropic, cosine-law, beam and user-defined +// respectively. +// +// void DefineAngRefAxes(G4String, G4ThreeVector) +// DefineAngRefAxes is used in a similar way as SetPosRot to +// define vectors, one x' and one in the plane x'y', to create +// a rotated set of axes for the angular distribution. +// +// void SetMinTheta(G4double) +// Sets the minimum value for the angle theta. +// +// void SetMinPhi(G4double) +// Sets the minimum value for phi. +// +// void SetMaxTheta(G4double) +// Sets the maximum value for theta. +// +// void SetMaxPhi(G4double) +// Sets the maximum value for phi. +// +// void UserDefAngTheta(G4ThreeVector) +// This method allows the user to define a histogram in Theta. +// +// void UserDefAngPhi(G4ThreeVector) +// This method allows the user to define a histogram in phi. +// +// void GenerateIsotropicFlux() +// This method generates momentum vectors for particles according +// to an isotropic distribution. +// +// void GenerateCosineLawFlux() +// This method generates momentum vectors for particles according +// to a cosine-law distribution. +// +// void GenerateUserDefFlux() +// Controls generation of momentum vectors according to user-defined +// distributions. +// +// G4double GenerateUserDefTheta() +// Generates the theta angle according to a user-defined distribution. +// +// G4double GenerateUserDefPhi() +// Generates phi according to a user-defined distribution. +// +// void SetBeamSigmaInAngR(G4double); +// Sets the sigma for 1D beam +// +// void SetBeamSigmaInAngX(G4double); +// Sets the first sigma for 2D beam +// +// void SetBeamSigmaInAngY(G4double); +// Sets the second sigma for 2D beam +// +// void SetUserWRTSurface(G4bool) +// Allows user to have user-defined spectra either with respect to the +// co-ordinate system (default) or with respect to the surface normal. +// +// void SetPosDistribution(G4SPSPosDistribution* a) {posDist = a; }; +// Sets the required position generator, required for determining the cosine-law distribution +// +// void SetBiasRndm (G4SPSRandomGenerator* a) +// Sets the biased random number generator +// +// G4ThreeVector GenerateOne(); +// Generate one random direction +// +// void ReSetHist(G4String); +// Re-sets the histogram for user defined distribution +// +// void SetVerbosity(G4int) +// Sets the verbosity level. +// +/////////////////////////////////////////////////////////////////////////////// +// +#ifndef G4SPSAngDistribution_h +#define G4SPSAngDistribution_h 1 + +#include "G4PhysicsOrderedFreeVector.hh" +#include "G4DataInterpolation.hh" +#include "G4ParticleMomentum.hh" + +#include "G4SPSPosDistribution.hh" +#include "G4SPSRandomGenerator.hh" + +class G4SPSAngDistribution +{ +public: + G4SPSAngDistribution (); + ~G4SPSAngDistribution (); + + // Angular Distribution Methods + void SetAngDistType(G4String); + void DefineAngRefAxes(G4String, G4ThreeVector); + void SetMinTheta(G4double); + void SetMinPhi(G4double); + void SetMaxTheta(G4double); + void SetMaxPhi(G4double); + void SetBeamSigmaInAngR(G4double); + void SetBeamSigmaInAngX(G4double); + void SetBeamSigmaInAngY(G4double); + void UserDefAngTheta(G4ThreeVector); + void UserDefAngPhi(G4ThreeVector); + inline void SetParticleMomentumDirection + (G4ParticleMomentum aMomentumDirection) + { particle_momentum_direction = aMomentumDirection.unit(); } + void SetUseUserAngAxis(G4bool); + void SetUserWRTSurface(G4bool); + // + void SetPosDistribution(G4SPSPosDistribution* a) {posDist = a; }; + void SetBiasRndm(G4SPSRandomGenerator* a) {angRndm = a;}; + // method to re-set the histograms + void ReSetHist(G4String); + // + // Set the verbosity level. + void SetVerbosity(G4int a) {verbosityLevel = a; } ; + // + G4ParticleMomentum GenerateOne(); + +private: + // These methods generate the momentum vectors for the particles. + void GenerateIsotropicFlux(); + void GenerateCosineLawFlux(); + void GenerateBeamFlux(); + void GeneratePlanarFlux(); + void GenerateUserDefFlux(); + G4double GenerateUserDefTheta(); + G4double GenerateUserDefPhi(); + +private: + + // Angular distribution variables. + G4String AngDistType; // String to hold Ang dist type iso, cos, user + G4ThreeVector AngRef1, AngRef2, AngRef3; // Reference axes for ang dist + G4double MinTheta, MaxTheta, MinPhi, MaxPhi; // min/max theta/phi + G4double DR,DX,DY ; // Standard deviations for beam divergence + G4double Theta, Phi; // Store these for use with DEBUG + G4bool IPDFThetaExist, IPDFPhiExist; // tell whether IPDF histos exist + G4PhysicsOrderedFreeVector UDefThetaH; // Theta histo data + G4PhysicsOrderedFreeVector IPDFThetaH; //Cumulative Theta histogram. + G4PhysicsOrderedFreeVector UDefPhiH; // Phi histo bins + G4PhysicsOrderedFreeVector IPDFPhiH; // Cumulative phi histogram. + G4String UserDistType; //String to hold user distributions + G4bool UserWRTSurface; // G4bool to tell whether user wants distribution wrt + // surface normals or co-ordinate system + G4bool UserAngRef; // Set to true when user defines a new coordinates + // + G4ParticleMomentum particle_momentum_direction; + // + G4SPSPosDistribution* posDist; // need it here for the cosine-law distri + G4SPSRandomGenerator* angRndm; // biased random generator + + // Verbosity + G4int verbosityLevel; + // + G4PhysicsOrderedFreeVector ZeroPhysVector ; // for re-set only +}; + +#endif + + + + diff --git a/source/event/include/G4SPSEneDistribution.hh b/source/event/include/G4SPSEneDistribution.hh new file mode 100644 index 0000000000..3229108832 --- /dev/null +++ b/source/event/include/G4SPSEneDistribution.hh @@ -0,0 +1,251 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSEneDistribution.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +// +// Class Description: +// +// To generate the energy of a primary vertex according to the defined distribution +// +/////////////////////////////////////////////////////////////////////////////// +// +// MEMBER FUNCTIONS +// ---------------- +// +// G4SPSEneDistribution () +// Constructor: Initializes variables +// +// ~G4SPSEneDistribution () +// Destructor: +// +// void SetEnergyDisType(G4String) +// Allows the user to choose the energy distribution type. The arguments +// are Mono (mono-energetic), Lin (linear), Pow (power-law), Exp +// (exponential), Gauss (gaussian), Brem (bremsstrahlung), BBody (black-body), Cdg +// (cosmic diffuse gamma-ray), User (user-defined), Arb (arbitrary +// point-wise), Epn (energy per nucleon). +// +// void SetEmin(G4double) +// Sets the minimum energy. +// +// void SetEmax(G4double) +// Sets the maximum energy. +// +// void SetMonoEnergy(G4double) +// Sets energy for mono-energetic distribution. +// +// void SetAlpha(G4double) +// Sets alpha for a power-law distribution. +// +// void SetTemp(G4double) +// Sets Temperature for a Brem or BBody distributions. +// +// void SetEzero(G4double) +// Sets Ezero for an exponential distribution. +// +// void SetGradient(G4double) +// Sets gradient for a linear distribution. +// +// void SetInterCept(G4double) +// Sets intercept for a linear distribution. +// +// void UserEnergyHisto(G4ThreeVector) +// Allows user to defined a histogram for the energy distribution. +// +// void ArbEnergyHisto(G4ThreeVector) +// Allows the user to define an Arbitrary set of points for the +// energy distribution. +// +// void EpnEnergyHisto(G4ThreeVector) +// Allows the user to define an Energy per nucleon histogram. +// +// void Calculate() +// Controls the calculation of Integral PDF for the Cdg and BBody +// distributions. +// +// void InputEnergySpectra(G4bool) +// Allows the user to choose between momentum and energy histograms +// for user-defined histograms and arbitrary point-wise spectr. +// The default is true (energy). +// +// void InputDifferentialSpectra(G4bool) +// Allows the user to choose between integral and differential +// distributions when using the arbitrary point-wise option. +// +// void ArbInterpolate(G4String) +// ArbInterpolate allows the user to specify the type of function to +// interpolate the Arbitrary points spectrum with. +// +// void SetBiasRndm (G4SPSRandomGenerator* a) +// Sets the biased random number generator +// +// G4double GenerateOne(G4ParticleDefinition*); +// Generate one random energy for the specified particle +// +// void ReSetHist(G4String); +// Re-sets the histogram for user defined distribution +// +// void SetVerbosity(G4int) +// Sets the verbosity level. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef G4SPSEneDistribution_h +#define G4SPSEneDistribution_h 1 + +#include "G4PhysicsOrderedFreeVector.hh" +#include "G4ParticleMomentum.hh" +#include "G4ParticleDefinition.hh" +#include "G4DataInterpolation.hh" + +// +#include "G4SPSRandomGenerator.hh" + +class G4SPSEneDistribution +{ +public: + G4SPSEneDistribution (); + ~G4SPSEneDistribution (); + + void SetEnergyDisType(G4String); + inline G4String GetEnergyDisType() {return EnergyDisType;}; + void SetEmin(G4double); + inline G4double GetEmin() {return Emin;} ; + inline G4double GetArbEmin() {return ArbEmin;} ; + void SetEmax(G4double); + inline G4double GetEmax() {return Emax;} ; + inline G4double GetArbEmax() {return ArbEmax;}; + void SetMonoEnergy(G4double); + void SetAlpha(G4double); + void SetTemp(G4double); + void SetBeamSigmaInE(G4double); + void SetEzero(G4double); + void SetGradient(G4double); + void SetInterCept(G4double); + void UserEnergyHisto(G4ThreeVector); + void ArbEnergyHisto(G4ThreeVector); + void EpnEnergyHisto(G4ThreeVector); + + void InputEnergySpectra(G4bool); + void InputDifferentialSpectra(G4bool); + void ArbInterpolate(G4String); + inline G4String GetIntType() {return IntType;}; + void Calculate(); + // + void SetBiasRndm(G4SPSRandomGenerator* a) {eneRndm = a; }; + // method to re-set the histograms + void ReSetHist(G4String); + // Set the verbosity level. + void SetVerbosity(G4int a) {verbosityLevel = a; } ; + //x + G4double GenerateOne(G4ParticleDefinition*); + +private: + void LinearInterpolation(); + void LogInterpolation(); + void ExpInterpolation(); + void SplineInterpolation(); + void CalculateCdgSpectrum(); + void CalculateBbodySpectrum(); + + // The following methods generate energies according to the spectral + // parameters defined above. + void GenerateMonoEnergetic(); + void GenerateLinearEnergies(G4bool); + void GeneratePowEnergies(G4bool); + void GenerateExpEnergies(G4bool ); + void GenerateGaussEnergies(); + void GenerateBremEnergies(); + void GenerateBbodyEnergies(); + void GenerateCdgEnergies(); + void GenUserHistEnergies(); + void GenEpnHistEnergies(); + void GenArbPointEnergies(); + // converts energy per nucleon to energy. + void ConvertEPNToEnergy(); + +private: + + G4String EnergyDisType; // energy dis type Variable - Mono,Lin,Exp,etc + G4double MonoEnergy; //Mono-energteic energy + G4double SE ; // Standard deviation for Gaussion distrbution in energy + G4double Emin, Emax; // emin and emax + G4double alpha, Ezero, Temp; // alpha (pow), E0 (exp) and Temp (bbody,brem) + G4double grad, cept; // gradient and intercept for linear spectra + G4bool EnergySpec; // true - energy spectra, false - momentum spectra + G4bool DiffSpec; // true - differential spec, false integral spec + G4bool ApplyRig; // false no rigidity cutoff, true then apply one + G4double ERig; // energy of rigidity cutoff + G4PhysicsOrderedFreeVector UDefEnergyH; // energy hist data + G4PhysicsOrderedFreeVector IPDFEnergyH; + G4bool IPDFEnergyExist, IPDFArbExist, Epnflag; + G4PhysicsOrderedFreeVector ArbEnergyH; // Arb x,y histogram + G4PhysicsOrderedFreeVector IPDFArbEnergyH; // IPDF for Arb + G4PhysicsOrderedFreeVector EpnEnergyH; + G4double CDGhist[3]; // cumulative histo for cdg + G4double BBHist[10001], Bbody_x[10001]; + G4String IntType; // Interpolation type + G4double Arb_grad[1024], Arb_cept[1024]; // grad and cept for 1024 segments + G4double Arb_alpha[1024], Arb_Const[1024]; // alpha and constants + G4double Arb_ezero[1024]; // ezero + G4double ArbEmin, ArbEmax; // Emin and Emax for the whole arb distribution used primarily for debug. + + G4double particle_energy; + G4ParticleDefinition* particle_definition; + + G4SPSRandomGenerator* eneRndm; + + // Verbosity + G4int verbosityLevel; + + G4PhysicsOrderedFreeVector ZeroPhysVector ; // for re-set only + + G4DataInterpolation *SplineInt; // holds Spline stuff + +}; + + +#endif + + + + diff --git a/source/event/include/G4SPSPosDistribution.hh b/source/event/include/G4SPSPosDistribution.hh new file mode 100644 index 0000000000..47308d81e4 --- /dev/null +++ b/source/event/include/G4SPSPosDistribution.hh @@ -0,0 +1,218 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSPosDistribution.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +// +// Class Description: +// +// To generate the position of a primary vertex according to the defined distribution +// +/////////////////////////////////////////////////////////////////////////////// +// +// MEMBER FUNCTIONS +// ---------------- +// +// G4SPSPosDistribution () +// Constructor: Initializes variables and instantiates the Navigator class +// +// ~G4SPSPosDistribution () +// Destructor: +// +// void SetPosDisType(G4String) +// Allows user to choose Point, Plane, Surface or Volume source +// position distributions. +// +// void SetPosDisShape(G4String) +// Allows the user to choose the particular shape they wish for the +// position distribution. Choices are Square, Circle, Ellipse, Rectangle, +// Sphere, Ellipsoid, Cylinder, Parallelepiped. +// +// void SetCentreCoords(G4ThreeVector) +// Sets the co-ordinates of the centre of the position distribution. +// +// void SetPosRot1(G4ThreeVector) +// Used to specify the co-ordinate system for the position distribution +// along with SetPosRot2. SetPosRot1 sets the vector x' and need not be +// a unit vector. +// +// void SetPosRot2(G4ThreeVector) +// Used in connection with SetPosRot1. This sets a vector in the plane +// x'y'. By a series of cross products x', y', z' are generated. Again +// need not be a unit vector. +// +// void SetHalfX(G4double) +// Sets the half length in x. +// +// void SetHalfY(G4double) +// Sets the half length in y. +// +// void SetHalfZ(G4double) +// Sets the half length in z. +// +// void SetRadius(G4double) +// Sets the radius where appropriate for source distribution shapes. +// +// void SetRadius0(G4double) +// Sets the inner radius where appropriate for source distribution shapes. +// +// void SetBeamSigmaInR(G4double); +// Sets the sigma for 1D beam +// +// void SetBeamSigmaInX(G4double); +// Sets the first sigma for 2D beam +// +// void SetBeamSigmaInY(G4double); +// Sets the second sigma for 2D beam +// +// void SetParAlpha(G4double) +// Sets the angle Alpha in the Parallelepiped shapes. +// +// void SetParTheta(G4double) +// Sets the angle Theta in the Parallelepiped shapes. +// +// void SetParPhi(G4double) +// Sets the angle Phi in the Parallelepiped shapes. +// +// void ConfineSourceToVolume(G4String) +// Used to confine the start positions to a particular volume. +// +// void SetBiasRndm (G4SPSRandomGenerator* a) { posRndm = a ; }; +// Sets the biased random number generator +// +// G4ThreeVector GenerateOne(); +// Generate one random position +// +// void SetVerbosity(G4int) +// Sets the verbosity level. +// +/////////////////////////////////////////////////////////////////////////////// +// +#ifndef G4SPSPosDistribution_h +#define G4SPSPosDistribution_h 1 + +#include "G4Navigator.hh" +#include "G4SPSRandomGenerator.hh" + +class G4SPSPosDistribution +{ + // + friend class G4SPSAngDistribution; +public: + G4SPSPosDistribution (); + ~G4SPSPosDistribution (); + + // methods to create source position dist. + void SetPosDisType(G4String); // Point, Plane, Surface, Volume + inline G4String GetPosDisType() { return SourcePosType; }; + void SetPosDisShape(G4String); + inline G4String GetPosDisShape() { return Shape; }; + // SetPosDisShape - Square, Circle, Annulus, Ellipse, Rectangle, Sphere, + // Ellipsoid, Cylinder, Right (parallelepiped). + void SetCentreCoords(G4ThreeVector); + inline G4ThreeVector GetCentreCoords() { return CentreCoords; } ; + void SetPosRot1(G4ThreeVector); + void SetPosRot2(G4ThreeVector); + void SetHalfX(G4double); + inline G4double GetHalfX() { return halfx; } ; + void SetHalfY(G4double); + inline G4double GetHalfY() { return halfy; } ; + void SetHalfZ(G4double); + inline G4double GetHalfZ() { return halfz; } ; + void SetRadius(G4double); + inline G4double GetRadius() { return Radius; }; + void SetRadius0(G4double); + void SetBeamSigmaInR(G4double); + void SetBeamSigmaInX(G4double); + void SetBeamSigmaInY(G4double); + void SetParAlpha(G4double); + void SetParTheta(G4double); + void SetParPhi(G4double); + void ConfineSourceToVolume(G4String); + // + void SetBiasRndm (G4SPSRandomGenerator* a) { posRndm = a ; }; + // Set the verbosity level. + void SetVerbosity(G4int a) {verbosityLevel = a; } ; + // + G4ThreeVector GenerateOne(); + +private: + + void GenerateRotationMatrices(); + // the following routines generate the source position + void GeneratePointSource(); + void GeneratePointsInBeam(); + void GeneratePointsInPlane(); + void GeneratePointsOnSurface(); + void GeneratePointsInVolume(); + + G4bool IsSourceConfined(); + +private: + + // Position distribution Variables + G4String SourcePosType; //Point,Plane,Surface,Volume + G4String Shape; //Circle,Square,Rectangle etc.. + G4double halfx, halfy, halfz; //half lengths + G4double Radius; //Radius for circles or spheres + G4double Radius0; // The inner radius of an annulus + G4double SR,SX,SY; // Standard deviation in raduial, x, y for beam type source + G4ThreeVector CentreCoords; // Coords of centre of input shape + G4ThreeVector Rotx, Roty, Rotz; // Unit vectors defining rotation matrix + G4double ParAlpha, ParTheta, ParPhi; //Angle for Right Parallellepipeds + G4bool Confine; //If true confines source distribution to VolName + G4String VolName; + G4ThreeVector SideRefVec1,SideRefVec2,SideRefVec3; //Side rotation matrices + G4ThreeVector particle_position; // the final particle position to be returned + // + G4Navigator *gNavigator; + // + G4SPSRandomGenerator* posRndm; // biased random generator + // Verbosity + G4int verbosityLevel; + +}; + +#endif + + + + diff --git a/source/event/include/G4SPSRandomGenerator.hh b/source/event/include/G4SPSRandomGenerator.hh new file mode 100644 index 0000000000..9a8302f33f --- /dev/null +++ b/source/event/include/G4SPSRandomGenerator.hh @@ -0,0 +1,187 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSRandomGenerator.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +// Class Description: +// +// Special random number generator used by G4GeneralParticleSource to allow +// biasing applied at the lowest level for all distributions. +// +/////////////////////////////////////////////////////////////////////////////// +// +// MEMBER FUNCTIONS +// ---------------- +// +// G4SPSRandomGenerator () +// Constructor: Initializes variables +// +// ~G4SPSRandomGenerator () +// Destructor: +// +// void SetXBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate x co-ordinates. +// +// void SetYBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate y co-ordinates. +// +// void SetZBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate z co-ordinates. +// +// void SetThetaBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate values of theta. +// +// void SetPhiBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate values of phi. +// +// void SetEnergyBias(G4ThreeVector) +// Allows the user to re-distribute the random +// numbers used to generate the energies. +// +// G4double GenRandX() +// Generates the random number for x, with or without biasing. +// +// G4double GenRandY() +// Generates the random number for y, with or without biasing. +// +// G4double GenRandZ() +// Generates the random number for z, with or without biasing. +// +// G4double GenRandTheta() +// Generates the random number for theta, with or without biasing. +// +// G4double GenRandPhi() +// Generates the random number for phi, with or without biasing. +// +// G4double GenRandEnergy() +// Generates the random number for energy, with or without biasing. +// +// inline G4double GetBiasWeight() +// Returns the weight change after biasing +// +// void ReSetHist(G4String); +// Re-sets the histogram for user defined distribution +// +// void SetVerbosity(G4int) +// Sets the verbosity level. +// +/////////////////////////////////////////////////////////////////////////////// +// +#ifndef G4SPSRandomGenerator_h +#define G4SPSRandomGenerator_h 1 + +#include "G4PhysicsOrderedFreeVector.hh" +#include "G4DataInterpolation.hh" + +class G4SPSRandomGenerator +{ +public: + G4SPSRandomGenerator (); + ~G4SPSRandomGenerator (); + + // static G4SPSRandomGenerator* getInstance (); + + // Biasing Methods + void SetXBias(G4ThreeVector); + void SetYBias(G4ThreeVector); + void SetZBias(G4ThreeVector); + void SetThetaBias(G4ThreeVector); + void SetPhiBias(G4ThreeVector); + void SetEnergyBias(G4ThreeVector); + G4double GenRandX(); + G4double GenRandY(); + G4double GenRandZ(); + G4double GenRandTheta(); + G4double GenRandPhi(); + G4double GenRandEnergy(); + + inline G4double GetBiasWeight() + { return bweights[0]*bweights[1]*bweights[2]*bweights[3]*bweights[4]*bweights[5];}; + + // method to re-set the histograms + void ReSetHist(G4String); + + // Set the verbosity level. + void SetVerbosity(G4int a) {verbosityLevel = a; } ; + +private: + + // static G4SPSRandomGenerator *instance; + + G4bool XBias, IPDFXBias; + G4PhysicsOrderedFreeVector XBiasH; + G4PhysicsOrderedFreeVector IPDFXBiasH; + G4bool YBias, IPDFYBias; + G4PhysicsOrderedFreeVector YBiasH; + G4PhysicsOrderedFreeVector IPDFYBiasH; + G4bool ZBias, IPDFZBias; + G4PhysicsOrderedFreeVector ZBiasH; + G4PhysicsOrderedFreeVector IPDFZBiasH; + G4bool ThetaBias, IPDFThetaBias; + G4PhysicsOrderedFreeVector ThetaBiasH; + G4PhysicsOrderedFreeVector IPDFThetaBiasH; + G4bool PhiBias, IPDFPhiBias; + G4PhysicsOrderedFreeVector PhiBiasH; + G4PhysicsOrderedFreeVector IPDFPhiBiasH; + G4bool EnergyBias, IPDFEnergyBias; + G4PhysicsOrderedFreeVector EnergyBiasH; + G4PhysicsOrderedFreeVector IPDFEnergyBiasH; + + G4double bweights[6]; //record x,y,z,theta,phi,energy weights + + // Verbosity + G4int verbosityLevel; + + G4PhysicsOrderedFreeVector ZeroPhysVector ; // for re-set only + +}; + + +#endif + + + + diff --git a/source/event/include/G4SingleParticleSource.hh b/source/event/include/G4SingleParticleSource.hh new file mode 100644 index 0000000000..5d15d55c6e --- /dev/null +++ b/source/event/include/G4SingleParticleSource.hh @@ -0,0 +1,184 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SingleParticleSource.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +// Class Description: +// +// The Single Particle Source is designed to extend the functionality of the +// G4ParticleGun class. It is designed to allow specification of input +// particles in terms of position, direction (or angular) and energy +// distributions. It is used by the General Particle source class +// and it is derived from G4VPrimaryGenerator. +// +/////////////////////////////////////////////////////////////////////////////// +// +// MEMBER FUNCTIONS +// ---------------- +// +// G4SingleParticleSource () +// Constructor: Initializes variables and instantiates the +// Messenger and Navigator classes +// +// ~G4SingleParticleSource () +// Destructor: deletes Messenger and prints out run information. +// +// void GeneratePrimaryVertex(G4Event *evt) +// Generate the particles initial parameters. +// +// G4SPSPosDistribution* GetPosDist() +// Return a pointer to the position distribution generator +// +// G4SPSAngDistribution* GetAngDist() +// Return a pointer to the angular distribution generator +// +// G4SPSEneDistribution* GetEneDist() +// Return a pointer to the energy distribution generator +// +// G4SPSRandomGenerator* GetBiasRndm() {return biasRndm;}; +// Return a pointer to the biased random number generator +// +// void SetVerbosity(G4int); +// Set the verbosity level. +// +// void SetParticleDefinition (); +// G4ParticleDefinition * GetParticleDefinition () +// Get/Set the particle definition of the primary track +// +// void SetParticleCharge(G4double aCharge) +// set the charge state of the primary track +// +// inline void SetParticlePolarization (G4ThreeVector aVal) +// inline G4ThreeVector GetParticlePolarization () +// Set/Get the polarization state of the primary track +// +// inline void SetParticleTime(G4double aTime) { particle_time = aTime; }; +// inline G4double GetParticleTime() { return particle_time; }; +// Set/Get the Time. +// +// inline void SetNumberOfParticles(G4int i) +// inline G4int GetNumberOfParticles() +// set/get the number of particles to be generated in the primary track +// +// inline G4ThreeVector GetParticlePosition() +// inline G4ThreeVector GetParticleMomentumDirection() +// inline G4double GetParticleEnergy() +// get the position, direction, and energy of the current particle +// +/////////////////////////////////////////////////////////////////////////////// +// +#ifndef G4SingleParticleSource_h +#define G4SingleParticleSource_h 1 + +#include "G4VPrimaryGenerator.hh" +#include "G4ParticleMomentum.hh" +#include "G4ParticleDefinition.hh" +// +#include "G4SPSPosDistribution.hh" +#include "G4SPSAngDistribution.hh" +#include "G4SPSEneDistribution.hh" +#include "G4SPSRandomGenerator.hh" + +class G4SingleParticleSource : public G4VPrimaryGenerator +{ +public: + G4SingleParticleSource (); + ~G4SingleParticleSource (); + void GeneratePrimaryVertex(G4Event *evt); + // + G4SPSPosDistribution* GetPosDist() {return posGenerator;}; + G4SPSAngDistribution* GetAngDist() {return angGenerator;}; + G4SPSEneDistribution* GetEneDist() {return eneGenerator;}; + G4SPSRandomGenerator* GetBiasRndm() {return biasRndm;}; + + // Set the verbosity level. + void SetVerbosity(G4int); + + // Set the particle species + void SetParticleDefinition (G4ParticleDefinition * aParticleDefinition); + inline G4ParticleDefinition * GetParticleDefinition () { return particle_definition;} ; + + inline void SetParticleCharge(G4double aCharge) { particle_charge = aCharge; } ; + + // Set polarization + inline void SetParticlePolarization (G4ThreeVector aVal) {particle_polarization = aVal;}; + inline G4ThreeVector GetParticlePolarization () {return particle_polarization;}; + + // Set Time. + inline void SetParticleTime(G4double aTime) { particle_time = aTime; }; + inline G4double GetParticleTime() { return particle_time; }; + + inline void SetNumberOfParticles(G4int i) { NumberOfParticlesToBeGenerated = i; }; + // + inline G4int GetNumberOfParticles() { return NumberOfParticlesToBeGenerated; }; + inline G4ThreeVector GetParticlePosition() { return particle_position;}; + inline G4ThreeVector GetParticleMomentumDirection() { return particle_momentum_direction;}; + inline G4double GetParticleEnergy() {return particle_energy;}; + +private: + + G4SPSPosDistribution* posGenerator; + G4SPSAngDistribution* angGenerator; + G4SPSEneDistribution* eneGenerator; + G4SPSRandomGenerator* biasRndm; + // + // Other particle properties + G4int NumberOfParticlesToBeGenerated; + G4ParticleDefinition * particle_definition; + G4ParticleMomentum particle_momentum_direction; + G4double particle_energy; + G4double particle_charge; + G4ThreeVector particle_position; + G4double particle_time; + G4ThreeVector particle_polarization; + G4double particle_weight; + + // Verbosity + G4int verbosityLevel; + +}; + + +#endif + + + + diff --git a/source/event/include/G4StackedTrack.hh b/source/event/include/G4StackedTrack.hh index 3bce6795dd..9e6ec4520f 100644 --- a/source/event/include/G4StackedTrack.hh +++ b/source/event/include/G4StackedTrack.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4StackedTrack.hh,v 1.6 2001/07/13 15:01:47 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4StackedTrack.hh,v 1.9 2004/06/11 14:11:17 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Last Modification : 02/Feb/96 M.Asai @@ -83,7 +83,11 @@ class G4StackedTrack { nextStackedTrack = value; } }; -extern G4Allocator aStackedTrackAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aStackedTrackAllocator; +#else + extern G4DLLIMPORT G4Allocator aStackedTrackAllocator; +#endif inline void * G4StackedTrack::operator new(size_t) { diff --git a/source/event/include/G4TrajectoryContainer.hh b/source/event/include/G4TrajectoryContainer.hh index 1752d5ef0c..e9fe720bd5 100644 --- a/source/event/include/G4TrajectoryContainer.hh +++ b/source/event/include/G4TrajectoryContainer.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TrajectoryContainer.hh,v 1.11 2003/06/16 16:50:31 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4TrajectoryContainer.hh,v 1.14 2004/06/11 14:11:17 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // G4TrajectoryContainer @@ -73,8 +73,11 @@ class G4TrajectoryContainer TrajectoryVector* vect; }; - -extern G4Allocator aTrajectoryContainerAllocator; +#if defined G4EVENT_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aTrajectoryContainerAllocator; +#else + extern G4DLLIMPORT G4Allocator aTrajectoryContainerAllocator; +#endif inline void* G4TrajectoryContainer::operator new(size_t) { diff --git a/source/event/src/G4Event.cc b/source/event/src/G4Event.cc index 4b18075649..87162d05b4 100644 --- a/source/event/src/G4Event.cc +++ b/source/event/src/G4Event.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Event.cc,v 1.6 2003/09/09 20:09:18 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4Event.cc,v 1.8 2004/06/11 14:11:18 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G4Event diff --git a/source/event/src/G4EventManager.cc b/source/event/src/G4EventManager.cc index b783b10e52..edc1612d1b 100644 --- a/source/event/src/G4EventManager.cc +++ b/source/event/src/G4EventManager.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4EventManager.cc,v 1.19 2004/03/16 00:04:30 asaim Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4EventManager.cc,v 1.20 2004/05/26 17:08:33 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // @@ -46,7 +46,7 @@ G4EventManager* G4EventManager::GetEventManager() G4EventManager::G4EventManager() :currentEvent(0),trajectoryContainer(0), - verboseLevel(0),tracking(false) + verboseLevel(0),tracking(false),abortRequested(false) { if(fpEventManager) { @@ -145,7 +145,8 @@ void G4EventManager::DoProcessing(G4Event* anEvent) } #endif - StackTracks( transformer->GimmePrimaries( currentEvent, trackIDCounter ),true ); + if(!abortRequested) + { StackTracks( transformer->GimmePrimaries( currentEvent, trackIDCounter ),true ); } #ifdef G4VERBOSE if ( verboseLevel > 0 ) @@ -252,6 +253,7 @@ void G4EventManager::DoProcessing(G4Event* anEvent) currentEvent = 0; stateManager->SetNewState(G4State_GeomClosed); + abortRequested = false; } void G4EventManager::StackTracks(G4TrackVector *trackVector,G4bool IDhasAlreadySet) diff --git a/source/event/src/G4GeneralParticleSource.cc b/source/event/src/G4GeneralParticleSource.cc index 2032099e44..4b429c6588 100644 --- a/source/event/src/G4GeneralParticleSource.cc +++ b/source/event/src/G4GeneralParticleSource.cc @@ -24,3507 +24,149 @@ // // MODULE: G4GeneralParticleSource.cc // -// Version: 1.1 -// Date: 18/10/00 -// Author: C Ferguson, F Lei, P Truscott -// Organisation: University of Southampton / DERA +// Version: 2.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. // Customer: ESA/ESTEC // -// Documentation avaialable at http://www.space.dera.gov.uk/space_env/gspm.html +// Documentation avaialable at http://reat.space.qinetiq.com/gps // These include: // User Requirement Document (URD) // Software Specification Documents (SSD) -// Software User Manual (SUM) +// Software User Manual (SUM): on-line version available // Technical Note (TN) on the physics and algorithms // /////////////////////////////////////////////////////////////////////////////// -// $Id: G4GeneralParticleSource.cc,v 1.15 2003/10/13 09:21:27 flei Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ -/////////////////////////////////////////////////////////////////////////////// // // CHANGE HISTORY // -------------- -// Further changes is recorded in the CVS HIstory file // -// 9-May-2001 F. Lei -// added all the g4pariclegun commands +// Version 2.0, 05/02/2004, Fan Lei, Created. +// After changes to version 1.1 as in Geant4 v6.0 +// - Mutilple particle source definition +// - Re-structured commands +// - Split the task into smaller classes // -// 26-01-2001, F. Lei -// replace: -// posphi = acos(tx/sin(posthe)); -// -// with: -// if (posthe != 0. && posthe != pi) -// posphi = acos(tx/sin(posthe)); -// else -// posphi = 0.0; -// +// - old commonds have been retained for backward compatibility, will be +// removed in the future. // -// 10-Nov-2000, F. Lei -// some bug fixing: -// i) dclared ' G4int count' in all ****Interpolation functions -// ii) added ' return (0.) ' to GenerateUserDefTheta and GenerateUserDefPhi -// as default. -// -// 09-Nov-2000, F Lei -// Changed to a fast implementation for generating iso and cos angular directions -// -// Version 1.1, 18 October 2000, Modified to inherit from G4VPrimaryGenerator. -// New name at the request of M. Asai. -// -// -// Version 1.0, 28 February 2000, C Ferguson, Created. // /////////////////////////////////////////////////////////////////////////////// // -#include "G4PrimaryParticle.hh" #include "G4Event.hh" #include "Randomize.hh" -#include -#include "G4TransportationManager.hh" -#include "G4VPhysicalVolume.hh" -#include "G4PhysicalVolumeStore.hh" -#include "G4ParticleTable.hh" -#include "G4ParticleDefinition.hh" -#include "G4IonTable.hh" -#include "G4Ions.hh" -#include "G4TrackingManager.hh" -#include "G4Track.hh" #include "G4GeneralParticleSource.hh" G4GeneralParticleSource::G4GeneralParticleSource() { - // Initialise all variables - // Position distribution Variables - - NumberOfParticlesToBeGenerated = 1; - particle_definition = NULL; - G4ThreeVector zero; - particle_momentum_direction = G4ParticleMomentum(1,0,0); - particle_energy = 1.0*MeV; - particle_position = zero; - particle_time = 0.0; - particle_polarization = zero; - particle_charge = 0.0; - - SourcePosType = "Point"; - Shape = "NULL"; - halfx = 0.; - halfy = 0.; - halfz = 0.; - Radius = 0.; - Radius0 = 0.; - SR = 0.; - SX = 0.; - SY = 0.; - ParAlpha = 0.; - ParTheta = 0.; - ParPhi = 0.; - CentreCoords = G4ThreeVector(0., 0., 0.); - Rotx = HepXHat; - Roty = HepYHat; - Rotz = HepZHat; - Confine = false; //If true confines source distribution to VolName - VolName = "NULL"; - SideRefVec1 = HepXHat; // x-axis - SideRefVec2 = HepYHat; // y-axis - SideRefVec3 = HepZHat; // z-axis - - // Angular distribution variables. - AngDistType = "planar"; - AngRef1 = HepXHat; - AngRef2 = HepYHat; - AngRef3 = HepZHat; - MinTheta = 0.; - MaxTheta = pi; - MinPhi = 0.; - MaxPhi = twopi; - DR = 0.; - DX = 0.; - DY = 0.; - UserDistType = "NULL"; - IPDFThetaExist = false; - IPDFPhiExist = false; - - // Energy Distribution variables - EnergyDisType = "Mono"; - MonoEnergy = 1*MeV; - Emin = 0.; - Emax = 0.; - alpha = 0.; - Ezero = 0.; - SE = 0.; - Temp = 0.; - grad = 0.; - cept = 0.; - EnergySpec = true; // true - energy spectra, false - momentum spectra - DiffSpec = true; // true - differential spec, false integral spec - IntType = "NULL"; // Interpolation type - UserWRTSurface = false; // Any user-defined distribution is wrt co-ordinate - UserAngRef = false; // angular distribution is to mother or surface-normal co-or. - IPDFEnergyExist = false; - IPDFArbExist = false; - - // Bias variables - XBias = false; - IPDFXBias = false; - YBias = false; - IPDFYBias = false; - ZBias = false; - IPDFZBias = false; - ThetaBias = false; - IPDFThetaBias = false; - PhiBias = false; - IPDFPhiBias = false; - EnergyBias = false; - IPDFEnergyBias = false; - - ArbEmin = 0.; - ArbEmax = 0.; - - // verbosity - verbosityLevel = 0; - + sourceVector.clear(); + sourceIntensity.clear(); + sourceProbability.clear(); + currentSource = new G4SingleParticleSource(); + sourceVector.push_back(currentSource); + sourceIntensity.push_back(1.); + currentSourceIdx = G4int(sourceVector.size() - 1); theMessenger = new G4GeneralParticleSourceMessenger(this); - gNavigator = G4TransportationManager::GetTransportationManager() - ->GetNavigatorForTracking(); + theMessenger->SetParticleGun(currentSource); + IntensityNormalization(); } - + G4GeneralParticleSource::~G4GeneralParticleSource() { delete theMessenger; } -void G4GeneralParticleSource::SetPosDisType(G4String PosType) +void G4GeneralParticleSource::AddaSource(G4double aV) { - SourcePosType = PosType; + currentSource = new G4SingleParticleSource(); + theMessenger->SetParticleGun(currentSource); + sourceVector.push_back(currentSource); + sourceIntensity.push_back(aV); + currentSourceIdx = G4int(sourceVector.size() - 1); + IntensityNormalization(); } -void G4GeneralParticleSource::SetPosDisShape(G4String shapeType) +void G4GeneralParticleSource::IntensityNormalization() { - Shape = shapeType; -} - -void G4GeneralParticleSource::SetCentreCoords(G4ThreeVector coordsOfCentre) -{ - CentreCoords = coordsOfCentre; -} - -void G4GeneralParticleSource::SetPosRot1(G4ThreeVector posrot1) -{ - // This should be x' - Rotx = posrot1; - if(verbosityLevel == 2) - { - G4cout << "Vector x' " << Rotx << G4endl; - } - GenerateRotationMatrices(); -} - -void G4GeneralParticleSource::SetPosRot2(G4ThreeVector posrot2) -{ - // This is a vector in the plane x'y' but need not - // be y' - Roty = posrot2; - if(verbosityLevel == 2) - { - G4cout << "The vector in the x'-y' plane " << Roty << G4endl; - } - GenerateRotationMatrices(); -} - -void G4GeneralParticleSource::SetHalfX(G4double xhalf) -{ - halfx = xhalf; -} - -void G4GeneralParticleSource::SetHalfY(G4double yhalf) -{ - halfy = yhalf; -} - -void G4GeneralParticleSource::SetHalfZ(G4double zhalf) -{ - halfz = zhalf; -} - -void G4GeneralParticleSource::SetRadius(G4double rad) -{ - Radius = rad; -} - -void G4GeneralParticleSource::SetRadius0(G4double rad) -{ - Radius0 = rad; -} - -void G4GeneralParticleSource::SetBeamSigmaInR(G4double r) -{ - SR = r; -} - -void G4GeneralParticleSource::SetBeamSigmaInX(G4double r) -{ - SX = r; -} - -void G4GeneralParticleSource::SetBeamSigmaInY(G4double r) -{ - SY = r; -} - -void G4GeneralParticleSource::SetParAlpha(G4double paralp) -{ - ParAlpha = paralp; -} - -void G4GeneralParticleSource::SetParTheta(G4double parthe) -{ - ParTheta = parthe; -} - -void G4GeneralParticleSource::SetParPhi(G4double parphi) -{ - ParPhi = parphi; -} - -void G4GeneralParticleSource::GenerateRotationMatrices() -{ - // This takes in 2 vectors, x' and one in the plane x'-y', - // and from these takes a cross product to calculate z'. - // Then a cross product is taken between x' and z' to give - // y'. - Rotx = Rotx.unit(); // x' - Roty = Roty.unit(); // vector in x'y' plane - Rotz = Rotx.cross(Roty); // z' - Roty = Rotz.cross(Rotx); // y' - if(verbosityLevel == 2) - { - G4cout << "The new axes, x', y', z' " << Rotx << " " << Roty << " " << Rotz << G4endl; - } -} - -void G4GeneralParticleSource::ConfineSourceToVolume(G4String Vname) -{ - VolName = Vname; - if(verbosityLevel == 2) - G4cout << VolName << G4endl; - G4VPhysicalVolume *tempPV = NULL; - G4PhysicalVolumeStore *PVStore = 0; - G4String theRequiredVolumeName = VolName; - PVStore = G4PhysicalVolumeStore::GetInstance(); - G4int i = 0; - G4bool found = false; - if(verbosityLevel == 2) - G4cout << PVStore->size() << G4endl; - while (!found && isize())) { - tempPV = (*PVStore)[i]; - found = tempPV->GetName() == theRequiredVolumeName; - if(verbosityLevel == 2) - G4cout << i << " " << " " << tempPV->GetName() << " " << theRequiredVolumeName << " " << found << G4endl; - if (!found) - {i++;} - } - // found = true then the volume exists else it doesnt. - if(found == true) - { - if(verbosityLevel >= 1) - G4cout << "Volume " << VolName << " exists" << G4endl; - Confine = true; - } - else - { - G4cout << " **** Error: Volume does not exist **** " << G4endl; - G4cout << " Ignoring confine condition" << G4endl; - Confine = false; - VolName = "NULL"; - } - -} - -void G4GeneralParticleSource::GeneratePointSource() -{ - // Generates Points given the point source. - if(SourcePosType == "Point") - particle_position = CentreCoords; - else - if(verbosityLevel >= 1) - G4cout << "Error SourcePosType is not set to Point" << G4endl; -} - -void G4GeneralParticleSource::GeneratePointsInBeam() -{ - G4double x, y, z, r, phi; - - G4ThreeVector RandPos; - G4double tempx, tempy, tempz; - z = 0.; - // Private Method to create points in a plane - if(Shape == "Circle") - { - r = G4RandGauss::shoot(0.0,SR) ; - phi = twopi * G4UniformRand(); - x = r*cos(phi) ; - y = r*sin(phi) ; - } - else - { - // all other cases default to Rectangle case - x = G4RandGauss::shoot(0.0,SX); - y = G4RandGauss::shoot(0.0,SY); - } - // Apply Rotation Matrix - // x * Rotx, y * Roty and z * Rotz - if(verbosityLevel == 2) - { - G4cout << "Raw position " << x << "," << y << "," << z << G4endl; - } - tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); - tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); - tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); - - RandPos.setX(tempx); - RandPos.setY(tempy); - RandPos.setZ(tempz); - - // Translate - particle_position = CentreCoords + RandPos; - if(verbosityLevel >= 1) - { - if(verbosityLevel == 2) - { - G4cout << "Rotated Position " << RandPos << G4endl; - } - G4cout << "Rotated and Translated position " << particle_position << G4endl; - } -} - -void G4GeneralParticleSource::GeneratePointsInPlane() -{ - G4double x, y, z; - G4double expression; - G4ThreeVector RandPos; - G4double tempx, tempy, tempz; - x = y = z = 0.; - - if(SourcePosType != "Plane" && verbosityLevel >= 1) - G4cout << "Error: SourcePosType is not Plane" << G4endl; - - // Private Method to create points in a plane - if(Shape == "Circle") - { - x = Radius + 100.; - y = Radius + 100.; - while(sqrt((x*x) + (y*y)) > Radius) - { - x = GenRandX(); - y = GenRandY(); - - x = (x*2.*Radius) - Radius; - y = (y*2.*Radius) - Radius; - } - } - else if(Shape == "Annulus") - { - x = Radius + 100.; - y = Radius + 100.; - while(sqrt((x*x) + (y*y)) > Radius || sqrt((x*x) + (y*y)) < Radius0 ) - { - x = GenRandX(); - y = GenRandY(); - - x = (x*2.*Radius) - Radius; - y = (y*2.*Radius) - Radius; - } - } - else if(Shape == "Ellipse") - { - expression = 20.; - while(expression > 1.) - { - x = GenRandX(); - y = GenRandY(); - - x = (x*2.*halfx) - halfx; - y = (y*2.*halfy) - halfy; - - expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy)); - } - } - else if(Shape == "Square") - { - x = GenRandX(); - y = GenRandY(); - x = (x*2.*halfx) - halfx; - y = (y*2.*halfy) - halfy; - } - else if(Shape == "Rectangle") - { - x = GenRandX(); - y = GenRandY(); - x = (x*2.*halfx) - halfx; - y = (y*2.*halfy) - halfy; - } - else - G4cout << "Shape not one of the plane types" << G4endl; - - // Apply Rotation Matrix - // x * Rotx, y * Roty and z * Rotz - if(verbosityLevel == 2) - { - G4cout << "Raw position " << x << "," << y << "," << z << G4endl; - } - tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); - tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); - tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); - - RandPos.setX(tempx); - RandPos.setY(tempy); - RandPos.setZ(tempz); - - // Translate - particle_position = CentreCoords + RandPos; - if(verbosityLevel >= 1) - { - if(verbosityLevel == 2) - { - G4cout << "Rotated Position " << RandPos << G4endl; - } - G4cout << "Rotated and Translated position " << particle_position << G4endl; - } - - // For Cosine-Law make SideRefVecs = to Rotation matrix vectors - SideRefVec1 = Rotx; - SideRefVec2 = Roty; - SideRefVec3 = Rotz; - // If rotation matrix z' point to origin then invert the matrix - // So that SideRefVecs point away. - if((CentreCoords.x() > 0. && Rotz.x() < 0.) - || (CentreCoords.x() < 0. && Rotz.x() > 0.) - || (CentreCoords.y() > 0. && Rotz.y() < 0.) - || (CentreCoords.y() < 0. && Rotz.y() > 0.) - || (CentreCoords.z() > 0. && Rotz.z() < 0.) - || (CentreCoords.z() < 0. && Rotz.z() > 0.)) - { - // Invert y and z. - SideRefVec2 = -SideRefVec2; - SideRefVec3 = -SideRefVec3; - } - if(verbosityLevel == 2) - { - G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; - } -} - -void G4GeneralParticleSource::GeneratePointsOnSurface() -{ - //Private method to create points on a surface - G4double theta, phi; - G4double x, y, z; - x = y = z = 0.; - G4ThreeVector RandPos; - // G4double tempx, tempy, tempz; - - if(SourcePosType != "Surface" && verbosityLevel >= 1) - G4cout << "Error SourcePosType not Surface" << G4endl; - - if(Shape == "Sphere") - { - G4double tantheta; - theta = GenRandTheta(); - phi = GenRandPhi(); - - theta = acos(1. - 2.*theta); // theta isotropic - phi = phi * 2. * pi; - tantheta = tan(theta); - - x = Radius * sin(theta) * cos(phi); - y = Radius * sin(theta) * sin(phi); - z = Radius * cos(theta); - - RandPos.setX(x); - RandPos.setY(y); - RandPos.setZ(z); - - // Cosine-law (not a good idea to use this here) - G4ThreeVector zdash(x,y,z); - zdash = zdash.unit(); - G4ThreeVector xdash = Rotz.cross(zdash); - G4ThreeVector ydash = xdash.cross(zdash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - } - else if(Shape == "Ellipsoid") - { - G4double theta, phi, minphi, maxphi, middlephi; - G4double answer, constant; - - constant = pi/(halfx*halfx) + pi/(halfy*halfy) + - twopi/(halfz*halfz); - - // simplified approach - theta = GenRandTheta(); - phi = GenRandPhi(); - - theta = acos(1. - 2.*theta); - minphi = 0.; - maxphi = twopi; - while(maxphi-minphi > 0.) - { - middlephi = (maxphi+minphi)/2.; - answer = (1./(halfx*halfx))*(middlephi/2. + sin(2*middlephi)/4.) - + (1./(halfy*halfy))*(middlephi/2. - sin(2*middlephi)/4.) - + middlephi/(halfz*halfz); - answer = answer/constant; - if(answer > phi) maxphi = middlephi; - if(answer < phi) minphi = middlephi; - if(fabs(answer-phi) <= 0.00001) - { - minphi = maxphi +1; - phi = middlephi; - } - } - - x = sin(theta)*cos(phi); - y = sin(theta)*sin(phi); - z = cos(theta); - // x,y and z form a unit vector. Put this onto the ellipse. - G4double lhs; - // solve for x - G4double numYinX = y/x; - G4double numZinX = z/x; - G4double tempxvar; - tempxvar= 1./(halfx*halfx)+(numYinX*numYinX)/(halfy*halfy) - + (numZinX*numZinX)/(halfz*halfz); - - tempxvar = 1./tempxvar; - G4double coordx = sqrt(tempxvar); - - //solve for y - G4double numXinY = x/y; - G4double numZinY = z/y; - G4double tempyvar; - tempyvar=(numXinY*numXinY)/(halfx*halfx)+1./(halfy*halfy) - +(numZinY*numZinY)/(halfz*halfz); - tempyvar = 1./tempyvar; - G4double coordy = sqrt(tempyvar); - - //solve for z - G4double numXinZ = x/z; - G4double numYinZ = y/z; - G4double tempzvar; - tempzvar=(numXinZ*numXinZ)/(halfx*halfx) - +(numYinZ*numYinZ)/(halfy*halfy)+1./(halfz*halfz); - tempzvar = 1./tempzvar; - G4double coordz = sqrt(tempzvar); - - lhs = sqrt((coordx*coordx)/(halfx*halfx) + - (coordy*coordy)/(halfy*halfy) + - (coordz*coordz)/(halfz*halfz)); - - if(fabs(lhs-1.) > 0.001 && verbosityLevel >= 1) - G4cout << "Error: theta, phi not really on ellipsoid" << G4endl; - - // coordx, coordy and coordz are all positive - G4double TestRandVar = G4UniformRand(); - if(TestRandVar > 0.5) - { - coordx = -coordx; - } - TestRandVar = G4UniformRand(); - if(TestRandVar > 0.5) - { - coordy = -coordy; - } - TestRandVar = G4UniformRand(); - if(TestRandVar > 0.5) - { - coordz = -coordz; - } - - RandPos.setX(coordx); - RandPos.setY(coordy); - RandPos.setZ(coordz); - - // Cosine-law (not a good idea to use this here) - G4ThreeVector zdash(coordx,coordy,coordz); - zdash = zdash.unit(); - G4ThreeVector xdash = Rotz.cross(zdash); - G4ThreeVector ydash = xdash.cross(zdash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - } - else if(Shape == "Cylinder") - { - G4double AreaTop, AreaBot, AreaLat; - G4double AreaTotal, prob1, prob2, prob3; - G4double testrand; - - // User giver Radius and z-half length - // Calculate surface areas, maybe move this to - // a different routine. - - AreaTop = pi * Radius * Radius; - AreaBot = AreaTop; - AreaLat = 2. * pi * Radius * 2. * halfz; - AreaTotal = AreaTop + AreaBot + AreaLat; - - prob1 = AreaTop / AreaTotal; - prob2 = AreaBot / AreaTotal; - prob3 = 1.00 - prob1 - prob2; - if(fabs(prob3 - (AreaLat/AreaTotal)) >= 0.001) - { - if(verbosityLevel >= 1) - G4cout << AreaLat/AreaTotal << " " << prob3< (Radius*Radius)) - { - x = GenRandX(); - y = GenRandY(); - - x = x * 2. * Radius; - y = y * 2. * Radius; - x = x - Radius; - y = y - Radius; - } - // Cosine law - SideRefVec1 = Rotx; - SideRefVec2 = Roty; - SideRefVec3 = Rotz; - } - else if((testrand > prob1) && (testrand <= (prob1 + prob2))) - { - //Point on Bottom surface - z = -halfz; - x = Radius + 100.; - y = Radius + 100.; - while(((x*x)+(y*y)) > (Radius*Radius)) - { - x = GenRandX(); - y = GenRandY(); - - x = x * 2. * Radius; - y = y * 2. * Radius; - x = x - Radius; - y = y - Radius; - } - // Cosine law - SideRefVec1 = Rotx; - SideRefVec2 = -Roty; - SideRefVec3 = -Rotz; - } - else if(testrand > (prob1+prob2)) - { - G4double rand; - //Point on Lateral Surface - - rand = G4UniformRand(); - rand = rand * 2. * pi; - - x = Radius * cos(rand); - y = Radius * sin(rand); - - z = GenRandZ(); - - z = z * 2. * halfz; - z = z - halfz; - - // Cosine law - G4ThreeVector zdash(x,y,0.); - zdash = zdash.unit(); - G4ThreeVector xdash = Rotz.cross(zdash); - G4ThreeVector ydash = xdash.cross(zdash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - } - else - G4cout << "Error: testrand " << testrand << G4endl; - - RandPos.setX(x); - RandPos.setY(y); - RandPos.setZ(z); - - } - else if(Shape == "Para") - { - G4double testrand; - //Right Parallelepiped. - // User gives x,y,z half lengths and ParAlpha - // ParTheta and ParPhi - // +x = <1, -x >1 & <2, +y >2 & <3, -y >3 &<4 - // +z >4 & < 5, -z >5 &<6. - testrand = G4UniformRand(); - G4double AreaX = halfy * halfz * 4.; - G4double AreaY = halfx * halfz * 4.; - G4double AreaZ = halfx * halfy * 4.; - G4double AreaTotal = 2*(AreaX + AreaY + AreaZ); - G4double Probs[6]; - Probs[0] = AreaX/AreaTotal; - Probs[1] = Probs[0] + AreaX/AreaTotal; - Probs[2] = Probs[1] + AreaY/AreaTotal; - Probs[3] = Probs[2] + AreaY/AreaTotal; - Probs[4] = Probs[3] + AreaZ/AreaTotal; - Probs[5] = Probs[4] + AreaZ/AreaTotal; - - x = GenRandX(); - y = GenRandY(); - z = GenRandZ(); - - x = x * halfx * 2.; - x = x - halfx; - y = y * halfy * 2.; - y = y - halfy; - z = z * halfz * 2.; - z = z - halfz; - // Pick a side first - if(testrand < Probs[0]) - { - // side is +x - x = halfx + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); - y = y + z*tan(ParTheta)*sin(ParPhi); - z = z; - // Cosine-law - G4ThreeVector xdash(halfz*tan(ParTheta)*cos(ParPhi), - halfz*tan(ParTheta)*sin(ParPhi), - halfz/cos(ParPhi)); - G4ThreeVector ydash(halfy*tan(ParAlpha), halfy, 0.0); - xdash = xdash.unit(); - ydash = ydash.unit(); - G4ThreeVector zdash = xdash.cross(ydash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - } - else if(testrand >= Probs[0] && testrand < Probs[1]) - { - // side is -x - x = -halfx + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); - y = y + z*tan(ParTheta)*sin(ParPhi); - z = z; - // Cosine-law - G4ThreeVector xdash(halfz*tan(ParTheta)*cos(ParPhi), - halfz*tan(ParTheta)*sin(ParPhi), - halfz/cos(ParPhi)); - G4ThreeVector ydash(halfy*tan(ParAlpha), halfy, 0.0); - xdash = xdash.unit(); - ydash = ydash.unit(); - G4ThreeVector zdash = xdash.cross(ydash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = -ydash.unit(); - SideRefVec3 = -zdash.unit(); - } - else if(testrand >= Probs[1] && testrand < Probs[2]) - { - // side is +y - x = x + z*tan(ParTheta)*cos(ParPhi) + halfy*tan(ParAlpha); - y = halfy + z*tan(ParTheta)*sin(ParPhi); - z = z; - // Cosine-law - G4ThreeVector ydash(halfz*tan(ParTheta)*cos(ParPhi), - halfz*tan(ParTheta)*sin(ParPhi), - halfz/cos(ParPhi)); - ydash = ydash.unit(); - G4ThreeVector xdash = Roty.cross(ydash); - G4ThreeVector zdash = xdash.cross(ydash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - } - else if(testrand >= Probs[2] && testrand < Probs[3]) - { - // side is -y - x = x + z*tan(ParTheta)*cos(ParPhi) - halfy*tan(ParAlpha); - y = -halfy + z*tan(ParTheta)*sin(ParPhi); - z = z; - // Cosine-law - G4ThreeVector ydash(halfz*tan(ParTheta)*cos(ParPhi), - halfz*tan(ParTheta)*sin(ParPhi), - halfz/cos(ParPhi)); - ydash = ydash.unit(); - G4ThreeVector xdash = Roty.cross(ydash); - G4ThreeVector zdash = xdash.cross(ydash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = -ydash.unit(); - SideRefVec3 = -zdash.unit(); - } - else if(testrand >= Probs[3] && testrand < Probs[4]) - { - // side is +z - z = halfz; - y = y + halfz*sin(ParPhi)*tan(ParTheta); - x = x + halfz*cos(ParPhi)*tan(ParTheta) + y*tan(ParAlpha); - // Cosine-law - SideRefVec1 = Rotx; - SideRefVec2 = Roty; - SideRefVec3 = Rotz; - } - else if(testrand >= Probs[4] && testrand < Probs[5]) - { - // side is -z - z = -halfz; - y = y - halfz*sin(ParPhi)*tan(ParTheta); - x = x - halfz*cos(ParPhi)*tan(ParTheta) + y*tan(ParAlpha); - // Cosine-law - SideRefVec1 = Rotx; - SideRefVec2 = -Roty; - SideRefVec3 = -Rotz; - } - else - { - G4cout << "Error: testrand out of range" << G4endl; - if(verbosityLevel >= 1) - G4cout << "testrand=" << testrand << " Probs[5]=" << Probs[5] <= 1) - { - if(verbosityLevel == 2) - G4cout << "Rotated position " << RandPos << G4endl; - G4cout << "Rotated and translated position " << particle_position << G4endl; - } - if(verbosityLevel == 2) - { - G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; - } -} - -void G4GeneralParticleSource::GeneratePointsInVolume() -{ - G4ThreeVector RandPos; - G4double tempx, tempy, tempz; - G4double x, y, z; - x = y = z = 0.; - if(SourcePosType != "Volume" && verbosityLevel >= 1) - G4cout << "Error SourcePosType not Volume" << G4endl; - //Private method to create points in a volume - if(Shape == "Sphere") - { - x = Radius*2.; - y = Radius*2.; - z = Radius*2.; - while(((x*x)+(y*y)+(z*z)) > (Radius*Radius)) - { - x = GenRandX(); - y = GenRandY(); - z = GenRandZ(); - - x = (x*2.*Radius) - Radius; - y = (y*2.*Radius) - Radius; - z = (z*2.*Radius) - Radius; - } - } - else if(Shape == "Ellipsoid") - { - G4double temp; - temp = 100.; - while(temp > 1.) - { - x = GenRandX(); - y = GenRandY(); - z = GenRandZ(); - - x = (x*2.*halfx) - halfx; - y = (y*2.*halfy) - halfy; - z = (z*2.*halfz) - halfz; - - temp = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy)) - + ((z*z)/(halfz*halfz)); - } - } - else if(Shape == "Cylinder") - { - x = Radius*2.; - y = Radius*2.; - while(((x*x)+(y*y)) > (Radius*Radius)) - { - x = GenRandX(); - y = GenRandY(); - z = GenRandZ(); - - x = (x*2.*Radius) - Radius; - y = (y*2.*Radius) - Radius; - z = (z*2.*halfz) - halfz; - } - } - else if(Shape == "Para") - { - x = GenRandX(); - y = GenRandY(); - z = GenRandZ(); - x = (x*2.*halfx) - halfx; - y = (y*2.*halfy) - halfy; - z = (z*2.*halfz) - halfz; - x = x + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); - y = y + z*tan(ParTheta)*sin(ParPhi); - z = z; - } - else - G4cout << "Error: Volume Shape Doesnt Exist" << G4endl; - - RandPos.setX(x); - RandPos.setY(y); - RandPos.setZ(z); - - // Apply Rotation Matrix - // x * Rotx, y * Roty and z * Rotz - tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); - tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); - tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); - - RandPos.setX(tempx); - RandPos.setY(tempy); - RandPos.setZ(tempz); - - // Translate - particle_position = CentreCoords + RandPos; - - if(verbosityLevel == 2) - { - G4cout << "Raw position " << x << "," << y << "," << z << G4endl; - G4cout << "Rotated position " << RandPos << G4endl; - } - if(verbosityLevel >= 1) - G4cout << "Rotated and translated position " << particle_position << G4endl; - - // Cosine-law (not a good idea to use this here) - G4ThreeVector zdash(tempx,tempy,tempz); - zdash = zdash.unit(); - G4ThreeVector xdash = Rotz.cross(zdash); - G4ThreeVector ydash = xdash.cross(zdash); - SideRefVec1 = xdash.unit(); - SideRefVec2 = ydash.unit(); - SideRefVec3 = zdash.unit(); - - if(verbosityLevel == 2) - { - G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; - } -} - -G4bool G4GeneralParticleSource::IsSourceConfined() -{ - // Method to check point is within the volume specified - if(Confine == false) - G4cout << "Error: Confine is false" << G4endl; - G4ThreeVector null(0.,0.,0.); - G4ThreeVector *ptr; - ptr = &null; - - // Check particle_position is within VolName, if so true, - // else false - G4VPhysicalVolume *theVolume; - theVolume=gNavigator->LocateGlobalPointAndSetup(particle_position,ptr,true); - G4String theVolName = theVolume->GetName(); - if(theVolName == VolName) - { - if(verbosityLevel >= 1) - G4cout << "Particle is in volume " << VolName << G4endl; - return(true); - } - else - return(false); -} - -// Now follows the angular distribution methods. - -void G4GeneralParticleSource::SetAngDistType(G4String atype) -{ - if(atype != "iso" && atype != "cos" && atype != "user" && atype != "planar" - && atype != "beam1d" && atype != "beam2d") - G4cout << "Error, distribution must be iso, cos, planar, beam1d, beam2d or user" << G4endl; - else - AngDistType = atype; - if (AngDistType == "cos") MaxTheta = pi/2. ; - if (AngDistType == "user") { - UDefThetaH = IPDFThetaH = ZeroPhysVector ; - IPDFThetaExist = false ; - UDefPhiH = IPDFPhiH = ZeroPhysVector ; - IPDFPhiExist = false ; - } -} - -void G4GeneralParticleSource::DefineAngRefAxes(G4String refname, G4ThreeVector ref) -{ - - if(refname == "angref1") - AngRef1 = ref.unit(); // x' - else if(refname == "angref2") - AngRef2 = ref.unit(); // vector in x'y' plane - - // User defines x' (AngRef1) and a vector in the x'y' - // plane (AngRef2). Then, AngRef1 x AngRef2 = AngRef3 - // the z' vector. Then, AngRef3 x AngRef1 = AngRef2 - // which will now be y'. - - AngRef3 = AngRef1.cross(AngRef2); // z' - AngRef2 = AngRef3.cross(AngRef1); // y' - UserAngRef = true ; - if(verbosityLevel == 2) - { - G4cout << "Angular distribution rotation axes " << AngRef1 << " " << AngRef2 << " " << AngRef3 << G4endl; - } -} - -void G4GeneralParticleSource::SetMinTheta(G4double mint) -{ - MinTheta = mint; -} - -void G4GeneralParticleSource::SetMinPhi(G4double minp) -{ - MinPhi = minp; -} - -void G4GeneralParticleSource::SetMaxTheta(G4double maxt) -{ - MaxTheta = maxt; -} - -void G4GeneralParticleSource::SetMaxPhi(G4double maxp) -{ - MaxPhi = maxp; -} - -void G4GeneralParticleSource::SetBeamSigmaInAngR(G4double r) -{ - DR = r; -} - -void G4GeneralParticleSource::SetBeamSigmaInAngX(G4double r) -{ - DX = r; -} - -void G4GeneralParticleSource::SetBeamSigmaInAngY(G4double r) -{ - DY = r; -} - -void G4GeneralParticleSource::UserDefAngTheta(G4ThreeVector input) -{ - if(UserDistType == "NULL") UserDistType = "theta"; - if(UserDistType == "phi") UserDistType = "both"; - G4double thi, val; - thi = input.x(); - val = input.y(); - if(verbosityLevel >= 1) - G4cout << "In UserDefAngTheta" << G4endl; - UDefThetaH.InsertValues(thi, val); -} - -void G4GeneralParticleSource::UserDefAngPhi(G4ThreeVector input) -{ - if(UserDistType == "NULL") UserDistType = "phi"; - if(UserDistType == "theta") UserDistType = "both"; - G4double phhi, val; - phhi = input.x(); - val = input.y(); - if(verbosityLevel >= 1) - G4cout << "In UserDefAngPhi" << G4endl; - UDefPhiH.InsertValues(phhi, val); -} - -void G4GeneralParticleSource::SetUserWRTSurface(G4bool wrtSurf) -{ - // if UserWRTSurface = true then the user wants momenta with respect - // to the surface normals. - // When doing this theta has to be 0-90 only otherwise there will be - // errors, which currently are flagged anywhere. - UserWRTSurface = wrtSurf; -} - -void G4GeneralParticleSource::SetUseUserAngAxis(G4bool userang) -{ - // if UserAngRef = true the angular distribution is defined wrt - // the user defined co-ordinates - UserAngRef = userang; -} - -void G4GeneralParticleSource::GenerateBeamFlux() -{ - // generates isotropic flux. - // No vectors are needed. - G4double theta, phi; - G4double px, py, pz; - if (AngDistType == "beam1d") - { - theta = G4RandGauss::shoot(0.0,DR); - phi = twopi * G4UniformRand(); - } - else - { - px = G4RandGauss::shoot(0.0,DX); - py = G4RandGauss::shoot(0.0,DY); - theta = sqrt (px*px + py*py); - if (theta != 0.) { - phi = acos(px/theta); - if ( py < 0.) phi = -phi; - } - else - { - phi = 0.0; - } - } - px = -sin(theta) * cos(phi); - py = -sin(theta) * sin(phi); - pz = -cos(theta); - // Apply Angular Rotation Matrix - // x * AngRef1, y * AngRef2 and z * AngRef3 - G4double finx, finy, finz; - finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); - finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); - finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); - G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); - finx = finx/ResMag; - finy = finy/ResMag; - finz = finz/ResMag; - - particle_momentum_direction.setX(finx); - particle_momentum_direction.setY(finy); - particle_momentum_direction.setZ(finz); - - // particle_momentum_direction now holds unit momentum vector. - if(verbosityLevel >= 1) - G4cout << "Generating beam vector: " << particle_momentum_direction << G4endl; -} - -void G4GeneralParticleSource::GenerateIsotropicFlux() -{ - // generates isotropic flux. - // No vectors are needed. - G4double rndm, rndm2; - G4double px, py, pz; - - // generate rand nos. but make sure in theta/phi limits - /* Colin's old stuff - Theta = 10.; // This is well above the pi upper limit. - Phi = 10.; // Still well above 2pi upper limit. - - while(Theta > MaxTheta || Theta < MinTheta) - { - rndm = GenRandTheta(); - Theta = acos(1. - 2.*rndm); - } - - while(Phi > MaxPhi || Phi < MinPhi) - { - rndm2 = GenRandPhi(); - Phi = twopi * rndm2; - } - - px = sin(Theta) * cos(Phi); - py = sin(Theta) * sin(Phi); - pz = cos(Theta); - - */ - // More efficient implementation by F. Lei + G4double total = 0.; + size_t i = 0 ; + for (i = 0; i < sourceIntensity.size(); i++) + total += sourceIntensity[i] ; // - G4double sintheta, sinphi,costheta,cosphi; - rndm = GenRandTheta(); - costheta = cos(MinTheta) - rndm * (cos(MinTheta) - cos(MaxTheta)); - sintheta = sqrt(1. - costheta*costheta); - - rndm2 = GenRandPhi(); - Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; - sinphi = sin(Phi); - cosphi = cos(Phi); + sourceProbability.clear(); + sourceProbability.push_back(sourceIntensity[0]/total); + for ( i = 1 ; i < sourceIntensity.size(); i++) + sourceProbability.push_back(sourceIntensity[i]/total + sourceProbability[i-1]); + normalised = true; +} - px = -sintheta * cosphi; - py = -sintheta * sinphi; - pz = -costheta; - - // end of F.Lei implementation - - // px = -px; - //py = -py; - //pz = -pz; - - // pmag = sqrt((px*px) + (py*py) + (pz*pz)); - - //px = px/pmag; - //py = py/pmag; - //pz = pz/pmag; - - /* this implmentation is commented out by f.lei - - //Need to rotate the particle_momentum_direction round such that the - //start position is at the north pole, so that all particles go into - // the centre of the geomtries. - // particle_position stores the particle's position. - // use particle position to calculate theta and phi - posthe and posphi - - G4double posthe, posphi; - // G4cout << "particle_position " << particle_position << G4endl; - G4double tx, ty, tz, tt; - tx = particle_position.x(); - ty = particle_position.y(); - tz = particle_position.z(); - tt = sqrt(tx*tx + ty*ty + tz*tz); - tx = tx/tt; - ty = ty/tt; - tz = tz/tt; - // G4cout << "unit position " << tx << " " << ty << " " << tz << G4endl; - if (tt != 0.) { - posthe = acos(tz); - } - else { - posthe = 0.; - } - if (posthe != 0. && posthe != pi){ - posphi = acos(tx/sin(posthe)); - } - else{ - posphi = 0.0; - } - // G4cout << "Posthe and posphi " << posthe << " " << posphi << G4endl; - G4double finx, finy, finz; - finx = (px*cos(posthe)*cos(posphi)) - (py*sin(posphi)) + (pz*sin(posthe)*cos(posphi)); - finy = (px*cos(posthe)*sin(posphi)) + (py*cos(posphi)) + (pz*sin(posthe)*sin(posphi)); - finz = (-px*sin(posthe)) + (pz*cos(posthe)); - // G4cout << "finx... " << finx << " " << finy << " " << finz << G4endl; - */ - - // New implementation - // for volume and ponit source use mother or user defined co-ordinates - // for plane and surface source user surface-normal or userdefined co-ordinates - // - G4double finx, finy, finz; - if (SourcePosType == "Point" || SourcePosType == "Volume") { - if (UserAngRef){ - // Apply Rotation Matrix - // x * AngRef1, y * AngRef2 and z * AngRef3 - finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); - finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); - finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); - } else { - finx = px; - finy = py; - finz = pz; - } - } else { // for plane and surface source - if (UserAngRef){ - // Apply Rotation Matrix - // x * AngRef1, y * AngRef2 and z * AngRef3 - finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); - finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); - finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); - } else { - finx = (px*SideRefVec1.x()) + (py*SideRefVec2.x()) + (pz*SideRefVec3.x()); - finy = (px*SideRefVec1.y()) + (py*SideRefVec2.y()) + (pz*SideRefVec3.y()); - finz = (px*SideRefVec1.z()) + (py*SideRefVec2.z()) + (pz*SideRefVec3.z()); - } - } - G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); - finx = finx/ResMag; - finy = finy/ResMag; - finz = finz/ResMag; - - particle_momentum_direction.setX(finx); - particle_momentum_direction.setY(finy); - particle_momentum_direction.setZ(finz); - - // particle_momentum_direction now holds unit momentum vector. - if(verbosityLevel >= 1) - G4cout << "Generating isotropic vector: " << particle_momentum_direction << G4endl; +void G4GeneralParticleSource::ListSource() +{ + G4cout << " The number of particle source is " << sourceIntensity.size() << G4endl; + for (size_t i = 0 ; i < sourceIntensity.size(); i++) + G4cout << " source " << i << " intensity is " << sourceIntensity[i] << G4endl; } -void G4GeneralParticleSource::GenerateCosineLawFlux() +void G4GeneralParticleSource::SetCurrentSourceto(G4int aV) { - // Method to generate flux distributed with a cosine law - // such as is in TIMM. - G4double px, py, pz; - G4double rndm, rndm2; - // G4double resultx, resulty, resultz; - - /* Colin's old implementation which is very slow - - Theta = 10.; // Well above MaxTheta - Phi = 10.; // Well above MaxPhi - - while(Theta > MaxTheta || Theta < MinTheta) - { - rndm = GenRandTheta(); - Theta = asin(sqrt(MaxTheta*rndm)); - } - - while(Phi > MaxPhi || Phi < MinPhi) - { - rndm2 = GenRandPhi(); - Phi = twopi * rndm2; - } - - px = sin(Theta) * cos(Phi); - py = sin(Theta) * sin(Phi); - pz = cos(Theta); - */ - // More efficient implementation by F. Lei - // - G4double sintheta, sinphi,costheta,cosphi; - rndm = GenRandTheta(); - sintheta = sqrt( rndm * (sin(MaxTheta)*sin(MaxTheta) - sin(MinTheta)*sin(MinTheta) ) - +sin(MinTheta)*sin(MinTheta) ); - costheta = sqrt(1. -sintheta*sintheta); - - rndm2 = GenRandPhi(); - Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; - sinphi = sin(Phi); - cosphi = cos(Phi); - - px = -sintheta * cosphi; - py = -sintheta * sinphi; - pz = -costheta; - - // end of F.Lei implementation - - // px = -px; - //py = -py; - //pz = -pz; - //pmag = sqrt((px*px) + (py*py) + (pz*pz)); - //G4double pxh = px/pmag; - //G4double pyh = py/pmag; - //G4double pzh = pz/pmag; - - /* commented out by F. Lei - if(verbosityLevel == 2) - { - G4cout <<"SideRefVecs " <= 1) - { - G4cout << "Resultant cosine-law unit momentum vector " << particle_momentum_direction << G4endl; - } -} - -void G4GeneralParticleSource::GeneratePlanarFlux() -{ - // particle_momentum_direction now contains unit momentum vector. - // nothing need be done here as the m-directions have been set directly - // under this option - if(verbosityLevel >= 1) - { - G4cout << "Resultant Planar wave momentum vector " << particle_momentum_direction << G4endl; - } -} - -void G4GeneralParticleSource::GenerateUserDefFlux() -{ - G4double rndm, px, py, pz, pmag; - - if(UserDistType == "NULL") - G4cout << "Error: UserDistType undefined" << G4endl; - else if(UserDistType == "theta") - { - Theta = GenerateUserDefTheta(); - Phi = 10.; - while(Phi > MaxPhi || Phi < MinPhi) - { - rndm = GenRandPhi(); - Phi = twopi * rndm; - } - } - else if(UserDistType == "phi") - { - Theta = 10.; - while(Theta > MaxTheta || Theta < MinTheta) - { - rndm = GenRandTheta(); - Theta = acos(1. - (2. * rndm)); - } - Phi = GenerateUserDefPhi(); - } - else if(UserDistType == "both") - { - Theta = GenerateUserDefTheta(); - Phi = GenerateUserDefPhi(); - } - - px = -sin(Theta) * cos(Phi); - py = -sin(Theta) * sin(Phi); - pz = -cos(Theta); - - pmag = sqrt((px*px) + (py*py) + (pz*pz)); - - if(UserWRTSurface == false) - { - G4double finx, finy, finz; - if (UserAngRef) { - // Apply Rotation Matrix - // x * AngRef1, y * AngRef2 and z * AngRef3 - finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); - finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); - finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); - } else { // use mother co-ordinates - finx = px; - finy = py; - finz = pz; - } - G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); - finx = finx/ResMag; - finy = finy/ResMag; - finz = finz/ResMag; - - particle_momentum_direction.setX(finx); - particle_momentum_direction.setY(finy); - particle_momentum_direction.setZ(finz); - } - else if(UserWRTSurface == true) - { - G4double pxh = px/pmag; - G4double pyh = py/pmag; - G4double pzh = pz/pmag; - - if(verbosityLevel == 2) - { - G4cout <<"SideRefVecs " <= 1) - { - G4cout << "Final User Defined momentum vector " << particle_momentum_direction << G4endl; - } -} - -G4double G4GeneralParticleSource::GenerateUserDefTheta() -{ - // Create cumulative histogram if not already done so. Then use RandFlat - //::shoot to generate the output Theta value. - if(UserDistType == "NULL" || UserDistType == "phi") - { - // No user defined theta distribution - G4cout << "Error ***********************" << G4endl; - G4cout << "UserDistType = " << UserDistType << G4endl; - return (0.); - } - else - { - // UserDistType = theta or both and so a theta distribution - // is defined. This should be integrated if not already done. - if(IPDFThetaExist == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(UDefThetaH.GetVectorLength()); - bins[0] = UDefThetaH.GetLowEdgeEnergy(size_t(0)); - vals[0] = UDefThetaH(size_t(0)); - sum = vals[0]; - for(ii=1;iiSetParticleGun(currentSource); + // + } else { + G4cout << " source index is invalid " << G4endl; + G4cout << " it shall be <= " << sourceIntensity.size() << G4endl; } } -void G4GeneralParticleSource::SetEmin(G4double emi) +void G4GeneralParticleSource::SetCurrentSourceIntensity(G4double aV) { - Emin = emi; + sourceIntensity[currentSourceIdx] = aV; + normalised = false; } -void G4GeneralParticleSource::SetEmax(G4double ema) +void G4GeneralParticleSource::ClearAll() { - Emax = ema; + currentSourceIdx = -1; + currentSource = 0; + sourceVector.clear(); + sourceIntensity.clear(); + sourceProbability.clear(); } -void G4GeneralParticleSource::SetMonoEnergy(G4double menergy) +void G4GeneralParticleSource::DeleteaSource(G4int aV) { - MonoEnergy = menergy; - Emin = menergy; - Emax = menergy; -} - -void G4GeneralParticleSource::SetBeamSigmaInE(G4double e) -{ - SE = e; -} -void G4GeneralParticleSource::SetAlpha(G4double alp) -{ - alpha = alp; -} - -void G4GeneralParticleSource::SetTemp(G4double tem) -{ - Temp = tem; -} - -void G4GeneralParticleSource::SetEzero(G4double eze) -{ - Ezero = eze; -} - -void G4GeneralParticleSource::SetGradient(G4double gr) -{ - grad = gr; -} - -void G4GeneralParticleSource::SetInterCept(G4double c) -{ - cept = c; -} - -void G4GeneralParticleSource::UserEnergyHisto(G4ThreeVector input) -{ - G4double ehi, val; - ehi = input.x(); - val = input.y(); - if(verbosityLevel == 2) - G4cout << " " << ehi << " " << val << G4endl; - if(verbosityLevel == 2) - G4cout << "In UserEnergyHisto" << G4endl; - UDefEnergyH.InsertValues(ehi, val); - Emax = ehi; -} - -void G4GeneralParticleSource::ArbEnergyHisto(G4ThreeVector input) -{ - G4double ehi, val; - ehi = input.x(); - val = input.y(); - if(verbosityLevel == 2) - G4cout << "In ArbEnergyHisto" << G4endl; - ArbEnergyH.InsertValues(ehi, val); -} - -void G4GeneralParticleSource::EpnEnergyHisto(G4ThreeVector input) -{ - G4double ehi, val; - ehi = input.x(); - val = input.y(); - if(verbosityLevel == 2) - G4cout << "In EpnEnergyHisto" << G4endl; - EpnEnergyH.InsertValues(ehi, val); - Emax = ehi; - Epnflag = true; -} - -void G4GeneralParticleSource::Calculate() -{ - if(EnergyDisType == "Cdg") - CalculateCdgSpectrum(); - else if(EnergyDisType == "Bbody") - CalculateBbodySpectrum(); -} - -void G4GeneralParticleSource::CalculateCdgSpectrum() -{ - // This uses the spectrum from The INTEGRAL Mass Model (TIMM) - // to generate a Cosmic Diffuse X/gamma ray spectrum. - G4double pfact[2] = {8.5, 112}; - G4double spind[2] = {1.4, 2.3}; - G4double ene_line[3] = {1.*keV, 18.*keV, 1E6*keV}; - G4int n_par; - - ene_line[0] = Emin; - if(Emin < 18*keV) - { - n_par = 2; - ene_line[2] = Emax; - if(Emax < 18*keV) - { - n_par = 1; - ene_line[1] = Emax; + size_t id = size_t (aV) ; + if ( id <= sourceIntensity.size() ) { + sourceVector.erase(sourceVector.begin()+aV); + sourceIntensity.erase(sourceIntensity.begin()+aV); + normalised = false ; + if (currentSourceIdx == aV ) { + if ( sourceIntensity.size() > 0 ) { + currentSource = sourceVector[0]; + currentSourceIdx = 1; + } else { + currentSource = 0; + currentSourceIdx = -1; } - } - else - { - n_par = 1; - pfact[0] = 112.; - spind[0] = 2.3; - ene_line[1] = Emax; - } - - // Create a cumulative histogram. - CDGhist[0] = 0.; - G4double omalpha; - G4int i = 0; - - while(i < n_par) - { - omalpha = 1. - spind[i]; - CDGhist[i+1] = CDGhist[i] + (pfact[i]/omalpha)* - (pow(ene_line[i+1],omalpha)-pow(ene_line[i],omalpha)); - i++; - } - - // Normalise histo and divide by 1000 to make MeV. - i = 0; - while(i < n_par) - { - CDGhist[i+1] = CDGhist[i+1]/CDGhist[n_par]; - // G4cout << CDGhist[i] << CDGhist[n_par] << G4endl; - i++; - } -} - -void G4GeneralParticleSource::CalculateBbodySpectrum() -{ - // create bbody spectrum - // Proved very hard to integrate indefinitely, so different - // method. User inputs emin, emax and T. These are used to - // create a 10,000 bin histogram. - // Use photon density spectrum = 2 nu**2/c**2 * (exp(h nu/kT)-1) - // = 2 E**2/h**2c**2 times the exponential - G4double erange = Emax - Emin; - G4double steps = erange/10000.; - G4double Bbody_y[10000]; - G4double k = 8.6181e-11; //Boltzmann const in MeV/K - G4double h = 4.1362e-21; // Plancks const in MeV s - G4double c = 3e8; // Speed of light - G4double h2 = h*h; - G4double c2 = c*c; - G4int count = 0; - G4double sum = 0.; - BBHist[0] = 0.; - while(count < 10000) - { - Bbody_x[count] = Emin + G4double(count*steps); - Bbody_y[count] = (2.*pow(Bbody_x[count],2.))/ - (h2*c2*(exp(Bbody_x[count]/(k*Temp)) - 1.)); - sum = sum + Bbody_y[count]; - BBHist[count+1] = BBHist[count] + Bbody_y[count]; - count++; - } - - Bbody_x[10000] = Emax; - // Normalise cumulative histo. - count = 0; - while(count<10001) - { - BBHist[count] = BBHist[count]/sum; - count++; - } -} - -void G4GeneralParticleSource::InputEnergySpectra(G4bool value) -{ - // Allows user to specifiy spectrum is momentum - EnergySpec = value; // false if momentum - if(verbosityLevel == 2) - G4cout << "EnergySpec has value " << EnergySpec << G4endl; -} - -void G4GeneralParticleSource::InputDifferentialSpectra(G4bool value) -{ - // Allows user to specify integral or differential spectra - DiffSpec = value; // true = differential, false = integral - if(verbosityLevel == 2) - G4cout << "Diffspec has value " << DiffSpec << G4endl; -} - -void G4GeneralParticleSource::ArbInterpolate(G4String IType) -{ - if(EnergyDisType != "Arb") - G4cout << "Error: this is for arbitrary distributions" << G4endl; - IntType = IType; - - - // Calcuate Emin and Emax, mainly for use in debugging - G4int len = G4int(ArbEnergyH.GetVectorLength()); - ArbEmax = ArbEnergyH.GetLowEdgeEnergy(size_t(len-1)); - ArbEmin = ArbEnergyH.GetLowEdgeEnergy(size_t(0)); - G4cout << "ArbEmin, ArbEmax " << ArbEmin << " " << ArbEmax << G4endl; - - // Now interpolate points - if(IntType == "Lin") - LinearInterpolation(); - if(IntType == "Log") - LogInterpolation(); - if(IntType == "Exp") - ExpInterpolation(); - if(IntType == "Spline") - SplineInterpolation(); -} - -void G4GeneralParticleSource::LinearInterpolation() -{ - // Method to do linear interpolation on the Arb points - // Calculate equation of each line segment, max 1024. - // Calculate Area under each segment - // Create a cumulative array which is then normalised Arb_Cum_Area - G4double Area_seg[1024]; // Stores area under each segment - G4double sum = 0., Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; - G4int i, count; - G4int maxi = ArbEnergyH.GetVectorLength(); - for(i=0;iGetPDGMass(); - - // multiply the function (Arb_y) up by the bin width - // to make the function counts/s (i.e. get rid of momentum - // dependence). - for(count=0;count 0.) - { - if(verbosityLevel == 2) - G4cout << "Arb_grad is positive" << G4endl; - Arb_cept[i] = Arb_y[i] - (Arb_grad[i] * Arb_x[i]); - } - else if(Arb_grad[i] < 0.) - { - if(verbosityLevel == 2) - G4cout << "Arb_grad is negative" << G4endl; - Arb_cept[i] = Arb_y[i] + (-Arb_grad[i] * Arb_x[i]); - } - else - { - if(verbosityLevel == 2) - G4cout << "Arb_grad is 0." << G4endl; - Arb_cept[i] = Arb_y[i]; - } - - Area_seg[i] = ((Arb_grad[i]/2)*(Arb_x[i]*Arb_x[i] - Arb_x[i-1]*Arb_x[i-1]) + Arb_cept[i]*(Arb_x[i] - Arb_x[i-1])); - Arb_Cum_Area[i] = Arb_Cum_Area[i-1] + Area_seg[i]; - sum = sum + Area_seg[i]; - if(verbosityLevel == 2) - G4cout << Arb_x[i] << Arb_y[i] << Area_seg[i] << sum << Arb_grad[i] << G4endl; - i++; - } - - i=0; - while(i < maxi) - { - Arb_Cum_Area[i] = Arb_Cum_Area[i]/sum; // normalisation - IPDFArbEnergyH.InsertValues(Arb_x[i], Arb_Cum_Area[i]); - i++; - } - - if(verbosityLevel >= 1) - { - G4cout << "Leaving LinearInterpolation" << G4endl; - ArbEnergyH.DumpValues(); - IPDFArbEnergyH.DumpValues(); - } -} - -void G4GeneralParticleSource::LogInterpolation() -{ - // Interpolation based on Logarithmic equations - // Generate equations of line segments - // y = Ax**alpha => log y = alpha*logx + logA - // Find area under line segments - // create normalised, cumulative array Arb_Cum_Area - G4double Area_seg[1024], Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; - G4double alp, sum=0.; - Arb_Cum_Area[0] = 0.; - if(verbosityLevel == 2) - ArbEnergyH.DumpValues(); - - G4int i, count; - G4int maxi = ArbEnergyH.GetVectorLength(); - for(i=0;iGetPDGMass(); - - // multiply the function (Arb_y) up by the bin width - // to make the function counts/s (i.e. get rid of momentum - // dependence). - for(count=0;count= 1) - G4cout << "Leaving LogInterpolation " << G4endl; -} - -void G4GeneralParticleSource::ExpInterpolation() -{ - // Interpolation based on Exponential equations - // Generate equations of line segments - // y = Ae**-(x/e0) => ln y = -x/e0 + lnA - // Find area under line segments - // create normalised, cumulative array Arb_Cum_Area - G4double Area_seg[1024], Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; - G4double sum=0.; - Arb_Cum_Area[0] = 0.; - if(verbosityLevel == 2) - ArbEnergyH.DumpValues(); - - G4int i, count; - G4int maxi = ArbEnergyH.GetVectorLength(); - for(i=0;iGetPDGMass(); - - // multiply the function (Arb_y) up by the bin width - // to make the function counts/s (i.e. get rid of momentum - // dependence). - for( count=0;count 0. || test < 0.) - { - Arb_ezero[i] = -(Arb_x[i] - Arb_x[i-1])/(log(Arb_y[i]) - log(Arb_y[i-1])); - Arb_Const[i] = Arb_y[i]/(exp(-Arb_x[i]/Arb_ezero[i])); - Area_seg[i]=-(Arb_Const[i]*Arb_ezero[i])*(exp(-Arb_x[i]/Arb_ezero[i]) - -exp(-Arb_x[i-1]/Arb_ezero[i])); - } - else - { - G4cout << "Flat line segment: problem" << G4endl; - Arb_ezero[i] = 0.; - Arb_Const[i] = 0.; - Area_seg[i] = 0.; - } - sum = sum + Area_seg[i]; - Arb_Cum_Area[i] = Arb_Cum_Area[i-1] + Area_seg[i]; - if(verbosityLevel == 2) - G4cout << Arb_ezero[i] << Arb_Const[i] << Area_seg[i] << G4endl; - i++; - } - - i=0; - while(i= 1) - G4cout << "Leaving ExpInterpolation " << G4endl; -} - -void G4GeneralParticleSource::SplineInterpolation() -{ - // Interpolation using Splines. - // Create Normalised arrays, make x 0->1 and y hold - // the function (Energy) - G4double Arb_x[1024], Arb_y[1024]; - G4double sum = 0.; - G4int i, count; - if(verbosityLevel == 2) - ArbEnergyH.DumpValues(); - - G4int maxi = ArbEnergyH.GetVectorLength(); - for(i=0;iGetPDGMass(); - - // multiply the function (Arb_y) up by the bin width - // to make the function counts/s (i.e. get rid of momentum - // dependence). - for(count=0;count=0;i--) - { - if(i == 0) - { - Arb_x[0] = 0.; - Arb_y[0] = 0.; - } - else - { - Arb_x[i] = Arb_x[i-1]; - Arb_y[i] = Arb_y[i-1]; - } - } - } - - for(i=0;i<=maxi;i++) - { - if(verbosityLevel == 2) - G4cout << i <<" "<< Arb_x[i] << " " << Arb_y[i] << G4endl; - IPDFArbEnergyH.InsertValues(Arb_x[i], Arb_y[i]); - } - - // Should now have normalised cumulative probabilities in Arb_y - // and energy values in Arb_x. - maxi = maxi + 1; - // Put y into x and x into y. The spline interpolation will then - // go through x-axis to find where to interpolate (cum probability) - // then generate a y (which will now be energy). - SplineInt = new G4DataInterpolation(Arb_y,Arb_x,maxi,1e30,1e30); - if(verbosityLevel == 2) - { - G4cout << SplineInt << G4endl; - G4cout << SplineInt->LocateArgument(1.0) << G4endl; - } - if(verbosityLevel >= 1) - G4cout << "Leaving SplineInterpolation " << G4endl; -} - -void G4GeneralParticleSource::GenerateMonoEnergetic() -{ - // Method to generate MonoEnergetic particles. - particle_energy = MonoEnergy; -} - -void G4GeneralParticleSource::GenerateGaussEnergies() -{ - // Method to generate Gaussian particles. - particle_energy = G4RandGauss::shoot(MonoEnergy,SE); - if (particle_energy < 0) particle_energy = 0.; -} - -void G4GeneralParticleSource::GenerateLinearEnergies() -{ - G4double rndm; - G4double emaxsq = pow(Emax,2.); //Emax squared - G4double eminsq = pow(Emin,2.); //Emin squared - G4double intersq = pow(cept,2.); //cept squared - - rndm = GenRandEnergy(); - - G4double bracket = ((grad/2.)*(emaxsq - eminsq) + cept*(Emax-Emin)); - bracket = bracket * rndm; - bracket = bracket + (grad/2.)*eminsq + cept*Emin; - // Now have a quad of form m/2 E**2 + cE - bracket = 0 - bracket = -bracket; - // G4cout << "BRACKET" << bracket << G4endl; - if(grad != 0.) - { - G4double sqbrack = (intersq - 4*(grad/2.)*(bracket)); - // G4cout << "SQBRACK" << sqbrack << G4endl; - sqbrack = sqrt(sqbrack); - G4double root1 = -cept + sqbrack; - root1 = root1/(2.*(grad/2.)); - - G4double root2 = -cept - sqbrack; - root2 = root2/(2.*(grad/2.)); - - // G4cout << root1 << " roots " << root2 << G4endl; - - if(root1 > Emin && root1 < Emax) - particle_energy = root1; - if(root2 > Emin && root2 < Emax) - particle_energy = root2; - } - else if(grad == 0.) - // have equation of form cE - bracket =0 - particle_energy = bracket/cept; - - if(particle_energy < 0.) - particle_energy = -particle_energy; - - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GeneratePowEnergies() -{ - // Method to generate particle energies distributed as - // a powerlaw - - G4double rndm; - G4double emina, emaxa; - - emina = pow(Emin,alpha+1); - emaxa = pow(Emax,alpha+1); - - rndm = GenRandEnergy(); - - if(alpha != -1.) - { - particle_energy = ((rndm*(emaxa - emina)) + emina); - particle_energy = pow(particle_energy,(1./(alpha+1.))); - } - else if(alpha == -1.) - { - particle_energy = (log(Emin) + rndm*(log(Emax) - log(Emin))); - particle_energy = exp(particle_energy); - } - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GenerateExpEnergies() -{ - // Method to generate particle energies distributed according - // to an exponential curve. - G4double rndm; - rndm = GenRandEnergy(); - - particle_energy = -Ezero*(log(rndm*(exp(-Emax/Ezero) - exp(-Emin/Ezero)) + - exp(-Emin/Ezero))); - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GenerateBremEnergies() -{ - // Method to generate particle energies distributed according - // to a Bremstrahlung equation of - // form I = const*((kT)**1/2)*E*(e**(-E/kT)) - - G4double rndm; - rndm = GenRandEnergy(); - G4double expmax, expmin, k; - - k = 8.6181e-11; // Boltzmann's const in MeV/K - G4double ksq = pow(k,2.); // k squared - G4double Tsq = pow(Temp,2.); // Temp squared - - expmax = exp(-Emax/(k*Temp)); - expmin = exp(-Emin/(k*Temp)); - - // If either expmax or expmin are zero then this will cause problems - // Most probably this will be because T is too low or E is too high - - if(expmax == 0.) - G4cout << "*****EXPMAX=0. Choose different E's or Temp" << G4endl; - if(expmin == 0.) - G4cout << "*****EXPMIN=0. Choose different E's or Temp" << G4endl; - - G4double tempvar = rndm *((-k)*Temp*(Emax*expmax - Emin*expmin) - - (ksq*Tsq*(expmax-expmin))); - - G4double bigc = (tempvar - k*Temp*Emin*expmin - ksq*Tsq*expmin)/(-k*Temp); - - // This gives an equation of form: Ee(-E/kT) + kTe(-E/kT) - C =0 - // Solve this iteratively, step from Emin to Emax in 1000 steps - // and take the best solution. - - G4double erange = Emax - Emin; - G4double steps = erange/1000.; - G4int i; - G4double etest, diff, err; - - err = 100000.; - - for(i=1; i<1000; i++) - { - etest = Emin + (i-1)*steps; - - diff = etest*(exp(-etest/(k*Temp))) + k*Temp*(exp(-etest/(k*Temp))) - bigc; - - if(diff < 0.) - diff = -diff; - - if(diff < err) - { - err = diff; - particle_energy = etest; - } - } - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GenerateBbodyEnergies() -{ - // BBody_x holds Energies, and BBHist holds the cumulative histo. - // binary search to find correct bin then lin interpolation. - // Use the earlier defined histogram + RandGeneral method to generate - // random numbers following the histos distribution. - G4double rndm; - G4int nabove, nbelow = 0, middle; - nabove = 10001; - rndm = GenRandEnergy(); - - // Binary search to find bin that rndm is in - while(nabove-nbelow > 1) - { - middle = (nabove + nbelow)/2; - if(rndm == BBHist[middle]) break; - if(rndm < BBHist[middle]) nabove = middle; - else nbelow = middle; - } - - // Now interpolate in that bin to find the correct output value. - G4double x1, x2, y1, y2, m, q; - x1 = Bbody_x[nbelow]; - x2 = Bbody_x[nbelow+1]; - y1 = BBHist[nbelow]; - y2 = BBHist[nbelow+1]; - m = (y2-y1)/(x2-x1); - q = y1 - m*x1; - - particle_energy = (rndm - q)/m; - - if(verbosityLevel >= 1) - { - G4cout << "Energy is " << particle_energy << G4endl; - } -} - -void G4GeneralParticleSource::GenerateCdgEnergies() -{ - // Gen random numbers, compare with values in cumhist - // to find appropriate part of spectrum and then - // generate energy in the usual inversion way. - // G4double pfact[2] = {8.5, 112}; - // G4double spind[2] = {1.4, 2.3}; - // G4double ene_line[3] = {1., 18., 1E6}; - G4double rndm, rndm2; - G4double ene_line[3]; - G4double omalpha[2]; - if(Emin < 18*keV && Emax < 18*keV) - { - omalpha[0] = 1. - 1.4; - ene_line[0] = Emin; - ene_line[1] = Emax; - } - if(Emin < 18*keV && Emax > 18*keV) - { - omalpha[0] = 1. - 1.4; - omalpha[1] = 1. - 2.3; - ene_line[0] = Emin; - ene_line[1] = 18.; - ene_line[2] = Emax; - } - if(Emin > 18*keV) - { - omalpha[0] = 1. - 2.3; - ene_line[0] = Emin; - ene_line[1] = Emax; - } - rndm = GenRandEnergy(); - rndm2 = GenRandEnergy(); - - G4int i = 0; - while( rndm >= CDGhist[i]) - { - i++; - } - // Generate final energy. - particle_energy = (pow(ene_line[i-1],omalpha[i-1]) + (pow(ene_line[i],omalpha[i-1]) - - pow(ene_line[i-1],omalpha[i-1]))*rndm2); - particle_energy = pow(particle_energy,(1./omalpha[i-1])); - - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GenUserHistEnergies() -{ - // Histograms are DIFFERENTIAL. - // G4cout << "In GenUserHistEnergies " << G4endl; - if(IPDFEnergyExist == false) - { - G4int ii; - G4int maxbin = G4int(UDefEnergyH.GetVectorLength()); - G4double bins[1024], vals[1024], sum; - sum=0.; - // UDefEnergyH.DumpValues(); - G4double mass = particle_definition->GetPDGMass(); - // G4cout << mass << G4endl; - // G4cout << EnergySpec << " " << DiffSpec << G4endl; - if((EnergySpec == false) && (particle_definition == NULL)) - G4cout << "Error: particle definition is NULL" << G4endl; - - if(maxbin > 1024) - { - G4cout << "Maxbin > 1024" << G4endl; - G4cout << "Setting maxbin to 1024, other bins are lost" << G4endl; - } - - if(DiffSpec == false) - G4cout << "Histograms are Differential!!! " << G4endl; - else - { - // G4cout << "Here 2" << G4endl; - bins[0] = UDefEnergyH.GetLowEdgeEnergy(size_t(0)); - vals[0] = UDefEnergyH(size_t(0)); - sum = vals[0]; - for(ii=1;ii= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::GenArbPointEnergies() -{ - if(verbosityLevel >= 1) - G4cout << "In GenArbPointEnergies" << G4endl; - G4double rndm; - rndm = GenRandEnergy(); - - if(IntType != "Spline") - { - // IPDFArbEnergyH.DumpValues(); - // Find the Bin - // have x, y, no of points, and cumulative area distribution - G4int nabove, nbelow = 0, middle; - nabove = IPDFArbEnergyH.GetVectorLength(); - // G4cout << nabove << G4endl; - // Binary search to find bin that rndm is in - while(nabove-nbelow > 1) - { - middle = (nabove + nbelow)/2; - if(rndm == IPDFArbEnergyH(size_t(middle))) break; - if(rndm < IPDFArbEnergyH(size_t(middle))) nabove = middle; - else nbelow = middle; - } - if(IntType == "Lin") - { - Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); - Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); - grad = Arb_grad[nbelow+1]; - cept = Arb_cept[nbelow+1]; - // G4cout << rndm << " " << Emax << " " << Emin << " " << grad << " " << cept << G4endl; - GenerateLinearEnergies(); - } - else if(IntType == "Log") - { - Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); - Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); - alpha = Arb_alpha[nbelow+1]; - // G4cout << rndm << " " << Emax << " " << Emin << " " << alpha << G4endl; - GeneratePowEnergies(); - } - else if(IntType == "Exp") - { - Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); - Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); - Ezero = Arb_ezero[nbelow+1]; - // G4cout << rndm << " " << Emax << " " << Emin << " " << Ezero << G4endl; - GenerateExpEnergies(); - } - } - else if(IntType == "Spline") - { - if(verbosityLevel == 2) - G4cout << "IntType = Spline " << rndm << G4endl; - // in SplineInterpolation created SplineInt - // Now generate a random number put it into CubicSplineInterpolation - // and you should get out an energy!?! - particle_energy = SplineInt->CubicSplineInterpolation(rndm); - if(verbosityLevel >= 1) - G4cout << "Energy is " << particle_energy << G4endl; - } - else - G4cout << "Error: IntType unknown type" << G4endl; -} - -void G4GeneralParticleSource::GenEpnHistEnergies() -{ - // G4cout << "In GenEpnHistEnergies " << Epnflag << G4endl; - - // Firstly convert to energy if not already done. - if(Epnflag == true) - // epnflag = true means spectrum is epn, false means e. - { - // convert to energy by multiplying by A number - ConvertEPNToEnergy(); - // EpnEnergyH will be replace by UDefEnergyH. - // UDefEnergyH.DumpValues(); - } - - // G4cout << "Creating IPDFEnergy if not already done so" << G4endl; - if(IPDFEnergyExist == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(UDefEnergyH.GetVectorLength()); - bins[0] = UDefEnergyH.GetLowEdgeEnergy(size_t(0)); - vals[0] = UDefEnergyH(size_t(0)); - sum = vals[0]; - for(ii=1;ii= 1) - G4cout << "Energy is " << particle_energy << G4endl; -} - -void G4GeneralParticleSource::ConvertEPNToEnergy() -{ - // Use this before particle generation to convert the - // currently stored histogram from energy/nucleon - // to energy. - // G4cout << "In ConvertEpntoEnergy " << G4endl; - if(particle_definition==NULL) - G4cout << "Error: particle not defined" << G4endl; - else - { - // Need to multiply histogram by the number of nucleons. - // Baryon Number looks to hold the no. of nucleons. - G4int Bary = particle_definition->GetBaryonNumber(); - // G4cout << "Baryon No. " << Bary << G4endl; - // Change values in histogram, Read it out, delete it, re-create it - G4int count, maxcount; - maxcount = G4int(EpnEnergyH.GetVectorLength()); - // G4cout << maxcount << G4endl; - G4double ebins[1024],evals[1024]; - if(maxcount > 1024) - { - G4cout << "Histogram contains more than 1024 bins!" << G4endl; - G4cout << "Those above 1024 will be ignored" << G4endl; - maxcount = 1024; - } - for(count=0;count IPDFXBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - // retrieve the areas and then the x-axis values - bweights[0] = IPDFXBiasH(biasn2) - IPDFXBiasH(biasn2 - 1); - G4double xaxisl = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - //G4cout << "X Bin weight " << bweights[0] << " " << rndm << G4endl; - //G4cout << "lower and upper xaxis vals "<= 1) - G4cout << "X bin weight " << bweights[0] << " " << rndm << G4endl; - return(IPDFXBiasH.GetEnergy(rndm)); - } -} - -G4double G4GeneralParticleSource::GenRandY() -{ - if(verbosityLevel >= 1) - G4cout << "In GenRandY" << G4endl; - if(YBias == false) - { - // Y is not biased - G4double rndm = G4UniformRand(); - return(rndm); - } - else - { - // Y is biased - if(IPDFYBias == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(YBiasH.GetVectorLength()); - bins[0] = YBiasH.GetLowEdgeEnergy(size_t(0)); - vals[0] = YBiasH(size_t(0)); - sum = vals[0]; - for(ii=1;ii IPDFYBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - bweights[1] = IPDFYBiasH(biasn2) - IPDFYBiasH(biasn2 - 1); - G4double xaxisl = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - bweights[1] = NatProb/bweights[1]; - if(verbosityLevel >= 1) - G4cout << "Y bin weight " << bweights[1] << " " << rndm << G4endl; - return(IPDFYBiasH.GetEnergy(rndm)); - } -} - -G4double G4GeneralParticleSource::GenRandZ() -{ - if(verbosityLevel >= 1) - G4cout << "In GenRandZ" << G4endl; - if(ZBias == false) - { - // Z is not biased - G4double rndm = G4UniformRand(); - return(rndm); - } - else - { - // Z is biased - if(IPDFZBias == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(ZBiasH.GetVectorLength()); - bins[0] = ZBiasH.GetLowEdgeEnergy(size_t(0)); - vals[0] = ZBiasH(size_t(0)); - sum = vals[0]; - for(ii=1;ii IPDFZBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - bweights[2] = IPDFZBiasH(biasn2) - IPDFZBiasH(biasn2 - 1); - G4double xaxisl = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - bweights[2] = NatProb/bweights[2]; - if(verbosityLevel >= 1) - G4cout << "Z bin weight " << bweights[2] << " " << rndm << G4endl; - return(IPDFZBiasH.GetEnergy(rndm)); - } -} - -G4double G4GeneralParticleSource::GenRandTheta() -{ - if(verbosityLevel >= 1) - { - G4cout << "In GenRandTheta" << G4endl; - G4cout << "Verbosity " << verbosityLevel << G4endl; - } - if(ThetaBias == false) - { - // Theta is not biased - G4double rndm = G4UniformRand(); - return(rndm); - } - else - { - // Theta is biased - if(IPDFThetaBias == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(ThetaBiasH.GetVectorLength()); - bins[0] = ThetaBiasH.GetLowEdgeEnergy(size_t(0)); - vals[0] = ThetaBiasH(size_t(0)); - sum = vals[0]; - for(ii=1;ii IPDFThetaBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - bweights[3] = IPDFThetaBiasH(biasn2) - IPDFThetaBiasH(biasn2 - 1); - G4double xaxisl = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - bweights[3] = NatProb/bweights[3]; - if(verbosityLevel >= 1) - G4cout << "Theta bin weight " << bweights[3] << " " << rndm << G4endl; - return(IPDFThetaBiasH.GetEnergy(rndm)); - } -} - -G4double G4GeneralParticleSource::GenRandPhi() -{ - if(verbosityLevel >= 1) - G4cout << "In GenRandPhi" << G4endl; - if(PhiBias == false) - { - // Phi is not biased - G4double rndm = G4UniformRand(); - return(rndm); - } - else - { - // Phi is biased - if(IPDFPhiBias == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(PhiBiasH.GetVectorLength()); - bins[0] = PhiBiasH.GetLowEdgeEnergy(size_t(0)); - vals[0] = PhiBiasH(size_t(0)); - sum = vals[0]; - for(ii=1;ii IPDFPhiBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - bweights[4] = IPDFPhiBiasH(biasn2) - IPDFPhiBiasH(biasn2 - 1); - G4double xaxisl = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - bweights[4] = NatProb/bweights[4]; - if(verbosityLevel >= 1) - G4cout << "Phi bin weight " << bweights[4] << " " << rndm << G4endl; - return(IPDFPhiBiasH.GetEnergy(rndm)); - } -} - -G4double G4GeneralParticleSource::GenRandEnergy() -{ - if(verbosityLevel >= 1) - G4cout << "In GenRandEnergy" << G4endl; - if(EnergyBias == false) - { - // Energy is not biased - G4double rndm = G4UniformRand(); - return(rndm); - } - else - { - // ENERGY is biased - if(IPDFEnergyBias == false) - { - // IPDF has not been created, so create it - G4double bins[1024],vals[1024], sum; - G4int ii; - G4int maxbin = G4int(EnergyBiasH.GetVectorLength()); - bins[0] = EnergyBiasH.GetLowEdgeEnergy(size_t(0)); - vals[0] = EnergyBiasH(size_t(0)); - sum = vals[0]; - for(ii=1;ii IPDFEnergyBiasH(biasn2)) - biasn1 = biasn2; - else - biasn3 = biasn2; - biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; - } - bweights[5] = IPDFEnergyBiasH(biasn2) - IPDFEnergyBiasH(biasn2 - 1); - G4double xaxisl = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); - G4double xaxisu = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2)); - G4double NatProb = xaxisu - xaxisl; - bweights[5] = NatProb/bweights[5]; - if(verbosityLevel >= 1) - G4cout << "Energy bin weight " << bweights[5] << " " << rndm << G4endl; - return(IPDFEnergyBiasH.GetEnergy(rndm)); - } -} - -// Verbosity -void G4GeneralParticleSource::SetVerbosity(int vL) -{ - verbosityLevel = vL; - G4cout << "Verbosity Set to: " << verbosityLevel << G4endl; -} - -void G4GeneralParticleSource::SetParticleDefinition - (G4ParticleDefinition* aParticleDefinition) -{ - particle_definition = aParticleDefinition; - particle_charge = particle_definition->GetPDGCharge(); -} - -// SR1.3 -//void G4GeneralParticleSource::SetNucleus (Nucleus theIon1) -//{ -// theIon = theIon1; - -// G4IonTable *theIonTable = (G4IonTable *)(G4ParticleTable::GetParticleTable()->GetIonTable()); -// G4ParticleDefinition *aIon = NULL; - -// G4int A = theIon.GetA(); -// G4int Z = theIon.GetZ(); -// G4double E = theIon.GetE(); - -// aIon = theIonTable->GetIon (Z, A, E); - -// SetParticleDefinition(aIon); -//} - - -void G4GeneralParticleSource::GeneratePrimaryVertex(G4Event *evt) -{ - if(particle_definition==NULL) return; - - // Position stuff - G4bool srcconf = false; - G4int LoopCount = 0; - while(srcconf == false) - { - if(SourcePosType == "Point") - GeneratePointSource(); - else if(SourcePosType == "Beam") - GeneratePointsInBeam(); - else if(SourcePosType == "Plane") - GeneratePointsInPlane(); - else if(SourcePosType == "Surface") - GeneratePointsOnSurface(); - else if(SourcePosType == "Volume") - GeneratePointsInVolume(); - else - { - G4cout << "Error: SourcePosType undefined" << G4endl; - G4cout << "Generating point source" << G4endl; - GeneratePointSource(); - } - if(Confine == true) - { - srcconf = IsSourceConfined(); - // if source in confined srcconf = true terminating the loop - // if source isnt confined srcconf = false and loop continues - } - else if(Confine == false) - srcconf = true; // terminate loop - - LoopCount++; - if(LoopCount == 100000) - { - G4cout << "*************************************" << G4endl; - G4cout << "LoopCount = 100000" << G4endl; - G4cout << "Either the source distribution >> confinement" << G4endl; - G4cout << "or any confining volume may not overlap with" << G4endl; - G4cout << "the source distribution or any confining volumes" << G4endl; - G4cout << "may not exist"<< G4endl; - G4cout << "If you have set confine then this will be ignored" <GetPDGMass(); - G4double energy = particle_energy + mass; - G4double pmom = sqrt(energy*energy-mass*mass); - G4double px = pmom*particle_momentum_direction.x(); - G4double py = pmom*particle_momentum_direction.y(); - G4double pz = pmom*particle_momentum_direction.z(); - - if(verbosityLevel > 1){ - G4cout << "Particle name: "<GetParticleName() << G4endl; - G4cout << " Energy: "< 1) { + if (!normalised) IntensityNormalization(); + G4double rndm = G4UniformRand(); + size_t i = 0 ; + while ( rndm > sourceProbability[i] ) i++; + (currentSource = sourceVector[i]); } - for( G4int i=0; iSetMass( mass ); - particle->SetCharge( particle_charge ); - particle->SetPolarization(particle_polarization.x(), - particle_polarization.y(), - particle_polarization.z()); - vertex->SetPrimary( particle ); - - // Set bweight equal to the multiple of all non-zero weights - bweight = 1.; - for(int bib=0; bib<6; bib++) - { - if(bweights[bib] > 0.) bweight = bweight * bweights[bib]; - } - // bweight will now contain the events final weighting. - // now pass it to the primary vertex - vertex->SetWeight(bweight); - } - evt->AddPrimaryVertex( vertex ); - if(verbosityLevel > 1) - G4cout << " Primary Vetex generated !"<< G4endl; + currentSource-> GeneratePrimaryVertex(evt); } - - - - - - - - - diff --git a/source/event/src/G4GeneralParticleSourceMessenger.cc b/source/event/src/G4GeneralParticleSourceMessenger.cc index 6fd707fd94..3be2b33e12 100644 --- a/source/event/src/G4GeneralParticleSourceMessenger.cc +++ b/source/event/src/G4GeneralParticleSourceMessenger.cc @@ -22,33 +22,25 @@ // /////////////////////////////////////////////////////////////////////////////// // -// MODULE: G4GeneralParticleSourceMessenger.cc +// MODULE: G4GeneralParticleSourceMessenger.cc // -// Version: 1. -// Date: 28/02/00 -// Author: C Ferguson, F Lei and P Truscott -// Organisation: University of Southampton / DERA -// Customer: ESA/ESTEC +// Version: 2.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC // /////////////////////////////////////////////////////////////////////////////// // // CHANGE HISTORY // -------------- // -// 9-May-2001 F. Lei -// added all the g4pariclegun commands -// -// 10-Nov-2000 F. Lei -// changed -// #include -// to -// #include "g4std/fstream" -// -// Version 1.1, 18 October 2000, Modified to inherit from G4VPrimaryGenerator. -// New name at the request of M. Asai. -// -// Version 1.0, 28 February 2000, C Ferguson, Created. -// +// Version 2.0, 05/02/2004, Fan Lei, Created. +// After changes to version 1.1 as in Geant4 v6.0 +// - Mutilple particle source definition +// - Re-structured commands +// - old commonds have been retained for backward compatibility, will be +// removed in the future. // /////////////////////////////////////////////////////////////////////////////// // @@ -74,19 +66,55 @@ #include "G4Tokenizer.hh" #include "G4GeneralParticleSourceMessenger.hh" +#include "G4SingleParticleSource.hh" #include "G4GeneralParticleSource.hh" + /////////////////////////////////////////////////////////////////////////////// // G4GeneralParticleSourceMessenger::G4GeneralParticleSourceMessenger (G4GeneralParticleSource *fPtclGun) - : fParticleGun(fPtclGun),fShootIon(false) + : fGPS(fPtclGun),fShootIon(false) { particleTable = G4ParticleTable::GetParticleTable(); histtype = "biasx"; gpsDirectory = new G4UIdirectory("/gps/"); gpsDirectory->SetGuidance("General Paricle Source control commands."); - gpsDirectory->SetGuidance(" The first 9 commands are the same as in G4ParticleGun "); + // gpsDirectory->SetGuidance(" The first 9 commands are the same as in G4ParticleGun "); + + // now the commands for mutiple sources + sourceDirectory = new G4UIdirectory("/gps/source/"); + sourceDirectory->SetGuidance("Multiple source control sub-directory"); + + addsourceCmd = new G4UIcmdWithADouble("/gps/source/add",this); + addsourceCmd->SetGuidance("add a new source defintion to the particle gun with the specified intensity"); + addsourceCmd->SetParameterName("addsource",false,false); + addsourceCmd->SetRange("addsource > 0."); + + listsourceCmd = new G4UIcmdWithoutParameter("/gps/source/list",this); + listsourceCmd->SetGuidance("List the defined particle sources"); + + clearsourceCmd = new G4UIcmdWithoutParameter("/gps/source/clear",this); + clearsourceCmd->SetGuidance("Remove all the defined particle sources"); + + getsourceCmd = new G4UIcmdWithoutParameter("/gps/source/show",this); + getsourceCmd->SetGuidance("Show the current source index and intensity"); + + setsourceCmd = new G4UIcmdWithAnInteger("/gps/source/set",this); + setsourceCmd->SetGuidance("set the indexed source as the current one"); + setsourceCmd->SetGuidance(" so one can change its source definition"); + setsourceCmd->SetParameterName("setsource",false,false); + setsourceCmd->SetRange("setsource >= 0"); + + deletesourceCmd = new G4UIcmdWithAnInteger("/gps/source/delete",this); + deletesourceCmd->SetGuidance("delete the indexed source from the list"); + deletesourceCmd->SetParameterName("deletesource",false,false); + deletesourceCmd->SetRange("deletesource > 0"); + + setintensityCmd = new G4UIcmdWithADouble("/gps/source/intensity",this); + setintensityCmd->SetGuidance("reset the current source to the specified intensity"); + setintensityCmd->SetParameterName("setintensity",false,false); + setintensityCmd->SetRange("setintensity > 0."); // below we reproduce commands awailable in G4Particle Gun @@ -110,7 +138,6 @@ G4GeneralParticleSourceMessenger::G4GeneralParticleSourceMessenger candidateList += "ion "; particleCmd->SetCandidates(candidateList); - directionCmd = new G4UIcmdWith3Vector("/gps/direction",this); directionCmd->SetGuidance("Set momentum direction."); directionCmd->SetGuidance("Direction needs not to be a unit vector."); @@ -131,13 +158,6 @@ G4GeneralParticleSourceMessenger::G4GeneralParticleSourceMessenger //positionCmd->SetUnitCategory("Length"); //positionCmd->SetUnitCandidates("microm mm cm m km"); - // SR1.3 - // ionCmd = new UIcmdWithNucleusAndUnit("/gps/ion",this); - //ionCmd->SetGuidance("define the primary ion (a,z,e)"); - //ionCmd->SetParameterName("A","Z","E",true); - //ionCmd->SetDefaultUnit("keV"); - //ionCmd->SetUnitCandidates("keV MeV"); - ionCmd = new G4UIcommand("/gps/ion",this); ionCmd->SetGuidance("Set properties of ion to be generated."); ionCmd->SetGuidance("[usage] /gun/ion Z A Q E"); @@ -178,201 +198,469 @@ G4GeneralParticleSourceMessenger::G4GeneralParticleSourceMessenger numberCmd->SetParameterName("N",true,true); numberCmd->SetRange("N>0"); - // now extended commands + // verbosity + verbosityCmd = new G4UIcmdWithAnInteger("/gps/verbose",this); + verbosityCmd->SetGuidance("Set Verbose level for GPS"); + verbosityCmd->SetGuidance(" 0 : Silent"); + verbosityCmd->SetGuidance(" 1 : Limited information"); + verbosityCmd->SetGuidance(" 2 : Detailed information"); + verbosityCmd->SetParameterName("level",false); + verbosityCmd->SetRange("level>=0 && level <=2"); + // now extended commands + // Positional ones: + positionDirectory = new G4UIdirectory("/gps/pos/"); + positionDirectory->SetGuidance("Positional commands sub-directory"); + + typeCmd1 = new G4UIcmdWithAString("/gps/pos/type",this); + typeCmd1->SetGuidance("Sets source distribution type."); + typeCmd1->SetGuidance("Either Point, Beam, Plane, Surface or Volume"); + typeCmd1->SetParameterName("DisType",true,true); + typeCmd1->SetDefaultValue("Point"); + typeCmd1->SetCandidates("Point Beam Plane Surface Volume"); + + shapeCmd1 = new G4UIcmdWithAString("/gps/pos/shape",this); + shapeCmd1->SetGuidance("Sets source shape for Plan, Surface or Volume type source."); + shapeCmd1->SetParameterName("Shape",true,true); + shapeCmd1->SetDefaultValue("NULL"); + shapeCmd1->SetCandidates("Circle Annulus Ellipse Square Rectangle Sphere Ellipsoid Cylinder Para"); + + centreCmd1 = new G4UIcmdWith3VectorAndUnit("/gps/pos/centre",this); + centreCmd1->SetGuidance("Set centre coordinates of source."); + centreCmd1->SetGuidance(" same effect as the /gps/position command"); + centreCmd1->SetParameterName("X","Y","Z",true,true); + centreCmd1->SetDefaultUnit("cm"); + centreCmd1->SetUnitCandidates("micron mm cm m km"); + + posrot1Cmd1 = new G4UIcmdWith3Vector("/gps/pos/rot1",this); + posrot1Cmd1->SetGuidance("Set the 1st vector defining the rotation matrix'."); + posrot1Cmd1->SetGuidance("It does not need to be a unit vector."); + posrot1Cmd1->SetParameterName("R1x","R1y","R1z",true,true); + posrot1Cmd1->SetRange("R1x != 0 || R1y != 0 || R1z != 0"); + + posrot2Cmd1 = new G4UIcmdWith3Vector("/gps/pos/rot2",this); + posrot2Cmd1->SetGuidance("Set the 2nd vector defining the rotation matrix'."); + posrot2Cmd1->SetGuidance("It does not need to be a unit vector."); + posrot2Cmd1->SetParameterName("R2x","R2y","R2z",true,true); + posrot2Cmd1->SetRange("R2x != 0 || R2y != 0 || R2z != 0"); + + halfxCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/halfx",this); + halfxCmd1->SetGuidance("Set x half length of source."); + halfxCmd1->SetParameterName("Halfx",true,true); + halfxCmd1->SetDefaultUnit("cm"); + halfxCmd1->SetUnitCandidates("micron mm cm m km"); + + halfyCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/halfy",this); + halfyCmd1->SetGuidance("Set y half length of source."); + halfyCmd1->SetParameterName("Halfy",true,true); + halfyCmd1->SetDefaultUnit("cm"); + halfyCmd1->SetUnitCandidates("micron mm cm m km"); + + halfzCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/halfz",this); + halfzCmd1->SetGuidance("Set z half length of source."); + halfzCmd1->SetParameterName("Halfz",true,true); + halfzCmd1->SetDefaultUnit("cm"); + halfzCmd1->SetUnitCandidates("micron mm cm m km"); + + radiusCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/radius",this); + radiusCmd1->SetGuidance("Set radius of source."); + radiusCmd1->SetParameterName("Radius",true,true); + radiusCmd1->SetDefaultUnit("cm"); + radiusCmd1->SetUnitCandidates("micron mm cm m km"); + + radius0Cmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/inner_radius",this); + radius0Cmd1->SetGuidance("Set inner radius of source when required."); + radius0Cmd1->SetParameterName("Radius0",true,true); + radius0Cmd1->SetDefaultUnit("cm"); + radius0Cmd1->SetUnitCandidates("micron mm cm m km"); + + possigmarCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/sigma_r",this); + possigmarCmd1->SetGuidance("Set standard deviation in radial of the beam positional profile"); + possigmarCmd1->SetGuidance(" applicable to Beam type source only"); + possigmarCmd1->SetParameterName("Sigmar",true,true); + possigmarCmd1->SetDefaultUnit("cm"); + possigmarCmd1->SetUnitCandidates("micron mm cm m km"); + + possigmaxCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/sigma_x",this); + possigmaxCmd1->SetGuidance("Set standard deviation of beam positional profile in x-dir"); + possigmaxCmd1->SetGuidance(" applicable to Beam type source only"); + possigmaxCmd1->SetParameterName("Sigmax",true,true); + possigmaxCmd1->SetDefaultUnit("cm"); + possigmaxCmd1->SetUnitCandidates("micron mm cm m km"); + + possigmayCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/sigma_y",this); + possigmayCmd1->SetGuidance("Set standard deviation of beam positional profile in y-dir"); + possigmayCmd1->SetGuidance(" applicable to Beam type source only"); + possigmayCmd1->SetParameterName("Sigmay",true,true); + possigmayCmd1->SetDefaultUnit("cm"); + possigmayCmd1->SetUnitCandidates("micron mm cm m km"); + + paralpCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/paralp",this); + paralpCmd1->SetGuidance("Angle from y-axis of y' in Para"); + paralpCmd1->SetParameterName("paralp",true,true); + paralpCmd1->SetDefaultUnit("rad"); + paralpCmd1->SetUnitCandidates("rad deg"); + + partheCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/parthe",this); + partheCmd1->SetGuidance("Polar angle through centres of z faces"); + partheCmd1->SetParameterName("parthe",true,true); + partheCmd1->SetDefaultUnit("rad"); + partheCmd1->SetUnitCandidates("rad deg"); + + parphiCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/pos/parphi",this); + parphiCmd1->SetGuidance("Azimuth angle through centres of z faces"); + parphiCmd1->SetParameterName("parphi",true,true); + parphiCmd1->SetDefaultUnit("rad"); + parphiCmd1->SetUnitCandidates("rad deg"); + + confineCmd1 = new G4UIcmdWithAString("/gps/pos/confine",this); + confineCmd1->SetGuidance("Confine source to volume (NULL to unset)."); + confineCmd1->SetGuidance("usage: confine VolName"); + confineCmd1->SetParameterName("VolName",true,true); + confineCmd1->SetDefaultValue("NULL"); + + // old implementations typeCmd = new G4UIcmdWithAString("/gps/type",this); - typeCmd->SetGuidance("Sets source distribution type."); + typeCmd->SetGuidance("Sets source distribution type. (obsolete!)"); typeCmd->SetGuidance("Either Point, Beam, Plane, Surface or Volume"); typeCmd->SetParameterName("DisType",true,true); typeCmd->SetDefaultValue("Point"); typeCmd->SetCandidates("Point Beam Plane Surface Volume"); shapeCmd = new G4UIcmdWithAString("/gps/shape",this); - shapeCmd->SetGuidance("Sets source shape type."); + shapeCmd->SetGuidance("Sets source shape type.(obsolete!)"); shapeCmd->SetParameterName("Shape",true,true); shapeCmd->SetDefaultValue("NULL"); shapeCmd->SetCandidates("Circle Annulus Ellipse Square Rectangle Sphere Ellipsoid Cylinder Para"); centreCmd = new G4UIcmdWith3VectorAndUnit("/gps/centre",this); - centreCmd->SetGuidance("Set centre coordinates of source."); + centreCmd->SetGuidance("Set centre coordinates of source.(obsolete!)"); centreCmd->SetParameterName("X","Y","Z",true,true); centreCmd->SetDefaultUnit("cm"); centreCmd->SetUnitCandidates("micron mm cm m km"); posrot1Cmd = new G4UIcmdWith3Vector("/gps/posrot1",this); - posrot1Cmd->SetGuidance("Set rotation matrix of x'."); + posrot1Cmd->SetGuidance("Set rotation matrix of x'.(obsolete!)"); posrot1Cmd->SetGuidance("Posrot1 does not need to be a unit vector."); posrot1Cmd->SetParameterName("R1x","R1y","R1z",true,true); posrot1Cmd->SetRange("R1x != 0 || R1y != 0 || R1z != 0"); posrot2Cmd = new G4UIcmdWith3Vector("/gps/posrot2",this); - posrot2Cmd->SetGuidance("Set rotation matrix of y'."); + posrot2Cmd->SetGuidance("Set rotation matrix of y'.(obsolete!)"); posrot2Cmd->SetGuidance("Posrot2 does not need to be a unit vector."); posrot2Cmd->SetParameterName("R2x","R2y","R2z",true,true); posrot2Cmd->SetRange("R2x != 0 || R2y != 0 || R2z != 0"); halfxCmd = new G4UIcmdWithADoubleAndUnit("/gps/halfx",this); - halfxCmd->SetGuidance("Set x half length of source."); + halfxCmd->SetGuidance("Set x half length of source.(obsolete!)"); halfxCmd->SetParameterName("Halfx",true,true); halfxCmd->SetDefaultUnit("cm"); halfxCmd->SetUnitCandidates("micron mm cm m km"); halfyCmd = new G4UIcmdWithADoubleAndUnit("/gps/halfy",this); - halfyCmd->SetGuidance("Set y half length of source."); + halfyCmd->SetGuidance("Set y half length of source.(obsolete!)"); halfyCmd->SetParameterName("Halfy",true,true); halfyCmd->SetDefaultUnit("cm"); halfyCmd->SetUnitCandidates("micron mm cm m km"); halfzCmd = new G4UIcmdWithADoubleAndUnit("/gps/halfz",this); - halfzCmd->SetGuidance("Set z half length of source."); + halfzCmd->SetGuidance("Set z half length of source.(obsolete!)"); halfzCmd->SetParameterName("Halfz",true,true); halfzCmd->SetDefaultUnit("cm"); halfzCmd->SetUnitCandidates("micron mm cm m km"); radiusCmd = new G4UIcmdWithADoubleAndUnit("/gps/radius",this); - radiusCmd->SetGuidance("Set radius of source."); + radiusCmd->SetGuidance("Set radius of source.(obsolete!)"); radiusCmd->SetParameterName("Radius",true,true); radiusCmd->SetDefaultUnit("cm"); radiusCmd->SetUnitCandidates("micron mm cm m km"); radius0Cmd = new G4UIcmdWithADoubleAndUnit("/gps/radius0",this); - radius0Cmd->SetGuidance("Set inner radius of source."); + radius0Cmd->SetGuidance("Set inner radius of source.(obsolete!)"); radius0Cmd->SetParameterName("Radius0",true,true); radius0Cmd->SetDefaultUnit("cm"); radius0Cmd->SetUnitCandidates("micron mm cm m km"); possigmarCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaposr",this); - possigmarCmd->SetGuidance("Set standard deviation of beam position in radial"); + possigmarCmd->SetGuidance("Set standard deviation of beam position in radial(obsolete!)"); possigmarCmd->SetParameterName("Sigmar",true,true); possigmarCmd->SetDefaultUnit("cm"); possigmarCmd->SetUnitCandidates("micron mm cm m km"); possigmaxCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaposx",this); - possigmaxCmd->SetGuidance("Set standard deviation of beam position in x-dir"); + possigmaxCmd->SetGuidance("Set standard deviation of beam position in x-dir(obsolete!)"); possigmaxCmd->SetParameterName("Sigmax",true,true); possigmaxCmd->SetDefaultUnit("cm"); possigmaxCmd->SetUnitCandidates("micron mm cm m km"); possigmayCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaposy",this); - possigmayCmd->SetGuidance("Set standard deviation of beam position in y-dir"); + possigmayCmd->SetGuidance("Set standard deviation of beam position in y-dir(obsolete!)"); possigmayCmd->SetParameterName("Sigmay",true,true); possigmayCmd->SetDefaultUnit("cm"); possigmayCmd->SetUnitCandidates("micron mm cm m km"); paralpCmd = new G4UIcmdWithADoubleAndUnit("/gps/paralp",this); - paralpCmd->SetGuidance("Angle from y-axis of y' in Para"); + paralpCmd->SetGuidance("Angle from y-axis of y' in Para(obsolete!)"); paralpCmd->SetParameterName("paralp",true,true); paralpCmd->SetDefaultUnit("rad"); paralpCmd->SetUnitCandidates("rad deg"); partheCmd = new G4UIcmdWithADoubleAndUnit("/gps/parthe",this); - partheCmd->SetGuidance("Polar angle through centres of z faces"); + partheCmd->SetGuidance("Polar angle through centres of z faces(obsolete!)"); partheCmd->SetParameterName("parthe",true,true); partheCmd->SetDefaultUnit("rad"); partheCmd->SetUnitCandidates("rad deg"); parphiCmd = new G4UIcmdWithADoubleAndUnit("/gps/parphi",this); - parphiCmd->SetGuidance("Azimuth angle through centres of z faces"); + parphiCmd->SetGuidance("Azimuth angle through centres of z faces(obsolete!)"); parphiCmd->SetParameterName("parphi",true,true); parphiCmd->SetDefaultUnit("rad"); parphiCmd->SetUnitCandidates("rad deg"); confineCmd = new G4UIcmdWithAString("/gps/confine",this); - confineCmd->SetGuidance("Confine source to volume (NULL to unset)."); + confineCmd->SetGuidance("Confine source to volume (NULL to unset)(obsolete!) ."); confineCmd->SetGuidance("usage: confine VolName"); confineCmd->SetParameterName("VolName",true,true); confineCmd->SetDefaultValue("NULL"); // Angular distribution commands + angularDirectory = new G4UIdirectory("/gps/ang/"); + angularDirectory->SetGuidance("Angular commands sub-directory"); + + angtypeCmd1 = new G4UIcmdWithAString("/gps/ang/type",this); + angtypeCmd1->SetGuidance("Sets angular source distribution type"); + angtypeCmd1->SetGuidance("Possible variables are: iso, cos planar beam1d beam2d or user"); + angtypeCmd1->SetParameterName("AngDis",true,true); + angtypeCmd1->SetDefaultValue("iso"); + angtypeCmd1->SetCandidates("iso cos planar beam1d beam2d user"); + + angrot1Cmd1 = new G4UIcmdWith3Vector("/gps/ang/rot1",this); + angrot1Cmd1->SetGuidance("Sets the 1st vector for angular distribution rotation matrix"); + angrot1Cmd1->SetGuidance("Need not be a unit vector"); + angrot1Cmd1->SetParameterName("AR1x","AR1y","AR1z",true,true); + angrot1Cmd1->SetRange("AR1x != 0 || AR1y != 0 || AR1z != 0"); + + angrot2Cmd1 = new G4UIcmdWith3Vector("/gps/ang/rot2",this); + angrot2Cmd1->SetGuidance("Sets the 2nd vector for angular distribution rotation matrix"); + angrot2Cmd1->SetGuidance("Need not be a unit vector"); + angrot2Cmd1->SetParameterName("AR2x","AR2y","AR2z",true,true); + angrot2Cmd1->SetRange("AR2x != 0 || AR2y != 0 || AR2z != 0"); + + minthetaCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/mintheta",this); + minthetaCmd1->SetGuidance("Set minimum theta"); + minthetaCmd1->SetParameterName("MinTheta",true,true); + minthetaCmd1->SetDefaultValue(0.); + minthetaCmd1->SetDefaultUnit("rad"); + minthetaCmd1->SetUnitCandidates("rad deg"); + + maxthetaCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/maxtheta",this); + maxthetaCmd1->SetGuidance("Set maximum theta"); + maxthetaCmd1->SetParameterName("MaxTheta",true,true); + maxthetaCmd1->SetDefaultValue(pi); + maxthetaCmd1->SetDefaultUnit("rad"); + maxthetaCmd1->SetUnitCandidates("rad deg"); + + minphiCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/minphi",this); + minphiCmd1->SetGuidance("Set minimum phi"); + minphiCmd1->SetParameterName("MinPhi",true,true); + minphiCmd1->SetDefaultUnit("rad"); + minphiCmd1->SetUnitCandidates("rad deg"); + + maxphiCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/maxphi",this); + maxphiCmd1->SetGuidance("Set maximum phi"); + maxphiCmd1->SetParameterName("MaxPhi",true,true); + maxphiCmd1->SetDefaultValue(pi); + maxphiCmd1->SetDefaultUnit("rad"); + maxphiCmd1->SetUnitCandidates("rad deg"); + + angsigmarCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/sigma_r",this); + angsigmarCmd1->SetGuidance("Set standard deviation in direction for 1D beam."); + angsigmarCmd1->SetParameterName("Sigmara",true,true); + angsigmarCmd1->SetDefaultUnit("rad"); + angsigmarCmd1->SetUnitCandidates("rad deg"); + + angsigmaxCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/sigma_x",this); + angsigmaxCmd1->SetGuidance("Set standard deviation in direction in x-direc. for 2D beam"); + angsigmaxCmd1->SetParameterName("Sigmaxa",true,true); + angsigmaxCmd1->SetDefaultUnit("rad"); + angsigmaxCmd1->SetUnitCandidates("rad deg"); + + angsigmayCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ang/sigma_y",this); + angsigmayCmd1->SetGuidance("Set standard deviation in direction in y-direc. for 2D beam"); + angsigmayCmd1->SetParameterName("Sigmaya",true,true); + angsigmayCmd1->SetDefaultUnit("rad"); + angsigmayCmd1->SetUnitCandidates("rad deg"); + + useuserangaxisCmd1 = new G4UIcmdWithABool("/gps/ang/user_coor",this); + useuserangaxisCmd1->SetGuidance("true for using user defined angular co-ordinates"); + useuserangaxisCmd1->SetGuidance("Default is false"); + useuserangaxisCmd1->SetParameterName("useuserangaxis",true); + useuserangaxisCmd1->SetDefaultValue(false); + + surfnormCmd1 = new G4UIcmdWithABool("/gps/ang/surfnorm",this); + surfnormCmd1->SetGuidance("Makes a user-defined distribution with respect to surface normals rather than x,y,z axes."); + surfnormCmd1->SetGuidance("Default is false"); + surfnormCmd1->SetParameterName("surfnorm",true); + surfnormCmd1->SetDefaultValue(false); + + // old ones angtypeCmd = new G4UIcmdWithAString("/gps/angtype",this); - angtypeCmd->SetGuidance("Sets angular source distribution type"); + angtypeCmd->SetGuidance("Sets angular source distribution type (obsolete!)"); angtypeCmd->SetGuidance("Possible variables are: iso, cos planar beam1d beam2d or user"); angtypeCmd->SetParameterName("AngDis",true,true); angtypeCmd->SetDefaultValue("iso"); angtypeCmd->SetCandidates("iso cos planar beam1d beam2d user"); angrot1Cmd = new G4UIcmdWith3Vector("/gps/angrot1",this); - angrot1Cmd->SetGuidance("Sets the x' vector for angular distribution"); + angrot1Cmd->SetGuidance("Sets the x' vector for angular distribution(obsolete!) "); angrot1Cmd->SetGuidance("Need not be a unit vector"); angrot1Cmd->SetParameterName("AR1x","AR1y","AR1z",true,true); angrot1Cmd->SetRange("AR1x != 0 || AR1y != 0 || AR1z != 0"); angrot2Cmd = new G4UIcmdWith3Vector("/gps/angrot2",this); - angrot2Cmd->SetGuidance("Sets the y' vector for angular distribution"); + angrot2Cmd->SetGuidance("Sets the y' vector for angular distribution (obsolete!)"); angrot2Cmd->SetGuidance("Need not be a unit vector"); angrot2Cmd->SetParameterName("AR2x","AR2y","AR2z",true,true); angrot2Cmd->SetRange("AR2x != 0 || AR2y != 0 || AR2z != 0"); minthetaCmd = new G4UIcmdWithADoubleAndUnit("/gps/mintheta",this); - minthetaCmd->SetGuidance("Set minimum theta"); + minthetaCmd->SetGuidance("Set minimum theta (obsolete!)"); minthetaCmd->SetParameterName("MinTheta",true,true); minthetaCmd->SetDefaultUnit("rad"); minthetaCmd->SetUnitCandidates("rad deg"); maxthetaCmd = new G4UIcmdWithADoubleAndUnit("/gps/maxtheta",this); - maxthetaCmd->SetGuidance("Set maximum theta"); + maxthetaCmd->SetGuidance("Set maximum theta (obsolete!)"); maxthetaCmd->SetParameterName("MaxTheta",true,true); maxthetaCmd->SetDefaultValue(3.1416); maxthetaCmd->SetDefaultUnit("rad"); maxthetaCmd->SetUnitCandidates("rad deg"); minphiCmd = new G4UIcmdWithADoubleAndUnit("/gps/minphi",this); - minphiCmd->SetGuidance("Set minimum phi"); + minphiCmd->SetGuidance("Set minimum phi (obsolete!)"); minphiCmd->SetParameterName("MinPhi",true,true); minphiCmd->SetDefaultUnit("rad"); minphiCmd->SetUnitCandidates("rad deg"); maxphiCmd = new G4UIcmdWithADoubleAndUnit("/gps/maxphi",this); - maxphiCmd->SetGuidance("Set maximum phi"); + maxphiCmd->SetGuidance("Set maximum phi(obsolete!)"); maxphiCmd->SetParameterName("MaxPhi",true,true); maxphiCmd->SetDefaultUnit("rad"); maxphiCmd->SetUnitCandidates("rad deg"); angsigmarCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaangr",this); - angsigmarCmd->SetGuidance("Set standard deviation of beam direction in radial."); + angsigmarCmd->SetGuidance("Set standard deviation of beam direction in radial(obsolete!)."); angsigmarCmd->SetParameterName("Sigmara",true,true); angsigmarCmd->SetDefaultUnit("rad"); angsigmarCmd->SetUnitCandidates("rad deg"); angsigmaxCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaangx",this); - angsigmaxCmd->SetGuidance("Set standard deviation of beam direction in x-direc."); + angsigmaxCmd->SetGuidance("Set standard deviation of beam direction in x-direc(obsolete!)."); angsigmaxCmd->SetParameterName("Sigmaxa",true,true); angsigmaxCmd->SetDefaultUnit("rad"); angsigmaxCmd->SetUnitCandidates("rad deg"); angsigmayCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmaangy",this); - angsigmayCmd->SetGuidance("Set standard deviation of beam direction in y-direc."); + angsigmayCmd->SetGuidance("Set standard deviation of beam direction in y-direc.(obsolete!)"); angsigmayCmd->SetParameterName("Sigmaya",true,true); angsigmayCmd->SetDefaultUnit("rad"); angsigmayCmd->SetUnitCandidates("rad deg"); useuserangaxisCmd = new G4UIcmdWithABool("/gps/useuserangaxis",this); - useuserangaxisCmd->SetGuidance("true for using user defined angular co-ordinates"); + useuserangaxisCmd->SetGuidance("true for using user defined angular co-ordinates(obsolete!)"); useuserangaxisCmd->SetGuidance("Default is false"); useuserangaxisCmd->SetParameterName("useuserangaxis",true); useuserangaxisCmd->SetDefaultValue(false); surfnormCmd = new G4UIcmdWithABool("/gps/surfnorm",this); - surfnormCmd->SetGuidance("Makes a user-defined distribution with respect to surface normals rather than x,y,z axes."); + surfnormCmd->SetGuidance("Makes a user-defined distribution with respect to surface normals rather than x,y,z axes (obsolete!)."); surfnormCmd->SetGuidance("Default is false"); surfnormCmd->SetParameterName("surfnorm",true); surfnormCmd->SetDefaultValue(false); - // Energy + // Energy commands + + energyDirectory = new G4UIdirectory("/gps/ene/"); + energyDirectory->SetGuidance("Spectral commands sub-directory"); + + energytypeCmd1 = new G4UIcmdWithAString("/gps/ene/type",this); + energytypeCmd1->SetGuidance("Sets energy distribution type"); + energytypeCmd1->SetParameterName("EnergyDis",true,true); + energytypeCmd1->SetDefaultValue("Mono"); + energytypeCmd1->SetCandidates("Mono Lin Pow Exp Gauss Brem Bbody Cdg User Arb Epn"); + + eminCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ene/min",this); + eminCmd1->SetGuidance("Sets minimum energy"); + eminCmd1->SetParameterName("emin",true,true); + eminCmd1->SetDefaultUnit("keV"); + eminCmd1->SetUnitCandidates("eV keV MeV GeV TeV PeV"); + + emaxCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ene/max",this); + emaxCmd1->SetGuidance("Sets maximum energy"); + emaxCmd1->SetParameterName("emax",true,true); + emaxCmd1->SetDefaultUnit("keV"); + emaxCmd1->SetUnitCandidates("eV keV MeV GeV TeV PeV"); + + monoenergyCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ene/mono",this); + monoenergyCmd1->SetGuidance("Sets a monocromatic energy (same as gps/energy)"); + monoenergyCmd1->SetParameterName("monoenergy",true,true); + monoenergyCmd1->SetDefaultUnit("keV"); + monoenergyCmd1->SetUnitCandidates("eV keV MeV GeV TeV PeV"); + + engsigmaCmd1 = new G4UIcmdWithADoubleAndUnit("/gps/ene/sigma",this); + engsigmaCmd1->SetGuidance("Sets the standard deviation for Gaussian energy dist."); + engsigmaCmd1->SetParameterName("Sigmae",true,true); + engsigmaCmd1->SetDefaultUnit("keV"); + engsigmaCmd1->SetUnitCandidates("eV keV MeV GeV TeV PeV"); + + alphaCmd1 = new G4UIcmdWithADouble("/gps/ene/alpha",this); + alphaCmd1->SetGuidance("Sets Alpha (index) for power-law energy dist."); + alphaCmd1->SetParameterName("alpha",true,true); + + tempCmd1 = new G4UIcmdWithADouble("/gps/ene/temp",this); + tempCmd1->SetGuidance("Sets the temperature for Brem and BBody distributions (in Kelvin)"); + tempCmd1->SetParameterName("temp",true,true); + + ezeroCmd1 = new G4UIcmdWithADouble("/gps/ene/ezero",this); + ezeroCmd1->SetGuidance("Sets E_0 for exponential distribution (in MeV)"); + ezeroCmd1->SetParameterName("ezero",true,true); + + gradientCmd1 = new G4UIcmdWithADouble("/gps/ene/gradient",this); + gradientCmd1->SetGuidance("Sets the gradient for Lin distribution (in 1/MeV)"); + gradientCmd1->SetParameterName("gradient",true,true); + + interceptCmd1 = new G4UIcmdWithADouble("/gps/ene/intercept",this); + interceptCmd1->SetGuidance("Sets the intercept for Lin distributions (in MeV)"); + interceptCmd1->SetParameterName("intercept",true,true); + + calculateCmd1 = new G4UIcmdWithoutParameter("/gps/ene/calculate",this); + calculateCmd1->SetGuidance("Calculates the distributions for Cdg and BBody"); + + energyspecCmd1 = new G4UIcmdWithABool("/gps/ene/emspec",this); + energyspecCmd1->SetGuidance("True for energy and false for momentum spectra"); + energyspecCmd1->SetParameterName("energyspec",true); + energyspecCmd1->SetDefaultValue(true); + + diffspecCmd1 = new G4UIcmdWithABool("/gps/ene/diffspec",this); + diffspecCmd1->SetGuidance("True for differential and flase for integral spectra"); + diffspecCmd1->SetParameterName("diffspec",true); + diffspecCmd1->SetDefaultValue(true); + + //old ones energytypeCmd = new G4UIcmdWithAString("/gps/energytype",this); - energytypeCmd->SetGuidance("Sets energy distribution type"); + energytypeCmd->SetGuidance("Sets energy distribution type (obsolete!)"); energytypeCmd->SetParameterName("EnergyDis",true,true); energytypeCmd->SetDefaultValue("Mono"); energytypeCmd->SetCandidates("Mono Lin Pow Exp Gauss Brem Bbody Cdg User Arb Epn"); eminCmd = new G4UIcmdWithADoubleAndUnit("/gps/emin",this); - eminCmd->SetGuidance("Sets Emin"); + eminCmd->SetGuidance("Sets Emin (obsolete!)"); eminCmd->SetParameterName("emin",true,true); eminCmd->SetDefaultUnit("keV"); eminCmd->SetUnitCandidates("eV keV MeV GeV TeV PeV"); emaxCmd = new G4UIcmdWithADoubleAndUnit("/gps/emax",this); - emaxCmd->SetGuidance("Sets Emax"); + emaxCmd->SetGuidance("Sets Emax (obsolete!)"); emaxCmd->SetParameterName("emax",true,true); emaxCmd->SetDefaultUnit("keV"); emaxCmd->SetUnitCandidates("eV keV MeV GeV TeV PeV"); @@ -384,83 +672,103 @@ G4GeneralParticleSourceMessenger::G4GeneralParticleSourceMessenger monoenergyCmd->SetUnitCandidates("eV keV MeV GeV TeV PeV"); engsigmaCmd = new G4UIcmdWithADoubleAndUnit("/gps/sigmae",this); - engsigmaCmd->SetGuidance("Sets the standard deviation for Gaussian energy dist."); + engsigmaCmd->SetGuidance("Sets the standard deviation for Gaussian energy dist.(obsolete!)"); engsigmaCmd->SetParameterName("Sigmae",true,true); engsigmaCmd->SetDefaultUnit("keV"); engsigmaCmd->SetUnitCandidates("eV keV MeV GeV TeV PeV"); alphaCmd = new G4UIcmdWithADouble("/gps/alpha",this); - alphaCmd->SetGuidance("Sets Alpha (index) for power-law energy dist."); + alphaCmd->SetGuidance("Sets Alpha (index) for power-law energy dist(obsolete!)."); alphaCmd->SetParameterName("alpha",true,true); tempCmd = new G4UIcmdWithADouble("/gps/temp",this); - tempCmd->SetGuidance("Sets the temperature for Brem and BBody (in Kelvin)"); + tempCmd->SetGuidance("Sets the temperature for Brem and BBody (in Kelvin)(obsolete!)"); tempCmd->SetParameterName("temp",true,true); ezeroCmd = new G4UIcmdWithADouble("/gps/ezero",this); - ezeroCmd->SetGuidance("Sets ezero exponential distributions (in MeV)"); + ezeroCmd->SetGuidance("Sets ezero exponential distributions (in MeV)(obsolete!)"); ezeroCmd->SetParameterName("ezero",true,true); gradientCmd = new G4UIcmdWithADouble("/gps/gradient",this); - gradientCmd->SetGuidance("Sets the gradient for Lin distributions (in 1/MeV)"); + gradientCmd->SetGuidance("Sets the gradient for Lin distributions (in 1/MeV)(obsolete!)"); gradientCmd->SetParameterName("gradient",true,true); interceptCmd = new G4UIcmdWithADouble("/gps/intercept",this); - interceptCmd->SetGuidance("Sets the intercept for Lin distributions (in MeV)"); + interceptCmd->SetGuidance("Sets the intercept for Lin distributions (in MeV)(obsolete!)"); interceptCmd->SetParameterName("intercept",true,true); calculateCmd = new G4UIcmdWithoutParameter("/gps/calculate",this); - calculateCmd->SetGuidance("Calculates distributions for Cdg and BBody"); + calculateCmd->SetGuidance("Calculates distributions for Cdg and BBody(obsolete!)"); energyspecCmd = new G4UIcmdWithABool("/gps/energyspec",this); - energyspecCmd->SetGuidance("True for energy and false for momentum spectra"); + energyspecCmd->SetGuidance("True for energy and false for momentum spectra(obsolete!)"); energyspecCmd->SetParameterName("energyspec",true); energyspecCmd->SetDefaultValue(true); diffspecCmd = new G4UIcmdWithABool("/gps/diffspec",this); - diffspecCmd->SetGuidance("True for differential and flase for integral spectra"); + diffspecCmd->SetGuidance("True for differential and flase for integral spectra(obsolete!)"); diffspecCmd->SetParameterName("diffspec",true); diffspecCmd->SetDefaultValue(true); // Biasing + histograms in general + histDirectory = new G4UIdirectory("/gps/hist/"); + histDirectory->SetGuidance("Histogram, biasing commands sub-directory"); + + histnameCmd1 = new G4UIcmdWithAString("/gps/hist/type",this); + histnameCmd1->SetGuidance("Sets histogram type"); + histnameCmd1->SetParameterName("HistType",true,true); + histnameCmd1->SetDefaultValue("biasx"); + histnameCmd1->SetCandidates("biasx biasy biasz biast biasp biase theta phi energy arb epn"); + + resethistCmd1 = new G4UIcmdWithAString("/gps/hist/reset",this); + resethistCmd1->SetGuidance("Reset (clean) the histogram "); + resethistCmd1->SetParameterName("HistType",true,true); + resethistCmd1->SetDefaultValue("energy"); + resethistCmd1->SetCandidates("biasx biasy biasz biast biasp biase theta phi energy arb epn"); + + histpointCmd1 = new G4UIcmdWith3Vector("/gps/hist/point",this); + histpointCmd1->SetGuidance("Allows user to define a histogram"); + histpointCmd1->SetGuidance("Enter: Ehi Weight"); + histpointCmd1->SetParameterName("Ehi","Weight","Junk",true,true); + histpointCmd1->SetRange("Ehi >= 0. && Weight >= 0."); + + arbintCmd1 = new G4UIcmdWithAString("/gps/hist/inter",this); + arbintCmd1->SetGuidance("Sets the interpolation method for arbitrary distribution."); + arbintCmd1->SetParameterName("int",true,true); + arbintCmd1->SetDefaultValue("Lin"); + arbintCmd1->SetCandidates("Lin Log Exp Spline"); + + // old ones histnameCmd = new G4UIcmdWithAString("/gps/histname",this); - histnameCmd->SetGuidance("Sets histogram type"); + histnameCmd->SetGuidance("Sets histogram type (obsolete!)"); histnameCmd->SetParameterName("HistType",true,true); histnameCmd->SetDefaultValue("biasx"); histnameCmd->SetCandidates("biasx biasy biasz biast biasp biase theta phi energy arb epn"); // re-set the histograms resethistCmd = new G4UIcmdWithAString("/gps/resethist",this); - resethistCmd->SetGuidance("Re-Set the histogram "); + resethistCmd->SetGuidance("Re-Set the histogram (obsolete!)"); resethistCmd->SetParameterName("HistType",true,true); resethistCmd->SetDefaultValue("energy"); resethistCmd->SetCandidates("biasx biasy biasz biast biasp biase theta phi energy arb epn"); histpointCmd = new G4UIcmdWith3Vector("/gps/histpoint",this); - histpointCmd->SetGuidance("Allows user to define a histogram"); + histpointCmd->SetGuidance("Allows user to define a histogram (obsolete!)"); histpointCmd->SetGuidance("Enter: Ehi Weight"); histpointCmd->SetParameterName("Ehi","Weight","Junk",true,true); histpointCmd->SetRange("Ehi >= 0. && Weight >= 0."); arbintCmd = new G4UIcmdWithAString("/gps/arbint",this); - arbintCmd->SetGuidance("Sets Arbitrary Interpolation type."); + arbintCmd->SetGuidance("Sets Arbitrary Interpolation type.(obsolete!) "); arbintCmd->SetParameterName("int",true,true); arbintCmd->SetDefaultValue("NULL"); arbintCmd->SetCandidates("Lin Log Exp Spline"); - // verbosity - verbosityCmd = new G4UIcmdWithAnInteger("/gps/verbose",this); - verbosityCmd->SetGuidance("Set Verbose level for GPS"); - verbosityCmd->SetGuidance(" 0 : Silent"); - verbosityCmd->SetGuidance(" 1 : Limited information"); - verbosityCmd->SetGuidance(" 2 : Detailed information"); - verbosityCmd->SetParameterName("level",false); - verbosityCmd->SetRange("level>=0 && level <=2"); - } G4GeneralParticleSourceMessenger::~G4GeneralParticleSourceMessenger() { + delete positionDirectory; delete typeCmd; delete shapeCmd; delete centreCmd; @@ -478,7 +786,25 @@ G4GeneralParticleSourceMessenger::~G4GeneralParticleSourceMessenger() delete partheCmd; delete parphiCmd; delete confineCmd; + delete typeCmd1; + delete shapeCmd1; + delete centreCmd1; + delete posrot1Cmd1; + delete posrot2Cmd1; + delete halfxCmd1; + delete halfyCmd1; + delete halfzCmd1; + delete radiusCmd1; + delete radius0Cmd1; + delete possigmarCmd1; + delete possigmaxCmd1; + delete possigmayCmd1; + delete paralpCmd1; + delete partheCmd1; + delete parphiCmd1; + delete confineCmd1; + delete angularDirectory; delete angtypeCmd; delete angrot1Cmd; delete angrot2Cmd; @@ -491,7 +817,20 @@ G4GeneralParticleSourceMessenger::~G4GeneralParticleSourceMessenger() delete angsigmayCmd; delete useuserangaxisCmd; delete surfnormCmd; + delete angtypeCmd1; + delete angrot1Cmd1; + delete angrot2Cmd1; + delete minthetaCmd1; + delete maxthetaCmd1; + delete minphiCmd1; + delete maxphiCmd1; + delete angsigmarCmd1; + delete angsigmaxCmd1; + delete angsigmayCmd1; + delete useuserangaxisCmd1; + delete surfnormCmd1; + delete energyDirectory; delete energytypeCmd; delete eminCmd; delete emaxCmd; @@ -505,11 +844,29 @@ G4GeneralParticleSourceMessenger::~G4GeneralParticleSourceMessenger() delete calculateCmd; delete energyspecCmd; delete diffspecCmd; + delete energytypeCmd1; + delete eminCmd1; + delete emaxCmd1; + delete monoenergyCmd1; + delete engsigmaCmd1; + delete alphaCmd1; + delete tempCmd1; + delete ezeroCmd1; + delete gradientCmd1; + delete interceptCmd1; + delete calculateCmd1; + delete energyspecCmd1; + delete diffspecCmd1; + delete histDirectory; delete histnameCmd; delete resethistCmd; delete histpointCmd; delete arbintCmd; + delete histnameCmd1; + delete resethistCmd1; + delete histpointCmd1; + delete arbintCmd1; delete verbosityCmd; delete ionCmd; @@ -517,223 +874,299 @@ G4GeneralParticleSourceMessenger::~G4GeneralParticleSourceMessenger() delete timeCmd; delete polCmd; delete numberCmd; - delete positionCmd; delete directionCmd; delete energyCmd; delete listCmd; + delete sourceDirectory; + delete addsourceCmd; + delete listsourceCmd; + delete clearsourceCmd; + delete getsourceCmd; + delete setsourceCmd; + delete setintensityCmd; + delete deletesourceCmd; + delete gpsDirectory; + } void G4GeneralParticleSourceMessenger::SetNewValue(G4UIcommand *command, G4String newValues) { if(command == typeCmd) { - fParticleGun->SetPosDisType(newValues); + fParticleGun->GetPosDist()->SetPosDisType(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == shapeCmd) { - fParticleGun->SetPosDisShape(newValues); + fParticleGun->GetPosDist()->SetPosDisShape(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == centreCmd) { - fParticleGun->SetCentreCoords(centreCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetPosDist()->SetCentreCoords(centreCmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == posrot1Cmd) { - fParticleGun->SetPosRot1(posrot1Cmd->GetNew3VectorValue(newValues)); + fParticleGun->GetPosDist()->SetPosRot1(posrot1Cmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == posrot2Cmd) { - fParticleGun->SetPosRot2(posrot2Cmd->GetNew3VectorValue(newValues)); + fParticleGun->GetPosDist()->SetPosRot2(posrot2Cmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == halfxCmd) { - fParticleGun->SetHalfX(halfxCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetHalfX(halfxCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == halfyCmd) { - fParticleGun->SetHalfY(halfyCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetHalfY(halfyCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == halfzCmd) { - fParticleGun->SetHalfZ(halfzCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetHalfZ(halfzCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == radiusCmd) { - fParticleGun->SetRadius(radiusCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetRadius(radiusCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == radius0Cmd) { - fParticleGun->SetRadius0(radius0Cmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetRadius0(radius0Cmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == possigmarCmd) { - fParticleGun->SetBeamSigmaInR(possigmarCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetBeamSigmaInR(possigmarCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == possigmaxCmd) { - fParticleGun->SetBeamSigmaInX(possigmaxCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetBeamSigmaInX(possigmaxCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == possigmayCmd) { - fParticleGun->SetBeamSigmaInY(possigmayCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetBeamSigmaInY(possigmayCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == paralpCmd) { - fParticleGun->SetParAlpha(paralpCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetParAlpha(paralpCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == partheCmd) { - fParticleGun->SetParTheta(partheCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetParTheta(partheCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == parphiCmd) { - fParticleGun->SetParPhi(parphiCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetPosDist()->SetParPhi(parphiCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == confineCmd) { - fParticleGun->ConfineSourceToVolume(newValues); + fParticleGun->GetPosDist()->ConfineSourceToVolume(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angtypeCmd) { - fParticleGun->SetAngDistType(newValues); + fParticleGun->GetAngDist()->SetAngDistType(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angrot1Cmd) { G4String a = "angref1"; - fParticleGun->DefineAngRefAxes(a,angrot1Cmd->GetNew3VectorValue(newValues)); + fParticleGun->GetAngDist()->DefineAngRefAxes(a,angrot1Cmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angrot2Cmd) { G4String a = "angref2"; - fParticleGun->DefineAngRefAxes(a,angrot2Cmd->GetNew3VectorValue(newValues)); + fParticleGun->GetAngDist()->DefineAngRefAxes(a,angrot2Cmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == minthetaCmd) { - fParticleGun->SetMinTheta(minthetaCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetMinTheta(minthetaCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == minphiCmd) { - fParticleGun->SetMinPhi(minphiCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetMinPhi(minphiCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == maxthetaCmd) { - fParticleGun->SetMaxTheta(maxthetaCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetMaxTheta(maxthetaCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == maxphiCmd) { - fParticleGun->SetMaxPhi(maxphiCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetMaxPhi(maxphiCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angsigmarCmd) { - fParticleGun->SetBeamSigmaInAngR(angsigmarCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetBeamSigmaInAngR(angsigmarCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angsigmaxCmd) { - fParticleGun->SetBeamSigmaInAngX(angsigmaxCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetBeamSigmaInAngX(angsigmaxCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == angsigmayCmd) { - fParticleGun->SetBeamSigmaInAngY(angsigmayCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetAngDist()->SetBeamSigmaInAngY(angsigmayCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == useuserangaxisCmd) { - fParticleGun->SetUseUserAngAxis(useuserangaxisCmd->GetNewBoolValue(newValues)); + fParticleGun->GetAngDist()->SetUseUserAngAxis(useuserangaxisCmd->GetNewBoolValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == surfnormCmd) { - fParticleGun->SetUserWRTSurface(surfnormCmd->GetNewBoolValue(newValues)); + fParticleGun->GetAngDist()->SetUserWRTSurface(surfnormCmd->GetNewBoolValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == energytypeCmd) { - fParticleGun->SetEnergyDisType(newValues); + fParticleGun->GetEneDist()->SetEnergyDisType(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == eminCmd) { - fParticleGun->SetEmin(eminCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetEmin(eminCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == emaxCmd) { - fParticleGun->SetEmax(emaxCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetEmax(emaxCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == monoenergyCmd) { - fParticleGun->SetMonoEnergy(monoenergyCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetMonoEnergy(monoenergyCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == engsigmaCmd) { - fParticleGun->SetBeamSigmaInE(engsigmaCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetBeamSigmaInE(engsigmaCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == alphaCmd) { - fParticleGun->SetAlpha(alphaCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetAlpha(alphaCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == tempCmd) { - fParticleGun->SetTemp(tempCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetTemp(tempCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == ezeroCmd) { - fParticleGun->SetEzero(ezeroCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetEzero(ezeroCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == gradientCmd) { - fParticleGun->SetGradient(gradientCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetGradient(gradientCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == interceptCmd) { - fParticleGun->SetInterCept(interceptCmd->GetNewDoubleValue(newValues)); + fParticleGun->GetEneDist()->SetInterCept(interceptCmd->GetNewDoubleValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == calculateCmd) { - fParticleGun->Calculate(); + fParticleGun->GetEneDist()->Calculate(); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == energyspecCmd) { - fParticleGun->InputEnergySpectra(energyspecCmd->GetNewBoolValue(newValues)); + fParticleGun->GetEneDist()->InputEnergySpectra(energyspecCmd->GetNewBoolValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == diffspecCmd) { - fParticleGun->InputDifferentialSpectra(diffspecCmd->GetNewBoolValue(newValues)); + fParticleGun->GetEneDist()->InputDifferentialSpectra(diffspecCmd->GetNewBoolValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == histnameCmd) { histtype = newValues; + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == histpointCmd) { if(histtype == "biasx") - fParticleGun->SetXBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetXBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "biasy") - fParticleGun->SetYBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetYBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "biasz") - fParticleGun->SetZBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetZBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "biast") - fParticleGun->SetThetaBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetThetaBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "biasp") - fParticleGun->SetPhiBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetPhiBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "biase") - fParticleGun->SetEnergyBias(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetBiasRndm()->SetEnergyBias(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "theta") - fParticleGun->UserDefAngTheta(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetAngDist()->UserDefAngTheta(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "phi") - fParticleGun->UserDefAngPhi(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetAngDist()->UserDefAngPhi(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "energy") - fParticleGun->UserEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetEneDist()->UserEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "arb") - fParticleGun->ArbEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetEneDist()->ArbEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); if(histtype == "epn") - fParticleGun->EpnEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); + fParticleGun->GetEneDist()->EpnEnergyHisto(histpointCmd->GetNew3VectorValue(newValues)); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == resethistCmd) { - fParticleGun->ReSetHist(newValues); + if(newValues == "theta" || newValues == "phi") { + fParticleGun->GetAngDist()->ReSetHist(newValues); + } else if (newValues == "energy" || newValues == "arb" || newValues == "epn") { + fParticleGun->GetEneDist()->ReSetHist(newValues); + } else { + fParticleGun->GetBiasRndm()->ReSetHist(newValues); + } + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; } else if(command == arbintCmd) { - fParticleGun->ArbInterpolate(newValues); + fParticleGun->GetEneDist()->ArbInterpolate(newValues); + G4cout << " Warning: The commond is obsolete and will be removed soon. Please try to use the new structured commands!" << G4endl; + } + else if( command==directionCmd ) + { + fParticleGun->GetAngDist()->SetAngDistType("planar"); + fParticleGun->GetAngDist()->SetParticleMomentumDirection(directionCmd->GetNew3VectorValue(newValues)); + } + else if( command==energyCmd ) + { + fParticleGun->GetEneDist()->SetEnergyDisType("Mono"); + fParticleGun->GetEneDist()->SetMonoEnergy(energyCmd->GetNewDoubleValue(newValues)); + } + else if( command==positionCmd ) + { + fParticleGun->GetPosDist()->SetPosDisType("Point"); + fParticleGun->GetPosDist()->SetCentreCoords(positionCmd->GetNew3VectorValue(newValues)); } else if(command == verbosityCmd) { @@ -745,15 +1178,11 @@ void G4GeneralParticleSourceMessenger::SetNewValue(G4UIcommand *command, G4Strin fShootIon = true; } else { fShootIon = false; - G4ParticleDefinition* pd = particleTable->FindParticle(newValues); - if(pd != NULL) - { fParticleGun->SetParticleDefinition( pd ); } + G4ParticleDefinition* pd = particleTable->FindParticle(newValues); + if(pd != NULL) + { fParticleGun->SetParticleDefinition( pd ); } } } - // else if(command == ionCmd) - // { - // fParticleGun->SetNucleus(ionCmd->GetNewNucleusValue(newValues)); - // } else if( command==timeCmd ) { fParticleGun->SetParticleTime(timeCmd->GetNewDoubleValue(newValues)); } else if( command==polCmd ) @@ -762,24 +1191,255 @@ void G4GeneralParticleSourceMessenger::SetNewValue(G4UIcommand *command, G4Strin { fParticleGun->SetNumberOfParticles(numberCmd->GetNewIntValue(newValues)); } else if( command==ionCmd ) { IonCommand(newValues); } - else if( command==listCmd ) - { particleTable->DumpTable(); } - else if( command==directionCmd ) + else if( command==listCmd ){ + particleTable->DumpTable(); + } + else if( command==addsourceCmd ) { - fParticleGun->SetAngDistType("planar"); - fParticleGun->SetParticleMomentumDirection(directionCmd->GetNew3VectorValue(newValues)); + fGPS->AddaSource(addsourceCmd->GetNewDoubleValue(newValues)); } - else if( command==energyCmd ) - { - fParticleGun->SetEnergyDisType("Mono"); - fParticleGun->SetMonoEnergy(energyCmd->GetNewDoubleValue(newValues)); - } - else if( command==positionCmd ) + else if( command==listsourceCmd ) { - fParticleGun->SetPosDisType("Point"); - fParticleGun->SetCentreCoords(positionCmd->GetNew3VectorValue(newValues)); + fGPS->ListSource(); } - else + else if( command==clearsourceCmd ) + { + fGPS->ClearAll(); + } + else if( command==getsourceCmd ) + { + G4cout << " Current source index:" << fGPS->GetCurrentSourceIndex() + << " ; Intensity:" << fGPS->GetCurrentSourceIntensity() << G4endl; + } + else if( command==setsourceCmd ) + { + fGPS->SetCurrentSourceto(setsourceCmd->GetNewIntValue(newValues)); + } + else if( command==setintensityCmd ) + { + fGPS->SetCurrentSourceIntensity(setintensityCmd->GetNewDoubleValue(newValues)); + } + else if( command==deletesourceCmd ) + { + fGPS->DeleteaSource(deletesourceCmd->GetNewIntValue(newValues)); + } + // new implementations + // + // + else if(command == typeCmd1) + { + fParticleGun->GetPosDist()->SetPosDisType(newValues); + } + else if(command == shapeCmd1) + { + fParticleGun->GetPosDist()->SetPosDisShape(newValues); + } + else if(command == centreCmd1) + { + fParticleGun->GetPosDist()->SetCentreCoords(centreCmd1->GetNew3VectorValue(newValues)); + } + else if(command == posrot1Cmd1) + { + fParticleGun->GetPosDist()->SetPosRot1(posrot1Cmd1->GetNew3VectorValue(newValues)); + } + else if(command == posrot2Cmd1) + { + fParticleGun->GetPosDist()->SetPosRot2(posrot2Cmd1->GetNew3VectorValue(newValues)); + } + else if(command == halfxCmd1) + { + fParticleGun->GetPosDist()->SetHalfX(halfxCmd1->GetNewDoubleValue(newValues)); + } + else if(command == halfyCmd1) + { + fParticleGun->GetPosDist()->SetHalfY(halfyCmd1->GetNewDoubleValue(newValues)); + } + else if(command == halfzCmd1) + { + fParticleGun->GetPosDist()->SetHalfZ(halfzCmd1->GetNewDoubleValue(newValues)); + } + else if(command == radiusCmd1) + { + fParticleGun->GetPosDist()->SetRadius(radiusCmd1->GetNewDoubleValue(newValues)); + } + else if(command == radius0Cmd1) + { + fParticleGun->GetPosDist()->SetRadius0(radius0Cmd1->GetNewDoubleValue(newValues)); + } + else if(command == possigmarCmd1) + { + fParticleGun->GetPosDist()->SetBeamSigmaInR(possigmarCmd1->GetNewDoubleValue(newValues)); + } + else if(command == possigmaxCmd1) + { + fParticleGun->GetPosDist()->SetBeamSigmaInX(possigmaxCmd1->GetNewDoubleValue(newValues)); + } + else if(command == possigmayCmd1) + { + fParticleGun->GetPosDist()->SetBeamSigmaInY(possigmayCmd1->GetNewDoubleValue(newValues)); + } + else if(command == paralpCmd1) + { + fParticleGun->GetPosDist()->SetParAlpha(paralpCmd1->GetNewDoubleValue(newValues)); + } + else if(command == partheCmd1) + { + fParticleGun->GetPosDist()->SetParTheta(partheCmd1->GetNewDoubleValue(newValues)); + } + else if(command == parphiCmd1) + { + fParticleGun->GetPosDist()->SetParPhi(parphiCmd1->GetNewDoubleValue(newValues)); + } + else if(command == confineCmd1) + { + fParticleGun->GetPosDist()->ConfineSourceToVolume(newValues); + } + else if(command == angtypeCmd1) + { + fParticleGun->GetAngDist()->SetAngDistType(newValues); + } + else if(command == angrot1Cmd1) + { + G4String a = "angref1"; + fParticleGun->GetAngDist()->DefineAngRefAxes(a,angrot1Cmd1->GetNew3VectorValue(newValues)); + } + else if(command == angrot2Cmd1) + { + G4String a = "angref2"; + fParticleGun->GetAngDist()->DefineAngRefAxes(a,angrot2Cmd1->GetNew3VectorValue(newValues)); + } + else if(command == minthetaCmd1) + { + fParticleGun->GetAngDist()->SetMinTheta(minthetaCmd1->GetNewDoubleValue(newValues)); + } + else if(command == minphiCmd1) + { + fParticleGun->GetAngDist()->SetMinPhi(minphiCmd1->GetNewDoubleValue(newValues)); + } + else if(command == maxthetaCmd1) + { + fParticleGun->GetAngDist()->SetMaxTheta(maxthetaCmd1->GetNewDoubleValue(newValues)); + } + else if(command == maxphiCmd1) + { + fParticleGun->GetAngDist()->SetMaxPhi(maxphiCmd1->GetNewDoubleValue(newValues)); + } + else if(command == angsigmarCmd1) + { + fParticleGun->GetAngDist()->SetBeamSigmaInAngR(angsigmarCmd1->GetNewDoubleValue(newValues)); + } + else if(command == angsigmaxCmd1) + { + fParticleGun->GetAngDist()->SetBeamSigmaInAngX(angsigmaxCmd1->GetNewDoubleValue(newValues)); + } + else if(command == angsigmayCmd1) + { + fParticleGun->GetAngDist()->SetBeamSigmaInAngY(angsigmayCmd1->GetNewDoubleValue(newValues)); + } + else if(command == useuserangaxisCmd1) + { + fParticleGun->GetAngDist()->SetUseUserAngAxis(useuserangaxisCmd1->GetNewBoolValue(newValues)); + } + else if(command == surfnormCmd1) + { + fParticleGun->GetAngDist()->SetUserWRTSurface(surfnormCmd1->GetNewBoolValue(newValues)); + } + else if(command == energytypeCmd1) + { + fParticleGun->GetEneDist()->SetEnergyDisType(newValues); + } + else if(command == eminCmd1) + { + fParticleGun->GetEneDist()->SetEmin(eminCmd1->GetNewDoubleValue(newValues)); + } + else if(command == emaxCmd1) + { + fParticleGun->GetEneDist()->SetEmax(emaxCmd1->GetNewDoubleValue(newValues)); + } + else if(command == monoenergyCmd1) + { + fParticleGun->GetEneDist()->SetMonoEnergy(monoenergyCmd1->GetNewDoubleValue(newValues)); + } + else if(command == engsigmaCmd1) + { + fParticleGun->GetEneDist()->SetBeamSigmaInE(engsigmaCmd1->GetNewDoubleValue(newValues)); + } + else if(command == alphaCmd1) + { + fParticleGun->GetEneDist()->SetAlpha(alphaCmd1->GetNewDoubleValue(newValues)); + } + else if(command == tempCmd1) + { + fParticleGun->GetEneDist()->SetTemp(tempCmd1->GetNewDoubleValue(newValues)); + } + else if(command == ezeroCmd1) + { + fParticleGun->GetEneDist()->SetEzero(ezeroCmd1->GetNewDoubleValue(newValues)); + } + else if(command == gradientCmd1) + { + fParticleGun->GetEneDist()->SetGradient(gradientCmd1->GetNewDoubleValue(newValues)); + } + else if(command == interceptCmd1) + { + fParticleGun->GetEneDist()->SetInterCept(interceptCmd1->GetNewDoubleValue(newValues)); + } + else if(command == calculateCmd1) + { + fParticleGun->GetEneDist()->Calculate(); + } + else if(command == energyspecCmd1) + { + fParticleGun->GetEneDist()->InputEnergySpectra(energyspecCmd1->GetNewBoolValue(newValues)); + } + else if(command == diffspecCmd1) + { + fParticleGun->GetEneDist()->InputDifferentialSpectra(diffspecCmd1->GetNewBoolValue(newValues)); + } + else if(command == histnameCmd1) + { + histtype = newValues; + } + else if(command == histpointCmd1) + { + if(histtype == "biasx") + fParticleGun->GetBiasRndm()->SetXBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "biasy") + fParticleGun->GetBiasRndm()->SetYBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "biasz") + fParticleGun->GetBiasRndm()->SetZBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "biast") + fParticleGun->GetBiasRndm()->SetThetaBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "biasp") + fParticleGun->GetBiasRndm()->SetPhiBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "biase") + fParticleGun->GetBiasRndm()->SetEnergyBias(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "theta") + fParticleGun->GetAngDist()->UserDefAngTheta(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "phi") + fParticleGun->GetAngDist()->UserDefAngPhi(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "energy") + fParticleGun->GetEneDist()->UserEnergyHisto(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "arb") + fParticleGun->GetEneDist()->ArbEnergyHisto(histpointCmd1->GetNew3VectorValue(newValues)); + if(histtype == "epn") + fParticleGun->GetEneDist()->EpnEnergyHisto(histpointCmd1->GetNew3VectorValue(newValues)); + } + else if(command == resethistCmd1) + { + if(newValues == "theta" || newValues == "phi") { + fParticleGun->GetAngDist()->ReSetHist(newValues); + } else if (newValues == "energy" || newValues == "arb" || newValues == "epn") { + fParticleGun->GetEneDist()->ReSetHist(newValues); + } else { + fParticleGun->GetBiasRndm()->ReSetHist(newValues); + } + } + else if(command == arbintCmd1) + { + fParticleGun->GetEneDist()->ArbInterpolate(newValues); + } + else { G4cout << "Error entering command" << G4endl; } @@ -809,6 +1469,8 @@ G4String G4GeneralParticleSourceMessenger::GetCurrentValue(G4UIcommand *) void G4GeneralParticleSourceMessenger::IonCommand(G4String newValues) { + fShootIon = true; + if (fShootIon) { G4Tokenizer next( newValues ); diff --git a/source/event/src/G4HEPEvtParticle.cc b/source/event/src/G4HEPEvtParticle.cc index c6e85a88c4..63de9caf71 100644 --- a/source/event/src/G4HEPEvtParticle.cc +++ b/source/event/src/G4HEPEvtParticle.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4HEPEvtParticle.cc,v 1.5 2003/05/21 20:52:53 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4HEPEvtParticle.cc,v 1.7 2004/06/11 14:11:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // diff --git a/source/event/src/G4PrimaryParticle.cc b/source/event/src/G4PrimaryParticle.cc index 4b30dae2bb..5f377ac280 100644 --- a/source/event/src/G4PrimaryParticle.cc +++ b/source/event/src/G4PrimaryParticle.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PrimaryParticle.cc,v 1.11 2003/09/12 21:51:34 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PrimaryParticle.cc,v 1.13 2004/06/11 14:11:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4PrimaryParticle.hh" diff --git a/source/event/src/G4PrimaryVertex.cc b/source/event/src/G4PrimaryVertex.cc index bee96cae37..da56d0b47c 100644 --- a/source/event/src/G4PrimaryVertex.cc +++ b/source/event/src/G4PrimaryVertex.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PrimaryVertex.cc,v 1.7 2003/09/12 21:51:34 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PrimaryVertex.cc,v 1.9 2004/06/11 14:11:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4PrimaryVertex.hh" diff --git a/source/event/src/G4SPSAngDistribution.cc b/source/event/src/G4SPSAngDistribution.cc new file mode 100644 index 0000000000..b9f08934ce --- /dev/null +++ b/source/event/src/G4SPSAngDistribution.cc @@ -0,0 +1,607 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSAngDistribution.cc +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +#include "Randomize.hh" +//#include + +#include "G4SPSAngDistribution.hh" + +G4SPSAngDistribution::G4SPSAngDistribution() +{ + // Angular distribution Variables + G4ThreeVector zero; + particle_momentum_direction = G4ParticleMomentum(0,0,-1); + + AngDistType = "planar"; + AngRef1 = HepXHat; + AngRef2 = HepYHat; + AngRef3 = HepZHat; + MinTheta = 0.; + MaxTheta = pi; + MinPhi = 0.; + MaxPhi = twopi; + DR = 0.; + DX = 0.; + DY = 0.; + UserDistType = "NULL"; + UserWRTSurface = true; + UserAngRef = false; + IPDFThetaExist = false; + IPDFPhiExist = false; + verbosityLevel = 0 ; +} + +G4SPSAngDistribution::~G4SPSAngDistribution() +{} + +// +void G4SPSAngDistribution::SetAngDistType(G4String atype) +{ + if(atype != "iso" && atype != "cos" && atype != "user" && atype != "planar" + && atype != "beam1d" && atype != "beam2d") + G4cout << "Error, distribution must be iso, cos, planar, beam1d, beam2d or user" << G4endl; + else + AngDistType = atype; + if (AngDistType == "cos") MaxTheta = pi/2. ; + if (AngDistType == "user") { + UDefThetaH = IPDFThetaH = ZeroPhysVector ; + IPDFThetaExist = false ; + UDefPhiH = IPDFPhiH = ZeroPhysVector ; + IPDFPhiExist = false ; + } +} + +void G4SPSAngDistribution::DefineAngRefAxes(G4String refname, G4ThreeVector ref) +{ + if(refname == "angref1") + AngRef1 = ref.unit(); // x' + else if(refname == "angref2") + AngRef2 = ref.unit(); // vector in x'y' plane + + // User defines x' (AngRef1) and a vector in the x'y' + // plane (AngRef2). Then, AngRef1 x AngRef2 = AngRef3 + // the z' vector. Then, AngRef3 x AngRef1 = AngRef2 + // which will now be y'. + + AngRef3 = AngRef1.cross(AngRef2); // z' + AngRef2 = AngRef3.cross(AngRef1); // y' + UserAngRef = true ; + if(verbosityLevel == 2) + { + G4cout << "Angular distribution rotation axes " << AngRef1 << " " << AngRef2 << " " << AngRef3 << G4endl; + } +} + +void G4SPSAngDistribution::SetMinTheta(G4double mint) +{ + MinTheta = mint; +} + +void G4SPSAngDistribution::SetMinPhi(G4double minp) +{ + MinPhi = minp; +} + +void G4SPSAngDistribution::SetMaxTheta(G4double maxt) +{ + MaxTheta = maxt; +} + +void G4SPSAngDistribution::SetMaxPhi(G4double maxp) +{ + MaxPhi = maxp; +} + +void G4SPSAngDistribution::SetBeamSigmaInAngR(G4double r) +{ + DR = r; +} + +void G4SPSAngDistribution::SetBeamSigmaInAngX(G4double r) +{ + DX = r; +} + +void G4SPSAngDistribution::SetBeamSigmaInAngY(G4double r) +{ + DY = r; +} + +void G4SPSAngDistribution::UserDefAngTheta(G4ThreeVector input) +{ + if(UserDistType == "NULL") UserDistType = "theta"; + if(UserDistType == "phi") UserDistType = "both"; + G4double thi, val; + thi = input.x(); + val = input.y(); + if(verbosityLevel >= 1) + G4cout << "In UserDefAngTheta" << G4endl; + UDefThetaH.InsertValues(thi, val); +} + +void G4SPSAngDistribution::UserDefAngPhi(G4ThreeVector input) +{ + if(UserDistType == "NULL") UserDistType = "phi"; + if(UserDistType == "theta") UserDistType = "both"; + G4double phhi, val; + phhi = input.x(); + val = input.y(); + if(verbosityLevel >= 1) + G4cout << "In UserDefAngPhi" << G4endl; + UDefPhiH.InsertValues(phhi, val); +} + +void G4SPSAngDistribution::SetUserWRTSurface(G4bool wrtSurf) +{ + // This is only applied in user mode? + // if UserWRTSurface = true then the user wants momenta with respect + // to the surface normals. + // When doing this theta has to be 0-90 only otherwise there will be + // errors, which currently are flagged anywhere. + UserWRTSurface = wrtSurf; +} + +void G4SPSAngDistribution::SetUseUserAngAxis(G4bool userang) +{ + // if UserAngRef = true the angular distribution is defined wrt + // the user defined co-ordinates + UserAngRef = userang; +} + +void G4SPSAngDistribution::GenerateBeamFlux() +{ + G4double theta, phi; + G4double px, py, pz; + if (AngDistType == "beam1d") + { + theta = G4RandGauss::shoot(0.0,DR); + phi = twopi * G4UniformRand(); + } + else + { + px = G4RandGauss::shoot(0.0,DX); + py = G4RandGauss::shoot(0.0,DY); + theta = sqrt (px*px + py*py); + if (theta != 0.) { + phi = acos(px/theta); + if ( py < 0.) phi = -phi; + } + else + { + phi = 0.0; + } + } + px = -sin(theta) * cos(phi); + py = -sin(theta) * sin(phi); + pz = -cos(theta); + G4double finx, finy, finz ; + finx = px, finy =py, finz =pz; + if (UserAngRef){ + // Apply Angular Rotation Matrix + // x * AngRef1, y * AngRef2 and z * AngRef3 + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); + finx = finx/ResMag; + finy = finy/ResMag; + finz = finz/ResMag; + } + particle_momentum_direction.setX(finx); + particle_momentum_direction.setY(finy); + particle_momentum_direction.setZ(finz); + + // particle_momentum_direction now holds unit momentum vector. + if(verbosityLevel >= 1) + G4cout << "Generating beam vector: " << particle_momentum_direction << G4endl; +} + +void G4SPSAngDistribution::GenerateIsotropicFlux() +{ + // generates isotropic flux. + // No vectors are needed. + G4double rndm, rndm2; + G4double px, py, pz; + + // + G4double sintheta, sinphi,costheta,cosphi; + rndm = angRndm->GenRandTheta(); + costheta = cos(MinTheta) - rndm * (cos(MinTheta) - cos(MaxTheta)); + sintheta = sqrt(1. - costheta*costheta); + + rndm2 = angRndm->GenRandPhi(); + Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; + sinphi = sin(Phi); + cosphi = cos(Phi); + + px = -sintheta * cosphi; + py = -sintheta * sinphi; + pz = -costheta; + + // for volume and ponit source use mother or user defined co-ordinates + // for plane and surface source user surface-normal or userdefined co-ordinates + // + G4double finx, finy, finz; + if (posDist->SourcePosType == "Point" || posDist->SourcePosType == "Volume") { + if (UserAngRef){ + // Apply Rotation Matrix + // x * AngRef1, y * AngRef2 and z * AngRef3 + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + } else { + finx = px; + finy = py; + finz = pz; + } + } else { // for plane and surface source + if (UserAngRef){ + // Apply Rotation Matrix + // x * AngRef1, y * AngRef2 and z * AngRef3 + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + } else { + finx = (px*posDist->SideRefVec1.x()) + (py*posDist->SideRefVec2.x()) + (pz*posDist->SideRefVec3.x()); + finy = (px*posDist->SideRefVec1.y()) + (py*posDist->SideRefVec2.y()) + (pz*posDist->SideRefVec3.y()); + finz = (px*posDist->SideRefVec1.z()) + (py*posDist->SideRefVec2.z()) + (pz*posDist->SideRefVec3.z()); + } + } + G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); + finx = finx/ResMag; + finy = finy/ResMag; + finz = finz/ResMag; + + particle_momentum_direction.setX(finx); + particle_momentum_direction.setY(finy); + particle_momentum_direction.setZ(finz); + + // particle_momentum_direction now holds unit momentum vector. + if(verbosityLevel >= 1) + G4cout << "Generating isotropic vector: " << particle_momentum_direction << G4endl; +} + +void G4SPSAngDistribution::GenerateCosineLawFlux() +{ + // Method to generate flux distributed with a cosine law + G4double px, py, pz; + G4double rndm, rndm2; + // + G4double sintheta, sinphi,costheta,cosphi; + rndm = angRndm->GenRandTheta(); + sintheta = sqrt( rndm * (sin(MaxTheta)*sin(MaxTheta) - sin(MinTheta)*sin(MinTheta) ) + +sin(MinTheta)*sin(MinTheta) ); + costheta = sqrt(1. -sintheta*sintheta); + + rndm2 = angRndm->GenRandPhi(); + Phi = MinPhi + (MaxPhi - MinPhi) * rndm2; + sinphi = sin(Phi); + cosphi = cos(Phi); + + px = -sintheta * cosphi; + py = -sintheta * sinphi; + pz = -costheta; + + // for volume and ponit source use mother or user defined co-ordinates + // for plane and surface source user surface-normal or userdefined co-ordinates + // + G4double finx, finy, finz; + if (posDist->SourcePosType == "Point" || posDist->SourcePosType == "Volume") { + if (UserAngRef){ + // Apply Rotation Matrix + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + } else { + finx = px; + finy = py; + finz = pz; + } + } else { // for plane and surface source + if (UserAngRef){ + // Apply Rotation Matrix + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + } else { + finx = (px*posDist->SideRefVec1.x()) + (py*posDist->SideRefVec2.x()) + (pz*posDist->SideRefVec3.x()); + finy = (px*posDist->SideRefVec1.y()) + (py*posDist->SideRefVec2.y()) + (pz*posDist->SideRefVec3.y()); + finz = (px*posDist->SideRefVec1.z()) + (py*posDist->SideRefVec2.z()) + (pz*posDist->SideRefVec3.z()); + } + } + G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); + finx = finx/ResMag; + finy = finy/ResMag; + finz = finz/ResMag; + + particle_momentum_direction.setX(finx); + particle_momentum_direction.setY(finy); + particle_momentum_direction.setZ(finz); + + // particle_momentum_direction now contains unit momentum vector. + if(verbosityLevel >= 1) + { + G4cout << "Resultant cosine-law unit momentum vector " << particle_momentum_direction << G4endl; + } +} + +void G4SPSAngDistribution::GeneratePlanarFlux() +{ + // particle_momentum_direction now contains unit momentum vector. + // nothing need be done here as the m-directions have been set directly + // under this option + if(verbosityLevel >= 1) + { + G4cout << "Resultant Planar wave momentum vector " << particle_momentum_direction << G4endl; + } +} + +void G4SPSAngDistribution::GenerateUserDefFlux() +{ + G4double rndm, px, py, pz, pmag; + + if(UserDistType == "NULL") + G4cout << "Error: UserDistType undefined" << G4endl; + else if(UserDistType == "theta") { + Theta = 10.; + while(Theta > MaxTheta || Theta < MinTheta) + Theta = GenerateUserDefTheta(); + Phi = 10.; + while(Phi > MaxPhi || Phi < MinPhi) { + rndm = angRndm->GenRandPhi(); + Phi = twopi * rndm; + } + } + else if(UserDistType == "phi") { + Theta = 10.; + while(Theta > MaxTheta || Theta < MinTheta) + { + rndm = angRndm->GenRandTheta(); + Theta = acos(1. - (2. * rndm)); + } + Phi = 10.; + while(Phi > MaxPhi || Phi < MinPhi) + Phi = GenerateUserDefPhi(); + } + else if(UserDistType == "both") + { + Theta = 10.; + while(Theta > MaxTheta || Theta < MinTheta) + Theta = GenerateUserDefTheta(); + Phi = 10.; + while(Phi > MaxPhi || Phi < MinPhi) + Phi = GenerateUserDefPhi(); + } + px = -sin(Theta) * cos(Phi); + py = -sin(Theta) * sin(Phi); + pz = -cos(Theta); + + pmag = sqrt((px*px) + (py*py) + (pz*pz)); + + if(!UserWRTSurface) { + G4double finx, finy, finz; + if (UserAngRef) { + // Apply Rotation Matrix + // x * AngRef1, y * AngRef2 and z * AngRef3 + finx = (px * AngRef1.x()) + (py * AngRef2.x()) + (pz * AngRef3.x()); + finy = (px * AngRef1.y()) + (py * AngRef2.y()) + (pz * AngRef3.y()); + finz = (px * AngRef1.z()) + (py * AngRef2.z()) + (pz * AngRef3.z()); + } else { // use mother co-ordinates + finx = px; + finy = py; + finz = pz; + } + G4double ResMag = sqrt((finx*finx) + (finy*finy) + (finz*finz)); + finx = finx/ResMag; + finy = finy/ResMag; + finz = finz/ResMag; + + particle_momentum_direction.setX(finx); + particle_momentum_direction.setY(finy); + particle_momentum_direction.setZ(finz); + } + else { // UserWRTSurface = true + G4double pxh = px/pmag; + G4double pyh = py/pmag; + G4double pzh = pz/pmag; + if(verbosityLevel > 1) { + G4cout <<"SideRefVecs " <SideRefVec1<SideRefVec2<SideRefVec3<SideRefVec1.x()) + (pyh*posDist->SideRefVec2.x()) + + (pzh*posDist->SideRefVec3.x()); + + G4double resulty = (pxh*posDist->SideRefVec1.y()) + (pyh*posDist->SideRefVec2.y()) + + (pzh*posDist->SideRefVec3.y()); + + G4double resultz = (pxh*posDist->SideRefVec1.z()) + (pyh*posDist->SideRefVec2.z()) + + (pzh*posDist->SideRefVec3.z()); + + G4double ResMag = sqrt((resultx*resultx) + (resulty*resulty) + (resultz*resultz)); + resultx = resultx/ResMag; + resulty = resulty/ResMag; + resultz = resultz/ResMag; + + particle_momentum_direction.setX(resultx); + particle_momentum_direction.setY(resulty); + particle_momentum_direction.setZ(resultz); + } + + // particle_momentum_direction now contains unit momentum vector. + if(verbosityLevel > 0 ) + { + G4cout << "Final User Defined momentum vector " << particle_momentum_direction << G4endl; + } +} + +G4double G4SPSAngDistribution::GenerateUserDefTheta() +{ + // Create cumulative histogram if not already done so. Then use RandFlat + //::shoot to generate the output Theta value. + if(UserDistType == "NULL" || UserDistType == "phi") + { + // No user defined theta distribution + G4cout << "Error ***********************" << G4endl; + G4cout << "UserDistType = " << UserDistType << G4endl; + return (0.); + } + else + { + // UserDistType = theta or both and so a theta distribution + // is defined. This should be integrated if not already done. + if(IPDFThetaExist == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(UDefThetaH.GetVectorLength()); + bins[0] = UDefThetaH.GetLowEdgeEnergy(size_t(0)); + vals[0] = UDefThetaH(size_t(0)); + sum = vals[0]; + for(ii=1;ii + +#include "G4SPSEneDistribution.hh" + +G4SPSEneDistribution::G4SPSEneDistribution() +{ + // + // Initialise all variables + particle_energy = 1.0*MeV; + + EnergyDisType = "Mono"; + MonoEnergy = 1*MeV; + Emin = 0.; + Emax = 1.e30; + alpha = 0.; + Ezero = 0.; + SE = 0.; + Temp = 0.; + grad = 0.; + cept = 0.; + EnergySpec = true; // true - energy spectra, false - momentum spectra + DiffSpec = true; // true - differential spec, false integral spec + IntType = "NULL"; // Interpolation type + IPDFEnergyExist = false; + IPDFArbExist = false; + + ArbEmin = 0.; + ArbEmax = 1.e30; + + verbosityLevel = 0 ; + +} + +G4SPSEneDistribution::~G4SPSEneDistribution() +{} + +void G4SPSEneDistribution::SetEnergyDisType(G4String DisType) +{ + EnergyDisType = DisType; + if (EnergyDisType == "User"){ + UDefEnergyH = IPDFEnergyH = ZeroPhysVector ; + IPDFEnergyExist = false ; + } else if ( EnergyDisType == "Arb"){ + ArbEnergyH =IPDFArbEnergyH = ZeroPhysVector ; + IPDFArbExist = false; + } else if (EnergyDisType == "Epn"){ + UDefEnergyH = IPDFEnergyH = ZeroPhysVector ; + IPDFEnergyExist = false ; + EpnEnergyH = ZeroPhysVector ; + } +} + +void G4SPSEneDistribution::SetEmin(G4double emi) +{ + Emin = emi; +} + +void G4SPSEneDistribution::SetEmax(G4double ema) +{ + Emax = ema; +} + +void G4SPSEneDistribution::SetMonoEnergy(G4double menergy) +{ + MonoEnergy = menergy; +} + +void G4SPSEneDistribution::SetBeamSigmaInE(G4double e) +{ + SE = e; +} +void G4SPSEneDistribution::SetAlpha(G4double alp) +{ + alpha = alp; +} + +void G4SPSEneDistribution::SetTemp(G4double tem) +{ + Temp = tem; +} + +void G4SPSEneDistribution::SetEzero(G4double eze) +{ + Ezero = eze; +} + +void G4SPSEneDistribution::SetGradient(G4double gr) +{ + grad = gr; +} + +void G4SPSEneDistribution::SetInterCept(G4double c) +{ + cept = c; +} + +void G4SPSEneDistribution::UserEnergyHisto(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + if(verbosityLevel > 1) { + G4cout << "In UserEnergyHisto" << G4endl; + G4cout << " " << ehi << " " << val << G4endl; + } + UDefEnergyH.InsertValues(ehi, val); + Emax = ehi; +} + +void G4SPSEneDistribution::ArbEnergyHisto(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + if(verbosityLevel >1 ) { + G4cout << "In ArbEnergyHisto" << G4endl; + G4cout << " " << ehi << " " << val << G4endl; + } + ArbEnergyH.InsertValues(ehi, val); +} + +void G4SPSEneDistribution::EpnEnergyHisto(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + if(verbosityLevel > 1) { + G4cout << "In EpnEnergyHisto" << G4endl; + G4cout << " " << ehi << " " << val << G4endl; + } + EpnEnergyH.InsertValues(ehi, val); + Emax = ehi; + Epnflag = true; +} + +void G4SPSEneDistribution::Calculate() +{ + if(EnergyDisType == "Cdg") + CalculateCdgSpectrum(); + else if(EnergyDisType == "Bbody") + CalculateBbodySpectrum(); +} + +void G4SPSEneDistribution::CalculateCdgSpectrum() +{ + // This uses the spectrum from The INTEGRAL Mass Model (TIMM) + // to generate a Cosmic Diffuse X/gamma ray spectrum. + G4double pfact[2] = {8.5, 112}; + G4double spind[2] = {1.4, 2.3}; + G4double ene_line[3] = {1.*keV, 18.*keV, 1E6*keV}; + G4int n_par; + + ene_line[0] = Emin; + if(Emin < 18*keV) + { + n_par = 2; + ene_line[2] = Emax; + if(Emax < 18*keV) + { + n_par = 1; + ene_line[1] = Emax; + } + } + else + { + n_par = 1; + pfact[0] = 112.; + spind[0] = 2.3; + ene_line[1] = Emax; + } + + // Create a cumulative histogram. + CDGhist[0] = 0.; + G4double omalpha; + G4int i = 0; + + while(i < n_par) + { + omalpha = 1. - spind[i]; + CDGhist[i+1] = CDGhist[i] + (pfact[i]/omalpha)* + (pow(ene_line[i+1],omalpha)-pow(ene_line[i],omalpha)); + i++; + } + + // Normalise histo and divide by 1000 to make MeV. + i = 0; + while(i < n_par) + { + CDGhist[i+1] = CDGhist[i+1]/CDGhist[n_par]; + // G4cout << CDGhist[i] << CDGhist[n_par] << G4endl; + i++; + } +} + +void G4SPSEneDistribution::CalculateBbodySpectrum() +{ + // create bbody spectrum + // Proved very hard to integrate indefinitely, so different + // method. User inputs emin, emax and T. These are used to + // create a 10,000 bin histogram. + // Use photon density spectrum = 2 nu**2/c**2 * (exp(h nu/kT)-1) + // = 2 E**2/h**2c**2 times the exponential + G4double erange = Emax - Emin; + G4double steps = erange/10000.; + G4double Bbody_y[10000]; + G4double k = 8.6181e-11; //Boltzmann const in MeV/K + G4double h = 4.1362e-21; // Plancks const in MeV s + G4double c = 3e8; // Speed of light + G4double h2 = h*h; + G4double c2 = c*c; + G4int count = 0; + G4double sum = 0.; + BBHist[0] = 0.; + while(count < 10000) + { + Bbody_x[count] = Emin + G4double(count*steps); + Bbody_y[count] = (2.*pow(Bbody_x[count],2.))/ + (h2*c2*(exp(Bbody_x[count]/(k*Temp)) - 1.)); + sum = sum + Bbody_y[count]; + BBHist[count+1] = BBHist[count] + Bbody_y[count]; + count++; + } + + Bbody_x[10000] = Emax; + // Normalise cumulative histo. + count = 0; + while(count<10001) + { + BBHist[count] = BBHist[count]/sum; + count++; + } +} + +void G4SPSEneDistribution::InputEnergySpectra(G4bool value) +{ + // Allows user to specifiy spectrum is momentum + EnergySpec = value; // false if momentum + if(verbosityLevel > 1) + G4cout << "EnergySpec has value " << EnergySpec << G4endl; +} + +void G4SPSEneDistribution::InputDifferentialSpectra(G4bool value) +{ + // Allows user to specify integral or differential spectra + DiffSpec = value; // true = differential, false = integral + if(verbosityLevel > 1) + G4cout << "Diffspec has value " << DiffSpec << G4endl; +} + +void G4SPSEneDistribution::ArbInterpolate(G4String IType) +{ + if(EnergyDisType != "Arb") + G4cout << "Error: this is for arbitrary distributions" << G4endl; + IntType = IType; + ArbEmax = Emax; + ArbEmin = Emin; + + // Now interpolate points + if(IntType == "Lin") + LinearInterpolation(); + if(IntType == "Log") + LogInterpolation(); + if(IntType == "Exp") + ExpInterpolation(); + if(IntType == "Spline") + SplineInterpolation(); +} + +void G4SPSEneDistribution::LinearInterpolation() +{ + // Method to do linear interpolation on the Arb points + // Calculate equation of each line segment, max 1024. + // Calculate Area under each segment + // Create a cumulative array which is then normalised Arb_Cum_Area + + G4double Area_seg[1024]; // Stores area under each segment + G4double sum = 0., Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; + G4int i, count; + G4int maxi = ArbEnergyH.GetVectorLength(); + for(i=0;iGetPDGMass(); + // convert point to energy unit and its value to per energy unit + G4double total_energy; + for(count=0;count 0.) + { + if(verbosityLevel == 2) + G4cout << "Arb_grad is positive" << G4endl; + Arb_cept[i] = Arb_y[i] - (Arb_grad[i] * Arb_x[i]); + } + else if(Arb_grad[i] < 0.) + { + if(verbosityLevel == 2) + G4cout << "Arb_grad is negative" << G4endl; + Arb_cept[i] = Arb_y[i] + (-Arb_grad[i] * Arb_x[i]); + } + else + { + if(verbosityLevel == 2) + G4cout << "Arb_grad is 0." << G4endl; + Arb_cept[i] = Arb_y[i]; + } + + Area_seg[i] = ((Arb_grad[i]/2)*(Arb_x[i]*Arb_x[i] - Arb_x[i-1]*Arb_x[i-1]) + Arb_cept[i]*(Arb_x[i] - Arb_x[i-1])); + Arb_Cum_Area[i] = Arb_Cum_Area[i-1] + Area_seg[i]; + sum = sum + Area_seg[i]; + if(verbosityLevel == 2) + G4cout << Arb_x[i] << Arb_y[i] << Area_seg[i] << sum << Arb_grad[i] << G4endl; + i++; + } + + i=0; + while(i < maxi) + { + Arb_Cum_Area[i] = Arb_Cum_Area[i]/sum; // normalisation + IPDFArbEnergyH.InsertValues(Arb_x[i], Arb_Cum_Area[i]); + i++; + } + + if(verbosityLevel >= 1) + { + G4cout << "Leaving LinearInterpolation" << G4endl; + ArbEnergyH.DumpValues(); + IPDFArbEnergyH.DumpValues(); + } +} + +void G4SPSEneDistribution::LogInterpolation() +{ + // Interpolation based on Logarithmic equations + // Generate equations of line segments + // y = Ax**alpha => log y = alpha*logx + logA + // Find area under line segments + // create normalised, cumulative array Arb_Cum_Area + G4double Area_seg[1024]; // Stores area under each segment + G4double sum = 0., Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; + G4int i, count; + G4int maxi = ArbEnergyH.GetVectorLength(); + for(i=0;iGetPDGMass(); + // convert point to energy unit and its value to per energy unit + G4double total_energy; + for(count=0;count= 1) + G4cout << "Leaving LogInterpolation " << G4endl; +} + +void G4SPSEneDistribution::ExpInterpolation() +{ + // Interpolation based on Exponential equations + // Generate equations of line segments + // y = Ae**-(x/e0) => ln y = -x/e0 + lnA + // Find area under line segments + // create normalised, cumulative array Arb_Cum_Area + G4double Area_seg[1024]; // Stores area under each segment + G4double sum = 0., Arb_x[1024], Arb_y[1024], Arb_Cum_Area[1024]; + G4int i, count; + G4int maxi = ArbEnergyH.GetVectorLength(); + for(i=0;iGetPDGMass(); + // convert point to energy unit and its value to per energy unit + G4double total_energy; + for(count=0;count 0. || test < 0.) + { + Arb_ezero[i] = -(Arb_x[i] - Arb_x[i-1])/(log(Arb_y[i]) - log(Arb_y[i-1])); + Arb_Const[i] = Arb_y[i]/(exp(-Arb_x[i]/Arb_ezero[i])); + Area_seg[i]=-(Arb_Const[i]*Arb_ezero[i])*(exp(-Arb_x[i]/Arb_ezero[i]) + -exp(-Arb_x[i-1]/Arb_ezero[i])); + } + else + { + G4cout << "Flat line segment: problem" << G4endl; + Arb_ezero[i] = 0.; + Arb_Const[i] = 0.; + Area_seg[i] = 0.; + } + sum = sum + Area_seg[i]; + Arb_Cum_Area[i] = Arb_Cum_Area[i-1] + Area_seg[i]; + if(verbosityLevel == 2) + G4cout << Arb_ezero[i] << Arb_Const[i] << Area_seg[i] << G4endl; + i++; + } + + i=0; + while(i= 1) + G4cout << "Leaving ExpInterpolation " << G4endl; +} + +void G4SPSEneDistribution::SplineInterpolation() +{ + // Interpolation using Splines. + // Create Normalised arrays, make x 0->1 and y hold + // the function (Energy) + G4double Arb_x[1024], Arb_y[1024]; + G4int i, count; + G4int maxi = ArbEnergyH.GetVectorLength(); + for(i=0;iGetPDGMass(); + // convert point to energy unit and its value to per energy unit + G4double total_energy; + for(count=0;count1) + G4cout << i <<" "<< Arb_x[i] << " " << Arb_y[i] << G4endl; + IPDFArbEnergyH.InsertValues(Arb_x[i], Arb_y[i]); + } + Emax = IPDFArbEnergyH.GetLowEdgeEnergy(IPDFArbEnergyH.GetVectorLength()-1); + Emin = IPDFArbEnergyH.GetLowEdgeEnergy(0); + */ + // Should now have normalised cumulative probabilities in Arb_y + // and energy values in Arb_x. + // maxi = maxi + 1; + // Put y into x and x into y. The spline interpolation will then + // go through x-axis to find where to interpolate (cum probability) + // then generate a y (which will now be energy). + SplineInt = new G4DataInterpolation(Arb_y,Arb_x,maxi,1e30,1e30); + if(verbosityLevel >1 ) + { + G4cout << SplineInt << G4endl; + G4cout << SplineInt->LocateArgument(1.0) << G4endl; + } + if(verbosityLevel > 0 ) + G4cout << "Leaving SplineInterpolation " << G4endl; +} + +void G4SPSEneDistribution::GenerateMonoEnergetic() +{ + // Method to generate MonoEnergetic particles. + particle_energy = MonoEnergy; +} + +void G4SPSEneDistribution::GenerateGaussEnergies() +{ + // Method to generate Gaussian particles. + particle_energy = G4RandGauss::shoot(MonoEnergy,SE); + if (particle_energy < 0) particle_energy = 0.; +} + +void G4SPSEneDistribution::GenerateLinearEnergies(G4bool bArb = false) +{ + G4double rndm; + G4double emaxsq = pow(Emax,2.); //Emax squared + G4double eminsq = pow(Emin,2.); //Emin squared + G4double intersq = pow(cept,2.); //cept squared + + if (bArb) rndm = G4UniformRand(); + else rndm = eneRndm->GenRandEnergy(); + + G4double bracket = ((grad/2.)*(emaxsq - eminsq) + cept*(Emax-Emin)); + bracket = bracket * rndm; + bracket = bracket + (grad/2.)*eminsq + cept*Emin; + // Now have a quad of form m/2 E**2 + cE - bracket = 0 + bracket = -bracket; + // G4cout << "BRACKET" << bracket << G4endl; + if(grad != 0.) + { + G4double sqbrack = (intersq - 4*(grad/2.)*(bracket)); + // G4cout << "SQBRACK" << sqbrack << G4endl; + sqbrack = sqrt(sqbrack); + G4double root1 = -cept + sqbrack; + root1 = root1/(2.*(grad/2.)); + + G4double root2 = -cept - sqbrack; + root2 = root2/(2.*(grad/2.)); + + // G4cout << root1 << " roots " << root2 << G4endl; + + if(root1 > Emin && root1 < Emax) + particle_energy = root1; + if(root2 > Emin && root2 < Emax) + particle_energy = root2; + } + else if(grad == 0.) + // have equation of form cE - bracket =0 + particle_energy = bracket/cept; + + if(particle_energy < 0.) + particle_energy = -particle_energy; + + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GeneratePowEnergies(G4bool bArb = false) +{ + // Method to generate particle energies distributed as + // a powerlaw + + G4double rndm; + G4double emina, emaxa; + + emina = pow(Emin,alpha+1); + emaxa = pow(Emax,alpha+1); + + if (bArb) rndm = G4UniformRand(); + else rndm = eneRndm->GenRandEnergy(); + + if(alpha != -1.) + { + particle_energy = ((rndm*(emaxa - emina)) + emina); + particle_energy = pow(particle_energy,(1./(alpha+1.))); + } + else if(alpha == -1.) + { + particle_energy = (log(Emin) + rndm*(log(Emax) - log(Emin))); + particle_energy = exp(particle_energy); + } + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GenerateExpEnergies(G4bool bArb = false) +{ + // Method to generate particle energies distributed according + // to an exponential curve. + G4double rndm; + + if (bArb) rndm = G4UniformRand(); + else rndm = eneRndm->GenRandEnergy(); + + particle_energy = -Ezero*(log(rndm*(exp(-Emax/Ezero) - exp(-Emin/Ezero)) + + exp(-Emin/Ezero))); + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GenerateBremEnergies() +{ + // Method to generate particle energies distributed according + // to a Bremstrahlung equation of + // form I = const*((kT)**1/2)*E*(e**(-E/kT)) + + G4double rndm; + rndm = eneRndm->GenRandEnergy(); + G4double expmax, expmin, k; + + k = 8.6181e-11; // Boltzmann's const in MeV/K + G4double ksq = pow(k,2.); // k squared + G4double Tsq = pow(Temp,2.); // Temp squared + + expmax = exp(-Emax/(k*Temp)); + expmin = exp(-Emin/(k*Temp)); + + // If either expmax or expmin are zero then this will cause problems + // Most probably this will be because T is too low or E is too high + + if(expmax == 0.) + G4cout << "*****EXPMAX=0. Choose different E's or Temp" << G4endl; + if(expmin == 0.) + G4cout << "*****EXPMIN=0. Choose different E's or Temp" << G4endl; + + G4double tempvar = rndm *((-k)*Temp*(Emax*expmax - Emin*expmin) - + (ksq*Tsq*(expmax-expmin))); + + G4double bigc = (tempvar - k*Temp*Emin*expmin - ksq*Tsq*expmin)/(-k*Temp); + + // This gives an equation of form: Ee(-E/kT) + kTe(-E/kT) - C =0 + // Solve this iteratively, step from Emin to Emax in 1000 steps + // and take the best solution. + + G4double erange = Emax - Emin; + G4double steps = erange/1000.; + G4int i; + G4double etest, diff, err; + + err = 100000.; + + for(i=1; i<1000; i++) + { + etest = Emin + (i-1)*steps; + + diff = etest*(exp(-etest/(k*Temp))) + k*Temp*(exp(-etest/(k*Temp))) - bigc; + + if(diff < 0.) + diff = -diff; + + if(diff < err) + { + err = diff; + particle_energy = etest; + } + } + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GenerateBbodyEnergies() +{ + // BBody_x holds Energies, and BBHist holds the cumulative histo. + // binary search to find correct bin then lin interpolation. + // Use the earlier defined histogram + RandGeneral method to generate + // random numbers following the histos distribution. + G4double rndm; + G4int nabove, nbelow = 0, middle; + nabove = 10001; + rndm = eneRndm->GenRandEnergy(); + + // Binary search to find bin that rndm is in + while(nabove-nbelow > 1) + { + middle = (nabove + nbelow)/2; + if(rndm == BBHist[middle]) break; + if(rndm < BBHist[middle]) nabove = middle; + else nbelow = middle; + } + + // Now interpolate in that bin to find the correct output value. + G4double x1, x2, y1, y2, m, q; + x1 = Bbody_x[nbelow]; + x2 = Bbody_x[nbelow+1]; + y1 = BBHist[nbelow]; + y2 = BBHist[nbelow+1]; + m = (y2-y1)/(x2-x1); + q = y1 - m*x1; + + particle_energy = (rndm - q)/m; + + if(verbosityLevel >= 1) + { + G4cout << "Energy is " << particle_energy << G4endl; + } +} + +void G4SPSEneDistribution::GenerateCdgEnergies() +{ + // Gen random numbers, compare with values in cumhist + // to find appropriate part of spectrum and then + // generate energy in the usual inversion way. + // G4double pfact[2] = {8.5, 112}; + // G4double spind[2] = {1.4, 2.3}; + // G4double ene_line[3] = {1., 18., 1E6}; + G4double rndm, rndm2; + G4double ene_line[3]; + G4double omalpha[2]; + if(Emin < 18*keV && Emax < 18*keV) + { + omalpha[0] = 1. - 1.4; + ene_line[0] = Emin; + ene_line[1] = Emax; + } + if(Emin < 18*keV && Emax > 18*keV) + { + omalpha[0] = 1. - 1.4; + omalpha[1] = 1. - 2.3; + ene_line[0] = Emin; + ene_line[1] = 18.; + ene_line[2] = Emax; + } + if(Emin > 18*keV) + { + omalpha[0] = 1. - 2.3; + ene_line[0] = Emin; + ene_line[1] = Emax; + } + rndm = eneRndm->GenRandEnergy(); + rndm2 = eneRndm->GenRandEnergy(); + + G4int i = 0; + while( rndm >= CDGhist[i]) + { + i++; + } + // Generate final energy. + particle_energy = (pow(ene_line[i-1],omalpha[i-1]) + (pow(ene_line[i],omalpha[i-1]) + - pow(ene_line[i-1],omalpha[i-1]))*rndm2); + particle_energy = pow(particle_energy,(1./omalpha[i-1])); + + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GenUserHistEnergies() +{ + // Histograms are DIFFERENTIAL. + // G4cout << "In GenUserHistEnergies " << G4endl; + if(IPDFEnergyExist == false) + { + G4int ii; + G4int maxbin = G4int(UDefEnergyH.GetVectorLength()); + G4double bins[1024], vals[1024], sum; + sum=0.; + + if((EnergySpec == false) && (particle_definition == NULL)) + G4cout << "Error: particle definition is NULL" << G4endl; + + if(maxbin > 1024) + { + G4cout << "Maxbin > 1024" << G4endl; + G4cout << "Setting maxbin to 1024, other bins are lost" << G4endl; + } + + if(DiffSpec == false) + G4cout << "Histograms are Differential!!! " << G4endl; + else + { + bins[0] = UDefEnergyH.GetLowEdgeEnergy(size_t(0)); + vals[0] = UDefEnergyH(size_t(0)); + sum = vals[0]; + for(ii=1;iiGetPDGMass(); + // multiply the function (vals) up by the bin width + // to make the function counts/s (i.e. get rid of momentum + // dependence). + for(ii=1;ii 1) + IPDFEnergyH.DumpValues(); + } + + // IPDF has been create so carry on + G4double rndm = eneRndm->GenRandEnergy(); + particle_energy = IPDFEnergyH.GetEnergy(rndm); + + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::GenArbPointEnergies() +{ + if(verbosityLevel > 0) + G4cout << "In GenArbPointEnergies" << G4endl; + G4double rndm; + rndm = eneRndm->GenRandEnergy(); + if(IntType != "Spline") + { + // IPDFArbEnergyH.DumpValues(); + // Find the Bin + // have x, y, no of points, and cumulative area distribution + G4int nabove, nbelow = 0, middle; + nabove = IPDFArbEnergyH.GetVectorLength(); + // G4cout << nabove << G4endl; + // Binary search to find bin that rndm is in + while(nabove-nbelow > 1) + { + middle = (nabove + nbelow)/2; + if(rndm == IPDFArbEnergyH(size_t(middle))) break; + if(rndm < IPDFArbEnergyH(size_t(middle))) nabove = middle; + else nbelow = middle; + } + if(IntType == "Lin") + { + Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); + Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); + grad = Arb_grad[nbelow+1]; + cept = Arb_cept[nbelow+1]; + // G4cout << rndm << " " << Emax << " " << Emin << " " << grad << " " << cept << G4endl; + GenerateLinearEnergies(true); + } + else if(IntType == "Log") + { + Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); + Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); + alpha = Arb_alpha[nbelow+1]; + // G4cout << rndm << " " << Emax << " " << Emin << " " << alpha << G4endl; + GeneratePowEnergies(true); + } + else if(IntType == "Exp") + { + Emax = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow+1)); + Emin = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(nbelow)); + Ezero = Arb_ezero[nbelow+1]; + // G4cout << rndm << " " << Emax << " " << Emin << " " << Ezero << G4endl; + GenerateExpEnergies(true); + } + } + else if(IntType == "Spline") + { + if(verbosityLevel > 1) + G4cout << "IntType = Spline " << rndm << G4endl; + // in SplineInterpolation created SplineInt + // Now generate a random number put it into CubicSplineInterpolation + // and you should get out an energy!?! + particle_energy = -1e100; + while (particle_energy < Emin || particle_energy > Emax ) { + particle_energy = SplineInt->CubicSplineInterpolation(rndm); + rndm = eneRndm->GenRandEnergy(); + } + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; + } + else + G4cout << "Error: IntType unknown type" << G4endl; +} + +void G4SPSEneDistribution::GenEpnHistEnergies() +{ + // G4cout << "In GenEpnHistEnergies " << Epnflag << G4endl; + + // Firstly convert to energy if not already done. + if(Epnflag == true) + // epnflag = true means spectrum is epn, false means e. + { + // convert to energy by multiplying by A number + ConvertEPNToEnergy(); + // EpnEnergyH will be replace by UDefEnergyH. + // UDefEnergyH.DumpValues(); + } + + // G4cout << "Creating IPDFEnergy if not already done so" << G4endl; + if(IPDFEnergyExist == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(UDefEnergyH.GetVectorLength()); + bins[0] = UDefEnergyH.GetLowEdgeEnergy(size_t(0)); + vals[0] = UDefEnergyH(size_t(0)); + sum = vals[0]; + for(ii=1;iiGenRandEnergy(); + particle_energy = IPDFEnergyH.GetEnergy(rndm); + + if(verbosityLevel >= 1) + G4cout << "Energy is " << particle_energy << G4endl; +} + +void G4SPSEneDistribution::ConvertEPNToEnergy() +{ + // Use this before particle generation to convert the + // currently stored histogram from energy/nucleon + // to energy. + // G4cout << "In ConvertEpntoEnergy " << G4endl; + if(particle_definition==NULL) + G4cout << "Error: particle not defined" << G4endl; + else + { + // Need to multiply histogram by the number of nucleons. + // Baryon Number looks to hold the no. of nucleons. + G4int Bary = particle_definition->GetBaryonNumber(); + // G4cout << "Baryon No. " << Bary << G4endl; + // Change values in histogram, Read it out, delete it, re-create it + G4int count, maxcount; + maxcount = G4int(EpnEnergyH.GetVectorLength()); + // G4cout << maxcount << G4endl; + G4double ebins[1024],evals[1024]; + if(maxcount > 1024) + { + G4cout << "Histogram contains more than 1024 bins!" << G4endl; + G4cout << "Those above 1024 will be ignored" << G4endl; + maxcount = 1024; + } + for(count=0;count ArbEmax) + : (particle_energy < Emin || particle_energy > Emax) ) { + if(EnergyDisType == "Mono") + GenerateMonoEnergetic(); + else if(EnergyDisType == "Lin") + GenerateLinearEnergies(); + else if(EnergyDisType == "Pow") + GeneratePowEnergies(); + else if(EnergyDisType == "Exp") + GenerateExpEnergies(); + else if(EnergyDisType == "Gauss") + GenerateGaussEnergies(); + else if(EnergyDisType == "Brem") + GenerateBremEnergies(); + else if(EnergyDisType == "Bbody") + GenerateBbodyEnergies(); + else if(EnergyDisType == "Cdg") + GenerateCdgEnergies(); + else if(EnergyDisType == "User") + GenUserHistEnergies(); + else if(EnergyDisType == "Arb") + GenArbPointEnergies(); + else if(EnergyDisType == "Epn") + GenEpnHistEnergies(); + else + G4cout << "Error: EnergyDisType has unusual value" << G4endl; + } + return particle_energy; +} + + + + + + + + + diff --git a/source/event/src/G4SPSPosDistribution.cc b/source/event/src/G4SPSPosDistribution.cc new file mode 100644 index 0000000000..419df59e04 --- /dev/null +++ b/source/event/src/G4SPSPosDistribution.cc @@ -0,0 +1,1019 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SPSPosDistribution.cc +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +#include "Randomize.hh" +//#include +#include "G4TransportationManager.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PhysicalVolumeStore.hh" + +#include "G4SPSPosDistribution.hh" + +G4SPSPosDistribution::G4SPSPosDistribution() +{ + + // Initialise all variables + // Position distribution Variables + + SourcePosType = "Point"; + Shape = "NULL"; + halfx = 0.; + halfy = 0.; + halfz = 0.; + Radius = 0.; + Radius0 = 0.; + SR = 0.; + SX = 0.; + SY = 0.; + ParAlpha = 0.; + ParTheta = 0.; + ParPhi = 0.; + CentreCoords = G4ThreeVector(0., 0., 0.); + Rotx = HepXHat; + Roty = HepYHat; + Rotz = HepZHat; + Confine = false; //If true confines source distribution to VolName + VolName = "NULL"; + SideRefVec1 = HepXHat; // x-axis + SideRefVec2 = HepYHat; // y-axis + SideRefVec3 = HepZHat; // z-axis + verbosityLevel = 0 ; + gNavigator = G4TransportationManager::GetTransportationManager() + ->GetNavigatorForTracking(); +} + +G4SPSPosDistribution::~G4SPSPosDistribution() +{ +} + +void G4SPSPosDistribution::SetPosDisType(G4String PosType) +{ + SourcePosType = PosType; +} + +void G4SPSPosDistribution::SetPosDisShape(G4String shapeType) +{ + Shape = shapeType; +} + +void G4SPSPosDistribution::SetCentreCoords(G4ThreeVector coordsOfCentre) +{ + CentreCoords = coordsOfCentre; +} + +void G4SPSPosDistribution::SetPosRot1(G4ThreeVector posrot1) +{ + // This should be x' + Rotx = posrot1; + if(verbosityLevel == 2) + { + G4cout << "Vector x' " << Rotx << G4endl; + } + GenerateRotationMatrices(); +} + +void G4SPSPosDistribution::SetPosRot2(G4ThreeVector posrot2) +{ + // This is a vector in the plane x'y' but need not + // be y' + Roty = posrot2; + if(verbosityLevel == 2) + { + G4cout << "The vector in the x'-y' plane " << Roty << G4endl; + } + GenerateRotationMatrices(); +} + +void G4SPSPosDistribution::SetHalfX(G4double xhalf) +{ + halfx = xhalf; +} + +void G4SPSPosDistribution::SetHalfY(G4double yhalf) +{ + halfy = yhalf; +} + +void G4SPSPosDistribution::SetHalfZ(G4double zhalf) +{ + halfz = zhalf; +} + +void G4SPSPosDistribution::SetRadius(G4double rad) +{ + Radius = rad; +} + +void G4SPSPosDistribution::SetRadius0(G4double rad) +{ + Radius0 = rad; +} + +void G4SPSPosDistribution::SetBeamSigmaInR(G4double r) +{ + SR = r; + SX = SY = r/sqrt(2.); +} + +void G4SPSPosDistribution::SetBeamSigmaInX(G4double r) +{ + SX = r; +} + +void G4SPSPosDistribution::SetBeamSigmaInY(G4double r) +{ + SY = r; +} + +void G4SPSPosDistribution::SetParAlpha(G4double paralp) +{ + ParAlpha = paralp; +} + +void G4SPSPosDistribution::SetParTheta(G4double parthe) +{ + ParTheta = parthe; +} + +void G4SPSPosDistribution::SetParPhi(G4double parphi) +{ + ParPhi = parphi; +} + +void G4SPSPosDistribution::GenerateRotationMatrices() +{ + // This takes in 2 vectors, x' and one in the plane x'-y', + // and from these takes a cross product to calculate z'. + // Then a cross product is taken between x' and z' to give + // y'. + Rotx = Rotx.unit(); // x' + Roty = Roty.unit(); // vector in x'y' plane + Rotz = Rotx.cross(Roty); // z' + Roty = Rotz.cross(Rotx); // y' + if(verbosityLevel == 2) + { + G4cout << "The new axes, x', y', z' " << Rotx << " " << Roty << " " << Rotz << G4endl; + } +} + +void G4SPSPosDistribution::ConfineSourceToVolume(G4String Vname) +{ + VolName = Vname; + if(verbosityLevel == 2) + G4cout << VolName << G4endl; + G4VPhysicalVolume *tempPV = NULL; + G4PhysicalVolumeStore *PVStore = 0; + G4String theRequiredVolumeName = VolName; + PVStore = G4PhysicalVolumeStore::GetInstance(); + G4int i = 0; + G4bool found = false; + if(verbosityLevel == 2) + G4cout << PVStore->size() << G4endl; + while (!found && isize())) { + tempPV = (*PVStore)[i]; + found = tempPV->GetName() == theRequiredVolumeName; + if(verbosityLevel == 2) + G4cout << i << " " << " " << tempPV->GetName() << " " << theRequiredVolumeName << " " << found << G4endl; + if (!found) + {i++;} + } + // found = true then the volume exists else it doesnt. + if(found == true) + { + if(verbosityLevel >= 1) + G4cout << "Volume " << VolName << " exists" << G4endl; + Confine = true; + } + else + { + G4cout << " **** Error: Volume does not exist **** " << G4endl; + G4cout << " Ignoring confine condition" << G4endl; + Confine = false; + VolName = "NULL"; + } + +} + +void G4SPSPosDistribution::GeneratePointSource() +{ + // Generates Points given the point source. + if(SourcePosType == "Point") + particle_position = CentreCoords; + else + if(verbosityLevel >= 1) + G4cout << "Error SourcePosType is not set to Point" << G4endl; +} + +void G4SPSPosDistribution::GeneratePointsInBeam() +{ + G4double x, y, z; + + G4ThreeVector RandPos; + G4double tempx, tempy, tempz; + z = 0.; + + // Private Method to create points in a plane + if(Shape == "Circle") + { + x = Radius + 100.; + y = Radius + 100.; + while(sqrt((x*x) + (y*y)) > Radius) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = (x*2.*Radius) - Radius; + y = (y*2.*Radius) - Radius; + } + x += G4RandGauss::shoot(0.0,SX) ; + y += G4RandGauss::shoot(0.0,SY) ; + } + else + { + // all other cases default to Rectangle case + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + x += G4RandGauss::shoot(0.0,SX); + y += G4RandGauss::shoot(0.0,SY); + } + // Apply Rotation Matrix + // x * Rotx, y * Roty and z * Rotz + if(verbosityLevel >= 2) + { + G4cout << "Raw position " << x << "," << y << "," << z << G4endl; + } + tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); + tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); + tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); + + RandPos.setX(tempx); + RandPos.setY(tempy); + RandPos.setZ(tempz); + + // Translate + particle_position = CentreCoords + RandPos; + if(verbosityLevel >= 1) + { + if(verbosityLevel >= 2) + { + G4cout << "Rotated Position " << RandPos << G4endl; + } + G4cout << "Rotated and Translated position " << particle_position << G4endl; + } +} + +void G4SPSPosDistribution::GeneratePointsInPlane() +{ + G4double x, y, z; + G4double expression; + G4ThreeVector RandPos; + G4double tempx, tempy, tempz; + x = y = z = 0.; + + if(SourcePosType != "Plane" && verbosityLevel >= 1) + G4cout << "Error: SourcePosType is not Plane" << G4endl; + + // Private Method to create points in a plane + if(Shape == "Circle") + { + x = Radius + 100.; + y = Radius + 100.; + while(sqrt((x*x) + (y*y)) > Radius) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = (x*2.*Radius) - Radius; + y = (y*2.*Radius) - Radius; + } + } + else if(Shape == "Annulus") + { + x = Radius + 100.; + y = Radius + 100.; + while(sqrt((x*x) + (y*y)) > Radius || sqrt((x*x) + (y*y)) < Radius0 ) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = (x*2.*Radius) - Radius; + y = (y*2.*Radius) - Radius; + } + } + else if(Shape == "Ellipse") + { + expression = 20.; + while(expression > 1.) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + + expression = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy)); + } + } + else if(Shape == "Square") + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + } + else if(Shape == "Rectangle") + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + } + else + G4cout << "Shape not one of the plane types" << G4endl; + + // Apply Rotation Matrix + // x * Rotx, y * Roty and z * Rotz + if(verbosityLevel == 2) + { + G4cout << "Raw position " << x << "," << y << "," << z << G4endl; + } + tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); + tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); + tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); + + RandPos.setX(tempx); + RandPos.setY(tempy); + RandPos.setZ(tempz); + + // Translate + particle_position = CentreCoords + RandPos; + if(verbosityLevel >= 1) + { + if(verbosityLevel == 2) + { + G4cout << "Rotated Position " << RandPos << G4endl; + } + G4cout << "Rotated and Translated position " << particle_position << G4endl; + } + + // For Cosine-Law make SideRefVecs = to Rotation matrix vectors + SideRefVec1 = Rotx; + SideRefVec2 = Roty; + SideRefVec3 = Rotz; + // If rotation matrix z' point to origin then invert the matrix + // So that SideRefVecs point away. + if((CentreCoords.x() > 0. && Rotz.x() < 0.) + || (CentreCoords.x() < 0. && Rotz.x() > 0.) + || (CentreCoords.y() > 0. && Rotz.y() < 0.) + || (CentreCoords.y() < 0. && Rotz.y() > 0.) + || (CentreCoords.z() > 0. && Rotz.z() < 0.) + || (CentreCoords.z() < 0. && Rotz.z() > 0.)) + { + // Invert y and z. + SideRefVec2 = -SideRefVec2; + SideRefVec3 = -SideRefVec3; + } + if(verbosityLevel == 2) + { + G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; + } +} + +void G4SPSPosDistribution::GeneratePointsOnSurface() +{ + //Private method to create points on a surface + G4double theta, phi; + G4double x, y, z; + x = y = z = 0.; + G4ThreeVector RandPos; + // G4double tempx, tempy, tempz; + + if(SourcePosType != "Surface" && verbosityLevel >= 1) + G4cout << "Error SourcePosType not Surface" << G4endl; + + if(Shape == "Sphere") + { + G4double tantheta; + theta = posRndm->GenRandTheta(); + phi = posRndm->GenRandPhi(); + + theta = acos(1. - 2.*theta); // theta isotropic + phi = phi * 2. * pi; + tantheta = tan(theta); + + x = Radius * sin(theta) * cos(phi); + y = Radius * sin(theta) * sin(phi); + z = Radius * cos(theta); + + RandPos.setX(x); + RandPos.setY(y); + RandPos.setZ(z); + + // Cosine-law (not a good idea to use this here) + G4ThreeVector zdash(x,y,z); + zdash = zdash.unit(); + G4ThreeVector xdash = Rotz.cross(zdash); + G4ThreeVector ydash = xdash.cross(zdash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else if(Shape == "Ellipsoid") + { + G4double theta, phi, minphi, maxphi, middlephi; + G4double answer, constant; + + constant = pi/(halfx*halfx) + pi/(halfy*halfy) + + twopi/(halfz*halfz); + + // simplified approach + theta = posRndm->GenRandTheta(); + phi = posRndm->GenRandPhi(); + + theta = acos(1. - 2.*theta); + minphi = 0.; + maxphi = twopi; + while(maxphi-minphi > 0.) + { + middlephi = (maxphi+minphi)/2.; + answer = (1./(halfx*halfx))*(middlephi/2. + sin(2*middlephi)/4.) + + (1./(halfy*halfy))*(middlephi/2. - sin(2*middlephi)/4.) + + middlephi/(halfz*halfz); + answer = answer/constant; + if(answer > phi) maxphi = middlephi; + if(answer < phi) minphi = middlephi; + if(fabs(answer-phi) <= 0.00001) + { + minphi = maxphi +1; + phi = middlephi; + } + } + + x = sin(theta)*cos(phi); + y = sin(theta)*sin(phi); + z = cos(theta); + // x,y and z form a unit vector. Put this onto the ellipse. + G4double lhs; + // solve for x + G4double numYinX = y/x; + G4double numZinX = z/x; + G4double tempxvar; + tempxvar= 1./(halfx*halfx)+(numYinX*numYinX)/(halfy*halfy) + + (numZinX*numZinX)/(halfz*halfz); + + tempxvar = 1./tempxvar; + G4double coordx = sqrt(tempxvar); + + //solve for y + G4double numXinY = x/y; + G4double numZinY = z/y; + G4double tempyvar; + tempyvar=(numXinY*numXinY)/(halfx*halfx)+1./(halfy*halfy) + +(numZinY*numZinY)/(halfz*halfz); + tempyvar = 1./tempyvar; + G4double coordy = sqrt(tempyvar); + + //solve for z + G4double numXinZ = x/z; + G4double numYinZ = y/z; + G4double tempzvar; + tempzvar=(numXinZ*numXinZ)/(halfx*halfx) + +(numYinZ*numYinZ)/(halfy*halfy)+1./(halfz*halfz); + tempzvar = 1./tempzvar; + G4double coordz = sqrt(tempzvar); + + lhs = sqrt((coordx*coordx)/(halfx*halfx) + + (coordy*coordy)/(halfy*halfy) + + (coordz*coordz)/(halfz*halfz)); + + if(fabs(lhs-1.) > 0.001 && verbosityLevel >= 1) + G4cout << "Error: theta, phi not really on ellipsoid" << G4endl; + + // coordx, coordy and coordz are all positive + G4double TestRandVar = G4UniformRand(); + if(TestRandVar > 0.5) + { + coordx = -coordx; + } + TestRandVar = G4UniformRand(); + if(TestRandVar > 0.5) + { + coordy = -coordy; + } + TestRandVar = G4UniformRand(); + if(TestRandVar > 0.5) + { + coordz = -coordz; + } + + RandPos.setX(coordx); + RandPos.setY(coordy); + RandPos.setZ(coordz); + + // Cosine-law (not a good idea to use this here) + G4ThreeVector zdash(coordx,coordy,coordz); + zdash = zdash.unit(); + G4ThreeVector xdash = Rotz.cross(zdash); + G4ThreeVector ydash = xdash.cross(zdash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else if(Shape == "Cylinder") + { + G4double AreaTop, AreaBot, AreaLat; + G4double AreaTotal, prob1, prob2, prob3; + G4double testrand; + + // User giver Radius and z-half length + // Calculate surface areas, maybe move this to + // a different routine. + + AreaTop = pi * Radius * Radius; + AreaBot = AreaTop; + AreaLat = 2. * pi * Radius * 2. * halfz; + AreaTotal = AreaTop + AreaBot + AreaLat; + + prob1 = AreaTop / AreaTotal; + prob2 = AreaBot / AreaTotal; + prob3 = 1.00 - prob1 - prob2; + if(fabs(prob3 - (AreaLat/AreaTotal)) >= 0.001) + { + if(verbosityLevel >= 1) + G4cout << AreaLat/AreaTotal << " " << prob3< (Radius*Radius)) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = x * 2. * Radius; + y = y * 2. * Radius; + x = x - Radius; + y = y - Radius; + } + // Cosine law + SideRefVec1 = Rotx; + SideRefVec2 = Roty; + SideRefVec3 = Rotz; + } + else if((testrand > prob1) && (testrand <= (prob1 + prob2))) + { + //Point on Bottom surface + z = -halfz; + x = Radius + 100.; + y = Radius + 100.; + while(((x*x)+(y*y)) > (Radius*Radius)) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + + x = x * 2. * Radius; + y = y * 2. * Radius; + x = x - Radius; + y = y - Radius; + } + // Cosine law + SideRefVec1 = Rotx; + SideRefVec2 = -Roty; + SideRefVec3 = -Rotz; + } + else if(testrand > (prob1+prob2)) + { + G4double rand; + //Point on Lateral Surface + + rand = G4UniformRand(); + rand = rand * 2. * pi; + + x = Radius * cos(rand); + y = Radius * sin(rand); + + z = posRndm->GenRandZ(); + + z = z * 2. * halfz; + z = z - halfz; + + // Cosine law + G4ThreeVector zdash(x,y,0.); + zdash = zdash.unit(); + G4ThreeVector xdash = Rotz.cross(zdash); + G4ThreeVector ydash = xdash.cross(zdash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else + G4cout << "Error: testrand " << testrand << G4endl; + + RandPos.setX(x); + RandPos.setY(y); + RandPos.setZ(z); + + } + else if(Shape == "Para") + { + G4double testrand; + //Right Parallelepiped. + // User gives x,y,z half lengths and ParAlpha + // ParTheta and ParPhi + // +x = <1, -x >1 & <2, +y >2 & <3, -y >3 &<4 + // +z >4 & < 5, -z >5 &<6. + testrand = G4UniformRand(); + G4double AreaX = halfy * halfz * 4.; + G4double AreaY = halfx * halfz * 4.; + G4double AreaZ = halfx * halfy * 4.; + G4double AreaTotal = 2*(AreaX + AreaY + AreaZ); + G4double Probs[6]; + Probs[0] = AreaX/AreaTotal; + Probs[1] = Probs[0] + AreaX/AreaTotal; + Probs[2] = Probs[1] + AreaY/AreaTotal; + Probs[3] = Probs[2] + AreaY/AreaTotal; + Probs[4] = Probs[3] + AreaZ/AreaTotal; + Probs[5] = Probs[4] + AreaZ/AreaTotal; + + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + z = posRndm->GenRandZ(); + + x = x * halfx * 2.; + x = x - halfx; + y = y * halfy * 2.; + y = y - halfy; + z = z * halfz * 2.; + z = z - halfz; + // Pick a side first + if(testrand < Probs[0]) + { + // side is +x + x = halfx + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); + y = y + z*tan(ParTheta)*sin(ParPhi); + z = z; + // Cosine-law + G4ThreeVector xdash(halfz*tan(ParTheta)*cos(ParPhi), + halfz*tan(ParTheta)*sin(ParPhi), + halfz/cos(ParPhi)); + G4ThreeVector ydash(halfy*tan(ParAlpha), -halfy, 0.0); + xdash = xdash.unit(); + ydash = ydash.unit(); + G4ThreeVector zdash = xdash.cross(ydash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else if(testrand >= Probs[0] && testrand < Probs[1]) + { + // side is -x + x = -halfx + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); + y = y + z*tan(ParTheta)*sin(ParPhi); + z = z; + // Cosine-law + G4ThreeVector xdash(halfz*tan(ParTheta)*cos(ParPhi), + halfz*tan(ParTheta)*sin(ParPhi), + halfz/cos(ParPhi)); + G4ThreeVector ydash(halfy*tan(ParAlpha), halfy, 0.0); + xdash = xdash.unit(); + ydash = ydash.unit(); + G4ThreeVector zdash = xdash.cross(ydash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else if(testrand >= Probs[1] && testrand < Probs[2]) + { + // side is +y + x = x + z*tan(ParTheta)*cos(ParPhi) + halfy*tan(ParAlpha); + y = halfy + z*tan(ParTheta)*sin(ParPhi); + z = z; + // Cosine-law + G4ThreeVector ydash(halfz*tan(ParTheta)*cos(ParPhi), + halfz*tan(ParTheta)*sin(ParPhi), + halfz/cos(ParPhi)); + ydash = ydash.unit(); + G4ThreeVector xdash = Roty.cross(ydash); + G4ThreeVector zdash = xdash.cross(ydash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = -ydash.unit(); + SideRefVec3 = -zdash.unit(); + } + else if(testrand >= Probs[2] && testrand < Probs[3]) + { + // side is -y + x = x + z*tan(ParTheta)*cos(ParPhi) - halfy*tan(ParAlpha); + y = -halfy + z*tan(ParTheta)*sin(ParPhi); + z = z; + // Cosine-law + G4ThreeVector ydash(halfz*tan(ParTheta)*cos(ParPhi), + halfz*tan(ParTheta)*sin(ParPhi), + halfz/cos(ParPhi)); + ydash = ydash.unit(); + G4ThreeVector xdash = Roty.cross(ydash); + G4ThreeVector zdash = xdash.cross(ydash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + } + else if(testrand >= Probs[3] && testrand < Probs[4]) + { + // side is +z + z = halfz; + y = y + halfz*sin(ParPhi)*tan(ParTheta); + x = x + halfz*cos(ParPhi)*tan(ParTheta) + y*tan(ParAlpha); + // Cosine-law + SideRefVec1 = Rotx; + SideRefVec2 = Roty; + SideRefVec3 = Rotz; + } + else if(testrand >= Probs[4] && testrand < Probs[5]) + { + // side is -z + z = -halfz; + y = y - halfz*sin(ParPhi)*tan(ParTheta); + x = x - halfz*cos(ParPhi)*tan(ParTheta) + y*tan(ParAlpha); + // Cosine-law + SideRefVec1 = Rotx; + SideRefVec2 = -Roty; + SideRefVec3 = -Rotz; + } + else + { + G4cout << "Error: testrand out of range" << G4endl; + if(verbosityLevel >= 1) + G4cout << "testrand=" << testrand << " Probs[5]=" << Probs[5] <= 1) + { + if(verbosityLevel == 2) + G4cout << "Rotated position " << RandPos << G4endl; + G4cout << "Rotated and translated position " << particle_position << G4endl; + } + if(verbosityLevel == 2) + { + G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; + } +} + +void G4SPSPosDistribution::GeneratePointsInVolume() +{ + G4ThreeVector RandPos; + G4double tempx, tempy, tempz; + G4double x, y, z; + x = y = z = 0.; + if(SourcePosType != "Volume" && verbosityLevel >= 1) + G4cout << "Error SourcePosType not Volume" << G4endl; + //Private method to create points in a volume + if(Shape == "Sphere") + { + x = Radius*2.; + y = Radius*2.; + z = Radius*2.; + while(((x*x)+(y*y)+(z*z)) > (Radius*Radius)) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + z = posRndm->GenRandZ(); + + x = (x*2.*Radius) - Radius; + y = (y*2.*Radius) - Radius; + z = (z*2.*Radius) - Radius; + } + } + else if(Shape == "Ellipsoid") + { + G4double temp; + temp = 100.; + while(temp > 1.) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + z = posRndm->GenRandZ(); + + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + z = (z*2.*halfz) - halfz; + + temp = ((x*x)/(halfx*halfx)) + ((y*y)/(halfy*halfy)) + + ((z*z)/(halfz*halfz)); + } + } + else if(Shape == "Cylinder") + { + x = Radius*2.; + y = Radius*2.; + while(((x*x)+(y*y)) > (Radius*Radius)) + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + z = posRndm->GenRandZ(); + + x = (x*2.*Radius) - Radius; + y = (y*2.*Radius) - Radius; + z = (z*2.*halfz) - halfz; + } + } + else if(Shape == "Para") + { + x = posRndm->GenRandX(); + y = posRndm->GenRandY(); + z = posRndm->GenRandZ(); + x = (x*2.*halfx) - halfx; + y = (y*2.*halfy) - halfy; + z = (z*2.*halfz) - halfz; + x = x + z*tan(ParTheta)*cos(ParPhi) + y*tan(ParAlpha); + y = y + z*tan(ParTheta)*sin(ParPhi); + z = z; + } + else + G4cout << "Error: Volume Shape Doesnt Exist" << G4endl; + + RandPos.setX(x); + RandPos.setY(y); + RandPos.setZ(z); + + // Apply Rotation Matrix + // x * Rotx, y * Roty and z * Rotz + tempx = (x * Rotx.x()) + (y * Roty.x()) + (z * Rotz.x()); + tempy = (x * Rotx.y()) + (y * Roty.y()) + (z * Rotz.y()); + tempz = (x * Rotx.z()) + (y * Roty.z()) + (z * Rotz.z()); + + RandPos.setX(tempx); + RandPos.setY(tempy); + RandPos.setZ(tempz); + + // Translate + particle_position = CentreCoords + RandPos; + + if(verbosityLevel == 2) + { + G4cout << "Raw position " << x << "," << y << "," << z << G4endl; + G4cout << "Rotated position " << RandPos << G4endl; + } + if(verbosityLevel >= 1) + G4cout << "Rotated and translated position " << particle_position << G4endl; + + // Cosine-law (not a good idea to use this here) + G4ThreeVector zdash(tempx,tempy,tempz); + zdash = zdash.unit(); + G4ThreeVector xdash = Rotz.cross(zdash); + G4ThreeVector ydash = xdash.cross(zdash); + SideRefVec1 = xdash.unit(); + SideRefVec2 = ydash.unit(); + SideRefVec3 = zdash.unit(); + + if(verbosityLevel == 2) + { + G4cout << "Reference vectors for cosine-law " << SideRefVec1 << " " << SideRefVec2 << " " << SideRefVec3 << G4endl; + } +} + +G4bool G4SPSPosDistribution::IsSourceConfined() +{ + // Method to check point is within the volume specified + if(Confine == false) + G4cout << "Error: Confine is false" << G4endl; + G4ThreeVector null(0.,0.,0.); + G4ThreeVector *ptr; + ptr = &null; + + // Check particle_position is within VolName, if so true, + // else false + G4VPhysicalVolume *theVolume; + theVolume=gNavigator->LocateGlobalPointAndSetup(particle_position,ptr,true); + G4String theVolName = theVolume->GetName(); + if(theVolName == VolName) + { + if(verbosityLevel >= 1) + G4cout << "Particle is in volume " << VolName << G4endl; + return(true); + } + else + return(false); +} + +G4ThreeVector G4SPSPosDistribution::GenerateOne() +{ + // + G4bool srcconf = false; + G4int LoopCount = 0; + while(srcconf == false) + { + if(SourcePosType == "Point") + GeneratePointSource(); + else if(SourcePosType == "Beam") + GeneratePointsInBeam(); + else if(SourcePosType == "Plane") + GeneratePointsInPlane(); + else if(SourcePosType == "Surface") + GeneratePointsOnSurface(); + else if(SourcePosType == "Volume") + GeneratePointsInVolume(); + else + { + G4cout << "Error: SourcePosType undefined" << G4endl; + G4cout << "Generating point source" << G4endl; + GeneratePointSource(); + } + if(Confine == true) + { + srcconf = IsSourceConfined(); + // if source in confined srcconf = true terminating the loop + // if source isnt confined srcconf = false and loop continues + } + else if(Confine == false) + srcconf = true; // terminate loop + LoopCount++; + if(LoopCount == 100000) + { + G4cout << "*************************************" << G4endl; + G4cout << "LoopCount = 100000" << G4endl; + G4cout << "Either the source distribution >> confinement" << G4endl; + G4cout << "or any confining volume may not overlap with" << G4endl; + G4cout << "the source distribution or any confining volumes" << G4endl; + G4cout << "may not exist"<< G4endl; + G4cout << "If you have set confine then this will be ignored" < +#include "G4TransportationManager.hh" +#include "G4VPhysicalVolume.hh" +#include "G4PhysicalVolumeStore.hh" +#include "G4ParticleTable.hh" +#include "G4ParticleDefinition.hh" +#include "G4IonTable.hh" +#include "G4Ions.hh" +#include "G4TrackingManager.hh" +#include "G4Track.hh" + +#include "G4SPSRandomGenerator.hh" + +//G4SPSRandomGenerator* G4SPSRandomGenerator::instance = 0; + +G4SPSRandomGenerator::G4SPSRandomGenerator() +{ + // Initialise all variables + + // Bias variables + XBias = false; + IPDFXBias = false; + YBias = false; + IPDFYBias = false; + ZBias = false; + IPDFZBias = false; + ThetaBias = false; + IPDFThetaBias = false; + PhiBias = false; + IPDFPhiBias = false; + EnergyBias = false; + IPDFEnergyBias = false; + bweights[0] = bweights[1] = bweights[2] = bweights[3] = bweights[4] = bweights[5] = 1. ; + verbosityLevel = 0 ; +} + +G4SPSRandomGenerator::~G4SPSRandomGenerator() +{} + +//G4SPSRandomGenerator* G4SPSRandomGenerator::getInstance () +//{ +// if (instance == 0) instance = new G4SPSRandomGenerator(); +// return instance; +//} + +// Biasing methods + +void G4SPSRandomGenerator::SetXBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + XBiasH.InsertValues(ehi, val); + XBias = true; +} + +void G4SPSRandomGenerator::SetYBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + YBiasH.InsertValues(ehi, val); + YBias = true; +} + +void G4SPSRandomGenerator::SetZBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + ZBiasH.InsertValues(ehi, val); + ZBias = true; +} + +void G4SPSRandomGenerator::SetThetaBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + ThetaBiasH.InsertValues(ehi, val); + ThetaBias = true; +} + +void G4SPSRandomGenerator::SetPhiBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + PhiBiasH.InsertValues(ehi, val); + PhiBias = true; +} + +void G4SPSRandomGenerator::SetEnergyBias(G4ThreeVector input) +{ + G4double ehi, val; + ehi = input.x(); + val = input.y(); + EnergyBiasH.InsertValues(ehi, val); + EnergyBias = true; +} + + +void G4SPSRandomGenerator::ReSetHist(G4String atype) +{ + if ( atype == "biasx") { + XBias = false ; + IPDFXBias = false; + XBiasH = IPDFXBiasH = ZeroPhysVector ;} + else if ( atype == "biasy") { + YBias = false ; + IPDFYBias = false; + YBiasH = IPDFYBiasH = ZeroPhysVector ;} + else if ( atype == "biasz") { + ZBias = false ; + IPDFZBias = false; + ZBiasH = IPDFZBiasH = ZeroPhysVector ;} + else if ( atype == "biast") { + ThetaBias = false ; + IPDFThetaBias = false; + ThetaBiasH = IPDFThetaBiasH = ZeroPhysVector ;} + else if ( atype == "biasp") { + PhiBias = false ; + IPDFPhiBias = false; + PhiBiasH = IPDFPhiBiasH = ZeroPhysVector ;} + else if ( atype == "biase") { + EnergyBias = false ; + IPDFEnergyBias = false; + EnergyBiasH = IPDFEnergyBiasH = ZeroPhysVector ;} + else { + G4cout << "Error, histtype not accepted " << G4endl; + } +} + + + +G4double G4SPSRandomGenerator::GenRandX() +{ + if(verbosityLevel >= 1) + G4cout << "In GenRandX" << G4endl; + if(XBias == false) + { + // X is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else + { + // X is biased + if(IPDFXBias == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(XBiasH.GetVectorLength()); + bins[0] = XBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = XBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFXBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + // retrieve the areas and then the x-axis values + bweights[0] = IPDFXBiasH(biasn2) - IPDFXBiasH(biasn2 - 1); + G4double xaxisl = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFXBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + //G4cout << "X Bin weight " << bweights[0] << " " << rndm << G4endl; + //G4cout << "lower and upper xaxis vals "<= 1) + G4cout << "X bin weight " << bweights[0] << " " << rndm << G4endl; + return(IPDFXBiasH.GetEnergy(rndm)); + } +} + +G4double G4SPSRandomGenerator::GenRandY() +{ + if(verbosityLevel >= 1) + G4cout << "In GenRandY" << G4endl; + if(YBias == false) + { + // Y is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else + { + // Y is biased + if(IPDFYBias == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(YBiasH.GetVectorLength()); + bins[0] = YBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = YBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFYBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + bweights[1] = IPDFYBiasH(biasn2) - IPDFYBiasH(biasn2 - 1); + G4double xaxisl = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFYBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + bweights[1] = NatProb/bweights[1]; + if(verbosityLevel >= 1) + G4cout << "Y bin weight " << bweights[1] << " " << rndm << G4endl; + return(IPDFYBiasH.GetEnergy(rndm)); + } +} + +G4double G4SPSRandomGenerator::GenRandZ() +{ + if(verbosityLevel >= 1) + G4cout << "In GenRandZ" << G4endl; + if(ZBias == false) + { + // Z is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else + { + // Z is biased + if(IPDFZBias == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(ZBiasH.GetVectorLength()); + bins[0] = ZBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = ZBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFZBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + bweights[2] = IPDFZBiasH(biasn2) - IPDFZBiasH(biasn2 - 1); + G4double xaxisl = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFZBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + bweights[2] = NatProb/bweights[2]; + if(verbosityLevel >= 1) + G4cout << "Z bin weight " << bweights[2] << " " << rndm << G4endl; + return(IPDFZBiasH.GetEnergy(rndm)); + } +} + +G4double G4SPSRandomGenerator::GenRandTheta() +{ + if(verbosityLevel >= 1) + { + G4cout << "In GenRandTheta" << G4endl; + G4cout << "Verbosity " << verbosityLevel << G4endl; + } + if(ThetaBias == false) + { + // Theta is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else + { + // Theta is biased + if(IPDFThetaBias == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(ThetaBiasH.GetVectorLength()); + bins[0] = ThetaBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = ThetaBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFThetaBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + bweights[3] = IPDFThetaBiasH(biasn2) - IPDFThetaBiasH(biasn2 - 1); + G4double xaxisl = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFThetaBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + bweights[3] = NatProb/bweights[3]; + if(verbosityLevel >= 1) + G4cout << "Theta bin weight " << bweights[3] << " " << rndm << G4endl; + return(IPDFThetaBiasH.GetEnergy(rndm)); + } +} + +G4double G4SPSRandomGenerator::GenRandPhi() +{ + if(verbosityLevel >= 1) + G4cout << "In GenRandPhi" << G4endl; + if(PhiBias == false) + { + // Phi is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else + { + // Phi is biased + if(IPDFPhiBias == false) + { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(PhiBiasH.GetVectorLength()); + bins[0] = PhiBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = PhiBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFPhiBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + bweights[4] = IPDFPhiBiasH(biasn2) - IPDFPhiBiasH(biasn2 - 1); + G4double xaxisl = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFPhiBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + bweights[4] = NatProb/bweights[4]; + if(verbosityLevel >= 1) + G4cout << "Phi bin weight " << bweights[4] << " " << rndm << G4endl; + return(IPDFPhiBiasH.GetEnergy(rndm)); + } +} + +G4double G4SPSRandomGenerator::GenRandEnergy() +{ + if(verbosityLevel >= 1) + G4cout << "In GenRandEnergy" << G4endl; + if(EnergyBias == false) + { + // Energy is not biased + G4double rndm = G4UniformRand(); + return(rndm); + } + else { + // ENERGY is biased + if(IPDFEnergyBias == false) { + // IPDF has not been created, so create it + G4double bins[1024],vals[1024], sum; + G4int ii; + G4int maxbin = G4int(EnergyBiasH.GetVectorLength()); + bins[0] = EnergyBiasH.GetLowEdgeEnergy(size_t(0)); + vals[0] = EnergyBiasH(size_t(0)); + sum = vals[0]; + for(ii=1;ii IPDFEnergyBiasH(biasn2)) + biasn1 = biasn2; + else + biasn3 = biasn2; + biasn2 = biasn1 + (biasn3 - biasn1 + 1)/2; + } + bweights[5] = IPDFEnergyBiasH(biasn2) - IPDFEnergyBiasH(biasn2 - 1); + G4double xaxisl = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2-1)); + G4double xaxisu = IPDFEnergyBiasH.GetLowEdgeEnergy(size_t(biasn2)); + G4double NatProb = xaxisu - xaxisl; + bweights[5] = NatProb/bweights[5]; + if(verbosityLevel >= 1) + G4cout << "Energy bin weight " << bweights[5] << " " << rndm << G4endl; + return(IPDFEnergyBiasH.GetEnergy(rndm)); + } +} + + + + + + + + diff --git a/source/event/src/G4SingleParticleSource.cc b/source/event/src/G4SingleParticleSource.cc new file mode 100644 index 0000000000..83262744e8 --- /dev/null +++ b/source/event/src/G4SingleParticleSource.cc @@ -0,0 +1,165 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +/////////////////////////////////////////////////////////////////////////////// +// +// MODULE: G4SingleParticleSource.hh +// +// Version: 1.0 +// Date: 5/02/04 +// Author: Fan Lei +// Organisation: QinetiQ ltd. +// Customer: ESA/ESTEC +// +/////////////////////////////////////////////////////////////////////////////// +// +// CHANGE HISTORY +// -------------- +// +// Version 1.0, 05/02/2004, Fan Lei, Created. +// Based on the G4GeneralParticleSource class in Geant4 v6.0 +// +/////////////////////////////////////////////////////////////////////////////// +// +#include "G4PrimaryParticle.hh" +#include "G4Event.hh" +#include "Randomize.hh" +#include +#include "G4ParticleTable.hh" +#include "G4Geantino.hh" +#include "G4ParticleDefinition.hh" +#include "G4IonTable.hh" +#include "G4Ions.hh" +#include "G4TrackingManager.hh" +#include "G4Track.hh" +#include "G4SingleParticleSource.hh" + +G4SingleParticleSource::G4SingleParticleSource() +{ + // Initialise all variables + // Position distribution Variables + + NumberOfParticlesToBeGenerated = 1; + particle_definition = G4Geantino::GeantinoDefinition(); + G4ThreeVector zero; + particle_momentum_direction = G4ParticleMomentum(1,0,0); + particle_energy = 1.0*MeV; + particle_position = zero; + particle_time = 0.0; + particle_polarization = zero; + particle_charge = 0.0; + particle_weight = 1.0; + + biasRndm = new G4SPSRandomGenerator(); + posGenerator = new G4SPSPosDistribution(); + posGenerator->SetBiasRndm(biasRndm); + angGenerator = new G4SPSAngDistribution(); + angGenerator->SetPosDistribution(posGenerator); + angGenerator->SetBiasRndm(biasRndm); + eneGenerator = new G4SPSEneDistribution(); + eneGenerator->SetBiasRndm(biasRndm); + + // verbosity + verbosityLevel = 0; + +} + +G4SingleParticleSource::~G4SingleParticleSource() +{} + +void G4SingleParticleSource::SetVerbosity(int vL) +{ + verbosityLevel = vL; + posGenerator->SetVerbosity(vL); + angGenerator->SetVerbosity(vL); + eneGenerator->SetVerbosity(vL); + G4cout << "Verbosity Set to: " << verbosityLevel << G4endl; +} + +void G4SingleParticleSource::SetParticleDefinition + (G4ParticleDefinition* aParticleDefinition) +{ + particle_definition = aParticleDefinition; + particle_charge = particle_definition->GetPDGCharge(); +} + +void G4SingleParticleSource::GeneratePrimaryVertex(G4Event *evt) +{ + if(particle_definition==NULL) return; + + // Position stuff + particle_position = posGenerator->GenerateOne(); + // Angular stuff + particle_momentum_direction = angGenerator->GenerateOne(); + // Energy stuff + particle_energy = eneGenerator->GenerateOne(particle_definition); + + // create a new vertex + G4PrimaryVertex* vertex = new G4PrimaryVertex(particle_position,particle_time); + + if(verbosityLevel >= 2) + G4cout << "Creating primaries and assigning to vertex" << G4endl; + // create new primaries and set them to the vertex + G4double mass = particle_definition->GetPDGMass(); + G4double energy = particle_energy + mass; + G4double pmom = sqrt(energy*energy-mass*mass); + G4double px = pmom*particle_momentum_direction.x(); + G4double py = pmom*particle_momentum_direction.y(); + G4double pz = pmom*particle_momentum_direction.z(); + + if(verbosityLevel > 1){ + G4cout << "Particle name: "<GetParticleName() << G4endl; + G4cout << " Energy: "<SetMass( mass ); + particle->SetCharge( particle_charge ); + particle->SetPolarization(particle_polarization.x(), + particle_polarization.y(), + particle_polarization.z()); + vertex->SetPrimary( particle ); + + // Set bweight equal to the multiple of all non-zero weights + particle_weight = biasRndm->GetBiasWeight(); + // now pass it to the primary vertex + vertex->SetWeight(particle_weight); + } + evt->AddPrimaryVertex( vertex ); + if(verbosityLevel > 1) + G4cout << " Primary Vetex generated !"<< G4endl; +} + + + + + + + + + diff --git a/source/event/src/G4StackedTrack.cc b/source/event/src/G4StackedTrack.cc index 244d0bc670..75263b569c 100644 --- a/source/event/src/G4StackedTrack.cc +++ b/source/event/src/G4StackedTrack.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4StackedTrack.cc,v 1.6 2003/05/21 20:52:54 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4StackedTrack.cc,v 1.8 2004/06/11 14:11:20 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Last Modification : 02/Feb/96 M.Asai diff --git a/source/event/src/G4TrajectoryContainer.cc b/source/event/src/G4TrajectoryContainer.cc index 950fb5c909..a6d74cff64 100644 --- a/source/event/src/G4TrajectoryContainer.cc +++ b/source/event/src/G4TrajectoryContainer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TrajectoryContainer.cc,v 1.2 2002/10/06 11:46:48 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4TrajectoryContainer.cc,v 1.4 2004/06/11 14:11:21 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4TrajectoryContainer.hh" diff --git a/source/g3tog4/GNUmakefile b/source/g3tog4/GNUmakefile index 8a80e74c16..bd64e88a15 100644 --- a/source/g3tog4/GNUmakefile +++ b/source/g3tog4/GNUmakefile @@ -18,6 +18,11 @@ ifndef G4INSTALL G4INSTALL := ../.. endif +GLOBLIBS = libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4intercoms.lib +GLOBLIBS += libG4graphics_reps.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += \ @@ -31,7 +36,6 @@ CPPFLAGS += \ -I$(G4BASE)/geometry/solids/specific/include \ -I$(G4BASE)/geometry/solids/Boolean/include \ -I$(G4BASE)/geometry/solids/BREPS/include \ - -I$(G4BASE)/geometry/solids/STEP/include \ -I$(G4BASE)/graphics_reps/include \ -I$(G4BASE)/materials/include \ -I$(G4BASE)/particles/management/include \ diff --git a/source/g3tog4/History b/source/g3tog4/History index d6a05c3625..e02a19366f 100644 --- a/source/g3tog4/History +++ b/source/g3tog4/History @@ -1,8 +1,22 @@ -$Id: History,v 1.53 2003/10/03 14:31:40 gcosmo Exp $ +$Id: History,v 1.56 2004/06/17 14:27:32 gcosmo Exp $ G3toG4 Modification History (reverse chronological order, please !) -------------------------------------------------------------------- +g3tog4-V06-01-02 17-Jun-2004 G.Cosmo +- GNUmakefile: added definition of GLOBLIBS. + +g3tog4-V06-01-01 03-May-2004 G.Cosmo +- G4gsrotm.cc: commented warning about left-handled coordinates for + rotation axes (I.Hrivnacova). + +g3tog4-V06-01-00 26-Mar-2004 G.Cosmo +- Removed hardwired gSeparator constant (a character which is used + during generation of volume names) to '_'. Now gSeparator is made non + constant and so can be changed in case a user wants to use '_' in his + code (I.Hrivnacova). + Modified files: G3toG4.hh, clparse.cc. + g3tog4-V05-02-00 03-Oct-2003 G.Cosmo - GNUmakefile: o replaced "digits+hits" with "digits_hits". diff --git a/source/g3tog4/include/G3toG4.hh b/source/g3tog4/include/G3toG4.hh index ffc0a444fe..e1dce15db8 100644 --- a/source/g3tog4/include/G3toG4.hh +++ b/source/g3tog4/include/G3toG4.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G3toG4.hh,v 1.7 2001/07/11 09:58:58 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G3toG4.hh,v 1.8 2004/03/26 14:59:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // modified by I.Hrivnacova, 27 Sep 99 @@ -31,7 +31,7 @@ #include "globals.hh" -const char gSeparator('_'); +extern char gSeparator; extern G4int Ipar[1000]; extern G4double Rpar[1000]; diff --git a/source/g3tog4/src/G4gsrotm.cc b/source/g3tog4/src/G4gsrotm.cc index 9dfb811997..5fe4aca61b 100644 --- a/source/g3tog4/src/G4gsrotm.cc +++ b/source/g3tog4/src/G4gsrotm.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4gsrotm.cc,v 1.9 2001/07/11 09:59:02 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4gsrotm.cc,v 1.10 2004/05/03 07:49:53 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G3toG4.hh" #include "G3RotTable.hh" @@ -85,10 +85,10 @@ void G4gsrotm(G4int irot, G4double theta1, G4double phi1, G4cerr << G4endl; G4Exception("G4gsrotm error"); } - else if (1+check<=tol) { - G4cerr << "G4gsrotm warning: coordinate axes forming rotation " - << "matrix " << irot << " are left-handed" << G4endl; - } + //else if (1+check<=tol) { + // G4cerr << "G4gsrotm warning: coordinate axes forming rotation " + // << "matrix " << irot << " are left-handed" << G4endl; + //} G3toG4RotationMatrix* rotp = new G3toG4RotationMatrix; diff --git a/source/g3tog4/src/clparse.cc b/source/g3tog4/src/clparse.cc index 97d8325a0b..713b40b932 100644 --- a/source/g3tog4/src/clparse.cc +++ b/source/g3tog4/src/clparse.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: clparse.cc,v 1.15 2003/06/16 16:50:58 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: clparse.cc,v 1.16 2004/03/26 14:59:13 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // modified by I.Hrivnacova // added G3SensVol @@ -56,6 +56,7 @@ G3PartTable G3Part; // particle ID <-> ParticleDefinition pointer G3DetTable G3Det; // sensitive detector name <-> pointer G3EleTable G3Ele; // element names table G3SensVolVector G3SensVol; // vector of sensitive logical volumes +char gSeparator('_'); G4int narray; diff --git a/source/geometry/GNUmakefile b/source/geometry/GNUmakefile index 4825f963ab..8d655090e7 100644 --- a/source/geometry/GNUmakefile +++ b/source/geometry/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.11 2003/10/08 14:39:19 gcosmo Exp $ +# $Id: GNUmakefile,v 1.12 2004/06/01 15:35:46 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for geometry. Gabriele Cosmo, 16/11/96. # -------------------------------------------------------------- @@ -9,6 +9,8 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4intercoms.lib libG4graphics_reps.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk SUBDIRS = management volumes magneticfield navigation biasing divisions diff --git a/source/geometry/History b/source/geometry/History index 6a35f52c5e..fd739f4436 100644 --- a/source/geometry/History +++ b/source/geometry/History @@ -1,4 +1,4 @@ -$Id: History,v 1.30 2003/11/04 09:47:57 gcosmo Exp $ +$Id: History,v 1.32 2004/06/11 15:01:29 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 11, 2004 Gabriele Cosmo geometry-V06-01-01 +----------------------------- +- Includes tag "geomnav-V06-01-01". +- Use global flag G4GEOMETRY_ALLOC_EXPORT to export extern symbols for DLLs. + Modified granular GNUmakefiles and rearranged usage of extern symbols + in classes in volumes module. + +Jun 07, 2004 Gabriele Cosmo geometry-V06-01-00 +----------------------------- +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Includes tags in "geant4-06-02-cand-00" plus "geomvol-V06-01-02". + Nov 04, 2003 Gabriele Cosmo geometry-V05-02-01 ----------------------------- - Includes headers review. Tags included: diff --git a/source/geometry/biasing/GNUmakefile b/source/geometry/biasing/GNUmakefile index c73065d759..af2807ded9 100644 --- a/source/geometry/biasing/GNUmakefile +++ b/source/geometry/biasing/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2003/10/01 14:51:38 gcosmo Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/11 14:17:12 gcosmo Exp $ # -------------------------------------------------------------------- # GNUmakefile for geometry/biasing library. Gabriele Cosmo, 25/03/02. # -------------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4GEOM_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/geometry/solids/CSG/include \ -I$(G4BASE)/materials/include \ -I$(G4BASE)/graphics_reps/include \ diff --git a/source/geometry/divisions/GNUmakefile b/source/geometry/divisions/GNUmakefile index 3b7abdc278..04f39ae45b 100644 --- a/source/geometry/divisions/GNUmakefile +++ b/source/geometry/divisions/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2003/11/19 11:51:44 gcosmo Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/11 14:17:13 gcosmo Exp $ # ---------------------------------------------------------------------- # GNUmakefile for geometry/divisions library. Gabriele Cosmo, 16/06/03. # ---------------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4GEOM_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/geometry/divisions/History b/source/geometry/divisions/History index 4ab369f88b..c27a439ef9 100644 --- a/source/geometry/divisions/History +++ b/source/geometry/divisions/History @@ -1,4 +1,4 @@ -$Id: History,v 1.10 2003/11/19 18:02:10 gcosmo Exp $ +$Id: History,v 1.12 2004/05/17 07:20:59 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +May 17th, 2004 G.Cosmo (geomdiv-V06-01-01) +- Corrected handling of offset in Z for reflection. + +May 13th, 2004 G.Cosmo (geomdiv-V06-01-00) +- Added support for reflection of divided volumes (courtesy of I.Hrivnacova): + o Added concrete istance of division-factory G4PVDivisionFactory + for the creation of volume divisions on demand. + o Enhanced unit-test suite "ExDivisions" to support reflections with + additional input argument for positioning type (normal/reflected). + o Coworks with tags: geommng-V06-01-00, geomvol-V06-01-00 and + geom-bool-V06-01-00. + Nov 19th, 2003 G.Cosmo (geomdiv-V05-02-07) - Moved verbose output between G4DIVDEBUG compilation flag. - Added testing framework for divisions to be used also as base for user's example. diff --git a/source/geometry/divisions/include/G4PVDivision.hh b/source/geometry/divisions/include/G4PVDivision.hh index 9d884ec5c2..1c7ea0abe4 100644 --- a/source/geometry/divisions/include/G4PVDivision.hh +++ b/source/geometry/divisions/include/G4PVDivision.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PVDivision.hh,v 1.7 2003/11/19 11:51:22 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PVDivision.hh,v 1.8 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4PVDivision // @@ -61,9 +61,9 @@ // n=0..nReplicas-1 // History: -// 09.05.01 - P.Arce Initial version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// ---------------------------------------------------------------------- #ifndef G4PVDIVISION_HH #define G4PVDIVISION_HH diff --git a/source/geometry/divisions/include/G4PVDivisionFactory.hh b/source/geometry/divisions/include/G4PVDivisionFactory.hh new file mode 100644 index 0000000000..1df89701d1 --- /dev/null +++ b/source/geometry/divisions/include/G4PVDivisionFactory.hh @@ -0,0 +1,98 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4PVDivisionFactory.hh,v 1.1 2004/05/13 14:56:30 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// class G4PVDivisionFactory +// +// Class description: +// +// Implementation of the interfaces for creating volumes divisions +// (defined in G4VPVDivisionFactory) for G4PVDivision type. + +// Author: Ivana Hrivnacova, 4.5.2004 (Ivana.Hrivnacova@cern.ch) +// ------------------------------------------------------------------------ +#ifndef G4PVDIVISION_FACTORY_HH +#define G4PVDIVISION_FACTORY_HH + +#include "geomdefs.hh" +#include "G4VPVDivisionFactory.hh" + +class G4LogicalVolume; + +class G4PVDivisionFactory : public G4VPVDivisionFactory +{ + public: // with description + + virtual ~G4PVDivisionFactory(); + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMother, + const EAxis pAxis, + const G4int nReplicas, + const G4double width, + const G4double offset ); + // Create division - with number of divisions and width. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4int nReplicas, + const G4double offset ); + // Create division - with number of divisions. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4double width, + const G4double offset ); + // Create division - with width. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const G4VPVParameterisation* param); + // Create division - with parameterisation. + + virtual G4bool IsPVDivision(const G4VPhysicalVolume* pv) const; + // Returns true if pv is division. + + static G4PVDivisionFactory* GetInstance(); + // Create the unique instance of the singleton. + + protected: + + G4PVDivisionFactory(); + +}; + +#endif diff --git a/source/geometry/divisions/include/G4ParameterisationBox.hh b/source/geometry/divisions/include/G4ParameterisationBox.hh index e3733c4de9..07e60e76aa 100644 --- a/source/geometry/divisions/include/G4ParameterisationBox.hh +++ b/source/geometry/divisions/include/G4ParameterisationBox.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationBox.hh,v 1.3 2003/11/19 11:51:22 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationBox.hh,v 1.4 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationBoxX, // G4ParameterisationBoxY, @@ -34,9 +34,10 @@ // dividing a G4Box along one of each axis X, Y, Z. // History: -// 09.05.01 - P.Arce Initial version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #ifndef G4ParameterisationBox_H #define G4ParameterisationBox_H 1 @@ -58,7 +59,18 @@ class G4Tubs; class G4Polycone; class G4Polyhedra; -class G4ParameterisationBoxX : public G4VDivisionParameterisation +class G4VParameterisationBox : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationBox( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationBox(); +}; + +class G4ParameterisationBoxX : public G4VParameterisationBox { public: // with description @@ -75,8 +87,7 @@ class G4ParameterisationBoxX : public G4VDivisionParameterisation void ComputeDimensions(G4Box& box, const G4int copyNo, const G4VPhysicalVolume* physVol) const; - - private: // Dummy declarations to get rid of warnings ... + private: // Dummy declarations to get rid of warnings ... void ComputeDimensions (G4Cons&,const G4int, const G4VPhysicalVolume*) const {} @@ -102,7 +113,7 @@ class G4ParameterisationBoxX : public G4VDivisionParameterisation const G4VPhysicalVolume*) const {} }; -class G4ParameterisationBoxY : public G4VDivisionParameterisation +class G4ParameterisationBoxY : public G4VParameterisationBox { public: // with description @@ -145,7 +156,7 @@ class G4ParameterisationBoxY : public G4VDivisionParameterisation const G4VPhysicalVolume*) const {} }; -class G4ParameterisationBoxZ : public G4VDivisionParameterisation +class G4ParameterisationBoxZ : public G4VParameterisationBox { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationCons.hh b/source/geometry/divisions/include/G4ParameterisationCons.hh index 89688d1852..89c664e310 100644 --- a/source/geometry/divisions/include/G4ParameterisationCons.hh +++ b/source/geometry/divisions/include/G4ParameterisationCons.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationCons.hh,v 1.4 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationCons.hh,v 1.5 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationConsRho, // G4ParameterisationConsPhi, @@ -34,9 +34,10 @@ // dividing a G4Cons along one of each axis Rho, Phi, Z. // History: -// 09.05.01 - P.Arce Initial version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #ifndef G4ParameterisationCons_H #define G4ParameterisationCons_H 1 @@ -58,7 +59,18 @@ class G4Tubs; class G4Polycone; class G4Polyhedra; -class G4ParameterisationConsRho : public G4VDivisionParameterisation +class G4VParameterisationCons : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationCons( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationCons(); +}; + +class G4ParameterisationConsRho : public G4VParameterisationCons { public: // with description @@ -100,7 +112,7 @@ class G4ParameterisationConsRho : public G4VDivisionParameterisation const G4VPhysicalVolume*) const {} }; -class G4ParameterisationConsPhi : public G4VDivisionParameterisation +class G4ParameterisationConsPhi : public G4VParameterisationCons { public: // with description @@ -142,7 +154,7 @@ class G4ParameterisationConsPhi : public G4VDivisionParameterisation const G4VPhysicalVolume*) const {} }; -class G4ParameterisationConsZ : public G4VDivisionParameterisation +class G4ParameterisationConsZ : public G4VParameterisationCons { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationPara.hh b/source/geometry/divisions/include/G4ParameterisationPara.hh index b87e4abdd6..1ba3eb3f7b 100644 --- a/source/geometry/divisions/include/G4ParameterisationPara.hh +++ b/source/geometry/divisions/include/G4ParameterisationPara.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPara.hh,v 1.5 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPara.hh,v 1.6 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationParaX, // G4ParameterisationParaY, @@ -34,9 +34,10 @@ // dividing a G4Para along one of each axis X, Y, Z. // History: -// 09.05.01 - P.Arce First version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #ifndef G4ParameterisationPara_H #define G4ParameterisationPara_H 1 @@ -56,8 +57,18 @@ class G4Tubs; class G4Polycone; class G4Polyhedra; +class G4VParameterisationPara : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationPara( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationPara(); +}; -class G4ParameterisationParaX : public G4VDivisionParameterisation +class G4ParameterisationParaX : public G4VParameterisationPara { public: // with description @@ -101,7 +112,7 @@ class G4ParameterisationParaX : public G4VDivisionParameterisation }; -class G4ParameterisationParaY : public G4VDivisionParameterisation +class G4ParameterisationParaY : public G4VParameterisationPara { public: // with description @@ -145,7 +156,7 @@ class G4ParameterisationParaY : public G4VDivisionParameterisation }; -class G4ParameterisationParaZ : public G4VDivisionParameterisation +class G4ParameterisationParaZ : public G4VParameterisationPara { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationPolycone.hh b/source/geometry/divisions/include/G4ParameterisationPolycone.hh index 241a6f2828..9d56c5ef47 100644 --- a/source/geometry/divisions/include/G4ParameterisationPolycone.hh +++ b/source/geometry/divisions/include/G4ParameterisationPolycone.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPolycone.hh,v 1.5 2003/11/18 12:15:30 arce Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPolycone.hh,v 1.6 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationPolyconeRho, // G4ParameterisationPolyconePhi, @@ -34,7 +34,9 @@ // dividing a G4Polycone along one of each axis Rho, Phi, Z. // History: -// 09.05.01 - P.Arce First version +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection //--------------------------------------------------------------------- #ifndef G4ParameterisationPolycone_H #define G4ParameterisationPolycone_H 1 @@ -56,11 +58,22 @@ class G4Hype; class G4Tubs; class G4Polyhedra; +class G4VParameterisationPolycone : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationPolycone( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationPolycone(); +}; + //--------------------------------------------------------------------- // Class G4ParameterisationPolyconeRho //--------------------------------------------------------------------- -class G4ParameterisationPolyconeRho : public G4VDivisionParameterisation +class G4ParameterisationPolyconeRho : public G4VParameterisationPolycone { public: // with description @@ -109,7 +122,7 @@ class G4ParameterisationPolyconeRho : public G4VDivisionParameterisation // Class G4ParameterisationPolyconePhi //--------------------------------------------------------------------- -class G4ParameterisationPolyconePhi : public G4VDivisionParameterisation +class G4ParameterisationPolyconePhi : public G4VParameterisationPolycone { public: // with description @@ -156,7 +169,7 @@ class G4ParameterisationPolyconePhi : public G4VDivisionParameterisation // Class G4ParameterisationPolyconeZ //--------------------------------------------------------------------- -class G4ParameterisationPolyconeZ : public G4VDivisionParameterisation +class G4ParameterisationPolyconeZ : public G4VParameterisationPolycone { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationPolyhedra.hh b/source/geometry/divisions/include/G4ParameterisationPolyhedra.hh index bdc4e42b96..e9cebb52a5 100644 --- a/source/geometry/divisions/include/G4ParameterisationPolyhedra.hh +++ b/source/geometry/divisions/include/G4ParameterisationPolyhedra.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPolyhedra.hh,v 1.6 2003/11/18 12:15:30 arce Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPolyhedra.hh,v 1.7 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationPolyhedraRho, // G4ParameterisationPolyhedraPhi, @@ -34,7 +34,9 @@ // dividing a G4Polyhedra along one of each axis Rho, Phi, Z. // History: -// 09.05.01 - P.Arce First version +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection //--------------------------------------------------------------------- #ifndef G4ParameterisationPolyhedra_H #define G4ParameterisationPolyhedra_H 1 @@ -56,11 +58,28 @@ class G4Hype; class G4Tubs; class G4Polycone; +class G4VParameterisationPolyhedra : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationPolyhedra( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationPolyhedra(); + + private: + + G4double ConvertRadiusFactor(const G4Polyhedra& phedra) const; + // Converts radius of the sides to radius of the corners: + // r_corners = r_sides/factor +}; + //--------------------------------------------------------------------- // Class G4ParameterisationPolyhedraRho //--------------------------------------------------------------------- -class G4ParameterisationPolyhedraRho : public G4VDivisionParameterisation +class G4ParameterisationPolyhedraRho : public G4VParameterisationPolyhedra { public: // with description @@ -109,7 +128,7 @@ class G4ParameterisationPolyhedraRho : public G4VDivisionParameterisation // Class G4ParameterisationPolyhedraPhi //--------------------------------------------------------------------- -class G4ParameterisationPolyhedraPhi : public G4VDivisionParameterisation +class G4ParameterisationPolyhedraPhi : public G4VParameterisationPolyhedra { public: // with description @@ -158,7 +177,7 @@ class G4ParameterisationPolyhedraPhi : public G4VDivisionParameterisation // Class G4ParameterisationPolyhedraZ //--------------------------------------------------------------------- -class G4ParameterisationPolyhedraZ : public G4VDivisionParameterisation +class G4ParameterisationPolyhedraZ : public G4VParameterisationPolyhedra { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationTrd.hh b/source/geometry/divisions/include/G4ParameterisationTrd.hh index 71cae23460..634dbed8da 100644 --- a/source/geometry/divisions/include/G4ParameterisationTrd.hh +++ b/source/geometry/divisions/include/G4ParameterisationTrd.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationTrd.hh,v 1.5 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationTrd.hh,v 1.6 2004/05/13 14:57:12 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationTrdX // G4ParameterisationTrdY @@ -34,9 +34,10 @@ // dividing a trapezoid along one of each axis X, Y, Z. // History: -// 09.05.01 P.Arce First version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #ifndef G4ParameterisationTrd_H #define G4ParameterisationTrd_H 1 @@ -57,7 +58,18 @@ class G4Tubs; class G4Polycone; class G4Polyhedra; -class G4ParameterisationTrdX : public G4VDivisionParameterisation +class G4VParameterisationTrd : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationTrd( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationTrd(); +}; + +class G4ParameterisationTrdX : public G4VParameterisationTrd { public: // with description @@ -103,7 +115,7 @@ class G4ParameterisationTrdX : public G4VDivisionParameterisation }; -class G4ParameterisationTrdY : public G4VDivisionParameterisation +class G4ParameterisationTrdY : public G4VParameterisationTrd { public: // with description @@ -149,7 +161,7 @@ class G4ParameterisationTrdY : public G4VDivisionParameterisation }; -class G4ParameterisationTrdZ : public G4VDivisionParameterisation +class G4ParameterisationTrdZ : public G4VParameterisationTrd { public: // with description diff --git a/source/geometry/divisions/include/G4ParameterisationTubs.hh b/source/geometry/divisions/include/G4ParameterisationTubs.hh index 5d15373d96..505cceb5b1 100644 --- a/source/geometry/divisions/include/G4ParameterisationTubs.hh +++ b/source/geometry/divisions/include/G4ParameterisationTubs.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParameterisationTubs.hh,v 1.4 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationTubs.hh,v 1.5 2004/05/13 14:57:13 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // classes G4ParameterisationTubsRho // G4ParameterisationTubsPhi @@ -34,9 +34,10 @@ // dividing a G4Tubs along one of each axis Rho, Phi, Z. // History: -// 09.05.01 P.Arce First version -// ******************************************************************** - +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #ifndef G4ParameterisationTubsRho_H #define G4ParameterisationTubsRho_H 1 @@ -56,8 +57,18 @@ class G4Hype; class G4Polycone; class G4Polyhedra; +class G4VParameterisationTubs : public G4VDivisionParameterisation +{ + public: // with description + + G4VParameterisationTubs( EAxis axis, G4int nCopies, + G4double offset, G4double step, + G4VSolid* msolid, DivisionType divType ); + + virtual ~G4VParameterisationTubs(); +}; -class G4ParameterisationTubsRho : public G4VDivisionParameterisation +class G4ParameterisationTubsRho : public G4VParameterisationTubs { public: // with description @@ -100,7 +111,7 @@ class G4ParameterisationTubsRho : public G4VDivisionParameterisation }; -class G4ParameterisationTubsPhi : public G4VDivisionParameterisation +class G4ParameterisationTubsPhi : public G4VParameterisationTubs { public: // with description @@ -143,7 +154,7 @@ class G4ParameterisationTubsPhi : public G4VDivisionParameterisation }; -class G4ParameterisationTubsZ : public G4VDivisionParameterisation +class G4ParameterisationTubsZ : public G4VParameterisationTubs { public: // with description diff --git a/source/geometry/divisions/include/G4VDivisionParameterisation.hh b/source/geometry/divisions/include/G4VDivisionParameterisation.hh index 105a215292..ccea134230 100644 --- a/source/geometry/divisions/include/G4VDivisionParameterisation.hh +++ b/source/geometry/divisions/include/G4VDivisionParameterisation.hh @@ -21,20 +21,20 @@ // ******************************************************************** // // -// $Id: G4VDivisionParameterisation.hh,v 1.6 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4VDivisionParameterisation.hh,v 1.8 2004/05/17 07:20:39 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4VDivisionParameterisation // // Class description: // -// ...... -// -// Member data: -// +// Base class for parameterisations defining divisions of volumes +// for different kind of CSG and specific solids. // History: -// 09.05.01 - P.Arce Initial version +// ------- +// 09.05.01 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection //--------------------------------------------------------------------- #ifndef G4VDivisionParameterisation_H #define G4VDivisionParameterisation_H 1 @@ -58,6 +58,8 @@ class G4VDivisionParameterisation : public G4VPVParameterisation G4VSolid* motherSolid = 0); virtual ~G4VDivisionParameterisation(); + virtual G4VSolid* ComputeSolid(const G4int, G4VPhysicalVolume *); + virtual void ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const = 0; @@ -84,6 +86,7 @@ class G4VDivisionParameterisation : public G4VPVParameterisation void CheckOffset( G4double maxPar ); void CheckNDivAndWidth( G4double maxPar ); virtual G4double GetMaxParameter() const = 0; + G4double OffsetZ() const; protected: @@ -94,6 +97,8 @@ class G4VDivisionParameterisation : public G4VPVParameterisation G4double foffset; DivisionType fDivisionType; G4VSolid* fmotherSolid; + G4bool fReflectedSolid; + G4bool fDeleteSolid; static G4int verbose; G4int theVoluFirstCopyNo; diff --git a/source/geometry/divisions/include/G4VDivisionParameterisation.icc b/source/geometry/divisions/include/G4VDivisionParameterisation.icc index fee81fe524..4daa3cc216 100644 --- a/source/geometry/divisions/include/G4VDivisionParameterisation.icc +++ b/source/geometry/divisions/include/G4VDivisionParameterisation.icc @@ -21,13 +21,12 @@ // ******************************************************************** // // -// $Id: G4VDivisionParameterisation.icc,v 1.2 2003/11/18 12:15:30 arce Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4VDivisionParameterisation.icc,v 1.3 2004/05/13 14:57:13 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4VDivisionParameterisation Inline Implementation file // -// 26.05.03 - G.Cosmo: Created -// ******************************************************************** +// -------------------------------------------------------------------- inline const G4String& G4VDivisionParameterisation::GetType() const diff --git a/source/geometry/divisions/src/G4PVDivision.cc b/source/geometry/divisions/src/G4PVDivision.cc index 90e80af545..09c1a2fb21 100644 --- a/source/geometry/divisions/src/G4PVDivision.cc +++ b/source/geometry/divisions/src/G4PVDivision.cc @@ -21,17 +21,18 @@ // ******************************************************************** // // -// $Id: G4PVDivision.cc,v 1.10 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PVDivision.cc,v 1.11 2004/05/13 14:57:13 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4PVDivision Implementation file // // 26.05.03 - P.Arce Initial version -// ******************************************************************** +// -------------------------------------------------------------------- #include "G4PVDivision.hh" #include "G4LogicalVolume.hh" #include "G4VSolid.hh" +#include "G4ReflectedSolid.hh" #include "G4ParameterisationBox.hh" #include "G4ParameterisationTubs.hh" #include "G4ParameterisationCons.hh" @@ -257,6 +258,15 @@ void G4PVDivision::SetParameterisation( G4LogicalVolume* motherLogical, G4VSolid* mSolid = motherLogical->GetSolid(); G4String mSolidType = mSolid->GetEntityType(); + // If the solid is a reflected one, update type to its + // real constituent solid. + // + if (mSolidType == "G4ReflectedSolid") + { + mSolidType = ((G4ReflectedSolid*)mSolid)->GetConstituentMovedSolid() + ->GetEntityType(); + } + // Parameterisation type depend of mother solid type and axis of division // if( mSolidType == "G4Box" ) diff --git a/source/geometry/divisions/src/G4PVDivisionFactory.cc b/source/geometry/divisions/src/G4PVDivisionFactory.cc new file mode 100644 index 0000000000..27fd6ce94e --- /dev/null +++ b/source/geometry/divisions/src/G4PVDivisionFactory.cc @@ -0,0 +1,159 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4PVDivisionFactory.cc,v 1.1 2004/05/13 14:56:31 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// class G4PVDivisionFactory Implementation file +// +// Author: Ivana Hrivnacova, 4.5.2004 (Ivana.Hrivnacova@cern.ch) +// -------------------------------------------------------------------- + +#include "G4PVDivisionFactory.hh" +#include "G4PVDivision.hh" +#include "G4VDivisionParameterisation.hh" + +//_____________________________________________________________________________ + +G4PVDivisionFactory::G4PVDivisionFactory() + : G4VPVDivisionFactory() +{ + // Protected singleton constructor. + // --- +} + +//_____________________________________________________________________________ + +G4PVDivisionFactory::~G4PVDivisionFactory() +{ +} + +//_____________________________________________________________________________ + +G4PVDivisionFactory* G4PVDivisionFactory::GetInstance() +{ + static G4PVDivisionFactory theFactory; + if (!fgInstance) + { + fgInstance = &theFactory; + } + return &theFactory; +} + +//_____________________________________________________________________________ + +G4VPhysicalVolume* +G4PVDivisionFactory::CreatePVDivision(const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4int nReplicas, + const G4double width, + const G4double offset ) +{ + // Create division - with number of divisions and width + // --- + + return new G4PVDivision(pName, pLogical, pMotherLogical, + pAxis, nReplicas, width, offset); +} + +//_____________________________________________________________________________ + +G4VPhysicalVolume* +G4PVDivisionFactory::CreatePVDivision(const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4int nReplicas, + const G4double offset ) +{ + // Create division - with number of divisions + // --- + + return new G4PVDivision(pName, pLogical, pMotherLogical, + pAxis, nReplicas, offset); +} + +//_____________________________________________________________________________ + +G4VPhysicalVolume* +G4PVDivisionFactory::CreatePVDivision(const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4double width, + const G4double offset ) +{ + // Create division - with width + // --- + + return new G4PVDivision(pName, pLogical, pMotherLogical, + pAxis, width, offset); +} + +//_____________________________________________________________________________ + +G4VPhysicalVolume* +G4PVDivisionFactory::CreatePVDivision(const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const G4VPVParameterisation* param) +{ + // Create division - with parameterisation + // --- + + // Get parameterisation data + // + const G4VDivisionParameterisation* divParam + = dynamic_cast(param); + + if (!divParam) + { + G4Exception("G4PVDivisionFactory::CreatePVDivision()", + "WrongType", FatalException, + "Unexpected parameterisation type !"); + } + + EAxis axis = divParam->GetAxis(); + G4int nofDivisions = divParam->GetNoDiv(); + G4double width = divParam->GetWidth(); + G4double offset = divParam->GetOffset(); + + return new G4PVDivision(pName, pLogical, pMotherLogical, + axis, nofDivisions, width, offset); +} + +//_____________________________________________________________________________ + +G4bool G4PVDivisionFactory::IsPVDivision(const G4VPhysicalVolume* pv) const +{ + // Returns true if pv is division + // --- + + if (dynamic_cast(pv)) + return true; + else + return false; +} + diff --git a/source/geometry/divisions/src/G4ParameterisationBox.cc b/source/geometry/divisions/src/G4ParameterisationBox.cc index e116949c2f..6aae1ef3f9 100644 --- a/source/geometry/divisions/src/G4ParameterisationBox.cc +++ b/source/geometry/divisions/src/G4ParameterisationBox.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationBox.cc,v 1.5 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationBox.cc,v 1.7 2004/05/17 07:20:40 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationBox Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationBox.hh" @@ -36,26 +37,50 @@ #include "G4Transform3D.hh" #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Box.hh" +//-------------------------------------------------------------------------- +G4VParameterisationBox:: +G4VParameterisationBox( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Box* msol = (G4Box*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Box*)(mConstituentSolid); + fmotherSolid = msol; + fReflectedSolid = true; + } +} + +//-------------------------------------------------------------------------- +G4VParameterisationBox::~G4VParameterisationBox() +{ +} + //-------------------------------------------------------------------------- G4ParameterisationBoxX:: G4ParameterisationBoxX( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationBox( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionBoxX" ); + G4Box* mbox = (G4Box*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Box* mbox = (G4Box*)(msolid); fnDiv = CalculateNDiv( 2*mbox->GetXHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Box* mbox = (G4Box*)(msolid); fwidth = CalculateWidth( 2*mbox->GetXHalfLength(), nDiv, offset ); } #ifdef G4DIVDEBUG @@ -149,19 +174,18 @@ G4ParameterisationBoxY:: G4ParameterisationBoxY( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationBox( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionBoxY" ); + G4Box* mbox = (G4Box*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Box* mbox = (G4Box*)(msolid); fnDiv = CalculateNDiv( 2*mbox->GetYHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Box* mbox = (G4Box*)(msolid); fwidth = CalculateWidth( 2*mbox->GetYHalfLength(), nDiv, offset ); } @@ -254,19 +278,18 @@ G4ParameterisationBoxZ:: G4ParameterisationBoxZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationBox( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionBoxZ" ); + G4Box* mbox = (G4Box*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Box* mbox = (G4Box*)(msolid); fnDiv = CalculateNDiv( 2*mbox->GetZHalfLength(), width, offset ); } else if ( divType == DivNDIV ) { - G4Box* mbox = (G4Box*)(msolid); fwidth = CalculateWidth( 2*mbox->GetZHalfLength(), nDiv, offset ); } #ifdef G4DIVDEBUG @@ -301,7 +324,8 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const //----- translation G4ThreeVector origin(0.,0.,0.); - G4double posi = -mdz + foffset + (copyNo+0.5)*fwidth; + G4double posi = -mdz + OffsetZ() + (copyNo+0.5)*fwidth; + if( faxis == kZAxis ) { origin.setZ( posi ); diff --git a/source/geometry/divisions/src/G4ParameterisationCons.cc b/source/geometry/divisions/src/G4ParameterisationCons.cc index 1d6c168c6f..e0b16e16f1 100644 --- a/source/geometry/divisions/src/G4ParameterisationCons.cc +++ b/source/geometry/divisions/src/G4ParameterisationCons.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationCons.cc,v 1.6 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationCons.cc,v 1.8 2004/05/17 07:20:40 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationCons Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationCons.hh" @@ -36,19 +37,54 @@ #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" #include "G4LogicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Cons.hh" +//-------------------------------------------------------------------------- +G4VParameterisationCons:: +G4VParameterisationCons( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Cons* msol = (G4Cons*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Cons*)(mConstituentSolid); + + // Create a new solid with inversed parameters + G4Cons* newSolid + = new G4Cons(msol->GetName(), + msol->GetInnerRadiusPlusZ(), msol->GetOuterRadiusPlusZ(), + msol->GetInnerRadiusMinusZ(), msol->GetOuterRadiusMinusZ(), + msol->GetZHalfLength(), + msol->GetStartPhiAngle(), msol->GetDeltaPhiAngle()); + msol = newSolid; + fmotherSolid = newSolid; + fReflectedSolid = true; + fDeleteSolid = true; + } +} + +//------------------------------------------------------------------------ +G4VParameterisationCons::~G4VParameterisationCons() +{ +} + //-------------------------------------------------------------------------- G4ParameterisationConsRho:: G4ParameterisationConsRho( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationCons( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionConsRho" ); - G4Cons* msol = (G4Cons*)(msolid); + G4Cons* msol = (G4Cons*)(fmotherSolid); if( msol->GetInnerRadiusPlusZ() == 0. ) { G4cerr << "WARNING - G4ParameterisationConsRho, OuterRadiusMinusZ = 0. " @@ -175,19 +211,18 @@ G4ParameterisationConsPhi:: G4ParameterisationConsPhi( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationCons( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionConsPhi" ); + G4Cons* msol = (G4Cons*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Cons* msol = (G4Cons*)(msolid); fnDiv = CalculateNDiv( msol->GetDeltaPhiAngle(), width, offset ); } else if( divType == DivNDIV ) { - G4Cons* msol = (G4Cons*)(msolid); fwidth = CalculateWidth( msol->GetDeltaPhiAngle(), nDiv, offset ); } @@ -282,19 +317,18 @@ G4ParameterisationConsZ:: G4ParameterisationConsZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationCons( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionConsZ" ); + G4Cons* msol = (G4Cons*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Cons* msol = (G4Cons*)(msolid); fnDiv = CalculateNDiv( 2*msol->GetZHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Cons* msol = (G4Cons*)(msolid); fwidth = CalculateWidth( 2*msol->GetZHalfLength(), nDiv, offset ); } @@ -329,7 +363,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume* physVol ) const { //----- set translation: along Z axis G4Cons* motherCons = (G4Cons*)(GetMotherSolid()); - G4double posi = - motherCons->GetZHalfLength() + foffset + G4double posi = - motherCons->GetZHalfLength() + OffsetZ() + fwidth/2 + copyNo*fwidth; G4ThreeVector origin(0.,0.,posi); physVol->SetTranslation( origin ); @@ -367,8 +401,8 @@ ComputeDimensions( G4Cons& cons, const G4int copyNo, - msol->GetOuterRadiusMinusZ()) / (2*mHalfLength); G4double bROuter = (msol->GetOuterRadiusPlusZ() + msol->GetOuterRadiusMinusZ()) / 2; - G4double xMinusZ = -mHalfLength + foffset + fwidth*copyNo; - G4double xPlusZ = -mHalfLength + foffset + fwidth*(copyNo+1); + G4double xMinusZ = -mHalfLength + OffsetZ() + fwidth*copyNo; + G4double xPlusZ = -mHalfLength + OffsetZ() + fwidth*(copyNo+1); cons.SetInnerRadiusMinusZ( aRInner * xMinusZ + bRInner ); cons.SetOuterRadiusMinusZ( aROuter * xMinusZ + bROuter ); cons.SetInnerRadiusPlusZ( aRInner * xPlusZ + bRInner ); @@ -390,4 +424,5 @@ ComputeDimensions( G4Cons& cons, const G4int copyNo, if( verbose >= 4 ) cons.DumpInfo(); } #endif + } diff --git a/source/geometry/divisions/src/G4ParameterisationPara.cc b/source/geometry/divisions/src/G4ParameterisationPara.cc index 56b4d00cb6..a666af28c8 100644 --- a/source/geometry/divisions/src/G4ParameterisationPara.cc +++ b/source/geometry/divisions/src/G4ParameterisationPara.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPara.cc,v 1.6 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPara.cc,v 1.8 2004/05/17 07:20:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationPara Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationPara.hh" @@ -37,26 +38,64 @@ #include "G4Transform3D.hh" #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Para.hh" +//-------------------------------------------------------------------------- +G4VParameterisationPara:: +G4VParameterisationPara( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Para* msol = (G4Para*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Para*)(mConstituentSolid); + fmotherSolid = msol; + + // Create a new solid with inversed parameters + G4Para* newSolid + = new G4Para(msol->GetName(), + msol->GetXHalfLength(), + msol->GetYHalfLength(), + msol->GetZHalfLength(), + atan(msol->GetTanAlpha()), + M_PI - msol->GetSymAxis().theta(), + msol->GetSymAxis().phi()); + + msol = newSolid; + fmotherSolid = newSolid; + fReflectedSolid = true; + fDeleteSolid = true; + } +} + +//------------------------------------------------------------------------ +G4VParameterisationPara::~G4VParameterisationPara() +{ +} + //------------------------------------------------------------------------ G4ParameterisationParaX:: G4ParameterisationParaX( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionParaX" ); + G4Para* mpara = (G4Para*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Para* mpara = (G4Para*)(msolid); fnDiv = CalculateNDiv( 2*mpara->GetXHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Para* mpara = (G4Para*)(msolid); fwidth = CalculateWidth( 2*mpara->GetXHalfLength(), nDiv, offset ); } @@ -145,19 +184,18 @@ G4ParameterisationParaY:: G4ParameterisationParaY( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionParaY" ); + G4Para* mpara = (G4Para*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Para* mpara = (G4Para*)(msolid); fnDiv = CalculateNDiv( 2*mpara->GetYHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Para* mpara = (G4Para*)(msolid); fwidth = CalculateWidth( 2*mpara->GetYHalfLength(), nDiv, offset ); } @@ -248,19 +286,18 @@ G4ParameterisationParaZ:: G4ParameterisationParaZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPara( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionParaZ" ); + G4Para* mpara = (G4Para*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Para* mpara = (G4Para*)(msolid); fnDiv = CalculateNDiv( 2*mpara->GetZHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Para* mpara = (G4Para*)(msolid); fwidth = CalculateWidth( 2*mpara->GetZHalfLength(), nDiv, offset ); } @@ -296,7 +333,7 @@ ComputeTransformation( const G4int copyNo, G4VPhysicalVolume *physVol ) const G4double mdz = msol->GetZHalfLength( ); //----- translation - G4double posi = -mdz + foffset + (copyNo+0.5)*fwidth; + G4double posi = -mdz + OffsetZ() + (copyNo+0.5)*fwidth; G4ThreeVector symAxis = msol->GetSymAxis(); G4ThreeVector origin( symAxis * posi / symAxis.z() ); diff --git a/source/geometry/divisions/src/G4ParameterisationPolycone.cc b/source/geometry/divisions/src/G4ParameterisationPolycone.cc index 8a6e1cc189..2f01248b31 100644 --- a/source/geometry/divisions/src/G4ParameterisationPolycone.cc +++ b/source/geometry/divisions/src/G4ParameterisationPolycone.cc @@ -21,12 +21,13 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPolycone.cc,v 1.7 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPolycone.cc,v 1.9 2004/05/17 07:20:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationPolycone Implementation file // -// 26.05.03 - P.Arce Initial version +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection //--------------------------------------------------------------------- #include "G4ParameterisationPolycone.hh" @@ -36,18 +37,64 @@ #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" #include "G4LogicalVolume.hh" +#include "G4ReflectedSolid.hh" + +//----------------------------------------------------------------------- +G4VParameterisationPolycone:: +G4VParameterisationPolycone( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Polycone* msol = (G4Polycone*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Polycone*)(mConstituentSolid); + + // Get parameters + G4int nofZplanes = msol->GetOriginalParameters()->Num_z_planes; + G4double* zValues = msol->GetOriginalParameters()->Z_values; + G4double* rminValues = msol->GetOriginalParameters()->Rmin; + G4double* rmaxValues = msol->GetOriginalParameters()->Rmax; + + // Invert z values + G4double* zValuesRefl = new double[nofZplanes]; + for (G4int i=0; iGetName(), + msol->GetStartPhi(), + msol->GetEndPhi() - msol->GetStartPhi(), + nofZplanes, zValuesRefl, rminValues, rmaxValues); + + delete [] zValuesRefl; + + msol = newSolid; + fmotherSolid = newSolid; + fReflectedSolid = true; + fDeleteSolid = true; + } +} + +//--------------------------------------------------------------------- +G4VParameterisationPolycone::~G4VParameterisationPolycone() +{ +} //--------------------------------------------------------------------- G4ParameterisationPolyconeRho:: G4ParameterisationPolyconeRho( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolycone( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionPolyconeRho" ); - G4Polycone* msol = (G4Polycone*)(msolid); + G4Polycone* msol = (G4Polycone*)(fmotherSolid); G4PolyconeHistorical* origparamMother = msol->GetOriginalParameters(); if( divType == DivWIDTH ) @@ -190,12 +237,12 @@ G4ParameterisationPolyconePhi:: G4ParameterisationPolyconePhi( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolycone( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionPolyconePhi" ); - G4Polycone* msol = (G4Polycone*)(msolid); + G4Polycone* msol = (G4Polycone*)(fmotherSolid); G4double deltaPhi = msol->GetEndPhi() - msol->GetStartPhi(); if( divType == DivWIDTH ) @@ -296,12 +343,13 @@ G4ParameterisationPolyconeZ:: G4ParameterisationPolyconeZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolycone( axis, nDiv, width, offset, msolid, divType ) { + CheckParametersValidity(); SetType( "DivisionPolyconeZ" ); - G4Polycone* msol = (G4Polycone*)(msolid); + G4Polycone* msol = (G4Polycone*)(fmotherSolid); G4PolyconeHistorical* origparamMother = msol->GetOriginalParameters(); if( divType == DivWIDTH ) @@ -338,8 +386,8 @@ G4double G4ParameterisationPolyconeZ::GetMaxParameter() const { G4Polycone* msol = (G4Polycone*)(fmotherSolid); G4PolyconeHistorical* origparamMother = msol->GetOriginalParameters(); - return (origparamMother->Z_values[origparamMother->Num_z_planes-1] - -origparamMother->Z_values[0]); + return abs (origparamMother->Z_values[origparamMother->Num_z_planes-1] + -origparamMother->Z_values[0]); } //--------------------------------------------------------------------- diff --git a/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc b/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc index b3bd9b1dda..99bf1c7d9a 100644 --- a/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc +++ b/source/geometry/divisions/src/G4ParameterisationPolyhedra.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationPolyhedra.cc,v 1.6 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationPolyhedra.cc,v 1.8 2004/05/17 07:20:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationPolyhedra Implementation file // -// 14.10.03 - P.Arce Initial version -//--------------------------------------------------------------------- +// 14.10.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationPolyhedra.hh" @@ -36,19 +37,92 @@ #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" #include "G4LogicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Polyhedra.hh" +//-------------------------------------------------------------------------- +G4VParameterisationPolyhedra:: +G4VParameterisationPolyhedra( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Polyhedra* msol = (G4Polyhedra*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Polyhedra*)(mConstituentSolid); + + // Get parameters + G4int nofSides = msol->GetOriginalParameters()->numSide; + G4int nofZplanes = msol->GetOriginalParameters()->Num_z_planes; + G4double* zValues = msol->GetOriginalParameters()->Z_values; + G4double* rminValues = msol->GetOriginalParameters()->Rmin; + G4double* rmaxValues = msol->GetOriginalParameters()->Rmax; + + // Invert z values, + // convert radius parameters + G4double* rminValues2 = new G4double[nofZplanes]; + G4double* rmaxValues2 = new G4double[nofZplanes]; + G4double* zValuesRefl = new G4double[nofZplanes]; + for (G4int i=0; iGetName(), + msol->GetStartPhi(), + msol->GetEndPhi() - msol->GetStartPhi(), + nofSides, + nofZplanes, zValuesRefl, rminValues2, rmaxValues2); + + delete [] rminValues2; + delete [] rmaxValues2; + delete [] zValuesRefl; + + msol = newSolid; + fmotherSolid = newSolid; + fReflectedSolid = true; + fDeleteSolid = true; + } +} + +//------------------------------------------------------------------------ +G4VParameterisationPolyhedra::~G4VParameterisationPolyhedra() +{ +} + +//-------------------------------------------------------------------------- +G4double +G4VParameterisationPolyhedra:: +ConvertRadiusFactor(const G4Polyhedra& phedra) const +{ + G4double phiTotal = phedra.GetEndPhi() - phedra.GetStartPhi(); + G4int nofSides = phedra.GetOriginalParameters()->numSide; + + if ( (phiTotal <=0) || (phiTotal > 2*M_PI+kAngTolerance) ) + phiTotal = 2*M_PI; + + return cos(0.5*phiTotal/nofSides); +} + //-------------------------------------------------------------------------- G4ParameterisationPolyhedraRho:: G4ParameterisationPolyhedraRho( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolyhedra( axis, nDiv, width, offset, msolid, divType ) { + CheckParametersValidity(); SetType( "DivisionPolyhedraRho" ); - G4Polyhedra* msol = (G4Polyhedra*)(msolid); + G4Polyhedra* msol = (G4Polyhedra*)(fmotherSolid); G4PolyhedraHistorical* original_pars = msol->GetOriginalParameters(); if( divType == DivWIDTH ) @@ -190,12 +264,12 @@ G4ParameterisationPolyhedraPhi:: G4ParameterisationPolyhedraPhi( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolyhedra( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionPolyhedraPhi" ); - G4Polyhedra* msol = (G4Polyhedra*)(msolid); + G4Polyhedra* msol = (G4Polyhedra*)(fmotherSolid); G4double deltaPhi = msol->GetEndPhi() - msol->GetStartPhi(); if( divType == DivWIDTH ) @@ -345,12 +419,12 @@ G4ParameterisationPolyhedraZ:: G4ParameterisationPolyhedraZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationPolyhedra( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionPolyhedraZ" ); - G4Polyhedra* msol = (G4Polyhedra*)(msolid); + G4Polyhedra* msol = (G4Polyhedra*)(fmotherSolid); G4PolyhedraHistorical* origparamMother = msol->GetOriginalParameters(); if( divType == DivWIDTH ) @@ -387,8 +461,8 @@ G4double G4ParameterisationPolyhedraZ::GetMaxParameter() const { G4Polyhedra* msol = (G4Polyhedra*)(fmotherSolid); G4PolyhedraHistorical* origparamMother = msol->GetOriginalParameters(); - return (origparamMother->Z_values[origparamMother->Num_z_planes-1] - -origparamMother->Z_values[0]); + return abs (origparamMother->Z_values[origparamMother->Num_z_planes-1] + -origparamMother->Z_values[0]); } //--------------------------------------------------------------------- diff --git a/source/geometry/divisions/src/G4ParameterisationTrd.cc b/source/geometry/divisions/src/G4ParameterisationTrd.cc index 57902a58b9..96671707fe 100644 --- a/source/geometry/divisions/src/G4ParameterisationTrd.cc +++ b/source/geometry/divisions/src/G4ParameterisationTrd.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationTrd.cc,v 1.8 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationTrd.cc,v 1.10 2004/05/17 07:20:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationTrd Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationTrd.hh" @@ -36,29 +37,62 @@ #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" #include "G4LogicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Trd.hh" #include "G4Trap.hh" +//-------------------------------------------------------------------------- +G4VParameterisationTrd:: +G4VParameterisationTrd( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Trd* msol = (G4Trd*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + // Get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Trd*)(mConstituentSolid); + + // Create a new solid with inversed parameters + G4Trd* newSolid + = new G4Trd(msol->GetName(), + msol->GetXHalfLength2(), msol->GetXHalfLength1(), + msol->GetYHalfLength2(), msol->GetYHalfLength1(), + msol->GetZHalfLength()); + msol = newSolid; + fmotherSolid = newSolid; + fReflectedSolid = true; + fDeleteSolid = true; + } +} + +//------------------------------------------------------------------------ +G4VParameterisationTrd::~G4VParameterisationTrd() +{ +} + //------------------------------------------------------------------------ G4ParameterisationTrdX:: G4ParameterisationTrdX( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTrd( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionTrdX" ); + G4Trd* msol = (G4Trd*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fnDiv = CalculateNDiv( 2*mtrd->GetXHalfLength1(), + fnDiv = CalculateNDiv( 2*msol->GetXHalfLength1(), width, offset ); } else if( divType == DivNDIV ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fwidth = CalculateWidth( 2*mtrd->GetXHalfLength1(), nDiv, offset ); + fwidth = CalculateWidth( 2*msol->GetXHalfLength1(), nDiv, offset ); } #ifdef G4DIVDEBUG @@ -175,21 +209,20 @@ G4ParameterisationTrdY:: G4ParameterisationTrdY( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTrd( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionTrdY" ); + G4Trd* msol = (G4Trd*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fnDiv = CalculateNDiv( 2*mtrd->GetYHalfLength1(), + fnDiv = CalculateNDiv( 2*msol->GetYHalfLength1(), width, offset ); } else if( divType == DivNDIV ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fwidth = CalculateWidth( 2*mtrd->GetYHalfLength1(), + fwidth = CalculateWidth( 2*msol->GetYHalfLength1(), nDiv, offset ); } @@ -304,21 +337,20 @@ G4ParameterisationTrdZ:: G4ParameterisationTrdZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTrd( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivTrdZ" ); + G4Trd* msol = (G4Trd*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fnDiv = CalculateNDiv( 2*mtrd->GetZHalfLength(), + fnDiv = CalculateNDiv( 2*msol->GetZHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Trd* mtrd = (G4Trd*)(msolid); - fwidth = CalculateWidth( 2*mtrd->GetZHalfLength(), + fwidth = CalculateWidth( 2*msol->GetZHalfLength(), nDiv, offset ); } @@ -355,7 +387,7 @@ ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const //----- translation G4ThreeVector origin(0.,0.,0.); - G4double posi = -mdz + foffset + (copyNo+0.5)*fwidth; + G4double posi = -mdz + OffsetZ() + (copyNo+0.5)*fwidth; if( faxis == kZAxis ) { origin.setZ( posi ); @@ -397,10 +429,10 @@ ComputeDimensions(G4Trd& trd, const G4int copyNo, G4double pDz = fwidth/2.; G4double zLength = 2*msol->GetZHalfLength(); - trd.SetAllParameters ( pDx1+DDx*(foffset+copyNo*fwidth)/zLength, - pDx1+DDx*(foffset+(copyNo+1)*fwidth)/zLength, - pDy1+DDy*(foffset+copyNo*fwidth)/zLength, - pDy1+DDy*(foffset+(copyNo+1)*fwidth)/zLength, pDz ); + trd.SetAllParameters( pDx1+DDx*(OffsetZ()+copyNo*fwidth)/zLength, + pDx1+DDx*(OffsetZ()+(copyNo+1)*fwidth)/zLength, + pDy1+DDy*(OffsetZ()+copyNo*fwidth)/zLength, + pDy1+DDy*(OffsetZ()+(copyNo+1)*fwidth)/zLength, pDz ); #ifdef G4DIVDEBUG if( verbose >= 1 ) diff --git a/source/geometry/divisions/src/G4ParameterisationTubs.cc b/source/geometry/divisions/src/G4ParameterisationTubs.cc index aa5c9f6268..a86599e6c1 100644 --- a/source/geometry/divisions/src/G4ParameterisationTubs.cc +++ b/source/geometry/divisions/src/G4ParameterisationTubs.cc @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4ParameterisationTubs.cc,v 1.5 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParameterisationTubs.cc,v 1.7 2004/05/17 07:20:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4ParameterisationTubs Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4ParameterisationTubs.hh" @@ -36,27 +37,51 @@ #include "G4RotationMatrix.hh" #include "G4VPhysicalVolume.hh" #include "G4LogicalVolume.hh" +#include "G4ReflectedSolid.hh" #include "G4Tubs.hh" +//-------------------------------------------------------------------------- +G4VParameterisationTubs:: +G4VParameterisationTubs( EAxis axis, G4int nDiv, G4double width, + G4double offset, G4VSolid* msolid, + DivisionType divType ) + : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) +{ + G4Tubs* msol = (G4Tubs*)(msolid); + if (msolid->GetEntityType() == "G4ReflectedSolid") + { + //----- get constituent solid + G4VSolid* mConstituentSolid + = ((G4ReflectedSolid*)msolid)->GetConstituentMovedSolid(); + msol = (G4Tubs*)(mConstituentSolid); + fmotherSolid = msol; + fReflectedSolid = true; + } +} + +//------------------------------------------------------------------------ +G4VParameterisationTubs::~G4VParameterisationTubs() +{ +} + //-------------------------------------------------------------------------- G4ParameterisationTubsRho:: G4ParameterisationTubsRho( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionTubsRho" ); + G4Tubs* msol = (G4Tubs*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Tubs* msol = (G4Tubs*)(msolid); fnDiv = CalculateNDiv( msol->GetOuterRadius() - msol->GetInnerRadius(), width, offset ); } else if( divType == DivNDIV ) { - G4Tubs* msol = (G4Tubs*)(msolid); fwidth = CalculateWidth( msol->GetOuterRadius() - msol->GetInnerRadius(), nDiv, offset ); } @@ -155,19 +180,18 @@ G4ParameterisationTubsPhi:: G4ParameterisationTubsPhi( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionTubsPhi" ); + G4Tubs* msol = (G4Tubs*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Tubs* msol = (G4Tubs*)(msolid); fnDiv = CalculateNDiv( msol->GetDeltaPhiAngle(), width, offset ); } else if( divType == DivNDIV ) { - G4Tubs* msol = (G4Tubs*)(msolid); fwidth = CalculateWidth( msol->GetDeltaPhiAngle(), nDiv, offset ); } @@ -265,18 +289,18 @@ G4ParameterisationTubsZ:: G4ParameterisationTubsZ( EAxis axis, G4int nDiv, G4double width, G4double offset, G4VSolid* msolid, DivisionType divType ) - : G4VDivisionParameterisation( axis, nDiv, width, offset, divType, msolid ) + : G4VParameterisationTubs( axis, nDiv, width, offset, msolid, divType ) { CheckParametersValidity(); SetType( "DivisionTubsZ" ); + + G4Tubs* msol = (G4Tubs*)(fmotherSolid); if( divType == DivWIDTH ) { - G4Tubs* msol = (G4Tubs*)(msolid); fnDiv = CalculateNDiv( 2*msol->GetZHalfLength(), width, offset ); } else if( divType == DivNDIV ) { - G4Tubs* msol = (G4Tubs*)(msolid); fwidth = CalculateWidth( 2*msol->GetZHalfLength(), nDiv, offset ); } @@ -310,7 +334,7 @@ ComputeTransformation(const G4int copyNo, G4VPhysicalVolume *physVol) const { //----- set translation: along Z axis G4Tubs* motherTubs = (G4Tubs*)(fmotherSolid); - G4double posi = - motherTubs->GetZHalfLength() + foffset + G4double posi = - motherTubs->GetZHalfLength() + OffsetZ() + fwidth/2 + copyNo*fwidth; G4ThreeVector origin(0.,0.,posi); physVol->SetTranslation( origin ); diff --git a/source/geometry/divisions/src/G4VDivisionParameterisation.cc b/source/geometry/divisions/src/G4VDivisionParameterisation.cc index 9ba45c41a4..a069803da7 100644 --- a/source/geometry/divisions/src/G4VDivisionParameterisation.cc +++ b/source/geometry/divisions/src/G4VDivisionParameterisation.cc @@ -21,18 +21,20 @@ // ******************************************************************** // // -// $Id: G4VDivisionParameterisation.cc,v 1.8 2003/11/19 11:51:23 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4VDivisionParameterisation.cc,v 1.10 2004/05/17 07:20:42 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4VDivisionParameterisation Implementation file // -// 26.05.03 - P.Arce Initial version -// ******************************************************************** +// 26.05.03 - P.Arce, Initial version +// 08.04.04 - I.Hrivnacova, Implemented reflection +// -------------------------------------------------------------------- #include "G4VDivisionParameterisation.hh" #include "G4VSolid.hh" #include "G4VPhysicalVolume.hh" #include "G4RotationMatrix.hh" +#include "G4ReflectedSolid.hh" G4int G4VDivisionParameterisation::verbose = 5; @@ -41,8 +43,9 @@ G4VDivisionParameterisation:: G4VDivisionParameterisation( EAxis axis, G4int nDiv, G4double step, G4double offset, DivisionType divType, G4VSolid* motherSolid ) - : faxis(axis), fnDiv( nDiv), fwidth(step), - foffset(offset), fDivisionType(divType), fmotherSolid( motherSolid ) + : faxis(axis), fnDiv( nDiv), fwidth(step), foffset(offset), + fDivisionType(divType), fmotherSolid( motherSolid ), fReflectedSolid(false), + fDeleteSolid(false) { #ifdef G4DIVDEBUG if (verbose >= 1) @@ -60,8 +63,22 @@ G4VDivisionParameterisation( EAxis axis, G4int nDiv, //-------------------------------------------------------------------------- G4VDivisionParameterisation::~G4VDivisionParameterisation() { + if (fDeleteSolid) delete fmotherSolid; } +//-------------------------------------------------------------------------- +G4VSolid* +G4VDivisionParameterisation:: +ComputeSolid( const G4int i, G4VPhysicalVolume* pv ) +{ + G4VSolid* solid = G4VPVParameterisation::ComputeSolid(i, pv); + if (solid->GetEntityType() == "G4ReflectedSolid") + { + solid = ((G4ReflectedSolid*)solid)->GetConstituentMovedSolid(); + } + return solid; +} + //-------------------------------------------------------------------------- void G4VDivisionParameterisation:: @@ -149,3 +166,15 @@ void G4VDivisionParameterisation::CheckNDivAndWidth( G4double maxPar ) "Not supported configuration."); } } + +//-------------------------------------------------------------------------- +G4double G4VDivisionParameterisation::OffsetZ() const +{ + // take into account reflection in the offset + G4double offset = foffset; + if (fReflectedSolid) offset = GetMaxParameter() - fwidth*fnDiv - foffset; + + return offset; +} + + diff --git a/source/geometry/management/GNUmakefile b/source/geometry/management/GNUmakefile index 416a6455fd..2146970de7 100644 --- a/source/geometry/management/GNUmakefile +++ b/source/geometry/management/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2002/01/10 15:56:30 gcosmo Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/11 14:17:14 gcosmo Exp $ # ----------------------------------------------------------------------- # GNUmakefile for geometry/management library. Gabriele Cosmo, 16/11/96. # ----------------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4GEOM_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/graphics_reps/include \ -I$(G4BASE)/intercoms/include \ -I$(G4BASE)/global/management/include \ diff --git a/source/geometry/management/History b/source/geometry/management/History index 6638c98b8c..753ad688c9 100644 --- a/source/geometry/management/History +++ b/source/geometry/management/History @@ -1,4 +1,4 @@ -$Id: History,v 1.66 2003/12/01 14:54:14 gcosmo Exp $ +$Id: History,v 1.67 2004/05/13 14:54:15 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,13 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +May 07, 2004 G.Cosmo geommng-V06-01-00 +- Imported G4ReflectedSolid class from solids/Boolean. +- Added abstract factory G4VPVDivisionFactory defining interfaces + for the creation of volumes divisions (courtesy of I.Hrivnacova). +- Coworks with tags: geomvol-V06-01-00, geomdiv-V06-01-00 and + geom-bool-V06-01-00. + Dec 01, 2003 P.Gumplinger geommng-V05-02-05 - G4LogicalSurface[.hh.icc]: modified to use G4SurfaceProperty instead of G4OpticalSurface. Requires tag "materials-V05-02-00". diff --git a/source/geometry/solids/Boolean/include/G4ReflectedSolid.hh b/source/geometry/management/include/G4ReflectedSolid.hh similarity index 98% rename from source/geometry/solids/Boolean/include/G4ReflectedSolid.hh rename to source/geometry/management/include/G4ReflectedSolid.hh index 343c79da4a..5d305fc174 100644 --- a/source/geometry/solids/Boolean/include/G4ReflectedSolid.hh +++ b/source/geometry/management/include/G4ReflectedSolid.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ReflectedSolid.hh,v 1.8 2003/11/03 17:48:45 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ReflectedSolid.hh,v 1.1 2004/05/13 14:49:23 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // class G4ReflectedSolid @@ -36,7 +36,6 @@ // // 23.07.01 V.Grichine: created // 15.02.02 V.Grichine: get/set methods for fPtr(Direct)Transform3D -// // -------------------------------------------------------------------- #ifndef G4ReflectedSolid_HH #define G4ReflectedSolid_HH diff --git a/source/geometry/management/include/G4VPVDivisionFactory.hh b/source/geometry/management/include/G4VPVDivisionFactory.hh new file mode 100644 index 0000000000..5779a8c51b --- /dev/null +++ b/source/geometry/management/include/G4VPVDivisionFactory.hh @@ -0,0 +1,102 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4VPVDivisionFactory.hh,v 1.1 2004/05/13 14:53:59 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// class G4VPVDivisionFactory +// +// Class description: +// +// Abstract factory that defines interfaces for creating +// volumes divisions. + +// Author: Ivana Hrivnacova, 4.5.2004 (Ivana.Hrivnacova@cern.ch) +// ------------------------------------------------------------------------ +#ifndef G4VPVDIVISION_FACTORY_HH +#define G4VPVDIVISION_FACTORY_HH + +#include "geomdefs.hh" + +class G4LogicalVolume; +class G4VPhysicalVolume; +class G4VPVParameterisation; + +class G4VPVDivisionFactory +{ + public: // with description + + virtual ~G4VPVDivisionFactory(); + + static G4VPVDivisionFactory* Instance(); + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMother, + const EAxis pAxis, + const G4int nReplicas, + const G4double width, + const G4double offset ) = 0; + // Create division - with number of divisions and width. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4int nReplicas, + const G4double offset ) = 0; + // Create division - with number of divisions. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const EAxis pAxis, + const G4double width, + const G4double offset ) = 0; + // Create division - with width. + + virtual G4VPhysicalVolume* CreatePVDivision( + const G4String& pName, + G4LogicalVolume* pLogical, + G4LogicalVolume* pMotherLogical, + const G4VPVParameterisation* param) = 0; + // Create division - with parameterisation. + + virtual G4bool IsPVDivision(const G4VPhysicalVolume* pv) const = 0; + // Returns true if pv is division. + + protected: + + G4VPVDivisionFactory(); + + protected: + + static G4VPVDivisionFactory* fgInstance; + +}; + +#endif diff --git a/source/geometry/solids/Boolean/src/G4ReflectedSolid.cc b/source/geometry/management/src/G4ReflectedSolid.cc similarity index 99% rename from source/geometry/solids/Boolean/src/G4ReflectedSolid.cc rename to source/geometry/management/src/G4ReflectedSolid.cc index df55fdfa26..b19affc832 100644 --- a/source/geometry/solids/Boolean/src/G4ReflectedSolid.cc +++ b/source/geometry/management/src/G4ReflectedSolid.cc @@ -21,9 +21,9 @@ // ******************************************************************** // // -// $Id: G4ReflectedSolid.cc,v 1.14 2003/12/01 09:32:05 gcosmo Exp $ +// $Id: G4ReflectedSolid.cc,v 1.1 2004/05/13 14:49:42 gcosmo Exp $ // -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// GEANT4 tag $Name: geant4-06-02 $ // // Implementation for G4ReflectedSolid class for boolean // operations between other solids diff --git a/source/geometry/management/src/G4VPVDivisionFactory.cc b/source/geometry/management/src/G4VPVDivisionFactory.cc new file mode 100644 index 0000000000..0f797e9f5f --- /dev/null +++ b/source/geometry/management/src/G4VPVDivisionFactory.cc @@ -0,0 +1,59 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4VPVDivisionFactory.cc,v 1.1 2004/05/13 14:53:59 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// class G4VPVDivisionFactory Implementation file +// +// Author: Ivana Hrivnacova, 4.5.2004 (Ivana.Hrivnacova@cern.ch) +// ------------------------------------------------------------------------ + +#include "G4VPVDivisionFactory.hh" + +G4VPVDivisionFactory* G4VPVDivisionFactory::fgInstance = 0; + +//_____________________________________________________________________________ + +G4VPVDivisionFactory* G4VPVDivisionFactory::Instance() +{ + // Static singleton access method. + // --- + return fgInstance; +} + + +//_____________________________________________________________________________ + +G4VPVDivisionFactory::G4VPVDivisionFactory() +{ + // Protected singleton constructor. + // --- + // fgInstance = this; +} + +//_____________________________________________________________________________ + +G4VPVDivisionFactory::~G4VPVDivisionFactory() +{ +} diff --git a/source/geometry/navigation/GNUmakefile b/source/geometry/navigation/GNUmakefile index 6baf81ab1f..2610e5fdfc 100644 --- a/source/geometry/navigation/GNUmakefile +++ b/source/geometry/navigation/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 2003/10/01 14:51:38 gcosmo Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:17:15 gcosmo Exp $ # -------------------------------------------------------------------- # GNUmakefile for geometry/volumes library. Gabriele Cosmo, 16/11/96. # -------------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4GEOM_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/graphics_reps/include \ -I$(G4BASE)/intercoms/include \ -I$(G4BASE)/global/management/include \ diff --git a/source/geometry/navigation/History b/source/geometry/navigation/History index 63865217e4..28712163b5 100644 --- a/source/geometry/navigation/History +++ b/source/geometry/navigation/History @@ -1,4 +1,4 @@ -$Id: History,v 1.22 2004/03/11 13:17:42 gcosmo Exp $ +$Id: History,v 1.28 2004/06/18 12:45:10 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,29 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 18th, 2004 - G.Cosmo (geomnav-V06-01-03) +------------------------ +- Enhanced check for null step in G4Navigator::ComputeStep(). + Now attempting a corrective action after 10 consecutive zero steps. + Event gets aborted after 25 zero steps. + +Jun 15th, 2004 - G.Cosmo (geomnav-V06-01-02) +------------------------ +- Relax exception in G4Navigator::ComputeStep() for stuck tracks. + Event gets aborted after 25 zero steps. + +Jun 11th, 2004 - G.Cosmo (geomnav-V06-01-01) +------------------------ +- Added check to G4Navigator to count the number of steps with zero length + and issue an exception for tracks that get stuck in a loop (J.Apostolakis). +- Modified GNUmakefile to define G4GEOMETRY_ALLOC_EXPORT flag for DLLs + build on Windows. + +May 17th, 2004 - G.Cosmo (geomnav-V06-01-00) +------------------------ +- Added more verbosity on solids response for navigators (optimised/not + optimised) if "check_mode" state is combined with verbose level-1. + Mar 11th, 2004 - G.Cosmo (geomnav-V06-00-02) ------------------------ - Added "check_mode" state for navigators. The state can be activated by diff --git a/source/geometry/navigation/include/G4Navigator.hh b/source/geometry/navigation/include/G4Navigator.hh index d0d2ea8c9d..e3c62caebf 100644 --- a/source/geometry/navigation/include/G4Navigator.hh +++ b/source/geometry/navigation/include/G4Navigator.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Navigator.hh,v 1.5 2004/03/10 18:21:15 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4Navigator.hh,v 1.8 2004/06/18 12:47:02 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // class G4Navigator @@ -355,22 +355,32 @@ class G4Navigator G4ThreeVector fGrandMotherExitNormal; // Leaving volume normal, in its // own coordinate system G4NavigationHistory fHistory; - // Transformation & `path' history - // of current path through geomtrical - // hierarchy + // Transformation & `path' history of current path + // through geomtrical hierarchy - G4bool fLastStepWasZero; - // Whether the last ComputeStep moved Zero - // Used to check for edges. - G4bool fLocatedOnEdge; - // Whether the Navigator has detected an edge + // Count zero steps - as one or two can occur due to changing momentum at + // a boundary or at an edge common between volumes + // - several are likely a problem in the geometry + // description or in the navigation + // + G4bool fLastStepWasZero; + // Whether the last ComputeStep moved Zero. Used to check for edges. + + G4bool fLocatedOnEdge; + // Whether the Navigator has detected an edge + G4int fNumberZeroSteps; + // Number of preceding moves that were Zero. Reset to 0 after finite step + G4int fActionThreshold_NoZeroSteps; + // After this many failed/zero steps, act (push etc) + G4int fAbandonThreshold_NoZeroSteps; + // After this many failed/zero steps, abandon track G4ThreeVector fPreviousSftOrigin; G4double fPreviousSafety; - // Memory of last safety origin & value. - // Used in ComputeStep to ensure that - // origin of current Step is in the same - // volume as the point of the last relocation. + // Memory of last safety origin & value. Used in ComputeStep to ensure + // that origin of current Step is in the same volume as the point of the + // last relocation + // // END State information // @@ -393,6 +403,8 @@ class G4Navigator G4bool fCheck; // Check-mode flag [if true, more strict checks are performed]. + G4bool fPushed; + // Push flag [if true, means a stuck particle has been pushed]. G4int fVerbose; // Verbose(ness) level [if > 0, printout can occur]. diff --git a/source/geometry/navigation/src/G4Navigator.cc b/source/geometry/navigation/src/G4Navigator.cc index d870dbed49..3a39205e44 100644 --- a/source/geometry/navigation/src/G4Navigator.cc +++ b/source/geometry/navigation/src/G4Navigator.cc @@ -21,7 +21,7 @@ // ******************************************************************** // // -// $Id: G4Navigator.cc,v 1.8 2004/03/11 13:09:29 gcosmo Exp $ +// $Id: G4Navigator.cc,v 1.13 2004/06/18 12:47:05 gcosmo Exp $ // GEANT4 tag $ Name: $ // // class G4Navigator Implementation @@ -42,9 +42,12 @@ // G4Navigator::G4Navigator() : fWasLimitedByGeometry(false), fTopPhysical(0), - fCheck(false), fVerbose(0) + fCheck(false), fPushed(false), fVerbose(0) { ResetStackAndState(); + + fActionThreshold_NoZeroSteps = 10; + fAbandonThreshold_NoZeroSteps = 25; } // ******************************************************************** @@ -230,6 +233,20 @@ G4Navigator::LocateGlobalPointAndSetup( const G4ThreeVector& globalPoint, targetSolid = fHistory.GetTopVolume()->GetLogicalVolume()->GetSolid(); localPoint = fHistory.GetTopTransform().TransformPoint(globalPoint); insideCode = targetSolid->Inside(localPoint); +#ifdef G4VERBOSE + if(( fVerbose == 1 ) && ( fCheck )) + { + G4String solidResponse = "-kInside-"; + if (insideCode == kOutside) + solidResponse = "-kOutside-"; + else if (insideCode == kSurface) + solidResponse = "-kSurface-"; + G4cout << "*** G4Navigator::LocateGlobalPointAndSetup(): ***" << G4endl + << " Invoked Inside() for solid: " << targetSolid->GetName() + << ". Solid replied: " << solidResponse << G4endl + << " For local point p: " << localPoint << G4endl; + } +#endif } else { @@ -464,8 +481,9 @@ G4Navigator::LocateGlobalPointWithinVolume(const G4ThreeVector& pGlobalpoint) break; case kReplica: - G4Exception("G4Navigator::LocateGlobalPointWithinVolume()", "NotApplicable", - FatalException, "Not applicable for replicated volumes."); + G4Exception("G4Navigator::LocateGlobalPointWithinVolume()", + "NotApplicable", FatalException, + "Not applicable for replicated volumes."); break; } } @@ -550,6 +568,9 @@ G4double G4Navigator::ComputeStep( const G4ThreeVector &pGlobalpoint, G4VPhysicalVolume *motherPhysical = fHistory.GetTopVolume(); G4LogicalVolume *motherLogical = motherPhysical->GetLogicalVolume(); + static G4int sNavCScalls=0; + sNavCScalls++; + #ifdef G4VERBOSE G4int oldcoutPrec= G4cout.precision(8); G4int oldcerrPrec= G4cerr.precision(10); @@ -759,11 +780,73 @@ G4double G4Navigator::ComputeStep( const G4ThreeVector &pGlobalpoint, fPreviousSftOrigin = pGlobalpoint; fPreviousSafety = pNewSafety; - // Edge if two consecutive steps are zero, because - // at least two candidate volumes must have been checked + // Count zero steps - one can occur due to changing momentum at a boundary + // - one, two (or a few) can occur at common edges between + // volumes + // - more than two is likely a problem in the geometry + // description or the Navigation + + // Rule of thumb: likely at an Edge if two consecutive steps are zero, + // because at least two candidate volumes must have been + // checked // - fLocatedOnEdge = fLastStepWasZero && (Step==0); - fLastStepWasZero = (Step==0); + fLocatedOnEdge = fLastStepWasZero && (Step==0.0); + fLastStepWasZero = (Step==0.0); + if (fPushed) fPushed = fLastStepWasZero; + + // Handle large number of consecutive zero steps + // + if ( fLastStepWasZero ) + { + fNumberZeroSteps++; +#ifdef G4DEBUG_NAVIGATION + if( fNumberZeroSteps > 1 ) + { + G4cout << "G4Nav - CompStep: another zero step, # " << fNumberZeroSteps + << " at " << pGlobalpoint + << " in volume " << motherPhysical->GetName() + << " nav-comp-step calls # " << sNavCScalls + << G4endl; + } +#endif + if( (fNumberZeroSteps > fActionThreshold_NoZeroSteps-1) && (!fPushed) ) + { + // Act to recover this stuck track. Pushing it once along direction + // + Step += 0.9*kCarTolerance; + fPushed = true; +#ifdef G4VERBOSE + G4cerr << "WARNING - G4Navigator::ComputeStep()" << G4endl + << " Track stuck, not moving for " + << fNumberZeroSteps << " steps" << G4endl + << " in volume -" << motherPhysical->GetName() + << "- at point " << pGlobalpoint << G4endl + << " direction: " << pDirection << "." << G4endl + << " Potential geometry or navigation problem !" + << G4endl + << " Trying pushing it of " << Step << " mm ..." + << G4endl; +#endif + } + if( fNumberZeroSteps > fAbandonThreshold_NoZeroSteps-1 ) + { + // Must kill this stuck track + // + G4cerr << "ERROR - G4Navigator::ComputeStep()" << G4endl + << " Track stuck, not moving for " + << fNumberZeroSteps << " steps" << G4endl + << " in volume -" << motherPhysical->GetName() + << "- at point " << pGlobalpoint << G4endl + << " direction: " << pDirection << "." << G4endl; + G4Exception("G4Navigator::ComputeStep()", + "StuckTrack", EventMustBeAborted, + "Stuck Track: potential geometry or navigation problem."); + } + } + else + { + if (!fPushed) fNumberZeroSteps = 0; + } fEnteredDaughter = fEntering; // I expect to enter a volume in this Step fExitedMother = fExiting; @@ -857,22 +940,25 @@ G4double G4Navigator::ComputeStep( const G4ThreeVector &pGlobalpoint, // void G4Navigator::ResetState() { - fWasLimitedByGeometry=false; - fEntering=false; - fExiting=false; - fLocatedOnEdge = false; - fLastStepWasZero= false; - fEnteredDaughter = false; - fExitedMother = false; - - fValidExitNormal = false; - fExitNormal = G4ThreeVector(0,0,0); + fWasLimitedByGeometry = false; + fEntering = false; + fExiting = false; + fLocatedOnEdge = false; + fLastStepWasZero = false; + fEnteredDaughter = false; + fExitedMother = false; + fPushed = false; - fPreviousSftOrigin = G4ThreeVector(0,0,0); - fPreviousSafety = 0.0; + fValidExitNormal = false; + fExitNormal = G4ThreeVector(0,0,0); + + fPreviousSftOrigin = G4ThreeVector(0,0,0); + fPreviousSafety = 0.0; + + fNumberZeroSteps = 0; - fBlockedPhysicalVolume=0; - fBlockedReplicaNo=-1; + fBlockedPhysicalVolume = 0; + fBlockedReplicaNo = -1; } // ******************************************************************** diff --git a/source/geometry/navigation/src/G4NormalNavigation.cc b/source/geometry/navigation/src/G4NormalNavigation.cc index 396a2329a3..56e4af69f6 100644 --- a/source/geometry/navigation/src/G4NormalNavigation.cc +++ b/source/geometry/navigation/src/G4NormalNavigation.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4NormalNavigation.cc,v 1.3 2004/03/10 18:21:20 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4NormalNavigation.cc,v 1.4 2004/05/17 13:30:26 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // class G4NormalNavigation Implementation @@ -86,6 +86,15 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, #ifdef G4VERBOSE if ( fCheck ) { + if( fVerbose == 1 ) + { + G4cout << "*** G4NormalNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToOut(p) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherSafety << G4endl + << " For local point p: " << localPoint << G4endl + << " To be considered as 'mother safety'." << G4endl; + } if ( motherSafety < 0.0 ) { G4cerr << "ERROR - G4NormalNavigation::ComputeStep()" << G4endl @@ -160,6 +169,18 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, sampleDirection = sampleTf.TransformAxis(localDirection); const G4double sampleStep = sampleSolid->DistanceToIn(samplePoint,sampleDirection); +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4NormalNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToIn(p,v) for daughter solid: " + << sampleSolid->GetName() + << ". Solid replied: " << sampleStep << G4endl + << " For local point p: " << samplePoint << G4endl + << " Direction v: " << sampleDirection + << ", to be considered as 'daughter step'." << G4endl; + } +#endif if ( sampleStep<=ourStep ) { ourStep = sampleStep; @@ -177,6 +198,20 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, G4ThreeVector intersectionPoint; intersectionPoint= samplePoint + sampleStep * sampleDirection; EInside insideIntPt= sampleSolid->Inside(intersectionPoint); + G4String solidResponse = "-kInside-"; + if (insideIntPt == kOutside) + solidResponse = "-kOutside-"; + else if (insideIntPt == kSurface) + solidResponse = "-kSurface-"; + if( fVerbose == 1 ) + { + G4cout << "*** G4NormalNavigation::ComputeStep(): ***" << G4endl + << " Invoked Inside() for solid: " + << sampleSolid->GetName() + << ". Solid replied: " << solidResponse << G4endl + << " For point p: " << intersectionPoint + << ", considered as 'intersection' point." << G4endl; + } if ( insideIntPt != kSurface ) { G4int oldcoutPrec = G4cout.precision(16); @@ -184,14 +219,8 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, << " Inaccurate DistanceToIn for solid " << sampleSolid->GetName() << G4endl; G4cout << " Solid gave DistanceToIn = " << sampleStep - << " yet returns " ; - if ( insideIntPt == kInside ) - G4cout << "-kInside-"; - else if ( insideIntPt == kOutside ) - G4cout << "-kOutside-"; - else - G4cout << "-kSurface-"; - G4cout << " for this point !" << G4endl; + << " yet returns " << solidResponse + << " for this point !" << G4endl; G4cout << " Point = " << intersectionPoint << G4endl; if ( insideIntPt != kInside ) G4cout << " DistanceToIn(p) = " @@ -233,7 +262,18 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, &validExitNormal, &exitNormal); #ifdef G4VERBOSE - if ( fCheck ) + if ( fCheck ) + { + if( fVerbose == 1 ) + { + G4cout << "*** G4NormalNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToOut(p,v,...) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherStep << G4endl + << " For local point p: " << localPoint << G4endl + << " Direction v: " << localDirection + << ", to be considered as 'mother step'." << G4endl; + } if( ( motherStep < 0.0 ) || ( motherStep >= kInfinity) ) { G4cerr << "ERROR - G4NormalNavigation::ComputeStep()" << G4endl @@ -246,6 +286,7 @@ G4NormalNavigation::ComputeStep(const G4ThreeVector &localPoint, "PointDistOutInvalid", FatalException, "Current point is outside the current solid !"); } + } #endif if ( motherStep<=ourStep ) @@ -295,6 +336,18 @@ G4double G4NormalNavigation::ComputeSafety(const G4ThreeVector &localPoint, motherSafety = motherSolid->DistanceToOut(localPoint); ourSafety = motherSafety; // Working isotropic safety +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4NormalNavigation::ComputeSafety(): ***" << G4endl + << " Invoked DistanceToOut(p) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherSafety << G4endl + << " For local point p: " << localPoint + << ", to be considered as 'mother safety'." << G4endl; + } +#endif + // Compute daughter safeties // localNoDaughters = motherLogical->GetNoDaughters(); @@ -314,6 +367,17 @@ G4double G4NormalNavigation::ComputeSafety(const G4ThreeVector &localPoint, { ourSafety = sampleSafety; } +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4NormalNavigation::ComputeSafety(): ***" << G4endl + << " Invoked DistanceToIn(p) for daughter solid: " + << sampleSolid->GetName() + << ". Solid replied: " << sampleSafety << G4endl + << " For local point p: " << samplePoint + << ", to be considered as 'daughter safety'." << G4endl; + } +#endif } return ourSafety; } diff --git a/source/geometry/navigation/src/G4VoxelNavigation.cc b/source/geometry/navigation/src/G4VoxelNavigation.cc index acb7d659cc..a7b9599021 100644 --- a/source/geometry/navigation/src/G4VoxelNavigation.cc +++ b/source/geometry/navigation/src/G4VoxelNavigation.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4VoxelNavigation.cc,v 1.3 2004/03/10 18:21:20 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4VoxelNavigation.cc,v 1.4 2004/05/17 13:30:26 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // class G4VoxelNavigation Implementation @@ -104,6 +104,15 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, #ifdef G4VERBOSE if ( fCheck ) { + if(fVerbose == 1 ) + { + G4cout << "*** G4VoxelNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToOut(p) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherSafety << G4endl + << " For local point p: " << localPoint + << ", to be considered as 'mother safety'." << G4endl; + } if( motherSafety < 0.0 ) { G4cout << "ERROR - G4VoxelNavigation::ComputeStep()" << G4endl @@ -184,6 +193,17 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, samplePhysical->GetLogicalVolume()->GetSolid(); const G4double sampleSafety = sampleSolid->DistanceToIn(samplePoint); +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4VoxelNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToIn(p) for daughter solid: " + << sampleSolid->GetName() + << ". Solid replied: " << sampleSafety << G4endl + << " For local point p: " << samplePoint + << ", to be considered as 'daughter safety'." << G4endl; + } +#endif if ( sampleSafetyDistanceToIn(samplePoint, sampleDirection); +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4VoxelNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToIn(p,v) for daughter solid: " + << sampleSolid->GetName() + << ". Solid replied: " << sampleStep << G4endl + << " For local point p: " << samplePoint << G4endl + << " Direction v: " << sampleDirection + << ", to be considered as 'daughter step'." << G4endl; + } +#endif if ( sampleStep<=ourStep ) { ourStep = sampleStep; @@ -210,6 +242,20 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, G4ThreeVector intersectionPoint; intersectionPoint= samplePoint + sampleStep * sampleDirection; EInside insideIntPt= sampleSolid->Inside(intersectionPoint); + G4String solidResponse = "-kInside-"; + if (insideIntPt == kOutside) + solidResponse = "-kOutside-"; + else if (insideIntPt == kSurface) + solidResponse = "-kSurface-"; + if( fVerbose == 1 ) + { + G4cout << "*** G4VoxelNavigation::ComputeStep(): ***"<GetName() + << ". Solid replied: " << solidResponse << G4endl + << " For point p: " << intersectionPoint + << ", considered as 'intersection' point." << G4endl; + } if( insideIntPt != kSurface ) { G4int oldcoutPrec = G4cout.precision(16); @@ -218,14 +264,8 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, << " Inaccurate solid DistanceToIn" << " for solid " << sampleSolid->GetName() << G4endl; G4cout << " Solid gave DistanceToIn = " - << sampleStep << " yet returns " ; - if( insideIntPt == kInside ) - G4cout << "-kInside-"; - else if( insideIntPt == kOutside ) - G4cout << "-kOutside-"; - else - G4cout << "-kSurface-"; - G4cout << " for this point !" << G4endl; + << sampleStep << " yet returns " << solidResponse + << " for this point !" << G4endl; G4cout << " Point = " << intersectionPoint << G4endl; if ( insideIntPt != kInside ) G4cout << " DistanceToIn(p) = " @@ -277,7 +317,18 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, localDirection, true, &validExitNormal, &exitNormal); #ifdef G4VERBOSE - if ( fCheck ) + if ( fCheck ) + { + if(fVerbose == 1) + { + G4cout << "*** G4VoxelNavigation::ComputeStep(): ***" << G4endl + << " Invoked DistanceToOut(p,v,...) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherStep << G4endl + << " For local point p: " << localPoint << G4endl + << " Direction v: " << localDirection + << ", to be considered as 'mother step'." << G4endl; + } if( ( motherStep < 0.0 ) || ( motherStep >= kInfinity) ) { G4int oldPrOut= G4cout.precision(16); @@ -294,6 +345,7 @@ G4VoxelNavigation::ComputeStep( const G4ThreeVector& localPoint, G4cout.precision(oldPrOut); G4cerr.precision(oldPrErr); } + } #endif if ( motherStep<=ourStep ) { @@ -620,6 +672,17 @@ G4VoxelNavigation::ComputeSafety(const G4ThreeVector& localPoint, motherSafety = motherSolid->DistanceToOut(localPoint); ourSafety = motherSafety; // Working isotropic safety +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4VoxelNavigation::ComputeSafety(): ***" << G4endl + << " Invoked DistanceToOut(p) for mother solid: " + << motherSolid->GetName() + << ". Solid replied: " << motherSafety << G4endl + << " For local point p: " << localPoint + << ", to be considered as 'mother safety'." << G4endl; + } +#endif // // Compute daughter safeties // @@ -648,6 +711,17 @@ G4VoxelNavigation::ComputeSafety(const G4ThreeVector& localPoint, { ourSafety = sampleSafety; } +#ifdef G4VERBOSE + if(( fCheck ) && ( fVerbose == 1 )) + { + G4cout << "*** G4VoxelNavigation::ComputeSafety(): ***" << G4endl + << " Invoked DistanceToIn(p) for daughter solid: " + << sampleSolid->GetName() + << ". Solid replied: " << sampleSafety << G4endl + << " For local point p: " << samplePoint + << ", to be considered as 'daughter safety'." << G4endl; + } +#endif } voxelSafety = ComputeVoxelSafety(localPoint); if ( voxelSafety fEndInnerRadius[1] ? + fEndInnerRadius[0] : fEndInnerRadius[1]); } + inline G4double GetEndOuterRadius () const + { return (fEndOuterRadius[0] > fEndOuterRadius[1] ? + fEndOuterRadius[0] : fEndOuterRadius[1]); } + + G4VisExtent GetExtent () const; + G4GeometryType GetEntityType() const; + + public: // without description + +#ifdef G4SPECSDEBUG + G4VSurface * GetOuterHype() const { return fOuterHype; } +#endif + + private: + + inline void SetFields(G4double phitwist, G4double innerrad, + G4double outerrad, + G4double negativeEndz, G4double positiveEndz); + + void CreateSurfaces(); + + static void AddPolyToExtent( const G4ThreeVector &v0, + const G4ThreeVector &v1, + const G4ThreeVector &w1, + const G4ThreeVector &w0, + const G4VoxelLimits &voxellimit, + const EAxis axis, + G4SolidExtentList &extentlist ); + private: + + G4double fPhiTwist; // Twist angle from -fZHalfLength to fZHalfLength + G4double fInnerRadius; // Inner-hype radius at z=0 + G4double fOuterRadius; // Outer-hype radius at z=0 + G4double fEndZ[2]; // z at endcaps, [0] = -ve z, [1] = +ve z + G4double fDPhi; // Phi-width of a segment fDPhi > 0 + G4double fZHalfLength; // Half length along z-axis + + G4double fInnerStereo; // Inner-hype stereo angle + G4double fOuterStereo; // Outer-hype stereo angle + G4double fTanInnerStereo; // tan(innerStereoAngle) + G4double fTanOuterStereo; // tan(outerStereoAngle) + G4double fKappa; // tan(fPhiTwist/2)/fZHalfLen; + G4double fEndInnerRadius[2]; // Inner-hype radii endcaps [0] -ve z, [1] +ve z + G4double fEndOuterRadius[2]; // Outer-hype radii endcaps [0] -ve z, [1] +ve z + G4double fEndPhi[2]; // Phi endcaps, [0] = -ve z, [1] = +ve z + + G4double fInnerRadius2; // fInnerRadius * fInnerRadius + G4double fOuterRadius2; // fOuterRadius * fOuterRadius + G4double fTanInnerStereo2; // fInnerRadius * fInnerRadius + G4double fTanOuterStereo2; // fInnerRadius * fInnerRadius + G4double fEndZ2[2]; // fEndZ * fEndZ + + G4VSurface *fLowerEndcap; // Surface of -ve z + G4VSurface *fUpperEndcap; // Surface of +ve z + G4VSurface *fLatterTwisted; // Surface of -ve phi + G4VSurface *fFormerTwisted; // Surface of +ve phi + G4VSurface *fInnerHype; // Surface of -ve r + G4VSurface *fOuterHype; // Surface of +ve r + + class LastState // last Inside result + { + public: + LastState() + { + p.set(kInfinity,kInfinity,kInfinity); + inside = kOutside; + } + ~LastState(){} + public: + G4ThreeVector p; + EInside inside; + }; + + class LastVector // last SurfaceNormal result + { + public: + LastVector() + { + p.set(kInfinity,kInfinity,kInfinity); + vec.set(kInfinity,kInfinity,kInfinity); + surface = new G4VSurface*[1]; + } + ~LastVector() + { + delete [] surface; + } + public: + G4ThreeVector p; + G4ThreeVector vec; + G4VSurface **surface; + }; + + class LastValue // last G4double value + { + public: + LastValue() + { + p.set(kInfinity,kInfinity,kInfinity); + value = DBL_MAX; + } + ~LastValue(){} + public: + G4ThreeVector p; + G4double value; + }; + + class LastValueWithDoubleVector // last G4double value + { + public: + LastValueWithDoubleVector() + { + p.set(kInfinity,kInfinity,kInfinity); + vec.set(kInfinity,kInfinity,kInfinity); + value = DBL_MAX; + } + ~LastValueWithDoubleVector(){} + public: + G4ThreeVector p; + G4ThreeVector vec; + G4double value; + }; + + LastState fLastInside; + LastVector fLastNormal; + LastValue fLastDistanceToIn; + LastValue fLastDistanceToOut; + LastValueWithDoubleVector fLastDistanceToInWithV; + LastValueWithDoubleVector fLastDistanceToOutWithV; + + }; + +//===================================================================== + +//--------------------- +// inline functions +//--------------------- + +inline +void G4TwistedTubs::SetFields(G4double phitwist, G4double innerrad, + G4double outerrad, G4double negativeEndz, + G4double positiveEndz) +{ + fPhiTwist = phitwist; + fEndZ[0] = negativeEndz; + fEndZ[1] = positiveEndz; + fEndZ2[0] = fEndZ[0] * fEndZ[0]; + fEndZ2[1] = fEndZ[1] * fEndZ[1]; + fInnerRadius = innerrad; + fOuterRadius = outerrad; + fInnerRadius2 = fInnerRadius * fInnerRadius; + fOuterRadius2 = fOuterRadius * fOuterRadius; + + G4int maxi; + if (fabs(fEndZ[0]) >= fabs(fEndZ[1])) { + fZHalfLength = fabs(fEndZ[0]); + maxi = 0; + } else { + fZHalfLength = fabs(fEndZ[1]); + maxi = 1; + } + + G4double parity = (fPhiTwist > 0 ? 1 : -1); + G4double tanHalfTwist = tan(0.5 * fPhiTwist); + G4double innerNumerator = fabs(fInnerRadius * tanHalfTwist) * parity; + G4double outerNumerator = fabs(fOuterRadius * tanHalfTwist) * parity; + + fTanInnerStereo = innerNumerator / fZHalfLength; + fTanOuterStereo = outerNumerator / fZHalfLength; + fTanInnerStereo2 = fTanInnerStereo * fTanInnerStereo; + fTanOuterStereo2 = fTanOuterStereo * fTanOuterStereo; + fInnerStereo = atan2(innerNumerator, fZHalfLength); + fOuterStereo = atan2(outerNumerator, fZHalfLength); + fEndInnerRadius[0] = sqrt(fInnerRadius2 + fEndZ2[0] * fTanInnerStereo2); + fEndInnerRadius[1] = sqrt(fInnerRadius2 + fEndZ2[1] * fTanInnerStereo2); + fEndOuterRadius[0] = sqrt(fOuterRadius2 + fEndZ2[0] * fTanOuterStereo2); + fEndOuterRadius[1] = sqrt(fOuterRadius2 + fEndZ2[1] * fTanOuterStereo2); + + fKappa = tanHalfTwist / fZHalfLength; + fEndPhi[0] = atan2(fEndZ[0] * tanHalfTwist, fZHalfLength); + fEndPhi[1] = atan2(fEndZ[1] * tanHalfTwist, fZHalfLength); + +#ifdef G4SPECSDEBUG + G4cout << "/********* G4TwistedTubs::SetFields() Field Parameters ***************** " << G4endl; + G4cout << "/* fPhiTwist : " << fPhiTwist << G4endl; + G4cout << "/* fEndZ(0, 1) : " << fEndZ[0] << " , " << fEndZ[1] << G4endl; + G4cout << "/* fEndPhi(0, 1) : " << fEndPhi[0] << " , " << fEndPhi[1] << G4endl; + G4cout << "/* fInnerRadius, fOuterRadius : " << fInnerRadius << " , " << fOuterRadius << G4endl; + G4cout << "/* fEndInnerRadius(0, 1) : " << fEndInnerRadius[0] << " , " + << fEndInnerRadius[1] << G4endl; + G4cout << "/* fEndOuterRadius(0, 1) : " << fEndOuterRadius[0] << " , " + << fEndOuterRadius[1] << G4endl; + G4cout << "/* fInnerStereo, fOuterStereo : " << fInnerStereo << " , " << fOuterStereo << G4endl; + G4cout << "/* tanHalfTwist, fKappa : " << tanHalfTwist << " , " << fKappa << G4endl; + G4cout << "/*********************************************************************** " << G4endl; +#endif +} + +#endif diff --git a/source/geometry/solids/specific/include/G4VSurface.hh b/source/geometry/solids/specific/include/G4VSurface.hh new file mode 100644 index 0000000000..02ea1fa27d --- /dev/null +++ b/source/geometry/solids/specific/include/G4VSurface.hh @@ -0,0 +1,337 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4VSurface.hh,v 1.8 2004/05/28 18:19:05 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class header file +// +// +// G4VSurface +// +// Class description: +// +// Abstract base class for boundary surface of G4VSolid. + +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- +#ifndef __G4VSURFACE__ +#define __G4VSURFACE__ + +#include "G4VSolid.hh" +#include "geomdefs.hh" + +#include "G4RotationMatrix.hh" + +class G4VSurface +{ + public: // without description + + enum EValidate {kDontValidate = 0, kValidateWithTol = 1, + kValidateWithoutTol = 2, kUninitialized = 3}; + + public: // with description + + G4VSurface (const G4String &name); + G4VSurface (const G4String &name, + const G4RotationMatrix &rot, + const G4ThreeVector &tlate, + G4int handedness, + const EAxis axis1, + const EAxis axis2, + G4double axis0min = -kInfinity, + G4double axis1min = -kInfinity, + G4double axis0max = kInfinity, + G4double axis1max = kInfinity); + + virtual ~G4VSurface(); + + virtual G4int AmIOnLeftSide(const G4ThreeVector &me, + const G4ThreeVector &vec, + G4bool withTol = true); + + virtual G4double DistanceToBoundary( G4int areacode, + G4ThreeVector &xx, + const G4ThreeVector &p) ; + + + virtual G4double DistanceToIn(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector &gxxbest); + virtual G4double DistanceToOut(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector &gxxbest); + virtual G4double DistanceTo(const G4ThreeVector &gp, + G4ThreeVector &gxx); + + virtual G4int DistanceToSurface(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[], + G4bool isvalid[], + EValidate validate=kValidateWithTol) = 0; + + virtual G4int DistanceToSurface(const G4ThreeVector &gp, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[]) = 0; + + void DebugPrint() const; + + // get methods + + virtual G4ThreeVector GetNormal(const G4ThreeVector &xx,G4bool isGlobal) = 0; + + virtual G4String GetName() const { return fName; } + virtual void GetBoundaryParameters(const G4int &areacode, + G4ThreeVector &d, + G4ThreeVector &x0, + G4int &boundarytype) const; + virtual G4ThreeVector GetBoundaryAtPZ(G4int areacode, + const G4ThreeVector &p) const; + + inline G4double DistanceToPlaneWithV(const G4ThreeVector &p, + const G4ThreeVector &v, + const G4ThreeVector &x0, + const G4ThreeVector &n0, + G4ThreeVector &xx); + + inline G4double DistanceToPlane(const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &n0, + G4ThreeVector &xx); + + inline G4double DistanceToPlane(const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &t1, + const G4ThreeVector &t2, + G4ThreeVector &xx, + G4ThreeVector &n); + + inline G4double DistanceToLine (const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &d, + G4ThreeVector &xx); + + inline G4bool IsAxis0 (G4int areacode) const; + inline G4bool IsAxis1 (G4int areacode) const; + inline G4bool IsOutside (G4int areacode) const; + inline G4bool IsInside (G4int areacode, G4bool testbitmode = false) const; + inline G4bool IsBoundary (G4int areacode, G4bool testbitmode = false) const; + inline G4bool IsCorner (G4int areacode, G4bool testbitmode = false) const; + inline G4bool IsValidNorm() const { return fIsValidNorm; } + G4bool IsSameBoundary (G4VSurface *surface1, G4int areacode1, + G4VSurface *surface2, G4int areacode2 ) const; + inline G4int GetAxisType(G4int areacode, G4int whichaxis) const; + + inline G4ThreeVector ComputeGlobalPoint (const G4ThreeVector &lp) const; + inline G4ThreeVector ComputeLocalPoint (const G4ThreeVector &gp) const; + inline G4ThreeVector ComputeGlobalDirection (const G4ThreeVector &lp) const; + inline G4ThreeVector ComputeLocalDirection (const G4ThreeVector &gp) const; + + // set methods + + inline void SetAxis(G4int i, const EAxis axis) { fAxis[i] = axis; } + inline void SetNeighbours(G4VSurface* axis0min, G4VSurface* axis1min, + G4VSurface* axis0max, G4VSurface* axis1max); + + protected: // with description + + // get methods + + inline G4VSurface** GetNeighbours() { return fNeighbours; } + inline G4int GetNeighbours(G4int areacode, G4VSurface* surfaces[]); + inline G4ThreeVector GetCorner(G4int areacode) const; + void GetBoundaryAxis(G4int areacode, EAxis axis[]) const; + void GetBoundaryLimit(G4int areacode, G4double limit[]) const; + virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withtol=true) = 0; + + // set methods + + virtual void SetBoundary(const G4int &axiscode, + const G4ThreeVector &direction, + const G4ThreeVector &x0, + const G4int &boundarytype); + // areacode must be one of them: + // sAxis0 & sAxisMin, sAxis0 & sAxisMax, + // sAxis1 & sAxisMin, sAxis1 & sAxisMax. + // boundarytype represents the shape of locus + // from the start point to end point of boundary. + // ex. + // sAxisRho = linear line which start point is fixed at origin. + // sAxisPhi = part of circle which center placed at the origin. + + void SetCorner(G4int areacode, G4double x, G4double y, G4double z); + + private: + + virtual void SetBoundaries() = 0; + virtual void SetCorners() = 0; + + // data members --------------------------------------------------------- + + public: + + static const G4int sOutside ; + static const G4int sInside ; + static const G4int sBoundary; + static const G4int sCorner; + static const G4int sCMin1Min; + static const G4int sCMax1Min; + static const G4int sCMax1Max; + static const G4int sCMin1Max; + static const G4int sAxisMin; + static const G4int sAxisMax; + static const G4int sAxisX; + static const G4int sAxisY; + static const G4int sAxisZ; + static const G4int sAxisRho; + static const G4int sAxisPhi; + static const G4int sAxis0; + static const G4int sAxis1; + static const G4int sSizeMask; + static const G4int sAxisMask; + static const G4int sAreaMask; + + protected: + + class CurrentStatus + { + public: + + CurrentStatus(); + virtual ~CurrentStatus(); + + inline G4ThreeVector GetXX(G4int i) const { return fXX[i]; } + inline G4double GetDistance(G4int i) const { return fDistance[i]; } + inline G4int GetAreacode(G4int i) const { return fAreacode[i]; } + inline G4int GetNXX() const { return fNXX; } + inline G4bool IsDone() const { return fDone; } + inline G4bool IsValid(G4int i) const { return fIsValid[i]; } + + void SetCurrentStatus(G4int i, + G4ThreeVector &xx, + G4double &dist, + G4int &areacode, + G4bool &isvalid, + G4int nxx, + EValidate validate, + const G4ThreeVector *p, + const G4ThreeVector *v = 0); + + void ResetfDone(EValidate validate, + const G4ThreeVector *p, + const G4ThreeVector *v = 0); + + + void DebugPrint() const; + + private: + + G4double fDistance[2]; + G4ThreeVector fXX[2]; + G4int fAreacode[2]; + G4bool fIsValid[2]; + G4int fNXX; + G4ThreeVector fLastp; + G4ThreeVector fLastv; + EValidate fLastValidate; + G4bool fDone; + }; + + class Boundary + { + public: + Boundary(); + virtual ~Boundary(); + + void SetFields(const G4int &areacode, + const G4ThreeVector &d, + const G4ThreeVector &x0, + const G4int &boundarytype); + + G4bool IsEmpty() const; + + G4bool GetBoundaryParameters(const G4int &areacode, + G4ThreeVector &d, + G4ThreeVector &x0, + G4int &boundarytype) const; + + private: + G4int fBoundaryAcode; + G4ThreeVector fBoundaryDirection; + G4ThreeVector fBoundaryX0; + G4int fBoundaryType; + }; + + EAxis fAxis[2]; + G4double fAxisMin[2]; + G4double fAxisMax[2]; + CurrentStatus fCurStatWithV; + CurrentStatus fCurStat; + G4RotationMatrix fRot; + G4ThreeVector fTrans; + G4int fHandedness; + class G4SurfCurNormal + { + public: + G4ThreeVector p; + G4ThreeVector normal; + }; + G4SurfCurNormal fCurrentNormal; + G4bool fIsValidNorm; + + private: + + G4VSurface *fNeighbours[4]; // {0,1,2,3} = sAxis0min, sAxis1min, + // sAxis0max, sAxis1max + G4ThreeVector fCorners[4]; // corners of the surface in local coordinate + Boundary fBoundaries[4]; // boundaries of the surface. + G4String fName; + + class G4SurfSideQuery + { + public: + G4ThreeVector me; + G4ThreeVector vec; + G4bool withTol; + G4int amIOnLeftSide; + }; + G4SurfSideQuery fAmIOnLeftSide; +}; + +//======================================================== +// inline functions +//======================================================== + +#include "G4VSurface.icc" + +#endif diff --git a/source/geometry/solids/specific/include/G4VSurface.icc b/source/geometry/solids/specific/include/G4VSurface.icc new file mode 100644 index 0000000000..7aaf88a596 --- /dev/null +++ b/source/geometry/solids/specific/include/G4VSurface.icc @@ -0,0 +1,369 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4VSurface.icc,v 1.2 2004/05/28 13:13:35 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// G4VSurface class inline methods +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +//===================================================================== +//* DistanceToPlaneWithV ---------------------------------------------- + +inline +G4double G4VSurface::DistanceToPlaneWithV(const G4ThreeVector &p, + const G4ThreeVector &v, + const G4ThreeVector &x0, + const G4ThreeVector &n0, + G4ThreeVector &xx) +{ + G4double t = (n0 * (x0 - p)) / (n0 * v); + xx = p + t * v; + return t; +} + +//===================================================================== +//* DistanceToPlane --------------------------------------------------- + +inline +G4double G4VSurface::DistanceToPlane(const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &n0, + G4ThreeVector &xx) +{ + // DistanceToPlane : + // Calculate distance to plane in local coordinate, + // then return distance and global intersection points. + // + // p - location of flying particle + // x0 - reference point of surface + // xx - a foot of perpendicular line from p to the plane + // t - distance from xx to p + // n - a unit normal of this plane from plane to p. + // + // equation of plane: + // n*(x - x0) = 0; + // + // vector to xx: + // xx = p - t*n + // + // where + // t = n * (p - x0) / abs(n) + // + G4double t; + G4ThreeVector n = n0.unit(); + t = n * (p - x0); + xx = p - t * n; + return t; +} + +//===================================================================== +//* DistanceToPlane --------------------------------------------------- + +inline +G4double G4VSurface::DistanceToPlane(const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &t1, + const G4ThreeVector &t2, + G4ThreeVector &xx, + G4ThreeVector &n) +{ + // DistanceToPlane : + // Calculate distance to plane in local coordinate, + // then return distance and global intersection points. + // t1 - 1st. vector lying on the plane + // t2 - 2nd. vector lying on the plane + + n = (t1.cross(t2)).unit(); + return DistanceToPlane(p, x0, n, xx); +} + +//===================================================================== +//* DistanceToLine ---------------------------------------------------- + +inline +G4double G4VSurface::DistanceToLine(const G4ThreeVector &p, + const G4ThreeVector &x0, + const G4ThreeVector &d, + G4ThreeVector &xx) +{ + // DistanceToLine : + // Calculate distance to line, + // then return distance and global intersection points. + // + // p - location of flying particle + // x0 - reference point of line + // d - direction vector of line + // xx - a foot of perpendicular line from p to the plane + // t - distance from xx to p + // + // Equation + // + // distance^2 = |(xx - p)|^2 + // with + // xx = x0 + t*d + // + // (d/dt)distance^2 = (d/dt)|((x0 + t*d) - p)|^2 + // = 2*t*|d|^2 + 2*d*(x0 - p) + // = 0 // smallest distance + // then + // t = - d*(x0 - p) / |d|^2 + // + + G4double t; + G4ThreeVector dir = d.unit(); + t = - dir * (x0 - p); // |dir|^2 = 1. + xx = x0 + t * dir; + + G4ThreeVector dist = xx - p; + return dist.mag(); +} + +//===================================================================== +//* IsAxis0 ----------------------------------------------------------- + +inline +G4bool G4VSurface::IsAxis0(G4int areacode) const +{ + if (areacode & sAxis0) return true; + return false; +} + +//===================================================================== +//* IsAxis1 ----------------------------------------------------------- + +inline +G4bool G4VSurface::IsAxis1(G4int areacode) const +{ + if (areacode & sAxis1) return true; + return false; +} + +//===================================================================== +//* IsOutside --------------------------------------------------------- + +inline +G4bool G4VSurface::IsOutside(G4int areacode) const +{ + if (areacode & sInside) return false; + return true; +} + +//===================================================================== +//* IsInside ---------------------------------------------------------- + +inline +G4bool G4VSurface::IsInside(G4int areacode, G4bool testbitmode) const +{ + if (areacode & sInside) { + if (testbitmode) { + return true; + } else { + if (!((areacode & sBoundary) || (areacode & sCorner))) return true; + } + } + return false; +} + +//===================================================================== +//* IsBoundary -------------------------------------------------------- + +inline +G4bool G4VSurface::IsBoundary(G4int areacode, G4bool testbitmode) const +{ + if ((areacode & sBoundary) == sBoundary) { + if (testbitmode) { + return true; + } else { + if ((areacode & sInside) == sInside) return true; + } + } + return false; +} + +//===================================================================== +//* IsCorner ---------------------------------------------------------- + +inline +G4bool G4VSurface::IsCorner(G4int areacode, G4bool testbitmode) const +{ + if ((areacode & sCorner) == sCorner) { + if (testbitmode) { + return true; + } else { + if ((areacode & sInside) == sInside) return true; + } + } + return false; +} + +//===================================================================== +//* GetAxisType ------------------------------------------------------- + +inline +G4int G4VSurface::GetAxisType(G4int areacode, G4int whichaxis) const +{ + G4int axiscode = areacode & sAxisMask & whichaxis; + + if (axiscode == (sAxisX & sAxis0) || + axiscode == (sAxisX & sAxis1)) { + return sAxisX; + } else if (axiscode == (sAxisY & sAxis0) || + axiscode == (sAxisY & sAxis1)) { + return sAxisY; + } else if (axiscode == (sAxisZ & sAxis0) || + axiscode == (sAxisZ & sAxis1)) { + return sAxisZ; + } else if (axiscode == (sAxisRho & sAxis0) || + axiscode == (sAxisRho & sAxis1)) { + return sAxisRho; + } else if (axiscode == (sAxisPhi & sAxis0) || + axiscode == (sAxisPhi & sAxis1)) { + return sAxisPhi; + } else { + G4cerr << "ERROR - G4VSurface::GetAxisType()" << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::GetAxisType()","NotSupported", + FatalException, "Configuration not supported."); + } + return 1; +} + +//===================================================================== +//* ComputeGlobalPoint ------------------------------------------------ + +inline +G4ThreeVector G4VSurface::ComputeGlobalPoint(const G4ThreeVector &lp) const +{ + return fRot * G4ThreeVector(lp) + fTrans; +} + +//===================================================================== +//* ComputeGlobalPoint ------------------------------------------------ + +inline +G4ThreeVector G4VSurface::ComputeLocalPoint(const G4ThreeVector &gp) const +{ + return fRot.inverse() * G4ThreeVector(gp) - fTrans; +} + +//===================================================================== +//* ComputeGlobalDirection -------------------------------------------- + +inline +G4ThreeVector G4VSurface::ComputeGlobalDirection(const G4ThreeVector &lp) const +{ + return fRot * G4ThreeVector(lp); +} + +//===================================================================== +//* ComputeLocalDirection --------------------------------------------- + +inline +G4ThreeVector G4VSurface::ComputeLocalDirection(const G4ThreeVector &gp) const +{ + return fRot.inverse() * G4ThreeVector(gp); +} + +//===================================================================== +//* SetNeighbours ----------------------------------------------------- + +inline +void G4VSurface::SetNeighbours(G4VSurface* axis0min, G4VSurface* axis1min, + G4VSurface* axis0max, G4VSurface* axis1max) +{ + fNeighbours[0] = axis0min; + fNeighbours[1] = axis1min; + fNeighbours[2] = axis0max; + fNeighbours[4] = axis1max; +} + +//===================================================================== +//* GetNeighbours ----------------------------------------------------- + +inline +G4int G4VSurface::GetNeighbours(G4int areacode, G4VSurface** surfaces) +{ + G4int i = 0; + + if (areacode & (sAxis0 | sAxisMin)) { + surfaces[i] = fNeighbours[0]; + i++; + } + if (areacode & (sAxis1 | sAxisMin)) { + surfaces[i] = fNeighbours[1]; + i++; + if (i == 2) return i; + } + if (areacode & (sAxis0 | sAxisMax)) { + surfaces[i] = fNeighbours[2]; + i++; + if (i == 2) return i; + } + if (areacode & (sAxis1 | sAxisMax)) { + surfaces[i] = fNeighbours[3]; + i++; + if (i == 2) return i; + } + + return i; +} + +//===================================================================== +//* GetCorner --------------------------------------------------------- + +inline +G4ThreeVector G4VSurface::GetCorner(G4int areacode) const +{ + if (!(areacode & sCorner)){ + G4cerr << "ERROR - G4VSurface::GetCorner()" << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::GetCorner()","InvalidSetup", + FatalException, "Area code must represent corner."); + } + + if ((areacode & sCMin1Min) == sCMin1Min) { + return fCorners[0]; + } else if ((areacode & sCMax1Min) == sCMax1Min) { + return fCorners[1]; + } else if ((areacode & sCMax1Max) == sCMax1Max) { + return fCorners[2]; + } else if ((areacode & sCMin1Max) == sCMin1Max) { + return fCorners[3]; + } else { + G4cerr << "ERROR - G4VSurface::GetCorner()" << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::GetCorner()", "NotSupported", + FatalException, "Configuration not supported."); + } + return fCorners[0]; +} diff --git a/source/geometry/solids/specific/src/G4FlatSurface.cc b/source/geometry/solids/specific/src/G4FlatSurface.cc new file mode 100644 index 0000000000..af909382e6 --- /dev/null +++ b/source/geometry/solids/specific/src/G4FlatSurface.cc @@ -0,0 +1,482 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4FlatSurface.cc,v 1.5 2004/05/28 13:13:36 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class source file +// +// +// G4FlatSurface.cc +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +#include "G4FlatSurface.hh" + +//===================================================================== +//* constructors ------------------------------------------------------ + +G4FlatSurface::G4FlatSurface(const G4String &name, + const G4RotationMatrix &rot, + const G4ThreeVector &tlate, + const G4ThreeVector &n, + const EAxis axis0 , + const EAxis axis1 , + G4double axis0min, + G4double axis1min, + G4double axis0max, + G4double axis1max ) + : G4VSurface(name, rot, tlate, 0, axis0, axis1, + axis0min, axis1min, axis0max, axis1max) +{ + if (axis0 == kPhi && axis1 == kRho) { + G4Exception("G4FlatSurface::G4FlatSurface()", "InvalidSetup", + FatalException, "Should swap axis0 and axis1!"); + } + + G4ThreeVector normal = rot.inverse()*n; + fCurrentNormal.normal = normal.unit(); // in local coordinate system + fIsValidNorm = true; + + SetCorners(); + SetBoundaries(); +} + + + +G4FlatSurface::G4FlatSurface( const G4String &name, + G4double EndInnerRadius[2], + G4double EndOuterRadius[2], + G4double DPhi, + G4double EndPhi[2], + G4double EndZ[2], + G4int handedness ) + : G4VSurface(name) +{ + fHandedness = handedness; // +z = +ve, -z = -ve + fAxis[0] = kRho; // in local coordinate system + fAxis[1] = kPhi; + G4int i = (handedness < 0 ? 0 : 1); + fAxisMin[0] = EndInnerRadius[i]; // Inner-hype radius at z=0 + fAxisMax[0] = EndOuterRadius[i]; // Outer-hype radius at z=0 + fAxisMin[1] = -0.5*DPhi; + fAxisMax[1] = -fAxisMin[1]; + fCurrentNormal.normal.set(0, 0, (fHandedness < 0 ? -1 : 1)); + // Unit vector, in local coordinate system + fRot.rotateZ(EndPhi[i]); + fTrans.set(0, 0, EndZ[i]); + fIsValidNorm = true; + + SetCorners(); + SetBoundaries(); +} + + + +//===================================================================== +//* destructor -------------------------------------------------------- + +G4FlatSurface::~G4FlatSurface() +{ +} + +//===================================================================== +//* GetNormal --------------------------------------------------------- + +G4ThreeVector G4FlatSurface::GetNormal(const G4ThreeVector & /* xx */ , + G4bool isGlobal) +{ + if (isGlobal) { + return ComputeGlobalDirection(fCurrentNormal.normal); + } else { + return fCurrentNormal.normal; + } +} + +//===================================================================== +//* DistanceToSurface(p, v) ------------------------------------------- + +G4int G4FlatSurface::DistanceToSurface(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[], + G4bool isvalid[], + EValidate validate) +{ + fCurStatWithV.ResetfDone(validate, &gp, &gv); + + if (fCurStatWithV.IsDone()) { + G4int i; + for (i=0; i= 0) isvalid[0] = true; + } + } else if (validate == kValidateWithoutTol) { + areacode[0] = GetAreaCode(xx, false); + if (IsInside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else { // kDontValidate + areacode[0] = sInside; + if (distance[0] >= 0) isvalid[0] = true; + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 1, validate, &gp, &gv); + +#ifdef G4SPECSDEBUG + G4cerr << "ERROR - G4FlatSurface::DistanceToSurface(p,v)" << G4endl; + G4cerr << " Name : " << GetName() << G4endl; + G4cerr << " xx : " << xx << G4endl; + G4cerr << " gxx[0] : " << gxx[0] << G4endl; + G4cerr << " dist[0] : " << distance[0] << G4endl; + G4cerr << " areacode[0] : " << areacode[0] << G4endl; + G4cerr << " isvalid[0] : " << isvalid[0] << G4endl; + } +#endif + return 1; +} + +//===================================================================== +//* DistanceToSurface(p) ---------------------------------------------- + +G4int G4FlatSurface::DistanceToSurface(const G4ThreeVector &gp, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[]) +{ + // Calculate distance to plane in local coordinate, + // then return distance and global intersection points. + // + + fCurStat.ResetfDone(kDontValidate, &gp); + + if (fCurStat.IsDone()) { + G4int i; + for (i=0; i= fAxisMax[rhoaxis] - rtol) { + + areacode |= (sAxis0 & (sAxisRho | sAxisMax)) | sBoundary; // rho-max + if (xx.getRho() > fAxisMax[rhoaxis] + rtol) isoutside = true; + + } + + // test boundary of phi-axis + + if (AmIOnLeftSide(xx, dphimin) >= 0) { // xx is on dphimin + + areacode |= (sAxis1 & (sAxisPhi | sAxisMin)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + if (AmIOnLeftSide(xx, dphimin) > 0) isoutside = true; + + } else if (AmIOnLeftSide(xx, dphimax) <= 0) { // xx is on dphimax + + areacode |= (sAxis1 & (sAxisPhi | sAxisMax)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + if (AmIOnLeftSide(xx, dphimax) < 0) isoutside = true; + + } + + // if isoutside = true, clear inside bit. + // if not on boundary, add axis information. + + if (isoutside) { + G4int tmpareacode = areacode & (~sInside); + areacode = tmpareacode; + } else if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisRho) | (sAxis1 & sAxisPhi); + } + + } else { + + // out of boundary of rho-axis + + if (xx.getRho() < fAxisMin[rhoaxis]) { + areacode |= (sAxis0 & (sAxisRho | sAxisMin)) | sBoundary; + } else if (xx.getRho() > fAxisMax[rhoaxis]) { + areacode |= (sAxis0 & (sAxisRho | sAxisMax)) | sBoundary; + } + + // out of boundary of phi-axis + + if (AmIOnLeftSide(xx, dphimin, false) >= 0) { // xx is leftside or + areacode |= (sAxis1 & (sAxisPhi | sAxisMin)) ; // boundary of dphimin + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + } else if (AmIOnLeftSide(xx, dphimax, false) <= 0) { // xx is rightside or + areacode |= (sAxis1 & (sAxisPhi | sAxisMax)) ; // boundary of dphimax + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + } + + if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisRho) | (sAxis1 & sAxisPhi); + } + + } + return areacode; + } else { + + G4cerr << "ERROR - G4FlatSurface::GetAreaCode()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4FlatSurface::GetAreaCode()", "NotImplemented", + FatalException, "Feature NOT implemented !"); + } + return areacode; +} + + +//===================================================================== +//* SetCorners -------------------------------------------------------- + +void G4FlatSurface::SetCorners() +{ + // Set Corner points in local coodinate. + + if (fAxis[0] == kRho && fAxis[1] == kPhi) { + + G4int rhoaxis = 0; // kRho + G4int phiaxis = 1; // kPhi + + G4double x, y, z; + // corner of Axis0min and Axis1min + x = fAxisMin[rhoaxis]*cos(fAxisMin[phiaxis]); + y = fAxisMin[rhoaxis]*sin(fAxisMin[phiaxis]); + z = 0; + SetCorner(sCMin1Min, x, y, z); + // corner of Axis0max and Axis1min + x = fAxisMax[rhoaxis]*cos(fAxisMin[phiaxis]); + y = fAxisMax[rhoaxis]*sin(fAxisMin[phiaxis]); + z = 0; + SetCorner(sCMax1Min, x, y, z); + // corner of Axis0max and Axis1max + x = fAxisMax[rhoaxis]*cos(fAxisMax[phiaxis]); + y = fAxisMax[rhoaxis]*sin(fAxisMax[phiaxis]); + z = 0; + SetCorner(sCMax1Max, x, y, z); + // corner of Axis0min and Axis1max + x = fAxisMin[rhoaxis]*cos(fAxisMax[phiaxis]); + y = fAxisMin[rhoaxis]*sin(fAxisMax[phiaxis]); + z = 0; + SetCorner(sCMin1Max, x, y, z); + + } else { + G4cerr << "ERROR - G4FlatSurface::SetCorners()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4FlatSurface::SetCorners()", "NotImplemented", + FatalException, "Feature NOT implemented !"); + } +} + +//===================================================================== +//* SetBoundaries() --------------------------------------------------- + +void G4FlatSurface::SetBoundaries() +{ + // Set direction-unit vector of phi-boundary-lines in local coodinate. + // Don't call the function twice. + + if (fAxis[0] == kRho && fAxis[1] == kPhi) { + + G4ThreeVector direction; + // sAxis0 & sAxisMin + direction = GetCorner(sCMin1Max) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisPhi | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisPhi); + + // sAxis0 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMax1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisPhi | sAxisMax), direction, + GetCorner(sCMax1Min), sAxisPhi); + + // sAxis1 & sAxisMin + direction = GetCorner(sCMax1Min) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisRho | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisRho); + + // sAxis1 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMin1Max); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisRho | sAxisMax), direction, + GetCorner(sCMin1Max), sAxisPhi); + } else { + G4cerr << "ERROR - G4FlatSurface::SetBoundaries()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4FlatSurface::SetBoundaries()", "NotImplemented", + FatalException, "Feature NOT implemented !"); + } +} diff --git a/source/geometry/solids/specific/src/G4HyperbolicSurface.cc b/source/geometry/solids/specific/src/G4HyperbolicSurface.cc new file mode 100644 index 0000000000..812112ce8c --- /dev/null +++ b/source/geometry/solids/specific/src/G4HyperbolicSurface.cc @@ -0,0 +1,912 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4HyperbolicSurface.cc,v 1.5 2004/05/28 13:13:36 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class source file +// +// +// G4HyperbolicSurface.cc +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +#include "G4HyperbolicSurface.hh" + +//===================================================================== +//* constructors ------------------------------------------------------ + +G4HyperbolicSurface::G4HyperbolicSurface(const G4String &name, + const G4RotationMatrix &rot, + const G4ThreeVector &tlate, + const G4int handedness, + const G4double kappa, + const G4double tanstereo, + const G4double r0, + const EAxis axis0, + const EAxis axis1, + G4double axis0min, + G4double axis1min, + G4double axis0max, + G4double axis1max ) + : G4VSurface(name, rot, tlate, handedness, axis0, axis1, + axis0min, axis1min, axis0max, axis1max), + fKappa(kappa), fTanStereo(tanstereo), + fTan2Stereo(tanstereo*tanstereo), fR0(r0), fR02(r0*r0) +{ + if (axis0 == kZAxis && axis1 == kPhi) { + G4Exception("G4HyperbolicSurface::G4HyperbolicSurface()", "InvalidSetup", + FatalException, "Should swap axis0 and axis1!"); + } + + fInside.gp.set(kInfinity, kInfinity, kInfinity); + fInside.inside = kOutside; + fIsValidNorm = false; + + SetCorners(); + SetBoundaries(); + +} + +G4HyperbolicSurface::G4HyperbolicSurface(const G4String &name, + G4double EndInnerRadius[2], + G4double EndOuterRadius[2], + G4double DPhi, + G4double EndPhi[2], + G4double EndZ[2], + G4double InnerRadius, + G4double OuterRadius, + G4double Kappa, + G4double TanInnerStereo, + G4double TanOuterStereo, + G4int handedness) + : G4VSurface(name) +{ + + fHandedness = handedness; // +z = +ve, -z = -ve + fAxis[0] = kPhi; + fAxis[1] = kZAxis; + fAxisMin[0] = kInfinity; // we cannot fix boundary min of Phi, + fAxisMax[0] = kInfinity; // because it depends on z. + fAxisMin[1] = EndZ[0]; + fAxisMax[1] = EndZ[1]; + fKappa = Kappa; + + if (handedness < 0) { // inner hyperbolic surface + fTanStereo = TanInnerStereo; + fR0 = InnerRadius; + } else { // outer hyperbolic surface + fTanStereo = TanOuterStereo; + fR0 = OuterRadius; + } + fTan2Stereo = fTanStereo * fTanStereo; + fR02 = fR0 * fR0; + + fTrans.set(0, 0, 0); + fIsValidNorm = false; + + fInside.gp.set(kInfinity, kInfinity, kInfinity); + fInside.inside = kOutside; + + SetCorners(EndInnerRadius, EndOuterRadius, DPhi, EndPhi, EndZ) ; + + SetBoundaries(); +} + + + + +//===================================================================== +//* destructor -------------------------------------------------------- + +G4HyperbolicSurface::~G4HyperbolicSurface() +{ +} + +//===================================================================== +//* GetNormal --------------------------------------------------------- + +G4ThreeVector G4HyperbolicSurface::GetNormal(const G4ThreeVector &tmpxx, + G4bool isGlobal) +{ + // GetNormal returns a normal vector at a surface (or very close + // to surface) point at tmpxx. + // If isGlobal=true, it returns the normal in global coordinate. + // + + G4ThreeVector xx; + if (isGlobal) { + xx = ComputeLocalPoint(tmpxx); + if ((xx - fCurrentNormal.p).mag() < 0.5 * kCarTolerance) { + return ComputeGlobalDirection(fCurrentNormal.normal); + } + } else { + xx = tmpxx; + if (xx == fCurrentNormal.p) { + return fCurrentNormal.normal; + } + } + + fCurrentNormal.p = xx; + + G4ThreeVector normal( xx.x(), xx.y(), -xx.z() * fTan2Stereo); + normal *= fHandedness; + normal = normal.unit(); + + if (isGlobal) { + fCurrentNormal.normal = ComputeLocalDirection(normal); + } else { + fCurrentNormal.normal = normal; + } + return fCurrentNormal.normal; +} + +//===================================================================== +//* Inside() ---------------------------------------------------------- + +EInside G4HyperbolicSurface::Inside(const G4ThreeVector &gp) +{ + // Inside returns + static const G4double halftol = 0.5 * kRadTolerance; + + if (fInside.gp == gp) { + return fInside.inside; + } + fInside.gp = gp; + + G4ThreeVector p = ComputeLocalPoint(gp); + + + if (p.mag() < DBL_MIN) { + fInside.inside = kOutside; + return fInside.inside; + } + + G4double rhohype = GetRhoAtPZ(p); + G4double distanceToOut = fHandedness * (rhohype - p.getRho()); + // +ve : inside + + if (distanceToOut < -halftol) { + + fInside.inside = kOutside; + + } else { + + G4int areacode = GetAreaCode(p); + if (IsOutside(areacode)) { + fInside.inside = kOutside; + } else if (IsBoundary(areacode)) { + fInside.inside = kSurface; + } else if (IsInside(areacode)) { + if (distanceToOut <= halftol) { + fInside.inside = kSurface; + } else { + fInside.inside = kInside; + } + } else { + G4cout << "WARNING - G4HyperbolicSurface::Inside()" << G4endl + << " Invalid option !" << G4endl + << " name, areacode, distanceToOut = " + << GetName() << ", " << std::hex << areacode << std::dec << ", " + << distanceToOut << G4endl; + } + } + + return fInside.inside; +} + +//===================================================================== +//* DistanceToSurface ------------------------------------------------- + +G4int G4HyperbolicSurface::DistanceToSurface(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[], + G4bool isvalid[], + EValidate validate) +{ + // + // Decide if and where a line intersects with a hyperbolic + // surface (of infinite extent) + // + // Arguments: + // p - (in) Point on trajectory + // v - (in) Vector along trajectory + // r2 - (in) Square of radius at z = 0 + // tan2phi - (in) tan(stereo)**2 + // s - (out) Up to two points of intersection, where the + // intersection point is p + s*v, and if there are + // two intersections, s[0] < s[1]. May be negative. + // Returns: + // The number of intersections. If 0, the trajectory misses. + // + // + // Equation of a line: + // + // x = x0 + s*tx y = y0 + s*ty z = z0 + s*tz + // + // Equation of a hyperbolic surface: + // + // x**2 + y**2 = r**2 + (z*tanPhi)**2 + // + // Solution is quadratic: + // + // a*s**2 + b*s + c = 0 + // + // where: + // + // a = tx**2 + ty**2 - (tz*tanPhi)**2 + // + // b = 2*( x0*tx + y0*ty - z0*tz*tanPhi**2 ) + // + // c = x0**2 + y0**2 - r**2 - (z0*tanPhi)**2 + // + + fCurStatWithV.ResetfDone(validate, &gp, &gv); + + if (fCurStatWithV.IsDone()) { + G4int i; + for (i=0; i= 0) isvalid[0] = true; + } + } else if (validate == kValidateWithoutTol) { + areacode[0] = GetAreaCode(xx[0], false); + if (IsInside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else { // kDontValidate + areacode[0] = sInside; + if (distance[0] >= 0) isvalid[0] = true; + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 1, validate, &gp, &gv); + return 1; + } + + // + // special case end. + // + + G4double a = v.x()*v.x() + v.y()*v.y() - v.z()*v.z()*fTan2Stereo; + G4double b = 2.0 * ( p.x() * v.x() + p.y() * v.y() - p.z() * v.z() * fTan2Stereo ); + G4double c = p.x()*p.x() + p.y()*p.y() - fR02 - p.z()*p.z()*fTan2Stereo; + G4double D = b*b - 4*a*c; //discriminant + + if (fabs(a) < DBL_MIN) { + if (fabs(b) > DBL_MIN) { // single solution + + distance[0] = -c/b; + xx[0] = p + distance[0]*v; + gxx[0] = ComputeGlobalPoint(xx[0]); + + if (validate == kValidateWithTol) { + areacode[0] = GetAreaCode(xx[0]); + if (!IsOutside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else if (validate == kValidateWithoutTol) { + areacode[0] = GetAreaCode(xx[0], false); + if (IsInside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else { // kDontValidate + areacode[0] = sInside; + if (distance[0] >= 0) isvalid[0] = true; + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 1, validate, &gp, &gv); + return 1; + + } else { + // if a=b=0 and c != 0, p is origin and v is parallel to asymptotic line. + // if a=b=c=0, p is on surface and v is paralell to stereo wire. + // return distance = infinity. + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 0, validate, &gp, &gv); + + return 0; + } + + } else if (D > DBL_MIN) { // double solutions + + D = sqrt(D); + G4double factor = 0.5/a; + G4double tmpdist[2] = {kInfinity, kInfinity}; + G4ThreeVector tmpxx[2] ; + G4int tmpareacode[2] = {sOutside, sOutside}; + G4bool tmpisvalid[2] = {false, false}; + G4int i; + + for (i=0; i<2; i++) { + tmpdist[i] = factor*(-b - D); + D = -D; + tmpxx[i] = p + tmpdist[i]*v; + + if (validate == kValidateWithTol) { + tmpareacode[i] = GetAreaCode(tmpxx[i]); + if (!IsOutside(tmpareacode[i])) { + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } + } else if (validate == kValidateWithoutTol) { + tmpareacode[i] = GetAreaCode(tmpxx[i], false); + if (IsInside(tmpareacode[i])) { + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } + } else { // kDontValidate + tmpareacode[i] = sInside; + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } + } + + if (tmpdist[0] <= tmpdist[1]) { + distance[0] = tmpdist[0]; + distance[1] = tmpdist[1]; + xx[0] = tmpxx[0]; + xx[1] = tmpxx[1]; + gxx[0] = ComputeGlobalPoint(tmpxx[0]); + gxx[1] = ComputeGlobalPoint(tmpxx[1]); + areacode[0] = tmpareacode[0]; + areacode[1] = tmpareacode[1]; + isvalid[0] = tmpisvalid[0]; + isvalid[1] = tmpisvalid[1]; + } else { + distance[0] = tmpdist[1]; + distance[1] = tmpdist[0]; + xx[0] = tmpxx[1]; + xx[1] = tmpxx[0]; + gxx[0] = ComputeGlobalPoint(tmpxx[1]); + gxx[1] = ComputeGlobalPoint(tmpxx[0]); + areacode[0] = tmpareacode[1]; + areacode[1] = tmpareacode[0]; + isvalid[0] = tmpisvalid[1]; + isvalid[1] = tmpisvalid[0]; + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 2, validate, &gp, &gv); + fCurStatWithV.SetCurrentStatus(1, gxx[1], distance[1], areacode[1], + isvalid[1], 2, validate, &gp, &gv); + return 2; + + } else { + // if D<0, no solution + // if D=0, just grazing the surfaces, return kInfinity + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 0, validate, &gp, &gv); + return 0; + } + G4Exception("G4HyperbolicSurface::DistanceToSurface(p,v)", + "InvalidCondition", FatalException, "Illegal operation !"); + return 1; +} + + +//===================================================================== +//* DistanceToSurface ------------------------------------------------- + +G4int G4HyperbolicSurface::DistanceToSurface(const G4ThreeVector &gp, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[]) +{ + // Find the approximate distance of a point of a hyperbolic surface. + // The distance must be an underestimate. + // It will also be nice (although not necessary) that the estimate is + // always finite no matter how close the point is. + // + // We arranged G4Hype::ApproxDistOutside and G4Hype::ApproxDistInside + // for this function. See these discriptions. + + static const G4double halftol = 0.5 * kRadTolerance; + + fCurStat.ResetfDone(kDontValidate, &gp); + + if (fCurStat.IsDone()) { + for (G4int i=0; i r1 + halftol) { // p is outside of Hyperbolic surface + + // First point xx1 + G4double t = r1 / prho; + G4ThreeVector xx1(t * pabsz.x(), t * pabsz.y() , pz); + + // Second point xx2 + G4double z2 = (prho * fTanStereo + pz) / (1 + fTan2Stereo); + G4double r2 = sqrt(fR02 + z2 * z2 * fTan2Stereo); + t = r2 / prho; + G4ThreeVector xx2(t * pabsz.x(), t * pabsz.y() , z2); + + G4double len = (xx2 - xx1).mag(); + if (len < DBL_MIN) { + // xx2 = xx1?? I guess we + // must have really bracketed the normal + distance[0] = (pabsz - xx1).mag(); + xx = xx1; + } else { + distance[0] = DistanceToLine(pabsz, xx1, (xx2 - xx1) , xx); + } + + } else if (prho < r1 - halftol) { // p is inside of Hyperbolic surface. + + // First point xx1 + G4double t; + G4ThreeVector xx1; + if (prho < DBL_MIN) { + xx1.set(r1, 0. , pz); + } else { + t = r1 / prho; + xx1.set(t * pabsz.x(), t * pabsz.y() , pz); + } + + // dr, dz is tangential vector of Hyparbolic surface at xx1 + // dr = r, dz = z*tan2stereo + G4double dr = pz * fTan2Stereo; + G4double dz = r1; + G4double tanbeta = dr / dz; + G4double pztanbeta = pz * tanbeta; + + // Second point xx2 + // xx2 is intersection between x-axis and tangential vector + G4double r2 = r1 - pztanbeta; + G4ThreeVector xx2; + if (prho < DBL_MIN) { + xx2.set(r2, 0. , 0.); + } else { + t = r2 / prho; + xx2.set(t * pabsz.x(), t * pabsz.y() , 0.); + } + + G4ThreeVector d = xx2 - xx1; + distance[0] = DistanceToLine(pabsz, xx1, d, xx); + + } else { // p is on Hyperbolic surface. + + distance[0] = 0; + xx.set(p.x(), p.y(), pz); + + } + + if (p.z() < 0) { + G4ThreeVector tmpxx(xx.x(), xx.y(), -xx.z()); + xx = tmpxx; + } + + gxx[0] = ComputeGlobalPoint(xx); + areacode[0] = sInside; + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; +} + +//===================================================================== +//* GetAreaCode ------------------------------------------------------- + +G4int G4HyperbolicSurface::GetAreaCode(const G4ThreeVector &xx, + G4bool withTol) +{ + static const G4double ctol = 0.5 * kCarTolerance; + G4int areacode = sInside; + + if ((fAxis[0] == kPhi && fAxis[1] == kZAxis)) { + //G4int phiaxis = 0; + G4int zaxis = 1; + + if (withTol) { + + G4bool isoutside = false; + G4int phiareacode = GetAreaCodeInPhi(xx); + G4bool isoutsideinphi = IsOutside(phiareacode); + + // test boundary of phiaxis + + if ((phiareacode & sAxisMin) == sAxisMin) { + + areacode |= (sAxis0 & (sAxisPhi | sAxisMin)) | sBoundary; + if (isoutsideinphi) isoutside = true; + + } else if ((phiareacode & sAxisMax) == sAxisMax) { + + areacode |= (sAxis0 & (sAxisPhi | sAxisMax)) | sBoundary; + if (isoutsideinphi) isoutside = true; + + } + + // test boundary of zaxis + + if (xx.z() < fAxisMin[zaxis] + ctol) { + + areacode |= (sAxis1 & (sAxisZ | sAxisMin)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + if (xx.z() <= fAxisMin[zaxis] - ctol) isoutside = true; + + } else if (xx.z() > fAxisMax[zaxis] - ctol) { + + areacode |= (sAxis1 & (sAxisZ | sAxisMax)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + if (xx.z() >= fAxisMax[zaxis] + ctol) isoutside = true; + } + + // if isoutside = true, clear sInside bit. + // if not on boundary, add boundary information. + + if (isoutside) { + G4int tmpareacode = areacode & (~sInside); + areacode = tmpareacode; + } else if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisPhi) | (sAxis1 & sAxisZ); + } + + return areacode; + + } else { + + G4int phiareacode = GetAreaCodeInPhi(xx, false); + + // test boundary of z-axis + + if (xx.z() < fAxisMin[zaxis]) { + + areacode |= (sAxis1 & (sAxisZ | sAxisMin)) | sBoundary; + + } else if (xx.z() > fAxisMax[zaxis]) { + + areacode |= (sAxis1 & (sAxisZ | sAxisMax)) | sBoundary; + + } + + // boundary of phi-axis + + if (phiareacode == sAxisMin) { + + areacode |= (sAxis0 & (sAxisPhi | sAxisMin)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + } else if (phiareacode == sAxisMax) { + + areacode |= (sAxis0 & (sAxisPhi | sAxisMax)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + } + + // if not on boundary, add boundary information. + + if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisPhi) | (sAxis1 & sAxisZ); + } + return areacode; + } + } else { + G4cerr << "ERROR - G4HyperbolicSurface::GetAreaCode()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4HyperbolicSurface::GetAreaCode()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } + return areacode; +} + +//===================================================================== +//* GetAreaCodeInPhi -------------------------------------------------- + +G4int G4HyperbolicSurface::GetAreaCodeInPhi(const G4ThreeVector &xx, + G4bool withTol) +{ + + G4ThreeVector lowerlimit; // lower phi-boundary limit at z = xx.z() + G4ThreeVector upperlimit; // upper phi-boundary limit at z = xx.z() + lowerlimit = GetBoundaryAtPZ(sAxis0 & sAxisMin, xx); + upperlimit = GetBoundaryAtPZ(sAxis0 & sAxisMax, xx); + + G4int areacode = sInside; + G4bool isoutside = false; + + if (withTol) { + + if (AmIOnLeftSide(xx, lowerlimit) >= 0) { // xx is on lowerlimit + areacode |= (sAxisMin | sBoundary); + if (AmIOnLeftSide(xx, lowerlimit) > 0) isoutside = true; + + } else if (AmIOnLeftSide(xx, upperlimit) <= 0) { // xx is on upperlimit + areacode |= (sAxisMax | sBoundary); + if (AmIOnLeftSide(xx, upperlimit) < 0) isoutside = true; + } + + // if isoutside = true, clear inside bit. + + if (isoutside) { + G4int tmpareacode = areacode & (~sInside); + areacode = tmpareacode; + } + + + } else { + + if (AmIOnLeftSide(xx, lowerlimit, false) >= 0) { + areacode |= (sAxisMin | sBoundary); + } else if (AmIOnLeftSide(xx, upperlimit, false) <= 0) { + areacode |= (sAxisMax | sBoundary); + } + } + + return areacode; + +} + +//===================================================================== +//* SetCorners(EndInnerRadius, EndOuterRadius,DPhi,EndPhi,EndZ) ------- + +void G4HyperbolicSurface::SetCorners( + G4double EndInnerRadius[2], + G4double EndOuterRadius[2], + G4double DPhi, + G4double endPhi[2], + G4double endZ[2] + ) +{ + // Set Corner points in local coodinate. + + if (fAxis[0] == kPhi && fAxis[1] == kZAxis) { + + G4int i; + G4double endRad[2]; + G4double halfdphi = 0.5*DPhi; + + for (i=0; i<2; i++) { // i=0,1 : -ve z, +ve z + endRad[i] = (fHandedness == 1 ? EndOuterRadius[i] + : EndInnerRadius[i]); + } + + G4int zmin = 0 ; // at -ve z + G4int zmax = 1 ; // at +ve z + + G4double x, y, z; + + // corner of Axis0min and Axis1min + x = endRad[zmin]*cos(endPhi[zmin] - halfdphi); + y = endRad[zmin]*sin(endPhi[zmin] - halfdphi); + z = endZ[zmin]; + SetCorner(sCMin1Min, x, y, z); + + // corner of Axis0max and Axis1min + x = endRad[zmin]*cos(endPhi[zmin] + halfdphi); + y = endRad[zmin]*sin(endPhi[zmin] + halfdphi); + z = endZ[zmin]; + SetCorner(sCMax1Min, x, y, z); + + // corner of Axis0max and Axis1max + x = endRad[zmax]*cos(endPhi[zmax] + halfdphi); + y = endRad[zmax]*sin(endPhi[zmax] + halfdphi); + z = endZ[zmax]; + SetCorner(sCMax1Max, x, y, z); + + // corner of Axis0min and Axis1max + x = endRad[zmax]*cos(endPhi[zmax] - halfdphi); + y = endRad[zmax]*sin(endPhi[zmax] - halfdphi); + z = endZ[zmax]; + SetCorner(sCMin1Max, x, y, z); + + } else { + G4cerr << "ERROR - G4FlatSurface::SetCorners()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4HyperbolicSurface::SetCorners()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } +} + + +//===================================================================== +//* SetCorners() ------------------------------------------------------ + +void G4HyperbolicSurface::SetCorners() +{ + G4Exception("G4HyperbolicSurface::SetCorners()", + "NotImplemented", FatalException, + "Method NOT implemented !"); +} + +//===================================================================== +//* SetBoundaries() --------------------------------------------------- + +void G4HyperbolicSurface::SetBoundaries() +{ + // Set direction-unit vector of phi-boundary-lines in local coodinate. + // sAxis0 must be kPhi. + // This fanction set lower phi-boundary and upper phi-boundary. + + if (fAxis[0] == kPhi && fAxis[1] == kZAxis) { + + G4ThreeVector direction; + // sAxis0 & sAxisMin + direction = GetCorner(sCMin1Max) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisPhi | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisZ); + + // sAxis0 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMax1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisPhi | sAxisMax), direction, + GetCorner(sCMax1Min), sAxisZ); + + // sAxis1 & sAxisMin + direction = GetCorner(sCMax1Min) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisZ | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisPhi); + + // sAxis1 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMin1Max); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisZ | sAxisMax), direction, + GetCorner(sCMin1Max), sAxisPhi); + } else { + G4cerr << "ERROR - G4HyperbolicSurface::SetBoundaries()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4HyperbolicSurface::SetBoundaries()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } +} diff --git a/source/geometry/solids/specific/src/G4TwistedSurface.cc b/source/geometry/solids/specific/src/G4TwistedSurface.cc new file mode 100644 index 0000000000..6506a74434 --- /dev/null +++ b/source/geometry/solids/specific/src/G4TwistedSurface.cc @@ -0,0 +1,949 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4TwistedSurface.cc,v 1.6 2004/06/07 08:46:38 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class source file +// +// +// G4TwistedSurface.cc +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +#include "G4TwistedSurface.hh" + +//===================================================================== +//* constructors ------------------------------------------------------ + +G4TwistedSurface::G4TwistedSurface(const G4String &name, + const G4RotationMatrix &rot, + const G4ThreeVector &tlate, + G4int handedness, + const G4double kappa, + const EAxis axis0, + const EAxis axis1, + G4double axis0min, + G4double axis1min, + G4double axis0max, + G4double axis1max) + : G4VSurface(name, rot, tlate, handedness, axis0, axis1, + axis0min, axis1min, axis0max, axis1max), + fKappa(kappa) +{ + if (axis0 == kZAxis && axis1 == kXAxis) { + G4Exception("G4TwistedSurface::G4TwistedSurface()", "InvalidSetup", + FatalException, "Should swap axis0 and axis1!"); + } + fIsValidNorm = false; + SetCorners(); + SetBoundaries(); +} + +G4TwistedSurface::G4TwistedSurface(const G4String &name, + G4double EndInnerRadius[2], + G4double EndOuterRadius[2], + G4double DPhi, + G4double EndPhi[2], + G4double EndZ[2], + G4double InnerRadius, + G4double OuterRadius, + G4double Kappa, + G4int handedness) + : G4VSurface(name) +{ + fHandedness = handedness; // +z = +ve, -z = -ve + fAxis[0] = kXAxis; // in local coordinate system + fAxis[1] = kZAxis; + fAxisMin[0] = InnerRadius; // Inner-hype radius at z=0 + fAxisMax[0] = OuterRadius; // Outer-hype radius at z=0 + fAxisMin[1] = EndZ[0]; + fAxisMax[1] = EndZ[1]; + + fKappa = Kappa; + fRot.rotateZ( fHandedness > 0 + ? -0.5*DPhi + : 0.5*DPhi ); + fTrans.set(0, 0, 0); + fIsValidNorm = false; + + SetCorners( EndInnerRadius, EndOuterRadius, EndPhi, EndZ) ; + SetBoundaries(); +} + + + +//===================================================================== +//* destructor -------------------------------------------------------- + +G4TwistedSurface::~G4TwistedSurface() +{ +} + +//===================================================================== +//* GetNormal --------------------------------------------------------- + +G4ThreeVector G4TwistedSurface::GetNormal(const G4ThreeVector &tmpxx, + G4bool isGlobal) +{ + // GetNormal returns a normal vector at a surface (or very close + // to surface) point at tmpxx. + // If isGlobal=true, it returns the normal in global coordinate. + // + G4ThreeVector xx; + if (isGlobal) { + xx = ComputeLocalPoint(tmpxx); + if ((xx - fCurrentNormal.p).mag() < 0.5 * kCarTolerance) { + return ComputeGlobalDirection(fCurrentNormal.normal); + } + } else { + xx = tmpxx; + if (xx == fCurrentNormal.p) { + return fCurrentNormal.normal; + } + } + + G4ThreeVector er(1, fKappa * xx.z(), 0); + G4ThreeVector ez(0, fKappa * xx.x(), 1); + G4ThreeVector normal = fHandedness*(er.cross(ez)); + + if (isGlobal) { + fCurrentNormal.normal = ComputeGlobalDirection(normal.unit()); + } else { + fCurrentNormal.normal = normal.unit(); + } + return fCurrentNormal.normal; +} + +//===================================================================== +//* DistanceToSurface ------------------------------------------------- + +G4int G4TwistedSurface::DistanceToSurface(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[], + G4bool isvalid[], + EValidate validate) +{ + // Coordinate system: + // + // The coordinate system is so chosen that the intersection of + // the twisted surface with the z=0 plane coincides with the + // x-axis. + // Rotation matrix from this coordinate system (local system) + // to global system is saved in fRot field. + // So the (global) particle position and (global) velocity vectors, + // p and v, should be rotated fRot.inverse() in order to convert + // to local vectors. + // + // Equation of a twisted surface: + // + // x(rho(z=0), z) = rho(z=0) + // y(rho(z=0), z) = rho(z=0)*K*z + // z(rho(z=0), z) = z + // with + // K = tan(fPhiTwist/2)/fZHalfLen + // + // Equation of a line: + // + // gxx = p + t*v + // with + // p = fRot.inverse()*gp + // v = fRot.inverse()*gv + // + // Solution for intersection: + // + // Required time for crossing is given by solving the + // following quadratic equation: + // + // a*t^2 + b*t + c = 0 + // + // where + // + // a = K*v_x*v_z + // b = K*(v_x*p_z + v_z*p_x) - v_y + // c = K*p_x*p_z - p_y + // + // Out of the possible two solutions you must choose + // the one that gives a positive rho(z=0). + // + // + + fCurStatWithV.ResetfDone(validate, &gp, &gv); + + if (fCurStatWithV.IsDone()) { + G4int i; + for (i=0; i DBL_MIN) { + + // single solution + + distance[0] = - c / b; + xx[0] = p + distance[0]*v; + gxx[0] = ComputeGlobalPoint(xx[0]); + + if (validate == kValidateWithTol) { + areacode[0] = GetAreaCode(xx[0]); + if (!IsOutside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else if (validate == kValidateWithoutTol) { + areacode[0] = GetAreaCode(xx[0], false); + if (IsInside(areacode[0])) { + if (distance[0] >= 0) isvalid[0] = true; + } + } else { // kDontValidate + // we must omit x(rho,z) = rho(z=0) < 0 + if (xx[0].x() > 0) { + areacode[0] = sInside; + if (distance[0] >= 0) isvalid[0] = true; + } else { + distance[0] = kInfinity; + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], + areacode[0], isvalid[0], + 0, validate, &gp, &gv); + return 0; + } + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 1, validate, &gp, &gv); + return 1; + + } else { + // if a=b=0 , v.y=0 and (v.x=0 && p.x=0) or (v.z=0 && p.z=0) . + // if v.x=0 && p.x=0, no intersection unless p is on z-axis + // (in that case, v is paralell to surface). + // if v.z=0 && p.z=0, no intersection unless p is on x-axis + // (in that case, v is paralell to surface). + // return distance = infinity. + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 0, validate, &gp, &gv); + + return 0; + } + + } else if (D > DBL_MIN) { + + // double solutions + + D = sqrt(D); + G4double factor = 0.5/a; + G4double tmpdist[2] = {kInfinity, kInfinity}; + G4ThreeVector tmpxx[2]; + G4int tmpareacode[2] = {sOutside, sOutside}; + G4bool tmpisvalid[2] = {false, false}; + G4int i; + + for (i=0; i<2; i++) { + G4double bminusD = - b - D; + + // protection against round off error + //G4double protection = 1.0e-6; + G4double protection = 0; + if ( b * D < 0 && fabs(bminusD / D) < protection ) { + G4double acovbb = (a*c)/(b*b); + tmpdist[i] = - c/b * ( 1 - acovbb * (1 + 2*acovbb)); + } else { + tmpdist[i] = factor * bminusD; + } + + D = -D; + tmpxx[i] = p + tmpdist[i]*v; + + if (validate == kValidateWithTol) { + tmpareacode[i] = GetAreaCode(tmpxx[i]); + if (!IsOutside(tmpareacode[i])) { + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } + } else if (validate == kValidateWithoutTol) { + tmpareacode[i] = GetAreaCode(tmpxx[i], false); + if (IsInside(tmpareacode[i])) { + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } + } else { // kDontValidate + // we must choose x(rho,z) = rho(z=0) > 0 + if (tmpxx[i].x() > 0) { + tmpareacode[i] = sInside; + if (tmpdist[i] >= 0) tmpisvalid[i] = true; + continue; + } else { + tmpdist[i] = kInfinity; + continue; + } + } + } + + if (tmpdist[0] <= tmpdist[1]) { + distance[0] = tmpdist[0]; + distance[1] = tmpdist[1]; + xx[0] = tmpxx[0]; + xx[1] = tmpxx[1]; + gxx[0] = ComputeGlobalPoint(tmpxx[0]); + gxx[1] = ComputeGlobalPoint(tmpxx[1]); + areacode[0] = tmpareacode[0]; + areacode[1] = tmpareacode[1]; + isvalid[0] = tmpisvalid[0]; + isvalid[1] = tmpisvalid[1]; + } else { + distance[0] = tmpdist[1]; + distance[1] = tmpdist[0]; + xx[0] = tmpxx[1]; + xx[1] = tmpxx[0]; + gxx[0] = ComputeGlobalPoint(tmpxx[1]); + gxx[1] = ComputeGlobalPoint(tmpxx[0]); + areacode[0] = tmpareacode[1]; + areacode[1] = tmpareacode[0]; + isvalid[0] = tmpisvalid[1]; + isvalid[1] = tmpisvalid[0]; + } + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 2, validate, &gp, &gv); + fCurStatWithV.SetCurrentStatus(1, gxx[1], distance[1], areacode[1], + isvalid[1], 2, validate, &gp, &gv); + + // protection against roundoff error + + for (G4int k=0; k<2; k++) { + if (!isvalid[k]) continue; + + G4ThreeVector xxonsurface(xx[k].x(), fKappa * fabs(xx[k].x()) + * xx[k].z() , xx[k].z()); + G4double deltaY = (xx[k] - xxonsurface).mag(); + + if ( deltaY > 0.5*kCarTolerance ) { + + G4int maxcount = 10; + G4int l; + G4double lastdeltaY = deltaY; + G4ThreeVector last = deltaY; + for (l=0; l lastdeltaY) { + + } + gxx[k] = ComputeGlobalPoint(xx[k]); + + if (deltaY <= 0.5*kCarTolerance) { + + break; + } + xxonsurface.set(xx[k].x(), + fKappa * fabs(xx[k].x()) * xx[k].z(), + xx[k].z()); + } + if (l == maxcount) { + G4cerr << "ERROR - G4TwistedSurface::DistanceToSurface(p,v)" + << G4endl + << " maxloop count " << maxcount << G4endl; + G4Exception("G4FlatSurface::DistanceToSurface(p,v)", + "InvalidSetup", FatalException, + "Exceeded maxloop count!"); + } + } + + } + return 2; + } else { + // if D<0, no solution + // if D=0, just grazing the surfaces, return kInfinity + + fCurStatWithV.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid[0], 0, validate, &gp, &gv); + + return 0; + } + G4Exception("G4TwistedSurface::DistanceToSurface(p,v)", + "InvalidCondition", FatalException, "Illegal operation !"); + return 1; +} + +//===================================================================== +//* DistanceToSurface ------------------------------------------------- + +G4int G4TwistedSurface::DistanceToSurface(const G4ThreeVector &gp, + G4ThreeVector gxx[], + G4double distance[], + G4int areacode[]) +{ + fCurStat.ResetfDone(kDontValidate, &gp); + G4int i = 0; + if (fCurStat.IsDone()) { + for (i=0; i= 0 ? 1 : -1); + + // + // special case! + // If p is on surface, or + // p is on z-axis, + // return here immediatery. + // + + G4ThreeVector lastgxx[2]; + G4double distfromlast[2]; + for (i=0; i<2; i++) { + lastgxx[i] = fCurStatWithV.GetXX(i); + distfromlast[i] = (gp - lastgxx[i]).mag(); + } + + if ((gp - lastgxx[0]).mag() < halftol + || (gp - lastgxx[1]).mag() < halftol) { + // last winner, or last poststep point is on the surface. + xx = p; + distance[0] = 0; + gxx[0] = gp; + + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; + } + + if (p.getRho() == 0) { + // p is on z-axis. Namely, p is on twisted surface (invalid area). + // We must return here, however, returning distance to x-minimum + // boundary is better than return 0-distance. + // + G4bool isvalid = true; + if (fAxis[0] == kXAxis && fAxis[1] == kZAxis) { + distance[0] = DistanceToBoundary(sAxis0 & sAxisMin, xx, p); + areacode[0] = sInside; + } else { + distance[0] = 0; + xx.set(0., 0., 0.); + } + gxx[0] = ComputeGlobalPoint(xx); + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 0, kDontValidate, &gp); + return 1; + } + + // + // special case end + // + + // set corner points of quadrangle try area ... + + G4ThreeVector A; // foot of normal from p to boundary of sAxis0 & sAxisMin + G4ThreeVector C; // foot of normal from p to boundary of sAxis0 & sAxisMax + G4ThreeVector B; // point on boundary sAxis0 & sAxisMax at z = A.z() + G4ThreeVector D; // point on boundary sAxis0 & sAxisMin at z = C.z() + G4double distToA; // distance from p to A + G4double distToC; // distance from p to C + + distToA = DistanceToBoundary(sAxis0 & sAxisMin, A, p); + distToC = DistanceToBoundary(sAxis0 & sAxisMax, C, p); + + // is p.z between a.z and c.z? + // p.z must be bracketed a.z and c.z. + if (A.z() > C.z()) { + if (p.z() > A.z()) { + A = GetBoundaryAtPZ(sAxis0 & sAxisMin, p); + } else if (p.z() < C.z()) { + C = GetBoundaryAtPZ(sAxis0 & sAxisMax, p); + } + } else { + if (p.z() > C.z()) { + C = GetBoundaryAtPZ(sAxis0 & sAxisMax, p); + } else if (p.z() < A.z()) { + A = GetBoundaryAtPZ(sAxis0 & sAxisMin, p); + } + } + + G4ThreeVector d[2]; // direction vectors of boundary + G4ThreeVector x0[2]; // foot of normal from line to p + G4int btype[2]; // boundary type + + for (i=0; i<2; i++) { + if (i == 0) { + GetBoundaryParameters((sAxis0 & sAxisMax), d[i], x0[i], btype[i]); + B = x0[i] + ((A.z() - x0[i].z()) / d[i].z()) * d[i]; + // x0 + t*d , d is direction unit vector. + } else { + GetBoundaryParameters((sAxis0 & sAxisMin), d[i], x0[i], btype[i]); + D = x0[i] + ((C.z() - x0[i].z()) / d[i].z()) * d[i]; + } + } + + // In order to set correct diagonal, swap A and D, C and B if needed. + G4ThreeVector pt(p.x(), p.y(), 0.); + G4double rc = fabs(p.x()); + G4ThreeVector surfacevector(rc, rc * fKappa * p.z(), 0.); + G4int pside = AmIOnLeftSide(pt, surfacevector); + G4double test = (A.z() - C.z()) * parity * pside; + + if (test == 0) { + if (pside == 0) { + // p is on surface. + xx = p; + distance[0] = 0; + gxx[0] = gp; + + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; + } else { + // A.z = C.z(). return distance to line. + d[0] = C - A; + distance[0] = DistanceToLine(p, A, d[0], xx); + areacode[0] = sInside; + gxx[0] = ComputeGlobalPoint(xx); + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; + } + + } else if (test < 0) { + + // wrong diagonal. vector AC is crossing the surface! + // swap A and D, C and B + G4ThreeVector tmp; + tmp = A; + A = D; + D = tmp; + tmp = C; + C = B; + B = tmp; + + } else { + // correct diagonal. nothing to do. + } + + // Now, we chose correct diaglnal. + // First try. divide quadrangle into double triangle by diagonal and + // calculate distance to both surfaces. + + G4ThreeVector xxacb; // foot of normal from plane ACB to p + G4ThreeVector nacb; // normal of plane ACD + G4ThreeVector xxcad; // foot of normal from plane CAD to p + G4ThreeVector ncad; // normal of plane CAD + G4ThreeVector AB(A.x(), A.y(), 0); + G4ThreeVector DC(C.x(), C.y(), 0); + + G4double distToACB = G4VSurface::DistanceToPlane(p, A, C-A, AB, xxacb, nacb) * parity; + G4double distToCAD = G4VSurface::DistanceToPlane(p, C, C-A, DC, xxcad, ncad) * parity; + + // if calculated distance = 0, return + + if (fabs(distToACB) <= halftol || fabs(distToCAD) <= halftol) { + xx = (fabs(distToACB) < fabs(distToCAD) ? xxacb : xxcad); + areacode[0] = sInside; + gxx[0] = ComputeGlobalPoint(xx); + distance[0] = 0; + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0] , areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; + } + + if (distToACB * distToCAD > 0 && distToACB < 0) { + // both distToACB and distToCAD are negative. + // divide quadrangle into double triangle by diagonal + G4ThreeVector normal; + distance[0] = DistanceToPlane(p, A, B, C, D, parity, xx, normal); + } else { + if (distToACB * distToCAD > 0) { + // both distToACB and distToCAD are positive. + // Take smaller one. + if (distToACB <= distToCAD) { + distance[0] = distToACB; + xx = xxacb; + } else { + distance[0] = distToCAD; + xx = xxcad; + } + } else { + // distToACB * distToCAD is negative. + // take positive one + if (distToACB > 0) { + distance[0] = distToACB; + xx = xxacb; + } else { + distance[0] = distToCAD; + xx = xxcad; + } + } + + } + areacode[0] = sInside; + gxx[0] = ComputeGlobalPoint(xx); + G4bool isvalid = true; + fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0], + isvalid, 1, kDontValidate, &gp); + return 1; +} + +//===================================================================== +//* DistanceToPlane --------------------------------------------------- + +G4double G4TwistedSurface::DistanceToPlane(const G4ThreeVector &p, + const G4ThreeVector &A, + const G4ThreeVector &B, + const G4ThreeVector &C, + const G4ThreeVector &D, + const G4int parity, + G4ThreeVector &xx, + G4ThreeVector &n) +{ + static const G4double halftol = 0.5 * kCarTolerance; + + G4ThreeVector M = 0.5*(A + B); + G4ThreeVector N = 0.5*(C + D); + G4ThreeVector xxanm; // foot of normal from p to plane ANM + G4ThreeVector nanm; // normal of plane ANM + G4ThreeVector xxcmn; // foot of normal from p to plane CMN + G4ThreeVector ncmn; // normal of plane CMN + + G4double distToanm = G4VSurface::DistanceToPlane(p, A, (N - A), (M - A), xxanm, nanm) * parity; + G4double distTocmn = G4VSurface::DistanceToPlane(p, C, (M - C), (N - C), xxcmn, ncmn) * parity; + + // if p is behind of both surfaces, abort. + if (distToanm * distTocmn > 0 && distToanm < 0) { + G4Exception("G4TwistedSurface::DistanceToPlane()", + "InvalidCondition", FatalException, + "Point p is behind the surfaces."); + } + + // if p is on surface, return 0. + if (fabs(distToanm) <= halftol) { + xx = xxanm; + n = nanm * parity; + return 0; + } else if (fabs(distTocmn) <= halftol) { + xx = xxcmn; + n = ncmn * parity; + return 0; + } + + if (distToanm <= distTocmn) { + if (distToanm > 0) { + // both distanses are positive. take smaller one. + xx = xxanm; + n = nanm * parity; + return distToanm; + } else { + // take -ve distance and call the function recursively. + return DistanceToPlane(p, A, M, N, D, parity, xx, n); + } + } else { + if (distTocmn > 0) { + // both distanses are positive. take smaller one. + xx = xxcmn; + n = ncmn * parity; + return distTocmn; + } else { + // take -ve distance and call the function recursively. + return DistanceToPlane(p, C, N, M, B, parity, xx, n); + } + } +} + +//===================================================================== +//* GetAreaCode ------------------------------------------------------- + +G4int G4TwistedSurface::GetAreaCode(const G4ThreeVector &xx, + G4bool withTol) +{ + // We must use the function in local coordinate system. + // See the description of DistanceToSurface(p,v). + + static const G4double ctol = 0.5 * kCarTolerance; + G4int areacode = sInside; + + if (fAxis[0] == kXAxis && fAxis[1] == kZAxis) { + G4int xaxis = 0; + G4int zaxis = 1; + + if (withTol) { + + G4bool isoutside = false; + + // test boundary of xaxis + + if (xx.x() < fAxisMin[xaxis] + ctol) { + areacode |= (sAxis0 & (sAxisX | sAxisMin)) | sBoundary; + if (xx.x() <= fAxisMin[xaxis] - ctol) isoutside = true; + + } else if (xx.x() > fAxisMax[xaxis] - ctol) { + areacode |= (sAxis0 & (sAxisX | sAxisMax)) | sBoundary; + if (xx.x() >= fAxisMin[xaxis] + ctol) isoutside = true; + } + + // test boundary of z-axis + + if (xx.z() < fAxisMin[zaxis] + ctol) { + areacode |= (sAxis1 & (sAxisZ | sAxisMin)); + + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + if (xx.z() <= fAxisMin[zaxis] - ctol) isoutside = true; + + } else if (xx.z() > fAxisMax[zaxis] - ctol) { + areacode |= (sAxis1 & (sAxisZ | sAxisMax)); + + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + if (xx.z() >= fAxisMax[zaxis] + ctol) isoutside = true; + } + + // if isoutside = true, clear inside bit. + // if not on boundary, add axis information. + + if (isoutside) { + G4int tmpareacode = areacode & (~sInside); + areacode = tmpareacode; + } else if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisX) | (sAxis1 & sAxisZ); + } + + } else { + + // boundary of x-axis + + if (xx.x() < fAxisMin[xaxis] ) { + areacode |= (sAxis0 & (sAxisX | sAxisMin)) | sBoundary; + } else if (xx.x() > fAxisMax[xaxis]) { + areacode |= (sAxis0 & (sAxisX | sAxisMax)) | sBoundary; + } + + // boundary of z-axis + + if (xx.z() < fAxisMin[zaxis]) { + areacode |= (sAxis1 & (sAxisZ | sAxisMin)); + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + + } else if (xx.z() > fAxisMax[zaxis]) { + areacode |= (sAxis1 & (sAxisZ | sAxisMax)) ; + if (areacode & sBoundary) areacode |= sCorner; // xx is on the corner. + else areacode |= sBoundary; + } + + if ((areacode & sBoundary) != sBoundary) { + areacode |= (sAxis0 & sAxisX) | (sAxis1 & sAxisZ); + } + } + return areacode; + } else { + G4Exception("G4TwistedSurface::GetAreaCode()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } + return areacode; +} + +//===================================================================== +//* SetCorners( arglist ) ------------------------------------------------- + +void G4TwistedSurface::SetCorners( + G4double endInnerRad[2], + G4double endOuterRad[2], + G4double endPhi[2], + G4double endZ[2]) +{ + // Set Corner points in local coodinate. + + if (fAxis[0] == kXAxis && fAxis[1] == kZAxis) { + + G4int zmin = 0 ; // at -ve z + G4int zmax = 1 ; // at +ve z + + G4double x, y, z; + + // corner of Axis0min and Axis1min + x = endInnerRad[zmin]*cos(endPhi[zmin]); + y = endInnerRad[zmin]*sin(endPhi[zmin]); + z = endZ[zmin]; + SetCorner(sCMin1Min, x, y, z); + + // corner of Axis0max and Axis1min + x = endOuterRad[zmin]*cos(endPhi[zmin]); + y = endOuterRad[zmin]*sin(endPhi[zmin]); + z = endZ[zmin]; + SetCorner(sCMax1Min, x, y, z); + + // corner of Axis0max and Axis1max + x = endOuterRad[zmax]*cos(endPhi[zmax]); + y = endOuterRad[zmax]*sin(endPhi[zmax]); + z = endZ[zmax]; + SetCorner(sCMax1Max, x, y, z); + + // corner of Axis0min and Axis1max + x = endInnerRad[zmax]*cos(endPhi[zmax]); + y = endInnerRad[zmax]*sin(endPhi[zmax]); + z = endZ[zmax]; + SetCorner(sCMin1Max, x, y, z); + + } else { + G4cerr << "ERROR - G4FlatSurface::SetCorners()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4TwistedSurface::SetCorners()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } +} + + + + +//===================================================================== +//* SetCorners() ------------------------------------------------------ + +void G4TwistedSurface::SetCorners() +{ + G4Exception("G4TwistedSurface::SetCorners()", + "NotImplemented", FatalException, + "Method NOT implemented !"); +} + +//===================================================================== +//* SetBoundaries() --------------------------------------------------- + +void G4TwistedSurface::SetBoundaries() +{ + // Set direction-unit vector of boundary-lines in local coodinate. + // + G4ThreeVector direction; + + if (fAxis[0] == kXAxis && fAxis[1] == kZAxis) { + + // sAxis0 & sAxisMin + direction = GetCorner(sCMin1Max) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisX | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisZ) ; + + // sAxis0 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMax1Min); + direction = direction.unit(); + SetBoundary(sAxis0 & (sAxisX | sAxisMax), direction, + GetCorner(sCMax1Min), sAxisZ); + + // sAxis1 & sAxisMin + direction = GetCorner(sCMax1Min) - GetCorner(sCMin1Min); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisZ | sAxisMin), direction, + GetCorner(sCMin1Min), sAxisX); + + // sAxis1 & sAxisMax + direction = GetCorner(sCMax1Max) - GetCorner(sCMin1Max); + direction = direction.unit(); + SetBoundary(sAxis1 & (sAxisZ | sAxisMax), direction, + GetCorner(sCMin1Max), sAxisX); + + } else { + G4cerr << "ERROR - G4FlatSurface::SetBoundaries()" << G4endl + << " fAxis[0] = " << fAxis[0] << G4endl + << " fAxis[1] = " << fAxis[1] << G4endl; + G4Exception("G4TwistedSurface::SetCorners()", + "NotImplemented", FatalException, + "Feature NOT implemented !"); + } +} + diff --git a/source/geometry/solids/specific/src/G4TwistedTubs.cc b/source/geometry/solids/specific/src/G4TwistedTubs.cc new file mode 100644 index 0000000000..d3f3c843e6 --- /dev/null +++ b/source/geometry/solids/specific/src/G4TwistedTubs.cc @@ -0,0 +1,1013 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4TwistedTubs.cc,v 1.5 2004/05/28 13:13:37 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class source file +// +// +// G4TwistedSurface.cc +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +#include "G4TwistedTubs.hh" + +#include "G4VoxelLimits.hh" +#include "G4AffineTransform.hh" +#include "G4SolidExtentList.hh" +#include "G4ClippablePolygon.hh" +#include "G4VPVParameterisation.hh" +#include "meshdefs.hh" + +#include "G4VGraphicsScene.hh" +#include "G4Polyhedron.hh" +#include "G4VisExtent.hh" +#include "G4NURBS.hh" +#include "G4NURBStube.hh" +#include "G4NURBScylinder.hh" +#include "G4NURBStubesector.hh" + +//===================================================================== +//* constructors ------------------------------------------------------ + +G4TwistedTubs::G4TwistedTubs(const G4String &pname, + G4double twistedangle, + G4double endinnerrad, + G4double endouterrad, + G4double halfzlen, + G4double dphi) + : G4VSolid(pname), fDPhi(dphi), + fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), + fFormerTwisted(0), fInnerHype(0), fOuterHype(0) +{ + if (endinnerrad < DBL_MIN) { + G4Exception("G4TwistedTubs::G4TwistedTubs()", "InvalidSetup", + FatalException, "Invalid end-inner-radius!"); + } + + G4double sinhalftwist = sin(0.5 * twistedangle); + + G4double endinnerradX = endinnerrad * sinhalftwist; + G4double innerrad = sqrt( endinnerrad * endinnerrad + - endinnerradX * endinnerradX ); + + G4double endouterradX = endouterrad * sinhalftwist; + G4double outerrad = sqrt( endouterrad * endouterrad + - endouterradX * endouterradX ); + + // temporary treatment!! + SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen); + CreateSurfaces(); + + +} + +G4TwistedTubs::G4TwistedTubs(const G4String &pname, + G4double twistedangle, + G4double endinnerrad, + G4double endouterrad, + G4double halfzlen, + G4int nseg, + G4double totphi) + :G4VSolid(pname), + fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), + fFormerTwisted(0), fInnerHype(0), fOuterHype(0) +{ + + if (!nseg) G4cerr << "ERROR - G4TwistedTubs::G4TwistedTubs()" << G4endl + << " Invalid nseg. nseg = " << nseg << G4endl; + if (totphi == DBL_MIN || endinnerrad < DBL_MIN) { + G4Exception("G4TwistedTubs::G4TwistedTubs()", "InvalidSetup", + FatalException, "Invalid total-phi or end-inner-radius!"); + } + + G4double sinhalftwist = sin(0.5 * twistedangle); + + G4double endinnerradX = endinnerrad * sinhalftwist; + G4double innerrad = sqrt( endinnerrad * endinnerrad + - endinnerradX * endinnerradX ); + + G4double endouterradX = endouterrad * sinhalftwist; + G4double outerrad = sqrt( endouterrad * endouterrad + - endouterradX * endouterradX ); + + // temporary treatment!! + fDPhi = totphi / nseg; + SetFields(twistedangle, innerrad, outerrad, -halfzlen, halfzlen); + CreateSurfaces(); +} + +G4TwistedTubs::G4TwistedTubs(const G4String &pname, + G4double twistedangle, + G4double innerrad, + G4double outerrad, + G4double negativeEndz, + G4double positiveEndz, + G4double dphi) + : G4VSolid(pname), fDPhi(dphi), + fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), + fFormerTwisted(0), fInnerHype(0), fOuterHype(0) +{ + if (innerrad < DBL_MIN) { + G4Exception("G4TwistedTubs::G4TwistedTubs()", "InvalidSetup", + FatalException, "Invalid end-inner-radius!"); + } + + SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz); + CreateSurfaces(); +} + +G4TwistedTubs::G4TwistedTubs(const G4String &pname, + G4double twistedangle, + G4double innerrad, + G4double outerrad, + G4double negativeEndz, + G4double positiveEndz, + G4int nseg, + G4double totphi) + :G4VSolid(pname), + fLowerEndcap(0), fUpperEndcap(0), fLatterTwisted(0), + fFormerTwisted(0), fInnerHype(0), fOuterHype(0) +{ + if (!nseg) G4cerr << "ERROR - G4TwistedTubs::G4TwistedTubs()" << G4endl + << " Invalid nseg. nseg = " << nseg << G4endl; + if (totphi == DBL_MIN || innerrad < DBL_MIN) { + G4Exception("G4TwistedTubs::G4TwistedTubs()", "InvalidSetup", + FatalException, "Invalid total-phi or end-inner-radius!"); + } + + fDPhi = totphi / nseg; + SetFields(twistedangle, innerrad, outerrad, negativeEndz, positiveEndz); + CreateSurfaces(); +} + +//===================================================================== +//* destructor -------------------------------------------------------- + +G4TwistedTubs::~G4TwistedTubs() +{ + if (fLowerEndcap) delete fLowerEndcap; + if (fUpperEndcap) delete fUpperEndcap; + if (fLatterTwisted) delete fLatterTwisted; + if (fFormerTwisted) delete fFormerTwisted; + if (fInnerHype) delete fInnerHype; + if (fOuterHype) delete fOuterHype; +} + +//===================================================================== +//* ComputeDimensions ------------------------------------------------- + +void G4TwistedTubs::ComputeDimensions(G4VPVParameterisation* /* p */ , + const G4int /* n */ , + const G4VPhysicalVolume* /* pRep */ ) +{ + G4Exception("G4TwistedTubs::ComputeDimensions()", + "NotSupported", FatalException, + "G4TwistedTubs does not support Parameterisation."); +} + + +//===================================================================== +//* CalculateExtent --------------------------------------------------- + +G4bool G4TwistedTubs::CalculateExtent( const EAxis axis, + const G4VoxelLimits &voxelLimit, + const G4AffineTransform &transform, + G4double &min, + G4double &max ) const +{ + + G4SolidExtentList extentList( axis, voxelLimit ); + G4double maxEndOuterRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? + fEndOuterRadius[0] : fEndOuterRadius[1]); + G4double maxEndInnerRad = (fEndInnerRadius[0] > fEndInnerRadius[1] ? + fEndInnerRadius[0] : fEndInnerRadius[1]); + G4double maxphi = (fabs(fEndPhi[0]) > fabs(fEndPhi[1]) ? + fabs(fEndPhi[0]) : fabs(fEndPhi[1])); + + // + // Choose phi size of our segment(s) based on constants as + // defined in meshdefs.hh + // + // G4int numPhi = kMaxMeshSections; + G4double sigPhi = 2*maxphi + fDPhi; + G4double rFudge = 1.0/cos(0.5*sigPhi); + G4double fudgeEndOuterRad = rFudge * maxEndOuterRad; + + // + // We work around in phi building polygons along the way. + // As a reasonable compromise between accuracy and + // complexity (=cpu time), the following facets are chosen: + // + // 1. If fOuterRadius/maxEndOuterRad > 0.95, approximate + // the outer surface as a cylinder, and use one + // rectangular polygon (0-1) to build its mesh. + // + // Otherwise, use two trapazoidal polygons that + // meet at z = 0 (0-4-1) + // + // 2. If there is no inner surface, then use one + // polygon for each entire endcap. (0) and (1) + // + // Otherwise, use a trapazoidal polygon for each + // phi segment of each endcap. (0-2) and (1-3) + // + // 3. For the inner surface, if fInnerRadius/maxEndInnerRad > 0.95, + // approximate the inner surface as a cylinder of + // radius fInnerRadius and use one rectangular polygon + // to build each phi segment of its mesh. (2-3) + // + // Otherwise, use one rectangular polygon centered + // at z = 0 (5-6) and two connecting trapazoidal polygons + // for each phi segment (2-5) and (3-6). + // + + G4bool splitOuter = (fOuterRadius/maxEndOuterRad < 0.95); + G4bool splitInner = (fInnerRadius/maxEndInnerRad < 0.95); + + // + // Vertex assignments (v and w arrays) + // [0] and [1] are mandatory + // the rest are optional + // + // + - + // [0]------[4]------[1] <--- outer radius + // | | + // | | + // [2]---[5]---[6]---[3] <--- inner radius + // + + G4ClippablePolygon endPoly1, endPoly2; + + G4double phimax = maxphi + 0.5*fDPhi; + G4double phimin = - phimax; + + G4ThreeVector v0, v1, v2, v3, v4, v5, v6; // -ve phi verticies for polygon + G4ThreeVector w0, w1, w2, w3, w4, w5, w6; // +ve phi verticies for polygon + + // + // decide verticies of -ve phi boundary + // + + G4double cosPhi = cos(phimin); + G4double sinPhi = sin(phimin); + + // Outer hyperbolic surface + + v0 = transform.TransformPoint( + G4ThreeVector(fudgeEndOuterRad * cosPhi, fudgeEndOuterRad * sinPhi, + + fZHalfLength)); + v1 = transform.TransformPoint( + G4ThreeVector(fudgeEndOuterRad * cosPhi, fudgeEndOuterRad * sinPhi, + - fZHalfLength)); + if (splitOuter) { + v4 = transform.TransformPoint( + G4ThreeVector(fudgeEndOuterRad * cosPhi, fudgeEndOuterRad * sinPhi, 0)); + } + + // Inner hyperbolic surface + + G4double zInnerSplit = 0.; + if (splitInner) { + + v2 = transform.TransformPoint( + G4ThreeVector(maxEndInnerRad * cosPhi, maxEndInnerRad * sinPhi, + + fZHalfLength)); + v3 = transform.TransformPoint( + G4ThreeVector(maxEndInnerRad * cosPhi, maxEndInnerRad * sinPhi, + - fZHalfLength)); + + // Find intersection of tangential line of inner + // surface at z = fZHalfLength and line r=fInnerRadius. + G4double dr = fZHalfLength * fTanInnerStereo2; + G4double dz = maxEndInnerRad; + zInnerSplit = fZHalfLength + (fInnerRadius - maxEndInnerRad) * dz / dr; + + // Build associated vertices + v5 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + + zInnerSplit)); + v6 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + - zInnerSplit)); + } else { + + v2 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + + fZHalfLength)); + v3 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + - fZHalfLength)); + } + + // + // decide vertices of +ve phi boundary + // + + cosPhi = cos(phimax); + sinPhi = sin(phimax); + + // Outer hyperbolic surface + + w0 = transform.TransformPoint( + G4ThreeVector(fudgeEndOuterRad * cosPhi, fudgeEndOuterRad * sinPhi, + + fZHalfLength)); + w1 = transform.TransformPoint( + G4ThreeVector(fudgeEndOuterRad * cosPhi, fudgeEndOuterRad * sinPhi, + - fZHalfLength)); + if (splitOuter) { + G4double r = rFudge*fOuterRadius; + + w4 = transform.TransformPoint(G4ThreeVector( r*cosPhi, r*sinPhi, 0 )); + + AddPolyToExtent( v0, v4, w4, w0, voxelLimit, axis, extentList ); + AddPolyToExtent( v4, v1, w1, w4, voxelLimit, axis, extentList ); + } else { + AddPolyToExtent( v0, v1, w1, w0, voxelLimit, axis, extentList ); + } + + // Inner hyperbolic surface + + if (splitInner) { + + w2 = transform.TransformPoint( + G4ThreeVector(maxEndInnerRad * cosPhi, maxEndInnerRad * sinPhi, + + fZHalfLength)); + w3 = transform.TransformPoint( + G4ThreeVector(maxEndInnerRad * cosPhi, maxEndInnerRad * sinPhi, + - fZHalfLength)); + + w5 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + + zInnerSplit)); + w6 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + - zInnerSplit)); + + AddPolyToExtent( v3, v6, w6, w3, voxelLimit, axis, extentList ); + AddPolyToExtent( v6, v5, w5, w6, voxelLimit, axis, extentList ); + AddPolyToExtent( v5, v2, w2, w5, voxelLimit, axis, extentList ); + + } else { + w2 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + + fZHalfLength)); + w3 = transform.TransformPoint( + G4ThreeVector(fInnerRadius * cosPhi, fInnerRadius * sinPhi, + - fZHalfLength)); + + AddPolyToExtent( v3, v2, w2, w3, voxelLimit, axis, extentList ); + } + + // + // Endplate segments + // + AddPolyToExtent( v1, v3, w3, w1, voxelLimit, axis, extentList ); + AddPolyToExtent( v2, v0, w0, w2, voxelLimit, axis, extentList ); + + // + // Return min/max value + // + return extentList.GetExtent( min, max ); +} + + +//===================================================================== +//* AddPolyToExtent --------------------------------------------------- + +void G4TwistedTubs::AddPolyToExtent( const G4ThreeVector &v0, + const G4ThreeVector &v1, + const G4ThreeVector &w1, + const G4ThreeVector &w0, + const G4VoxelLimits &voxelLimit, + const EAxis axis, + G4SolidExtentList &extentList ) +{ + // Utility function for CalculateExtent + // + G4ClippablePolygon phiPoly; + + phiPoly.AddVertexInOrder( v0 ); + phiPoly.AddVertexInOrder( v1 ); + phiPoly.AddVertexInOrder( w1 ); + phiPoly.AddVertexInOrder( w0 ); + + if (phiPoly.PartialClip( voxelLimit, axis )) { + phiPoly.SetNormal( (v1-v0).cross(w0-v0).unit() ); + extentList.AddSurface( phiPoly ); + } +} + + +//===================================================================== +//* Inside ------------------------------------------------------------ + +EInside G4TwistedTubs::Inside(const G4ThreeVector& p) const +{ + + static const G4double halftol = 0.5 * kRadTolerance; + // static G4int timerid = -1; + // G4Timer timer(timerid, "G4TwistedTubs", "Inside"); + // timer.Start(); + + + + G4ThreeVector *tmpp; + EInside *tmpinside; + if (fLastInside.p == p) { + + return fLastInside.inside; + + } else { + tmpp = const_cast(&(fLastInside.p)); + tmpinside = const_cast(&(fLastInside.inside)); + tmpp->set(p.x(), p.y(), p.z()); + } + + + EInside outerhypearea = ((G4HyperbolicSurface *)fOuterHype)->Inside(p); + G4double innerhyperho = ((G4HyperbolicSurface *)fInnerHype)->GetRhoAtPZ(p); + G4double distanceToOut = p.getRho() - innerhyperho; // +ve: inside + + if (outerhypearea == kOutside || distanceToOut < -halftol) { + *tmpinside = kOutside; + } else if (outerhypearea == kSurface) { + *tmpinside = kSurface; + } else { + if (distanceToOut <= halftol) { + *tmpinside = kSurface; + } else { + *tmpinside = kInside; + } + } + + return fLastInside.inside; + +} + +//===================================================================== +//* SurfaceNormal ----------------------------------------------------- + +G4ThreeVector G4TwistedTubs::SurfaceNormal(const G4ThreeVector& p) const +{ + // + // return the normal unit vector to the Hyperbolical Surface at a point + // p on (or nearly on) the surface + // + // Which of the three or four surfaces are we closest to? + // + + // static G4int timerid = -1; + // G4Timer timer(timerid, "G4TwistedTubs", "SurfaceNormal"); + // timer.Start(); + + + + + if (fLastNormal.p == p) { + + return fLastNormal.vec; + } + G4ThreeVector *tmpp = const_cast(&(fLastNormal.p)); + G4ThreeVector *tmpnormal = const_cast(&(fLastNormal.vec)); + G4VSurface **tmpsurface = const_cast(fLastNormal.surface); + tmpp->set(p.x(), p.y(), p.z()); + + G4double distance = kInfinity; + + G4VSurface *surfaces[6]; + surfaces[0] = fLatterTwisted; + surfaces[1] = fFormerTwisted; + surfaces[2] = fInnerHype; + surfaces[3] = fOuterHype; + surfaces[4] = fLowerEndcap; + surfaces[5] = fUpperEndcap; + + G4ThreeVector xx; + G4ThreeVector bestxx; + G4int i; + G4int besti = -1; + for (i=0; i< 6; i++) { + G4double tmpdistance = surfaces[i]->DistanceTo(p, xx); + if (tmpdistance < distance) { + distance = tmpdistance; + bestxx = xx; + besti = i; + } + } + + tmpsurface[0] = surfaces[besti]; + *tmpnormal = tmpsurface[0]->GetNormal(bestxx, true); + + return fLastNormal.vec; +} + +//===================================================================== +//* DistanceToIn (p, v) ----------------------------------------------- + +G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p, + const G4ThreeVector& v ) const +{ + + // DistanceToIn (p, v): + // Calculate distance to surface of shape from `outside' + // along with the v, allowing for tolerance. + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + + // + // checking last value + // + + G4ThreeVector *tmpp; + G4ThreeVector *tmpv; + G4double *tmpdist; + if (fLastDistanceToInWithV.p == p && fLastDistanceToInWithV.vec == v) { + + return fLastDistanceToIn.value; + + } else { + tmpp = const_cast(&(fLastDistanceToInWithV.p)); + tmpv = const_cast(&(fLastDistanceToInWithV.vec)); + tmpdist = const_cast(&(fLastDistanceToInWithV.value)); + tmpp->set(p.x(), p.y(), p.z()); + tmpv->set(v.x(), v.y(), v.z()); + } + + // + // Calculate DistanceToIn(p,v) + // + + EInside currentside = Inside(p); + + if (currentside == kInside) { + + } else if (currentside == kSurface) { + // particle is just on a boundary. + // if the particle is entering to the volume, return 0. + G4ThreeVector normal = SurfaceNormal(p); + if (normal*v < 0) { + + *tmpdist = 0; + return fLastDistanceToInWithV.value; + } + } + + // now, we can take smallest positive distance. + + // Initialize + G4double distance = kInfinity; + + // find intersections and choose nearest one. + G4VSurface *surfaces[6]; + surfaces[0] = fLowerEndcap; + surfaces[1] = fUpperEndcap; + surfaces[2] = fLatterTwisted; + surfaces[3] = fFormerTwisted; + surfaces[4] = fInnerHype; + surfaces[5] = fOuterHype; + + G4ThreeVector xx; + G4ThreeVector bestxx; + G4int i; + G4int besti = -1; + for (i=0; i< 6; i++) { + G4double tmpdistance = surfaces[i]->DistanceToIn(p, v, xx); + if (tmpdistance < distance) { + distance = tmpdistance; + bestxx = xx; + besti = i; + } + } + + *tmpdist = distance; + // timer.Stop(); + return fLastDistanceToInWithV.value; +} + +//===================================================================== +//* DistanceToIn (p) -------------------------------------------------- + +G4double G4TwistedTubs::DistanceToIn (const G4ThreeVector& p) const +{ + // DistanceToIn(p): + // Calculate distance to surface of shape from `outside', + // allowing for tolerance + // + + // + // checking last value + // + + G4ThreeVector *tmpp; + G4double *tmpdist; + if (fLastDistanceToIn.p == p) { + + return fLastDistanceToIn.value; + } else { + tmpp = const_cast(&(fLastDistanceToIn.p)); + tmpdist = const_cast(&(fLastDistanceToIn.value)); + tmpp->set(p.x(), p.y(), p.z()); + } + + // + // Calculate DistanceToIn(p) + // + + EInside currentside = Inside(p); + + switch (currentside) { + + case (kInside) : { + + } + + case (kSurface) : { + *tmpdist = 0.; + return fLastDistanceToIn.value; + } + + case (kOutside) : { + // Initialize + G4double distance = kInfinity; + + // find intersections and choose nearest one. + G4VSurface *surfaces[6]; + surfaces[0] = fLowerEndcap; + surfaces[1] = fUpperEndcap; + surfaces[2] = fLatterTwisted; + surfaces[3] = fFormerTwisted; + surfaces[4] = fInnerHype; + surfaces[5] = fOuterHype; + + G4int i; + G4int besti = -1; + G4ThreeVector xx; + G4ThreeVector bestxx; + for (i=0; i< 6; i++) { + G4double tmpdistance = surfaces[i]->DistanceTo(p, xx); + if (tmpdistance < distance) { + distance = tmpdistance; + bestxx = xx; + besti = i; + } + } + + + *tmpdist = distance; + return fLastDistanceToIn.value; + } + + default : { + G4Exception("G4TwistedTubs::DistanceToIn(p)", "InvalidCondition", + FatalException, "Unknown point location!"); + } + } // switch end + return kInfinity; +} + +//===================================================================== +//* DistanceToOut (p, v) ---------------------------------------------- + +G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p, + const G4ThreeVector& v, + const G4bool calcNorm, + G4bool *validNorm, G4ThreeVector *norm ) const +{ + // DistanceToOut (p, v): + // Calculate distance to surface of shape from `inside' + // along with the v, allowing for tolerance. + // The function returns kInfinity if no intersection or + // just grazing within tolerance. + // + + + // + // checking last value + // + + G4ThreeVector *tmpp; + G4ThreeVector *tmpv; + G4double *tmpdist; + if (fLastDistanceToOutWithV.p == p && fLastDistanceToOutWithV.vec == v ) { + + return fLastDistanceToOutWithV.value; + } else { + tmpp = const_cast(&(fLastDistanceToOutWithV.p)); + tmpv = const_cast(&(fLastDistanceToOutWithV.vec)); + tmpdist = const_cast(&(fLastDistanceToOutWithV.value)); + tmpp->set(p.x(), p.y(), p.z()); + tmpv->set(v.x(), v.y(), v.z()); + } + + // + // Calculate DistanceToOut(p,v) + // + + EInside currentside = Inside(p); + + if (currentside == kOutside) { + + } else if (currentside == kSurface) { + // particle is just on a boundary. + // if the particle is exiting from the volume, return 0. + G4ThreeVector normal = SurfaceNormal(p); + G4VSurface *blockedsurface = fLastNormal.surface[0]; + if (normal*v > 0) { + + if (calcNorm) { + *norm = (blockedsurface->GetNormal(p, true)); + *validNorm = blockedsurface->IsValidNorm(); + } + *tmpdist = 0.; + return fLastDistanceToOutWithV.value; + } + } + + // now, we can take smallest positive distance. + + // Initialize + G4double distance = kInfinity; + + // find intersections and choose nearest one. + G4VSurface *surfaces[6]; + surfaces[0] = fLatterTwisted; + surfaces[1] = fFormerTwisted; + surfaces[2] = fInnerHype; + surfaces[3] = fOuterHype; + surfaces[4] = fLowerEndcap; + surfaces[5] = fUpperEndcap; + + G4int i; + G4int besti = -1; + G4ThreeVector xx; + G4ThreeVector bestxx; + for (i=0; i< 6; i++) { + G4double tmpdistance = surfaces[i]->DistanceToOut(p, v, xx); + if (tmpdistance < distance) { + distance = tmpdistance; + bestxx = xx; + besti = i; + } + } + + if (calcNorm) { + if (besti != -1) { + *norm = (surfaces[besti]->GetNormal(p, true)); + *validNorm = surfaces[besti]->IsValidNorm(); + } + } + + *tmpdist = distance; + // timer.Stop(); + return fLastDistanceToOutWithV.value; +} + + +//===================================================================== +//* DistanceToOut (p) ---------------------------------------------- + +G4double G4TwistedTubs::DistanceToOut( const G4ThreeVector& p ) const +{ + // DistanceToOut(p): + // Calculate distance to surface of shape from `inside', + // allowing for tolerance + // + + + // + // checking last value + // + + G4ThreeVector *tmpp; + G4double *tmpdist; + if (fLastDistanceToOut.p == p) { + return fLastDistanceToOut.value; + } else { + tmpp = const_cast(&(fLastDistanceToOut.p)); + tmpdist = const_cast(&(fLastDistanceToOut.value)); + tmpp->set(p.x(), p.y(), p.z()); + } + + // + // Calculate DistanceToOut(p) + // + + EInside currentside = Inside(p); + + switch (currentside) { + case (kOutside) : { + + } + case (kSurface) : { + *tmpdist = 0.; + return fLastDistanceToOut.value; + } + + case (kInside) : { + // Initialize + G4double distance = kInfinity; + + // find intersections and choose nearest one. + G4VSurface *surfaces[6]; + surfaces[0] = fLatterTwisted; + surfaces[1] = fFormerTwisted; + surfaces[2] = fInnerHype; + surfaces[3] = fOuterHype; + surfaces[4] = fLowerEndcap; + surfaces[5] = fUpperEndcap; + + G4int i; + G4int besti = -1; + G4ThreeVector xx; + G4ThreeVector bestxx; + for (i=0; i< 6; i++) { + G4double tmpdistance = surfaces[i]->DistanceTo(p, xx); + if (tmpdistance < distance) { + distance = tmpdistance; + bestxx = xx; + besti = i; + } + } + + + *tmpdist = distance; + + return fLastDistanceToOut.value; + } + + default : { + G4Exception("G4TwistedTubs::DistanceToOut(p)", "InvalidCondition", + FatalException, "Unknown point location!"); + } + } // switch end + return 0; +} + +//===================================================================== +//* StreamInfo -------------------------------------------------------- + +std::ostream& G4TwistedTubs::StreamInfo(std::ostream& os) const +{ + // + // Stream object contents to an output stream + // + os << "-----------------------------------------------------------\n" + << " *** Dump for solid - " << GetName() << " ***\n" + << " ===================================================\n" + << " Solid type: G4TwistedTubs\n" + << " Parameters: \n" + << " -ve end Z : " << fEndZ[0]/mm << " mm \n" + << " +ve end Z : " << fEndZ[1]/mm << " mm \n" + << " inner end radius(-ve z): " << fEndInnerRadius[0]/mm << " mm \n" + << " inner end radius(+ve z): " << fEndInnerRadius[1]/mm << " mm \n" + << " outer end radius(-ve z): " << fEndOuterRadius[0]/mm << " mm \n" + << " outer end radius(+ve z): " << fEndOuterRadius[1]/mm << " mm \n" + << " inner radius (z=0) : " << fInnerRadius/mm << " mm \n" + << " outer radius (z=0) : " << fOuterRadius/mm << " mm \n" + << " twisted angle : " << fPhiTwist/degree << " degrees \n" + << " inner stereo angle : " << fInnerStereo/degree << " degrees \n" + << " outer stereo angle : " << fOuterStereo/degree << " degrees \n" + << " phi-width of a piece : " << fDPhi/degree << " degrees \n" + << "-----------------------------------------------------------\n"; + + return os; +} + + +//===================================================================== +//* DiscribeYourselfTo ------------------------------------------------ + +void G4TwistedTubs::DescribeYourselfTo (G4VGraphicsScene& scene) const +{ + scene.AddThis (*this); +} + +//===================================================================== +//* GetExtent --------------------------------------------------------- + +G4VisExtent G4TwistedTubs::GetExtent() const +{ + // Define the sides of the box into which the G4Tubs instance would fit. + G4double maxEndOuterRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? 0 : 1); + return G4VisExtent( -maxEndOuterRad, maxEndOuterRad, + -maxEndOuterRad, maxEndOuterRad, + -fZHalfLength, fZHalfLength ); +} + +//===================================================================== +//* CreatePolyhedron -------------------------------------------------- + +G4Polyhedron* G4TwistedTubs::CreatePolyhedron () const +{ + // return new G4PolyhedronHype (fRMin, fRMax, fDz, fSPhi, fDPhi); + return 0; +} + +//===================================================================== +//* CreateNUBS -------------------------------------------------------- + +G4NURBS* G4TwistedTubs::CreateNURBS () const +{ + G4double maxEndOuterRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? 0 : 1); + G4double maxEndInnerRad = (fEndOuterRadius[0] > fEndOuterRadius[1] ? 0 : 1); + return new G4NURBStube(maxEndInnerRad, maxEndOuterRad, fZHalfLength); + // Tube for now!!! +} + +//===================================================================== +//* CreateSurfaces ---------------------------------------------------- + +void G4TwistedTubs::CreateSurfaces() +{ + + // create 6 surfaces of TwistedTub. + G4ThreeVector x0(0, 0, fEndZ[0]); + G4ThreeVector n (0, 0, -1); + + fLowerEndcap = new G4FlatSurface("LowerEndcap", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, -1) ; + + fUpperEndcap = new G4FlatSurface("UpperEndcap", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, 1) ; + + G4RotationMatrix rotHalfDPhi; + rotHalfDPhi.rotateZ(0.5*fDPhi); + + fLatterTwisted = new G4TwistedSurface("LatterTwisted", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, + fInnerRadius, fOuterRadius, fKappa, + 1 ) ; + fFormerTwisted = new G4TwistedSurface("FormerTwisted", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, + fInnerRadius, fOuterRadius, fKappa, + -1 ) ; + + fInnerHype = new G4HyperbolicSurface("InnerHype", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, + fInnerRadius, fOuterRadius,fKappa, + fTanInnerStereo, fTanOuterStereo, -1) ; + fOuterHype = new G4HyperbolicSurface("OuterHype", + fEndInnerRadius, fEndOuterRadius, + fDPhi, fEndPhi, fEndZ, + fInnerRadius, fOuterRadius,fKappa, + fTanInnerStereo, fTanOuterStereo, 1) ; + + + // set neighbour surfaces. + fLowerEndcap->SetNeighbours(fInnerHype, fLatterTwisted, + fOuterHype, fFormerTwisted); + fUpperEndcap->SetNeighbours(fInnerHype, fLatterTwisted, + fOuterHype, fFormerTwisted); + fLatterTwisted->SetNeighbours(fInnerHype, fLowerEndcap, + fOuterHype, fUpperEndcap); + fFormerTwisted->SetNeighbours(fInnerHype, fLowerEndcap, + fOuterHype, fUpperEndcap); + fInnerHype->SetNeighbours(fLatterTwisted, fLowerEndcap, + fFormerTwisted, fUpperEndcap); + fOuterHype->SetNeighbours(fLatterTwisted, fLowerEndcap, + fFormerTwisted, fUpperEndcap); +} + + +//===================================================================== +//* GetEntityType ----------------------------------------------------- + +G4GeometryType G4TwistedTubs::GetEntityType() const +{ + return G4String("G4TwistedTubs"); +} diff --git a/source/geometry/solids/specific/src/G4VSurface.cc b/source/geometry/solids/specific/src/G4VSurface.cc new file mode 100644 index 0000000000..014937d3fe --- /dev/null +++ b/source/geometry/solids/specific/src/G4VSurface.cc @@ -0,0 +1,1021 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4VSurface.cc,v 1.6 2004/05/28 16:52:44 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// -------------------------------------------------------------------- +// GEANT 4 class source file +// +// +// G4VSurface.cc +// +// Author: +// 01-Aug-2002 - Kotoyo Hoshina (hoshina@hepburn.s.chiba-u.ac.jp) +// +// History: +// 13-Nov-2003 - O.Link (Oliver.Link@cern.ch), Integration in Geant4 +// from original version in Jupiter-2.5.02 application. +// -------------------------------------------------------------------- + +#include "G4VSurface.hh" + +const G4int G4VSurface::sOutside = 0x00000000; +const G4int G4VSurface::sInside = 0x10000000; +const G4int G4VSurface::sBoundary = 0x20000000; +const G4int G4VSurface::sCorner = 0x40000000; +const G4int G4VSurface::sCMin1Min = 0x40000101; +const G4int G4VSurface::sCMax1Min = 0x40000201; +const G4int G4VSurface::sCMax1Max = 0x40000202; +const G4int G4VSurface::sCMin1Max = 0x40000102; +const G4int G4VSurface::sAxisMin = 0x00000101; +const G4int G4VSurface::sAxisMax = 0x00000202; +const G4int G4VSurface::sAxisX = 0x00000404; +const G4int G4VSurface::sAxisY = 0x00000808; +const G4int G4VSurface::sAxisZ = 0x00000C0C; +const G4int G4VSurface::sAxisRho = 0x00001010; +const G4int G4VSurface::sAxisPhi = 0x00001414; + +// mask +const G4int G4VSurface::sAxis0 = 0x0000FF00; +const G4int G4VSurface::sAxis1 = 0x000000FF; +const G4int G4VSurface::sSizeMask = 0x00000303; +const G4int G4VSurface::sAxisMask = 0x0000FCFC; +const G4int G4VSurface::sAreaMask = 0XF0000000; + +//===================================================================== +//* constructors ------------------------------------------------------ + +G4VSurface::G4VSurface(const G4String &name) + : fName(name) +{ + + fAxis[0] = kUndefined; + fAxis[1] = kUndefined; + fAxisMin[0] = kInfinity; + fAxisMin[1] = kInfinity; + fAxisMax[0] = kInfinity; + fAxisMax[1] = kInfinity; + fHandedness = 1; + + G4int i; + for (i=0; i<4; i++) { + fCorners[i].set(kInfinity, kInfinity, kInfinity); + fNeighbours[i] = 0; + } + + fCurrentNormal.p.set(kInfinity, kInfinity, kInfinity); + + fAmIOnLeftSide.me.set(kInfinity, kInfinity, kInfinity); + fAmIOnLeftSide.vec.set(kInfinity, kInfinity, kInfinity); +} + +G4VSurface::G4VSurface(const G4String &name, + const G4RotationMatrix &rot, + const G4ThreeVector &tlate, + G4int handedness, + const EAxis axis0 , + const EAxis axis1 , + G4double axis0min, + G4double axis1min, + G4double axis0max, + G4double axis1max ) + : fName(name) +{ + fAxis[0] = axis0; + fAxis[1] = axis1; + fAxisMin[0] = axis0min; + fAxisMin[1] = axis1min; + fAxisMax[0] = axis0max; + fAxisMax[1] = axis1max; + fHandedness = handedness; + fRot = rot; + fTrans = tlate; + + G4int i; + for (i=0; i<4; i++) { + fCorners[i].set(kInfinity, kInfinity, kInfinity); + fNeighbours[i] = 0; + } + + fCurrentNormal.p.set(kInfinity, kInfinity, kInfinity); + + fAmIOnLeftSide.me.set(kInfinity, kInfinity, kInfinity); + fAmIOnLeftSide.vec.set(kInfinity, kInfinity, kInfinity); +} + +//===================================================================== +//* destructor -------------------------------------------------------- + +G4VSurface::~G4VSurface() +{ +} + +//===================================================================== +//* AmIOnLeftSide ----------------------------------------------------- + +G4int G4VSurface::AmIOnLeftSide(const G4ThreeVector &me, + const G4ThreeVector &vec, + G4bool withtol) +{ + // AmIOnLeftSide returns phi-location of "me" + // (phi relation between me and vec projected on z=0 plane). + // If "me" is on -ve-phi-side of "vec", it returns 1. + // On the other hand, if "me" is on +ve-phi-side of "vec", + // it returns -1. + // (The return value represents z-coordinate of normal vector + // of me.cross(vec).) + // If me is on boundary of vec, return 0. + + static G4RotationMatrix unitrot; // unit matrix + static const G4RotationMatrix rottol = unitrot.rotateZ(0.5*kAngTolerance); + static const G4RotationMatrix invrottol = unitrot.rotateZ(-1.*kAngTolerance); + + if (fAmIOnLeftSide.me == me + && fAmIOnLeftSide.vec == vec + && fAmIOnLeftSide.withTol == withtol) { + return fAmIOnLeftSide.amIOnLeftSide; + } + + fAmIOnLeftSide.me = me; + fAmIOnLeftSide.vec = vec; + fAmIOnLeftSide.withTol = withtol; + + G4ThreeVector met = (G4ThreeVector(me.x(), me.y(), 0.)).unit(); + G4ThreeVector vect = (G4ThreeVector(vec.x(), vec.y(), 0.)).unit(); + + G4ThreeVector ivect = invrottol * vect; + G4ThreeVector rvect = rottol * vect; + + G4double metcrossvect = met.x() * vect.y() - met.y() * vect.x(); + + if (withtol) { + if (met.x() * ivect.y() - met.y() * ivect.x() > 0 && + metcrossvect >= 0) { + fAmIOnLeftSide.amIOnLeftSide = 1; + } else if (met.x() * rvect.y() - met.y() * rvect.x() < 0 && + metcrossvect <= 0) { + fAmIOnLeftSide.amIOnLeftSide = -1; + } else { + fAmIOnLeftSide.amIOnLeftSide = 0; + } + } else { + if (metcrossvect > 0) { + fAmIOnLeftSide.amIOnLeftSide = 1; + } else if (metcrossvect < 0 ) { + fAmIOnLeftSide.amIOnLeftSide = -1; + } else { + fAmIOnLeftSide.amIOnLeftSide = 0; + } + } + +#ifdef G4SPECSDEBUG + G4cout << " === G4VSurface::AmIOnLeftSide() ==============" + << G4endl; + G4cout << " Name , returncode : " << fName << " " + << fAmIOnLeftSide.amIOnLeftSide << G4endl; + G4cout << " me, vec : " << std::setprecision(14) << me + << " " << vec << G4endl; + G4cout << " met, vect : " << met << " " << vect << G4endl; + G4cout << " ivec, rvec : " << ivect << " " << rvect << G4endl; + G4cout << " met x vect : " << metcrossvect << G4endl; + G4cout << " met x ivec : " << met.cross(ivect) << G4endl; + G4cout << " met x rvec : " << met.cross(rvect) << G4endl; + G4cout << " ==============================================" + << G4endl; +#endif + + return fAmIOnLeftSide.amIOnLeftSide; +} + +//===================================================================== +//* DistanceToBoundary ------------------------------------------------ + +G4double G4VSurface::DistanceToBoundary(G4int areacode, + G4ThreeVector &xx, + const G4ThreeVector &p) +{ + // DistanceToBoundary + // + // return distance to nearest boundary from arbitrary point p + // in local coodinate. + // Argument areacode must be one of them: + // sAxis0 & sAxisMin, sAxis0 & sAxisMax, + // sAxis1 & sAxisMin, sAxis1 & sAxisMax. + // + + G4ThreeVector d; // direction vector of the boundary + G4ThreeVector x0; // reference point of the boundary + G4double dist = kInfinity; + G4int boundarytype; + + if (IsAxis0(areacode) && IsAxis1(areacode)) { + G4cerr << "ERROR - G4VSurface::DistanceToBoundary()" << G4endl + << " Point is in the corner area. This function returns" + << G4endl + << " a direction vector of a boundary line." << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::DistanceToBoundary()", "InvalidSetup", + FatalException, "Point is in the corner area."); + } else if (IsAxis0(areacode) || IsAxis1(areacode)) { + GetBoundaryParameters(areacode, d, x0, boundarytype); + if (boundarytype == sAxisPhi) { + G4double t = x0.getRho() / p.getRho(); + xx.set(t*p.x(), t*p.y(), x0.z()); + dist = (xx - p).mag(); + } else { + // linear boundary + // sAxisX, sAxisY, sAxisZ, sAxisRho + dist = DistanceToLine(p, x0, d, xx); + } + } else { + G4cerr << "ERROR - G4VSurface::DistanceToBoundary()" << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::DistanceToBoundary()", "InvalidSetup", + FatalException, "Bad areacode of boundary."); + } + return dist; +} + +//===================================================================== +//* DistanceToIn ------------------------------------------------------ + +G4double G4VSurface::DistanceToIn(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector &gxxbest) +{ +#ifdef G4SPECSDEBUG + G4cout << " ~~~~~ G4VSurface::DistanceToIn(p,v) - Start ~~~~~" << G4endl; + G4cout << " Name : " << fName << G4endl; + G4cout << " gp : " << gp << G4endl; + G4cout << " gv : " << gv << G4endl; + G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl; +#endif + + G4ThreeVector gxx[2]; + G4double distance[2] = {kInfinity, kInfinity}; + G4int areacode[2] = {sOutside, sOutside}; + G4bool isvalid[2] = {false, false}; + G4double bestdistance = kInfinity; + G4int besti = -1; + G4ThreeVector bestgxx(kInfinity, kInfinity, kInfinity); + + G4int nxx = DistanceToSurface(gp, gv, gxx, distance, areacode, + isvalid, kValidateWithTol); + + for (G4int i=0; i< nxx; i++) { + + // skip this intersection if: + // - invalid intersection + // - particle goes outword the surface + + if (!isvalid[i]) { + // xx[i] is sOutside or distance[i] < 0 + continue; + } + + G4ThreeVector normal = GetNormal(gxx[i], true); + + if ((normal * gv) >= 0) { + +#ifdef G4SPECSDEBUG + G4cout << " G4VSurface::DistanceToIn(p,v): " + << "particle goes outword the surface." << G4endl; +#endif + continue; + } + + // + // accept this intersection if the intersection is inside. + // + + if (IsInside(areacode[i])) { + if (distance[i] < bestdistance) { + bestdistance = distance[i]; + bestgxx = gxx[i]; + besti = i; + +#ifdef G4SPECSDEBUG + G4cout << " G4VSurface::DistanceToIn(p,v): " + << " areacode sInside name, distance = " + << fName << " "<< bestdistance << G4endl; +#endif + } + + // + // else, the intersection is on boundary or corner. + // + + } else { + + G4VSurface *neighbours[2]; + G4bool isaccepted[2] = {false, false}; + G4int nneighbours = GetNeighbours(areacode[i], neighbours); + + for (G4int j=0; j< nneighbours; j++) { + // if on corner, nneighbours = 2. + // if on boundary, nneighbours = 1. + G4ThreeVector tmpgxx[2]; + G4double tmpdist[2] = {kInfinity, kInfinity}; + G4int tmpareacode[2] = {sOutside, sOutside}; + G4bool tmpisvalid[2] = {false, false}; + + G4int tmpnxx = neighbours[j]->DistanceToSurface( + gp, gv, tmpgxx, tmpdist, + tmpareacode, tmpisvalid, + kValidateWithTol); + G4ThreeVector neighbournormal; + + for (G4int k=0; k< tmpnxx; k++) { + + // + // if tmpxx[k] is valid && sInside, the final winner must + // be neighbour surface. return kInfinity. + // else , choose tmpxx on same boundary of xx, then check normal + // + + if (IsInside(tmpareacode[k])) { + +#ifdef G4SPECSDEBUG + G4cout << " G4VSurface:DistanceToIn(p,v): " + << " intersection "<< tmpgxx[k] << G4endl + << " is inside of neighbour surface of " << fName + << " . returning kInfinity." << G4endl; + G4cout << "~~~~~ G4VSurface::DistanceToIn(p,v) - return ~~~~" + << G4endl; + G4cout << " No intersections " << G4endl; + G4cout << " Name : " << fName << G4endl; + G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" + << G4endl; +#endif + if (tmpisvalid[k]) return kInfinity; + continue; + + // + // if tmpxx[k] is valid && sInside, the final winner must + // be neighbour surface. return . + // + + } else if (IsSameBoundary(this,areacode[i], + neighbours[j], tmpareacode[k])) { + // tmpxx[k] is same boundary (or corner) of xx. + + neighbournormal = neighbours[j]->GetNormal(tmpgxx[k], true); + if (neighbournormal * gv < 0) isaccepted[1] = true; + } + } + + // if nneighbours = 1, chabge isaccepted[1] before + // exiting neighboursurface loop. + + if (nneighbours == 1) isaccepted[1] = true; + + } // neighboursurface loop end + + // now, we can accept xx intersection + + if (isaccepted[0] == true && isaccepted[1] == true) { + if (distance[i] < bestdistance) { + bestdistance = distance[i]; + gxxbest = gxx[i]; + besti = i; +#ifdef G4SPECSDEBUG + G4cout << " G4VSurface::DistanceToIn(p,v): " + << " areacode sBoundary & sBoundary distance = " + << fName << " " << distance[i] << G4endl; +#endif + } + } + + } // else end + } // intersection loop end + + gxxbest = bestgxx; + +#ifdef G4SPECSDEBUG + if (besti < 0) { + G4cout << "~~~~~ G4VSurface::DistanceToIn(p,v) - return ~~~~" << G4endl; + G4cout << " No intersections " << G4endl; + G4cout << " Name : " << fName << G4endl; + G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl; + } else { + G4cout << "~~~~~ G4VSurface::DistanceToIn(p,v) : return ~~~~" << G4endl; + G4cout << " Name, i : " << fName << " , " << besti << G4endl; + G4cout << " gxx[i] : " << gxxbest << G4endl; + G4cout << " bestdist : " << bestdistance << G4endl; + G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl; + } +#endif + + return bestdistance; +} + +//===================================================================== +//* DistanceToOut(p, v) ----------------------------------------------- + +G4double G4VSurface::DistanceToOut(const G4ThreeVector &gp, + const G4ThreeVector &gv, + G4ThreeVector &gxxbest) +{ +#ifdef G4SPECSDEBUG + G4cout << "~~~~~ G4VSurface::DistanceToOut(p,v) - Start ~~~~" << G4endl; + G4cout << " Name : " << fName << G4endl; + G4cout << " gp : " << gp << G4endl; + G4cout << " gv : " << gv << G4endl; + G4cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << G4endl; +#endif + + G4double distance[2] = {kInfinity, kInfinity}; + G4int areacode[2] = {sOutside, sOutside}; + G4bool isvalid [2] = {false, false}; + G4ThreeVector gxx[2]; + G4int nxx; + G4double bestdistance = kInfinity; + G4int besti = -1; + + nxx = DistanceToSurface(gp, gv, gxx, distance, areacode, + isvalid, kValidateWithTol); + G4int i; + for (i=0; iComputeGlobalPoint(surface1->GetCorner(areacode1)); + G4ThreeVector corner2 = + surface2->ComputeGlobalPoint(surface2->GetCorner(areacode2)); + + if ((corner1 - corner2).mag() < kCarTolerance) { + return true; + } else { + return false; + } + + } else if ((IsBoundary(areacode1, testbitmode) && (!iscorner[0])) && + (IsBoundary(areacode2, testbitmode) && (!iscorner[1]))) { + // on boundary + G4ThreeVector d1, d2, ld1, ld2; + G4ThreeVector x01, x02, lx01, lx02; + G4int type1, type2; + surface1->GetBoundaryParameters(areacode1, ld1, lx01, type1); + surface2->GetBoundaryParameters(areacode2, ld2, lx02, type2); + + x01 = surface1->ComputeGlobalPoint(lx01); + x02 = surface2->ComputeGlobalPoint(lx02); + d1 = surface1->ComputeGlobalDirection(ld1); + d2 = surface2->ComputeGlobalDirection(ld2); + + if ((x01 - x02).mag() < kCarTolerance && + (d1 - d2).mag() < kCarTolerance) { + return true; + } else { + return false; + } + + } else { + return false; + } +} + +//===================================================================== +//* GetBoundaryParameters --------------------------------------------- + +void G4VSurface::GetBoundaryParameters(const G4int &areacode, + G4ThreeVector &d, + G4ThreeVector &x0, + G4int &boundarytype) const +{ + // areacode must be one of them: + // sAxis0 & sAxisMin, sAxis0 & sAxisMax, + // sAxis1 & sAxisMin, sAxis1 & sAxisMax. + + G4int i; + for (i=0; i<4; i++) { + if (fBoundaries[i].GetBoundaryParameters(areacode, d, x0, + boundarytype)) { + return; + } + } + + G4cerr << "ERROR - G4VSurface::GetBoundaryParameters()" << G4endl + << " Boundary at areacode " << std::hex << areacode + << std::dec << G4endl + << " is not be registered." << G4endl; + G4Exception("G4VSurface::GetBoundaryParameters()", "InvalidSetup", + FatalException, "Not registered boundary."); +} + +//===================================================================== +//* GetBoundaryAtPZ --------------------------------------------------- + +G4ThreeVector G4VSurface::GetBoundaryAtPZ(G4int areacode, + const G4ThreeVector &p) const +{ + // areacode must be one of them: + // sAxis0 & sAxisMin, sAxis0 & sAxisMax, + // sAxis1 & sAxisMin, sAxis1 & sAxisMax. + + if (areacode & sAxis0 && areacode & sAxis1) { + G4cerr << "ERROR - G4VSurface::GetBoundaryAtPZ()" << G4endl + << " Point is in the corner area. This function returns" + << G4endl + << " a direction vector of a boundary line." << G4endl + << " areacode = " << areacode << G4endl; + G4Exception("G4VSurface::GetBoundaryAtPZ()", "InvalidCondition", + FatalException, "Point is in the corner area."); + } + + G4ThreeVector d; + G4ThreeVector x0; + G4int boundarytype; + G4bool found = false; + + for (G4int i=0; i<4; i++) { + if (fBoundaries[i].GetBoundaryParameters(areacode, d, x0, + boundarytype)){ + found = true; + continue; + } + } + + if (!found) { + G4cerr << "ERROR - G4VSurface::GetBoundaryAtPZ()" << G4endl + << " Boundary at areacode " << areacode << G4endl + << " is not be registered." << G4endl; + G4Exception("G4VSurface::GetBoundaryAtPZ()", "InvalidSetup", + FatalException, "Not registered boundary."); + } + + if (((boundarytype & sAxisPhi) == sAxisPhi) || + ((boundarytype & sAxisRho) == sAxisRho)) { + G4cerr << "ERROR - G4VSurface::GetBoundaryAtPZ()" << G4endl + << " Boundary at areacode " << areacode << G4endl + << " is not a z-depended line." << G4endl; + G4Exception("G4VSurface::GetBoundaryAtPZ()", "InvalidSetup", + FatalException, "Not a z-depended line boundary."); + } + return ((p.z() - x0.z()) / d.z()) * d + x0; +} + +//===================================================================== +//* SetCorner --------------------------------------------------------- + +void G4VSurface::SetCorner(G4int areacode, G4double x, G4double y, G4double z) +{ + if ((areacode & sCorner) != sCorner){ + G4cerr << "ERROR - G4VSurface::SetCorner()" << G4endl + << " areacode " << areacode << G4endl; + G4Exception("G4VSurface::SetCorner()", "InvalidSetup", + FatalException, "Area code must represents corner."); + } + + if ((areacode & sCMin1Min) == sCMin1Min) { + fCorners[0].set(x, y, z); + } else if ((areacode & sCMax1Min) == sCMax1Min) { + fCorners[1].set(x, y, z); + } else if ((areacode & sCMax1Max) == sCMax1Max) { + fCorners[2].set(x, y, z); + } else if ((areacode & sCMin1Max) == sCMin1Max) { + fCorners[3].set(x, y, z); + } +} + +//===================================================================== +//* SetBoundaryAxis --------------------------------------------------- + +void G4VSurface::GetBoundaryAxis(G4int areacode, EAxis axis[]) const +{ + if ((areacode & sBoundary) != sBoundary) { + G4Exception("G4VSurface::GetBoundaryAxis()", "InvalidCondition", + FatalException, "Not located on a boundary!"); + } + G4int i; + for (i=0; i<2; i++) { + + G4int whichaxis = 0 ; + if (i == 0) { + whichaxis = sAxis0; + } else if (i == 1) { + whichaxis = sAxis1; + } + + // extracted axiscode of whichaxis + G4int axiscode = whichaxis & sAxisMask & areacode ; + if (axiscode) { + if (axiscode == (whichaxis & sAxisX)) { + axis[i] = kXAxis; + } else if (axiscode == (whichaxis & sAxisY)) { + axis[i] = kYAxis; + } else if (axiscode == (whichaxis & sAxisZ)) { + axis[i] = kZAxis; + } else if (axiscode == (whichaxis & sAxisRho)) { + axis[i] = kRho; + } else if (axiscode == (whichaxis & sAxisPhi)) { + axis[i] = kPhi; + } else { + G4cerr << "ERROR - G4VSurface::GetBoundaryAxis()" << G4endl + << " areacode " << areacode << G4endl; + G4Exception("G4VSurface::GetBoundaryAxis()", "InvalidSetup", + FatalException, "Not supported areacode."); + } + } + } +} + +//===================================================================== +//* SetBoundaryLimit -------------------------------------------------- + +void G4VSurface::GetBoundaryLimit(G4int areacode, G4double limit[]) const +{ + if (areacode & sCorner) { + if (areacode & sCMin1Max) { + limit[0] = fAxisMin[0]; + limit[1] = fAxisMin[1]; + } else if (areacode & sCMax1Min) { + limit[0] = fAxisMax[0]; + limit[1] = fAxisMin[1]; + } else if (areacode & sCMax1Max) { + limit[0] = fAxisMax[0]; + limit[1] = fAxisMax[1]; + } else if (areacode & sCMin1Max) { + limit[0] = fAxisMin[0]; + limit[1] = fAxisMax[1]; + } + } else if (areacode & sBoundary) { + if (areacode & (sAxis0 | sAxisMin)) { + limit[0] = fAxisMin[0]; + } else if (areacode & (sAxis1 | sAxisMin)) { + limit[0] = fAxisMin[1]; + } else if (areacode & (sAxis0 | sAxisMax)) { + limit[0] = fAxisMax[0]; + } else if (areacode & (sAxis1 | sAxisMax)) { + limit[0] = fAxisMax[1]; + } + } else { + G4cerr << "WARNING - G4VSurface::GetBoundaryAxis()" << G4endl + << " areacode " << areacode << G4endl; + G4Exception("G4VSurface::GetBoundaryLimit()", "InvalidCondition", + JustWarning, "Not located on a boundary!"); + } +} + +//===================================================================== +//* SetBoundary ------------------------------------------------------- + +void G4VSurface::SetBoundary(const G4int &axiscode, + const G4ThreeVector &direction, + const G4ThreeVector &x0, + const G4int &boundarytype) +{ + G4int code = (~sAxisMask) & axiscode; + if ((code == (sAxis0 & sAxisMin)) || + (code == (sAxis0 & sAxisMax)) || + (code == (sAxis1 & sAxisMin)) || + (code == (sAxis1 & sAxisMax))) { + + G4int i; + G4bool done = false; + for (i=0; i<4; i++) { + if (fBoundaries[i].IsEmpty()) { + fBoundaries[i].SetFields(axiscode, direction, + x0, boundarytype); + done = true; + break; + } + } + + if (!done) { + G4Exception("G4VSurface::SetBoundary()", "InvalidCondition", + FatalException, "Number of boundary exceeding 4!"); + } + } else { + G4cerr << "ERROR - G4VSurface::SetBoundary()" << G4endl + << " invalid axiscode. axiscode = " + << std::hex << axiscode << std::dec << G4endl; + G4Exception("G4VSurface::SetBoundary()", "InvalidCondition", + FatalException, "Invalid axis-code."); + } +} + +//===================================================================== +//* DebugPrint -------------------------------------------------------- + +void G4VSurface::DebugPrint() const +{ + G4ThreeVector A = fRot * GetCorner(sCMin1Min) + fTrans; + G4ThreeVector B = fRot * GetCorner(sCMax1Min) + fTrans; + G4ThreeVector C = fRot * GetCorner(sCMax1Max) + fTrans; + G4ThreeVector D = fRot * GetCorner(sCMin1Max) + fTrans; + + G4cout << "/* G4VSurface::DebugPrint():-------------------------------" + << G4endl; + G4cout << "/* Name = " << fName << G4endl; + G4cout << "/* Axis = " << std::hex << fAxis[0] << " " + << std::hex << fAxis[1] + << " (0,1,2,3,5 = kXAxis,kYAxis,kZAxis,kRho,kPhi)" + << std::dec << G4endl; + G4cout << "/* BoundaryLimit(in local) fAxis0(min, max) = ("< * GetSurfaceTable(); static size_t GetNumberOfBorderSurfaces(); static void DumpInfo(); @@ -104,3 +105,4 @@ typedef std::vector G4LogicalBorderSurfaceTable; #include "G4LogicalBorderSurface.icc" #endif /* G4LogicalBorderSurface_h */ + diff --git a/source/geometry/volumes/include/G4LogicalSkinSurface.hh b/source/geometry/volumes/include/G4LogicalSkinSurface.hh index bd7a5cb4b0..f4d4bc8529 100644 --- a/source/geometry/volumes/include/G4LogicalSkinSurface.hh +++ b/source/geometry/volumes/include/G4LogicalSkinSurface.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4LogicalSkinSurface.hh,v 1.12 2003/12/01 14:53:26 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4LogicalSkinSurface.hh,v 1.13 2004/05/19 08:14:39 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // class G4LogicalSkinSurface // @@ -62,6 +62,7 @@ class G4LogicalSkinSurface : public G4LogicalSurface inline void SetLogicalVolume(G4LogicalVolume* vol); // Accessors. + static void CleanSurfaceTable(); static size_t GetNumberOfSkinSurfaces(); static void DumpInfo(); // const // To handle with the table of surfaces. @@ -95,3 +96,4 @@ typedef std::vector G4LogicalSkinSurfaceTable; #include "G4LogicalSkinSurface.icc" #endif /* G4LogicalSkinSurface_h */ + diff --git a/source/geometry/volumes/include/G4NavigationLevel.icc b/source/geometry/volumes/include/G4NavigationLevel.icc index b6eb3d5a67..eee729e8bc 100644 --- a/source/geometry/volumes/include/G4NavigationLevel.icc +++ b/source/geometry/volumes/include/G4NavigationLevel.icc @@ -21,14 +21,18 @@ // ******************************************************************** // // -// $Id: G4NavigationLevel.icc,v 1.15 2003/12/04 15:58:08 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4NavigationLevel.icc,v 1.18 2004/06/11 14:17:20 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // 30.09.97 J.Apostolakis Initial version. // // ---------------------------------------------------------------------- -extern G4Allocator aNavigationLevelAllocator; +#if defined G4GEOM_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aNavigationLevelAllocator; +#else + extern G4DLLIMPORT G4Allocator aNavigationLevelAllocator; +#endif inline G4NavigationLevel::G4NavigationLevel( G4VPhysicalVolume* pPhysVol, diff --git a/source/geometry/volumes/include/G4NavigationLevelRep.icc b/source/geometry/volumes/include/G4NavigationLevelRep.icc index 5e73e08c79..b600bbe44c 100644 --- a/source/geometry/volumes/include/G4NavigationLevelRep.icc +++ b/source/geometry/volumes/include/G4NavigationLevelRep.icc @@ -21,14 +21,18 @@ // ******************************************************************** // // -// $Id: G4NavigationLevelRep.icc,v 1.9 2003/12/04 15:58:08 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4NavigationLevelRep.icc,v 1.12 2004/06/11 14:17:21 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // 1 October 1997 J.Apostolakis Initial version. // // ---------------------------------------------------------------------- -extern G4Allocator aNavigLevelRepAllocator; +#if defined G4GEOM_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aNavigLevelRepAllocator; +#else + extern G4DLLIMPORT G4Allocator aNavigLevelRepAllocator; +#endif // Constructors //-------------- diff --git a/source/geometry/solids/Boolean/include/G4ReflectionFactory.hh b/source/geometry/volumes/include/G4ReflectionFactory.hh similarity index 82% rename from source/geometry/solids/Boolean/include/G4ReflectionFactory.hh rename to source/geometry/volumes/include/G4ReflectionFactory.hh index a9e201c9b0..96245eba8e 100644 --- a/source/geometry/solids/Boolean/include/G4ReflectionFactory.hh +++ b/source/geometry/volumes/include/G4ReflectionFactory.hh @@ -21,11 +21,11 @@ // ******************************************************************** // // -// $Id: G4ReflectionFactory.hh,v 1.6 2003/11/03 17:48:45 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ReflectionFactory.hh,v 1.1 2004/05/13 14:50:58 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -// class G4Reflection +// class G4ReflectionFactory // // Class description: // @@ -72,6 +72,7 @@ class G4VPhysicalVolume; class G4LogicalVolume; class G4VSolid; +class G4VPVDivisionFactory; typedef std::pair G4PhysicalVolumesPair; @@ -117,6 +118,30 @@ class G4ReflectionFactory // the second physical volume is a replica in a reflected mother // or 0 if mother LV was not reflected. + G4PhysicalVolumesPair Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4int nofDivisions, + G4double width, + G4double offset); + G4PhysicalVolumesPair Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4int nofDivisions, + G4double offset); + G4PhysicalVolumesPair Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4double width, + G4double offset); + // Creates division in the given mother. + // The result is a pair of physical volumes; + // the second physical volume is a division in a reflected mother + // or 0 if mother LV was not reflected. + void SetVerboseLevel(G4int verboseLevel); G4int GetVerboseLevel() const; // Sets/gets verbosity level. @@ -181,6 +206,10 @@ class G4ReflectionFactory // Copies and transforms daughter of PVReplica type of // a constituent volume into a reflected volume. + void ReflectPVDivision(G4VPhysicalVolume* PV, G4LogicalVolume* refLV); + // Copies and transforms daughter of PVDivision type of + // a constituent volume into a reflected volume. + void ReflectPVParameterised(G4VPhysicalVolume* PV, G4LogicalVolume* refLV); // Not implemented yet. // Should copy and transform daughter of PVReplica type of @@ -192,6 +221,10 @@ class G4ReflectionFactory void CheckScale(const G4Scale3D& scale) const; // Checks if scale correspond to fScale, if not gives exception. + G4VPVDivisionFactory* GetPVDivisionFactory() const; + // Checks if the division factory is instanciated, + // if not gives exception. + void PrintConstituentLVMap(); // Temporary - for debugging purpose. diff --git a/source/geometry/volumes/src/G4LogicalBorderSurface.cc b/source/geometry/volumes/src/G4LogicalBorderSurface.cc index 1bfd9f38d7..7d26cb0ca4 100644 --- a/source/geometry/volumes/src/G4LogicalBorderSurface.cc +++ b/source/geometry/volumes/src/G4LogicalBorderSurface.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4LogicalBorderSurface.cc,v 1.12 2003/12/01 14:53:26 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4LogicalBorderSurface.cc,v 1.13 2004/05/19 08:14:42 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------------- // G4LogicalBorderSurface Implementation @@ -146,3 +146,14 @@ void G4LogicalBorderSurface::DumpInfo() } G4cout << G4endl; } + +void G4LogicalBorderSurface::CleanSurfaceTable() +{ + std::vector::iterator pos; + for(pos=theBorderSurfaceTable.begin(); + pos!=theBorderSurfaceTable.end(); pos++) + { + if (*pos) delete *pos; + } + theBorderSurfaceTable.clear(); +} diff --git a/source/geometry/volumes/src/G4LogicalSkinSurface.cc b/source/geometry/volumes/src/G4LogicalSkinSurface.cc index b432d6c3a5..6b7a9e2dda 100644 --- a/source/geometry/volumes/src/G4LogicalSkinSurface.cc +++ b/source/geometry/volumes/src/G4LogicalSkinSurface.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4LogicalSkinSurface.cc,v 1.11 2003/12/01 14:53:26 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4LogicalSkinSurface.cc,v 1.12 2004/05/19 08:14:42 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------------- // G4LogicalSkinSurface Implementation @@ -137,3 +137,13 @@ void G4LogicalSkinSurface::DumpInfo() } G4cout << G4endl; } + +void G4LogicalSkinSurface::CleanSurfaceTable() +{ + std::vector::iterator pos; + for(pos=theSurfaceTable.begin(); pos!=theSurfaceTable.end(); pos++) + { + if (*pos) delete *pos; + } + theSurfaceTable.clear(); +} diff --git a/source/geometry/solids/Boolean/src/G4ReflectionFactory.cc b/source/geometry/volumes/src/G4ReflectionFactory.cc similarity index 71% rename from source/geometry/solids/Boolean/src/G4ReflectionFactory.cc rename to source/geometry/volumes/src/G4ReflectionFactory.cc index 302445a2f0..75d6518045 100644 --- a/source/geometry/solids/Boolean/src/G4ReflectionFactory.cc +++ b/source/geometry/volumes/src/G4ReflectionFactory.cc @@ -21,11 +21,9 @@ // ******************************************************************** // // -// $Id: G4ReflectionFactory.cc,v 1.11 2003/11/03 17:48:46 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ReflectionFactory.cc,v 1.1 2004/05/13 14:51:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // -// Author: Ivana Hrivnacova, 16.10.2001 (Ivana.Hrivnacova@cern.ch) - // // Class G4ReflectionFactory Implementation // @@ -49,6 +47,8 @@ // = TV * R * TD * x(inD) // = TV * R*TD*R-1 * R*x(inD) // = TV * ReflTD * x(inReflD) + +// Author: Ivana Hrivnacova, 16.10.2001 (Ivana.Hrivnacova@cern.ch) // -------------------------------------------------------------------- #include "G4ReflectionFactory.hh" @@ -56,6 +56,7 @@ #include "G4LogicalVolume.hh" #include "G4PVPlacement.hh" #include "G4PVReplica.hh" +#include "G4VPVDivisionFactory.hh" G4ReflectionFactory* G4ReflectionFactory::fInstance = 0; const G4String G4ReflectionFactory::fDefaultNameExtension = "_refl"; @@ -205,7 +206,8 @@ G4ReflectionFactory::Replicate(const G4String& name, // - or 0 if mother LV was not reflected. // --- - if (fVerboseLevel>0) { + if (fVerboseLevel>0) + { G4cout << "Replicate " << name << " lv " << LV << " " << LV->GetName() << G4endl; } @@ -226,6 +228,129 @@ G4ReflectionFactory::Replicate(const G4String& name, return G4PhysicalVolumesPair(pv1, pv2); } +//_____________________________________________________________________________ + +G4PhysicalVolumesPair +G4ReflectionFactory::Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4int nofDivisions, + G4double width, + G4double offset) +{ + // Creates division in the given mother. + // The result is a pair of physical volumes; + // the second physical volume is a division in a reflected mother + // or 0 if mother LV was not reflected. + // --- + + if (fVerboseLevel>0) + { + G4cout << "Divide " << name << " lv " << LV << " " + << LV->GetName() << G4endl; + } + + G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory(); + + G4VPhysicalVolume* pv1 = divisionFactory + ->CreatePVDivision(name, LV, motherLV, axis, nofDivisions, width, offset); + + G4VPhysicalVolume* pv2 = 0; + if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV)) + { + // if mother was reflected + // reflect the LV and replicate it in reflected mother + + pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV, + axis, nofDivisions, width, offset); + } + + return G4PhysicalVolumesPair(pv1, pv2); +} + + +//_____________________________________________________________________________ + +G4PhysicalVolumesPair +G4ReflectionFactory::Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4int nofDivisions, + G4double offset) +{ + // Creates division in the given mother. + // The result is a pair of physical volumes; + // the second physical volume is a division in a reflected mother + // or 0 if mother LV was not reflected. + // --- + + if (fVerboseLevel>0) + { + G4cout << "Divide " << name << " lv " << LV << " " + << LV->GetName() << G4endl; + } + + G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory(); + + G4VPhysicalVolume* pv1 = divisionFactory + ->CreatePVDivision(name, LV, motherLV, axis, nofDivisions, offset); + + G4VPhysicalVolume* pv2 = 0; + if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV)) + { + // if mother was reflected + // reflect the LV and replicate it in reflected mother + + pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV, + axis, nofDivisions, offset); + } + + return G4PhysicalVolumesPair(pv1, pv2); +} + + +//_____________________________________________________________________________ + +G4PhysicalVolumesPair +G4ReflectionFactory::Divide(const G4String& name, + G4LogicalVolume* LV, + G4LogicalVolume* motherLV, + EAxis axis, + G4double width, + G4double offset) +{ + // Creates division in the given mother. + // The result is a pair of physical volumes; + // the second physical volume is a division in a reflected mother + // or 0 if mother LV was not reflected. + // --- + + if (fVerboseLevel>0) + { + G4cout << "Divide " << name << " lv " << LV << " " + << LV->GetName() << G4endl; + } + + G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory(); + + G4VPhysicalVolume* pv1 = divisionFactory + -> CreatePVDivision(name, LV, motherLV, axis, width, offset); + + G4VPhysicalVolume* pv2 = 0; + if (G4LogicalVolume* reflMotherLV = GetReflectedLV(motherLV)) + { + // if mother was reflected + // reflect the LV and replicate it in reflected mother + + pv2 = divisionFactory->CreatePVDivision(name, ReflectLV(LV), reflMotherLV, + axis, width, offset); + } + + return G4PhysicalVolumesPair(pv1, pv2); +} + // // private methods @@ -268,11 +393,11 @@ G4LogicalVolume* G4ReflectionFactory::CreateReflectedLV(G4LogicalVolume* LV) // if (fReflectedLVMap.find(LV) != fReflectedLVMap.end()) { - G4cerr << "ERROR - G4ReflectionFactory::CreateReflectedLV(): " + G4cerr << "ERROR - G4ReflectionFactory::CreateReflectedLV(..): " << LV->GetName() << G4endl << " Cannot be applied to an already reflected volume !" << G4endl; - G4Exception("G4ReflectionFactory::CreateReflectedLV()", + G4Exception("G4ReflectionFactory::CreateReflectedLV(..)", "NotApplicable", FatalException, "Cannot be applied to a volume already reflected."); } @@ -321,6 +446,11 @@ void G4ReflectionFactory::ReflectDaughters(G4LogicalVolume* LV, { ReflectPVReplica(dPV, refLV); } + else if (G4VPVDivisionFactory::Instance() && + G4VPVDivisionFactory::Instance()->IsPVDivision(dPV)) + { + ReflectPVDivision(dPV, refLV); + } else { ReflectPVParameterised(dPV, refLV); @@ -355,8 +485,7 @@ void G4ReflectionFactory::ReflectPVPlacement(G4VPhysicalVolume* dPV, if (fVerboseLevel>0) G4cout << " will be reflected." << G4endl; - // get reflected volume if already created - // + // get reflected volume if already created // refDLV = GetReflectedLV(dLV); if (!refDLV) @@ -433,7 +562,7 @@ void G4ReflectionFactory::ReflectPVReplica(G4VPhysicalVolume* dPV, // recursive call // ReflectDaughters(dLV, refDLV); - } + } // create new daughter replica // @@ -454,6 +583,63 @@ void G4ReflectionFactory::ReflectPVReplica(G4VPhysicalVolume* dPV, //_____________________________________________________________________________ +void G4ReflectionFactory::ReflectPVDivision(G4VPhysicalVolume* dPV, + G4LogicalVolume* refLV) +{ + // Copies and transforms daughter of PVDivision type of + // a constituent volume into a reflected volume. + // --- + + G4VPVDivisionFactory* divisionFactory = GetPVDivisionFactory(); + + G4LogicalVolume* dLV = dPV->GetLogicalVolume(); + + // get parameterisation data + // + G4VPVParameterisation* param = dPV->GetParameterisation(); + + G4LogicalVolume* refDLV; + + if (fVerboseLevel>0) + G4cout << "Daughter: " << dPV << " " << dLV->GetName(); + + if (!IsReflected(dLV)) + { + if (fVerboseLevel>0) + G4cout << " will be reflected." << G4endl; + + // get reflected volume if already created + // + refDLV = GetReflectedLV(dLV); + + if (!refDLV) + { + // create new daughter solid and logical volume + // + refDLV = CreateReflectedLV(dLV); + + // recursive call + // + ReflectDaughters(dLV, refDLV); + } + + // create new daughter replica + // + divisionFactory->CreatePVDivision(dPV->GetName(), refDLV, refLV, param); + } + else + { + if (fVerboseLevel>0) + G4cout << " will be reconstitued." << G4endl; + + refDLV = GetConstituentLV(dLV); + + divisionFactory->CreatePVDivision(dPV->GetName(), refDLV, refLV, param); + } +} + +//_____________________________________________________________________________ + void G4ReflectionFactory::ReflectPVParameterised(G4VPhysicalVolume* dPV, G4LogicalVolume*) { @@ -462,11 +648,11 @@ void G4ReflectionFactory::ReflectPVParameterised(G4VPhysicalVolume* dPV, // a constituent volume into a reflected volume. // --- - G4cerr << "ERROR - G4ReflectionFactory::ReflectPVParameterised(): " + G4cerr << "ERROR - G4ReflectionFactory::ReflectPVParameterised(...): " << dPV->GetName() << G4endl << " Reflection of parameterised volumes " << "is not yet implemented." << G4endl; - G4Exception("G4ReflectionFactory::ReflectPVParameterised()", + G4Exception("G4ReflectionFactory::ReflectPVParameterised(...)", "NotImplemented", FatalException, "Sorry, not yet implemented."); } @@ -578,9 +764,9 @@ void G4ReflectionFactory::CheckScale(const G4Scale3D& scale) const if (diff > fScalePrecision) { - G4cerr << "ERROR - G4ReflectionFactory::CheckScale()" << G4endl + G4cerr << "ERROR - G4ReflectionFactory::CheckScale(..)" << G4endl << " Unexpected scale. Difference: " << diff << G4endl; - G4Exception("G4ReflectionFactory::CheckScale()", + G4Exception("G4ReflectionFactory::CheckScale(..)", "WrongArgumentValue", FatalException, "Unexpected scale in input !"); } @@ -588,6 +774,33 @@ void G4ReflectionFactory::CheckScale(const G4Scale3D& scale) const //_____________________________________________________________________________ +G4VPVDivisionFactory* G4ReflectionFactory::GetPVDivisionFactory() const +{ + // Returns the G4PVDivisionFactory instance if it exists, + // otherwise gives exception + // --- + + G4VPVDivisionFactory* divisionFactory = G4VPVDivisionFactory::Instance(); + if (!divisionFactory) + { + G4cerr << "ERROR - G4ReflectionFactory::GetPVDivisionFactory()" << G4endl + << " It has been requested to reflect divided volumes." + << G4endl + << " In this case, it is required to instantiate a concrete" + << G4endl + << " factory G4PVDivisionFactory in your program -before-" + << G4endl + << " executing the reflection !" << G4endl; + G4Exception("G4ReflectionFactory::GetPVDivisionFactory()", + "WrongSetup", FatalException, + "A concrete G4PVDivisionFactory instantiated is required !"); + } + + return divisionFactory; +} + +//_____________________________________________________________________________ + void G4ReflectionFactory::SetScalePrecision(G4double scaleValue) { fScalePrecision = scaleValue; diff --git a/source/geometry/volumes/src/G4TouchableHistory.cc b/source/geometry/volumes/src/G4TouchableHistory.cc index c4034bf998..6e6be85f88 100644 --- a/source/geometry/volumes/src/G4TouchableHistory.cc +++ b/source/geometry/volumes/src/G4TouchableHistory.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TouchableHistory.cc,v 1.8 2003/12/05 17:10:53 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4TouchableHistory.cc,v 1.10 2004/06/11 14:17:22 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // class G4TouchableHistory Implementation diff --git a/source/global/GNUmakefile b/source/global/GNUmakefile index 60f176d693..91d33eb13f 100644 --- a/source/global/GNUmakefile +++ b/source/global/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2001/10/11 14:04:04 gcosmo Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/01 15:36:12 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for global. Gabriele Cosmo, 26/9/96. # -------------------------------------------------------------- @@ -8,6 +8,8 @@ name := G4global SUBDIRS = management HEPNumerics SUBLIBS = G4globman G4hepnumerics +GLOBLIBS = + ifndef G4INSTALL G4INSTALL = ../.. endif diff --git a/source/global/HEPGeometry/GNUmakefile b/source/global/HEPGeometry/GNUmakefile index 624cf2d2b2..db030fff88 100644 --- a/source/global/HEPGeometry/GNUmakefile +++ b/source/global/HEPGeometry/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:08:51 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:18:56 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for global HEPGeometry. Gabriele Cosmo, 26/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk -CPPFLAGS += -I$(G4BASE)/global/management/include +CPPFLAGS += -DG4IOS_EXPORT +CPPFLAGS += -I$(G4BASE)/global/management/include include $(G4INSTALL)/config/common.gmk diff --git a/source/global/HEPNumerics/GNUmakefile b/source/global/HEPNumerics/GNUmakefile index 679a2a1827..2264799fb8 100644 --- a/source/global/HEPNumerics/GNUmakefile +++ b/source/global/HEPNumerics/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:08:53 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:18:57 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for global HEPNumerics. Gabriele Cosmo, 26/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4IOS_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include include $(G4INSTALL)/config/common.gmk diff --git a/source/global/HEPNumerics/src/G4DataInterpolation.cc b/source/global/HEPNumerics/src/G4DataInterpolation.cc index f068468884..a4fa603f99 100644 --- a/source/global/HEPNumerics/src/G4DataInterpolation.cc +++ b/source/global/HEPNumerics/src/G4DataInterpolation.cc @@ -21,12 +21,13 @@ // ******************************************************************** // // -// $Id: G4DataInterpolation.cc,v 1.4 2001/07/11 10:00:41 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4DataInterpolation.cc,v 1.5 2004/04/23 06:52:57 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4DataInterpolation.hh" - +////////////////////////////////////////////////////////////////////////////// +// // Constructor for initializing of fArgument, fFunction and fNumber data members G4DataInterpolation::G4DataInterpolation( G4double pX[], @@ -45,6 +46,8 @@ G4DataInterpolation::G4DataInterpolation( G4double pX[], } } +//////////////////////////////////////////////////////////////////////////// +// // Constructor for cubic spline interpolation. It creates the array // fSecondDerivative[0,...fNumber-1] which is used in this interpolation by // the function @@ -120,7 +123,7 @@ G4DataInterpolation::G4DataInterpolation( G4double pX[], delete[] u ; } -// ---------------------------------------------------------------------------- +//////////////////////////////////////////////////////////////////////////////////// // // Destructor deletes dynamically created arrays for data members: fArgument, // fFunction and fSecondDerivative, all have dimension of fNumber @@ -132,7 +135,7 @@ G4DataInterpolation::~G4DataInterpolation() if(fSecondDerivative) delete[] fSecondDerivative ; } -// ------------------------------------------------------------------------ +//////////////////////////////////////////////////////////////////////////////////// // // This function returns the value P(pX), where P(x) is polynom of fNumber-1 degree // such that P(fArgument[i]) = fFunction[i], for i = 0, ..., fNumber-1 . This is @@ -147,7 +150,7 @@ G4DataInterpolation::PolynomInterpolation(G4double pX, G4double* c = new G4double[fNumber] ; G4double* d = new G4double[fNumber] ; diff = fabs(pX-fArgument[0]) ; - for(i=1;i object + inline void ResetStorage(); + // Returns allocated storage to the free store, resets + // allocator and page sizes. + // Note: contents in memory are lost using this call ! + + inline int GetAllocatedSize(); + // Returns the size of the total memory allocated + private: void AddNewPage(); @@ -149,8 +157,8 @@ void G4Allocator::FreeSingle(Type* anElement) // The gcc-3.1 compiler will complain and not correctly handle offsets // computed from non-POD types. Pointers to member data should be used - // instead. This advanced C++ feature seems not to work on earlier - // versions of the same compiler. + // instead. This C++ feature seems not to work on earlier versions of + // the same compiler. // #if (__GNUC__==3) && (__GNUC_MINOR__>0) Type G4AllocatorUnit::*pOffset = &G4AllocatorUnit::fElement; @@ -194,6 +202,54 @@ void G4Allocator::AddNewPage() fFreeList = &aPage->fUnits[0]; } +// ************************************************************ +// ResetStorage +// ************************************************************ +// +template +void G4Allocator::ResetStorage() +{ + // Clear all allocated storage and return it to the free store + // + G4AllocatorPage * aPage; + G4AllocatorPage * aNextPage; + + aPage = fPages; + while (aPage != 0) + { + aNextPage = aPage->fNext; + free(aPage->fUnits); + delete aPage; + aPage = aNextPage; + } + + // Reset unit&page size and allocate a single page + // + fPages = 0; + fFreeList = 0; + fUnitSize = sizeof(G4AllocatorUnit); + fPageSize = ( (fUnitSize < 512) ? 1024 : (fUnitSize*10) ); + AddNewPage(); +} + +// ************************************************************ +// GetAllocatedSize +// ************************************************************ +// +template +int G4Allocator::GetAllocatedSize() +{ + G4AllocatorPage * aPage = fPages; + int count = 0; + + while (aPage != 0) + { + aPage = aPage->fNext; + count++; + } + return count*fPageSize; +} + // ************************************************************ // AddNewElement // ************************************************************ diff --git a/source/global/management/include/G4Types.hh b/source/global/management/include/G4Types.hh index 093dd3034f..2ee770a2ce 100644 --- a/source/global/management/include/G4Types.hh +++ b/source/global/management/include/G4Types.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Types.hh,v 1.7 2003/06/17 08:14:50 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4Types.hh,v 1.9 2004/06/09 07:30:01 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // GEANT4 native types @@ -32,11 +32,26 @@ #ifndef G4TYPES_HH #define G4TYPES_HH -// Disable warning C4786 on WIN32 architectures: identifier was truncated -// to '255' characters in the debug information -// #ifdef WIN32 + // Disable warning C4786 on WIN32 architectures: + // identifier was truncated to '255' characters + // in the debug information + // #pragma warning ( disable : 4786 ) + // + // Define DLL export macro for WIN32 systems for + // importing/exporting external symbols to DLLs + // + #if defined G4LIB_BUILD_DLL + #define G4DLLEXPORT __declspec( dllexport ) + #define G4DLLIMPORT __declspec( dllimport ) + #else + #define G4DLLEXPORT + #define G4DLLIMPORT + #endif +#else + #define G4DLLEXPORT + #define G4DLLIMPORT #endif // Disable deprecated warnings for usage of strstream on Linux @@ -45,7 +60,7 @@ #if (__GNUC__==3) && (__GNUC_MINOR__>0) #undef __DEPRECATED #endif - + #include #include diff --git a/source/global/management/include/G4ios.hh b/source/global/management/include/G4ios.hh index c781cf8003..77561051bb 100644 --- a/source/global/management/include/G4ios.hh +++ b/source/global/management/include/G4ios.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ios.hh,v 1.7 2003/06/06 16:17:14 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ios.hh,v 1.9 2004/06/09 07:30:01 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- @@ -36,20 +36,15 @@ #include "G4Types.hh" -#if defined(OO_DDL_TRANSLATION) -/* - * stdlib needs to be included before iostream.h - * during oddlx runs to work around a parser - * problem of AIX ooddlx v4.0.2 with some versions of - * AIX system header files. - */ -#include -#endif - #include -extern std::ostream G4cout; -extern std::ostream G4cerr; +#if defined G4IOS_EXPORT + extern G4DLLEXPORT std::ostream G4cout; + extern G4DLLEXPORT std::ostream G4cerr; +#else + extern G4DLLIMPORT std::ostream G4cout; + extern G4DLLIMPORT std::ostream G4cerr; +#endif #define G4cin std::cin #define G4endl std::endl diff --git a/source/global/management/include/G4strstreambuf.hh b/source/global/management/include/G4strstreambuf.hh index a79d7d11a1..a816b7ea17 100644 --- a/source/global/management/include/G4strstreambuf.hh +++ b/source/global/management/include/G4strstreambuf.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4strstreambuf.hh,v 1.10 2003/06/06 16:17:14 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4strstreambuf.hh,v 1.12 2004/06/09 07:30:02 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- @@ -40,8 +40,14 @@ #include "G4coutDestination.hh" class G4strstreambuf; -extern G4strstreambuf G4coutbuf; -extern G4strstreambuf G4cerrbuf; + +#if defined G4IOS_EXPORT + extern G4DLLEXPORT G4strstreambuf G4coutbuf; + extern G4DLLEXPORT G4strstreambuf G4cerrbuf; +#else + extern G4DLLIMPORT G4strstreambuf G4coutbuf; + extern G4DLLIMPORT G4strstreambuf G4cerrbuf; +#endif class G4strstreambuf : public std::streambuf { diff --git a/source/global/management/src/G4ios.cc b/source/global/management/src/G4ios.cc index 20a4db1038..851b3d13df 100644 --- a/source/global/management/src/G4ios.cc +++ b/source/global/management/src/G4ios.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ios.cc,v 1.6 2003/06/06 16:17:18 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ios.cc,v 1.8 2004/06/11 14:18:59 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- diff --git a/source/graphics_reps/GNUmakefile b/source/graphics_reps/GNUmakefile index be6b0aecfc..99877df758 100644 --- a/source/graphics_reps/GNUmakefile +++ b/source/graphics_reps/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:09:08 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/01 15:36:32 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for graphics_reps library. John Allison, 19/7/96. # -------------------------------------------------------------- @@ -9,6 +9,8 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4BASE)/global/management/include \ diff --git a/source/graphics_reps/History b/source/graphics_reps/History index e3197357bd..c91f1fd541 100644 --- a/source/graphics_reps/History +++ b/source/graphics_reps/History @@ -1,4 +1,4 @@ -cvs log $Id: History,v 1.47 2003/09/18 11:03:10 johna Exp $ +cvs log $Id: History,v 1.51 2004/06/07 08:55:29 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,7 +17,16 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- -18th September 2003 John Alison (greps-V05-02-00) +7th June 2004 G.Cosmo (greps-V06-01-01) +- Fixed compilation problem on WIN32-VC for G4AttDefStore. +- Added definition of GLOBLIBS in GNUmakefile for DLLs build on Windows. + +30th March 2004 G.Cosmo (greps-V06-01-00) +- Implemented constructor and destructor for G4AttDefStore, to properly + delete objects in the static map, allocated through explicit calls to + GetInstance(). Made G4AttDefStore a singleton. + +18th September 2003 J.Allison (greps-V05-02-00) - Introduced G4Colour<->G4ThreeVector conversion operators. 3rd April 2003 G.Cosmo (greps-V05-00-00) @@ -26,20 +35,20 @@ committal in the CVS repository ! 27th November 2002 J.Allison (greps-V04-01-05) - Small revison of G4Scale and improvements in G4VMarker class description. -Nov 20, 2002, G.Cosmo (greps-V04-01-04) +20th November 2002 G.Cosmo (greps-V04-01-04) - Patched access to public static data in G4Scale and G4VisAttributes. Added static accessors to be used in the kernel to allow porting on Windows DLLs. - HepPolyhedron[.hh.cc]: changed inline static methods to not inlined. -Nov 11, 2002, E.Chernaev (greps-V04-01-03) +11th November 2002 E.Chernaev (greps-V04-01-03) - Minor bug fix in HepPolyhedron::GetFacet(). - HepDouble, HepBoolean --> double, bool in HepPolyhedron -Nov 7, 2002, E.Chernaev (greps-V04-01-02) +7th November 2002 E.Chernaev (greps-V04-01-02) - Added createTwistedTrap() and createPolyhedron() to HepPolyhedron. -Oct 28, 2002, J.Allison (greps-V04-01-01) +28th October 2002 J.Allison (greps-V04-01-01) - Changed AttDefStore to return a map. 24th October 2002 John Allison (greps-V04-01-00) diff --git a/source/graphics_reps/include/G4AttDefStore.hh b/source/graphics_reps/include/G4AttDefStore.hh index c49ead046f..a77a468030 100644 --- a/source/graphics_reps/include/G4AttDefStore.hh +++ b/source/graphics_reps/include/G4AttDefStore.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4AttDefStore.hh,v 1.4 2003/06/16 16:55:05 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4AttDefStore.hh,v 1.6 2004/06/07 08:54:00 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ #ifndef G4ATTDEFSTORE_HH #define G4ATTDEFSTORE_HH @@ -32,18 +32,31 @@ class G4AttDef; -class G4AttDefStore{ -public: - static std::map* - GetInstance(G4String storeName,bool& isNew); - // Returns a pointer to the named store and isNew is true if store is new. -protected: - G4AttDefStore(); - ~G4AttDefStore(); -private: - G4AttDefStore(const G4AttDefStore&); - G4AttDefStore& operator=(const G4AttDefStore&); - static std::map*> m_stores; +class G4AttDefStore +{ + public: + + static std::map* + GetInstance(G4String storeName, G4bool& isNew); + // Returns a pointer to the named store + // and isNew is true if store is new. + // The store keeps the ownership of the returned + // pointer to the map. + + ~G4AttDefStore(); + // Destructor. + + protected: + + G4AttDefStore(); + + private: + + G4AttDefStore(const G4AttDefStore&); + G4AttDefStore& operator=(const G4AttDefStore&); + + static std::map*> m_stores; + static G4AttDefStore* theInstance; }; #endif //G4ATTDEFSTORE_H diff --git a/source/graphics_reps/src/G4AttDefStore.cc b/source/graphics_reps/src/G4AttDefStore.cc index 36e90c8fe7..f2bae371a4 100644 --- a/source/graphics_reps/src/G4AttDefStore.cc +++ b/source/graphics_reps/src/G4AttDefStore.cc @@ -21,28 +21,67 @@ // ******************************************************************** // // -// $Id: G4AttDefStore.cc,v 1.3 2003/06/16 16:55:18 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4AttDefStore.cc,v 1.5 2004/03/31 06:50:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ #include "G4AttDefStore.hh" #include "G4AttDef.hh" +G4AttDefStore* G4AttDefStore::theInstance = 0; std::map*> G4AttDefStore::m_stores; std::map* -G4AttDefStore::GetInstance(G4String storeName,bool& isNew) { +G4AttDefStore::GetInstance(G4String storeName, G4bool& isNew) +{ + // Create the private static instance first to allow for + // the deletion of the allocated attributes in the map store + // + static G4AttDefStore theStore; + if (!theInstance) + { + theInstance = &theStore; + } + + // Allocate the new map if not existing already + // and return it to the caller + // std::map* store; std::map*>::iterator iStore = m_stores.find(storeName); - if (iStore == m_stores.end()) { + + if (iStore == m_stores.end()) + { isNew = true; store = new std::map; m_stores[storeName] = store; } - else { + else + { isNew = false; store = iStore->second; } return store; } + +G4AttDefStore::G4AttDefStore() +{ +} + +G4AttDefStore::~G4AttDefStore() +{ + std::map*>::iterator iStore, iStore_tmp; + for ( iStore = m_stores.begin(); iStore != m_stores.end(); ) + { + if (iStore->second) + { + delete iStore->second; + iStore_tmp = iStore++; + m_stores.erase(iStore_tmp); + } + else + { + ++iStore; + } + } +} diff --git a/source/intercoms/GNUmakefile b/source/intercoms/GNUmakefile index 35d89dc51a..e051e274ad 100644 --- a/source/intercoms/GNUmakefile +++ b/source/intercoms/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:09:20 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/01 15:36:48 gcosmo Exp $ # ------------------------------------------------------------- # GNUmakefile for intercoms library. Gabriele Cosmo, 11/11/96. # ------------------------------------------------------------- @@ -9,6 +9,8 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4BASE)/global/management/include \ diff --git a/source/intercoms/History b/source/intercoms/History index da558fac66..026f6977da 100644 --- a/source/intercoms/History +++ b/source/intercoms/History @@ -1,4 +1,4 @@ -$Id: History,v 1.54 2003/06/07 16:41:03 gcosmo Exp $ +$Id: History,v 1.57 2004/06/07 13:28:55 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 7, 2004, G.Cosmo (intercoms-V06-01-02) +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. + +May 16, 2004, M.Asai (intercoms-V06-01-01) +- Introducing utility methods ConvertToStringWithBestUnit() and + ConvertToStringWithDefaultUnit() for command classes taking a unit parameter. + +May 16, 2004, M.Asai (intercoms-V06-01-00) +- Introducing static methods in G4UIcommand class for conversion between + a string and a value. Some implementation of derived classes are modified + accordingly. + Jun 07, 2003, G.Cosmo (intercoms-V05-01-02) - G4UItokenNum.hh: corrected implementation of operator=(). diff --git a/source/intercoms/include/G4UIcmdWith3Vector.hh b/source/intercoms/include/G4UIcmdWith3Vector.hh index a6c504252d..0c1d75481a 100644 --- a/source/intercoms/include/G4UIcmdWith3Vector.hh +++ b/source/intercoms/include/G4UIcmdWith3Vector.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWith3Vector.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWith3Vector.hh,v 1.6 2004/05/16 18:42:29 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -44,13 +44,9 @@ class G4UIcmdWith3Vector : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4ThreeVector GetNew3VectorValue(const char* paramString); + static G4ThreeVector GetNew3VectorValue(const char* paramString); // Convert string which represents three double values to // G4ThreeVector. - G4String ConvertToString(G4ThreeVector vec); - // Convert G4ThreeVector to a string which represents three - // double values. This method must be used by the messenger - // for its GetCurrentValues() method. void SetParameterName(const char * theNameX,const char * theNameY, const char * theNameZ,G4bool omittable,G4bool currentAsDefault=false); // Set the parameter names for three parameters. Names are used by diff --git a/source/intercoms/include/G4UIcmdWith3VectorAndUnit.hh b/source/intercoms/include/G4UIcmdWith3VectorAndUnit.hh index 56544485d1..5d091742d5 100644 --- a/source/intercoms/include/G4UIcmdWith3VectorAndUnit.hh +++ b/source/intercoms/include/G4UIcmdWith3VectorAndUnit.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWith3VectorAndUnit.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWith3VectorAndUnit.hh,v 1.7 2004/05/16 20:42:37 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -44,21 +44,24 @@ class G4UIcmdWith3VectorAndUnit : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4ThreeVector GetNew3VectorValue(const char* paramString); + static G4ThreeVector GetNew3VectorValue(const char* paramString); // Convert string which represents three double values and a unit to // G4ThreeVector. Values are converted to the Geant4 internal unit. - G4ThreeVector GetNew3VectorRawValue(const char* paramString); + static G4ThreeVector GetNew3VectorRawValue(const char* paramString); // Convert string which represents three double values and a unit to // G4ThreeVector. Values are NOT converted to the Geant4 internal unit // but just as the given string. - G4double GetNewUnitValue(const char* paramString); + static G4double GetNewUnitValue(const char* paramString); // Convert the unit string to the value of the unit. "paramString" // must contain three double values AND a unit string. - G4String ConvertToString(G4ThreeVector vec,const char * unitName); - // Convert G4ThreeVector and the unit to a string which represents three - // double values and the unit. This method must be used by the messenger - // for its GetCurrentValues() method. Values of the three vector will be - // devided by the value of the unit. + G4String ConvertToStringWithBestUnit(G4ThreeVector vec); + // Convert a 3 vector value to a string of digits and unit. Best unit is + // chosen from the unit category of default unit (in case SetDefaultUnit() + // is defined) or category defined by SetUnitCategory(). + G4String ConvertToStringWithDefaultUnit(G4ThreeVector vec); + // Convert a 3 vector value to a string of digits and unit. Best unit is + // chosen from the category defined by SetUnitCategory() in case default + // unit is not defined. void SetParameterName(const char * theNameX,const char * theNameY, const char * theNameZ,G4bool omittable,G4bool currentAsDefault=false); // Set the parameter names for three parameters. Names are used by diff --git a/source/intercoms/include/G4UIcmdWithABool.hh b/source/intercoms/include/G4UIcmdWithABool.hh index a8ec930e63..770c5a4289 100644 --- a/source/intercoms/include/G4UIcmdWithABool.hh +++ b/source/intercoms/include/G4UIcmdWithABool.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithABool.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithABool.hh,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -47,11 +47,8 @@ class G4UIcmdWithABool : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4bool GetNewBoolValue(const char* paramString); + static G4bool GetNewBoolValue(const char* paramString); // Convert string which represents a boolean value to G4bool. - G4String ConvertToString(G4bool intValue); - // Convert a boolean value to a string. This method must be used by - // the messenger for its GetCurrentValues() method. void SetParameterName(const char * theName,G4bool omittable, G4bool currentAsDefault=false); // Set the parameter name for a boolean parameter. diff --git a/source/intercoms/include/G4UIcmdWithADouble.hh b/source/intercoms/include/G4UIcmdWithADouble.hh index 8ffc02fdac..0d7879da91 100644 --- a/source/intercoms/include/G4UIcmdWithADouble.hh +++ b/source/intercoms/include/G4UIcmdWithADouble.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithADouble.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithADouble.hh,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -43,11 +43,8 @@ class G4UIcmdWithADouble : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4double GetNewDoubleValue(const char* paramString); + static G4double GetNewDoubleValue(const char* paramString); // Convert string which represents a double value to a double. - G4String ConvertToString(G4double dblValue); - // Convert a double value to a string. This method must be used by - // the messenger for its GetCurrentValues() method. void SetParameterName(const char * theName,G4bool omittable, G4bool currentAsDefault=false); // Set the parameter name. The name is used by the range checking. diff --git a/source/intercoms/include/G4UIcmdWithADoubleAndUnit.hh b/source/intercoms/include/G4UIcmdWithADoubleAndUnit.hh index 1a4465e0e6..dd5484d10e 100644 --- a/source/intercoms/include/G4UIcmdWithADoubleAndUnit.hh +++ b/source/intercoms/include/G4UIcmdWithADoubleAndUnit.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithADoubleAndUnit.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithADoubleAndUnit.hh,v 1.7 2004/05/16 20:42:37 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -43,21 +43,24 @@ class G4UIcmdWithADoubleAndUnit : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4double GetNewDoubleValue(const char* paramString); + static G4double GetNewDoubleValue(const char* paramString); // Convert string which represents a double value and a unit to // double. Value is converted to the Geant4 internal unit. - G4double GetNewDoubleRawValue(const char* paramString); + static G4double GetNewDoubleRawValue(const char* paramString); // Convert string which represents a double value and a unit to // double. Value is NOT converted to the Geant4 internal unit // but just as the given string. - G4double GetNewUnitValue(const char* paramString); + static G4double GetNewUnitValue(const char* paramString); // Convert the unit string to the value of the unit. "paramString" // must contain a double value AND a unit string. - G4String ConvertToString(G4double dblValue,const char * unitName); - // Convert a double value and the unit to a string which represents a - // double value and the unit. This method must be used by the messenger - // for its GetCurrentValues() method. Value of the double will be - // devided by the value of the unit. + G4String ConvertToStringWithBestUnit(G4double val); + // Convert a double value to a string of digits and unit. Best unit is + // chosen from the unit category of default unit (in case SetDefaultUnit() + // is defined) or category defined by SetUnitCategory(). + G4String ConvertToStringWithDefaultUnit(G4double val); + // Convert a double value to a string of digits and unit. Best unit is + // chosen from the category defined by SetUnitCategory() in case default + // unit is not defined. void SetParameterName(const char * theName,G4bool omittable, G4bool currentAsDefault=false); // Set the parameter name for double parameterxs. Name is used by diff --git a/source/intercoms/include/G4UIcmdWithAnInteger.hh b/source/intercoms/include/G4UIcmdWithAnInteger.hh index 1750077797..ca3c8e75b7 100644 --- a/source/intercoms/include/G4UIcmdWithAnInteger.hh +++ b/source/intercoms/include/G4UIcmdWithAnInteger.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithAnInteger.hh,v 1.5 2002/04/26 22:03:35 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithAnInteger.hh,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -43,11 +43,8 @@ class G4UIcmdWithAnInteger : public G4UIcommand (const char * theCommandPath,G4UImessenger * theMessenger); // Constructor. The command string with full path directory // and the pointer to the messenger must be given. - G4int GetNewIntValue(const char* paramString); + static G4int GetNewIntValue(const char* paramString); // Convert string which represents an integer to an integer. - G4String ConvertToString(G4int intValue); - // Convert an integer value to a string. This method must be used by - // the messenger for its GetCurrentValues() method. void SetParameterName(const char * theName,G4bool omittable, G4bool currentAsDefault=false); // Set the parameter name. The name is used by the range checking. diff --git a/source/intercoms/include/G4UIcommand.hh b/source/intercoms/include/G4UIcommand.hh index 88052161bd..d4e4c39580 100644 --- a/source/intercoms/include/G4UIcommand.hh +++ b/source/intercoms/include/G4UIcommand.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcommand.hh,v 1.13 2003/06/16 16:55:32 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcommand.hh,v 1.14 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -35,6 +35,7 @@ class G4UImessenger; #include "G4ApplicationState.hh" #include #include "G4UItokenNum.hh" +#include "G4ThreeVector.hh" // class description: // @@ -78,10 +79,30 @@ class G4UIcommand G4bool IsAvailable(); virtual void List(); - public: + public: // with description + static G4String ConvertToString(G4bool boolVal); + static G4String ConvertToString(G4int intValue); + static G4String ConvertToString(G4double doubleValue); + static G4String ConvertToString(G4double doubleValue,const char* unitName); + static G4String ConvertToString(G4ThreeVector vec); + static G4String ConvertToString(G4ThreeVector vec,const char* unitName); + // Static methods for conversion from value(s) to a string. These methods are to be + // used by GetCurrentValues() methods of concrete messengers. + + static G4bool ConvertToBool(const char* st); + static G4int ConvertToInt(const char* st); + static G4double ConvertToDouble(const char* st); + static G4double ConvertToDimensionedDouble(const char* st); + static G4ThreeVector ConvertTo3Vector(const char* st); + static G4ThreeVector ConvertToDimensioned3Vector(const char* st); + // Static methods for conversion from a string to a value of the returning type. + // These methods are to be used directly by SetNewValues() methods of concrete + // messengers, or GetNewXXXValue() of classes derived from this G4UIcommand class. + static G4double ValueOf(const char* unitName); static G4String CategoryOf(const char* unitName); static G4String UnitsList(const char* unitCategory); + // Static methods for unit and its category. private: void G4UIcommandCommonConstructorCode (const char * theCommandPath); diff --git a/source/intercoms/src/G4UIcmdWith3Vector.cc b/source/intercoms/src/G4UIcmdWith3Vector.cc index 1d477ae1d7..aa5d102c87 100644 --- a/source/intercoms/src/G4UIcmdWith3Vector.cc +++ b/source/intercoms/src/G4UIcmdWith3Vector.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWith3Vector.cc,v 1.5 2003/06/16 16:55:36 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWith3Vector.cc,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -43,21 +43,7 @@ G4UIcmdWith3Vector::G4UIcmdWith3Vector G4ThreeVector G4UIcmdWith3Vector::GetNew3VectorValue(const char* paramString) { - G4double vx; - G4double vy; - G4double vz; - std::istrstream is((char*)paramString); - is >> vx >> vy >> vz; - return G4ThreeVector(vx,vy,vz); -} - -G4String G4UIcmdWith3Vector::ConvertToString(G4ThreeVector vec) -{ - char st[100]; - std::ostrstream os(st,100); - os << vec.x() << " " << vec.y() << " " << vec.z() << '\0'; - G4String vl = st; - return vl; + return ConvertTo3Vector(paramString); } void G4UIcmdWith3Vector::SetParameterName diff --git a/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc b/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc index 4b924accef..b410b4284f 100644 --- a/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc +++ b/source/intercoms/src/G4UIcmdWith3VectorAndUnit.cc @@ -21,12 +21,14 @@ // ******************************************************************** // // -// $Id: G4UIcmdWith3VectorAndUnit.cc,v 1.5 2003/06/16 16:55:37 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWith3VectorAndUnit.cc,v 1.7 2004/05/16 20:42:37 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // #include "G4UIcmdWith3VectorAndUnit.hh" +#include "G4Tokenizer.hh" +#include "G4UnitsTable.hh" #include G4UIcmdWith3VectorAndUnit::G4UIcmdWith3VectorAndUnit @@ -46,15 +48,7 @@ G4UIcmdWith3VectorAndUnit::G4UIcmdWith3VectorAndUnit G4ThreeVector G4UIcmdWith3VectorAndUnit::GetNew3VectorValue(const char* paramString) { - G4double vx; - G4double vy; - G4double vz; - char unts[30]; - std::istrstream is((char*)paramString); - is >> vx >> vy >> vz >> unts; - G4String unt = unts; - G4double uv = ValueOf(unt); - return G4ThreeVector(vx*uv,vy*uv,vz*uv); + return ConvertToDimensioned3Vector(paramString); } G4ThreeVector G4UIcmdWith3VectorAndUnit::GetNew3VectorRawValue(const char* paramString) @@ -80,18 +74,29 @@ G4double G4UIcmdWith3VectorAndUnit::GetNewUnitValue(const char* paramString) return ValueOf(unt); } -G4String G4UIcmdWith3VectorAndUnit::ConvertToString -(G4ThreeVector vec,const char * unitName) +G4String G4UIcmdWith3VectorAndUnit::ConvertToStringWithBestUnit(G4ThreeVector vec) { - G4String unt = unitName; - G4double uv = ValueOf(unitName); - - char st[100]; - std::ostrstream os(st,100); - os << vec.x()/uv << " " << vec.y()/uv << " " << vec.z()/uv - << " " << unitName << '\0'; - G4String vl = st; - return vl; + G4UIparameter* unitParam = GetParameter(3); + G4String canList = unitParam->GetParameterCandidates(); + G4Tokenizer candidateTokenizer(canList); + G4String aToken = candidateTokenizer(); + char strg[120]; + std::ostrstream os(strg,120); + os << G4BestUnit(vec,CategoryOf(aToken)) << '\0'; + + G4String st = strg; + return st; +} + +G4String G4UIcmdWith3VectorAndUnit::ConvertToStringWithDefaultUnit(G4ThreeVector vec) +{ + G4UIparameter* unitParam = GetParameter(3); + G4String st; + if(unitParam->IsOmittable()) + { st = ConvertToString(vec,unitParam->GetDefaultValue()); } + else + { st = ConvertToStringWithBestUnit(vec); } + return st; } void G4UIcmdWith3VectorAndUnit::SetParameterName diff --git a/source/intercoms/src/G4UIcmdWithABool.cc b/source/intercoms/src/G4UIcmdWithABool.cc index 5386e162b5..38891cfb90 100644 --- a/source/intercoms/src/G4UIcmdWithABool.cc +++ b/source/intercoms/src/G4UIcmdWithABool.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithABool.cc,v 1.5 2003/06/16 16:55:38 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithABool.cc,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -39,19 +39,7 @@ G4UIcmdWithABool::G4UIcmdWithABool G4bool G4UIcmdWithABool::GetNewBoolValue(const char* paramString) { - G4String v = paramString; - v.toUpper(); - G4bool vl = false; - if( v=="Y" || v=="YES" || v=="1" || v=="T" || v=="TRUE" ) - { vl = true; } - return vl; -} - -G4String G4UIcmdWithABool::ConvertToString(G4bool blValue) -{ - G4String vl = "0"; - if(blValue) vl = "1"; - return vl; + return ConvertToBool(paramString); } void G4UIcmdWithABool::SetParameterName diff --git a/source/intercoms/src/G4UIcmdWithADouble.cc b/source/intercoms/src/G4UIcmdWithADouble.cc index 1806ef917f..e2f1cb9e2a 100644 --- a/source/intercoms/src/G4UIcmdWithADouble.cc +++ b/source/intercoms/src/G4UIcmdWithADouble.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithADouble.cc,v 1.5 2003/06/16 16:55:39 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithADouble.cc,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -39,19 +39,7 @@ G4UIcmdWithADouble::G4UIcmdWithADouble G4double G4UIcmdWithADouble::GetNewDoubleValue(const char* paramString) { - G4double vl; - std::istrstream is((char*)paramString); - is >> vl; - return vl; -} - -G4String G4UIcmdWithADouble::ConvertToString(G4double dblValue) -{ - char st[20]; - std::ostrstream os(st,20); - os << dblValue << '\0'; - G4String vl = st; - return vl; + return ConvertToDouble(paramString); } void G4UIcmdWithADouble::SetParameterName diff --git a/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc b/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc index d363cd1ff2..b93987e503 100644 --- a/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc +++ b/source/intercoms/src/G4UIcmdWithADoubleAndUnit.cc @@ -21,12 +21,14 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithADoubleAndUnit.cc,v 1.5 2003/06/16 16:55:40 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithADoubleAndUnit.cc,v 1.7 2004/05/16 20:42:37 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // #include "G4UIcmdWithADoubleAndUnit.hh" +#include "G4Tokenizer.hh" +#include "G4UnitsTable.hh" #include G4UIcmdWithADoubleAndUnit::G4UIcmdWithADoubleAndUnit @@ -42,14 +44,7 @@ G4UIcmdWithADoubleAndUnit::G4UIcmdWithADoubleAndUnit G4double G4UIcmdWithADoubleAndUnit::GetNewDoubleValue(const char* paramString) { - G4double vl; - char unts[30]; - - std::istrstream is((char*)paramString); - is >> vl >> unts; - G4String unt = unts; - - return (vl*ValueOf(unt)); + return ConvertToDimensionedDouble(paramString); } G4double G4UIcmdWithADoubleAndUnit::GetNewDoubleRawValue(const char* paramString) @@ -75,17 +70,29 @@ G4double G4UIcmdWithADoubleAndUnit::GetNewUnitValue(const char* paramString) return ValueOf(unt); } -G4String G4UIcmdWithADoubleAndUnit::ConvertToString -(G4double dblValue,const char * unitName) +G4String G4UIcmdWithADoubleAndUnit::ConvertToStringWithBestUnit(G4double val) { - G4String unt = unitName; - G4double uv = ValueOf(unitName); - - char st[50]; - std::ostrstream os(st,50); - os << dblValue/uv << " " << unitName << '\0'; - G4String vl = st; - return vl; + G4UIparameter* unitParam = GetParameter(1); + G4String canList = unitParam->GetParameterCandidates(); + G4Tokenizer candidateTokenizer(canList); + G4String aToken = candidateTokenizer(); + char strg[60]; + std::ostrstream os(strg,60); + os << G4BestUnit(val,CategoryOf(aToken)) << '\0'; + + G4String st = strg; + return st; +} + +G4String G4UIcmdWithADoubleAndUnit::ConvertToStringWithDefaultUnit(G4double val) +{ + G4UIparameter* unitParam = GetParameter(1); + G4String st; + if(unitParam->IsOmittable()) + { st = ConvertToString(val,unitParam->GetDefaultValue()); } + else + { st = ConvertToStringWithBestUnit(val); } + return st; } void G4UIcmdWithADoubleAndUnit::SetParameterName diff --git a/source/intercoms/src/G4UIcmdWithAnInteger.cc b/source/intercoms/src/G4UIcmdWithAnInteger.cc index 0b2889cf9f..859e4328d0 100644 --- a/source/intercoms/src/G4UIcmdWithAnInteger.cc +++ b/source/intercoms/src/G4UIcmdWithAnInteger.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcmdWithAnInteger.cc,v 1.5 2003/06/16 16:55:42 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcmdWithAnInteger.cc,v 1.6 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -39,19 +39,7 @@ G4UIcmdWithAnInteger::G4UIcmdWithAnInteger G4int G4UIcmdWithAnInteger::GetNewIntValue(const char* paramString) { - G4int vl; - std::istrstream is((char*)paramString); - is >> vl; - return vl; -} - -G4String G4UIcmdWithAnInteger::ConvertToString(G4int intValue) -{ - char st[20]; - std::ostrstream os(st,20); - os << intValue << '\0'; - G4String vl = st; - return vl; + return ConvertToInt(paramString); } void G4UIcmdWithAnInteger::SetParameterName diff --git a/source/intercoms/src/G4UIcommand.cc b/source/intercoms/src/G4UIcommand.cc index 9ed1798628..4cf30f88cc 100644 --- a/source/intercoms/src/G4UIcommand.cc +++ b/source/intercoms/src/G4UIcommand.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIcommand.cc,v 1.22 2003/06/16 16:55:43 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIcommand.cc,v 1.23 2004/05/16 18:42:30 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -342,6 +342,127 @@ void G4UIcommand::List() G4cout << G4endl; } +G4String G4UIcommand::ConvertToString(G4bool boolVal) +{ + G4String vl = "0"; + if(boolVal) vl = "1"; + return vl; +} + +G4String G4UIcommand::ConvertToString(G4int intValue) +{ + char st[20]; + std::ostrstream os(st,20); + os << intValue << '\0'; + G4String vl = st; + return vl; +} + +G4String G4UIcommand::ConvertToString(G4double doubleValue) +{ + char st[40]; + std::ostrstream os(st,40); + os << doubleValue << '\0'; + G4String vl = st; + return vl; +} + +G4String G4UIcommand::ConvertToString(G4double doubleValue,const char* unitName) +{ + G4String unt = unitName; + G4double uv = ValueOf(unitName); + + char st[60]; + std::ostrstream os(st,60); + os << doubleValue/uv << " " << unitName << '\0'; + G4String vl = st; + return vl; +} + +G4String G4UIcommand::ConvertToString(G4ThreeVector vec) +{ + char st[100]; + std::ostrstream os(st,100); + os << vec.x() << " " << vec.y() << " " << vec.z() << '\0'; + G4String vl = st; + return vl; +} + +G4String G4UIcommand::ConvertToString(G4ThreeVector vec,const char* unitName) +{ + G4String unt = unitName; + G4double uv = ValueOf(unitName); + + char st[120]; + std::ostrstream os(st,120); + os << vec.x()/uv << " " << vec.y()/uv << " " << vec.z()/uv + << " " << unitName << '\0'; + G4String vl = st; + return vl; +} + +G4bool G4UIcommand::ConvertToBool(const char* st) +{ + G4String v = st; + v.toUpper(); + G4bool vl = false; + if( v=="Y" || v=="YES" || v=="1" || v=="T" || v=="TRUE" ) + { vl = true; } + return vl; +} + +G4int G4UIcommand::ConvertToInt(const char* st) +{ + G4int vl; + std::istrstream is((char*)st); + is >> vl; + return vl; +} + +G4double G4UIcommand::ConvertToDouble(const char* st) +{ + G4double vl; + std::istrstream is((char*)st); + is >> vl; + return vl; +} + +G4double G4UIcommand::ConvertToDimensionedDouble(const char* st) +{ + G4double vl; + char unts[30]; + + std::istrstream is((char*)st); + is >> vl >> unts; + G4String unt = unts; + + return (vl*ValueOf(unt)); +} + +G4ThreeVector G4UIcommand::ConvertTo3Vector(const char* st) +{ + G4double vx; + G4double vy; + G4double vz; + std::istrstream is((char*)st); + is >> vx >> vy >> vz; + return G4ThreeVector(vx,vy,vz); +} + +G4ThreeVector G4UIcommand::ConvertToDimensioned3Vector(const char* st) +{ + G4double vx; + G4double vy; + G4double vz; + char unts[30]; + std::istrstream is((char*)st); + is >> vx >> vy >> vz >> unts; + G4String unt = unts; + G4double uv = ValueOf(unt); + return G4ThreeVector(vx*uv,vy*uv,vz*uv); +} + + // ----- the following is used by CheckNewValue() ------------ diff --git a/source/interfaces/GNUmakefile b/source/interfaces/GNUmakefile index 3059d32981..6055a60ffa 100644 --- a/source/interfaces/GNUmakefile +++ b/source/interfaces/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.4 2003/11/04 08:24:05 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/03 13:55:20 gcosmo Exp $ # ----------------------------------------------------------------------- # GNUmakefile for interfaces. John Allison, 5/7/98. # ----------------------------------------------------------------------- @@ -11,13 +11,12 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4UI_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk -G4LIBDIR := $(G4LIB)/$(G4SYSTEM) -G4TMPDIR := $(G4TMP)/$(G4SYSTEM)/$(name) - # Libraries which can be used without external packages or libraries... ifdef G4UI_BUILD SUBDIRS := common diff --git a/source/interfaces/History b/source/interfaces/History index f9c118b1b0..d491efc194 100644 --- a/source/interfaces/History +++ b/source/interfaces/History @@ -1,4 +1,4 @@ -$Id: History,v 1.66 2003/11/04 08:26:01 gcosmo Exp $ +$Id: History,v 1.70 2004/06/07 13:32:21 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,18 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +7th June 2004 Gabriele Cosmo (interfaces-V06-01-01) +- G4UIWin32.cc: move usage of inline methods to non-inline for DLLs + support on Windows. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. + +9th April 2004 John Allison (interfaces-V06-01-00 + vis-V06-01-01) +- Tagged G4[UI]Win32[.hh,.cc] as below. Joint with vis-V06-01-01. + +08 April 2004, Guy Barrand +- G4[UI]Win32[.hh,.cc] : modify things in order to be able to use + a standard C main (and avoid the WinMain). + 22 October 2003, Guy Barrand (interfaces-V05-02-00) - OPACS : archived obsolete OPACS module and cleared build setup. diff --git a/source/interfaces/basic/include/G4UIWin32.hh b/source/interfaces/basic/include/G4UIWin32.hh index c32ad155d9..5ee8a5ea9c 100644 --- a/source/interfaces/basic/include/G4UIWin32.hh +++ b/source/interfaces/basic/include/G4UIWin32.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIWin32.hh,v 1.11 2003/06/16 16:55:54 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIWin32.hh,v 1.13 2004/04/08 08:29:47 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4UIWin32_h #define G4UIWin32_h @@ -61,7 +61,7 @@ class G4VInteractorManager; class G4UIWin32 : public G4VBasicShell, public G4VInteractiveSession { public: // With description - G4UIWin32 (HINSTANCE,HINSTANCE,LPSTR,int); + G4UIWin32(); // The WinMain arguments have to be given. G4UIsession* SessionStart (); // To enter interactive Win32 loop ; waiting/executing command,... diff --git a/source/interfaces/basic/src/G4UIWin32.cc b/source/interfaces/basic/src/G4UIWin32.cc index cb73812d85..f10e04b986 100644 --- a/source/interfaces/basic/src/G4UIWin32.cc +++ b/source/interfaces/basic/src/G4UIWin32.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4UIWin32.cc,v 1.9 2003/06/16 16:55:59 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4UIWin32.cc,v 1.12 2004/06/07 13:33:36 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G.Barrand @@ -30,8 +30,15 @@ #ifdef G4UI_BUILD_WIN32_SESSION +// this : +#include "G4UIWin32.hh" + #include +#include +#include +#include + #include #include "G4UImanager.hh" @@ -40,91 +47,26 @@ #include "G4UIcommandStatus.hh" #include "G4Win32.hh" -#include "G4UIWin32.hh" - -#include - #define TEXT_MAX_LINES 300 -class TextBuffer { +class TextBuffer +{ public: - TextBuffer():linei(0),linen(TEXT_MAX_LINES),endOfPage(0),heightOfPage(12) { - lines = new G4String[linen]; - for(int count=0;count<256;count++) spaces[count] = ' '; - } - ~TextBuffer() { - delete [] lines; - } - int GetNumberOfLines () { - return linei; - } - void SetHeightOfPage (int a_height) { - heightOfPage = a_height; - } - void SetEndOfPage (int a_value) { - if( (a_value<0) || (a_value>=linei)) { - endOfPage = linei-1; - } else { - endOfPage = a_value; - } - } - int GetEndOfPage () { - return endOfPage; - } - void IncrementEndOfPage () { - endOfPage++; - if(endOfPage>=linei) endOfPage = linei-1; - } - void DecrementEndOfPage () { - endOfPage--; - if(endOfPage<0) endOfPage = 0; - } - void JumpDownEndOfPage () { - endOfPage += heightOfPage; - if(endOfPage>=linei) endOfPage = linei-1; - } - void JumpUpEndOfPage () { - endOfPage -= heightOfPage; - if(endOfPage<0) endOfPage = 0; - } - G4bool AppendString (char* a_string) { - G4bool value = false; - if( (a_string==NULL) || (a_string[0]=='\0') ) return value; - int length = strlen(a_string); - if(a_string[length-1]=='\n') { - lines[linei] += a_string; - lines[linei] = lines[linei].strip(G4String::trailing,'\n'); - linei++; - value = true; - } else { - lines[linei] += a_string; - } - if(linei>=linen) { - for(int count=0;countbottom - charHeight * (row + 1); - if((rowi>=0)&&(rowi=linei)) { + endOfPage = linei-1; + } else { + endOfPage = a_value; + } +} + +void TextBuffer::IncrementEndOfPage () +{ + endOfPage++; + if(endOfPage>=linei) endOfPage = linei-1; +} + +void TextBuffer::DecrementEndOfPage () +{ + endOfPage--; + if(endOfPage<0) endOfPage = 0; +} + +void TextBuffer::JumpDownEndOfPage () +{ + endOfPage += heightOfPage; + if(endOfPage>=linei) endOfPage = linei-1; +} + +void TextBuffer::JumpUpEndOfPage () +{ + endOfPage -= heightOfPage; + if(endOfPage<0) endOfPage = 0; +} + +G4bool TextBuffer::AppendString (char* a_string) +{ + G4bool value = false; + if( (a_string==NULL) || (a_string[0]=='\0') ) return value; + int length = strlen(a_string); + if(a_string[length-1]=='\n') { + lines[linei] += a_string; + lines[linei] = lines[linei].strip(G4String::trailing,'\n'); + linei++; + value = true; + } else { + lines[linei] += a_string; + } + if(linei>=linen) { + for(int count=0;countbottom - charHeight * (row + 1)); + if((rowi>=0)&&(rowiSetSession(this); - interactorManager = G4Win32::getInstance (a_hInstance,a_hPrevInstance, - a_lpszCmdLine,a_nCmdShow); + interactorManager = G4Win32::getInstance (); static G4bool Done = FALSE; if(Done==FALSE) { - if(a_hPrevInstance==NULL) { - WNDCLASS wc; - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)G4UIWin32::MainWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = a_hInstance; - wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL,IDC_ARROW); - wc.hbrBackground = GetStockBrush(BLACK_BRUSH); - wc.lpszMenuName = mainClassName; - wc.lpszClassName = mainClassName; - ::RegisterClass (&wc); - - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)G4UIWin32::TextWindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = a_hInstance; - wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL,IDC_ARROW); - wc.hbrBackground = GetStockBrush(WHITE_BRUSH); - wc.lpszMenuName = textClassName; - wc.lpszClassName = textClassName; - ::RegisterClass (&wc); - } + WNDCLASS wc; + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)G4UIWin32::MainWindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = ::GetModuleHandle(NULL); + wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL,IDC_ARROW); + wc.hbrBackground = GetStockBrush(WHITE_BRUSH); + wc.lpszMenuName = mainClassName; + wc.lpszClassName = mainClassName; + ::RegisterClass (&wc); + + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)G4UIWin32::TextWindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = ::GetModuleHandle(NULL); + wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL,IDC_ARROW); + wc.hbrBackground = GetStockBrush(WHITE_BRUSH); + wc.lpszMenuName = textClassName; + wc.lpszClassName = textClassName; + ::RegisterClass (&wc); Done = TRUE; } - /* - */ menuBar = CreateMenu(); defaultMenu = CreatePopupMenu(); AppendMenu(menuBar,MF_POPUP,(UINT)defaultMenu,"Geant4"); @@ -211,10 +232,12 @@ G4UIWin32::G4UIWin32 ( tmpSession = this; mainWindow = ::CreateWindow(mainClassName,mainClassName, - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT,CW_USEDEFAULT, - 0,0, - NULL,menuBar,a_hInstance,NULL); + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT,CW_USEDEFAULT, + 0,0, + NULL,menuBar, + ::GetModuleHandle(NULL), + NULL); tmpSession = NULL; ::SetWindowLong(mainWindow,GWL_USERDATA,LONG(this)); @@ -426,8 +449,8 @@ LRESULT CALLBACK G4UIWin32::MainWindowProc ( hdc = GetDC (a_window); GetTextMetrics (hdc,&tm); - charWidth = tm.tmAveCharWidth; - charHeight = tm.tmHeight + tm.tmExternalLeading; + charWidth = (short)tm.tmAveCharWidth; + charHeight = (short)(tm.tmHeight + tm.tmExternalLeading); ReleaseDC (a_window,hdc); G4UIWin32* This = (G4UIWin32*)tmpSession; @@ -616,7 +639,7 @@ LRESULT CALLBACK G4UIWin32::EditWindowProc ( if(This!=NULL) { int pos = This->fHistoryPos== -1 ? This->fHistory.size()-1 : This->fHistoryPos-1; - if((pos>=0)&&(posfHistory.size())) { + if((pos>=0)&&(pos<(int)This->fHistory.size())) { G4String command = This->fHistory[pos]; const char* d = command.data(); int l = strlen(d); @@ -632,7 +655,7 @@ LRESULT CALLBACK G4UIWin32::EditWindowProc ( GetParent(a_window),GWL_USERDATA); if(This!=NULL) { int pos = This->fHistoryPos + 1; - if((pos>=0)&&(posfHistory.size())) { + if((pos>=0)&&(pos<(int)This->fHistory.size())) { G4String command = This->fHistory[pos]; const char* d = command.data(); int l = strlen(d); @@ -640,7 +663,7 @@ LRESULT CALLBACK G4UIWin32::EditWindowProc ( Edit_SetSel(a_window,l,l); // This->fHistoryPos = pos; - } else if(pos>=This->fHistory.size()) { + } else if(pos>=(int)This->fHistory.size()) { Edit_SetText(a_window,""); Edit_SetSel(a_window,0,0); // @@ -668,7 +691,6 @@ void G4UIWin32::TextAppendString ( RECT rect; GetClientRect(textWindow,&rect); InvalidateRect(textWindow,NULL,TRUE); //To erase background. - PAINTSTRUCT ps; HDC hdc = GetDC(textWindow); ((TextBuffer*)textBuffer)->Draw(hdc,&rect); ReleaseDC (textWindow,hdc); diff --git a/source/interfaces/common/include/G4Win32.hh b/source/interfaces/common/include/G4Win32.hh index d9c60dcb3c..243b51f119 100644 --- a/source/interfaces/common/include/G4Win32.hh +++ b/source/interfaces/common/include/G4Win32.hh @@ -21,13 +21,14 @@ // ******************************************************************** // // -// $Id: G4Win32.hh,v 1.6 2001/07/11 10:01:22 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Win32.hh,v 1.7 2004/04/08 08:16:34 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // To unify Windows message treatment between // G4/interfaces Windows sessions and G4/visualizations Windows drivers. // G.Barrand + #ifndef G4WIN32_HH #define G4WIN32_HH @@ -49,18 +50,16 @@ class G4Win32 : public G4VInteractorManager { public: static G4Win32* getInstance (); - static G4Win32* getInstance (HINSTANCE,HINSTANCE,LPSTR,int); G4bool Inited (); void* GetEvent (); void FlushAndWaitExecution (); static G4bool dispatchWin32Event (void*); - void getWinMainArguments (HINSTANCE*,HINSTANCE*,LPSTR*,int*); virtual ~G4Win32 (); private: - G4Win32 (HINSTANCE,HINSTANCE,LPSTR,int); + G4Win32(); static G4Win32* instance; // Pointer to single instance. }; -#endif //HAS_WIN32 +#endif #endif diff --git a/source/interfaces/common/src/G4Win32.cc b/source/interfaces/common/src/G4Win32.cc index b1e78c5a8a..73f14fc111 100644 --- a/source/interfaces/common/src/G4Win32.cc +++ b/source/interfaces/common/src/G4Win32.cc @@ -21,96 +21,62 @@ // ******************************************************************** // // -// $Id: G4Win32.cc,v 1.6 2001/07/11 10:01:23 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Win32.cc,v 1.8 2004/04/08 15:35:05 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G.Barrand #if defined(G4INTY_BUILD_WIN32) || defined(G4INTY_USE_WIN32) -#include -#include "G4ios.hh" - -#include "G4UImanager.hh" - +// this : #include "G4Win32.hh" +#include "G4ios.hh" + static char className[] = "G4Win32"; G4Win32* G4Win32::instance = NULL; static G4bool Win32Inited = FALSE; -static HINSTANCE hInstance = NULL; -static HINSTANCE hPrevInstance = NULL; -static LPTSTR lpszCmdLine = NULL; -static int nCmdShow = 0; static HWND topWindow = NULL; /***************************************************************************/ G4Win32* G4Win32::getInstance ( ) /***************************************************************************/ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ -{ - return G4Win32::getInstance(NULL,NULL,NULL,0); -} -/***************************************************************************/ -G4Win32* G4Win32::getInstance ( - HINSTANCE a_hInstance -,HINSTANCE a_hPrevInstance -,LPSTR a_lpszCmdLine -,int a_nCmdShow -) -/***************************************************************************/ -/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ { if (instance==NULL) { - instance = new G4Win32(a_hInstance, - a_hPrevInstance, - a_lpszCmdLine, - a_nCmdShow); + instance = new G4Win32(); } return instance; } /***************************************************************************/ G4Win32::G4Win32 ( - HINSTANCE a_hInstance -,HINSTANCE a_hPrevInstance -,LPSTR a_lpszCmdLine -,int a_nCmdShow -) +) /***************************************************************************/ /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ { if(Win32Inited==FALSE) { // Should be Done once. - hInstance = a_hInstance; - hPrevInstance = a_hPrevInstance; - lpszCmdLine = a_lpszCmdLine; - nCmdShow = a_nCmdShow; - - if(hInstance==NULL) { - G4cout << "G4Win32::G4Win32 : NULL hInstance given." <= 0 && interval < fMaxInterval && j >= 0 && j < 5 ); + G4double unitCof ; + if(j == 0) unitCof = keV ; + else unitCof = (cm2/g)*pow(keV,(G4double)j); + return ( (*(*fMatSandiaMatrix)[interval])[j] )*unitCof; } // diff --git a/source/materials/src/G4MaterialPropertiesTable.cc b/source/materials/src/G4MaterialPropertiesTable.cc index 7d3742a2e1..3152ba9f7f 100644 --- a/source/materials/src/G4MaterialPropertiesTable.cc +++ b/source/materials/src/G4MaterialPropertiesTable.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4MaterialPropertiesTable.cc,v 1.13 2002/11/07 02:30:29 gum Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4MaterialPropertiesTable.cc,v 1.15 2004/05/17 13:39:25 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //////////////////////////////////////////////////////////////////////// @@ -128,6 +128,20 @@ G4double G4MaterialPropertiesTable::GetConstProperty(const char *key) } } +G4bool G4MaterialPropertiesTable::ConstPropertyExists(const char *key) +{ +// Return true if a const property 'key' exists + + MPTCiterator j; + j = MPTC.find(G4String(key)); + if ( j != MPTC.end() ) { + return true; + } + else { + return false; + } +} + G4MaterialPropertyVector* G4MaterialPropertiesTable::GetProperty(const char *key) { // Returns a Material Property Vector corresponding to a key diff --git a/source/materials/src/G4SandiaTable.cc b/source/materials/src/G4SandiaTable.cc index 601726665f..99bc471a80 100644 --- a/source/materials/src/G4SandiaTable.cc +++ b/source/materials/src/G4SandiaTable.cc @@ -21,11 +21,12 @@ // ******************************************************************** // // -// $Id: G4SandiaTable.cc,v 1.17 2004/02/03 11:09:17 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4SandiaTable.cc,v 1.19 2004/04/14 10:19:06 maire Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... // +// 05.03.04 New methods for old sorting algorithm for PAI model. V.Grichine // 03.02.04 Update distructor V.Ivanchenko // 10.07.01 Migration to STL. M. Verderi. // 03.04.01 fnulcof returned if energy < emin @@ -41,16 +42,30 @@ #include "G4SandiaTable.hh" #include "G4StaticSandiaData.hh" #include "G4Material.hh" +#include "G4MaterialTable.hh" G4int G4SandiaTable::fCumulInterval[101]; G4double G4SandiaTable::fSandiaCofPerAtom[4]; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... -G4SandiaTable::G4SandiaTable(G4int) +G4SandiaTable::G4SandiaTable(G4int matIndex) { fMatSandiaMatrix = 0 ; fPhotoAbsorptionCof = 0 ; + + const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); + size_t numberOfMat = G4Material::GetNumberOfMaterials(); + + if ( matIndex >= 0 && matIndex < G4int(numberOfMat) ) + { + fMaterial = (*theMaterialTable)[matIndex]; + } + else + { + G4Exception("G4SandiaTable::G4SandiaTable(G4int matIndex): wrong matIndex "); + } + ComputeMatTable(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo.... @@ -396,6 +411,204 @@ G4SandiaTable::SandiaMixing( G4int Z[], return mi ; } + + +//////////////////////////////////////////////////////////////////////////// +// +// Sandia interval and mixing calculations for materialCutsCouple constructor +// + +void G4SandiaTable::ComputeMatTable() +{ + G4int MaxIntervals = 0; + G4int elm, c, i, j, jj, k, kk, k1, k2, c1, n1; + + const G4int noElm = fMaterial->GetNumberOfElements(); + const G4ElementVector* ElementVector = fMaterial->GetElementVector(); + G4int* Z = new G4int[noElm]; //Atomic number + + for (elm = 0; elmGetZ(); + MaxIntervals += fNbOfIntervals[Z[elm]]; + } + fMaxInterval = 0 ; + + for(i = 0; i < noElm; i++) fMaxInterval += fNbOfIntervals[Z[i]] ; + + fMaxInterval += 2 ; + +// G4cout<<"fMaxInterval = "< fSandiaTable[k1][0]) + { + continue ; // no ionization for energies smaller than I1 (first + } // ionisation potential) + break ; + } + G4int flag = 0 ; + + for(c1 = 1 ; c1 < c ; c1++) + { + if(fPhotoAbsorptionCof[c1][0] == I1) // this value already has existed + { + flag = 1 ; + break ; + } + } + if(flag == 0) + { + fPhotoAbsorptionCof[c][0] = I1 ; + c++ ; + } + for(k2 = k1 ; k2 < n2 ; k2++) + { + flag = 0 ; + + for(c1 = 1 ; c1 < c ; c1++) + { + if(fPhotoAbsorptionCof[c1][0] == fSandiaTable[k2][0]) + { + flag = 1 ; + break ; + } + } + if(flag == 0) + { + fPhotoAbsorptionCof[c][0] = fSandiaTable[k2][0] ; + c++ ; + } + } + } // end for(i) + + SandiaSort(fPhotoAbsorptionCof,c) ; + fMaxInterval = c ; + + + // G4int + // G4SandiaTable::SandiaMixing( G4int Z[], + + const G4double* fractionW = fMaterial->GetFractionVector(); + + // G4int el, + // G4int mi ) + + + + for(i = 0 ; i < fMaxInterval ; i++) + { + for(j = 1 ; j < 5 ; j++) fPhotoAbsorptionCof[i][j] = 0.; + } + for(i = 0 ; i < noElm; i++) + { + n1 = 1 ; + G4double I1 = fIonizationPotentials[Z[i]]*keV ; + + for(j = 1 ; j < Z[i] ; j++) + { + n1 += fNbOfIntervals[j] ; + } + G4int n2 = n1 + fNbOfIntervals[Z[i]] - 1 ; + + for(k = n1 ; k < n2 ; k++) + { + G4double B1 = fSandiaTable[k][0] ; + G4double B2 = fSandiaTable[k+1][0] ; + for(G4int c = 1 ; c < fMaxInterval-1 ; c++) + { + G4double E1 = fPhotoAbsorptionCof[c][0] ; + G4double E2 = fPhotoAbsorptionCof[c+1][0] ; + if(B1 > E1 || B2 < E2 || E1 < I1) + { + continue ; + } + for(j = 1 ; j < 5 ; j++) + { + fPhotoAbsorptionCof[c][j] += fSandiaTable[k][j]*fractionW[i] ; + } + } + } + for(j = 1 ; j < 5 ; j++) // Last interval + { + fPhotoAbsorptionCof[fMaxInterval-1][j] += fSandiaTable[k][j]*fractionW[i] ; + } + } // for(i) + + c = 0 ; // Deleting of first intervals where all coefficients = 0 + + do + { + c++ ; + + if( fPhotoAbsorptionCof[c][1] != 0.0 || + fPhotoAbsorptionCof[c][2] != 0.0 || + fPhotoAbsorptionCof[c][3] != 0.0 || + fPhotoAbsorptionCof[c][4] != 0.0 ) continue ; + + for(jj = 2 ; jj < fMaxInterval ; jj++) + { + for(kk = 0 ; kk < 5 ; kk++) + { + fPhotoAbsorptionCof[jj-1][kk]= fPhotoAbsorptionCof[jj][kk] ; + } + } + fMaxInterval-- ; + c-- ; + } + while(c < fMaxInterval - 1) ; + + // create the sandia matrix for this material + + fMatSandiaMatrix = new G4OrderedTable(); + + for (i = 0; i < fMaxInterval; i++) + { + fMatSandiaMatrix->push_back(new G4DataVector(5,0.)); + } + for (i = 0; i < fMaxInterval; i++) + { + for(j = 0 ; j < 5 ; j++) + { + (*(*fMatSandiaMatrix)[i])[j] = fPhotoAbsorptionCof[i+1][j]; + } + } + return ; +} + + + + + + /////////////////////////////////////////////////////////////////////// // // GetNbOfIntervals diff --git a/source/parameterisations/GNUmakefile b/source/parameterisations/GNUmakefile index 85ff722e96..d4041dc8ed 100644 --- a/source/parameterisations/GNUmakefile +++ b/source/parameterisations/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2003/10/03 14:34:52 gcosmo Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/01 15:37:23 gcosmo Exp $ # --------------------------------------------------------------- # GNUmakefile for parameterisations library. G.Cosmo, 14/11/2000 # --------------------------------------------------------------- @@ -9,6 +9,10 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4processes.lib libG4digits_hits.lib libG4track.lib +GLOBLIBS += libG4particles.lib libG4geometry.lib libG4materials.lib +GLOBLIBS += libG4graphics_reps.lib libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4BASE)/global/management/include \ diff --git a/source/parameterisations/History b/source/parameterisations/History index 0526fb9ef3..73b84d447b 100644 --- a/source/parameterisations/History +++ b/source/parameterisations/History @@ -1,4 +1,4 @@ -$Id: History,v 1.9 2003/10/03 14:35:32 gcosmo Exp $ +$Id: History,v 1.10 2004/06/07 13:36:16 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,9 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun 7th, 2004 G.Cosmo (parmodels-V06-01-00) +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. + Oct 4th, 2003 G.Cosmo (parmodels-V05-02-01) --------------------- - GNUmakefile: diff --git a/source/particles/GNUmakefile b/source/particles/GNUmakefile index 4f783f970f..a7dacc9fd0 100644 --- a/source/particles/GNUmakefile +++ b/source/particles/GNUmakefile @@ -1,18 +1,22 @@ -# $Id: GNUmakefile,v 1.3 2003/09/21 19:38:49 kurasige Exp $ +# $Id: GNUmakefile,v 1.4 2004/06/01 15:37:42 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for particles library. Gabriele Cosmo, 4/4/97. # -------------------------------------------------------------- name := G4particles +ifndef G4INSTALL + G4INSTALL = ../.. +endif + +GLOBLIBS = libG4geometry.lib libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + SUBDIRS = management bosons leptons shortlived SUBDIRS += hadrons/mesons hadrons/barions hadrons/ions SUBDIRS += utils SUBLIBS = G4partman G4bosons G4leptons G4shortlived SUBLIBS += G4mesons G4baryons G4ions SUBLIBS += G4partutils -ifndef G4INSTALL - G4INSTALL = ../.. -endif include $(G4INSTALL)/config/globlib.gmk diff --git a/source/particles/History b/source/particles/History index 64285ad4fb..1f95ea57bc 100644 --- a/source/particles/History +++ b/source/particles/History @@ -1,4 +1,4 @@ -$Id: History,v 1.103 2004/03/11 09:55:45 kurasige Exp $ +$Id: History,v 1.105 2004/06/11 15:14:30 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,15 +17,26 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- -- Mar. 11, 2004 H.Kurashige (particles-V06-00-02) +- Jun 11, 2004 G.Cosmo (particles-V06-01-01) +- Use global flag G4PARTICLES_ALLOC_EXPORT to export extern symbols for DLLs. + Modified granular GNUmakefiles and rearranged usage of extern symbols + in classes in "management" module. + +- Jun 07, 2004 G.Cosmo (particles-V06-01-00) +- Use G4extern for allowing support of DLLs on Windows. Modified files: + G4DecayProducts.hh, G4DynamicParticle.icc, G4ElectronOccupancy.hh. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +- Mar 11, 2004 H.Kurashige (particles-V06-00-02) - Add G4VParticlePropertyRetriever - Add G4TextPPReporter and G4TextPPRetriever -- Feb. 12, 2004 H.Kurashige (particles-V06-00-01) +- Feb 12, 2004 H.Kurashige (particles-V06-00-01) - update mass and width to meet with PDG 2002 data -- Dec. 12, 2003 H.Kurashige (particles-V06-00-00) +- Dec 12, 2003 H.Kurashige (particles-V06-00-00) - Fixed initialization problems in G4NuclearPropertiesTable -- Add initialization of indexArray -- Remove the static member of theInstance diff --git a/source/particles/bosons/GNUmakefile b/source/particles/bosons/GNUmakefile index c866ed1d59..f9cdbd8bba 100644 --- a/source/particles/bosons/GNUmakefile +++ b/source/particles/bosons/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:09:47 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:22 gcosmo Exp $ # ---------------------------------------------------------- # GNUmakefile for bosons library. Gabriele Cosmo, 18/9/96. # ---------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/particles/hadrons/barions/GNUmakefile b/source/particles/hadrons/barions/GNUmakefile index 826e2adc06..ba4ab00924 100644 --- a/source/particles/hadrons/barions/GNUmakefile +++ b/source/particles/hadrons/barions/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 1999/10/07 14:10:23 stesting Exp $ +# $Id: GNUmakefile,v 1.3 2004/06/11 14:25:22 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for barions library. Gabriele Cosmo, 18/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/particles/hadrons/ions/GNUmakefile b/source/particles/hadrons/ions/GNUmakefile index 6f1a478517..a65ad7e824 100644 --- a/source/particles/hadrons/ions/GNUmakefile +++ b/source/particles/hadrons/ions/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:10:04 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:23 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for ions library. Gabriele Cosmo, 18/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/particles/hadrons/mesons/GNUmakefile b/source/particles/hadrons/mesons/GNUmakefile index e9d32a795d..3a08595413 100644 --- a/source/particles/hadrons/mesons/GNUmakefile +++ b/source/particles/hadrons/mesons/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:10:07 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:23 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for mesons library. Gabriele Cosmo, 18/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/particles/leptons/GNUmakefile b/source/particles/leptons/GNUmakefile index 16d3375c0c..98ed3ba12b 100644 --- a/source/particles/leptons/GNUmakefile +++ b/source/particles/leptons/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:10:20 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:24 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for leptons library. Gabriele Cosmo, 18/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/particles/management/GNUmakefile b/source/particles/management/GNUmakefile index a170eb27d7..e9c9552ca6 100644 --- a/source/particles/management/GNUmakefile +++ b/source/particles/management/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2002/12/16 11:15:43 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/11 14:25:25 gcosmo Exp $ # ---------------------------------------------------------------- # GNUmakefile for particle management library. G.Cosmo, 4/4/97. # ---------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/particles/management/include/G4DecayProducts.hh b/source/particles/management/include/G4DecayProducts.hh index 0d90f13945..774c84ba7b 100644 --- a/source/particles/management/include/G4DecayProducts.hh +++ b/source/particles/management/include/G4DecayProducts.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DecayProducts.hh,v 1.8 2001/07/11 10:01:55 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4DecayProducts.hh,v 1.11 2004/06/11 14:25:25 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -101,10 +101,15 @@ class G4DecayProducts }; +#if defined G4PARTICLES_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aDecayProductsAllocator; +#else + extern G4DLLIMPORT G4Allocator aDecayProductsAllocator; +#endif + // ------------------------ // Inlined operators // ------------------------ -extern G4Allocator aDecayProductsAllocator; inline void * G4DecayProducts::operator new(size_t) { diff --git a/source/particles/management/include/G4DynamicParticle.icc b/source/particles/management/include/G4DynamicParticle.icc index 72a1b84996..269367d40b 100644 --- a/source/particles/management/include/G4DynamicParticle.icc +++ b/source/particles/management/include/G4DynamicParticle.icc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DynamicParticle.icc,v 1.8 2001/07/11 10:01:55 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4DynamicParticle.icc,v 1.11 2004/06/11 14:25:26 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -32,8 +32,11 @@ // 17 AUg. 1999 H.Kurashige // ------------------------------------------------------------ - -extern G4Allocator aDynamicParticleAllocator; +#if defined G4PARTICLES_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aDynamicParticleAllocator; +#else + extern G4DLLIMPORT G4Allocator aDynamicParticleAllocator; +#endif // ------------------------ // Inlined operators diff --git a/source/particles/management/include/G4ElectronOccupancy.hh b/source/particles/management/include/G4ElectronOccupancy.hh index 6c9dd16d77..cb660117f8 100644 --- a/source/particles/management/include/G4ElectronOccupancy.hh +++ b/source/particles/management/include/G4ElectronOccupancy.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ElectronOccupancy.hh,v 1.5 2001/07/11 10:01:55 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ElectronOccupancy.hh,v 1.8 2004/06/11 14:25:27 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -98,7 +98,11 @@ class G4ElectronOccupancy }; -extern G4Allocator aElectronOccupancyAllocator; +#if defined G4PARTICLES_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aElectronOccupancyAllocator; +#else + extern G4DLLIMPORT G4Allocator aElectronOccupancyAllocator; +#endif // ------------------------ // Inlined operators diff --git a/source/particles/management/src/G4DecayProducts.cc b/source/particles/management/src/G4DecayProducts.cc index 549a278fae..8a8ed09b1a 100644 --- a/source/particles/management/src/G4DecayProducts.cc +++ b/source/particles/management/src/G4DecayProducts.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DecayProducts.cc,v 1.10 2003/09/12 19:21:07 asaim Exp $ -// GEANT4 tag $Name: particles-V05-02-02 $ +// $Id: G4DecayProducts.cc,v 1.12 2004/06/11 14:25:27 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ diff --git a/source/particles/management/src/G4DynamicParticle.cc b/source/particles/management/src/G4DynamicParticle.cc index 3eeb37b83b..1f211c81f0 100644 --- a/source/particles/management/src/G4DynamicParticle.cc +++ b/source/particles/management/src/G4DynamicParticle.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4DynamicParticle.cc,v 1.18 2003/12/01 15:15:36 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4DynamicParticle.cc,v 1.20 2004/06/11 14:25:28 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -57,6 +57,7 @@ // take into account the case of virtual photons // //-------------------------------------------------------------- + #include "G4DynamicParticle.hh" #include "G4DecayProducts.hh" #include "G4LorentzVector.hh" diff --git a/source/particles/management/src/G4ElectronOccupancy.cc b/source/particles/management/src/G4ElectronOccupancy.cc index 44a79a4ccd..3d9398bb7e 100644 --- a/source/particles/management/src/G4ElectronOccupancy.cc +++ b/source/particles/management/src/G4ElectronOccupancy.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ElectronOccupancy.cc,v 1.6 2001/07/11 10:01:59 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ElectronOccupancy.cc,v 1.8 2004/06/11 14:25:29 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ---------------------------------------------------------------------- @@ -35,7 +35,6 @@ // in atomic orbits // --------------------------------------------------------------- - #include "G4ElectronOccupancy.hh" G4Allocator aElectronOccupancyAllocator; diff --git a/source/particles/shortlived/GNUmakefile b/source/particles/shortlived/GNUmakefile index 9aa90eac4d..d1a7e686b7 100644 --- a/source/particles/shortlived/GNUmakefile +++ b/source/particles/shortlived/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 1999/01/07 16:10:37 gunter Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:29 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for shortlived library. Gabriele Cosmo, 18/9/96. # -------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/particles/utils/GNUmakefile b/source/particles/utils/GNUmakefile index 7f63cac969..2e289f4b8a 100644 --- a/source/particles/utils/GNUmakefile +++ b/source/particles/utils/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.1 2003/09/21 19:38:49 kurasige Exp $ +# $Id: GNUmakefile,v 1.2 2004/06/11 14:25:31 gcosmo Exp $ # ---------------------------------------------------------------- # GNUmakefile for particle management library. G.Cosmo, 4/4/97. # ---------------------------------------------------------------- @@ -11,6 +11,7 @@ endif include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4PARTICLES_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/persistency/GNUmakefile b/source/persistency/GNUmakefile index 6c63096b57..c2e9aa906e 100644 --- a/source/persistency/GNUmakefile +++ b/source/persistency/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.23 2003/10/03 14:39:01 gcosmo Exp $ +# $Id: GNUmakefile,v 1.25 2004/06/03 09:38:45 gcosmo Exp $ # ----------------------------------------------------------------------- # GNUmakefile for persistency library. Gabriele Cosmo, 16/11/96. # ----------------------------------------------------------------------- @@ -9,6 +9,11 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4digits_hits.lib libG4track.lib +GLOBLIBS += libG4particles.lib libG4geometry.lib libG4materials.lib +GLOBLIBS += libG4graphics_reps.lib libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4INSTALL)/source/global/management/include \ diff --git a/source/persistency/History b/source/persistency/History index b4b4716fe5..0ddb2bc3de 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 * ---------------------------------------------------------- +07 June, 04 G.Cosmo (persistency-V06-01-00) +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. + 04 October, 03 G.Cosmo (persistency-V05-02-00) - GNUmakefile: o replaced "digits+hits" with "digits_hits". diff --git a/source/processes/GNUmakefile b/source/processes/GNUmakefile index 3217554340..e86aa3949f 100644 --- a/source/processes/GNUmakefile +++ b/source/processes/GNUmakefile @@ -1,11 +1,10 @@ -# $Id: GNUmakefile,v 1.26 2003/11/24 12:54:57 gcosmo Exp $ +# $Id: GNUmakefile,v 1.30 2004/06/01 15:39:17 gcosmo Exp $ # ---------------------------------------------------------------------- # GNUmakefile for processes library, Gabriele Cosmo 27-Jun-1998 # ---------------------------------------------------------------------- name := G4processes - SUBDIRS = management SUBDIRS += cuts SUBDIRS += optical @@ -30,18 +29,21 @@ SUBLIBS += G4emutils SUBLIBS += G4xrays SUBLIBS += G4emlowenergy -SUBDIRS += hadronic/management -SUBDIRS += hadronic/util -SUBDIRS += hadronic/processes +GLOBLIBS = libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + SUBDIRS += hadronic/cross_sections -SUBDIRS += hadronic/stopping +SUBDIRS += hadronic/management +SUBDIRS += hadronic/models/abrasion SUBDIRS += hadronic/models/binary_cascade +SUBDIRS += hadronic/models/cascade/cascade SUBDIRS += hadronic/models/cascade/evaporation SUBDIRS += hadronic/models/cascade/utils -SUBDIRS += hadronic/models/cascade/cascade SUBDIRS += hadronic/models/chiral_inv_phase_space/body SUBDIRS += hadronic/models/chiral_inv_phase_space/interface SUBDIRS += hadronic/models/coherent_elastic +SUBDIRS += hadronic/models/de_excitation/ablation SUBDIRS += hadronic/models/de_excitation/evaporation SUBDIRS += hadronic/models/de_excitation/fermi_breakup SUBDIRS += hadronic/models/de_excitation/fission @@ -51,6 +53,7 @@ SUBDIRS += hadronic/models/de_excitation/management SUBDIRS += hadronic/models/de_excitation/multifragmentation SUBDIRS += hadronic/models/de_excitation/photon_evaporation SUBDIRS += hadronic/models/de_excitation/util +SUBDIRS += hadronic/models/em_dissociation SUBDIRS += hadronic/models/high_energy SUBDIRS += hadronic/models/im_r_matrix SUBDIRS += hadronic/models/isotope_production @@ -58,16 +61,20 @@ SUBDIRS += hadronic/models/leading_particle SUBDIRS += hadronic/models/low_energy SUBDIRS += hadronic/models/management SUBDIRS += hadronic/models/neutron_hp -SUBDIRS += hadronic/models/photolepton_hadron/muon_nuclear SUBDIRS += hadronic/models/parton_string/diffraction SUBDIRS += hadronic/models/parton_string/hadronization SUBDIRS += hadronic/models/parton_string/management SUBDIRS += hadronic/models/parton_string/qgsm +SUBDIRS += hadronic/models/photolepton_hadron/muon_nuclear SUBDIRS += hadronic/models/pre_equilibrium/exciton_model SUBDIRS += hadronic/models/radioactive_decay SUBDIRS += hadronic/models/theo_high_energy SUBDIRS += hadronic/models/util +SUBDIRS += hadronic/processes +SUBDIRS += hadronic/stopping +SUBDIRS += hadronic/util +SUBLIBS += G4hadronic_abrasion SUBLIBS += G4hadronic_xsect SUBLIBS += G4hadronic_mgt SUBLIBS += G4hadronic_proc @@ -99,6 +106,8 @@ SUBLIBS += G4hadronic_deex_management SUBLIBS += G4hadronic_deex_multifragmentation SUBLIBS += G4hadronic_deex_photon_evaporation SUBLIBS += G4hadronic_deex_util +SUBLIBS += G4hadronic_ablation +SUBLIBS += G4hadronic_em_dissociation SUBLIBS += G4had_preequ_exciton SUBLIBS += G4had_muon_nuclear SUBLIBS += G4had_string_diff diff --git a/source/processes/cuts/History b/source/processes/cuts/History index 32a103c152..3db7e0cd8c 100644 --- a/source/processes/cuts/History +++ b/source/processes/cuts/History @@ -1,4 +1,4 @@ -$Id: History,v 1.5 2003/11/08 06:10:48 kurasige Exp $ +$Id: History,v 1.8 2004/06/07 13:47:46 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,10 +17,19 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +June 7th, 2004 - G.Cosmo (procuts-V06-01-01) +- Moved usage of statics in inline functions to non-inline to allow + porting for DLLs on Windows. Modified G4ProductionCuts[.hh.cc]. + +March 31st, 2004 - H.Kurashige (procuts-V06-01-00) +- Modify G4ProductionCutsTable::RetrieveCutsTable to allow + ordering of materials and couples can be different from + one in file + November 8th, 2003 - H.Kurashige (procuts-V05-02-03) - Fixed bugs in G4VRangeToEnergyConverter (and related class) - - Revised error messages in retreiving ProductionCutsTable + November 7th, 2003 - H.Kurashige (procuts-V05-02-02) - Revised error messages in retreiving ProductionCutsTable @@ -29,7 +38,6 @@ November 3th, 2003 - H.Kurashige (procuts-V05-02-01) - Add verboseLevel in G4ProductionCutsTable September 19th, 2003 - G.Cosmo (procuts-V05-02-00) --------------------- - Created new sub-category 'cuts'. Moved classes from particles/management. diff --git a/source/processes/cuts/include/G4ProductionCuts.hh b/source/processes/cuts/include/G4ProductionCuts.hh index e9dfc7a14c..617236175d 100644 --- a/source/processes/cuts/include/G4ProductionCuts.hh +++ b/source/processes/cuts/include/G4ProductionCuts.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ProductionCuts.hh,v 1.2 2003/09/19 14:41:45 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ProductionCuts.hh,v 1.3 2004/06/07 13:47:34 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -114,34 +114,6 @@ class G4ProductionCuts }; -inline -G4int G4ProductionCuts::GetIndex(const G4String& name) -{ - G4int index; - if ( name == "gamma" ) { index = 0; } - else if ( name == "e-" ) { index = 1; } - else if ( name == "e+" ) { index = 2; } - else { index = -1; } - - return index; -} - -inline -G4int G4ProductionCuts::GetIndex(const G4ParticleDefinition* ptcl) -{ - if(!ptcl) return -1; - if(gammaDef==0 && ptcl->GetParticleName()=="gamma") { gammaDef = ptcl; } - if(electDef==0 && ptcl->GetParticleName()=="e-") { electDef = ptcl; } - if(positDef==0 && ptcl->GetParticleName()=="e+") { positDef = ptcl; } - G4int index; - if(ptcl==gammaDef) { index = 0; } - else if(ptcl==electDef) { index = 1; } - else if(ptcl==positDef) { index = 2; } - else { index = -1; } - - return index; -} - inline void G4ProductionCuts::SetProductionCut(G4double cut, G4int index) { @@ -215,13 +187,6 @@ void G4ProductionCuts::PhysicsTableUpdated() isModified = false; } - - - - - - - #endif diff --git a/source/processes/cuts/include/G4ProductionCutsTable.hh b/source/processes/cuts/include/G4ProductionCutsTable.hh index 7507188621..d827210b95 100644 --- a/source/processes/cuts/include/G4ProductionCutsTable.hh +++ b/source/processes/cuts/include/G4ProductionCutsTable.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ProductionCutsTable.hh,v 1.2 2003/11/03 02:18:44 kurasige Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ProductionCutsTable.hh,v 1.3 2004/02/03 08:29:35 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -31,6 +31,10 @@ // // ------------------------------------------------------------ // First Implementation 05 Oct. 2002 M.Asai +// +// Modified 03 Feb 2004 H.Kurashige +// Modify RetrieveCutsTable to allow ordering of materials and +// couples can be different from one in file (i.e. at storing) // ------------------------------------------------------------ #ifndef G4ProductionCutsTable_h @@ -173,6 +177,11 @@ class G4ProductionCutsTable // Store materialCutsCouple information in files under the specified directory. virtual G4bool StoreMaterialCutsCoupleInfo(const G4String& directory, G4bool ascii = false); + + // Retreive materialCutsCouple information in files under the specified directory. + virtual G4bool RetrieveMaterialCutsCoupleInfo(const G4String& directory, + G4bool ascii = false); + // check stored materialCutsCouple is consistent with the current detector setup. virtual G4bool CheckMaterialCutsCoupleInfo(const G4String& directory, G4bool ascii = false); @@ -187,6 +196,7 @@ class G4ProductionCutsTable private: G4bool firstUse; + G4bool isNeedForRestoreCoupleInfo; enum { FixedStringLengthForStore = 32 }; public: // with description diff --git a/source/processes/cuts/src/G4ProductionCuts.cc b/source/processes/cuts/src/G4ProductionCuts.cc index c6cce68fa7..a347dcf56e 100644 --- a/source/processes/cuts/src/G4ProductionCuts.cc +++ b/source/processes/cuts/src/G4ProductionCuts.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ProductionCuts.cc,v 1.2 2003/09/19 14:45:27 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ProductionCuts.cc,v 1.4 2004/06/07 13:47:35 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -80,3 +80,31 @@ G4int G4ProductionCuts::operator!=(const G4ProductionCuts &right) const return (this != &right); } + +G4int G4ProductionCuts::GetIndex(const G4String& name) +{ + G4int index; + if ( name == "gamma" ) { index = 0; } + else if ( name == "e-" ) { index = 1; } + else if ( name == "e+" ) { index = 2; } + else { index = -1; } + + return index; +} + + +G4int G4ProductionCuts::GetIndex(const G4ParticleDefinition* ptcl) +{ + if(!ptcl) return -1; + if(gammaDef==0 && ptcl->GetParticleName()=="gamma") { gammaDef = ptcl; } + if(electDef==0 && ptcl->GetParticleName()=="e-") { electDef = ptcl; } + if(positDef==0 && ptcl->GetParticleName()=="e+") { positDef = ptcl; } + G4int index; + if(ptcl==gammaDef) { index = 0; } + else if(ptcl==electDef) { index = 1; } + else if(ptcl==positDef) { index = 2; } + else { index = -1; } + + return index; +} + diff --git a/source/processes/cuts/src/G4ProductionCutsTable.cc b/source/processes/cuts/src/G4ProductionCutsTable.cc index ff1d8b73d8..f76172641a 100644 --- a/source/processes/cuts/src/G4ProductionCutsTable.cc +++ b/source/processes/cuts/src/G4ProductionCutsTable.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ProductionCutsTable.cc,v 1.4 2003/11/08 06:10:48 kurasige Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ProductionCutsTable.cc,v 1.6 2004/03/31 08:47:05 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -322,6 +322,7 @@ G4bool G4ProductionCutsTable::RetrieveCutsTable(const G4String& dir, G4bool ascii) { if (!CheckForRetrieveCutsTable(dir, ascii)) return false; + if (isNeedForRestoreCoupleInfo) return RetrieveMaterialCutsCoupleInfo(dir, ascii); if (!RetrieveCutsInfo(dir, ascii)) return false; #ifdef G4VERBOSE if (verboseLevel >1) { @@ -342,6 +343,7 @@ G4bool G4ProductionCutsTable::RetrieveCutsTable(const G4String& dir, G4bool G4ProductionCutsTable::CheckForRetrieveCutsTable(const G4String& directory, G4bool ascii) { + isNeedForRestoreCoupleInfo = false; if (!CheckMaterialInfo(directory, ascii)) return false; if (!CheckMaterialCutsCoupleInfo(directory, ascii)) return false; return true; @@ -364,10 +366,12 @@ G4bool G4ProductionCutsTable::StoreMaterialInfo(const G4String& directory, // check if the file has been opened successfully if (!fOut) { - if (verboseLevel) { +#ifdef G4VERBOSE + if (verboseLevel>0) { G4cerr << "G4ProductionCutsTable::StoreMaterialInfo "; G4cerr << " Can not open file " << fileName << G4endl; } +#endif return false; } @@ -437,10 +441,12 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, // check if the file has been opened successfully if (!fIn) { +#ifdef G4VERBOSE if (verboseLevel >0) { G4cerr << "G4ProductionCutsTable::CheckMaterialInfo "; G4cerr << " Can not open file " << fileName << G4endl; } +#endif return false; } @@ -455,11 +461,13 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, keyword = (const char*)(temp); } if (key!=keyword) { +#ifdef G4VERBOSE if (verboseLevel >0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << " Key word in " << fileName << "= " << keyword ; G4cout <<"( should be "<< key << ")" <0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << "Number of material is inconsistent "<< G4endl; G4cout << "Number of materials in " << fileName << "= " << nmat ; G4cout <<"( should be "<< numberOfMaterial<< ")" <0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << " encountered End of File " ; G4cout << " at " << idx+1 << "th material "<< G4endl; } +#endif fIn.close(); return false; } @@ -507,16 +519,19 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, fIn.read((char*)(&density), sizeof (G4double)); } if (fIn.fail()) { +#ifdef G4VERBOSE if (verboseLevel >0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << " Bad data format "; G4cout << " at " << idx+1 << "th material "<< G4endl; } +#endif fIn.close(); return false; } G4double ratio = abs(density/((*matTable)[idx])->GetDensity() ); if ( name != ((*matTable)[idx])->GetName()){ +#ifdef G4VERBOSE if (verboseLevel >0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << " Inconsistent material name "; @@ -525,9 +540,11 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, G4cout << "Density:" << std::setiosflags(std::ios::scientific) << density / (g/cm3) << "[g/cm3]"<< G4endl; G4cout << std::resetiosflags(std::ios::scientific); } +#endif fIn.close(); return false; } else if ((0.999>ratio) || (ratio>1.001) ){ +#ifdef G4VERBOSE if (verboseLevel >0) { G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; G4cout << " Inconsistent material density" << G4endl;; @@ -537,6 +554,7 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, G4cout << "(should be " << ((*matTable)[idx])->GetDensity()/ (g/cm3)<< ")" << " [g/cm3]"<< G4endl; G4cout << std::resetiosflags(std::ios::scientific); } +#endif fIn.close(); return false; } @@ -546,6 +564,7 @@ G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, return true; } + // Store materialCutsCouple information in files under the specified directory. G4bool G4ProductionCutsTable::StoreMaterialCutsCoupleInfo(const G4String& directory, @@ -565,10 +584,12 @@ G4bool G4ProductionCutsTable::StoreMaterialCutsCoupleInfo(const G4String& direc // check if the file has been opened successfully if (!fOut) { +#ifdef G4VERBOSE if (verboseLevel >0) { G4cerr << "G4ProductionCutsTable::StoreMaterialCutsCoupleInfo "; G4cerr << " Can not open file " << fileName << G4endl; } +#endif return false; } G4int numberOfCouples = coupleTable.size(); @@ -682,10 +703,12 @@ G4bool G4ProductionCutsTable::CheckMaterialCutsCoupleInfo(const G4String& direc // check if the file has been opened successfully if (!fIn) { +#ifdef G4VERBOSE if (verboseLevel >0) { G4cerr << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; G4cerr << " Can not open file " << fileName << G4endl; } +#endif return false; } @@ -705,6 +728,7 @@ G4bool G4ProductionCutsTable::CheckMaterialCutsCoupleInfo(const G4String& direc G4cout << " Key word in " << fileName << "= " << keyword ; G4cout <<"( should be "<< key << ")" <0) { G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; G4cout << "Number of couples is inconsistent "<< G4endl; G4cout << "Number of couples in " << fileName << "= " << numberOfCouples; G4cout <<"( should be "<< coupleTable.size()<< ")" <> index; } else { fIn.read( (char*)(&index), sizeof (G4int)); } + // read in index material name + char mat_name[FixedStringLengthForStore]; if (ascii) { - fIn >> name; + fIn >> mat_name; } else { - fIn.read(name, FixedStringLengthForStore); + fIn.read(mat_name, FixedStringLengthForStore); } - - if ( index != aCouple->GetIndex() ) { - if (verboseLevel >0) { - G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; - G4cout << "Index of couples is inconsistent at "; - G4cout << index << ":" << name << " in " << fileName << G4endl; - G4cout <<" ( should be " << aCouple->GetIndex() << ":" ; - G4cout << aCouple->GetMaterial()->GetName() << ")" << G4endl; - } - return false; - } - - if ( name != aCouple->GetMaterial()->GetName() ) { - if (verboseLevel >0) { - G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; - G4cout << "MaterialName is inconsistent at "; - G4cout << index << ":" << name << " in " << fileName << G4endl; - G4cout <<" ( should be " << aCouple->GetIndex() << ":" ; - G4cout << aCouple->GetMaterial()->GetName() << ")" << G4endl; - } - return false; - } - + // read in index and region name + char region_name[FixedStringLengthForStore]; if (ascii) { - fIn >> name; + fIn >> region_name; } else { - fIn.read(name, FixedStringLengthForStore); + fIn.read(region_name, FixedStringLengthForStore); } - if (!aCouple->IsUsed()){ - if ( name != "NONE" ) { - if(verboseLevel>0) { - G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; - G4cout << "Region Name is inconsistent at "; - G4cout << index << ": " << name << " in " << fileName << G4endl; - G4cout <<" ( should be " << aCouple->GetIndex() << ": NONE )" << G4endl; - } - return false; - } - } else { - G4Region* fRegion = fG4RegionStore->GetRegion(name); - if (!IsCoupleUsedInTheRegion(aCouple, fRegion) ){ - if(verboseLevel>0) { - G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; - G4cout << "Region Name is inconsistent "; - G4cout << index << ": " << name << " in " << fileName << G4endl; - } - return false; - } - } - // cut value - G4ProductionCuts* aCut = aCouple->GetProductionCuts(); G4double cutValues[NumberOfG4CutIndex]; - for (size_t idx=0; idx< NumberOfG4CutIndex; idx++) { + for (size_t i=0; i< NumberOfG4CutIndex; i++) { if (ascii) { - fIn >> cutValues[idx]; - cutValues[idx] *= (mm); + fIn >> cutValues[i]; + cutValues[i] *= (mm); } else { - fIn.read( (char*)(&(cutValues[idx])), sizeof (G4double)); + fIn.read( (char*)(&(cutValues[i])), sizeof (G4double)); } - G4double ratio = cutValues[idx]/aCut->GetProductionCut(idx); - if ((0.999>ratio) || (ratio>1.001) ){ - if(verboseLevel>0) { - G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; - G4cout << index << ":" << name << " in " << fileName << G4endl; - G4cout << idx << "th CutValue (=" << cutValues[idx]/mm ; - G4cout << "[mm]) is inconsistent in "; - G4cout << "( should be "<< aCut->GetProductionCut(idx)/mm; - G4cout << "[mm]) " << G4endl; + } + + // Loop over all couples + CoupleTableIterator cItr; + G4bool fOK = false; + G4MaterialCutsCouple* aCouple =0; + for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++){ + aCouple = (*cItr); + if ( mat_name != aCouple->GetMaterial()->GetName() ) continue; + if ( region_name == "NONE" ) { + if (aCouple->IsUsed()) continue; + } else { + G4Region* fRegion = fG4RegionStore->GetRegion(region_name); + if (!IsCoupleUsedInTheRegion(aCouple, fRegion) ) continue; + } + G4ProductionCuts* aCut = aCouple->GetProductionCuts(); + for (size_t j=0; j< NumberOfG4CutIndex; j++) { + G4double ratio = cutValues[j]/aCut->GetProductionCut(j); + if ((0.999>ratio) || (ratio>1.001) )continue; + } + fOK = true; + break; + } + + if (fOK) { + if ( index != aCouple->GetIndex() ) { + isNeedForRestoreCoupleInfo = true; +#ifdef G4VERBOSE + if (verboseLevel >1) { + G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; + G4cout << "Index of couples was modified "<< G4endl; + G4cout << aCouple->GetIndex() << ":" <GetMaterial()->GetName(); + G4cout <<" is defined as " ; + G4cout << index << ":" << mat_name << " in " << fileName << G4endl; } - return false; +#endif + } else { +#ifdef G4VERBOSE + if (verboseLevel >2) { + G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; + G4cout << index << ":" << mat_name << " in " << fileName ; + G4cout << " is consistent with current setup" << G4endl; + } +#endif } + }else{ +#ifdef G4VERBOSE + if (verboseLevel >0) { + G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; + G4cout << "Couples is not defined in the current detector setup "; + G4cout << index << ": in " << fileName << G4endl; + G4cout << " material: " << mat_name ; + G4cout << " region: " << region_name << G4endl; + for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { + G4cout << "cut [" << ii << "]: " << cutValues[ii]/mm; + } + G4cout << G4endl; + } +#endif + fIn.close(); + return false; } } + fIn.close(); return true; } + +// Retrieve stored materialCutsCouple is consistent with the current detector setup. +G4bool G4ProductionCutsTable::RetrieveMaterialCutsCoupleInfo(const G4String& directory, + G4bool ascii ) +{ + const G4String fileName = directory + "/" + "couple.dat"; + const G4String key = "COUPLE-V2.0"; + std::ifstream fIn; + + // open input file // + if (!ascii ) + fIn.open(fileName,std::ios::in|std::ios::binary); + else + fIn.open(fileName,std::ios::in); + + // check if the file has been opened successfully + if (!fIn) { +#ifdef G4VERBOSE + if (verboseLevel >0) { + G4cerr << "G4ProductionCutTable::RetrieveMaterialCutsCoupleInfo "; + G4cerr << " Can not open file " << fileName << G4endl; + } +#endif + return false; + } + + char temp[FixedStringLengthForStore]; + + // key word + G4String keyword; + if (ascii) { + fIn >> keyword; + } else { + fIn.read(temp, FixedStringLengthForStore); + keyword = (const char*)(temp); + } + if (key!=keyword) { + if (verboseLevel >0) { + G4cout << "G4ProductionCutTable::RetrieveMaterialCutsCoupleInfo "; + G4cout << " Key word in " << fileName << "= " << keyword ; + G4cout <<"( should be "<< key << ")" <> numberOfCouples; + } else { + fIn.read( (char*)(&numberOfCouples), sizeof (G4int)); + } + if ( size_t(numberOfCouples) != coupleTable.size()) { +#ifdef G4VERBOSE + if (verboseLevel >0) { + G4cout << "G4ProductionCutTable::RetrieveMaterialCutsCoupleInfo "; + G4cout << "Number of couples is inconsistent "<< G4endl; + G4cout << "Number of couples in " << fileName << "= " << numberOfCouples; + G4cout <<"( should be "<< coupleTable.size()<< ")" <> index; + } else { + fIn.read( (char*)(&index), sizeof (G4int)); + } + // read in index material name + char mat_name[FixedStringLengthForStore]; + if (ascii) { + fIn >> mat_name; + } else { + fIn.read(mat_name, FixedStringLengthForStore); + } + // read in index and region name + char region_name[FixedStringLengthForStore]; + if (ascii) { + fIn >> region_name; + } else { + fIn.read(region_name, FixedStringLengthForStore); + } + // cut value + G4double cutValues[NumberOfG4CutIndex]; + for (size_t i=0; i< NumberOfG4CutIndex; i++) { + if (ascii) { + fIn >> cutValues[i]; + cutValues[i] *= (mm); + } else { + fIn.read( (char*)(&(cutValues[i])), sizeof (G4double)); + } + } + G4MaterialCutsCouple* aCouple= coupleTable[size_t(idx)]; + // set material + G4Material* material = G4Material::GetMaterial(mat_name); + aCouple->SetMaterial(material); + + G4ProductionCuts* aCut=0; + // delete attached cut unless this couple is not used + if (!aCouple->IsUsed()){ + aCut= aCouple->GetProductionCuts(); + if (aCut) delete aCut; + } + + if ( region_name == "NONE" ) { + //create production cuts but the couple is not used + aCouple->SetUseFlag(false); + aCut = new G4ProductionCuts(); + for (size_t j=0; j< NumberOfG4CutIndex; j++) { + aCut->SetProductionCut(cutValues[j],j); + } + aCouple->SetProductionCuts(aCut); + } else { + //set production cuts in the region to this couple + G4Region* fRegion = fG4RegionStore->GetRegion(region_name); + aCut = fRegion->GetProductionCuts(); + if (!aCut) { + // the case no production cuts in the region + aCut = new G4ProductionCuts(); + for (size_t j=0; j< NumberOfG4CutIndex; j++) { + aCut->SetProductionCut(cutValues[j],j); + } + } + aCouple->SetProductionCuts(aCut); + } +#ifdef G4VERBOSE + if (verboseLevel >2) { + G4cout << "G4ProductionCutTable::RetrieveMaterialCutsCoupleInfo "; + G4cout << "Couples is modified "<< G4endl; + G4cout << index << ": "; + G4cout << "material: " << mat_name << G4endl; + G4cout << "region: " << region_name << G4endl; + for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { + G4cout << "cut [" << ii << "]: " << cutValues[ii]/mm<< G4endl; + } + } +#endif + } + fIn.close(); + return true; +} + // Store cut values information in files under the specified directory. G4bool G4ProductionCutsTable::StoreCutsInfo(const G4String& directory, G4bool ascii) @@ -968,3 +1150,4 @@ G4bool G4ProductionCutsTable::RetrieveCutsInfo(const G4String& directory, + diff --git a/source/processes/decay/History b/source/processes/decay/History index ab7b5f3f7b..97f813d7c0 100644 --- a/source/processes/decay/History +++ b/source/processes/decay/History @@ -1,4 +1,4 @@ -$Id: History,v 1.12 2004/03/12 04:46:29 kurasige Exp $ +$Id: History,v 1.13 2004/05/08 15:30:19 kurasige Exp $ ------------------------------------------------------------------- ========================================================= @@ -16,6 +16,9 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +- May. 08, 04 H.Kurashige(decay-V06-01-00) +- Change method name for ParticleChange + - Mar. 12, 04 H.Kurashige(decay-V06-00-00) - Fixed bug in PostStepGPIL in case of stopping during AlongStep actions diff --git a/source/processes/decay/src/G4Decay.cc b/source/processes/decay/src/G4Decay.cc index f7aced2184..3d7014ec59 100644 --- a/source/processes/decay/src/G4Decay.cc +++ b/source/processes/decay/src/G4Decay.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Decay.cc,v 1.16 2003/04/26 18:54:11 vnivanch Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Decay.cc,v 1.18 2004/05/08 15:30:19 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -213,8 +213,8 @@ G4VParticleChange* G4Decay::DecayIt(const G4Track& aTrack, const G4Step& ) #endif fParticleChangeForDecay.SetNumberOfSecondaries(0); // Kill the parent particle - fParticleChangeForDecay.SetStatusChange( fStopAndKill ) ; - fParticleChangeForDecay.SetLocalEnergyDeposit(0.0); + fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ; + fParticleChangeForDecay.ProposeLocalEnergyDeposit(0.0); ClearNumberOfInteractionLengthLeft(); return &fParticleChangeForDecay ; @@ -234,9 +234,9 @@ G4VParticleChange* G4Decay::DecayIt(const G4Track& aTrack, const G4Step& ) // decay channel not found G4Exception("G4Decay::DoIt : can not determine decay channel "); } else { - G4int temp = decaychannel->GetVerboseLevel(); // execute DecayIt() #ifdef G4VERBOSE + G4int temp = decaychannel->GetVerboseLevel(); if (GetVerboseLevel()>1) { G4cerr << "G4Decay::DoIt : selected decay channel addr:" << decaychannel <SetVerboseLevel(GetVerboseLevel()); @@ -307,9 +307,9 @@ G4VParticleChange* G4Decay::DecayIt(const G4Track& aTrack, const G4Step& ) delete products; // Kill the parent particle - fParticleChangeForDecay.SetStatusChange( fStopAndKill ) ; - fParticleChangeForDecay.SetLocalEnergyDeposit(energyDeposit); - fParticleChangeForDecay.SetTimeChange( finalGlobalTime ); + fParticleChangeForDecay.ProposeTrackStatus( fStopAndKill ) ; + fParticleChangeForDecay.ProposeLocalEnergyDeposit(energyDeposit); + fParticleChangeForDecay.ProposeGlobalTime( finalGlobalTime ); // reset NumberOfInteractionLengthLeft ClearNumberOfInteractionLengthLeft(); diff --git a/source/processes/electromagnetic/lowenergy/History b/source/processes/electromagnetic/lowenergy/History index a9f113214a..4363835c74 100644 --- a/source/processes/electromagnetic/lowenergy/History +++ b/source/processes/electromagnetic/lowenergy/History @@ -1,4 +1,4 @@ -$Id: History,v 1.200 2004/03/23 12:45:14 gcosmo Exp $ +$Id: History,v 1.203 2004/06/07 07:42:57 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,8 +17,27 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +07.06.2004 G.Cosmo, tag emlowen-V06-01-02 + Fix in G4hShellCrossSectionExp for compilation error on WIN32-VC. + +01.06.2004 MGP, tag emlowen-V06-01-01 + Bug fix for Barkas effect + +01.06.2004 MGP, tag emlowen-V06-01-00 + Bug fix in energy loss concerning positrons handled by Penelope + +19.05.2004 MGP, tag emlowen-V06-00-11 + New model for PIXE (by Simona Saliceti) + +19.05.2004 MGP, tag emlowen-V06-00-10 + First iteration towards new models for photoelectric + angular distribution: design iteration and re-implementation + of re-implementation of non-polarized Sauter-Gavrila + distribution (K-shell approximation)" by Pedro Rodrigues + and Andreia Trindade + 23.03.2004 G.Cosmo, tag emlowen-V06-00-09 - Fix in G4PenelopeCompton for compilation on WIN32-VC. + Fix in G4PenelopeCompton for compilation error on WIN32-VC. 15.03.2004 MGP, tag emlowen-V06-00-08 Fix in G4PenelopeRayleigh related to PR 605 diff --git a/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGenerator462.hh b/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGenerator462.hh new file mode 100644 index 0000000000..b62cda7d46 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGenerator462.hh @@ -0,0 +1,77 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4PhotoElectricAngularGenerator462 +// +// Author: Andreia Trindade (andreia@lip.pt) +// +// Creation date: 10 May 2004 +// +// Modifications: +// 10 May 2003 A. Trindade First implementation acording with new design +// +// Class Description: +// +// Abstract class for PhotoElectricsstrahlung Angular Generator462 Generation +// Further documentation available from http://www.ge.infn.it/geant4/lowE + +// ------------------------------------------------------------------- +// + +#ifndef G4PhotoElectricAngularGenerator462_h +#define G4PhotoElectricAngularGenerator462_h 1 + +#include "G4VPhotoElectricAngularDistribution.hh" +#include "G4ios.hh" +#include "globals.hh" + +class G4PhotoElectricAngularGenerator462 : public G4VPhotoElectricAngularDistribution +{ + +public: + + G4PhotoElectricAngularGenerator462(const G4String& name); + + ~G4PhotoElectricAngularGenerator462(); + + G4ThreeVector GetPhotoElectronDirection(G4ThreeVector direction, G4double kineticEnergy); + + void PrintGeneratorInformation() const; + +protected: + +private: + + // hide assignment operator + G4PhotoElectricAngularGenerator462 & operator=(const G4PhotoElectricAngularGenerator462 &right); + G4PhotoElectricAngularGenerator462(const G4PhotoElectricAngularGenerator462&); + +}; + +#endif + diff --git a/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGeneratorStandard.hh b/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGeneratorStandard.hh new file mode 100644 index 0000000000..c8fdcbd7d9 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4PhotoElectricAngularGeneratorStandard.hh @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4PhotoElectricAngularGeneratorStandard +// +// Creation date: 10 May 2004 +// +// Modifications: +// 10 May 2003 P. Rodrigues First implementation acording with new design +// +// Class Description: +// +// Concrete class for PhotoElectric Electron Angular Distribution Generation +// This model is a re-implementation of the Photolectric angular distribution +// developed my M. Maire for the Standard EM Physics G4PhotoElectricEffect +// +// Further documentation available from http://www.ge.infn.it/geant4/lowE + +// ------------------------------------------------------------------- +// + +#ifndef G4PhotoElectricAngularGeneratorStandard_h +#define G4PhotoElectricAngularGeneratorStandard_h 1 + +#include "G4VPhotoElectricAngularDistribution.hh" +#include "G4ios.hh" +#include "globals.hh" + +class G4PhotoElectricAngularGeneratorStandard : public G4VPhotoElectricAngularDistribution +{ + +public: + + G4PhotoElectricAngularGeneratorStandard(const G4String& name); + + ~G4PhotoElectricAngularGeneratorStandard(); + + G4ThreeVector GetPhotoElectronDirection(G4ThreeVector direction, G4double kineticEnergy); + + void PrintGeneratorInformation() const; + +protected: + +private: + + // hide assignment operator + G4PhotoElectricAngularGeneratorStandard & operator=(const G4PhotoElectricAngularGeneratorStandard &right); + G4PhotoElectricAngularGeneratorStandard(const G4PhotoElectricAngularGeneratorStandard&); + +}; + +#endif + diff --git a/source/processes/electromagnetic/lowenergy/include/G4VPhotoElectricAngularDistribution.hh b/source/processes/electromagnetic/lowenergy/include/G4VPhotoElectricAngularDistribution.hh new file mode 100644 index 0000000000..966fc921ac --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4VPhotoElectricAngularDistribution.hh @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4VPhotoElectricAngularDistribution +// +// Author: Pedro Rodrigues (psilva@lip.pt) +// Andreia Trindade (andreia@lip.pt) +// +// Creation date: 10 May 2004 +// +// Modifications: +// 10 May 2004 A. Trindade First implementation acording with new design +// +// Class Description: +// +// Abstract class for PhotoElectricsstrahlung Angular Distribution Generation +// Further documentation available from http://www.ge.infn.it/geant4/lowE + +// ------------------------------------------------------------------- +// + +#ifndef G4VPhotoElectricAngularDistribution_h +#define G4VPhotoElectricAngularDistribution_h 1 + +#include "G4ios.hh" +#include "globals.hh" +#include "G4ThreeVector.hh" + +class G4VPhotoElectricAngularDistribution +{ + +public: + + G4VPhotoElectricAngularDistribution(const G4String& name); + + virtual ~G4VPhotoElectricAngularDistribution(); + + virtual G4ThreeVector GetPhotoElectronDirection(G4ThreeVector direction, G4double kineticEnergy) = 0; + + virtual void PrintGeneratorInformation() const = 0; + +protected: + +private: + + // hide assignment operator + G4VPhotoElectricAngularDistribution & operator=(const G4VPhotoElectricAngularDistribution &right); + G4VPhotoElectricAngularDistribution(const G4VPhotoElectricAngularDistribution&); + +}; + +#endif + diff --git a/source/processes/electromagnetic/lowenergy/include/G4VhShellCrossSection.hh b/source/processes/electromagnetic/lowenergy/include/G4VhShellCrossSection.hh index 451b20c367..109836ff2e 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4VhShellCrossSection.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4VhShellCrossSection.hh @@ -64,12 +64,20 @@ public: G4double mass, G4double deltaEnergy) const; -protected: - - virtual std::vector Probabilities(G4int Z, + virtual std::vector GetCrossSection(G4int Z, G4double incidentEnergy, G4double mass, - G4double deltaEnergy) const = 0; + G4double deltaEnergy, + G4bool testFlag = false) const =0; + + //protected: + + virtual std::vector Probabilities(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy) const = 0; + + private: // Hide copy constructor and assignment operator diff --git a/source/processes/electromagnetic/lowenergy/include/G4hLowEnergyIonisation.hh b/source/processes/electromagnetic/lowenergy/include/G4hLowEnergyIonisation.hh index e82c2731f5..3318dfaaf4 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4hLowEnergyIonisation.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4hLowEnergyIonisation.hh @@ -85,6 +85,7 @@ #include "G4IonYangFluctuationModel.hh" #include "G4AtomicDeexcitation.hh" #include "G4MaterialCutsCouple.hh" +#include class G4VEMDataSet; class G4ShellVacancy; @@ -272,6 +273,7 @@ private: G4VLowEnergyModel* theNuclearStoppingModel; G4VLowEnergyModel* theIonChuFluctuationModel; G4VLowEnergyModel* theIonYangFluctuationModel; + std::map > totalCrossSectionMap; // name of parametrisation table of electron stopping power G4String theProtonTable; @@ -307,7 +309,7 @@ private: G4VhShellCrossSection* shellCS; std::vector zFluoDataVector; G4bool theFluo; - + G4bool expFlag; }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSection.hh b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSection.hh index 011eeee6ce..f2da725c04 100644 --- a/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSection.hh +++ b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSection.hh @@ -34,7 +34,7 @@ // 23 Oct 2001 A. Mantero 1st implementation // 24 Oct 2001 MGP Cleaned up // 29 Oct 2001 VI Add delta energy -// +// 22 Apr 2004 S.Saliceti Add GetCrossSection method // ------------------------------------------------------------------- // Class Description: @@ -56,12 +56,18 @@ public: virtual ~G4hShellCrossSection(); + virtual std::vector GetCrossSection(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy, + G4bool testFlag = false) const; + protected: virtual std::vector Probabilities(G4int Z, - G4double incidentEnergy, - G4double mass, - G4double deltaEnergy) const; + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy) const; private: diff --git a/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExp.hh b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExp.hh new file mode 100644 index 0000000000..4325bfc737 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExp.hh @@ -0,0 +1,87 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4hShellCrossSectionExp +// +// Author: Simona Saliceti (simona.saliceti@ge.infn.it) +// +// History: +// ----------- +// From 23 Oct 2001 A. Mantero G4hShellCrossSection +// 30/03/2004 Simona Saliceti 1st implementation +// ------------------------------------------------------------------- +// Class Description: +// Empiric Model for shell cross sections in proton ionisation +// ------------------------------------------------------------------- +// $Id: G4hShellCrossSectionExp.hh,v 1.1 2004/04/27 09:45:48 saliceti Exp $ +// GEANT4 tag $Name: geant4-06-02 $ + +#ifndef G4HSHELLCROSSSECTIONEXP_HH +#define G4HSHELLCROSSSECTIONEXP_HH 1 + +#include "globals.hh" +#include "G4VhShellCrossSection.hh" +#include "G4hShellCrossSectionExpData.hh" + +class G4hShellCrossSectionExp : public G4VhShellCrossSection +{ +public: + + G4hShellCrossSectionExp(); + + virtual ~G4hShellCrossSectionExp(); + + virtual std::vector GetCrossSection(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy, + G4bool testFlag = false) const; + + void SetTotalCS(G4double); + +protected: + + virtual std::vector Probabilities(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy) const; + + +private: + + G4double GetCrossSectionExp(G4int Z, + G4double incidentEnergy) const; + + // Hide copy constructor and assignment operator + G4hShellCrossSectionExp(const G4hShellCrossSectionExp&); + G4hShellCrossSectionExp & operator = (const G4hShellCrossSectionExp &right); + G4hShellCrossSectionExpData* kShellData; + + G4double atomTotalCrossSection; +}; + +#endif diff --git a/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExpData.hh b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExpData.hh new file mode 100644 index 0000000000..2a4774a339 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/include/G4hShellCrossSectionExpData.hh @@ -0,0 +1,154 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// Author: Simona Saliceti (Simona.Saliceti@ge.infn.it) +// +// History: +// ----------- +// 22 Apr 2004 First committed to cvs +// +// ------------------------------------------------------------------- +// Class description: +// Low Energy Electromagnetic Physics +// Fluorescence data set: shell identifiers, transition probabilities, +// transition energies +// Further documentation available from http://www.ge.infn.it/geant4/lowE +// ------------------------------------------------------------------- +// $Id: G4hShellCrossSectionExpData.hh,v 1.1 2004/04/27 09:45:48 saliceti Exp $ +// GEANT4 tag $Name: geant4-06-02 $ + +#ifndef G4hShellCrossSectionExpData_HH +#define G4hShellCrossSectionExpData_HH 1 + +#include "globals.hh" +#include +#include + +class G4hShellCrossSectionExpData +{ +public: + + G4hShellCrossSectionExpData(); + + ~G4hShellCrossSectionExpData(); + + std::vector* GetParam(G4int); + +private: + + void FillVectorValues(); + void FillParameterMap(); + + inline void InitializeVector(std::vector &vect, G4double value1, G4double value2, G4double value3) const; + +std::map*,std::less > parameterMap; + +std::vector parameter6C; +std::vector parameter7N ; +std::vector parameter8O ; +std::vector parameter9F ; +std::vector parameter10Ne; +std::vector parameter11Na; +std::vector parameter12Mg; +std::vector parameter13Al; +std::vector parameter14Si; +std::vector parameter15P ; +std::vector parameter16S ; +std::vector parameter17Cl; +std::vector parameter18Ar; +std::vector parameter19K ; +std::vector parameter20Ca; +std::vector parameter21Sc; +std::vector parameter22Ti; +std::vector parameter23V ; +std::vector parameter24Cr; +std::vector parameter25Mn; +std::vector parameter26Fe; +std::vector parameter27Co; +std::vector parameter28Ni; +std::vector parameter29Cu; +std::vector parameter30Zn; +std::vector parameter31Ga; +std::vector parameter32Ge; +std::vector parameter33As; +std::vector parameter34Se; +std::vector parameter35Br; +std::vector parameter36Kr; +std::vector parameter37Rb; +std::vector parameter38Sr; +std::vector parameter39Y ; +std::vector parameter40Zr; +std::vector parameter41Nb; +std::vector parameter42Mo; +std::vector parameter43Tc; +std::vector parameter44Ru; +std::vector parameter45Rh; +std::vector parameter46Pd; +std::vector parameter47Ag; +std::vector parameter48Cd; +std::vector parameter49In; +std::vector parameter50Sn; +std::vector parameter51Sb; +std::vector parameter52Te; +std::vector parameter53I ; +std::vector parameter54Xe; +std::vector parameter55Cs; +std::vector parameter56Ba; +std::vector parameter57La; +std::vector parameter58Ce; +std::vector parameter59Pr; +std::vector parameter60Nd; +std::vector parameter61Pm; +std::vector parameter62Sm; +std::vector parameter63Eu; +std::vector parameter64Gd; +std::vector parameter65Tb; +std::vector parameter66Dy; +std::vector parameter67Ho; +std::vector parameter68Er; +std::vector parameter69Tm; +std::vector parameter70Yb; +std::vector parameter71Lu; +std::vector parameter72Hf; +std::vector parameter73Ta; +std::vector parameter74W ; +std::vector parameter75Re; +std::vector parameter76Os; +std::vector parameter77Ir; +std::vector parameter78Pt; +std::vector parameter79Au; +std::vector parameter80Hg; +std::vector parameter81Tl; +std::vector parameter82Pb; +std::vector parameter83Bi; +std::vector parameter84Po; +std::vector parameter85At; +std::vector parameter86Rn; +std::vector parameter87Fr; +std::vector parameter88Ra; +std::vector parameter89Ac; +std::vector parameter90Th; +std::vector parameter91Pa; +std::vector parameter92U ; +}; + +#endif diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlung.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlung.cc index 6401561c50..5928d74f57 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlung.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopeBremsstrahlung.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4PenelopeBremsstrahlung.cc,v 1.14 2003/11/18 17:29:43 pia Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PenelopeBremsstrahlung.cc,v 1.15 2004/06/01 15:07:10 pandola Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------- // @@ -38,6 +38,7 @@ // 23.05.2003 MGP - Removed memory leak (fix in destructor) // 07.11.2003 L.Pandola - Bug fixed in LoadAngularData() // 11.11.2003 L.Pandola - Code review: use std::map for angular data +// 01.06.2004 L.Pandola - StopButAlive for positrons on PostStepDoIt // //---------------------------------------------------------------- @@ -55,7 +56,7 @@ #include "G4MaterialCutsCouple.hh" #include "G4DataVector.hh" #include "G4ProductionCutsTable.hh" - +#include "G4ProcessManager.hh" G4PenelopeBremsstrahlung::G4PenelopeBremsstrahlung(const G4String& nam) : G4eLowEnergyLoss(nam), @@ -66,7 +67,6 @@ G4PenelopeBremsstrahlung::G4PenelopeBremsstrahlung(const G4String& nam) angularData = new std::map; cutForPhotons = 0.; verboseLevel = 0; - } @@ -321,11 +321,12 @@ G4VParticleChange* G4PenelopeBremsstrahlung::PostStepDoIt(const G4Track& track, G4String excep = "Not found the angular data for material " + material->GetName(); G4Exception(excep); } - G4PenelopeBremsstrahlungAngular* elementAngularData = angularData->find(Z)->second; + //Check if the loaded angular data are right - //G4cout << "Material Z: " << elementAngularData->GetAtomicNumber() << " !!" << G4endl; + //G4cout << "Material Z: " << angularData->find(Z)->second->GetAtomicNumber() << " !!" << G4endl; + // Sample gamma angle (Z - axis along the parent particle). - G4double dirZ = elementAngularData->ExtractCosTheta(kineticEnergy,tGamma); + G4double dirZ = angularData->find(Z)->second->ExtractCosTheta(kineticEnergy,tGamma); G4double totalEnergy = kineticEnergy + electron_mass_c2; G4double phi = twopi * G4UniformRand(); G4double sinTheta = sqrt(1. - dirZ*dirZ); @@ -336,7 +337,7 @@ G4VParticleChange* G4PenelopeBremsstrahlung::PostStepDoIt(const G4Track& track, G4ThreeVector electronDirection = track.GetMomentumDirection(); gammaDirection.rotateUz(electronDirection); - + // // Update the incident particle // @@ -358,7 +359,27 @@ G4VParticleChange* G4PenelopeBremsstrahlung::PostStepDoIt(const G4Track& track, aParticleChange.SetNumberOfSecondaries(1); G4double norm = 1./sqrt(finalX*finalX + finalY*finalY + finalZ*finalZ); aParticleChange.SetMomentumChange(finalX*norm, finalY*norm, finalZ*norm); - aParticleChange.SetEnergyChange( finalEnergy ); + + const G4ParticleDefinition* particle = track.GetDefinition(); + + if (finalEnergy > 0.) + { + aParticleChange.SetEnergyChange(finalEnergy) ; + } + else + { + aParticleChange.SetEnergyChange(0.) ; + if (particle->GetProcessManager()->GetAtRestProcessVector()->size()) + //In this case there is at least one AtRest process + { + aParticleChange.SetStatusChange(fStopButAlive); + } + else + { + aParticleChange.SetStatusChange(fStopAndKill); + } + } + // create G4DynamicParticle object for the gamma G4DynamicParticle* aGamma= new G4DynamicParticle (G4Gamma::Gamma(), @@ -421,8 +442,7 @@ void G4PenelopeBremsstrahlung::LoadAngularData() G4int Z = (G4int)((*theElementVector)[iel]->GetZ()); //if the material is not present yet --> insert it in the map if (!(angularData->count(Z))) { - G4PenelopeBremsstrahlungAngular* elementAngular = new G4PenelopeBremsstrahlungAngular(Z); - angularData->insert(std::make_pair(Z,elementAngular)); + angularData->insert(std::make_pair(Z,new G4PenelopeBremsstrahlungAngular(Z))); //G4cout << "Loaded......... Z= " << Z << G4endl; } } diff --git a/source/processes/electromagnetic/lowenergy/src/G4PenelopeIonisation.cc b/source/processes/electromagnetic/lowenergy/src/G4PenelopeIonisation.cc index f4d25a0a57..ab769f94eb 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4PenelopeIonisation.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4PenelopeIonisation.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4PenelopeIonisation.cc,v 1.12 2004/03/18 13:44:44 pandola Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4PenelopeIonisation.cc,v 1.13 2004/06/01 15:09:12 pandola Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------- // @@ -46,6 +46,7 @@ // 10.03.04 L.Pandola Bug fixed with reference system of delta rays // 17.03.04 L.Pandola Removed unnecessary calls to pow(a,b) // 18.03.04 L.Pandola Bug fixed in the destructor +// 01.06.04 L.Pandola StopButAlive for positrons on PostStepDoIt // -------------------------------------------------------------- #include "G4PenelopeIonisation.hh" @@ -65,6 +66,7 @@ #include "G4Gamma.hh" #include "G4Positron.hh" #include "G4ProductionCutsTable.hh" +#include "G4ProcessManager.hh" G4PenelopeIonisation::G4PenelopeIonisation(const G4String& nam) : G4eLowEnergyLoss(nam), @@ -329,7 +331,15 @@ G4VParticleChange* G4PenelopeIonisation::PostStepDoIt(const G4Track& track, else { aParticleChange.SetEnergyChange(0.) ; - aParticleChange.SetStatusChange(fStopAndKill); + if (aParticleType->GetProcessManager()->GetAtRestProcessVector()->size()) + //In this case there is at least one AtRest process + { + aParticleChange.SetStatusChange(fStopButAlive); + } + else + { + aParticleChange.SetStatusChange(fStopAndKill); + } } //Generate the delta day diff --git a/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGenerator462.cc b/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGenerator462.cc new file mode 100644 index 0000000000..451abfc209 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGenerator462.cc @@ -0,0 +1,76 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4PhotoElectricAngularGenerator462 +// +// Author: Andreia Trindade (andreia@lip.pt) +// +// Creation date: 10 May 2004 +// +// Modifications: +// 10 May 2003 A. Trindade First implementation acording with new design +// +// Class Description: +// +// Concrete class for PhotoElectric Electron Angular Distribution Generation - ( < 4.6.2 model) +// +// Class Description: End +// +// ------------------------------------------------------------------- +// +// + +#include "G4PhotoElectricAngularGenerator462.hh" +#include "Randomize.hh" + +// + +G4PhotoElectricAngularGenerator462::G4PhotoElectricAngularGenerator462(const G4String& name):G4VPhotoElectricAngularDistribution(name) +{;} + +// + +G4PhotoElectricAngularGenerator462::~G4PhotoElectricAngularGenerator462() +{;} + +// + +G4ThreeVector G4PhotoElectricAngularGenerator462::GetPhotoElectronDirection(G4ThreeVector direction, G4double) +{ + return direction; +} + +// + +void G4PhotoElectricAngularGenerator462::PrintGeneratorInformation() const +{ + G4cout << "\n" << G4endl; + G4cout << "Simple Photoelectric Angular Generator" << G4endl; + G4cout << "Photoelectron is emmited with the same direction " << G4endl; + G4cout << "than the incident photon (see Physics Reference Manual) \n" << G4endl; +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGeneratorStandard.cc b/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGeneratorStandard.cc new file mode 100644 index 0000000000..417e8d387f --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4PhotoElectricAngularGeneratorStandard.cc @@ -0,0 +1,112 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4PhotoElectricAngularGeneratorStandard +// +// Creation date: 10 May 2004 +// +// Modifications: +// 10 May 2003 P. Rodrigues First implementation acording with new design +// +// Class Description: +// +// Concrete class for PhotoElectric Electron Angular Distribution Generation +// This model is a re-implementation of the Photolectric angular distribution +// developed my M. Maire for the Standard EM Physics G4PhotoElectricEffect +// +// Class Description: End +// +// ------------------------------------------------------------------- +// +// + +#include "G4PhotoElectricAngularGeneratorStandard.hh" +#include "Randomize.hh" + +// + +G4PhotoElectricAngularGeneratorStandard::G4PhotoElectricAngularGeneratorStandard(const G4String& name):G4VPhotoElectricAngularDistribution(name) +{;} + +// + +G4PhotoElectricAngularGeneratorStandard::~G4PhotoElectricAngularGeneratorStandard() +{;} + +// + +G4ThreeVector G4PhotoElectricAngularGeneratorStandard::GetPhotoElectronDirection(G4ThreeVector direction, G4double eKineticEnergy) +{ + + // Compute Theta distribution of the emitted electron, with respect to the + // incident Gamma. + // The Sauter-Gavrila distribution for the K-shell is used. (adapted from G4PhotoElectricEffect) + + G4double costeta = 1.; + G4double Phi = twopi * G4UniformRand(); + G4double cosphi = cos(Phi); + G4double sinphi = sin(Phi); + G4double sinteta = 0; + G4double gamma = 1. + eKineticEnergy/electron_mass_c2; + + if (gamma > 5.) { + G4ThreeVector direction (sinteta*cosphi, sinteta*sinphi, costeta); + return costeta; + } + + G4double beta = sqrt(gamma*gamma-1.)/gamma; + G4double b = 0.5*gamma*(gamma-1.)*(gamma-2); + + G4double rndm,term,greject,grejsup; + if (gamma < 2.) grejsup = gamma*gamma*(1.+b-beta*b); + else grejsup = gamma*gamma*(1.+b+beta*b); + + do { rndm = 1.-2*G4UniformRand(); + costeta = (rndm+beta)/(rndm*beta+1.); + term = 1.-beta*costeta; + greject = (1.-costeta*costeta)*(1.+b*term)/(term*term); + } while(greject < G4UniformRand()*grejsup); + + + sinteta = sqrt(1.-costeta*costeta); + G4ThreeVector photoelectrondirection (sinteta*cosphi, sinteta*sinphi, costeta); + photoelectrondirection.rotateUz(direction); + return photoelectrondirection; +} + +// + +void G4PhotoElectricAngularGeneratorStandard::PrintGeneratorInformation() const +{ + G4cout << "\n" << G4endl; + G4cout << "" << G4endl; + G4cout << "Re-implementation of the photolectric angular distribution" << G4endl; + G4cout << "developed my M. Maire for the Standard EM Physics G4PhotoElectricEffect" << G4endl; + G4cout << "It computes the theta distribution of the emitted electron, with respect to the" << G4endl; + G4cout << "incident Gamma, using the Sauter-Gavrila distribution for the K-shell\n" << G4endl; +} diff --git a/source/processes/electromagnetic/lowenergy/src/G4VPhotoElectricAngularDistribution.cc b/source/processes/electromagnetic/lowenergy/src/G4VPhotoElectricAngularDistribution.cc new file mode 100644 index 0000000000..debd4090ef --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4VPhotoElectricAngularDistribution.cc @@ -0,0 +1,63 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4VPhotoElectricAngularDistribution +// +// Author: Andreia Trindade (andreia@lip.pt) +// Pedro Rodrigues (psilva@lip.pt) +// +// Creation date: 10 May 2004 +// +// Modifications: +// +// Class Description: +// +// Abstract base class for PhotoElectricsstrahlung Angular Distribution Generation +// +// Class Description: End + +// ------------------------------------------------------------------- +// +// + +#include "G4VPhotoElectricAngularDistribution.hh" + +// + +G4VPhotoElectricAngularDistribution::G4VPhotoElectricAngularDistribution(const G4String& ) // name +{;} + +// + +G4VPhotoElectricAngularDistribution::~G4VPhotoElectricAngularDistribution() +{;} + +void G4VPhotoElectricAngularDistribution::PrintGeneratorInformation() const +{;} + +// diff --git a/source/processes/electromagnetic/lowenergy/src/G4eLowEnergyLoss.cc b/source/processes/electromagnetic/lowenergy/src/G4eLowEnergyLoss.cc index 48411f1a5e..6603bc1802 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4eLowEnergyLoss.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4eLowEnergyLoss.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4eLowEnergyLoss.cc,v 1.31 2003/06/16 17:00:36 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4eLowEnergyLoss.cc,v 1.32 2004/06/01 14:03:55 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ----------------------------------------------------------- // GEANT 4 class implementation file @@ -58,6 +58,7 @@ // 03/06/02 MGP - Restore fStopAndKill // 28/10/02 VI Optimal binning for dE/dx // 21/01/03 VI cut per region +// 01/06/04 VI check if stopped particle has AtRest processes // // -------------------------------------------------------------- @@ -451,7 +452,8 @@ G4VParticleChange* G4eLowEnergyLoss::AlongStepDoIt( const G4Track& trackData, if (finalT <= 0. ) { finalT = 0.; - aParticleChange.SetStatusChange(fStopAndKill); + if(Charge > 0.0) aParticleChange.SetStatusChange(fStopButAlive); + else aParticleChange.SetStatusChange(fStopAndKill); } G4double edep = E - finalT; diff --git a/source/processes/electromagnetic/lowenergy/src/G4hLowEnergyIonisation.cc b/source/processes/electromagnetic/lowenergy/src/G4hLowEnergyIonisation.cc index 587efe49b3..1fe4a6372a 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4hLowEnergyIonisation.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4hLowEnergyIonisation.cc @@ -89,6 +89,7 @@ // 12 Apr 2003 V.Ivanchenko Cut per region for fluo AlongStep // 18 Apr 2003 V.Ivanchenko finalRange redefinition // 26 Apr 2003 V.Ivanchenko fix for stepLimit +// 28 May 2004 V.Ivanchenko fix for ionisation of antiprotons in complex materials // ----------------------------------------------------------------------- @@ -932,7 +933,7 @@ G4VParticleChange* G4hLowEnergyIonisation::AlongStepDoIt( } // stop particle if the kinetic energy <= MinKineticEnergy - if (finalT <= MinKineticEnergy ) { + if (finalT*massRatio <= MinKineticEnergy ) { finalT = 0.0; if(!particle->GetDefinition()->GetProcessManager()-> @@ -1060,14 +1061,15 @@ G4double G4hLowEnergyIonisation::AntiProtonParametrisedDEDX( // The proton model is used + Barkas correction } else { if(kineticEnergy < protonLowEnergy) { - eloss = theProtonModel->TheValue(G4Proton::Proton(),material,protonLowEnergy); + eloss = theProtonModel->TheValue(G4Proton::Proton(),material,protonLowEnergy) + * sqrt(kineticEnergy/protonLowEnergy) ; // Parametrisation } else { eloss = theProtonModel->TheValue(G4Proton::Proton(),material, kineticEnergy); } - if(theBarkas) eloss -= 2.0*BarkasTerm(material, kineticEnergy); + //if(theBarkas) eloss -= 2.0*BarkasTerm(material, kineticEnergy); } // Delta rays energy diff --git a/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSection.cc b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSection.cc index 626e483f9e..0d8e818529 100644 --- a/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSection.cc +++ b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSection.cc @@ -51,6 +51,16 @@ G4hShellCrossSection::~G4hShellCrossSection() { } +std::vector G4hShellCrossSection::GetCrossSection(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy, + G4bool) const +{ + return Probabilities(Z,incidentEnergy,mass,deltaEnergy); +} + + std::vector G4hShellCrossSection::Probabilities( G4int Z, G4double incidentEnergy, diff --git a/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExp.cc b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExp.cc new file mode 100644 index 0000000000..060f97e9b5 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExp.cc @@ -0,0 +1,145 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4hShellCrossSectionExp.cc +// +// Author: Simona Saliceti (simona.saliceti@ge.infn.it) +// +// History: +// ----------- +// From 23 Oct 2001 A. Mantero G4hShellCrossSection +// 30/03/2004 Simona Saliceti 1st implementation +// ------------------------------------------------------------------- +// Class Description: +// Empiric Model for shell cross sections in proton ionisation +// ------------------------------------------------------------------- +// $Id: G4hShellCrossSectionExp.cc,v 1.2 2004/06/07 07:42:45 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ + +#include "globals.hh" +#include +#include "G4hShellCrossSectionExp.hh" +#include "G4AtomicTransitionManager.hh" +#include "G4Electron.hh" +#include "G4hShellCrossSectionExpData.hh" +#include "G4Proton.hh" +#include "G4ParticleDefinition.hh" + +G4hShellCrossSectionExp::G4hShellCrossSectionExp() +{ + kShellData = new G4hShellCrossSectionExpData(); +} + +G4hShellCrossSectionExp::~G4hShellCrossSectionExp() +{ } + +std::vector G4hShellCrossSectionExp::GetCrossSection(G4int Z, + G4double incidentEnergy, + G4double mass, + G4double deltaEnergy, + G4bool testFlag) const +{ + mass = 0.0; + deltaEnergy = 0.0; + + std::vector aCrossSection; + + // Fill the vector of cross sections with the value just calculated + aCrossSection.push_back(GetCrossSectionExp(Z,incidentEnergy)); + + if (testFlag) + { + G4cout <<"Element: " <* parVec = kShellData->GetParam(Z); + std::vector::iterator i = (*parVec).begin(); + + G4double a = *i; + G4double b = *(i+1); + G4double c = *(i+2); + + G4double incidentEnergyInMeV = incidentEnergy/MeV; + + if(Z<26 && Z>=6 && Z!=17) + { + crossSectionsInBarn = a*(pow(b,(1./incidentEnergyInMeV)))*(pow(incidentEnergyInMeV,c)); + } + else if(Z<66 && Z>=26 || Z==17) + { + crossSectionsInBarn = exp(a+(b/incidentEnergyInMeV)+(c*log(incidentEnergyInMeV))); + } + else if(Z<=92 && Z>=66) + { + crossSectionsInBarn = (pow(incidentEnergyInMeV,a))*exp(b-(c*incidentEnergyInMeV)); + } + else + { + G4cout << "Error: there is not that Z" << G4endl; + } + + crossSections = crossSectionsInBarn*barn; + return crossSections; +} + +// This function gives the atomic cross section of k shell only +void G4hShellCrossSectionExp::SetTotalCS(G4double value) +{ + atomTotalCrossSection = value; +} + +//A new implementation of Probability to calculate the cross section probability for k shell only + std::vector G4hShellCrossSectionExp::Probabilities( + G4int Z, + G4double incidentEnergy, + G4double hMass, + G4double deltaEnergy + ) const +{ + hMass = 0.0; + deltaEnergy = 0.0; + + std::vector kProbability; + kProbability.push_back(GetCrossSectionExp(Z,incidentEnergy)/atomTotalCrossSection); + kProbability.push_back(1 - kProbability[1]); + + return kProbability; +} + + + diff --git a/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExpData.cc b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExpData.cc new file mode 100644 index 0000000000..6dfbf84869 --- /dev/null +++ b/source/processes/electromagnetic/lowenergy/src/G4hShellCrossSectionExpData.cc @@ -0,0 +1,251 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// +// Author: Simona Saliceti (simona.saliceti@ge.infn.it) +// +// History: +// ----------- +// 22 Apr 2004 First committed to cvs +// +// ------------------------------------------------------------------- +// $Id: G4hShellCrossSectionExpData.cc,v 1.1 2004/04/27 09:45:49 saliceti Exp $ +// GEANT4 tag $Name: geant4-06-02 $ + +#include "G4hShellCrossSectionExpData.hh" +#include +#include + +G4hShellCrossSectionExpData::G4hShellCrossSectionExpData() +{ + + + FillVectorValues(); + + FillParameterMap(); + +} + +G4hShellCrossSectionExpData::~G4hShellCrossSectionExpData() +{ + std::map< G4int,std::vector*,std::less >::iterator pos; + for (pos = parameterMap.begin(); pos != parameterMap.end(); ++pos) + { + std::vector* dataSet = (*pos).second; + delete dataSet; + } +} + +inline void G4hShellCrossSectionExpData::InitializeVector(std::vector &vect, G4double value1, G4double value2, G4double value3) const +{ + vect.push_back(value1); + vect.push_back(value2); + vect.push_back(value3); +} + +void G4hShellCrossSectionExpData::FillVectorValues() +{ + InitializeVector(parameter6C, 25965819., 0.1974268719, -0.9746342); + InitializeVector(parameter7N, 14254204., 0.09584816998, -0.8908825); + InitializeVector(parameter8O, 14257000., 0.9582500E-01, -0.8909900); + InitializeVector(parameter9F, 5628098., 0.2221402E-01, -0.7857742); + InitializeVector(parameter10Ne, 3866500., 0.9298651E-02, -0.7569925); + InitializeVector(parameter11Na, 2816614., 0.3161790E-02, -0.7429561); + InitializeVector(parameter12Mg, 2113709., 0.9267687E-03, -0.7342144); + InitializeVector(parameter13Al, 1647127., 0.2344573E-03, -0.7305032); + InitializeVector(parameter14Si, 1267490., 0.5787061E-04, -0.7184879); + InitializeVector(parameter15P, 1035792., 0.1101495E-04, -0.7199858); + InitializeVector(parameter16S, 825871.6, 0.2326387E-05, -0.7095044); + InitializeVector(parameter17Cl, 13.41653, -14.66877, -0.7017217); + InitializeVector(parameter18Ar, 555038.1, 0.6543986E-07, -0.6968985); + InitializeVector(parameter19K, 469063.8, 0.8876799E-08, -0.6940991); + InitializeVector(parameter20Ca, 405918.4, 0.9881247E-09, -0.6953619); + InitializeVector(parameter21Sc, 351611.0, 0.1054022E-09, -0.6950487); + InitializeVector(parameter22Ti, 313223.2, 0.8541349E-11, -0.6984913); + InitializeVector(parameter23V, 257752.3, 0.1092866E-11, -0.6841001); + InitializeVector(parameter24Cr, 230064.8, 0.7874358E-13, -0.6862135); + InitializeVector(parameter25Mn, 151740.8, 0.7988999E-13, -0.6279536); + InitializeVector(parameter26Fe, 12.21083, -35.54018, -0.7140945); + InitializeVector(parameter27Co, 12.14600, -38.73178, -0.7229655); + InitializeVector(parameter28Ni, 12.10570, -42.25900, -0.7354265); + InitializeVector(parameter29Cu, 11.87911, -44.37304, -0.7089269); + InitializeVector(parameter30Zn, 11.86411, -48.35208, -0.7252861); + InitializeVector(parameter31Ga, 11.66042, -50.73798, -0.7029260); + InitializeVector(parameter32Ge, 11.66824, -55.26208, -0.7218891); + InitializeVector(parameter33As, 11.47804, -57.94218, -0.7016547); + InitializeVector(parameter34Se, 11.30017, -60.70304, -0.6836499); + InitializeVector(parameter35Br, 11.32571, -65.77174, -0.7042627); + InitializeVector(parameter36Kr, 10.44025, -61.74093, -0.5383769); + InitializeVector(parameter37Rb, 10.27499, -64.44025, -0.5236434); + InitializeVector(parameter38Sr, 10.31786, -69.83844, -0.5475903); + InitializeVector(parameter39Y, 10.14157, -72.55550, -0.5302060); + InitializeVector(parameter40Zr, 10.03310, -76.52999, -0.5243382); + InitializeVector(parameter41Nb, 10.03804, -81.38335, -0.5404782); + InitializeVector(parameter42Mo, 9.872166, -84.24110, -0.5245091); + InitializeVector(parameter43Tc, 9.941685, -90.72401, -0.5503877); + InitializeVector(parameter44Ru, 9.771618, -93.50847, -0.5334178); + InitializeVector(parameter45Rh, 9.819192, -99.99145, -0.5543751); + InitializeVector(parameter46Pd, 9.680034, -103.5450, -0.5387755); + InitializeVector(parameter47Ag, 9.703977, -109.8104, -0.5550457); + InitializeVector(parameter48Cd, 9.548004, -113.0565, -0.5399088); + InitializeVector(parameter49In, 9.378392, -115.8466, -0.5226109); + InitializeVector(parameter50Sn, 9.406608, -122.6137, -0.5386317); + InitializeVector(parameter51Sb, 9.254029, -125.8533, -0.5238908); + InitializeVector(parameter52Te, 9.311451, -133.6049, -0.5440237); + InitializeVector(parameter53I, 9.158569, -136.7913, -0.5291739); + InitializeVector(parameter54Xe, 9.011420, -140.1908, -0.5150210); + InitializeVector(parameter55Cs, 9.112158, -149.6160, -0.5411919); + InitializeVector(parameter56Ba, 7.696734, -124.4350, -0.3181673); + InitializeVector(parameter57La, 7.728227, -130.9067, -0.3348193); + InitializeVector(parameter58Ce, 7.595518, -134.1356, -0.3233585); + InitializeVector(parameter59Pr, 7.451400, -136.9318, -0.3102762); + InitializeVector(parameter60Nd, 7.493138, -144.0968, -0.3273972); + InitializeVector(parameter61Pm, 7.358854, -147.1354, -0.3155824); + InitializeVector(parameter62Sm, 7.231769, -150.3722, -0.3048225); + InitializeVector(parameter63Eu, 7.060385, -152.3517, -0.2873322); + InitializeVector(parameter64Gd, 7.179881, -161.9544, -0.3162093); + InitializeVector(parameter65Tb, 7.048202, -164.9670, -0.3046019); + InitializeVector(parameter66Dy, 1.962871, -4.620275, 0.5748519E-02); + InitializeVector(parameter67Ho, 1.992797, -4.863559, 0.5772170E-02); + InitializeVector(parameter68Er, 2.013621, -5.068997, 0.5749294E-02); + InitializeVector(parameter69Tm, 2.026489, -5.243042, 0.5671808E-02); + InitializeVector(parameter70Yb, 1.946252, -5.047087, 0.5011610E-02); + InitializeVector(parameter71Lu, 1.968246, -5.253083, 0.5007004E-02); + InitializeVector(parameter72Hf, 1.980888, -5.421401, 0.4949681E-02); + InitializeVector(parameter73Ta, 1.925043, -5.310529, 0.4504530E-02); + InitializeVector(parameter74W, 1.939689, -5.484359, 0.4464923E-02); + InitializeVector(parameter75Re, 1.951746, -5.645718, 0.4415765E-02); + InitializeVector(parameter76Os, 2.249802, -6.974045, 0.5965646E-02); + InitializeVector(parameter77Ir, 2.257475, -7.121614, 0.5873831E-02); + InitializeVector(parameter78Pt, 2.262231, -7.255240, 0.5769194E-02); + InitializeVector(parameter79Au, 2.188981, -7.080360, 0.5161316E-02); + InitializeVector(parameter80Hg, 2.199681, -7.233214, 0.5111361E-02); + InitializeVector(parameter81Tl, 2.211119, -7.389515, 0.5064001E-02); + InitializeVector(parameter82Pb, 2.204573, -7.468263, 0.4934075E-02); + InitializeVector(parameter83Bi, 2.148083, -7.348053, 0.4494417E-02); + InitializeVector(parameter84Po, 2.154512, -7.479838, 0.4433237E-02); + InitializeVector(parameter85At, 2.164621, -7.626572, 0.4388465E-02); + InitializeVector(parameter86Rn, 2.288465, -8.212229, 0.5807703E-02); + InitializeVector(parameter87Fr, 2.294291, -8.336506, 0.5753172E-02); + InitializeVector(parameter88Ra, 2.318430, -8.525764, 0.5849121E-02); + InitializeVector(parameter89Ac, 2.306637, -8.578354, 0.5672658E-02); + InitializeVector(parameter90Th, 2.254484, -8.479531, 0.5163647E-02); + InitializeVector(parameter91Pa, 2.246310, -8.540535, 0.5044748E-02); + InitializeVector(parameter92U, 2.276106, -8.748476, 0.5186345E-02); +} + +void G4hShellCrossSectionExpData::FillParameterMap() +{ + parameterMap [6] = ¶meter6C ; + parameterMap [7] = ¶meter7N ; + parameterMap [8] = ¶meter8O ; + parameterMap [9] = ¶meter9F ; + parameterMap [10] = ¶meter10Ne; + parameterMap [11] = ¶meter11Na; + parameterMap [12] = ¶meter12Mg; + parameterMap [13] = ¶meter13Al; + parameterMap [14] = ¶meter14Si; + parameterMap [15] = ¶meter15P ; + parameterMap [16] = ¶meter16S ; + parameterMap [17] = ¶meter17Cl; + parameterMap [18] = ¶meter18Ar; + parameterMap [19] = ¶meter19K ; + parameterMap [20] = ¶meter20Ca; + parameterMap [21] = ¶meter21Sc; + parameterMap [22] = ¶meter22Ti; + parameterMap [23] = ¶meter23V ; + parameterMap [24] = ¶meter24Cr; + parameterMap [25] = ¶meter25Mn; + parameterMap [26] = ¶meter26Fe; + parameterMap [27] = ¶meter27Co; + parameterMap [28] = ¶meter28Ni; + parameterMap [29] = ¶meter29Cu; + parameterMap [30] = ¶meter30Zn; + parameterMap [31] = ¶meter31Ga; + parameterMap [32] = ¶meter32Ge; + parameterMap [33] = ¶meter33As; + parameterMap [34] = ¶meter34Se; + parameterMap [35] = ¶meter35Br; + parameterMap [36] = ¶meter36Kr; + parameterMap [37] = ¶meter37Rb; + parameterMap [38] = ¶meter38Sr; + parameterMap [39] = ¶meter39Y ; + parameterMap [40] = ¶meter40Zr; + parameterMap [41] = ¶meter41Nb; + parameterMap [42] = ¶meter42Mo; + parameterMap [43] = ¶meter43Tc; + parameterMap [44] = ¶meter44Ru; + parameterMap [45] = ¶meter45Rh; + parameterMap [46] = ¶meter46Pd; + parameterMap [47] = ¶meter47Ag; + parameterMap [48] = ¶meter48Cd; + parameterMap [49] = ¶meter49In; + parameterMap [50] = ¶meter50Sn; + parameterMap [51] = ¶meter51Sb; + parameterMap [52] = ¶meter52Te; + parameterMap [53] = ¶meter53I ; + parameterMap [54] = ¶meter54Xe; + parameterMap [55] = ¶meter55Cs; + parameterMap [56] = ¶meter56Ba; + parameterMap [57] = ¶meter57La; + parameterMap [58] = ¶meter58Ce; + parameterMap [59] = ¶meter59Pr; + parameterMap [60] = ¶meter60Nd; + parameterMap [61] = ¶meter61Pm; + parameterMap [62] = ¶meter62Sm; + parameterMap [63] = ¶meter63Eu; + parameterMap [64] = ¶meter64Gd; + parameterMap [65] = ¶meter65Tb; + parameterMap [66] = ¶meter66Dy; + parameterMap [67] = ¶meter67Ho; + parameterMap [68] = ¶meter68Er; + parameterMap [69] = ¶meter69Tm; + parameterMap [70] = ¶meter70Yb; + parameterMap [71] = ¶meter71Lu; + parameterMap [72] = ¶meter72Hf; + parameterMap [73] = ¶meter73Ta; + parameterMap [74] = ¶meter74W ; + parameterMap [75] = ¶meter75Re; + parameterMap [76] = ¶meter76Os; + parameterMap [77] = ¶meter77Ir; + parameterMap [78] = ¶meter78Pt; + parameterMap [79] = ¶meter79Au; + parameterMap [80] = ¶meter80Hg; + parameterMap [81] = ¶meter81Tl; + parameterMap [82] = ¶meter82Pb; + parameterMap [83] = ¶meter83Bi; + parameterMap [84] = ¶meter84Po; + parameterMap [85] = ¶meter85At; + parameterMap [86] = ¶meter86Rn; + parameterMap [87] = ¶meter87Fr; + parameterMap [88] = ¶meter88Ra; + parameterMap [89] = ¶meter89Ac; + parameterMap [90] = ¶meter90Th; + parameterMap [91] = ¶meter91Pa; + parameterMap [92] = ¶meter92U ; +} + +std::vector* G4hShellCrossSectionExpData::GetParam(G4int Z) +{ + return parameterMap[Z]; +} diff --git a/source/processes/electromagnetic/muons/History b/source/processes/electromagnetic/muons/History index 7e1f5063f5..4f066a4bc4 100644 --- a/source/processes/electromagnetic/muons/History +++ b/source/processes/electromagnetic/muons/History @@ -1,4 +1,4 @@ -$Id: History,v 1.66 2004/03/02 17:45:03 vnivanch Exp $ +$Id: History,v 1.68 2004/05/27 16:43:08 vnivanch Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,15 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +27 May 04: V.Ivant (muons-V06-01-01) +- Set default regime of MuIonisation integral +- Minor fix in differential cross section for MuPairProduction + +28 April 04: V.Ivant (muons-V06-01-00) +- MuPairProduction: fix minor energy non-conservation, fix + problem of calculation of maximumum energy transfer for + compounds + 02 March 04: V.Ivant (muons-V06-00-02) - Minor fix in initialisation of MuPairProductionModel diff --git a/source/processes/electromagnetic/muons/include/G4MuBremsstrahlung.hh b/source/processes/electromagnetic/muons/include/G4MuBremsstrahlung.hh index 8805a9c1b6..c14ae93321 100644 --- a/source/processes/electromagnetic/muons/include/G4MuBremsstrahlung.hh +++ b/source/processes/electromagnetic/muons/include/G4MuBremsstrahlung.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuBremsstrahlung.hh,v 1.19 2004/02/10 18:07:23 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuBremsstrahlung.hh,v 1.21 2004/05/07 16:47:15 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // diff --git a/source/processes/electromagnetic/muons/include/G4MuIonisation.hh b/source/processes/electromagnetic/muons/include/G4MuIonisation.hh index 814055da3f..859d88ccc8 100644 --- a/source/processes/electromagnetic/muons/include/G4MuIonisation.hh +++ b/source/processes/electromagnetic/muons/include/G4MuIonisation.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuIonisation.hh,v 1.19 2004/02/10 18:07:23 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuIonisation.hh,v 1.21 2004/05/07 16:47:15 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // diff --git a/source/processes/electromagnetic/muons/include/G4MuPairProduction.hh b/source/processes/electromagnetic/muons/include/G4MuPairProduction.hh index f035f045c2..dac1adc62f 100644 --- a/source/processes/electromagnetic/muons/include/G4MuPairProduction.hh +++ b/source/processes/electromagnetic/muons/include/G4MuPairProduction.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuPairProduction.hh,v 1.18 2004/02/10 18:07:23 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuPairProduction.hh,v 1.21 2004/05/07 16:47:16 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -47,6 +47,7 @@ // 08-08-03 STD substitute standard (V.Ivanchenko) // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko) // 21-01-04 Migrade to G4ParticleChangeForLoss (V.Ivanchenko) +// 28-04-04 Fix minor bug in energy balance (V.Ivanchenko) // // Class Description: // @@ -181,6 +182,7 @@ inline void G4MuPairProduction::SecondariesPostStep( elpos = (*newp)[1]; fParticleChange.AddSecondary(elpos); kinEnergy -= elpos->GetKineticEnergy(); + kinEnergy -= 2.0*electron_mass_c2; delete newp; } diff --git a/source/processes/electromagnetic/muons/include/G4MuPairProductionModel.hh b/source/processes/electromagnetic/muons/include/G4MuPairProductionModel.hh index d5c6c155bf..f944eb81f9 100644 --- a/source/processes/electromagnetic/muons/include/G4MuPairProductionModel.hh +++ b/source/processes/electromagnetic/muons/include/G4MuPairProductionModel.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuPairProductionModel.hh,v 1.11 2004/02/10 18:07:23 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuPairProductionModel.hh,v 1.12 2004/04/28 14:39:43 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -120,7 +120,7 @@ protected: //private: public: - G4double ComputMuPairLoss(G4double Z, G4double tkin, G4double cut); + G4double ComputMuPairLoss(G4double Z, G4double tkin, G4double cut, G4double tmax); G4double ComputeMicroscopicCrossSection(G4double tkin, G4double Z, @@ -131,7 +131,7 @@ public: G4double pairEnergy); private: - const G4Element* SelectRandomAtom(G4double dt, G4int it, G4int iy, + const G4Element* SelectRandomAtom(G4double kinEnergy, G4double dt, G4int it, const G4MaterialCutsCouple* couple); void MakeSamplingTables(); @@ -215,12 +215,14 @@ void G4MuPairProductionModel::SetCurrentElement(G4double Z) inline G4double G4MuPairProductionModel::InterpolatedIntegralCrossSection(G4double dt, G4double dz, - G4int iz, G4int it, G4int iy, G4double z) + G4int iz, G4int it, G4int iy, G4double z) { G4double fac = 1./(zdat[iz] *(zdat[iz] +1.)); G4double fac1 = 1./(zdat[iz-1]*(zdat[iz-1]+1.)); - G4double f0 = fac1*proba[iz-1][it-1][iy] + (fac*proba[iz][it-1][iy]-fac1*proba[iz-1][it-1][iy])*dz; - G4double f1 = fac1*proba[iz-1][it ][iy] + (fac*proba[iz][it ][iy]-fac1*proba[iz-1][it ][iy])*dz; + G4double f0 = fac1*proba[iz-1][it-1][iy] + + (fac*proba[iz][it-1][iy]-fac1*proba[iz-1][it-1][iy])*dz; + G4double f1 = fac1*proba[iz-1][it ][iy] + + (fac*proba[iz][it ][iy]-fac1*proba[iz-1][it ][iy])*dz; return (f0 + (f1-f0)*dt)*z*(z+1.); } diff --git a/source/processes/electromagnetic/muons/src/G4MuIonisation.cc b/source/processes/electromagnetic/muons/src/G4MuIonisation.cc index da49c6c076..516b42acda 100644 --- a/source/processes/electromagnetic/muons/src/G4MuIonisation.cc +++ b/source/processes/electromagnetic/muons/src/G4MuIonisation.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuIonisation.cc,v 1.40 2004/02/15 17:46:55 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuIonisation.cc,v 1.42 2004/05/27 17:29:35 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -60,6 +60,7 @@ // 08-08-03 STD substitute standard (V.Ivanchenko) // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko) // 10-02-04 Calculation of radiative corrections using R.Kokoulin model (V.Ivanchenko) +// 27-05-04 Set integral to be a default regime (V.Ivanchenko) // // ------------------------------------------------------------------- // @@ -90,7 +91,6 @@ G4MuIonisation::G4MuIonisation(const G4String& name) SetLambdaBinning(120); SetMinKinEnergy(0.1*keV); SetMaxKinEnergy(100.0*TeV); - SetIntegral(false); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -106,12 +106,7 @@ void G4MuIonisation::InitialiseProcess() mass = theParticle->GetPDGMass(); SetSecondaryParticle(G4Electron::Electron()); - if(IsIntegral()) { - flucModel = new G4BohrFluctuations(); - - } else { - flucModel = new G4UniversalFluctuation(); - } + flucModel = new G4UniversalFluctuation(); G4VEmModel* em = new G4BraggModel(); em->SetLowEnergyLimit(0.1*keV); @@ -126,6 +121,8 @@ void G4MuIonisation::InitialiseProcess() em2->SetHighEnergyLimit(100.0*TeV); AddEmModel(3, em2, flucModel); + SetStepLimits(0.2, 1.0*mm); + ratio = electron_mass_c2/mass; isInitialised = true; } diff --git a/source/processes/electromagnetic/muons/src/G4MuPairProductionModel.cc b/source/processes/electromagnetic/muons/src/G4MuPairProductionModel.cc index 4eba3a6a85..cc031f0ffa 100644 --- a/source/processes/electromagnetic/muons/src/G4MuPairProductionModel.cc +++ b/source/processes/electromagnetic/muons/src/G4MuPairProductionModel.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MuPairProductionModel.cc,v 1.17 2004/03/02 17:45:03 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MuPairProductionModel.cc,v 1.19 2004/05/05 18:45:42 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -46,6 +46,8 @@ // 8 integration points in ComputeDMicroscopicCrossSection // 12-01-04 Take min cut of e- and e+ not its sum (V.Ivanchenko) // 10-02-04 Update parameterisation using R.Kokoulin model (V.Ivanchenko) +// 28-04-04 For complex materials repeat calculation of max energy for each +// material (V.Ivanchenko) // // Class Description: @@ -141,7 +143,7 @@ G4bool G4MuPairProductionModel::IsInCharge(const G4ParticleDefinition* p) void G4MuPairProductionModel::Initialise(const G4ParticleDefinition*, const G4DataVector&) -{ +{ if (!samplingTablesAreFilled) MakeSamplingTables(); } @@ -153,10 +155,7 @@ G4double G4MuPairProductionModel::ComputeDEDX(const G4MaterialCutsCouple* couple G4double cutEnergy) { G4double dedx = 0.0; - if (minPairEnergy >= cutEnergy || kineticEnergy <= lowestKinEnergy) return dedx; - - G4double tmax = MaxSecondaryEnergy(particle, kineticEnergy); - G4double cut = std::min(cutEnergy,tmax); + if (cutEnergy <= minPairEnergy || kineticEnergy <= lowestKinEnergy) return dedx; const G4Material* material = couple->GetMaterial(); const G4ElementVector* theElementVector = material->GetElementVector(); @@ -166,7 +165,10 @@ G4double G4MuPairProductionModel::ComputeDEDX(const G4MaterialCutsCouple* couple // loop for elements in the material for (size_t i=0; iGetNumberOfElements(); i++) { G4double Z = (*theElementVector)[i]->GetZ(); - G4double loss = ComputMuPairLoss(Z, kineticEnergy, cut); + SetCurrentElement(Z); + G4double tmax = MaxSecondaryEnergy(particle, kineticEnergy); + G4double cut = std::min(cutEnergy,tmax); + G4double loss = ComputMuPairLoss(Z, kineticEnergy, cut, tmax); dedx += loss*theAtomicNumDensityVector[i]; } if (dedx < 0.) dedx = 0.; @@ -176,15 +178,14 @@ G4double G4MuPairProductionModel::ComputeDEDX(const G4MaterialCutsCouple* couple //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4MuPairProductionModel::ComputMuPairLoss(G4double Z, - G4double tkin, G4double cutEnergy) + G4double tkin, G4double cutEnergy, + G4double tmax) { SetCurrentElement(Z); G4double loss = 0.0; - G4double tmax = MaxSecondaryEnergy(particle, tkin); G4double cut = cutEnergy; - if(tmax <= cutEnergy) cut = tmax; - if(cut <= minPairEnergy) return loss; + if(tmax <= cutEnergy || cut <= minPairEnergy) return loss; // calculate the rectricted loss // numerical integration in log(PairEnergy) @@ -283,7 +284,7 @@ G4double G4MuPairProductionModel::ComputeDMicroscopicCrossSection( G4double a3 = 1. - alf; if (a3 <= 0.) return cross; - // zeta calculation + // zeta calculation G4double bbb,g1,g2; if( Z < 1.5 ) { bbb = bbbh ; g1 = g1h ; g2 = g2h ; } else { bbb = bbbtf; g1 = g1tf; g2 = g2tf; } @@ -367,10 +368,9 @@ G4double G4MuPairProductionModel::CrossSection(const G4MaterialCutsCouple* coupl G4double maxEnergy) { G4double cross = 0.0; - G4double tmax = std::min(maxEnergy, MaxSecondaryEnergy(particle, kineticEnergy)); - G4double cut = std::max(cutEnergy, minPairEnergy); + if (kineticEnergy <= lowestKinEnergy) return cross; - if (cut >= tmax || kineticEnergy <= lowestKinEnergy) return cross; + maxEnergy += particleMass; const G4Material* material = couple->GetMaterial(); const G4ElementVector* theElementVector = material->GetElementVector(); @@ -378,10 +378,15 @@ G4double G4MuPairProductionModel::CrossSection(const G4MaterialCutsCouple* coupl for (size_t i=0; iGetNumberOfElements(); i++) { G4double Z = (*theElementVector)[i]->GetZ(); - G4double cr = ComputeMicroscopicCrossSection(kineticEnergy, Z, cut) - - ComputeMicroscopicCrossSection(kineticEnergy, Z, tmax); + SetCurrentElement(Z); + G4double tmax = std::min(maxEnergy,MaxSecondaryEnergy(particle, kineticEnergy)); + G4double cut = std::max(minPairEnergy,cutEnergy); + if(cut < tmax) { + G4double cr = ComputeMicroscopicCrossSection(kineticEnergy, Z, cut) + - ComputeMicroscopicCrossSection(kineticEnergy, Z, tmax); - cross += theAtomNumDensityVector[i] * cr; + cross += theAtomNumDensityVector[i] * cr; + } } return cross; } @@ -461,26 +466,26 @@ std::vector* G4MuPairProductionModel::SampleSecondaries( if(it == ntdat) it--; G4double dt = log(kineticEnergy/tdat[it-1])/log(tdat[it]/tdat[it-1]); + // select randomly one element constituing the material + G4int iymin = 0; + G4int iymax = nbiny-1; + const G4Element* anElement = SelectRandomAtom(kineticEnergy, dt, it, couple); + SetCurrentElement(anElement->GetZ()); + G4double maxPairEnergy = MaxSecondaryEnergy(particle,kineticEnergy); G4double maxEnergy = std::min(tmax, maxPairEnergy); G4double minEnergy = std::min(maxEnergy, cut); - G4int iymin = 0; - G4int iymax = nbiny; if( minEnergy > minPairEnergy) { G4double xc = log(minEnergy/minPairEnergy)/log(maxPairEnergy/minPairEnergy); iymin = (G4int)((log(xc) - ymin)/dy); + if(iymin >= nbiny) iymin = nbiny-1; xc = log(maxEnergy/minPairEnergy)/log(maxPairEnergy/minPairEnergy); iymax = (G4int)((log(xc) - ymin)/dy) + 1; - if(iymax > nbiny) iymax = nbiny; + if(iymax >= nbiny) iymax = nbiny-1; } - // select randomly one element constituing the material - const G4Element* anElement = SelectRandomAtom(dt, it, iymin, couple); - SetCurrentElement(anElement->GetZ()); - - // sample e-e+ energy, pair energy first G4int iz, iy; @@ -509,14 +514,14 @@ std::vector* G4MuPairProductionModel::SampleSecondaries( if(PairEnergy > maxEnergy) PairEnergy = maxEnergy; // sample r=(E+-E-)/PairEnergy ( uniformly .....) - G4double rmax = (1.-6.*particleMass*particleMass/(totalEnergy* - (totalEnergy-PairEnergy))) + G4double rmax = + (1.-6.*particleMass*particleMass/(totalEnergy*(totalEnergy-PairEnergy))) *sqrt(1.-minPairEnergy/PairEnergy); G4double r = rmax * (-1.+2.*G4UniformRand()) ; // compute energies from PairEnergy,r - G4double ElectronEnergy=(1.-r)*PairEnergy/2. ; - G4double PositronEnergy=(1.+r)*PairEnergy/2. ; + G4double ElectronEnergy = (1.-r)*PairEnergy*0.5; + G4double PositronEnergy = PairEnergy - ElectronEnergy; // angles of the emitted particles ( Z - axis along the parent particle) // (mean theta for the moment) @@ -558,7 +563,8 @@ std::vector* G4MuPairProductionModel::SampleSecondaries( //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -const G4Element* G4MuPairProductionModel::SelectRandomAtom(G4double dt, G4int it, G4int iy, +const G4Element* G4MuPairProductionModel::SelectRandomAtom( + G4double kinEnergy, G4double dt, G4int it, const G4MaterialCutsCouple* couple) { // select randomly 1 element within the material @@ -580,11 +586,18 @@ const G4Element* G4MuPairProductionModel::SelectRandomAtom(G4double dt, G4int it size_t i; for (i=0; iGetZ(); + SetCurrentElement(Z); + G4double maxPairEnergy = MaxSecondaryEnergy(particle,kinEnergy); + G4int iz; for(iz=1; iz= nbiny) iy = nbiny-1; + G4double sigtot = InterpolatedIntegralCrossSection(dt, dz, iz, it, nbiny, Z); G4double sigcut = InterpolatedIntegralCrossSection(dt, dz, iz, it, iy, Z); sum += (sigtot - sigcut)*theAtomNumDensityVector[i]; diff --git a/source/processes/electromagnetic/standard/GNUmakefile b/source/processes/electromagnetic/standard/GNUmakefile index 9765050145..2a51d63781 100644 --- a/source/processes/electromagnetic/standard/GNUmakefile +++ b/source/processes/electromagnetic/standard/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.6 2003/10/03 15:39:18 gcosmo Exp $ +# $Id: GNUmakefile,v 1.7 2004/04/02 09:03:51 grichine Exp $ # -------------------------------------------------------------------- # GNUmakefile for electromagnetic sub-library. John Allison, 25/6/98. # -------------------------------------------------------------------- @@ -14,6 +14,7 @@ include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ + -I$(G4BASE)/global/HEPNumerics/include \ -I$(G4BASE)/geometry/management/include \ -I$(G4BASE)/geometry/volumes/include \ -I$(G4BASE)/geometry/navigation/include \ diff --git a/source/processes/electromagnetic/standard/History b/source/processes/electromagnetic/standard/History index 23c48671c7..dc38e663d3 100644 --- a/source/processes/electromagnetic/standard/History +++ b/source/processes/electromagnetic/standard/History @@ -1,4 +1,4 @@ -$Id: History,v 1.112 2004/03/15 12:18:42 maire Exp $ +$Id: History,v 1.117 2004/06/07 13:51:57 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -16,6 +16,25 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +07 Jun 04: G.Cosmo (stand-V06-01-03) +- G4PAIxSection.cc: fix in constructor for compilation error in VC++ 6.0 +- Moved usage of statics in inline functions to non-inline to allow + porting for DLLs on Windows. Modified files: + G4PAIonisation[.icc.cc], G4SynchrotronRadiation[.hh.cc]. + +27 May 04: V.Ivant (stand-V06-01-02) +- Set integral regime to be default for G4ionIonisation and G4hIonisation +- Exclude G4PAIwithPhotons and G4InitXscPAI classes previously included + by mistake but still under development ... + +27 May 04: V.Ivant (stand-V06-01-01) +- (V.Grichine) Updated and optimise PAI model +- (L.Urban) Minor fix in G4eBremsstrahlung - units properly used + +04 May 04: V.Ivant (stand-V06-01-00) +- (V.Grichine) Updated PAI model - use precise integrator, + add photon emission, add G4PAIwithPhotons and G4PAIxSection classes 15 Mar 04: mma (stand-V06-00-04) diff --git a/source/processes/electromagnetic/standard/include/G4AnnihiToMuPair.hh b/source/processes/electromagnetic/standard/include/G4AnnihiToMuPair.hh index ffd0bc2fc9..6be6c06901 100644 --- a/source/processes/electromagnetic/standard/include/G4AnnihiToMuPair.hh +++ b/source/processes/electromagnetic/standard/include/G4AnnihiToMuPair.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4AnnihiToMuPair.hh,v 1.3 2004/03/10 16:48:44 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4AnnihiToMuPair.hh,v 1.5 2004/05/07 16:52:42 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------ G4AnnihiToMuPair physics process ------ // by H.Burkhardt, S. Kelner and R. Kokoulin, November 2002 diff --git a/source/processes/electromagnetic/standard/include/G4GammaConversionToMuons.hh b/source/processes/electromagnetic/standard/include/G4GammaConversionToMuons.hh index 6f39a3e3c2..2b861ddfd1 100644 --- a/source/processes/electromagnetic/standard/include/G4GammaConversionToMuons.hh +++ b/source/processes/electromagnetic/standard/include/G4GammaConversionToMuons.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4GammaConversionToMuons.hh,v 1.4 2004/03/10 16:48:45 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4GammaConversionToMuons.hh,v 1.6 2004/05/11 18:22:20 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------ G4GammaConversionToMuons physics process ------ // by H.Burkhardt, S. Kelner and R. Kokoulin, April 2002 diff --git a/source/processes/electromagnetic/standard/include/G4PAIPhotonModel.hh b/source/processes/electromagnetic/standard/include/G4PAIPhotonModel.hh new file mode 100644 index 0000000000..6f9d3a7569 --- /dev/null +++ b/source/processes/electromagnetic/standard/include/G4PAIPhotonModel.hh @@ -0,0 +1,263 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// ------------------------------------------------------------------- +// +// GEANT4 Class header file +// +// +// File name: G4PAIPhotonModel +// +// Author: V. Grichine based on Vladimir Ivanchenko code +// +// Creation date: 05.10.2003 +// +// Modifications: +// +// +// Class Description: +// +// Implementation of PAI model of energy loss and +// delta-electron production by heavy charged particles + +// ------------------------------------------------------------------- +// + +#ifndef G4PAIPhotonModel_h +#define G4PAIPhotonModel_h 1 + +#include +#include "G4VEmModel.hh" +#include "globals.hh" +#include "G4VEmFluctuationModel.hh" + +class G4PhysicsLogVector; +class G4PhysicsTable; +class G4Region; +class G4MaterialCutsCouple; + + +class G4PAIPhotonModel : public G4VEmModel, public G4VEmFluctuationModel +{ + +public: + + G4PAIPhotonModel(const G4ParticleDefinition* p = 0, const G4String& nam = "PAI"); + + ~G4PAIPhotonModel(); + + void Initialise(const G4ParticleDefinition*, const G4DataVector&); + + + void InitialiseMe(const G4ParticleDefinition*) {}; + + G4double HighEnergyLimit(const G4ParticleDefinition* p); + + G4double LowEnergyLimit(const G4ParticleDefinition* p); + + void SetHighEnergyLimit(G4double e) {fHighKinEnergy = e;}; + + void SetLowEnergyLimit(G4double e) {fLowKinEnergy = e;}; + + G4double MinEnergyCut(const G4ParticleDefinition*, + const G4MaterialCutsCouple*); + + G4bool IsInCharge(const G4ParticleDefinition*); + + G4double ComputeDEDX(const G4MaterialCutsCouple*, + const G4ParticleDefinition*, + G4double kineticEnergy, + G4double cutEnergy); + + G4double CrossSection(const G4MaterialCutsCouple*, + const G4ParticleDefinition*, + G4double kineticEnergy, + G4double cutEnergy, + G4double maxEnergy); + + G4DynamicParticle* SampleSecondary( + const G4MaterialCutsCouple*, + const G4DynamicParticle*, + G4double tmin, + G4double maxEnergy); + + std::vector* SampleSecondaries( + const G4MaterialCutsCouple*, + const G4DynamicParticle*, + G4double tmin, + G4double maxEnergy); + + G4double MaxSecondaryEnergy(const G4DynamicParticle*); + + G4double SampleFluctuations(const G4Material*, + const G4DynamicParticle*, + G4double&, + G4double&, + G4double&); + + G4double Dispersion( const G4Material*, + const G4DynamicParticle*, + G4double&, + G4double&); + + void DefineForRegion(const G4Region* r) ; + void ComputeSandiaPhotoAbsCof(); + void BuildPAIonisationTable(); + void BuildLambdaVector(const G4MaterialCutsCouple* matCutsCouple); + + G4double GetdNdxCut( G4int iPlace, G4double transferCut); + G4double GetdNdxPhotonCut( G4int iPlace, G4double transferCut); + G4double GetdNdxPlasmonCut( G4int iPlace, G4double transferCut); + + G4double GetdEdxCut( G4int iPlace, G4double transferCut); + + G4double GetPostStepTransfer(G4PhysicsTable*, G4PhysicsLogVector*, + G4int iPlace, G4double scaledTkin ); + G4double GetAlongStepTransfer(G4PhysicsTable*, G4PhysicsLogVector*, + G4int iPlace, G4double scaledTkin, G4double cof ); + G4double GetEnergyTransfer(G4PhysicsTable*, G4int iPlace, + G4double position, G4int iTransfer ); + + + +protected: + + G4double MaxSecondaryEnergy(const G4ParticleDefinition*, + G4double kinEnergy); + +private: + + void SetParticle(const G4ParticleDefinition* p); + + // hide assignment operator + G4PAIPhotonModel & operator=(const G4PAIPhotonModel &right); + G4PAIPhotonModel(const G4PAIPhotonModel&); + + // The vector over proton kinetic energies: the range of gammas + + G4double fLowestKineticEnergy; + G4double fHighestKineticEnergy; + G4int fTotBin; + G4int fMeanNumber; + G4PhysicsLogVector* fProtonEnergyVector ; + + + + // vectors + + G4PhysicsTable* fPAItransferTable; + std::vector fPAIxscBank; + + G4PhysicsTable* fPAIphotonTable; + std::vector fPAIphotonBank; + + G4PhysicsTable* fPAIplasmonTable; + std::vector fPAIplasmonBank; + + G4PhysicsTable* fPAIdEdxTable; + std::vector fPAIdEdxBank; + + std::vector fMaterialCutsCoupleVector; + std::vector fPAIRegionVector; + + size_t fMatIndex ; + G4double** fSandiaPhotoAbsCof ; + G4int fSandiaIntervalNumber ; + + G4PhysicsLogVector* fdEdxVector ; + std::vector fdEdxTable ; + + G4PhysicsLogVector* fLambdaVector ; + std::vector fLambdaTable ; + + G4PhysicsLogVector* fdNdxCutVector ; + std::vector fdNdxCutTable ; + + G4PhysicsLogVector* fdNdxCutPhotonVector ; + std::vector fdNdxCutPhotonTable ; + + G4PhysicsLogVector* fdNdxCutPlasmonVector ; + std::vector fdNdxCutPlasmonTable ; + + + + + const G4ParticleDefinition* fParticle; + + G4double fMass; + G4double fSpin; + G4double fChargeSquare; + G4double fRatio; + G4double fHighKinEnergy; + G4double fLowKinEnergy; + G4double fTwoln10; + G4double fBg2lim; + G4double fTaulim; + G4double fQc; +}; + +///////////////////////////////////////////////////////////////////// + +inline G4double G4PAIPhotonModel::MaxSecondaryEnergy( const G4ParticleDefinition*, + G4double kinEnergy) +{ + + G4double gamma= kinEnergy/fMass + 1.0; + G4double tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) / + (1. + 2.0*gamma*fRatio + fRatio*fRatio); + + return tmax; +} + +///////////////////////////////////////////////////////////////////////// + +inline G4double G4PAIPhotonModel::MaxSecondaryEnergy(const G4DynamicParticle* dp) +{ + + G4double kineticEnergy = dp->GetKineticEnergy(); + G4double gamma= kineticEnergy/fMass + 1.0; + G4double tmax = 2.0*electron_mass_c2*(gamma*gamma - 1.) / + (1. + 2.0*gamma*fRatio + fRatio*fRatio); + + return tmax; +} + +/////////////////////////////////////////////////////////////// + +inline void G4PAIPhotonModel::DefineForRegion(const G4Region* r) +{ + // G4Region* rPAI = r; + // fPAIRegionVector.push_back(rPAI); + fPAIRegionVector.push_back(r); +} + + + +#endif + + + + + + + diff --git a/source/processes/electromagnetic/standard/include/G4PAIonisation.icc b/source/processes/electromagnetic/standard/include/G4PAIonisation.icc index 20d28a2f98..b6e125c6ee 100644 --- a/source/processes/electromagnetic/standard/include/G4PAIonisation.icc +++ b/source/processes/electromagnetic/standard/include/G4PAIonisation.icc @@ -83,166 +83,6 @@ G4PAIonisation::GetContinuousStepLimit( const G4Track& track , return Step ; } -///////////////////////////////////////////////////////////////////////// -// -// - -inline G4double G4PAIonisation:: -GetMeanFreePath( const G4Track& trackData, - G4double, - G4ForceCondition* condition ) -{ -// G4cout<<"G4PAIonisation::GetMeanFreePath is called"<GetIndex() != fMatIndex ) meanFreePath = DBL_MAX ; - else - { - const G4DynamicParticle* aParticle = trackData.GetDynamicParticle() ; - kinE = aParticle->GetKineticEnergy() ; - mass = aParticle->GetDefinition()->GetPDGMass() ; - gamma = 1.0 + kinE/mass ; - - if(gamma < 1.2) return meanFreePath = DBL_MAX ; - - charge = aParticle->GetDefinition()->GetPDGCharge() ; - charge2 = charge*charge ; - massRatio = proton_mass_c2/mass ; - scaledE = kinE*massRatio ; - - for(iTkin=0;iTkinGetLowEdgeEnergy(iTkin)) // <= ? - if(scaledE < fProtonEnergyVector->GetLowEdgeEnergy(iTkin)) // <= ? - { - break ; - } - } - iPlace = iTkin - 1 ; - - if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left - { - meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace))(0)/charge2 ; - } - else - { - if(iTkin == 0) // Tkin is too small, trying from right only - { - meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace+1))(0)/charge2 ; - } - else - { - E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; - E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; - W = 1.0/(E2 - E1) ; - W1 = (E2 - scaledE)*W ; - W2 = (scaledE - E1)*W ; - primaryIon = (*(*fPAItransferBank)(iPlace ))(0)*W1 + - (*(*fPAItransferBank)(iPlace+1))(0)*W2 ; - meanFreePath = 1.0/primaryIon/charge2 ; - } - } - // meanFreePath = DBL_MAX ; - } - return meanFreePath ; -} - -///////////////////////////////////////////////////////////////////////// -// -// - -inline G4double G4PAIonisation:: -GetFreePath( G4double scaledTkin, G4double charge2 ) -{ -// G4cout<<"G4PAIonisation::GetFreePath is called"<GetLowEdgeEnergy(iTkin)) break ; - } - iPlace = iTkin - 1 ; - - if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left - { - meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace))(0)/charge2 ; - } - else - { - if(iTkin == 0) // Tkin is too small, trying from right only - { - meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace+1))(0)/charge2 ; - } - else - { - E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; - E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; - W = 1.0/(E2 - E1) ; - W1 = (E2 - scaledTkin)*W ; - W2 = (scaledTkin - E1)*W ; - primaryIon = (*(*fPAItransferBank)(iPlace ))(0)*W1 + - (*(*fPAItransferBank)(iPlace+1))(0)*W2 ; - meanFreePath = 1.0/primaryIon/charge2 ; - } - } - // meanFreePath = DBL_MAX ; - - return meanFreePath ; -} - -///////////////////////////////////////////////////////////////////////// -// -// - -inline G4double G4PAIonisation:: -GetdEdx( G4double scaledTkin, G4double charge2 ) -{ -// G4cout<<"G4PAIonisation::GetdEdx is called"<GetLowEdgeEnergy(iTkin)) break ; - } - iPlace = iTkin - 1 ; - - if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left - { - dEdx = (*(*theLossTable)(iPlace))(0)*charge2 ; - } - else - { - if(iTkin == 0) // Tkin is too small, trying from right only - { - dEdx = (*(*theLossTable)(iPlace+1))(0)*charge2 ; - } - else - { - E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; - E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; - W = 1.0/(E2 - E1) ; - W1 = (E2 - scaledTkin)*W ; - W2 = (scaledTkin - E1)*W ; - dEdx = (*(*theLossTable)(iPlace))(0)*W1 + (*(*theLossTable)(iPlace+1))(0)*W2; - dEdx *= charge2 ; - } - } - return dEdx ; -} - ////////////////////////////////////////////////////////////////////// // // diff --git a/source/processes/electromagnetic/standard/include/G4PAIxSection.hh b/source/processes/electromagnetic/standard/include/G4PAIxSection.hh index aa04c4cd9c..7757d5414e 100644 --- a/source/processes/electromagnetic/standard/include/G4PAIxSection.hh +++ b/source/processes/electromagnetic/standard/include/G4PAIxSection.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PAIxSection.hh,v 1.10 2003/10/19 15:21:22 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PAIxSection.hh,v 1.11 2004/04/02 10:51:12 grichine Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // G4PAIxSection.hh -- header file @@ -59,20 +59,25 @@ #include"G4SandiaTable.hh" +class G4MaterialCutsCouple; +class G4Sandiatable; + + class G4PAIxSection { public: // Constructors + G4PAIxSection( G4MaterialCutsCouple* matCC); - G4PAIxSection( G4int materialIndex, + G4PAIxSection( G4int materialIndex, G4double maxEnergyTransfer ) ; - G4PAIxSection( G4int materialIndex, // for proton loss table + G4PAIxSection( G4int materialIndex, // for proton loss table G4double maxEnergyTransfer, G4double betaGammaSq , G4double** photoAbsCof, G4int intNumber ) ; - G4PAIxSection( G4int materialIndex, // test constructor + G4PAIxSection( G4int materialIndex, // test constructor G4double maxEnergyTransfer, G4double betaGammaSq ) ; @@ -188,6 +193,7 @@ const G4int fRefGammaNumber ; // The number of gamma for creation of spline (15 G4int fIntervalNumber ; // The number of energy intervals G4double fNormalizationCof ; // Normalization cof for PhotoAbsorptionXsection + // G4double fBetaGammaSq ; // (beta*gamma)^2 G4double fDensity ; // Current density @@ -196,6 +202,9 @@ G4int fSplineNumber ; // Current size of spline // Arrays of Sandia coefficients + G4OrderedTable* fMatSandiaMatrix; + G4SandiaTable* fSandia; + G4double* fEnergyInterval ; G4double* fA1 ; G4double* fA2 ; @@ -204,6 +213,7 @@ G4double* fA4 ; static const G4int fMaxSplineSize ; // Max size of output splain arrays = 500 + /* ****************** G4double* fSplineEnergy ; // energy points of splain G4double* fRePartDielectricConst ; // Real part of dielectric const @@ -212,6 +222,8 @@ G4double* fIntegralTerm ; // Integral term in PAI cross section G4double* fDifPAIxSection ; // Differential PAI cross section G4double* fIntegralPAIxSection ; // Integral PAI cross section ? */ /////////////// + + G4double fSplineEnergy[500] ; // energy points of splain G4double fRePartDielectricConst[500] ; // Real part of dielectric const G4double fImPartDielectricConst[500] ; // Imaginary part of dielectric const diff --git a/source/processes/electromagnetic/standard/include/G4SynchrotronRadiation.hh b/source/processes/electromagnetic/standard/include/G4SynchrotronRadiation.hh index 9c9b39ac23..01810b98fd 100644 --- a/source/processes/electromagnetic/standard/include/G4SynchrotronRadiation.hh +++ b/source/processes/electromagnetic/standard/include/G4SynchrotronRadiation.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SynchrotronRadiation.hh,v 1.9 2004/03/10 16:48:45 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4SynchrotronRadiation.hh,v 1.10 2004/06/07 13:49:51 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------ // GEANT 4 class header file @@ -91,9 +91,8 @@ class G4SynchrotronRadiation : public G4VDiscreteProcess G4bool IsApplicable(const G4ParticleDefinition&); - static G4double GetLambdaConst() { return fLambdaConst ; } ; - - static G4double GetEnergyConst() { return fEnergyConst ; } ; + static G4double GetLambdaConst(); + static G4double GetEnergyConst(); protected: @@ -133,85 +132,6 @@ class G4SynchrotronRadiation : public G4VDiscreteProcess }; ////////////////////////// INLINE METHODS ///////////////////////////// -// -// gives the MeanFreePath in GEANT4 internal units -// - -inline G4double -G4SynchrotronRadiation::GetMeanFreePath( const G4Track& trackData, - G4double, - G4ForceCondition* condition) -{ - const G4DynamicParticle* aDynamicParticle; - G4Material* aMaterial; - G4double MeanFreePath; - //G4bool isOutRange ; - - *condition = NotForced ; - - aDynamicParticle = trackData.GetDynamicParticle(); - aMaterial = trackData.GetMaterial(); - - G4double gamma = aDynamicParticle->GetTotalEnergy()/ - (aDynamicParticle->GetMass() ) ; - - G4double KineticEnergy = aDynamicParticle->GetKineticEnergy(); - - if (KineticEnergy < LowestKineticEnergy || gamma<1.0e3) - { - MeanFreePath = DBL_MAX ; - } - else - { - G4TransportationManager* transportMgr; - G4FieldManager* globalFieldMgr; - - transportMgr = G4TransportationManager::GetTransportationManager() ; - - globalFieldMgr = transportMgr->GetFieldManager() ; - - G4bool FieldExists = globalFieldMgr->DoesFieldExist() ; - G4ThreeVector FieldValue; - const G4Field* pField = 0 ; - if (FieldExists) - { - pField = globalFieldMgr->GetDetectorField() ; - G4ThreeVector globPosition = trackData.GetPosition() ; - G4double globPosVec[3], FieldValueVec[3] ; - globPosVec[0] = globPosition.x() ; - globPosVec[1] = globPosition.y() ; - globPosVec[2] = globPosition.z() ; - - pField->GetFieldValue( globPosVec, FieldValueVec ) ; - FieldValue = G4ThreeVector( FieldValueVec[0], - FieldValueVec[1], - FieldValueVec[2] ) ; - - - - G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); - G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum) ; - G4double perpB = unitMcrossB.mag() ; - G4double beta = aDynamicParticle->GetTotalMomentum()/ - (aDynamicParticle->GetTotalEnergy() ) ; - if(perpB > 0.0) - { - MeanFreePath = fLambdaConst*beta/perpB ; - } - else - { - MeanFreePath = DBL_MAX ; - } - } - else - { - MeanFreePath = DBL_MAX ; - } - } - return MeanFreePath; -} - - inline G4bool G4SynchrotronRadiation::IsApplicable( const G4ParticleDefinition& particle ) diff --git a/source/processes/electromagnetic/standard/include/G4eBremsstrahlung.hh b/source/processes/electromagnetic/standard/include/G4eBremsstrahlung.hh index 20f1637109..6151b6ca35 100644 --- a/source/processes/electromagnetic/standard/include/G4eBremsstrahlung.hh +++ b/source/processes/electromagnetic/standard/include/G4eBremsstrahlung.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4eBremsstrahlung.hh,v 1.21 2004/01/21 18:05:22 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4eBremsstrahlung.hh,v 1.23 2004/05/07 16:52:42 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // diff --git a/source/processes/electromagnetic/standard/include/G4ionIonisation.hh b/source/processes/electromagnetic/standard/include/G4ionIonisation.hh index ab8884f85e..87d7c74e23 100644 --- a/source/processes/electromagnetic/standard/include/G4ionIonisation.hh +++ b/source/processes/electromagnetic/standard/include/G4ionIonisation.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4ionIonisation.hh,v 1.23 2004/01/21 18:05:22 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4ionIonisation.hh,v 1.24 2004/05/10 18:46:48 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -168,8 +168,7 @@ inline G4double G4ionIonisation::MaxSecondaryEnergy(const G4DynamicParticle* dyn inline G4double G4ionIonisation::GetMeanFreePath(const G4Track& track, - G4double step, - G4ForceCondition* cond) + G4double, G4ForceCondition*) { G4double mRatio = proton_mass_c2/track.GetDynamicParticle()->GetMass(); G4double q_2 = EffectiveChargeSquare(track); @@ -178,7 +177,7 @@ inline G4double G4ionIonisation::GetMeanFreePath(const G4Track& track, SetChargeSquare(q_2); SetChargeSquareRatio(q_2); - return G4VEnergyLossProcess::GetMeanFreePath(track, step, cond); + return G4VEnergyLossProcess::GetMeanFreePath(track, 0.0, 0); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/standard/src/G4PAIPhotonModel.cc b/source/processes/electromagnetic/standard/src/G4PAIPhotonModel.cc new file mode 100644 index 0000000000..b121872a9f --- /dev/null +++ b/source/processes/electromagnetic/standard/src/G4PAIPhotonModel.cc @@ -0,0 +1,1195 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// File name: G4PAIPhotonModel.cc +// +// Author: Vladimir.Grichine@cern.ch on base of Vladimir Ivanchenko code +// +// Creation date: 05.10.2003 +// +// Modifications: +// + +#include "G4Region.hh" +#include "G4PhysicsLogVector.hh" +#include "G4PhysicsFreeVector.hh" +#include "G4PhysicsTable.hh" +#include "G4ProductionCutsTable.hh" +#include "G4MaterialCutsCouple.hh" +#include "G4MaterialTable.hh" +#include "G4SandiaTable.hh" +#include "G4PAIxSection.hh" + +#include "G4PAIPhotonModel.hh" +#include "Randomize.hh" +#include "G4Electron.hh" +#include "G4Gamma.hh" +#include "G4Poisson.hh" +#include "G4Step.hh" +#include "G4Material.hh" +#include "G4DynamicParticle.hh" +#include "G4ParticleDefinition.hh" + + +//////////////////////////////////////////////////////////////////////// + +G4PAIPhotonModel::G4PAIPhotonModel(const G4ParticleDefinition* p, const G4String& nam) + : G4VEmModel(nam),G4VEmFluctuationModel(nam), + fLowestKineticEnergy(10.0*keV), + fHighestKineticEnergy(100.*TeV), + fTotBin(200), + fMeanNumber(20), + fParticle(0), + fHighKinEnergy(100.*TeV), + fLowKinEnergy(2.0*MeV), + fTwoln10(2.0*log(10.0)), + fBg2lim(0.0169), + fTaulim(8.4146e-3) +{ + if(p) SetParticle(p); + fProtonEnergyVector = new G4PhysicsLogVector(fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin); + fPAItransferTable = 0; + fPAIphotonTable = 0; + fPAIplasmonTable = 0; + + fPAIdEdxTable = 0; + fSandiaPhotoAbsCof = 0; + fdEdxVector = 0; + + fLambdaVector = 0; + fdNdxCutVector = 0; + fdNdxCutPhotonVector = 0; + fdNdxCutPlasmonVector = 0; +} + +//////////////////////////////////////////////////////////////////////////// + +G4PAIPhotonModel::~G4PAIPhotonModel() +{ + if(fProtonEnergyVector) delete fProtonEnergyVector; + if(fdEdxVector) delete fdEdxVector ; + if ( fLambdaVector) delete fLambdaVector; + if ( fdNdxCutVector) delete fdNdxCutVector; + + if( fPAItransferTable ) + { + fPAItransferTable->clearAndDestroy(); + delete fPAItransferTable ; + } + if( fPAIphotonTable ) + { + fPAIphotonTable->clearAndDestroy(); + delete fPAIphotonTable ; + } + if( fPAIplasmonTable ) + { + fPAIplasmonTable->clearAndDestroy(); + delete fPAIplasmonTable ; + } + if(fSandiaPhotoAbsCof) + { + for(G4int i=0;iGetPDGMass(); + fSpin = fParticle->GetPDGSpin(); + G4double q = fParticle->GetPDGCharge()/eplus; + fChargeSquare = q*q; + fLowKinEnergy *= fMass/proton_mass_c2; + fRatio = electron_mass_c2/fMass; + fQc = fMass/fRatio; +} + +////////////////////////////////////////////////////////////////////////////// + +G4double G4PAIPhotonModel::HighEnergyLimit(const G4ParticleDefinition* p) +{ + if(!fParticle) SetParticle(p); + return fHighKinEnergy; +} + +/////////////////////////////////////////////////////////////////////////// + +G4double G4PAIPhotonModel::LowEnergyLimit( const G4ParticleDefinition* p ) +{ + if(!fParticle) SetParticle(p); + return fLowKinEnergy; +} + +//////////////////////////////////////////////////////////////////////////// + +G4double G4PAIPhotonModel::MinEnergyCut( const G4ParticleDefinition*, + const G4MaterialCutsCouple*) +{ + // return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy(); + return 0.0; // any positive cut +} + +//////////////////////////////////////////////////////////////////////////// + +G4bool G4PAIPhotonModel::IsInCharge( const G4ParticleDefinition* p ) +{ + if(!fParticle) SetParticle(p); + return (p->GetPDGCharge() != 0.0 ); +} + +//////////////////////////////////////////////////////////////////////////// + +void G4PAIPhotonModel::Initialise(const G4ParticleDefinition* p, + const G4DataVector&) +{ + if(!fParticle) SetParticle(p); + + const G4ProductionCutsTable* theCoupleTable = + G4ProductionCutsTable::GetProductionCutsTable(); + + for(size_t iReg = 0; iReg < fPAIRegionVector.size();++iReg) // region loop + { + const G4Region* curReg = fPAIRegionVector[iReg]; + + // (*fPAIRegionVector[iRegion]) + + std::vector::const_iterator matIter = curReg->GetMaterialIterator(); + size_t jMat; + size_t numOfMat = curReg->GetNumberOfMaterials(); + + // for(size_t jMat = 0; jMat < curReg->GetNumberOfMaterials();++jMat){} + const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); + size_t numberOfMat = G4Material::GetNumberOfMaterials(); + + for(jMat = 0 ; jMat < numOfMat; ++jMat) // region material loop + { + const G4MaterialCutsCouple* matCouple = theCoupleTable-> + GetMaterialCutsCouple( *matIter, curReg->GetProductionCuts() ); + fMaterialCutsCoupleVector.push_back(matCouple); + + size_t iMatGlob; + for(iMatGlob = 0 ; iMatGlob < numberOfMat ; iMatGlob++ ) + { + if( *matIter == (*theMaterialTable)[iMatGlob]) break ; + } + fMatIndex = iMatGlob; + + ComputeSandiaPhotoAbsCof(); + BuildPAIonisationTable(); + + fPAIxscBank.push_back(fPAItransferTable); + fPAIphotonBank.push_back(fPAIphotonTable); + fPAIplasmonBank.push_back(fPAIplasmonTable); + fPAIdEdxBank.push_back(fPAIdEdxTable); + fdEdxTable.push_back(fdEdxVector); + + BuildLambdaVector(matCouple); + + fdNdxCutTable.push_back(fdNdxCutVector); + fdNdxCutPhotonTable.push_back(fdNdxCutPhotonVector); + fdNdxCutPlasmonTable.push_back(fdNdxCutPlasmonVector); + fLambdaTable.push_back(fLambdaVector); + + + matIter++; + } + } +} + +////////////////////////////////////////////////////////////////// + +void G4PAIPhotonModel::ComputeSandiaPhotoAbsCof() +{ + G4int i, j, numberOfElements ; + static const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); + + G4SandiaTable thisMaterialSandiaTable(fMatIndex) ; + numberOfElements = (*theMaterialTable)[fMatIndex]-> + GetNumberOfElements(); + G4int* thisMaterialZ = new G4int[numberOfElements] ; + + for(i=0;iGetElement(i)->GetZ() ; + } + fSandiaIntervalNumber = thisMaterialSandiaTable.SandiaIntervals + (thisMaterialZ,numberOfElements) ; + + fSandiaIntervalNumber = thisMaterialSandiaTable.SandiaMixing + ( thisMaterialZ , + (*theMaterialTable)[fMatIndex]->GetFractionVector() , + numberOfElements,fSandiaIntervalNumber) ; + + fSandiaPhotoAbsCof = new G4double*[fSandiaIntervalNumber] ; + + for(i=0;iGetDensity() ; + } + } + // delete[] thisMaterialZ ; +} + +//////////////////////////////////////////////////////////////////////////// +// +// Build tables for the ionization energy loss +// the tables are built for MATERIALS +// ********* + +void +G4PAIPhotonModel::BuildPAIonisationTable() +{ + G4double LowEdgeEnergy , ionloss ; + G4double massRatio, tau, Tmax, Tmin, Tkin, deltaLow, gamma, bg2 ; + /* + if( fPAItransferTable ) + { + fPAItransferTable->clearAndDestroy() ; + delete fPAItransferTable ; + } + */ + fPAItransferTable = new G4PhysicsTable(fTotBin); + /* + if( fPAIratioTable ) + { + fPAIratioTable->clearAndDestroy() ; + delete fPAIratioTable ; + } + */ + fPAIphotonTable = new G4PhysicsTable(fTotBin); + fPAIplasmonTable = new G4PhysicsTable(fTotBin); + /* + if( fPAIdEdxTable ) + { + fPAIdEdxTable->clearAndDestroy() ; + delete fPAIdEdxTable ; + } + */ + fPAIdEdxTable = new G4PhysicsTable(fTotBin); + + // if(fdEdxVector) delete fdEdxVector ; + fdEdxVector = new G4PhysicsLogVector( fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin ) ; + Tmin = fSandiaPhotoAbsCof[0][0] ; // low energy Sandia interval + deltaLow = 0.5*eV ; + + for (G4int i = 0 ; i < fTotBin ; i++) //The loop for the kinetic energy + { + LowEdgeEnergy = fProtonEnergyVector->GetLowEdgeEnergy(i) ; + tau = LowEdgeEnergy/proton_mass_c2 ; + // if(tau < 0.01) tau = 0.01 ; + gamma = tau +1. ; + // G4cout<<"gamma = "< Tmax) // was < + { + Tkin = Tmax ; + } + if ( Tkin < Tmin + deltaLow ) // low energy safety + { + Tkin = Tmin + deltaLow ; + } + G4PAIxSection protonPAI( fMatIndex, + Tkin, + bg2, + fSandiaPhotoAbsCof, + fSandiaIntervalNumber ) ; + + + // G4cout<<"ionloss = "<GetTableSize(); + size_t jMatCC; + + for (jMatCC = 0 ; jMatCC < numOfCouples ; jMatCC++ ) + { + if( matCutsCouple == theCoupleTable->GetMaterialCutsCouple(jMatCC) ) break; + } + if( jMatCC == numOfCouples && jMatCC > 0 ) jMatCC--; + + const std::vector* deltaCutInKineticEnergy = theCoupleTable-> + GetEnergyCutsVector(idxG4ElectronCut); + const std::vector* photonCutInKineticEnergy = theCoupleTable-> + GetEnergyCutsVector(idxG4GammaCut); + + if (fLambdaVector) delete fLambdaVector; + if (fdNdxCutVector) delete fdNdxCutVector; + if (fdNdxCutPhotonVector) delete fdNdxCutPhotonVector; + if (fdNdxCutPlasmonVector) delete fdNdxCutPlasmonVector; + + fLambdaVector = new G4PhysicsLogVector( fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin ); + fdNdxCutVector = new G4PhysicsLogVector( fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin ); + fdNdxCutPhotonVector = new G4PhysicsLogVector( fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin ); + fdNdxCutPlasmonVector = new G4PhysicsLogVector( fLowestKineticEnergy, + fHighestKineticEnergy, + fTotBin ); + + G4double deltaCutInKineticEnergyNow = (*deltaCutInKineticEnergy)[jMatCC]; + G4double photonCutInKineticEnergyNow = (*photonCutInKineticEnergy)[jMatCC]; + + G4cout<<"PAIPhotonModel deltaCutInKineticEnergyNow = " + <PutValue(i, lambda); + + fdNdxCutVector->PutValue(i, dNdxCut); + fdNdxCutPhotonVector->PutValue(i, dNdxPhotonCut); + fdNdxCutPlasmonVector->PutValue(i, dNdxPlasmonCut); + } +} + +/////////////////////////////////////////////////////////////////////// +// +// Returns integral PAI cross section for energy transfers >= transferCut + +G4double +G4PAIPhotonModel::GetdNdxCut( G4int iPlace, G4double transferCut) +{ + G4int iTransfer; + G4double x1, x2, y1, y2, dNdxCut; + // G4cout<<"iPlace = "<= transferCut + +G4double +G4PAIPhotonModel::GetdNdxPhotonCut( G4int iPlace, G4double transferCut) +{ + G4int iTransfer; + G4double x1, x2, y1, y2, dNdxCut; + // G4cout<<"iPlace = "<= transferCut + +G4double +G4PAIPhotonModel::GetdNdxPlasmonCut( G4int iPlace, G4double transferCut) +{ + G4int iTransfer; + G4double x1, x2, y1, y2, dNdxCut; + + // G4cout<<"iPlace = "<= transferCut + +G4double +G4PAIPhotonModel::GetdEdxCut( G4int iPlace, G4double transferCut) +{ + G4int iTransfer; + G4double x1, x2, y1, y2, dEdxCut; + // G4cout<<"iPlace = "<GetPDGMass()/proton_mass_c2; + G4double charge = p->GetPDGCharge(); + G4double charge2 = charge*charge, dEdx; + + for( jMat = 0 ;jMat < fMaterialCutsCoupleVector.size() ; ++jMat ) + { + if( matCC == fMaterialCutsCoupleVector[jMat] ) break; + } + if(jMat == fMaterialCutsCoupleVector.size() && jMat > 0) jMat--; + + fPAIdEdxTable = fPAIdEdxBank[jMat]; + fdEdxVector = fdEdxTable[jMat]; + for(iTkin = 0 ; iTkin < fTotBin ; iTkin++) + { + if(scaledTkin < fProtonEnergyVector->GetLowEdgeEnergy(iTkin)) break ; + } + iPlace = iTkin - 1; + if(iPlace < 0) iPlace = 0; + dEdx = charge2*( (*fdEdxVector)(iPlace) - GetdEdxCut(iPlace,cutEnergy) ) ; + + if( dEdx < 0.) dEdx = 0.; + return dEdx; +} + +///////////////////////////////////////////////////////////////////////// + +G4double G4PAIPhotonModel::CrossSection( const G4MaterialCutsCouple* matCC, + const G4ParticleDefinition* p, + G4double kineticEnergy, + G4double cutEnergy, + G4double maxEnergy ) +{ + G4int iTkin,iPlace; + size_t jMat, jMatCC; + G4double tmax = std::min(MaxSecondaryEnergy(p, kineticEnergy), maxEnergy); + G4double scaledTkin = kineticEnergy*p->GetPDGMass()/proton_mass_c2; + G4double charge = p->GetPDGCharge(); + G4double charge2 = charge*charge, cross, cross1, cross2; + G4double photon1, photon2, plasmon1, plasmon2; + + const G4ProductionCutsTable* theCoupleTable= + G4ProductionCutsTable::GetProductionCutsTable(); + + size_t numOfCouples = theCoupleTable->GetTableSize(); + + for (jMatCC = 0 ; jMatCC < numOfCouples ; jMatCC++ ) + { + if( matCC == theCoupleTable->GetMaterialCutsCouple(jMatCC) ) break; + } + if( jMatCC == numOfCouples && jMatCC > 0 ) jMatCC--; + + const std::vector* photonCutInKineticEnergy = theCoupleTable-> + GetEnergyCutsVector(idxG4GammaCut); + + G4double photonCut = (*photonCutInKineticEnergy)[jMatCC] ; + + for( jMat = 0 ;jMat < fMaterialCutsCoupleVector.size() ; ++jMat ) + { + if( matCC == fMaterialCutsCoupleVector[jMat] ) break; + } + if(jMat == fMaterialCutsCoupleVector.size() && jMat > 0) jMat--; + + fPAItransferTable = fPAIxscBank[jMat]; + fPAIphotonTable = fPAIphotonBank[jMat]; + fPAIplasmonTable = fPAIplasmonBank[jMat]; + + for(iTkin = 0 ; iTkin < fTotBin ; iTkin++) + { + if(scaledTkin < fProtonEnergyVector->GetLowEdgeEnergy(iTkin)) break ; + } + iPlace = iTkin - 1; + if(iPlace < 0) iPlace = 0; + + photon1 = GetdNdxPhotonCut(iPlace,tmax); + photon2 = GetdNdxPhotonCut(iPlace,photonCut); + + plasmon1 = GetdNdxPlasmonCut(iPlace,tmax); + plasmon2 = GetdNdxPlasmonCut(iPlace,cutEnergy); + + cross1 = photon1 + plasmon1; + cross2 = photon2 + plasmon2; + cross = (cross2 - cross1)*charge2; + + if( cross < 0. ) cross = 0.; + return cross; +} + +/////////////////////////////////////////////////////////////////////////// +// +// It is analog of PostStepDoIt in terms of secondary electron or photon to +// be returned as G4Dynamicparticle*. +// + +G4DynamicParticle* +G4PAIPhotonModel::SampleSecondary( const G4MaterialCutsCouple* matCC, + const G4DynamicParticle* dp, + G4double tmin, + G4double maxEnergy) +{ + size_t jMat; + for( jMat = 0 ;jMat < fMaterialCutsCoupleVector.size() ; ++jMat ) + { + if( matCC == fMaterialCutsCoupleVector[jMat] ) break; + } + if( jMat == fMaterialCutsCoupleVector.size() && jMat > 0 ) jMat--; + + fPAItransferTable = fPAIxscBank[jMat]; + fPAIphotonTable = fPAIphotonBank[jMat]; + fPAIplasmonTable = fPAIplasmonBank[jMat]; + + fdNdxCutVector = fdNdxCutTable[jMat]; + fdNdxCutPhotonVector = fdNdxCutPhotonTable[jMat]; + fdNdxCutPlasmonVector = fdNdxCutPlasmonTable[jMat]; + + G4double tmax = std::min(MaxSecondaryEnergy(dp), maxEnergy); + if( tmin >= tmax ) return 0; + + G4ThreeVector momentum = dp->GetMomentumDirection(); + G4double particleMass = dp->GetMass(); + G4double kineticEnergy = dp->GetKineticEnergy(); + G4double scaledTkin = kineticEnergy*particleMass/proton_mass_c2; + G4double totalEnergy = kineticEnergy + particleMass; + G4double pSquare = kineticEnergy*(totalEnergy+particleMass); + + G4int iTkin; + for(iTkin=0;iTkinGetLowEdgeEnergy(iTkin)) break ; + } + G4int iPlace = iTkin - 1 ; + if(iPlace < 0) iPlace = 0; + + G4double dNdxPhotonCut = (*fdNdxCutPhotonVector)(iPlace) ; + G4double dNdxPlasmonCut = (*fdNdxCutPlasmonVector)(iPlace) ; + G4double dNdxCut = dNdxPhotonCut + dNdxPlasmonCut; + + G4double ratio; + if (dNdxCut > 0.) ratio = dNdxPhotonCut/dNdxCut; + else ratio = 0.; + + if(ratio < G4UniformRand() ) // secondary e- + { + G4double deltaTkin = GetPostStepTransfer(fPAIplasmonTable, fdNdxCutPlasmonVector, + iPlace, scaledTkin); + + //G4cout<<"PAIPhotonModel PlasmonPostStepTransfer = "< +1.) costheta = +1.; + + // direction of the delta electron + + G4double phi = twopi*G4UniformRand(); + G4double sintheta = sqrt((1.+costheta)*(1.-costheta)); + G4double dirx = sintheta*cos(phi), diry = sintheta*sin(phi), dirz = costheta; + + G4ThreeVector deltaDirection(dirx,diry,dirz); + deltaDirection.rotateUz(momentum); + + // create G4DynamicParticle object for e- delta ray + + G4DynamicParticle* deltaRay = new G4DynamicParticle; + deltaRay->SetDefinition(G4Electron::Electron()); + deltaRay->SetKineticEnergy( deltaTkin ); + deltaRay->SetMomentumDirection(deltaDirection); + + return deltaRay; + } + else // secondary 'Cherenkov' photon + { + G4double deltaTkin = GetPostStepTransfer(fPAIphotonTable, fdNdxCutPhotonVector, + iPlace,scaledTkin); + + //G4cout<<"PAIPhotonModel PhotonPostStepTransfer = "< 1.) costheta = 1.; + + // direction of the 'Cherenkov' photon + + G4double phi = twopi*G4UniformRand(); + G4double sintheta = sqrt((1.+costheta)*(1.-costheta)); + G4double dirx = sintheta*cos(phi), diry = sintheta*sin(phi), dirz = costheta; + + G4ThreeVector deltaDirection(dirx,diry,dirz); + deltaDirection.rotateUz(momentum); + + // create G4DynamicParticle object for photon ray + + G4DynamicParticle* photonRay = new G4DynamicParticle; + photonRay->SetDefinition(G4Gamma::Gamma()); + photonRay->SetKineticEnergy( deltaTkin ); + photonRay->SetMomentumDirection(deltaDirection); + + return photonRay; + } +} + + +/////////////////////////////////////////////////////////////////////// +// +// Returns post step PAI energy transfer > cut electron/photon energy according to passed +// scaled kinetic energy of particle + +G4double +G4PAIPhotonModel::GetPostStepTransfer( G4PhysicsTable* pTable, + G4PhysicsLogVector* pVector, + G4int iPlace, G4double scaledTkin ) +{ + // G4cout<<"G4PAIPhotonModel::GetPostStepTransfer"<GetVectorLength()); iTransfer++ ) + { + if( position >= + ( (*(*pTable)(iPlace))(iTransfer)*W1 + + (*(*pTable)(iPlace+1))(iTransfer)*W2) ) break ; + } + transfer = GetEnergyTransfer(pTable,iPlace,position,iTransfer); + } + } + // G4cout<<"PAIPhotonModel PostStepTransfer = "<GetLowEdgeEnergy(iTransfer) ; + } + else + { + if ( iTransfer >= G4int((*pTable)(iPlace)->GetVectorLength()) ) + { + iTransfer = (*pTable)(iPlace)->GetVectorLength() - 1 ; + } + y1 = (*(*pTable)(iPlace))(iTransfer-1) ; + y2 = (*(*fPAItransferTable)(iPlace))(iTransfer) ; + + x1 = (*pTable)(iPlace)->GetLowEdgeEnergy(iTransfer-1) ; + x2 = (*pTable)(iPlace)->GetLowEdgeEnergy(iTransfer) ; + + if ( x1 == x2 ) energyTransfer = x2 ; + else + { + if ( y1 == y2 ) energyTransfer = x1 + (x2 - x1)*G4UniformRand() ; + else + { + energyTransfer = x1 + (position - y1)*(x2 - x1)/(y2 - y1) ; + } + } + } + return energyTransfer ; +} + + +//////////////////////////////////////////////////////////////////////////// + +std::vector* +G4PAIPhotonModel::SampleSecondaries( const G4MaterialCutsCouple* couple, + const G4DynamicParticle* dp, + G4double tmin, + G4double maxEnergy) +{ + std::vector* vdp = new std::vector; + G4DynamicParticle* delta = SampleSecondary(couple, dp, tmin, maxEnergy); + vdp->push_back(delta); + return vdp; +} + +/////////////////////////////////////////////////////////////////////// +// +// Works like AlongStepDoIt method of process family + + + + +G4double G4PAIPhotonModel::SampleFluctuations( const G4Material* material, + const G4DynamicParticle* aParticle, + G4double&, + G4double& step, + G4double&) +{ + size_t jMat; + for( jMat = 0 ;jMat < fMaterialCutsCoupleVector.size() ; ++jMat ) + { + if( material == fMaterialCutsCoupleVector[jMat]->GetMaterial() ) break; + } + if(jMat == fMaterialCutsCoupleVector.size() && jMat > 0) jMat--; + + fPAItransferTable = fPAIxscBank[jMat]; + fPAIphotonTable = fPAIphotonBank[jMat]; + fPAIplasmonTable = fPAIplasmonBank[jMat]; + + fdNdxCutVector = fdNdxCutTable[jMat]; + fdNdxCutPhotonVector = fdNdxCutPhotonTable[jMat]; + fdNdxCutPlasmonVector = fdNdxCutPlasmonTable[jMat]; + + G4int iTkin, iPlace ; + + // G4cout<<"G4PAIPhotonModel::SampleFluctuations"<GetKineticEnergy() ; + G4double MassRatio = proton_mass_c2/aParticle->GetDefinition()->GetPDGMass() ; + G4double charge = aParticle->GetDefinition()->GetPDGCharge() ; + charge2 = charge*charge ; + G4double scaledTkin = Tkin*MassRatio ; + G4double cof = step*charge2; + + for( iTkin = 0; iTkin < fTotBin; iTkin++) + { + if(scaledTkin < fProtonEnergyVector->GetLowEdgeEnergy(iTkin)) break ; + } + iPlace = iTkin - 1 ; + if( iPlace < 0 ) iPlace = 0; + + photonLoss = GetAlongStepTransfer(fPAIphotonTable,fdNdxCutPhotonVector,iPlace,scaledTkin,cof); + + // G4cout<<"PAIPhotonModel AlongStepPhotonLoss = "<GetVectorLength()); iTransfer++ ) + { + if( position >= + ( (*(*pTable)(iPlace))(iTransfer)*W1 + + (*(*pTable)(iPlace+1))(iTransfer)*W2) ) + { + break ; + } + } + // loss += (*pTable)(iPlace)->GetLowEdgeEnergy(iTransfer) ; + loss += GetEnergyTransfer(pTable,iPlace,position,iTransfer); + numOfCollisions-- ; + } + } + } + + return loss ; + +} + +////////////////////////////////////////////////////////////////////// +// +// Returns the statistical estimation of the energy loss distribution variance +// + + +G4double G4PAIPhotonModel::Dispersion( const G4Material* material, + const G4DynamicParticle* aParticle, + G4double& tmax, + G4double& step ) +{ + G4double loss, sumLoss=0., sumLoss2=0., sigma2, meanLoss=0.; + for(G4int i = 0 ; i < fMeanNumber; i++) + { + loss = SampleFluctuations(material,aParticle,tmax,step,meanLoss); + sumLoss += loss; + sumLoss2 += loss*loss; + } + meanLoss = sumLoss/fMeanNumber; + sigma2 = meanLoss*meanLoss + (sumLoss2-2*sumLoss*meanLoss)/fMeanNumber; + return sigma2; +} + + +// +// +///////////////////////////////////////////////// + + + + + + diff --git a/source/processes/electromagnetic/standard/src/G4PAIonisation.cc b/source/processes/electromagnetic/standard/src/G4PAIonisation.cc index 133474a597..ac2f26d4c0 100644 --- a/source/processes/electromagnetic/standard/src/G4PAIonisation.cc +++ b/source/processes/electromagnetic/standard/src/G4PAIonisation.cc @@ -158,6 +158,166 @@ G4double G4PAIonisation::GetMaxKineticEnergy() {return HighestKineticEnergy;} G4double G4PAIonisation::GetMinKineticEnergy() {return LowestKineticEnergy;} G4int G4PAIonisation::GetBinNumber() {return TotBin;} +///////////////////////////////////////////////////////////////////////// +// +// GetMeanFreePath + +G4double +G4PAIonisation::GetMeanFreePath( const G4Track& trackData, + G4double, + G4ForceCondition* condition ) +{ +// G4cout<<"G4PAIonisation::GetMeanFreePath is called"<GetIndex() != fMatIndex ) meanFreePath = DBL_MAX ; + else + { + const G4DynamicParticle* aParticle = trackData.GetDynamicParticle() ; + kinE = aParticle->GetKineticEnergy() ; + mass = aParticle->GetDefinition()->GetPDGMass() ; + gamma = 1.0 + kinE/mass ; + + if(gamma < 1.2) return meanFreePath = DBL_MAX ; + + charge = aParticle->GetDefinition()->GetPDGCharge() ; + charge2 = charge*charge ; + massRatio = proton_mass_c2/mass ; + scaledE = kinE*massRatio ; + + for(iTkin=0;iTkinGetLowEdgeEnergy(iTkin)) // <= ? + if(scaledE < fProtonEnergyVector->GetLowEdgeEnergy(iTkin)) // <= ? + { + break ; + } + } + iPlace = iTkin - 1 ; + + if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left + { + meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace))(0)/charge2 ; + } + else + { + if(iTkin == 0) // Tkin is too small, trying from right only + { + meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace+1))(0)/charge2 ; + } + else + { + E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; + E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; + W = 1.0/(E2 - E1) ; + W1 = (E2 - scaledE)*W ; + W2 = (scaledE - E1)*W ; + primaryIon = (*(*fPAItransferBank)(iPlace ))(0)*W1 + + (*(*fPAItransferBank)(iPlace+1))(0)*W2 ; + meanFreePath = 1.0/primaryIon/charge2 ; + } + } + // meanFreePath = DBL_MAX ; + } + return meanFreePath ; +} + +///////////////////////////////////////////////////////////////////////// +// +// GetFreePath + +G4double +G4PAIonisation::GetFreePath( G4double scaledTkin, G4double charge2 ) +{ +// G4cout<<"G4PAIonisation::GetFreePath is called"<GetLowEdgeEnergy(iTkin)) break ; + } + iPlace = iTkin - 1 ; + + if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left + { + meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace))(0)/charge2 ; + } + else + { + if(iTkin == 0) // Tkin is too small, trying from right only + { + meanFreePath = 1.0/(*(*fPAItransferBank)(iPlace+1))(0)/charge2 ; + } + else + { + E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; + E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; + W = 1.0/(E2 - E1) ; + W1 = (E2 - scaledTkin)*W ; + W2 = (scaledTkin - E1)*W ; + primaryIon = (*(*fPAItransferBank)(iPlace ))(0)*W1 + + (*(*fPAItransferBank)(iPlace+1))(0)*W2 ; + meanFreePath = 1.0/primaryIon/charge2 ; + } + } + // meanFreePath = DBL_MAX ; + + return meanFreePath ; +} + +///////////////////////////////////////////////////////////////////////// +// +// GetdEdx + +G4double +G4PAIonisation::GetdEdx( G4double scaledTkin, G4double charge2 ) +{ +// G4cout<<"G4PAIonisation::GetdEdx is called"<GetLowEdgeEnergy(iTkin)) break ; + } + iPlace = iTkin - 1 ; + + if(iTkin == G4PAIonisation::GetBinNumber()) // Fermi plato, try from left + { + dEdx = (*(*theLossTable)(iPlace))(0)*charge2 ; + } + else + { + if(iTkin == 0) // Tkin is too small, trying from right only + { + dEdx = (*(*theLossTable)(iPlace+1))(0)*charge2 ; + } + else + { + E1 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin - 1) ; + E2 = fProtonEnergyVector->GetLowEdgeEnergy(iTkin) ; + W = 1.0/(E2 - E1) ; + W1 = (E2 - scaledTkin)*W ; + W2 = (scaledTkin - E1)*W ; + dEdx = (*(*theLossTable)(iPlace))(0)*W1 + (*(*theLossTable)(iPlace+1))(0)*W2; + dEdx *= charge2 ; + } + } + return dEdx ; +} + ///////////////////////////////////////////////////////////////////////// // // Calculate Sandia table photo absorption cross section coefficients for diff --git a/source/processes/electromagnetic/standard/src/G4PAIxSection.cc b/source/processes/electromagnetic/standard/src/G4PAIxSection.cc index b535893462..5d8a6a195b 100644 --- a/source/processes/electromagnetic/standard/src/G4PAIxSection.cc +++ b/source/processes/electromagnetic/standard/src/G4PAIxSection.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4PAIxSection.cc,v 1.17 2003/10/19 15:21:22 grichine Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4PAIxSection.cc,v 1.19 2004/06/07 07:33:21 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // G4PAIxSection.cc -- class implementation file @@ -35,6 +35,7 @@ // R&D: Vladimir.Grichine@cern.ch // // History: +// // 13.05.03 V. Grichine, bug fixed for maxEnergyTransfer > max interval energy // 28.05.01 V.Ivanchenko minor changes to provide ANSI -wall compilation // 17.05.01 V. Grichine, low energy extension down to 10*keV of proton @@ -50,6 +51,9 @@ #include "G4ios.hh" #include "G4Poisson.hh" #include "G4Material.hh" +#include "G4MaterialCutsCouple.hh" +#include "G4SandiaTable.hh" + /* ****************************************************************** @@ -82,6 +86,33 @@ const G4int G4PAIxSection::fMaxSplineSize = 500 ; // Max size of output spline // Constructor // +G4PAIxSection::G4PAIxSection(G4MaterialCutsCouple* matCC) +{ + fDensity = matCC->GetMaterial()->GetDensity(); + G4int matIndex = matCC->GetMaterial()->GetIndex(); + fSandia = new G4SandiaTable(matIndex); + + G4int i, j; + fMatSandiaMatrix = new G4OrderedTable(); + + for (i = 0; i < fSandia->GetMaxInterval()-1; i++) + { + fMatSandiaMatrix->push_back(new G4DataVector(5,0.)); + } + for (i = 0; i < fSandia->GetMaxInterval()-1; i++) + { + (*(*fMatSandiaMatrix)[i])[0] = fSandia->GetSandiaMatTable(i,0); + + for(j = 1; j < 5 ; j++) + { + (*(*fMatSandiaMatrix)[i])[j] = fSandia->GetSandiaMatTable(i,j)*fDensity; + } + } + + + +} + G4PAIxSection::G4PAIxSection(G4int materialIndex, G4double maxEnergyTransfer) { diff --git a/source/processes/electromagnetic/standard/src/G4SynchrotronRadiation.cc b/source/processes/electromagnetic/standard/src/G4SynchrotronRadiation.cc index 198103936f..d1ad3da2a9 100644 --- a/source/processes/electromagnetic/standard/src/G4SynchrotronRadiation.cc +++ b/source/processes/electromagnetic/standard/src/G4SynchrotronRadiation.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SynchrotronRadiation.cc,v 1.9 2004/03/10 16:48:46 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4SynchrotronRadiation.cc,v 1.10 2004/06/07 13:49:52 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -------------------------------------------------------------- // GEANT 4 class implementation file @@ -75,6 +75,95 @@ G4SynchrotronRadiation::~G4SynchrotronRadiation() // GEANT4 internal units. // +G4double G4SynchrotronRadiation::GetLambdaConst() +{ + return fLambdaConst; +} + + +G4double G4SynchrotronRadiation::GetEnergyConst() +{ + return fEnergyConst; +} + + +G4double +G4SynchrotronRadiation::GetMeanFreePath( const G4Track& trackData, + G4double, + G4ForceCondition* condition) +{ + // gives the MeanFreePath in GEANT4 internal units + + const G4DynamicParticle* aDynamicParticle; + G4Material* aMaterial; + G4double MeanFreePath; + //G4bool isOutRange ; + + *condition = NotForced ; + + aDynamicParticle = trackData.GetDynamicParticle(); + aMaterial = trackData.GetMaterial(); + + G4double gamma = aDynamicParticle->GetTotalEnergy()/ + (aDynamicParticle->GetMass() ) ; + + G4double KineticEnergy = aDynamicParticle->GetKineticEnergy(); + + if (KineticEnergy < LowestKineticEnergy || gamma<1.0e3) + { + MeanFreePath = DBL_MAX ; + } + else + { + G4TransportationManager* transportMgr; + G4FieldManager* globalFieldMgr; + + transportMgr = G4TransportationManager::GetTransportationManager() ; + + globalFieldMgr = transportMgr->GetFieldManager() ; + + G4bool FieldExists = globalFieldMgr->DoesFieldExist() ; + G4ThreeVector FieldValue; + const G4Field* pField = 0 ; + if (FieldExists) + { + pField = globalFieldMgr->GetDetectorField() ; + G4ThreeVector globPosition = trackData.GetPosition() ; + G4double globPosVec[3], FieldValueVec[3] ; + globPosVec[0] = globPosition.x() ; + globPosVec[1] = globPosition.y() ; + globPosVec[2] = globPosition.z() ; + + pField->GetFieldValue( globPosVec, FieldValueVec ) ; + FieldValue = G4ThreeVector( FieldValueVec[0], + FieldValueVec[1], + FieldValueVec[2] ) ; + + + + G4ThreeVector unitMomentum = aDynamicParticle->GetMomentumDirection(); + G4ThreeVector unitMcrossB = FieldValue.cross(unitMomentum) ; + G4double perpB = unitMcrossB.mag() ; + G4double beta = aDynamicParticle->GetTotalMomentum()/ + (aDynamicParticle->GetTotalEnergy() ) ; + if(perpB > 0.0) + { + MeanFreePath = fLambdaConst*beta/perpB ; + } + else + { + MeanFreePath = DBL_MAX ; + } + } + else + { + MeanFreePath = DBL_MAX ; + } + } + return MeanFreePath; +} + + G4VParticleChange* G4SynchrotronRadiation::PostStepDoIt(const G4Track& trackData, const G4Step& stepData ) diff --git a/source/processes/electromagnetic/standard/src/G4eBremsstrahlungModel.cc b/source/processes/electromagnetic/standard/src/G4eBremsstrahlungModel.cc index 83553c2ea8..e205707b2c 100644 --- a/source/processes/electromagnetic/standard/src/G4eBremsstrahlungModel.cc +++ b/source/processes/electromagnetic/standard/src/G4eBremsstrahlungModel.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4eBremsstrahlungModel.cc,v 1.15 2003/11/20 18:22:31 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4eBremsstrahlungModel.cc,v 1.16 2004/05/20 19:46:14 urban Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -43,6 +43,7 @@ // 27-01-03 Make models region aware (V.Ivanchenko) // 13-02-03 Add name (V.Ivanchenko) // 09-05-03 Fix problem of supression function + optimise sampling (V.Ivanchenko) +// 20-05-04 Correction to ensure unit independence (L.Urban) // // Class Description: // @@ -340,7 +341,7 @@ G4double G4eBremsstrahlungModel::ComputeBremLoss(G4double Z, G4double T, } } - G4double xx = log10(T); + G4double xx = log10(T/MeV); G4double fl = 1.; if (xx <= xlim) @@ -542,7 +543,7 @@ G4double G4eBremsstrahlungModel::CrossSectionPerAtom(G4double kineticEnergy, } } - G4double xx = log10(kineticEnergy) ; + G4double xx = log10(kineticEnergy/MeV) ; G4double fs = 1. ; if (xx <= xlim) { diff --git a/source/processes/electromagnetic/standard/src/G4hIonisation.cc b/source/processes/electromagnetic/standard/src/G4hIonisation.cc index f84e34cd39..0244d543fb 100644 --- a/source/processes/electromagnetic/standard/src/G4hIonisation.cc +++ b/source/processes/electromagnetic/standard/src/G4hIonisation.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4hIonisation.cc,v 1.50 2003/11/12 16:23:42 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4hIonisation.cc,v 1.51 2004/05/27 17:23:02 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -66,6 +66,7 @@ // 04-08-03 Set integral=false to be default (V.Ivanchenko) // 08-08-03 STD substitute standard (V.Ivanchenko) // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko) +// 27-05-04 Set integral to be a default regime (V.Ivanchenko) // // ------------------------------------------------------------------- // @@ -96,7 +97,6 @@ G4hIonisation::G4hIonisation(const G4String& name) SetMinKinEnergy(0.1*keV); SetMaxKinEnergy(100.0*TeV); SetVerboseLevel(0); - SetIntegral(false); mass = 0.0; ratio = 0.0; } @@ -120,11 +120,7 @@ void G4hIonisation::InitialiseProcess() em->SetLowEnergyLimit(0.1*keV); em->SetHighEnergyLimit(2.0*MeV*massFactor); - if(IsIntegral()) { - flucModel = new G4BohrFluctuations(); - } else { - flucModel = new G4UniversalFluctuation(); - } + flucModel = new G4UniversalFluctuation(); AddEmModel(1, em, flucModel); G4VEmModel* em1 = new G4BetheBlochModel(); @@ -132,6 +128,8 @@ void G4hIonisation::InitialiseProcess() em1->SetHighEnergyLimit(100.0*TeV); AddEmModel(2, em1, flucModel); + SetStepLimits(0.2, 1.0*mm); + isInitialised = true; } diff --git a/source/processes/electromagnetic/standard/src/G4ionIonisation.cc b/source/processes/electromagnetic/standard/src/G4ionIonisation.cc index e635313308..989cb0f206 100644 --- a/source/processes/electromagnetic/standard/src/G4ionIonisation.cc +++ b/source/processes/electromagnetic/standard/src/G4ionIonisation.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4ionIonisation.cc,v 1.21 2003/11/12 16:23:42 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ionIonisation.cc,v 1.23 2004/05/27 17:22:56 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -42,6 +42,7 @@ // 18-04-03 Use IonFluctuations (V.Ivanchenko) // 03-08-03 Add effective charge (V.Ivanchenko) // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko) +// 27-05-04 Set integral to be a default regime (V.Ivanchenko) // // // ------------------------------------------------------------------- @@ -95,11 +96,10 @@ void G4ionIonisation::InitialiseProcess() em1->SetHighEnergyLimit(100.0*TeV); AddEmModel(2, em1, flucModel); - SetIntegral(false); chargeLowLimit = 0.1; - energyLowLimit = 250.*MeV; + energyLowLimit = 25.*MeV; SetLinearLossLimit(0.15); - //SetStepLimits(0.1, 0.1*mm); + SetStepLimits(0.1, 0.1*mm); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -265,7 +265,7 @@ G4double G4ionIonisation::EffectiveCharge(const G4ParticleDefinition* p, chargeCorrection = s * (1.0 + 0.5*(1.0/q - 1.0)*log(1.0 + lambda*lambda)/(vF*vF) ); } // G4cout << "G4ionIonisation: charge= " << charge << " q= " << q - // << " chargeCor= " << chargeCorrection << G4endl; + // << " chargeCor= " << chargeCorrection << G4endl; return charge*q; } diff --git a/source/processes/electromagnetic/utils/History b/source/processes/electromagnetic/utils/History index 6bbf121247..e3b40719f5 100644 --- a/source/processes/electromagnetic/utils/History +++ b/source/processes/electromagnetic/utils/History @@ -1,4 +1,4 @@ -$Id: History,v 1.141 2004/03/15 12:15:03 maire Exp $ +$Id: History,v 1.151 2004/05/26 15:21:16 vnivanch Exp $ ------------------------------------------------------------------- ========================================================= @@ -16,7 +16,52 @@ committal in the CVS repository ! ---------------------------------------------------------- * Reverse chronological order (last date on top), please * ---------------------------------------------------------- + +26 May 04: V.Ivanchenko (utils-V06-01-07) +- Critical fix in msc to avoid crash in case of use of G4hLowEnergyIonisation + for ions together with msc + +17 May 04: V.Ivanchenko (utils-V06-01-06) +- Update integral method taking into account 1 peak in cross section +- Add options to G4EmProcessOptions +- Fix minor problem at initialisation + +10 May 04: V.Ivanchenko (utils-V06-01-05) +- Add method GetCurrentRange +- Add additional initialisation to fluctuations +- Fix in printout format + +04 May 04: V.Ivanchenko (utils-V06-01-04) +- Use dynamic change for simulation of multiple scattering angle +- Use trancate range table for estimation of energy loss inside + msc model. + +26 April 04: V.Ivanchenko (utils-V06-01-03) +- Reduce aria of applicability of the model for simulation + of fluctuations at very small steps to provide less step dependent + results. + +23 April 04: L.Urban (utils-V06-01-02) +- changes in G4MscModel: t->z and z->t transformations (true length + to geometrical length and back) have been completely rewritten, + change in the angular distribution for e+/e- + ( correction to the Highland formula) + some technical changes + ==> results are closer to data, step dependence decreased. Effect + the resolution of sampling calorimeters + +05 April 04: V.Ivant (utils-V06-01-01) +- G4VEnergyLossProcess: Update calulation of energy loss from tables + (important for proton energies about 1 MeV); +- Fluctuations: smooth out sampling of Gaussian fluctuations, + when sigma is much bigger than energy loss. + +31 March 04: V.Ivant (utils-V06-01-00) +- G4VEnergyLossProcess: Fix a problem of retrieve tables if PreciseRange + is absent +15 March 04: V.Ivant (utils-V06-00-09) +- G4VEnergyLossProcess: Fix a problem of energy below lowestKinEnergy + 15 March 04: mma (utils-V06-00-08) 12 March 04: V.Ivant diff --git a/source/processes/electromagnetic/utils/include/G4BohrFluctuations.hh b/source/processes/electromagnetic/utils/include/G4BohrFluctuations.hh index 283f40895a..3d4ffeaeb0 100644 --- a/source/processes/electromagnetic/utils/include/G4BohrFluctuations.hh +++ b/source/processes/electromagnetic/utils/include/G4BohrFluctuations.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4BohrFluctuations.hh,v 1.5 2003/10/16 13:06:39 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4BohrFluctuations.hh,v 1.6 2004/05/11 15:35:06 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -106,6 +106,8 @@ inline G4double G4BohrFluctuations::Dispersion( G4double& tmax, G4double& length) { + if(!particle) InitialiseMe(dp->GetDefinition()); + G4double electronDensity = material->GetElectronDensity(); kineticEnergy = dp->GetKineticEnergy(); G4double gam = kineticEnergy/particleMass + 1.0; diff --git a/source/processes/electromagnetic/utils/include/G4EmMultiModel.hh b/source/processes/electromagnetic/utils/include/G4EmMultiModel.hh new file mode 100644 index 0000000000..1c608a3df9 --- /dev/null +++ b/source/processes/electromagnetic/utils/include/G4EmMultiModel.hh @@ -0,0 +1,136 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: G4EmMultiModel.hh,v 1.1 2004/05/03 13:13:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ------------------------------------------------------------------- +// +// GEANT4 Class header file +// +// +// File name: G4EmMultiModel +// +// Author: Vladimir Ivanchenko +// +// Creation date: 03.05.2004 +// +// Modifications: +// +// +// +// Class Description: +// +// Energy loss model using several G4VEmModels + +// ------------------------------------------------------------------- +// + +#ifndef G4EmMultiModel_h +#define G4EmMultiModel_h 1 + +#include "globals.hh" +#include "G4VEmModel.hh" +#include + +class G4Region; +class G4PhysicsTable; +class G4DynamicParticle; + +class G4EmMultiModel : public G4VEmModel +{ + +public: + + G4EmMultiModel(const G4String& nam = "MultiModel"); + + ~G4EmMultiModel(); + + void Initialise(const G4ParticleDefinition*, const G4DataVector&); + + G4double HighEnergyLimit(const G4ParticleDefinition*) {return highKinEnergy;}; + + G4double LowEnergyLimit(const G4ParticleDefinition*) {return lowKinEnergy;}; + + void SetHighEnergyLimit(G4double e) {highKinEnergy = e;}; + + void SetLowEnergyLimit(G4double e) {lowKinEnergy = e;}; + + G4double MinEnergyCut(const G4ParticleDefinition*, + const G4MaterialCutsCouple*); + + G4bool IsInCharge(const G4ParticleDefinition*); + + G4double ComputeDEDX(const G4MaterialCutsCouple*, + const G4ParticleDefinition*, + G4double kineticEnergy, + G4double cutEnergy); + + G4double CrossSection(const G4MaterialCutsCouple*, + const G4ParticleDefinition*, + G4double kineticEnergy, + G4double cutEnergy, + G4double maxEnergy); + + G4DynamicParticle* SampleSecondary( + const G4MaterialCutsCouple*, + const G4DynamicParticle*, + G4double tmin, + G4double tmax); + + std::vector* SampleSecondaries( + const G4MaterialCutsCouple*, + const G4DynamicParticle*, + G4double tmin, + G4double tmax); + + G4double MaxSecondaryEnergy(const G4DynamicParticle* dynParticle); + + void DefineForRegion(const G4Region*); + + void SetDynamicParticle(const G4DynamicParticle*); + + void AddModel(G4VEmModel*, G4double tmin, G4double tmax); + +protected: + + G4double MaxSecondaryEnergy(const G4ParticleDefinition*, + G4double kineticEnergy); + +private: + + // hide assignment operator + G4EmMultiModel & operator=(const G4EmMultiModel &right); + G4EmMultiModel(const G4EmMultiModel&); + + G4int nModels; + std::vector model; + G4DataVector tsecmin; + G4DataVector cross_section; + + G4double highKinEnergy; + G4double lowKinEnergy; + +}; + +#endif + diff --git a/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh b/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh index 3f2cb27a67..a5e4fb5c3d 100644 --- a/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh +++ b/source/processes/electromagnetic/utils/include/G4EmProcessOptions.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4EmProcessOptions.hh,v 1.1 2004/02/27 17:59:06 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4EmProcessOptions.hh,v 1.2 2004/05/17 09:46:55 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------------- @@ -52,6 +52,7 @@ #include "globals.hh" class G4LossTableManager; +class G4Region; class G4EmProcessOptions { @@ -90,6 +91,12 @@ public: void SetVerbose(G4int val, const G4String& name = "all"); + void SetLambdaFactor(G4double val); + + void ActivateFluorescence(G4bool val, const G4Region* r = 0); + + void ActivateAugerElectronProduction(G4bool val, const G4Region* r = 0); + private: G4EmProcessOptions & operator=(const G4EmProcessOptions &right); diff --git a/source/processes/electromagnetic/utils/include/G4LossTableManager.hh b/source/processes/electromagnetic/utils/include/G4LossTableManager.hh index 57356a9a07..1988a4ac82 100644 --- a/source/processes/electromagnetic/utils/include/G4LossTableManager.hh +++ b/source/processes/electromagnetic/utils/include/G4LossTableManager.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4LossTableManager.hh,v 1.21 2004/02/27 17:54:48 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4LossTableManager.hh,v 1.24 2004/05/12 12:25:26 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------------- @@ -102,6 +102,11 @@ public: G4double kineticEnergy, const G4MaterialCutsCouple *couple); + G4double GetTrancatedRange( + const G4ParticleDefinition *aParticle, + G4double kineticEnergy, + const G4MaterialCutsCouple *couple); + G4double GetEnergy( const G4ParticleDefinition *aParticle, G4double range, @@ -259,7 +264,32 @@ inline G4double G4LossTableManager::GetDEDX( if(currentLoss) x = currentLoss->GetDEDX(kineticEnergy, couple); else x = G4EnergyLossTables::GetDEDX(currentParticle,kineticEnergy,couple,false); return x; -// return currentLoss->GetDEDX(kineticEnergy, couple); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... + +inline G4double G4LossTableManager::GetTrancatedRange( + const G4ParticleDefinition *aParticle, + G4double kineticEnergy, + const G4MaterialCutsCouple *couple) +{ + if(aParticle != currentParticle) { + currentParticle = aParticle; + std::map >::const_iterator pos; + if ((pos = loss_map.find(currentParticle)) != loss_map.end()) { + currentLoss = (*pos).second; + } else { + currentLoss = 0; +// ParticleHaveNoLoss(aParticle); + } + } + G4double x; + if(currentLoss) { + x = currentLoss->GetRangeForLoss(kineticEnergy, couple); + } else { + x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,couple,false); + } + return x; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... @@ -280,10 +310,12 @@ inline G4double G4LossTableManager::GetRange( } } G4double x; - if(currentLoss) x = currentLoss->GetRange(kineticEnergy, couple); - else x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,couple,false); + if(currentLoss) { + x = currentLoss->GetRange(kineticEnergy, couple); + } else { + x = G4EnergyLossTables::GetRange(currentParticle,kineticEnergy,couple,false); + } return x; -// return currentLoss->GetRange(kineticEnergy, couple); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -305,9 +337,9 @@ inline G4double G4LossTableManager::GetEnergy( } G4double x; if(currentLoss) x = currentLoss->GetKineticEnergy(range, couple); - else x = G4EnergyLossTables::GetPreciseEnergyFromRange(currentParticle,range,couple,false); + else x = G4EnergyLossTables::GetPreciseEnergyFromRange(currentParticle, + range,couple,false); return x; -// return currentLoss->GetKineticEnergy(range, couple); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/source/processes/electromagnetic/utils/include/G4MscModel.hh b/source/processes/electromagnetic/utils/include/G4MscModel.hh index 79d3059ed2..3f607f489c 100644 --- a/source/processes/electromagnetic/utils/include/G4MscModel.hh +++ b/source/processes/electromagnetic/utils/include/G4MscModel.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MscModel.hh,v 1.9 2004/03/10 08:38:39 urban Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MscModel.hh,v 1.11 2004/04/29 18:40:52 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -44,6 +44,9 @@ // 26-11-03 new data member currentRange (L.Urban) // 01-03-04 changes in data members + signature changed in SampleCosineTheta // 11-03-04 changes in data members (L.Urban) +// 23-04-04 changes in data members and in signature of SampleCosineTheta +// (L.Urban) + // // Class Description: // @@ -115,13 +118,14 @@ public: G4double TrueStepLength(G4double geomStepLength); - G4double SampleCosineTheta(G4double trueStepLength,G4double KineticEnergy, - G4double lambda); + G4double SampleCosineTheta(G4double trueStepLength,G4double KineticEnergy); G4double SampleDisplacement(); G4double MaxSecondaryEnergy(const G4DynamicParticle*) {return 0.0;}; + void SetDynamicParticle(const G4DynamicParticle*); + protected: G4double MaxSecondaryEnergy(const G4ParticleDefinition*, @@ -159,8 +163,8 @@ private: G4double xsi; G4double lambda0; - G4double parlowen ; G4double tPathLength; + G4double par1,par2,par3 ; G4bool samplez; @@ -172,6 +176,13 @@ private: }; +inline void G4MscModel::SetDynamicParticle(const G4DynamicParticle* dp) +{ + particle = dp->GetDefinition(); + mass = dp->GetMass(); + charge = dp->GetCharge()/eplus; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #endif diff --git a/source/processes/electromagnetic/utils/include/G4UniversalFluctuation.hh b/source/processes/electromagnetic/utils/include/G4UniversalFluctuation.hh index 4497af9663..510f11896e 100644 --- a/source/processes/electromagnetic/utils/include/G4UniversalFluctuation.hh +++ b/source/processes/electromagnetic/utils/include/G4UniversalFluctuation.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4UniversalFluctuation.hh,v 1.10 2003/11/06 17:18:36 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4UniversalFluctuation.hh,v 1.12 2004/05/11 15:35:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -108,12 +108,10 @@ private: G4double minNumberInteractionsBohr; G4double theBohrBeta2; G4double minLoss; - G4double problim; G4double sumalim; G4double alim; G4double nmaxCont1; G4double nmaxCont2; - }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/utils/include/G4VEmModel.hh b/source/processes/electromagnetic/utils/include/G4VEmModel.hh index cb431367c1..739a8a379a 100644 --- a/source/processes/electromagnetic/utils/include/G4VEmModel.hh +++ b/source/processes/electromagnetic/utils/include/G4VEmModel.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4VEmModel.hh,v 1.17 2004/03/01 14:16:57 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4VEmModel.hh,v 1.19 2004/04/29 18:40:52 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -43,8 +43,8 @@ // 23-07-03 Replace G4Material by G4MaterialCutCouple in dE/dx and CrossSection // calculation (V.Ivanchenko) // 01-03-04 L.Urban signature changed in SampleCosineTheta +// 23-04-04 L.urban signature of SampleCosineTheta changed back // - // // Class Description: // @@ -130,13 +130,15 @@ public: virtual G4double TrueStepLength(G4double geomStepLength) {return geomStepLength;}; - virtual G4double SampleCosineTheta(G4double,G4double,G4double ) {return 1.0;}; - // trueStepLength + Tkin + lambda + virtual G4double SampleCosineTheta(G4double,G4double ) {return 1.0;}; + // trueStepLength + Tkin virtual G4double SampleDisplacement() {return 0.0;}; virtual void DefineForRegion(const G4Region*) {}; + virtual void SetDynamicParticle(const G4DynamicParticle*) {}; + protected: virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*, diff --git a/source/processes/electromagnetic/utils/include/G4VEmProcess.hh b/source/processes/electromagnetic/utils/include/G4VEmProcess.hh index 7e2efe92db..f76afaaac8 100644 --- a/source/processes/electromagnetic/utils/include/G4VEmProcess.hh +++ b/source/processes/electromagnetic/utils/include/G4VEmProcess.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4VEmProcess.hh,v 1.3 2004/03/06 13:47:20 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4VEmProcess.hh,v 1.4 2004/05/17 09:46:56 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -101,12 +101,10 @@ public: virtual G4bool IsApplicable(const G4ParticleDefinition& p) = 0; // True for all charged particles - virtual - void BuildPhysicsTable(const G4ParticleDefinition&); + virtual void BuildPhysicsTable(const G4ParticleDefinition&); // Build physics table during initialisation virtual void PrintInfoDefinition(); - // Print out of the class parameters G4PhysicsTable* BuildLambdaTable(); @@ -144,7 +142,7 @@ public: void UpdateEmModel(const G4String&, G4double, G4double); // Define new energy range for the model identified by the name - G4double GetLambda(G4double kineticEnergy, const G4MaterialCutsCouple* couple); + G4double GetLambda(G4double& kinEnergy, const G4MaterialCutsCouple* couple); // It returns the Lambda of the process G4double MicroscopicCrossSection(G4double kineticEnergy, @@ -161,18 +159,21 @@ public: const G4ParticleDefinition* Particle() const; const G4ParticleDefinition* SecondaryParticle() const; + void ActivateFluorescence(G4bool, const G4Region* r = 0); + void ActivateAugerElectronProduction(G4bool, const G4Region* r = 0); + + void SetLambdaFactor(G4double val); + protected: void SetParticle(const G4ParticleDefinition* p); void SetSecondaryParticle(const G4ParticleDefinition* p); - virtual - G4double GetMeanFreePath(const G4Track& track, - G4double previousStepSize, - G4ForceCondition* condition); + virtual G4double GetMeanFreePath(const G4Track& track, + G4double previousStepSize, + G4ForceCondition* condition); - virtual - G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*); + virtual G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*); virtual G4double MinPrimaryEnergy(const G4ParticleDefinition*, const G4Material*, G4double cut) = 0; @@ -190,6 +191,10 @@ private: void DefineMaterial(const G4MaterialCutsCouple* couple); + G4double GetLambda(G4double kinEnergy); + + void ComputeLambda(G4double kinEnergy); + // hide assignment operator G4VEmProcess(G4VEmProcess &); @@ -203,6 +208,8 @@ private: // tables and vectors G4PhysicsTable* theLambdaTable; + G4double* theEnergyOfCrossSectionMax; + G4double* theCrossSectionMax; const G4ParticleDefinition* particle; const G4ParticleDefinition* baseParticle; @@ -218,9 +225,12 @@ private: G4double minKinEnergy; G4double maxKinEnergy; + G4double lambdaFactor; G4double preStepLambda; + G4double preStepMFP; G4double preStepKinEnergy; + G4double mfpKinEnergy; G4bool integral; G4bool meanFreePath; @@ -235,7 +245,44 @@ inline void G4VEmProcess::DefineMaterial(const G4MaterialCutsCouple* couple) currentCouple = couple; currentMaterial = couple->GetMaterial(); currentMaterialIndex = couple->GetIndex(); - if(integral && !meanFreePath) ResetNumberOfInteractionLengthLeft(); + if(integral && (!meanFreePath || preStepKinEnergy < mfpKinEnergy)) + ResetNumberOfInteractionLengthLeft(); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4double G4VEmProcess::GetLambda(G4double& kineticEnergy, + const G4MaterialCutsCouple* couple) +{ + DefineMaterial(couple); + G4double x = 0.0; + if(theLambdaTable) x = GetLambda(kineticEnergy); + return x; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4double G4VEmProcess::GetLambda(G4double e) +{ + G4bool b; + return (((*theLambdaTable)[currentMaterialIndex])->GetValue(e, b)); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline void G4VEmProcess::ComputeLambda(G4double e) +{ + meanFreePath = false; + mfpKinEnergy = 0.0; + G4double emax = theEnergyOfCrossSectionMax[currentMaterialIndex]; + if (e <= emax) preStepLambda = GetLambda(e); + else { + e *= lambdaFactor; + if(e > emax) { + mfpKinEnergy = e; + preStepLambda = GetLambda(e); + } else preStepLambda = theCrossSectionMax[currentMaterialIndex]; } } @@ -244,18 +291,16 @@ inline void G4VEmProcess::DefineMaterial(const G4MaterialCutsCouple* couple) inline G4double G4VEmProcess::GetMeanFreePath(const G4Track& track, G4double, G4ForceCondition*) { - DefineMaterial(track.GetMaterialCutsCouple()); preStepKinEnergy = track.GetKineticEnergy(); + DefineMaterial(track.GetMaterialCutsCouple()); if (meanFreePath) { - G4bool b; - preStepLambda = (((*theLambdaTable)[currentMaterialIndex])-> - GetValue(preStepKinEnergy, b)); - if (integral) meanFreePath = false; + if (integral) ComputeLambda(preStepKinEnergy); + else preStepLambda = GetLambda(preStepKinEnergy); + if(0.0 < preStepLambda) preStepMFP = 1.0/preStepLambda; + else preStepMFP = DBL_MAX; } - G4double x = DBL_MAX; - if(0.0 < preStepLambda) x = 1.0/preStepLambda; -// G4cout << GetProcessName() << ": e= " << preStepKinEnergy << " mfp= " << x << G4endl; - return x; + // G4cout<fRange || xSelectModel(kinEnergy, currentMaterialIndex); } @@ -618,79 +655,6 @@ inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() con //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins) -{ - nDEDXBins = nbins; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4VEnergyLossProcess::SetDEDXBinningForPreciseRange(G4int nbins) -{ - nDEDXBinsForRange = nbins; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins) -{ - nLambdaBins = nbins; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline G4double G4VEnergyLossProcess::MinKinEnergy() const -{ - return minKinEnergy; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e) -{ - minKinEnergy = e; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e) -{ - maxKinEnergy = e; - if(e < maxKinEnergyForRange) maxKinEnergyForRange = e; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline void G4VEnergyLossProcess::SetMaxKinEnergyForPreciseRange(G4double e) -{ - maxKinEnergyForRange = e; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline G4double G4VEnergyLossProcess::MaxKinEnergy() const -{ - return maxKinEnergy; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - -inline G4double G4VEnergyLossProcess::GetLambda(G4double kineticEnergy, - const G4MaterialCutsCouple* couple) -{ - DefineMaterial(couple); - G4double x = DBL_MAX; - G4bool b; - if(theLambdaTable) { - G4double y = (((*theLambdaTable)[currentMaterialIndex])-> - GetValue(kineticEnergy*massRatio, b)); - if(y > 0.0) x = 1.0/y; - } - return x; -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - inline G4VSubCutoffProcessor* G4VEnergyLossProcess::SubCutoffProcessor(size_t index) { G4VSubCutoffProcessor* p = 0; @@ -698,6 +662,97 @@ inline G4VSubCutoffProcessor* G4VEnergyLossProcess::SubCutoffProcessor(size_t in return p; } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const +{ + return theDEDXTable; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::PreciseRangeTable() const +{ + return thePreciseRangeTable; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const +{ + return theRangeTableForLoss; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const +{ + return theInverseRangeTable; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable() +{ + return theLambdaTable; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable() +{ + return theSubLambdaTable; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4bool G4VEnergyLossProcess::IsIntegral() const +{ + return integral; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const +{ + return currentMaterialIndex; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline void G4VEnergyLossProcess::SetMassRatio(G4double val) +{ + massRatio = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline void G4VEnergyLossProcess::SetReduceFactor(G4double val) +{ + reduceFactor = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline void G4VEnergyLossProcess::SetChargeSquare(G4double val) +{ + chargeSquare = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline void G4VEnergyLossProcess::SetChargeSquareRatio(G4double val) +{ + chargeSqRatio = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +inline G4double G4VEnergyLossProcess::GetCurrentRange() const +{ + return fRange; +} + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... #endif diff --git a/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh b/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh index 496b8efd5a..b97dad0183 100644 --- a/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh +++ b/source/processes/electromagnetic/utils/include/G4VMultipleScattering.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4VMultipleScattering.hh,v 1.16 2004/01/21 18:05:07 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4VMultipleScattering.hh,v 1.19 2004/05/25 11:30:08 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -45,6 +45,7 @@ // part of calculations for all charged particles // // 26-11-03 bugfix in AlongStepDoIt (L.Urban) +// 25-05-04 add protection against case when range is less than steplimit (V.Ivanchenko) // ------------------------------------------------------------------- // @@ -275,9 +276,11 @@ inline G4double G4VMultipleScattering::GetContinuousStepLimit( DefineMaterial(track.GetMaterialCutsCouple()); G4double e = track.GetKineticEnergy(); SelectModel(e); + if(!theLambdaTable) currentModel->SetDynamicParticle(track.GetDynamicParticle()); const G4ParticleDefinition* p = track.GetDefinition(); lambda0 = GetLambda(p, e); - currentRange = G4LossTableManager::Instance()->GetRange(p,e,currentCouple); + currentRange = G4LossTableManager::Instance()->GetTrancatedRange(p,e,currentCouple); + if(currentRange < currentMinimalStep) currentRange = currentMinimalStep; truePathLength = TruePathLengthLimit(track,lambda0,currentMinimalStep); //G4cout << "StepLimit: tpl= " << truePathLength << " lambda0= " // << lambda0 << " range= " << currentRange diff --git a/source/processes/electromagnetic/utils/src/G4BohrFluctuations.cc b/source/processes/electromagnetic/utils/src/G4BohrFluctuations.cc index d53ba4e8bc..205cb9d819 100644 --- a/source/processes/electromagnetic/utils/src/G4BohrFluctuations.cc +++ b/source/processes/electromagnetic/utils/src/G4BohrFluctuations.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4BohrFluctuations.cc,v 1.7 2003/10/24 14:00:25 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4BohrFluctuations.cc,v 1.9 2004/05/11 15:35:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -60,7 +60,7 @@ G4BohrFluctuations::G4BohrFluctuations(const G4String& nam) minNumberInteractionsBohr(10.0), minFraction(0.2), xmin(0.2), - minLoss(0.000001*eV) + minLoss(0.001*eV) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -89,6 +89,7 @@ G4double G4BohrFluctuations::SampleFluctuations(const G4Material* material, if(meanLoss <= minLoss) return meanLoss; G4double siga = Dispersion(material,dp,tmax,length); G4double loss = meanLoss; + G4double navr = minNumberInteractionsBohr; // Gaussian fluctuation @@ -97,10 +98,11 @@ G4double G4BohrFluctuations::SampleFluctuations(const G4Material* material, navr = meanLoss*meanLoss/siga; if (navr < minNumberInteractionsBohr) gauss = false; } +// G4cout << "### meanLoss= " << meanLoss << " navr= " << navr << " sig= " << sqrt(siga) << G4endl; if(gauss) { // Increase fluctuations for big fractional energy loss - + if ( meanLoss > minFraction*kineticEnergy ) { G4double gam = (kineticEnergy - meanLoss)/particleMass + 1.0; G4double b2 = 1.0 - 1.0/(gam*gam); @@ -111,17 +113,26 @@ G4double G4BohrFluctuations::SampleFluctuations(const G4Material* material, } siga = sqrt(siga); - G4double lossmax = meanLoss+meanLoss; + G4double twomeanLoss = meanLoss + meanLoss; - do { - loss = G4RandGauss::shoot(meanLoss,siga); - } while (0.0 > loss || loss > lossmax); + if(twomeanLoss < siga) { + G4double x; + do { + loss = twomeanLoss*G4UniformRand(); + x = (loss - meanLoss)/siga; + } while (1.0 - 0.5*x*x < G4UniformRand()); + } else { + do { + loss = G4RandGauss::shoot(meanLoss,siga); + } while (0.0 > loss || loss > twomeanLoss); + } // Poisson fluctuations } else { G4double n = (G4double)(G4Poisson(navr)); loss = meanLoss*n/navr; } + return loss; } diff --git a/source/processes/electromagnetic/utils/src/G4EmModelManager.cc b/source/processes/electromagnetic/utils/src/G4EmModelManager.cc index 78f380e2da..910a84736e 100644 --- a/source/processes/electromagnetic/utils/src/G4EmModelManager.cc +++ b/source/processes/electromagnetic/utils/src/G4EmModelManager.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4EmModelManager.cc,v 1.22 2004/01/27 11:21:07 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4EmModelManager.cc,v 1.23 2004/05/10 18:45:33 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -321,7 +321,7 @@ const G4DataVector* G4EmModelManager::Initialise(const G4ParticleDefinition* p, if(0 < verboseLevel) { G4cout << "New G4RegionModels set with " << n << " models for region <" - << region->GetName() << "> Elow(MeV)= "; + << region->GetName() << "> Elow(MeV)= "; for(G4int ii=0; iiGetName() << " indexOfCouple= " << i - << " indexOfRegion= " << reg - << " indexOfRegion= " << reg + << " indexOfRegion= " << reg << G4endl; } diff --git a/source/processes/electromagnetic/utils/src/G4EmMultiModel.cc b/source/processes/electromagnetic/utils/src/G4EmMultiModel.cc new file mode 100644 index 0000000000..40e64b1f38 --- /dev/null +++ b/source/processes/electromagnetic/utils/src/G4EmMultiModel.cc @@ -0,0 +1,293 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: G4EmMultiModel.cc,v 1.1 2004/05/03 13:13:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ------------------------------------------------------------------- +// +// GEANT4 Class file +// +// +// File name: G4EmMultiModel +// +// Author: Vladimir Ivanchenko +// +// Creation date: 03.05.2004 +// +// Modifications: +// + +// Class Description: +// +// Energy loss model using several G4VEmModels + +// ------------------------------------------------------------------- +// + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +#include "G4EmMultiModel.hh" +#include "Randomize.hh" + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4EmMultiModel::G4EmMultiModel(const G4String& nam) + : G4VEmModel(nam), + nModels(0) +{ + highKinEnergy = 100.0*GeV; + lowKinEnergy = 0.1*keV; + model.clear(); + tsecmin.clear(); + cross_section.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4EmMultiModel::~G4EmMultiModel() +{ + if(nModels) { + for(G4int i=0; iInitialise(p, cuts); + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4EmMultiModel::MinEnergyCut(const G4ParticleDefinition* p, + const G4MaterialCutsCouple* couple) +{ + G4double cut = DBL_MAX; + if(nModels) { + cut = (model[0])->MinEnergyCut(p, couple); + } + return cut; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4bool G4EmMultiModel::IsInCharge(const G4ParticleDefinition* p) +{ + G4bool yes = true; + if(nModels) { + for(G4int i=0; iIsInCharge(p); + if( !x ) yes = false; + } + } + return yes; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4EmMultiModel::ComputeDEDX(const G4MaterialCutsCouple* couple, + const G4ParticleDefinition* p, + G4double kineticEnergy, + G4double cutEnergy) +{ + G4double dedx = 0.0; + + if(nModels) { + dedx = (model[0])->ComputeDEDX(couple, p, cutEnergy, kineticEnergy); + } + + return dedx; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4EmMultiModel::CrossSection(const G4MaterialCutsCouple* couple, + const G4ParticleDefinition* p, + G4double kineticEnergy, + G4double cutEnergy, + G4double maxKinEnergy) +{ + G4double cross = 0.0; + G4double t1 = cutEnergy; + G4double t2 = cutEnergy; + if(nModels) { + for(G4int i=0; iCrossSection(couple, p, kineticEnergy, t1, t2); + } + } + return cross; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4DynamicParticle* G4EmMultiModel::SampleSecondary( + const G4MaterialCutsCouple*, + const G4DynamicParticle*, + G4double, + G4double) +{ + return 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +std::vector* G4EmMultiModel::SampleSecondaries( + const G4MaterialCutsCouple* couple, + const G4DynamicParticle* dp, + G4double tmin, + G4double maxEnergy) +{ + std::vector* vdp = 0; + + if(nModels) { + G4int i; + G4double cross = 0.0; + G4double t1 = tmin; + G4double t2 = tmin; + for(i=0; iCrossSection(couple, dp->GetDefinition(), + dp->GetKineticEnergy(), t1, t2); + cross_section[i] = cross; + } + + cross *= G4UniformRand(); + t2 = tmin; + + for(i=0; iSampleSecondaries(couple, dp, t1, t2); + break; + } + } + } + + return vdp; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4EmMultiModel:: MaxSecondaryEnergy(const G4DynamicParticle* dp) +{ + G4double tmax = 0.0; + if(nModels) { + tmax = (model[0])-> MaxSecondaryEnergy(dp); + } + return tmax; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4EmMultiModel:: MaxSecondaryEnergy(const G4ParticleDefinition*, + G4double kinEnergy) +{ + G4cout << "Warning! G4EmMultiModel::" + << "MaxSecondaryEnergy(const G4ParticleDefinition*,G4double kinEnergy)" + << " should not be used!" << G4endl; + return kinEnergy; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4EmMultiModel::DefineForRegion(const G4Region* r) +{ + if(nModels) { + for(G4int i=0; iDefineForRegion(r);} + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4EmMultiModel::SetDynamicParticle(const G4DynamicParticle* dp) +{ + if(nModels) { + for(G4int i=0; iSetDynamicParticle(dp);} + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4EmMultiModel::AddModel(G4VEmModel* p, G4double tmin, G4double tmax) +{ + if(tmin < tmax && 0.0 < tmin) { + + if(nModels == 0) { + tsecmin.push_back(tmin); + tsecmin.push_back(tmax); + cross_section.push_back(0.0); + model.push_back(p); + nModels++; + + } else { + G4int i, j; + G4bool increment = false; + for(i=0; ii; j--) { + model[j] = model[j-1]; + tsecmin[j+1] = tsecmin[j]; + } + model[i] = p; + tsecmin[i+1] = t2; + tsecmin[i] = tmin; + increment = true; + } + } else if(i == nModels-1) { + G4double t1 = std::min(tsecmin[i+1],tmin); + G4double t2 = std::max(tsecmin[i+1],tmax); + if(t1 < t2) { + tsecmin.push_back(t2); + cross_section.push_back(0.0); + model.push_back(p); + increment = true; + } + } + } + if(increment) nModels++; + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/source/processes/electromagnetic/utils/src/G4EmProcessOptions.cc b/source/processes/electromagnetic/utils/src/G4EmProcessOptions.cc index 1caa7ee896..f86885ce54 100644 --- a/source/processes/electromagnetic/utils/src/G4EmProcessOptions.cc +++ b/source/processes/electromagnetic/utils/src/G4EmProcessOptions.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4EmProcessOptions.cc,v 1.1 2004/02/27 17:59:06 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4EmProcessOptions.cc,v 1.2 2004/05/17 09:46:56 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -48,6 +48,7 @@ #include "G4VEmProcess.hh" #include "G4VEnergyLossProcess.hh" #include "G4VMultipleScattering.hh" +#include "G4Region.hh" //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -341,3 +342,63 @@ void G4EmProcessOptions::SetVerbose(G4int val, const G4String& name) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... +void G4EmProcessOptions::SetLambdaFactor(G4double val) +{ + const std::vector& v = + theManager->GetEnergyLossProcessVector(); + std::vector::const_iterator itr; + for(itr = v.begin(); itr != v.end(); itr++) { + G4VEnergyLossProcess* p = *itr; + if(p) p->SetLambdaFactor(val); + } + const std::vector& w = + theManager->GetEmProcessVector(); + std::vector::const_iterator itp; + for(itp = w.begin(); itp != w.end(); itp++) { + G4VEmProcess* q = *itp; + if(q) q->SetLambdaFactor(val); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4EmProcessOptions::ActivateFluorescence(G4bool val, const G4Region* r) +{ + const std::vector& v = + theManager->GetEnergyLossProcessVector(); + std::vector::const_iterator itr; + for(itr = v.begin(); itr != v.end(); itr++) { + G4VEnergyLossProcess* p = *itr; + if(p) p->ActivateFluorescence(val,r); + } + const std::vector& w = + theManager->GetEmProcessVector(); + std::vector::const_iterator itp; + for(itp = w.begin(); itp != w.end(); itp++) { + G4VEmProcess* q = *itp; + if(q) q->ActivateFluorescence(val,r); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4EmProcessOptions::ActivateAugerElectronProduction(G4bool val, const G4Region* r) +{ + const std::vector& v = + theManager->GetEnergyLossProcessVector(); + std::vector::const_iterator itr; + for(itr = v.begin(); itr != v.end(); itr++) { + G4VEnergyLossProcess* p = *itr; + if(p) p->ActivateAugerElectronProduction(val,r); + } + const std::vector& w = + theManager->GetEmProcessVector(); + std::vector::const_iterator itp; + for(itp = w.begin(); itp != w.end(); itp++) { + G4VEmProcess* q = *itp; + if(q) q->ActivateAugerElectronProduction(val,r); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + diff --git a/source/processes/electromagnetic/utils/src/G4IonFluctuations.cc b/source/processes/electromagnetic/utils/src/G4IonFluctuations.cc index 054b1e2235..ff9da8a239 100644 --- a/source/processes/electromagnetic/utils/src/G4IonFluctuations.cc +++ b/source/processes/electromagnetic/utils/src/G4IonFluctuations.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4IonFluctuations.cc,v 1.8 2003/11/12 10:24:18 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4IonFluctuations.cc,v 1.9 2004/05/11 15:35:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -66,7 +66,7 @@ G4IonFluctuations::G4IonFluctuations(const G4String& nam) theBohrBeta2(50.0*keV/proton_mass_c2), minFraction(0.2), xmin(0.2), - minLoss(0.000001*eV) + minLoss(0.001*eV) {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -99,13 +99,11 @@ G4double G4IonFluctuations::SampleFluctuations(const G4Material* material, particle = dp->GetDefinition(); charge = particle->GetPDGCharge()/eplus; } - particleMass = dp->GetMass(); - G4double q = dp->GetCharge()/eplus; - chargeSquare = q*q; - chargeSqRatio = chargeSquare/(charge*charge); G4double siga = Dispersion(material,dp,tmax,length); G4double loss = meanLoss; + + G4double navr = minNumberInteractionsBohr; // Gaussian fluctuation @@ -141,6 +139,7 @@ G4double G4IonFluctuations::SampleFluctuations(const G4Material* material, G4double n = (G4double)(G4Poisson(navr)); loss = meanLoss*n/navr; } + // G4cout << "meanLoss= " << meanLoss << " loss= " << loss << G4endl; return loss; } @@ -153,6 +152,11 @@ G4double G4IonFluctuations::Dispersion( G4double& tmax, G4double& length) { + particleMass = dp->GetMass(); + G4double q = dp->GetCharge()/eplus; + chargeSquare = q*q; + chargeSqRatio = chargeSquare/(charge*charge); + G4double electronDensity = material->GetElectronDensity(); kineticEnergy = dp->GetKineticEnergy(); // G4cout << "e= " << kineticEnergy << " m= " << particleMass diff --git a/source/processes/electromagnetic/utils/src/G4LossTableManager.cc b/source/processes/electromagnetic/utils/src/G4LossTableManager.cc index 6e128ff908..da7df8eead 100644 --- a/source/processes/electromagnetic/utils/src/G4LossTableManager.cc +++ b/source/processes/electromagnetic/utils/src/G4LossTableManager.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4LossTableManager.cc,v 1.42 2004/03/10 11:34:52 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4LossTableManager.cc,v 1.44 2004/05/12 12:25:26 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -364,7 +364,7 @@ void G4LossTableManager::BuildPhysicsTable(const G4ParticleDefinition* aParticle G4VEnergyLossProcess* em = loss_vector[j]; em->Initialise(); em->SetDEDXTable(hIonisation->DEDXTable()); - em->SetRangeTable(hIonisation->RangeTable()); + em->SetPreciseRangeTable(hIonisation->PreciseRangeTable()); em->SetRangeTableForLoss(hIonisation->RangeTableForLoss()); em->SetInverseRangeTable(hIonisation->InverseRangeTable()); em->SetLambdaTable(hIonisation->LambdaTable()); @@ -390,7 +390,7 @@ void G4LossTableManager::BuildPhysicsTable(const G4ParticleDefinition* aParticle tables_are_built[i] = true; em->Initialise(); em->SetDEDXTable(hIonisation->DEDXTable()); - em->SetRangeTable(hIonisation->RangeTable()); + em->SetPreciseRangeTable(hIonisation->PreciseRangeTable()); em->SetRangeTableForLoss(hIonisation->RangeTableForLoss()); em->SetInverseRangeTable(hIonisation->InverseRangeTable()); em->SetLambdaTable(hIonisation->LambdaTable()); @@ -479,7 +479,7 @@ void G4LossTableManager::RetrievePhysicsTables(const G4ParticleDefinition* aPart tables_are_built[j] = true; em->Initialise(); em->SetDEDXTable(theLoss->DEDXTable()); - em->SetRangeTable(theLoss->RangeTable()); + em->SetPreciseRangeTable(theLoss->PreciseRangeTable()); em->SetRangeTableForLoss(theLoss->RangeTableForLoss()); em->SetInverseRangeTable(theLoss->InverseRangeTable()); em->SetLambdaTable(theLoss->LambdaTable()); @@ -606,7 +606,7 @@ G4VEnergyLossProcess* G4LossTableManager::BuildTables(const G4ParticleDefinition } newlist.clear(); range = tableBuilder->BuildRangeTable(dedxForRange); - em->SetRangeTable(range); + em->SetPreciseRangeTable(range); delete dedxForRange; } diff --git a/source/processes/electromagnetic/utils/src/G4MscModel.cc b/source/processes/electromagnetic/utils/src/G4MscModel.cc index 9aa4afb04e..4247699d13 100644 --- a/source/processes/electromagnetic/utils/src/G4MscModel.cc +++ b/source/processes/electromagnetic/utils/src/G4MscModel.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MscModel.cc,v 1.15 2004/03/10 08:38:39 urban Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4MscModel.cc,v 1.17 2004/04/29 18:40:54 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -56,6 +56,8 @@ // energy dependence calculations has been simplified, // 11-03-04 corrections in GeomPathLength,TrueStepLength, // SampleCosineTheta +// 23-04-04 true -> geom and geom -> true transformation has been +// rewritten, changes in the angular distribution (L.Urban) // Class Description: // @@ -114,12 +116,16 @@ void G4MscModel::Initialise(const G4ParticleDefinition* p, const G4DataVector&) { // set values of some data members - xsi = facxsi*2.8215 ; - b = 1. ; sigmafactor = twopi*classic_electr_radius*classic_electr_radius; particle = p; mass = particle->GetPDGMass(); charge = particle->GetPDGCharge()/eplus; + b = 1. ; + + if(mass <= electron_mass_c2) + xsi = facxsi*2.22 ; + else + xsi = facxsi*2.70 ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -418,7 +424,8 @@ G4double G4MscModel::GeomPathLength( currentRadLength = couple->GetMaterial()->GetRadlen(); lambda0 = lambda; - parlowen = 0. ; + par1 = -1. ; + par2 = par3 = 0. ; tPathLength = truePathLength; // this correction needed to run MSC with eIoni and eBrem inactivated @@ -434,9 +441,11 @@ G4double G4MscModel::GeomPathLength( if (tPathLength < range*dtrl) { zmean = lambda0*(1.-exp(-tau)); if(tau < taulim) zmean = tPathLength*(1.-0.5*tPathLength/lambda0) ; - } else if((T0 < mass) || (tPathLength > 0.9*range)) { - parlowen = 1.+range/lambda0 ; - zmean = range*(1.-exp(parlowen*log(1.-tPathLength/range)))/parlowen ; + } else if(T0 < mass) { + par1 = 1./range ; + par2 = 1./(par1*lambda0) ; + par3 = 1.+par2 ; + zmean = (1.-exp(par3*log(1.-tPathLength/range)))/(par1*par3) ; } else { G4LossTableManager* theManager = G4LossTableManager::Instance(); G4double T1 = theManager->GetEnergy(particle,range-tPathLength,couple); @@ -447,9 +456,10 @@ G4double G4MscModel::GeomPathLength( } else { lambda1 = CrossSection(couple,particle,T1,0.0,1.0); } - - G4double lambdaeff = 2./(1./lambda0+1./lambda1) ; - zmean = lambdaeff*(1.-exp(-tPathLength/lambdaeff)); + par1 = (lambda0-lambda1)/(lambda0*tPathLength) ; + par2 = 1./(par1*lambda0) ; + par3 = 1.+par2 ; + zmean = (1.-exp(par3*log(lambda1/lambda0)))/(par1*par3) ; } // sample z @@ -479,85 +489,108 @@ G4double G4MscModel::TrueStepLength(G4double geomStepLength) trueLength = geomStepLength; if(geomStepLength > lambda0*tausmall) { - if(parlowen == 0.) + if(par1 < 0.) trueLength = -lambda0*log(1.-geomStepLength/lambda0) ; else { - if(parlowen*geomStepLength/currentRange < 1.) - trueLength = currentRange* - (1.-exp(log(1.-parlowen*geomStepLength/currentRange)/parlowen)) ; + if(par1*par3*geomStepLength < 1.) + trueLength = (1.-exp(log(1.-par1*par3*geomStepLength)/par3))/par1 ; else trueLength = currentRange ; } } + if(trueLength > tPathLength) trueLength = tPathLength; - if(trueLength < geomStepLength) trueLength = geomStepLength; if(trueLength > currentRange) trueLength = currentRange ; + if(trueLength < geomStepLength) trueLength = geomStepLength; return trueLength; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -G4double G4MscModel::SampleCosineTheta(G4double trueStepLength, G4double KineticEnergy, - G4double lambda) +G4double G4MscModel::SampleCosineTheta(G4double trueStepLength, + G4double KineticEnergy) { - currentKinEnergy = sqrt(currentKinEnergy*KineticEnergy) ; - G4double cth = 1. ; + G4double tau = trueStepLength/lambda0 ; - if(trueStepLength < currentRange*dtrl) - currentTau = trueStepLength/lambda; - else - currentTau = 0.5*trueStepLength*(1./lambda0+1./lambda) ; + if(trueStepLength >= currentRange*dtrl) + tau = -par2*log(1.-par1*trueStepLength) ; + + currentTau = tau ; if(trueStepLength < stepmin) - cth = exp(-currentTau) ; + cth = exp(-tau) ; else { - if (currentTau > taubig) cth = -1.+2.*G4UniformRand(); - else if (currentTau >= tausmall) + if (tau > taubig) cth = -1.+2.*G4UniformRand(); + else if (tau >= tausmall) { - if(currentTau > taubig) cth = -1.+2.*G4UniformRand(); - else - { - const G4double c_highland = 13.6*MeV, corr_highland=0.038 ; - const G4double xx0low = 1.e-6; - G4double a ; // for all particles take the width of the central part // from the Highland formula // (Particle Physics Booklet, July 2002, eq. 26.10) + const G4double c_highland = 13.6*MeV, corr_highland=0.038 ; G4double Q = abs(charge) ; G4double xx0 = trueStepLength/currentRadLength; - G4double betacp = currentKinEnergy*(currentKinEnergy+2.*mass)/ - (currentKinEnergy+mass) ; + G4double betacp = sqrt(currentKinEnergy*(currentKinEnergy+2.*mass)* + KineticEnergy*(KineticEnergy+2.*mass)/ + ((currentKinEnergy+mass)*(KineticEnergy+mass))) ; G4double theta0 = c_highland*Q*sqrt(xx0)/betacp ; - if(xx0 > xx0low) - theta0 *= (1.+corr_highland*log(xx0)) ; - else - // protection for small thickness - theta0 *= (1.+corr_highland*log(xx0low)) ; + // correction term + G4double y ; + // for muons/hadron as in Highland's formula + if(mass > electron_mass_c2) + { + y = log(xx0) ; + theta0 *= (1.+corr_highland*y) ; + } + // for e+/e- + else + { + // corr. factor has been modified between xx0low and xx0high + // and below xx0low for e+/e- only ************************ + const G4double xx0high = 1., xx0low = 1.e-3 ; + // quadratic corr.factor from Hanson's msc data (Au, 15.7 MeV e) + const G4double corrq1 = 0.01273, corrq2 = -0.006840 ; + const G4double corrlow = 0.05 ; // from some backscattering data + const G4double fach = 1.+corr_highland*log(xx0high), + facl = fach*(1.+log(xx0low/xx0high)* + (corrq1+log(xx0low/xx0high)*corrq2)) ; + if(xx0 >= xx0high) + { + y = log(xx0) ; + theta0 *= (1.+corr_highland*y) ; + } + else if(xx0 >= xx0low) + { + y = log(xx0/xx0high) ; + theta0 *= fach*(1.+y*(corrq1+y*corrq2)) ; + } + else + { + y = log(xx0/xx0low) ; + theta0 *= facl*(1.+corrlow*y) ; + } + } - if (theta0 > taulim) a = 0.5/(1.-cos(theta0)) ; - else a = 1.0/(theta0*theta0) ; + if(theta0 > taulim) a = 0.5/(1.-cos(theta0)) ; + else a = 1.0/(theta0*theta0) ; - G4double xmeanth = exp(-currentTau); + G4double xmeanth = exp(-tau); G4double xmeanth1 = 1.-xmeanth ; - if(currentTau < taulim) xmeanth1 = currentTau ; + if(currentTau < taulim) xmeanth1 = tau ; const G4double x1fac1 = exp(-xsi) ; const G4double x1fac2 = (1.-(1.+xsi)*x1fac1)/(1.-x1fac1) ; - const G4double x1fac3 = 1.3 ; // x1fac3 >= 1. !!!!!!!!! - - // exponent c is fixed to 2. in f2(x) now (tail) ~1/(b-x)**2 - const G4double wb = 1.-2./xsi ; + const G4double x1fac3 = 1.3 ; G4double ea,eaa,xmean1 ; - G4double b1 = 2., bx = 2., - xmean2 = 0. ; + G4double c = 2.,b1 = 2., bx = 2., + eb1 = b1, ebx = b1, xmean2 = 0. ; G4double prob = 1., qprob ; G4double x0 = 1.-xsi/a; G4double oneminusx0=xsi/a ; @@ -596,16 +629,21 @@ G4double G4MscModel::SampleCosineTheta(G4double trueStepLength, G4double Kinetic eaa = 1.-ea ; xmean1 = 1.-x1fac2/a ; - b = 1.-wb*xsi/a ; + // from continuity of the 1st derivatives + c = a*(b-x0) ; + + if(c == 1.) c=1.000001 ; + if(c == 2.) c=2.000001 ; b1 = b+1. ; - bx = (1.-wb)*xsi/a ; - - xmean2 = b-b1*bx*log(b1/bx)/oneplusx0 ; + bx = b-x0 ; + eb1=exp((c-1.)*log(b1)) ; + ebx=exp((c-1.)*log(bx)) ; + xmean2 = (x0*eb1+ebx+(eb1*bx-b1*ebx)/(2.-c))/(eb1-ebx) ; G4double f1x0 = a*ea/eaa ; - G4double f2x0 ; - f2x0 = b1/(oneplusx0*bx) ; + G4double f2x0 = (c-1.)*eb1*ebx/(eb1-ebx)/ + exp(c*log(b-x0)) ; // from continuity at x=x0 prob = f2x0/(f1x0+f2x0) ; // from xmean = xmeanth @@ -625,13 +663,12 @@ G4double G4MscModel::SampleCosineTheta(G4double trueStepLength, G4double Kinetic if (G4UniformRand() < prob) cth = 1.+log(ea+G4UniformRand()*eaa)/a ; else - cth = b-b1*bx/(bx+oneplusx0*G4UniformRand()) ; + cth = b-b1*bx/exp(log(ebx-G4UniformRand()*(ebx-eb1))/(c-1.)) ; } else { cth = -1.+2.*G4UniformRand(); } - } } } diff --git a/source/processes/electromagnetic/utils/src/G4MultipleScattering.cc b/source/processes/electromagnetic/utils/src/G4MultipleScattering.cc index 59442c6192..189d180493 100644 --- a/source/processes/electromagnetic/utils/src/G4MultipleScattering.cc +++ b/source/processes/electromagnetic/utils/src/G4MultipleScattering.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4MultipleScattering.cc,v 1.46 2003/11/12 16:11:56 urban Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4MultipleScattering.cc,v 1.47 2004/04/23 05:52:08 urban Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ----------------------------------------------------------------------------- // 16/05/01 value of cparm changed , L.Urban @@ -60,6 +60,7 @@ // method // 28-03-03 Move to model design (V.Ivanchenko) // 08-08-03 STD substitute standard (V.Ivanchenko) +// 23-04-04 value of data member dtrl changed from 0.15 to 0.05 (L.Urban) // // ----------------------------------------------------------------------------- // @@ -75,7 +76,7 @@ G4MultipleScattering::G4MultipleScattering(const G4String& processName) : G4VMultipleScattering(processName), totBins(120), facrange(0.199), - dtrl(0.15), + dtrl(0.05), NuclCorrPar (0.0615), FactPar(0.40), facxsi(1.0), diff --git a/source/processes/electromagnetic/utils/src/G4UniversalFluctuation.cc b/source/processes/electromagnetic/utils/src/G4UniversalFluctuation.cc index 25024e2a53..0d1894b480 100644 --- a/source/processes/electromagnetic/utils/src/G4UniversalFluctuation.cc +++ b/source/processes/electromagnetic/utils/src/G4UniversalFluctuation.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4UniversalFluctuation.cc,v 1.15 2004/02/06 11:59:21 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4UniversalFluctuation.cc,v 1.20 2004/05/11 15:35:07 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -42,6 +42,7 @@ // 16-10-03 Changed interface to Initialisation (V.Ivanchenko) // 07-11-03 Fix problem of rounding of double in G4UniversalFluctuations // 06-02-04 Add control on big sigma > 2*meanLoss (V.Ivanchenko) +// 26-04-04 Comment out the case of very small step (V.Ivanchenko) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -61,14 +62,13 @@ G4UniversalFluctuation::G4UniversalFluctuation(const G4String& nam) particle(0), minNumberInteractionsBohr(10.0), theBohrBeta2(50.0*keV/proton_mass_c2), - minLoss(0.000001*eV), - problim(0.01), + minLoss(0.001*eV), + sumalim(0.01), alim(10.), nmaxCont1(4.), nmaxCont2(16.) { lastMaterial = 0; - sumalim = -log(problim); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... @@ -97,46 +97,48 @@ G4double G4UniversalFluctuation::SampleFluctuations(const G4Material* material, // calculate actual loss from the mean loss // The model used to get the fluctuation is essentially the same // as in Glandz in Geant3. - - // shortcut for very very small loss +// G4cout << "### Mean loss= " << meanLoss << G4endl; + + // shortcut for very very small loss if(meanLoss < minLoss) return meanLoss; - if(dp->GetDefinition() != particle) { - particleMass = dp->GetMass(); - G4double q = dp->GetCharge(); - chargeSquare = q*q; - } + if(!particle) InitialiseMe(dp->GetDefinition()); ipotFluct = material->GetIonisation()->GetMeanExcitationEnergy(); - G4double gam = (dp->GetKineticEnergy())/particleMass + 1.0; - G4double gam2 = gam*gam; - G4double beta2 = 1.0 - 1.0/gam2; - + G4double tau = dp->GetKineticEnergy()/particleMass; + G4double gam = tau + 1.0; + G4double gam2 = gam*gam; + G4double beta2 = tau*(tau + 2.0)/gam2; + // Validity range for delta electron cross section G4double loss, siga; - // G4cout << "### tmax= " << tmax << " kappa= " << minNumberInteractionsBohr << " l= " << length << G4endl; - // Gaussian fluctuation + // G4cout << "tmax= " << tmax << " kappa= " << minNumberInteractionsBohr << " l= " << length << G4endl; + // Gaussian fluctuation if(meanLoss >= minNumberInteractionsBohr*tmax || tmax <= ipotFluct*minNumberInteractionsBohr) { electronDensity = material->GetElectronDensity(); - siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length + siga = (1.0/beta2 - 0.5) * twopi_mc2_rcl2 * tmax * length * electronDensity * chargeSquare ; siga = sqrt(siga); G4double twomeanLoss = meanLoss + meanLoss; if(twomeanLoss < siga) { - loss = twomeanLoss*G4UniformRand(); + G4double x; + do { + loss = twomeanLoss*G4UniformRand(); + x = (loss - meanLoss)/siga; + } while (1.0 - 0.5*x*x < G4UniformRand()); } else { do { loss = G4RandGauss::shoot(meanLoss,siga); } while (loss < 0. || loss > twomeanLoss); } - // G4cout << "de= " << meanLoss << " fluc= " << loss-meanLoss << " sig= " << siga << G4endl; + //G4cout << "### meanLoss= " << meanLoss << " fluc= " << loss-meanLoss << " sig= " << siga << G4endl; return loss; } - // Non Gaussian fluctuation + // Non Gaussian fluctuation if(material != lastMaterial) { f1Fluct = material->GetIonisation()->GetF1fluct(); @@ -153,7 +155,7 @@ G4double G4UniversalFluctuation::SampleFluctuations(const G4Material* material, G4double p1,p2,p3; G4double w1 = tmax/ipotFluct; - G4double w2 = log(2.*electron_mass_c2*(gam2 - 1.0)); + G4double w2 = log(2.*electron_mass_c2*beta2*gam2); G4double C = meanLoss*(1.-rateFluct)/(w2-ipotLogFluct-beta2); @@ -165,11 +167,11 @@ G4double G4UniversalFluctuation::SampleFluctuations(const G4Material* material, if(a3 < 0.) a3 = 0.; G4double suma = a1+a2+a3; - loss = 0. ; - + if(suma < sumalim) // very small Step { + //G4cout << "A very small step" << G4endl; G4double e0 = material->GetIonisation()->GetEnergy0fluct(); if(tmax == ipotFluct) @@ -209,11 +211,12 @@ G4double G4UniversalFluctuation::SampleFluctuations(const G4Material* material, for(G4int i=0; iclearAndDestroy(); if(theLambdaTable) theLambdaTable->clearAndDestroy(); if(theSubLambdaTable) theSubLambdaTable->clearAndDestroy(); - if(theDEDXAtMaxEnergy) delete [] theDEDXAtMaxEnergy; - if(theRangeAtMaxEnergy) delete [] theRangeAtMaxEnergy; } + if(theDEDXAtMaxEnergy) delete [] theDEDXAtMaxEnergy; + if(theRangeAtMaxEnergy) delete [] theRangeAtMaxEnergy; + if(theEnergyOfCrossSectionMax) delete [] theEnergyOfCrossSectionMax; + if(theCrossSectionMax) delete [] theCrossSectionMax; theDEDXTable = 0; thePreciseRangeTable = 0; @@ -205,6 +214,8 @@ void G4VEnergyLossProcess::Clear() theSubLambdaTable = 0; theDEDXAtMaxEnergy = 0; theRangeAtMaxEnergy = 0; + theEnergyOfCrossSectionMax = 0, + theCrossSectionMax = 0, tablesAreBuilt = false; } @@ -286,6 +297,7 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) { currentCouple = 0; preStepLambda = 0.0; + preStepMFP = DBL_MAX; if(0 < verboseLevel) { G4cout << "========================================================" << G4endl; G4cout << "### G4VEnergyLossProcess::BuildPhysicsTable() for " @@ -333,30 +345,6 @@ void G4VEnergyLossProcess::BuildPhysicsTable(const G4ParticleDefinition& part) //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void G4VEnergyLossProcess::SetParticles(const G4ParticleDefinition* p1, - const G4ParticleDefinition* p2) -{ - particle = p1; - baseParticle = p2; - G4bool yes = true; - if(particle && baseParticle) { - if((particle->GetPDGMass() < MeV && baseParticle->GetPDGMass() > MeV) || - (particle->GetPDGMass() > MeV && baseParticle->GetPDGMass() < MeV)) yes = false; - - } - if(!yes) { - G4cout << "Warning in G4VEnergyLossProcess::SetParticle: " - << particle->GetParticleName() - << " losses cannot be obtained from " - << baseParticle->GetParticleName() - << " losses" << G4endl; - } else { - DefineBaseParticle(p1); - } -} - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... - void G4VEnergyLossProcess::AddEmModel(G4int order, G4VEmModel* p, G4VEmFluctuationModel* fluc, const G4Region* region) { @@ -373,10 +361,11 @@ void G4VEnergyLossProcess::UpdateEmModel(const G4String& nam, G4double emin, G4d //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4VEnergyLossProcess::AddSubCutoffProcessor(G4VSubCutoffProcessor* p, - const G4Region* r) + const G4Region* r) { if( !p ) { - G4cout << "G4VEnergyLossProcess::AddSubCutoffProcessor WARNING: no SubCutoffProcessor defined." << G4endl; + G4cout << "G4VEnergyLossProcess::AddSubCutoffProcessor WARNING: no SubCutoffProcessor defined." + << G4endl; return; } G4RegionStore* regionStore = G4RegionStore::GetInstance(); @@ -594,7 +583,6 @@ G4VParticleChange* G4VEnergyLossProcess::AlongStepDoIt(const G4Track& track, // Get the actual (true) Step length G4double length = step.GetStepLength(); G4double eloss = 0.0; -// G4bool b; /* if(-1 < verboseLevel) { @@ -620,24 +608,18 @@ G4VParticleChange* G4VEnergyLossProcess::AlongStepDoIt(const G4Track& track, // Long step } else { - G4double x = (GetRangeForLoss(preStepKinEnergy) - length)/reduceFactor; - G4double postStepScaledEnergy = GetKineticEnergyForLoss(x); - - if (preStepScaledEnergy > postStepScaledEnergy) - eloss = (preStepScaledEnergy - postStepScaledEnergy)/massRatio; - else - eloss = GetDEDXForLoss(preStepKinEnergy)*length; + G4double r = GetRangeForLoss(preStepKinEnergy)/reduceFactor; + G4double x = r - length/reduceFactor; + eloss = (ScaledKinEnergyForLoss(r) - ScaledKinEnergyForLoss(x))/massRatio; /* if(-1 < verboseLevel) { G4bool b; - G4cout << "fRange(mm)= " << fRange/mm - << " xPost(mm)= " << x/mm + G4cout << "rPre(mm)= " << r/mm + << " rPost(mm)= " << x/mm << " ePre(MeV)= " << preStepScaledEnergy/MeV - << " ePost(MeV)= " << postStepScaledEnergy/MeV << " eloss(MeV)= " << eloss/MeV - << " eloss0(MeV)= " << (((*theDEDXTable)[currentMaterialIndex])-> - GetValue(preStepScaledEnergy, b))*length*chargeSqRatio + << " eloss0(MeV)= " << GetDEDXForLoss(preStepKinEnergy)*length/MeV << G4endl; } */ @@ -654,17 +636,12 @@ G4VParticleChange* G4VEnergyLossProcess::AlongStepDoIt(const G4Track& track, G4bool b; //G4cout << *theDEDXTable << G4endl; G4cout << "eloss(MeV)= " << eloss/MeV - << " eloss0(MeV)= " << (((*theDEDXTable)[currentMaterialIndex])-> - GetValue(preStepScaledEnergy, b))*length*chargeSqRatio - << " r0(mm)= " << (((*theRangeTableForLoss)[currentMaterialIndex])-> - GetValue(preStepScaledEnergy, b)) + << " eloss0(MeV)= " << GetDEDXForLoss(preStepKinEnergy)*length + << " r0(mm)= " << GetRangeForLoss(preStepKinEnergy) << " tmax= " << tmax << " e-eloss= " << preStepKinEnergy-eloss - // << " mat= " << currentMaterial - // << " matIdx= " << currentMaterialIndex // << " preCouple= " << (step.GetPreStepPoint())->GetMaterialCutsCouple() // << " postCouple= " << (step.GetPostStepPoint())->GetMaterialCutsCouple() - // << " rangeTable= " << theRangeTableForLoss << G4endl; } */ @@ -687,6 +664,21 @@ G4VParticleChange* G4VEnergyLossProcess::AlongStepDoIt(const G4Track& track, } */ + + G4double finalT = preStepKinEnergy - eloss; + + if (finalT <= lowestKinEnergy) { + + finalT = 0.0; + + if (hasRestProcess) fParticleChange.SetStatusChange(fStopButAlive); + else fParticleChange.SetStatusChange(fStopAndKill); + } + + eloss = preStepKinEnergy-finalT; + + fParticleChange.SetProposedKineticEnergy(finalT); + // Subcutoff and/or deexcitation std::vector* newp = SecondariesAlongStep(step, tmax, eloss, preStepScaledEnergy); @@ -702,36 +694,26 @@ G4VParticleChange* G4VEnergyLossProcess::AlongStepDoIt(const G4Track& track, t = (*newp)[i]; e = t->GetKineticEnergy(); const G4ParticleDefinition* pd = t->GetDefinition(); - if (pd != G4Gamma::Gamma() && pd != G4Electron::Electron() ) e += pd->GetPDGMass(); + if (pd != G4Positron::Positron() ) e += electron_mass_c2; + if (e > eloss) e = eloss; - preStepKinEnergy -= e; + eloss -= e; pParticleChange->AddSecondary(t); } } delete newp; } - preStepKinEnergy -= eloss; - /* if(-1 < verboseLevel) { - G4cout << "eloss(MeV)= " << eloss/MeV + G4cout << "Final value eloss(MeV)= " << eloss/MeV << " preStepKinEnergy= " << preStepKinEnergy + << " postStepKinEnergy= " << finalT << " lossFlag= " << lossFluctuationFlag << G4endl; } */ - if (preStepKinEnergy <= lowestKinEnergy) { - - eloss += preStepKinEnergy; - preStepKinEnergy = 0.0; - - if (hasRestProcess) fParticleChange.SetStatusChange(fStopButAlive); - else fParticleChange.SetStatusChange(fStopAndKill); - } - - fParticleChange.SetProposedKineticEnergy(preStepKinEnergy); fParticleChange.SetLocalEnergyDeposit(eloss); return &fParticleChange; @@ -748,11 +730,7 @@ G4VParticleChange* G4VEnergyLossProcess::PostStepDoIt(const G4Track& track, // Integral approach if (integral) { - G4bool b; - G4double postStepLambda = chargeSqRatio* - (((*theLambdaTable)[currentMaterialIndex])->GetValue(postStepScaledEnergy,b)); - - if(preStepLambda*G4UniformRand() > postStepLambda) + if(preStepLambda*G4UniformRand() > GetLambda(postStepScaledEnergy)) return G4VContinuousDiscreteProcess::PostStepDoIt(track,step); } @@ -837,15 +815,15 @@ void G4VEnergyLossProcess::PrintInfoDefinition() void G4VEnergyLossProcess::SetDEDXTable(G4PhysicsTable* p) { - if(theDEDXTable) theDEDXTable->clearAndDestroy(); + if(theDEDXTable && !baseParticle) theDEDXTable->clearAndDestroy(); theDEDXTable = p; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... -void G4VEnergyLossProcess::SetRangeTable(G4PhysicsTable* p) +void G4VEnergyLossProcess::SetPreciseRangeTable(G4PhysicsTable* p) { - if(thePreciseRangeTable) thePreciseRangeTable->clearAndDestroy(); + if(thePreciseRangeTable && !baseParticle) thePreciseRangeTable->clearAndDestroy(); if(theDEDXAtMaxEnergy) delete [] theDEDXAtMaxEnergy; if(theRangeAtMaxEnergy) delete [] theRangeAtMaxEnergy; @@ -853,7 +831,8 @@ void G4VEnergyLossProcess::SetRangeTable(G4PhysicsTable* p) if(p) { size_t n = p->length(); G4PhysicsVector* pv = (*p)[0]; - G4double emax = pv->GetLowEdgeEnergy(pv->GetVectorLength()); + // G4double emax = pv->GetLowEdgeEnergy(pv->GetVectorLength()); + G4double emax = maxKinEnergyForRange; G4bool b; theDEDXAtMaxEnergy = new G4double [n]; theRangeAtMaxEnergy = new G4double [n]; @@ -874,7 +853,7 @@ void G4VEnergyLossProcess::SetRangeTable(G4PhysicsTable* p) void G4VEnergyLossProcess::SetRangeTableForLoss(G4PhysicsTable* p) { - if(theRangeTableForLoss) theRangeTableForLoss->clearAndDestroy(); + if(theRangeTableForLoss && !baseParticle) theRangeTableForLoss->clearAndDestroy(); theRangeTableForLoss = p; } @@ -889,7 +868,7 @@ void G4VEnergyLossProcess::SetSecondaryRangeTable(G4PhysicsTable* p) void G4VEnergyLossProcess::SetInverseRangeTable(G4PhysicsTable* p) { - if(theInverseRangeTable) theInverseRangeTable->clearAndDestroy(); + if(theInverseRangeTable && !baseParticle) theInverseRangeTable->clearAndDestroy(); theInverseRangeTable = p; } @@ -897,16 +876,46 @@ void G4VEnergyLossProcess::SetInverseRangeTable(G4PhysicsTable* p) void G4VEnergyLossProcess::SetLambdaTable(G4PhysicsTable* p) { - if(theLambdaTable) theLambdaTable->clearAndDestroy(); + if(theLambdaTable && !baseParticle) theLambdaTable->clearAndDestroy(); theLambdaTable = p; tablesAreBuilt = true; + if(theEnergyOfCrossSectionMax) delete [] theEnergyOfCrossSectionMax; + if(theCrossSectionMax) delete [] theCrossSectionMax; + + if(p) { + size_t n = p->length(); + G4PhysicsVector* pv = (*p)[0]; + size_t nb = pv->GetVectorLength(); + G4double emax = pv->GetLowEdgeEnergy(nb); + G4double e, s, smax = 0.0; + theEnergyOfCrossSectionMax = new G4double [n]; + theCrossSectionMax = new G4double [n]; + G4bool b; + + for (size_t i=0; iGetLowEdgeEnergy(j); + s = pv->GetValue(e,b); + if(s > smax) { + smax = s; + emax = e; + } + } + theEnergyOfCrossSectionMax[i] = emax; + theCrossSectionMax[i] = smax; + // G4cout << "i= " << i << " e2(MeV)= " << emax/MeV + // << " lambda= " << smax << G4endl; + } + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... void G4VEnergyLossProcess::SetSubLambdaTable(G4PhysicsTable* p) { - if(theSubLambdaTable) theSubLambdaTable->clearAndDestroy(); + if(theSubLambdaTable && !baseParticle) theSubLambdaTable->clearAndDestroy(); theSubLambdaTable = p; if (nSCoffRegions) { for (G4int i=0; iExistPhysicsTable(filename); if(yes) yes = table->RetrievePhysicsTable(filename,ascii); if(yes) { - SetRangeTable(table); + SetPreciseRangeTable(table); if (-1 < verboseLevel) { G4cout << "Precise Range table for " << particleName << " is retrieved from <" << filename << ">" @@ -1203,11 +1212,8 @@ G4bool G4VEnergyLossProcess::RetrievePhysicsTable(G4ParticleDefinition* part, } } else { table->clearAndDestroy(); - if(fpi) { - res = false; - G4cout << "Precise Range table for loss for " << particleName << " does not exist" - << G4endl; - } + G4cout << "Precise Range table for loss for " << particleName << " does not exist" + << G4endl; } filename = GetPhysicsTableFileName(part,directory,"InverseRange",ascii); @@ -1275,8 +1281,8 @@ G4bool G4VEnergyLossProcess::RetrievePhysicsTable(G4ParticleDefinition* part, } if(res) PrintInfoDefinition(); else { - G4cout << "### BuildPhysicsTable will be requested for " << GetProcessName() - << " for " << particleName << G4endl; + G4cout << "### BuildPhysicsTable will be requested for " << GetProcessName() + << " for " << particleName << G4endl; } } tablesAreBuilt = true; @@ -1287,6 +1293,135 @@ G4bool G4VEnergyLossProcess::RetrievePhysicsTable(G4ParticleDefinition* part, return res; } +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetLinearLossLimit(G4double val) +{ + linLossLimit = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetLossFluctuations(G4bool val) +{ + lossFluctuationFlag = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetSubCutoff(G4bool) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetRandomStep(G4bool val) +{ + rndmStepFlag = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetMinSubRange(G4double val) +{ + minSubRange = val; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4bool G4VEnergyLossProcess::TablesAreBuilt() const +{ + return tablesAreBuilt; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const +{ + return nSCoffRegions; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +const G4ParticleDefinition* G4VEnergyLossProcess::DefineBaseParticle( + const G4ParticleDefinition*) +{ + return 0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins) +{ + nDEDXBins = nbins; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetDEDXBinningForPreciseRange(G4int nbins) +{ + nDEDXBinsForRange = nbins; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins) +{ + nLambdaBins = nbins; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4VEnergyLossProcess::MinKinEnergy() const +{ + return minKinEnergy; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetMinKinEnergy(G4double e) +{ + minKinEnergy = e; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e) +{ + maxKinEnergy = e; + if(e < maxKinEnergyForRange) maxKinEnergyForRange = e; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetMaxKinEnergyForPreciseRange(G4double e) +{ + maxKinEnergyForRange = e; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +G4double G4VEnergyLossProcess::MaxKinEnergy() const +{ + return maxKinEnergy; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::ActivateFluorescence(G4bool, const G4Region*) +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::ActivateAugerElectronProduction(G4bool, const G4Region*) + +{} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... + +void G4VEnergyLossProcess::SetLambdaFactor(G4double val) +{ + if(val > 0.0 && val <= 1.0) lambdaFactor = val; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... diff --git a/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc b/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc index 7e1315aca4..5406d67b64 100644 --- a/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc +++ b/source/processes/electromagnetic/utils/src/G4VMultipleScattering.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4VMultipleScattering.cc,v 1.22 2004/03/01 12:17:07 urban Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4VMultipleScattering.cc,v 1.23 2004/04/23 05:52:07 urban Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ------------------------------------------------------------------- // @@ -42,6 +42,7 @@ // 03-11-03 Fix initialisation problem in RetrievePhysicsTable (V.Ivanchenko) // 04-11-03 Update PrintInfoDefinition (V.Ivanchenko) // 01-03-04 SampleCosineTheta signature changed +// 22-04-04 SampleCosineTheta signature changed back to original // // Class Description: // @@ -180,12 +181,8 @@ G4VParticleChange* G4VMultipleScattering::PostStepDoIt(const G4Track& track, G4double kineticEnergy = track.GetKineticEnergy(); G4double truestep = step.GetStepLength(); - G4double lambda = GetLambda(track.GetDynamicParticle()->GetDefinition(), - kineticEnergy) ; - - if (kineticEnergy > 0.0) { - G4double cth = currentModel->SampleCosineTheta(truestep,kineticEnergy,lambda); + G4double cth = currentModel->SampleCosineTheta(truestep,kineticEnergy); G4double sth = sqrt(1.-cth*cth); G4double phi = twopi*G4UniformRand(); G4double dirx = sth*cos(phi); @@ -206,8 +203,6 @@ G4VParticleChange* G4VMultipleScattering::PostStepDoIt(const G4Track& track, } */ - // G4cout << "PostStep: sth= " << sth << " trueLength= " << truestep << " tLast= " << truePathLength << G4endl; - if (latDisplasment) { G4double safety = step.GetPostStepPoint()->GetSafety(); @@ -215,8 +210,6 @@ G4VParticleChange* G4VMultipleScattering::PostStepDoIt(const G4Track& track, G4double r = currentModel->SampleDisplacement(); if (r > safety) r = safety; - // G4cout << "r= " << r << " safety= " << safety << G4endl; - // sample direction of lateral displacement G4double phi = twopi*G4UniformRand(); G4double dirx = cos(phi); diff --git a/source/processes/hadronic/GNUmakefile b/source/processes/hadronic/GNUmakefile index 54dcb3d7a8..510c3e8ef8 100644 --- a/source/processes/hadronic/GNUmakefile +++ b/source/processes/hadronic/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.16 2003/11/24 12:54:22 gcosmo Exp $ +# $Id: GNUmakefile,v 1.19 2004/06/01 05:37:34 hpw Exp $ # ---------------------------------------------------------------- # GNUmakefile for hadronic processes library. G.Folger 10-Dec-97. # ---------------------------------------------------------------- @@ -12,6 +12,7 @@ SUBDIRS += cross_sections SUBDIRS += stopping +SUBDIRS += models/abrasion SUBDIRS += models/binary_cascade SUBDIRS += models/cascade/evaporation SUBDIRS += models/cascade/utils @@ -28,6 +29,8 @@ SUBDIRS += models/de_excitation/management SUBDIRS += models/de_excitation/multifragmentation SUBDIRS += models/de_excitation/photon_evaporation SUBDIRS += models/de_excitation/util +SUBDIRS += models/de_excitation/ablation +SUBDIRS += models/em_dissociation SUBDIRS += models/high_energy SUBDIRS += models/im_r_matrix SUBDIRS += models/isotope_production @@ -45,7 +48,8 @@ SUBDIRS += models/radioactive_decay SUBDIRS += models/theo_high_energy SUBDIRS += models/util -SUBLIBS = G4hadronic_xsect +SUBLIBS = G4hadronic_abrasion +SUBLIBS += G4hadronic_xsect SUBLIBS += G4hadronic_mgt SUBLIBS += G4hadronic_proc SUBLIBS += G4hadronic_stop @@ -76,6 +80,8 @@ SUBLIBS += G4hadronic_deex_management SUBLIBS += G4hadronic_deex_multifragmentation SUBLIBS += G4hadronic_deex_photon_evaporation SUBLIBS += G4hadronic_deex_util +SUBLIBS += G4hadronic_ablation +SUBLIBS += G4hadronic_em_dissociation SUBLIBS += G4had_preequ_exciton SUBLIBS += G4had_muon_nuclear SUBLIBS += G4had_string_diff diff --git a/source/processes/hadronic/cross_sections/GNUmakefile b/source/processes/hadronic/cross_sections/GNUmakefile index 7f7ef0eb6c..b9029f7825 100644 --- a/source/processes/hadronic/cross_sections/GNUmakefile +++ b/source/processes/hadronic/cross_sections/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.4 2003/11/01 16:18:27 hpw Exp $ +# $Id: GNUmakefile,v 1.5 2004/05/27 11:08:05 flei Exp $ # ---------------------------------------------------------------- # GNUmakefile for hadronic management library. G.Folger 10-Dec-97 # ---------------------------------------------------------------- @@ -25,6 +25,7 @@ CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/particles/hadrons/ions/include \ -I$(G4BASE)/processes/management/include \ -I$(G4BASE)/processes/hadronic/util/include \ + -I$(G4BASE)/processes/hadronic/models/util/include \ -I$(G4BASE)/materials/include include $(G4INSTALL)/config/common.gmk diff --git a/source/processes/hadronic/cross_sections/include/G4EMDissociationCrossSection.hh b/source/processes/hadronic/cross_sections/include/G4EMDissociationCrossSection.hh new file mode 100644 index 0000000000..635f03d027 --- /dev/null +++ b/source/processes/hadronic/cross_sections/include/G4EMDissociationCrossSection.hh @@ -0,0 +1,103 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4EMDissociationCrossSection_h +#define G4EMDissociationCrossSection_h 1 +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4EMDissociationCrossSection.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 17 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4VCrossSectionDataSet.hh" +#include "G4DynamicParticle.hh" +#include "G4Element.hh" +#include "G4ParticleDefinition.hh" +#include "G4EMDissociationSpectrum.hh" +#include "G4PhysicsFreeVector.hh" +#include "globals.hh" +//////////////////////////////////////////////////////////////////////////////// +// +class G4EMDissociationCrossSection : public G4VCrossSectionDataSet +{ + public: + G4EMDissociationCrossSection (); + ~G4EMDissociationCrossSection (); + + virtual G4bool IsApplicable (const G4DynamicParticle *, const G4Element *); + + virtual G4double GetCrossSection (const G4DynamicParticle *, + const G4Element *, G4double); + + G4PhysicsFreeVector *GetCrossSectionForProjectile + (G4double, G4double, G4double, G4double, G4double, G4double); + G4PhysicsFreeVector *GetCrossSectionForTarget + (G4double, G4double, G4double, G4double, G4double, G4double); + G4double GetWilsonProbabilityForProtonDissociation + (G4double, G4double); + virtual void BuildPhysicsTable (const G4ParticleDefinition &) + {} + virtual void DumpPhysicsTable (const G4ParticleDefinition &) + {G4cout << "G4EMDissociationCrossSection: uses formula" < +#include "G4IonProtonCrossSection.hh" +#include "G4TripathiLightCrossSection.hh" +#include "G4TripathiCrossSection.hh" +#include "G4IonsShenCrossSection.hh" +#include "globals.hh" + +//////////////////////////////////////////////////////////////////////////////// +// +class G4GeneralSpaceNNCrossSection : public G4VCrossSectionDataSet +{ + public: + G4GeneralSpaceNNCrossSection (); + ~G4GeneralSpaceNNCrossSection (); + + virtual G4bool IsApplicable(const G4DynamicParticle* theProjectile, + const G4Element* theTarget); + + virtual G4double GetCrossSection(const G4DynamicParticle* theProjectile, + const G4Element* theTarget, G4double theTemperature); + + virtual void BuildPhysicsTable(const G4ParticleDefinition&) + {;} + + virtual void DumpPhysicsTable(const G4ParticleDefinition&) + {G4cout << "G4GeneralSpaceNNCrossSection: uses formula"<GetKineticEnergy(), @@ -67,7 +67,7 @@ class G4IonProtonCrossSection : public G4VCrossSectionDataSet virtual void DumpPhysicsTable(const G4ParticleDefinition&) - {G4cout << "G4IonProtonCrossSection: uses formula"<GetDefinition() == G4PionMinus::PionMinus()) result=true; if(aParticle->GetDefinition() == G4PionPlus::PionPlus()) result=true; - if(anElement->GetZ() == 1) result = false; + if(G4lrint(anElement->GetZ()) == 1) result = false; if(aParticle->GetKineticEnergy() > 999.9*GeV) result=false; return result; } diff --git a/source/processes/hadronic/cross_sections/include/G4TripathiLightCrossSection.hh b/source/processes/hadronic/cross_sections/include/G4TripathiLightCrossSection.hh new file mode 100644 index 0000000000..5deeb013aa --- /dev/null +++ b/source/processes/hadronic/cross_sections/include/G4TripathiLightCrossSection.hh @@ -0,0 +1,101 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4TripathiLightCrossSection_h +#define G4TripathiLightCrossSection_h +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4TripathiLightCrossSection.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// Class Description +// Implementation of formulas of Tripathi, Cucinotta and Wilson, NASA Technical +// Paper TP-1999-209726 to calculate cross-sections for nuclear-nuclear +// inelastic scattering for light nuclear systems. +// +// Class Description - End +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/////////////////////////////////////////////////////////////////////////////// +// +#include "globals.hh" + +#include "G4VCrossSectionDataSet.hh" +#include "G4WilsonRadius.hh" +/////////////////////////////////////////////////////////////////////////////// +// +class G4TripathiLightCrossSection : public G4VCrossSectionDataSet +{ + public: + G4TripathiLightCrossSection(); + ~G4TripathiLightCrossSection(); + virtual G4bool IsApplicable(const G4DynamicParticle* theProjectile, + const G4Element* theTarget); + + virtual G4double GetCrossSection(const G4DynamicParticle* theProjectile, + const G4Element* theTarget, G4double theTemperature); + + virtual void BuildPhysicsTable(const G4ParticleDefinition&) + {} + + virtual void DumpPhysicsTable(const G4ParticleDefinition&) + {G4cout << "G4TripathiLightCrossSection: uses formula"<GetIonTable()-> + IsIon(theDynamicParticle->GetDefinition()) && theElement->GetN() > 1.0) + return true; + else + return false; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4EMDissociationCrossSection::GetCrossSection + (const G4DynamicParticle *theDynamicParticle, const G4Element* theElement, + G4double ) +{ +// +// +// Get relevant information about the projectile and target (A, Z) and +// velocity of the projectile. +// + G4ParticleDefinition *definitionP = theDynamicParticle->GetDefinition(); + G4double AP = definitionP->GetBaryonNumber(); + G4double ZP = definitionP->GetPDGCharge(); + G4double b = theDynamicParticle->Get4Momentum().beta(); +// G4double bsq = b * b; + + G4double AT = theElement->GetN(); + G4double ZT = theElement->GetZ(); + G4double bmin = thePhotonSpectrum->GetClosestApproach(AP, ZP, AT, ZT, b); +// +// +// Calculate the cross-section for the projectile and then the target. The +// information is returned in a G4PhysicsFreeVector, which separates out the +// cross-sections for the E1 and E2 moments of the virtual photon field, and +// the energies (GDR and GQR). +// + G4PhysicsFreeVector *theProjectileCrossSections = + GetCrossSectionForProjectile (AP, ZP, AT, ZT, b, bmin); + G4double crossSection = + (*theProjectileCrossSections)[0]+(*theProjectileCrossSections)[1]; + delete theProjectileCrossSections; + G4PhysicsFreeVector *theTargetCrossSections = + GetCrossSectionForTarget (AP, ZP, AT, ZT, b, bmin); + crossSection += + (*theTargetCrossSections)[0]+(*theTargetCrossSections)[1]; + delete theTargetCrossSections; + + return crossSection; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4PhysicsFreeVector * + G4EMDissociationCrossSection::GetCrossSectionForProjectile (G4double AP, + G4double ZP, G4double AT, G4double ZT, G4double b, G4double bmin) +{ +// +// +// Use Wilson et al's approach to calculate the cross-sections due to the E1 +// and E2 moments of the field at the giant dipole and quadrupole resonances +// respectively, Note that the algorithm is traditionally applied to the +// EMD break-up of the projectile in the field of the target, as is implemented +// here. +// +// Initialise variables and calculate the energies for the GDR and GQR. +// + G4double AProot3 = pow(AP,1.0/3.0); + G4double u = 3.0 * J / Qprime / AProot3; + G4double R0 = r0 * AProot3; + G4double E_GDR = hbarc / sqrt(0.7*amu_c2*R0*R0/8.0/J* + (1.0 + u - (1.0 + epsilon + 3.0*u)/(1.0 + epsilon + u)*epsilon)); + G4double E_GQR = 63.0 * MeV / AProot3; +// +// +// Determine the virtual photon spectra at these energies. +// + G4double ZTsq = ZT * ZT; + G4double nE1 = ZTsq * + thePhotonSpectrum->GetGeneralE1Spectrum(E_GDR, b, bmin); + G4double nE2 = ZTsq * + thePhotonSpectrum->GetGeneralE2Spectrum(E_GQR, b, bmin); +// +// +// Now calculate the cross-section of the projectile for interaction with the +// E1 and E2 fields. +// + G4double sE1 = 60.0 * millibarn * MeV * (AP-ZP)*ZP/AP; + G4double sE2 = 0.22 * microbarn / MeV * ZP * AProot3 * AProot3; + if (AP > 100.0) sE2 *= 0.9; + else if (AP > 40.0) sE2 *= 0.6; + else sE2 *= 0.3; +// +// +// ... and multiply with the intensity of the virtual photon spectra to get +// the probability of interaction. +// + G4PhysicsFreeVector *theCrossSectionVector = new G4PhysicsFreeVector(2); + theCrossSectionVector->PutValue(0, E_GDR, sE1*nE1); + theCrossSectionVector->PutValue(1, E_GQR, sE2*nE2*E_GQR*E_GQR); + + return theCrossSectionVector; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4PhysicsFreeVector * + G4EMDissociationCrossSection::GetCrossSectionForTarget (G4double AP, + G4double ZP, G4double AT, G4double ZT, G4double b, G4double bmin) +{ +// +// +// This is a cheaky little member function to calculate the probability of +// EMD for the target in the field of the projectile ... just by reversing the +// A and Z's for the participants. +// + return GetCrossSectionForProjectile (AT, ZT, AP, ZP, b, bmin); +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double + G4EMDissociationCrossSection::GetWilsonProbabilityForProtonDissociation + (G4double A, G4double Z) +{ +// +// +// This is a simple algorithm to choose whether a proton or neutron is ejected +// from the nucleus in the EMD interaction. +// + G4double p = 0.0; + if (Z < 6.0) + p = 0.5; + else if (Z < 8.0) + p = 0.6; + else if (Z < 14.0) + p = 0.7; + else + { + G4double p1 = (G4double) Z / (G4double) A; + G4double p2 = 1.95*exp(-0.075*Z); + if (p1 < p2) p = p1; + else p = p2; + } + + return p; +} +//////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/cross_sections/src/G4EMDissociationSpectrum.cc b/source/processes/hadronic/cross_sections/src/G4EMDissociationSpectrum.cc new file mode 100644 index 0000000000..2967d51bd2 --- /dev/null +++ b/source/processes/hadronic/cross_sections/src/G4EMDissociationSpectrum.cc @@ -0,0 +1,118 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4EMDissociationSpectrum.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4EMDissociationSpectrum.hh" +#include "globals.hh" +//////////////////////////////////////////////////////////////////////////////// +// +G4EMDissociationSpectrum::G4EMDissociationSpectrum () +{ + bessel = new G4Bessel(); +} +//////////////////////////////////////////////////////////////////////////////// +// +G4EMDissociationSpectrum::~G4EMDissociationSpectrum () +{ + delete bessel; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4EMDissociationSpectrum::GetGeneralE1Spectrum + (G4double Eg, G4double b, G4double bmin) +{ + G4double b2 = b*b; + G4double g = 1.0/sqrt(1.0-b2); + G4double xi = Eg * bmin / g / b / hbarc; + G4double K0 = bessel->K0(xi); + G4double K1 = bessel->K1(xi); + G4double n = 2.0 * fine_structure_const / pi / b2 / Eg * + (xi*K0*K1 - xi*xi*b2/2.0*(K1*K1-K0*K0)); + return n; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4EMDissociationSpectrum::GetGeneralE2Spectrum + (G4double Eg, G4double b, G4double bmin) +{ + G4double b2 = b * b; + G4double b4 = b2 * b2; + G4double g = 1.0/sqrt(1.0-b2); + G4double xi = Eg * bmin / g / b / hbarc; + G4double K0 = bessel->K0(xi); + G4double K1 = bessel->K1(xi); + G4double n = 2.0 * fine_structure_const / pi / b4 / Eg * + (2.0*(1.0-b2)*K1*K1 + xi*pow((2.0-b2),2.0)*K0*K1 - + xi*xi*b4/2.0*(K1*K1-K0*K0)); + return n; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4EMDissociationSpectrum::GetClosestApproach + (const G4double AP, const G4double ZP, G4double AT, G4double ZT, G4double b) +{ + G4double bsq = b * b; + G4double g = 1.0/sqrt(1-bsq); + G4double AProot3 = pow(AP,1.0/3.0); + G4double ATroot3 = pow(AT,1.0/3.0); + G4double bc = 1.34 * fermi * (AProot3+ATroot3 - 0.75 *(1.0/AProot3+1.0/ATroot3)); +// G4double a0 = ZP * ZT * classic_electr_radius/bsq; + G4double a0 = ZP * ZT * elm_coupling / (AT*AP*amu_c2/(AT+AP)) / bsq; + G4double bmin = 1.25 * bc + halfpi*a0/g; + return bmin; +} +//////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/cross_sections/src/G4GeneralSpaceNNCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4GeneralSpaceNNCrossSection.cc new file mode 100644 index 0000000000..37b899a9bb --- /dev/null +++ b/source/processes/hadronic/cross_sections/src/G4GeneralSpaceNNCrossSection.cc @@ -0,0 +1,197 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4GeneralSpaceNNCrossSection.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4GeneralSpaceNNCrossSection.hh" +#include "G4DynamicParticle.hh" +#include "G4Element.hh" +#include "G4ParticleDefinition.hh" +#include "G4ParticleTable.hh" +#include "G4IonTable.hh" + +#include +//////////////////////////////////////////////////////////////////////////////// +// +G4GeneralSpaceNNCrossSection::G4GeneralSpaceNNCrossSection () +{ + protonInelastic = new G4ProtonInelasticCrossSection(); + ionProton = new G4IonProtonCrossSection(); + TripathiGeneral = new G4TripathiCrossSection(); + TripathiLight = new G4TripathiLightCrossSection(); + Shen = new G4IonsShenCrossSection(); + + return; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4GeneralSpaceNNCrossSection::~G4GeneralSpaceNNCrossSection () +{ + delete protonInelastic; + delete ionProton; + delete TripathiGeneral; + delete TripathiLight; + delete Shen; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4bool G4GeneralSpaceNNCrossSection::IsApplicable + (const G4DynamicParticle* theProjectile, const G4Element* theTarget) +{ + G4bool result = protonInelastic->IsApplicable(theProjectile, theTarget); + if (!result) + { + result = ionProton->IsApplicable(theProjectile, theTarget); + if (!result) + { + result = TripathiGeneral->IsApplicable(theProjectile, theTarget); + if (!result) + result = Shen->IsApplicable(theProjectile, theTarget); + } + } + return result; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4GeneralSpaceNNCrossSection::GetCrossSection + (const G4DynamicParticle* theProjectile, const G4Element* theTarget, + G4double theTemperature) +{ + G4double result = 0.0; + + const G4double AT = theTarget->GetN(); + const G4double ZT = theTarget->GetZ(); + const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber(); + const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge(); + + if (verboseLevel >= 2) + { + G4cout <<"In G4GeneralSpaceNNCrossSection::GetCrossSection" < + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4TripathiLightCrossSection" <5) + { + result = ionProton-> + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4IonProtonCrossSection" < + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4TripathiLightCrossSection" <IsApplicable(theProjectile, theTarget)) + { + result = TripathiLight-> + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4TripathiLightCrossSection" <IsApplicable(theProjectile, theTarget)) + { + result = TripathiGeneral-> + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4TripathiCrossSection" <IsApplicable(theProjectile, theTarget)) + { + result = Shen-> + GetCrossSection(theProjectile, theTarget, theTemperature); + if (verboseLevel >= 2) + G4cout <<"Selecting G4IonsShenCrossSection" <= 2) + { + G4cout <<"Cross-section = " <GetDefinition() == G4PionMinus::PionMinus()) ok=true; if(aParticle->GetDefinition() == G4PionPlus::PionPlus()) ok=true; @@ -180,9 +187,12 @@ GetCrossSection(const G4DynamicParticle* aParticle, // body G4double result = 0; - G4int Z=static_cast(anElement->GetZ()+.001); + G4int Z=G4lrint(anElement->GetZ()); + debug.push_back(Z); size_t it=0; while(ittheZ[it]) it++; + debug.push_back(theZ[it]); + debug.push_back(kineticEnergy); if(Z > theZ[it]) { throw G4HadronicException(__FILE__, __LINE__, @@ -195,6 +205,8 @@ GetCrossSection(const G4DynamicParticle* aParticle, if(theZ[it]==Z) { result = thePimData[it]->ReactionXSection(kineticEnergy); + debug.push_back("D1 "); + debug.push_back(result); } else { @@ -203,6 +215,12 @@ GetCrossSection(const G4DynamicParticle* aParticle, x2 = thePimData[it]->ReactionXSection(kineticEnergy); Z2 = theZ[it]; result = Interpolate(Z1, Z2, Z, x1, x2); + debug.push_back("D2 "); + debug.push_back(x1); + debug.push_back(x2); + debug.push_back(Z1); + debug.push_back(Z2); + debug.push_back(result); } } else @@ -215,6 +233,8 @@ GetCrossSection(const G4DynamicParticle* aParticle, theData = &thePipData; } result = theData->operator[](it)->ReactionXSection(kineticEnergy); + debug.push_back("D3 "); + debug.push_back(result); } else { @@ -233,9 +253,16 @@ GetCrossSection(const G4DynamicParticle* aParticle, x2 = theHData->operator[](it)->ReactionXSection(kineticEnergy); Z2 = theZ[it]; result = Interpolate(Z1, Z2, Z, x1, x2); + debug.push_back("D4 "); + debug.push_back(x1); + debug.push_back(x2); + debug.push_back(Z1); + debug.push_back(Z2); + debug.push_back(result); } } + debug.dump(); return result; } diff --git a/source/processes/hadronic/cross_sections/src/G4TripathiCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4TripathiCrossSection.cc index c9edd1ccd9..1a4e740792 100644 --- a/source/processes/hadronic/cross_sections/src/G4TripathiCrossSection.cc +++ b/source/processes/hadronic/cross_sections/src/G4TripathiCrossSection.cc @@ -72,9 +72,32 @@ GetCrossSection(const G4DynamicParticle* aPart, G4double Energy = kineticEnergy/projectileAtomicNumber; // done - G4double D = 2.77-(8.0E-3*targetAtomicNumber)+(1.8E-5*targetAtomicNumber*targetAtomicNumber) + // + // Note that this correction to G4TripathiCrossSection is just to accurately + // reflect Tripathi's algorithm. However, if you're using alpha particles/protons + // consider using the more accurate G4TripathiLightCrossSection, which + // Tripathi developed specifically for light systems. + // + G4double D; + if (nProjProtons==1 && projectileAtomicNumber==1) + { + D = 2.05; + } + else if (nProjProtons==2 && projectileAtomicNumber==4) + { + D = 2.77-(8.0E-3*targetAtomicNumber)+(1.8E-5*targetAtomicNumber*targetAtomicNumber) - 0.8/(1+exp((250.-Energy)/75.)); - D = 1.75; + } + else + { + // + // This is the original value used in the G4TripathiCrossSection implementation, + // and was used for all projectile/target conditions. I'm not touching this, + // althoughJudging from Tripathi's paper, this is valid for cases where the + // nucleon density changes little with A. + // + D = 1.75; + } // done G4double C_E = D * (1-exp(-Energy/40.)) - 0.292*exp(-Energy/792.)*cos(0.229*pow(Energy, 0.453)); @@ -94,5 +117,5 @@ GetCrossSection(const G4DynamicParticle* aPart, if(result < 0) result = 0; return result*m2; - + } diff --git a/source/processes/hadronic/cross_sections/src/G4TripathiLightCrossSection.cc b/source/processes/hadronic/cross_sections/src/G4TripathiLightCrossSection.cc new file mode 100644 index 0000000000..09fa39d563 --- /dev/null +++ b/source/processes/hadronic/cross_sections/src/G4TripathiLightCrossSection.cc @@ -0,0 +1,307 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4TripathiLightCrossSection.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/////////////////////////////////////////////////////////////////////////////// +// +#include "G4TripathiLightCrossSection.hh" +#include "G4WilsonRadius.hh" +#include "G4ParticleTable.hh" +#include "G4IonTable.hh" + +/////////////////////////////////////////////////////////////////////////////// +// +G4TripathiLightCrossSection::G4TripathiLightCrossSection () +{ +// +// +// Constructor only needs to instantiate the object which provides functions +// to calculate the nuclear radius, and some other constants used to +// calculate cross-sections. +// + theWilsonRadius = new G4WilsonRadius(); + r_0 = 1.1 * fermi; + third = 1.0/3.0; +// +// +// The following variable is set to true if +// G4TripathiLightCrossSection::GetCrossSection is going to be called from +// within G4TripathiLightCrossSection::GetCrossSection to check whether the +// cross-section is behaviing anomalously in the low-energy region. +// + lowEnergyCheck = false; +} +/////////////////////////////////////////////////////////////////////////////// +// +G4TripathiLightCrossSection::~G4TripathiLightCrossSection () +{ +// +// +// Destructor just needs to delete the pointer to the G4WilsonRadius object. +// + delete theWilsonRadius; +} +/////////////////////////////////////////////////////////////////////////////// +// +G4bool G4TripathiLightCrossSection::IsApplicable + (const G4DynamicParticle* theProjectile, const G4Element* theTarget) +{ + G4bool result = false; + const G4double AT = theTarget->GetN(); + const G4double ZT = theTarget->GetZ(); + const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge(); + const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber(); + if (theProjectile->GetKineticEnergy()/ + theProjectile->GetDefinition()->GetBaryonNumber()<10.0*GeV && + ((AT==1 && ZT==1) || (AP==1 && ZP==1) || + (AT==1 && ZT==0) || (AP==1 && ZP==0) || + (AT==2 && ZT==1) || (AP==2 && ZP==1) || + (AT==3 && ZT==2) || (AP==3 && ZP==2) || + (AT==4 && ZT==2) || (AP==4 && ZP==2))) result = true; + return result; +} +/////////////////////////////////////////////////////////////////////////////// +// +G4double G4TripathiLightCrossSection::GetCrossSection + (const G4DynamicParticle* theProjectile, const G4Element* theTarget, + G4double /* theTemperature*/) +{ +// +// +// Initialise the result. + G4double result = 0.0; +// +// +// Get details of the projectile and target (nucleon number, atomic number, +// kinetic enery and energy/nucleon. +// + const G4double AT = theTarget->GetN(); + const G4double ZT = theTarget->GetZ(); + const G4double EA = theProjectile->GetKineticEnergy()/MeV; + const G4double AP = theProjectile->GetDefinition()->GetBaryonNumber(); + const G4double ZP = theProjectile->GetDefinition()->GetPDGCharge(); + G4double E = EA / AP; +// +// +// Determine target mass and energy within the centre-of-mass frame. +// + G4double mT = G4ParticleTable::GetParticleTable() + ->GetIonTable() + ->GetIonMass(static_cast(ZT), static_cast(AT)); + G4LorentzVector pT(0.0, 0.0, 0.0, mT); + G4LorentzVector pP(theProjectile->Get4Momentum()); + pT = pT + pP; + G4double E_cm = (pT.mag()-mT-pP.m())/MeV; +// +// +// Determine nuclear radii. Note that the r_p and r_T are defined differently +// from Wilson et al. +// + G4WilsonRadius theWilsonNuclearRadius; + G4double r_rms_p = theWilsonRadius->GetWilsonRMSRadius(AP); + G4double r_rms_t = theWilsonRadius->GetWilsonRMSRadius(AT); + + G4double r_p = 1.29*r_rms_p; + G4double r_t = 1.29*r_rms_t; + + G4double Radius = (r_p + r_t)/fermi + 1.2*(pow(AT, third) + pow(AP, third))/ + pow(E_cm, third); + + G4double B = 1.44 * ZP * ZT / Radius; +// +// +// Now determine other parameters associated with the parametric +// formula, depending upon the projectile and target. +// + G4double T1 = 0.0; + G4double D = 0.0; + G4double G = 0.0; + + if ((AT==1 && ZT==1) || (AP==1 && ZP==1)) + { + T1 = 23.0; + D = 1.85 + 0.16/(1+exp((500.0-E)/200.0)); + } + else if ((AT==1 && ZT==0) || (AP==1 && ZP==0)) + { + T1 = 18.0; + D = 1.85 + 0.16/(1+exp((500.0-E)/200.0)); + } + else if ((AT==2 && ZT==1) || (AP==2 && ZP==1)) + { + T1 = 23.0; + D = 1.65 + 0.1/(1+exp((500.0-E)/200.0)); + } + else if ((AT==3 && ZT==2) || (AP==3 && ZP==2)) + { + T1 = 40.0; + D = 1.55; + } + else if (AP==4 && ZP==2) + { + if (AT==4 && ZT==2) {T1 = 40.0; G = 300.0;} + else if (ZT==4) {T1 = 25.0; G = 300.0;} + else if (ZT==7) {T1 = 40.0; G = 500.0;} + else if (ZT==13) {T1 = 25.0; G = 300.0;} + else if (ZT==26) {T1 = 40.0; G = 300.0;} + else {T1 = 40.0; G = 75.0;} + D = 2.77 - 8.0E-3*AT + 1.8E-5*AT*AT-0.8/(1.0+exp((250.0-E)/G)); + } + else if (AT==4 && ZT==2) + { + if (AP==4 && ZP==2) {T1 = 40.0; G = 300.0;} + else if (ZP==4) {T1 = 25.0; G = 300.0;} + else if (ZP==7) {T1 = 40.0; G = 500.0;} + else if (ZP==13) {T1 = 25.0; G = 300.0;} + else if (ZP==26) {T1 = 40.0; G = 300.0;} + else {T1 = 40.0; G = 75.0;} + D = 2.77 - 8.0E-3*AP + 1.8E-5*AP*AP-0.8/(1.0+exp((250.0-E)/G)); + } +// +// +// C_E, S, deltaE, X1, S_L and X_m correspond directly with the original +// formulae of Tripathi et al in his report. +// + G4double C_E = D*(1.0-exp(-E/T1)) - + 0.292*exp(-E/792.0)*cos(0.229*pow(E,0.453)); + + G4double S = pow(AP,third)*pow(AT,third)/(pow(AP,third) + pow(AT,third)); + + G4double deltaE = 0.0; + G4double X1 = 0.0; + if (AT >= AP) + { + deltaE = 1.85*S + 0.16*S/pow(E_cm,third) - C_E + 0.91*(AT-2.0*ZT)*ZP/AT/AP; + X1 = 2.83 - 3.1E-2*AT + 1.7E-4*AT*AT; + } + else + { + deltaE = 1.85*S + 0.16*S/pow(E_cm,third) - C_E + 0.91*(AP-2.0*ZP)*ZT/AT/AP; + X1 = 2.83 - 3.1E-2*AP + 1.7E-4*AP*AP; + } + G4double S_L = 1.2 + 1.6*(1.0-exp(-E/15.0)); + G4double X_m = 1.0 - X1*exp(-E/X1*S_L); +// +// +// R_c is also highly dependent upon the A and Z of the projectile and +// target. +// + G4double R_c = 1.0; + if (AP==1 && ZP==1) + { + if (AT==2 && ZT==1) R_c = 13.5; + else if (AT==3 && ZT==2) R_c = 21.0; + else if (AT==4 && ZT==2) R_c = 27.0; + else if (ZT==3) R_c = 2.2; + } + else if (AT==1 && ZT==1) + { + if (AP==2 && ZP==1) R_c = 13.5; + else if (AP==3 && ZP==2) R_c = 21.0; + else if (AP==4 && ZP==2) R_c = 27.0; + else if (ZP==3) R_c = 2.2; + } + else if (AP==2 && ZP==1) + { + if (AT==2 && ZT==1) R_c = 13.5; + else if (AT==4 && ZT==2) R_c = 13.5; + else if (AT==12 && ZT==6) R_c = 6.0; + } + else if (AT==2 && ZT==1) + { + if (AP==2 && ZP==1) R_c = 13.5; + else if (AP==4 && ZP==2) R_c = 13.5; + else if (AP==12 && ZP==6) R_c = 6.0; + } + else if ((AP==4 && ZP==2 && (ZT==73 || ZT==79)) || + (AT==4 && ZT==2 && (ZP==73 || ZP==79))) R_c = 0.6; +// +// +// Find the total cross-section. Check that it's value is positive, and if +// the energy is less that 10 MeV/nuc, find out if the cross-section is +// increasing with decreasing energy. If so this is a sign that the function +// is behaving badly at low energies, and the cross-section should be +// set to zero. +// + result = pi * r_0*r_0 * + pow((pow(AT,third) + pow(AP,third) + deltaE),2.0) * + (1.0 - R_c*B/E_cm) * X_m; + if (!lowEnergyCheck) + { + if (result < 0.0) + result = 0.0; + else if (E < 6.0*MeV) + { + G4double f = 0.95; + G4DynamicParticle slowerProjectile = *theProjectile; + slowerProjectile.SetKineticEnergy(f * EA * MeV); + G4TripathiLightCrossSection theTripathiLightCrossSection; + theTripathiLightCrossSection.SetLowEnergyCheck(true); + G4double resultp = + theTripathiLightCrossSection.GetCrossSection + (&slowerProjectile, theTarget, 0.0); + if (resultp >result) result = 0.0; + } + } + + return result; +} +/////////////////////////////////////////////////////////////////////////////// +// +void G4TripathiLightCrossSection::SetLowEnergyCheck (G4bool aLowEnergyCheck) +{ + lowEnergyCheck = aLowEnergyCheck; +} +/////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/management/include/G4HadronicProcess.hh b/source/processes/hadronic/management/include/G4HadronicProcess.hh index 14194bb349..8aacac3a35 100644 --- a/source/processes/hadronic/management/include/G4HadronicProcess.hh +++ b/source/processes/hadronic/management/include/G4HadronicProcess.hh @@ -49,6 +49,7 @@ #include "G4Delete.hh" #include "G4CrossSectionDataStore.hh" #include "G4HadronicException.hh" +#include "G4Fuzzy.hh" class G4Track; class G4Step; @@ -97,6 +98,15 @@ class G4ParticleChange; return anIsoResult; } + // use this with bool only + static G4bool AlwaysKillLeadingHadron(G4Fuzzy aB=G4Fuzzy()) + { + static G4Fuzzy state = G4Fuzzy(); + if(getenv("AlwaysKillLeadingHadron")) return true; + if (!aB.first) state = aB; + return state.second; + } + void BiasCrossSectionByFactor(G4double aScale) { xBiasOn = true; diff --git a/source/processes/hadronic/management/src/G4HadronicProcess.cc b/source/processes/hadronic/management/src/G4HadronicProcess.cc index 080e4b8d39..239cff4d36 100644 --- a/source/processes/hadronic/management/src/G4HadronicProcess.cc +++ b/source/processes/hadronic/management/src/G4HadronicProcess.cc @@ -49,9 +49,7 @@ #include "G4HadReentrentException.hh" #include "G4HadronicInteractionWrapper.hh" -#ifndef G4HadSignalHandler_off - #include "G4HadSignalHandler.hh" -#endif +#include "G4HadSignalHandler.hh" //@@ add model name info, once typeinfo available #include @@ -63,8 +61,8 @@ } } - G4IsoParticleChange * G4HadronicProcess::theIsoResult = 0; - G4IsoParticleChange * G4HadronicProcess::theOldIsoResult = 0; + G4IsoParticleChange * G4HadronicProcess::theIsoResult = NULL; + G4IsoParticleChange * G4HadronicProcess::theOldIsoResult = NULL; G4bool G4HadronicProcess::isoIsEnabled = true; void G4HadronicProcess:: @@ -95,9 +93,7 @@ theBias.end(), G4Delete()); if(theOldIsoResult) delete theOldIsoResult; - if(theIsoResult) delete theIsoResult; - theOldIsoResult=0; - theIsoResult=0; + // if(theIsoResult) delete theIsoResult; } void G4HadronicProcess::RegisterMe( G4HadronicInteraction *a ) @@ -320,6 +316,16 @@ GetMeanFreePath(const G4Track &aTrack, G4double, G4ForceCondition *) #ifndef G4HadSignalHandler_off G4HadSignalHandler aHandler(G4HadronicProcess_local::G4HadronicProcessHandler_1); #endif + if(aTrack.GetTrackStatus() != fAlive) + { + G4cerr << "G4HadronicProcess: track in unusable state - " + <Clear(); + theTotalResult->Initialize(aTrack); + return theTotalResult; + } const G4DynamicParticle *aParticle = aTrack.GetDynamicParticle(); G4Material *aMaterial = aTrack.GetMaterial(); G4double originalEnergy = aParticle->GetKineticEnergy(); @@ -467,19 +473,15 @@ GetMeanFreePath(const G4Track &aTrack, G4double, G4ForceCondition *) const G4Nucleus & aNucleus) { // get the PC from iso-production - if(theOldIsoResult) - { - delete theOldIsoResult; - theOldIsoResult=0; - } + if(theOldIsoResult) delete theOldIsoResult; if(theIsoResult) delete theIsoResult; theIsoResult = new G4IsoParticleChange; G4bool done = false; - G4IsoResult * anIsoResult = 0; + G4IsoResult * anIsoResult = NULL; for(unsigned int i=0; iGetIsotope(aTrack, aNucleus); - if(anIsoResult!=0) + if(anIsoResult!=NULL) { done = true; break; @@ -597,6 +599,7 @@ void G4HadronicProcess::FillTotalResult(G4HadFinalState * aR, const G4Track & aT <GetStatusChange()<GetStatusChange()==stopAndKill) { if( xBiasOn && G4UniformRand()GetMomentumChange().z())) { G4Exception("G4HadronicProcess", "007", FatalException, - "survivine track received NaN momentum."); + "surviving track received NaN momentum."); } - G4DynamicParticle * aNew = new G4DynamicParticle(aT.GetDefinition(), - aR->GetEnergyChange(), - aR->GetMomentumChange()); + G4double newM=aT.GetDefinition()->GetPDGMass(); + G4double newE=aR->GetEnergyChange() + newM; + G4double newP=sqrt(newE*newE - newM*newM); + G4DynamicParticle * aNew = + new G4DynamicParticle(aT.GetDefinition(), newE, newP*aR->GetMomentumChange()); G4HadSecondary * theSec = new G4HadSecondary(aNew, newWeight); aR->AddSecondary(theSec); } @@ -662,16 +667,42 @@ void G4HadronicProcess::FillTotalResult(G4HadFinalState * aR, const G4Track & aT } else { - G4cerr << "Track status is "<< aR->GetStatusChange()<GetStatusChange()<GetStatusChange()==fAlive + && + aR->GetStatusChange()==isAlive) + { + G4double newWeight = theTotalResult->GetWeightChange(); + G4double newM=aT.GetDefinition()->GetPDGMass(); + G4double newE=aR->GetEnergyChange() + newM; + G4double newP=sqrt(newE*newE - newM*newM); + G4DynamicParticle * aNew = + new G4DynamicParticle(aT.GetDefinition(), newE, newP*aR->GetMomentumChange()); + // std::cout << "Debug 0 "<GetNumberOfSecondaries()<GetEnergyChange()<<" "<< aNew->GetTotalEnergy() <GetMomentumChange()<<" "<< aNew->GetMomentum() << std::endl; + //std::cout << "Debug 3 "<AddSecondary(theSec); + aR->SetStatusChange(stopAndKill); + theTotalResult->SetStatusChange(fStopAndKill); + theTotalResult->SetEnergyChange( 0.0 ); + //std::cout << "Debug 4 "<< aR->GetNumberOfSecondaries() <SetLocalEnergyDeposit(aR->GetLocalEnergyDeposit()); theTotalResult->SetNumberOfSecondaries(aR->GetNumberOfSecondaries()); for(G4int i=0; iGetNumberOfSecondaries(); i++) { + //std::cout << "Debug 5 "<< aR->GetNumberOfSecondaries() <GetSecondary(i)->GetParticle()->Get4Momentum(); theM.rotate(rotation, it); theM*=aR->GetTrafoToLab(); @@ -696,16 +727,16 @@ void G4HadronicProcess::FillTotalResult(G4HadFinalState * aR, const G4Track & aT G4double newWeight = aT.GetWeight()*aR->GetSecondary(i)->GetWeight(); //static G4double pinelcount=0; if(xBiasOn) newWeight *= XBiasSecondaryWeight(); - /* G4cout << "#### ParticleDebug " - <GetSecondary(i)->GetParticle()->GetDefinition()->GetParticleName()<<" " - <GetSecondary(i)->GetWeight()<<" " - <GetSecondary(i)->GetParticle()<<" " - <GetSecondary(i)->GetParticle()->GetDefinition()->GetParticleName()<<" " + // <GetSecondary(i)->GetWeight()<<" " + // <GetSecondary(i)->GetParticle()->Get4Momentum()<<" " + // <SetWeight(newWeight); G4double trackDeb = track->GetKineticEnergy(); if( ( trackDeb<0 diff --git a/source/processes/hadronic/models/GNUmakefile b/source/processes/hadronic/models/GNUmakefile index c38d26bf5a..792d6bdda3 100644 --- a/source/processes/hadronic/models/GNUmakefile +++ b/source/processes/hadronic/models/GNUmakefile @@ -1,11 +1,12 @@ -# $Id: GNUmakefile,v 1.13 2003/11/24 12:54:22 gcosmo Exp $ +# $Id: GNUmakefile,v 1.16 2004/06/01 05:37:56 hpw Exp $ # -------------------------------------------------------------- # GNUmakefile for hadronic models library. G.Folger 10-Dec-97 # -------------------------------------------------------------- name := G4hadronic_models -SUBDIRS = binary_cascade +SUBDIRS = abrasion +SUBDIRS += binary_cascade SUBDIRS += cascade/evaporation SUBDIRS += cascade/utils SUBDIRS += cascade/cascade @@ -21,6 +22,8 @@ SUBDIRS += de_excitation/management SUBDIRS += de_excitation/multifragmentation SUBDIRS += de_excitation/photon_evaporation SUBDIRS += de_excitation/util +SUBDIRS += de_excitation/ablation +SUBDIRS += em_dissociation SUBDIRS += high_energy SUBDIRS += im_r_matrix SUBDIRS += isotope_production @@ -38,7 +41,8 @@ SUBDIRS += radioactive_decay SUBDIRS += theo_high_energy SUBDIRS += util -SUBLIBS = G4hadronic_binary +SUBLIBS = G4hadronic_abrasion +SUBLIBS += G4hadronic_binary SUBLIBS += G4hadronic_coherent_elastic SUBLIBS += G4hadronic_HE SUBLIBS += G4had_im_r_matrix @@ -64,6 +68,8 @@ SUBLIBS += G4hadronic_deex_management SUBLIBS += G4hadronic_deex_multifragmentation SUBLIBS += G4hadronic_deex_photon_evaporation SUBLIBS += G4hadronic_deex_util +SUBLIBS += G4hadronic_ablation +SUBLIBS += G4hadronic_em_dissociation SUBLIBS += G4had_preequ_exciton SUBLIBS += G4had_muon_nuclear SUBLIBS += G4had_string_diff diff --git a/source/processes/hadronic/models/abrasion/GNUmakefile b/source/processes/hadronic/models/abrasion/GNUmakefile new file mode 100644 index 0000000000..34f79b2362 --- /dev/null +++ b/source/processes/hadronic/models/abrasion/GNUmakefile @@ -0,0 +1,50 @@ +# $Id: GNUmakefile,v 1.2 2004/05/28 13:00:45 hpw Exp $ +# ----------------------------------------------------------- +# GNUmakefile for hadronic library. Gabriele Cosmo, 18/9/96. +# ----------------------------------------------------------- + +name := G4hadronic_abrasion + +ifndef G4INSTALL + G4INSTALL = ../../../../.. +endif + +include $(G4INSTALL)/config/architecture.gmk + +CPPFLAGS += -I$(G4BASE)/global/management/include \ + -I$(G4BASE)/global/HEPRandom/include \ + -I$(G4BASE)/global/HEPNumerics/include \ + -I$(G4BASE)/global/HEPGeometry/include \ + -I$(G4BASE)/track/include \ + -I$(G4BASE)/geometry/volumes/include \ + -I$(G4BASE)/geometry/magneticfield/include \ + -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/processes/include \ + -I$(G4BASE)/processes/hadronic/cross_sections/include \ + -I$(G4BASE)/processes/hadronic/models/management/include \ + -I$(G4BASE)/processes/hadronic/models/util/include \ + -I$(G4BASE)/processes/hadronic/models/im_r_matrix/include \ + -I$(G4BASE)/processes/hadronic/models/ablation/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/util/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/evaporation/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/fermi_breakup/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/photon_evaporation/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/multifragmentation/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/handler/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/management/include \ + -I$(G4BASE)/processes/hadronic/models/de_excitation/ablation/include \ + -I$(G4BASE)/processes/hadronic/models/pre_equilibrium/exciton_model/include \ + -I$(G4BASE)/particles/management/include \ + -I$(G4BASE)/particles/leptons/include \ + -I$(G4BASE)/particles/bosons/include \ + -I$(G4BASE)/particles/hadrons/mesons/include \ + -I$(G4BASE)/particles/hadrons/barions/include \ + -I$(G4BASE)/particles/hadrons/ions/include \ + -I$(G4BASE)/particles/shortlived/include \ + -I$(G4BASE)/materials/include + +include $(G4INSTALL)/config/common.gmk + diff --git a/source/processes/hadronic/models/abrasion/include/G4NuclearAbrasionGeometry.hh b/source/processes/hadronic/models/abrasion/include/G4NuclearAbrasionGeometry.hh new file mode 100644 index 0000000000..2ded29627c --- /dev/null +++ b/source/processes/hadronic/models/abrasion/include/G4NuclearAbrasionGeometry.hh @@ -0,0 +1,95 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4NuclearAbrasionGeometry_h +#define G4NuclearAbrasionGeometry_h 1 +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4NuclearAbrasionGeometry.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 18 November 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "globals.hh" + +//////////////////////////////////////////////////////////////////////////////// +// +class G4NuclearAbrasionGeometry +{ + public: + G4NuclearAbrasionGeometry (G4double AP, G4double AT, G4double r); + ~G4NuclearAbrasionGeometry (); + void SetPeripheralThreshold (G4double); + G4double GetPeripheralThreshold (); + G4double F (); + G4double P (); + G4double GetExcitationEnergyOfProjectile (); + G4double GetExcitationEnergyOfTarget (); + + private: + G4double AP; + G4double AT; + G4double rP; + G4double rT; + G4double r; + G4double n; + G4double b; + G4double m; + + G4double Q; + G4double S; + G4double T; + G4double R; + G4double U; + + G4double rth; + G4double B; +}; +#endif diff --git a/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh b/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh new file mode 100644 index 0000000000..bb29927766 --- /dev/null +++ b/source/processes/hadronic/models/abrasion/include/G4WilsonAbrasionModel.hh @@ -0,0 +1,152 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4WilsonAbrasionModel_h +#define G4WilsonAbrasionModel_h +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4WilsonAbrasionModel.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// Class Description +// +// +// Class Description - End +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "globals.hh" + +#include "G4HadronicInteraction.hh" +#include "G4WilsonAblationModel.hh" +#include "G4ExcitationHandler.hh" +#include "G4HadFinalState.hh" +#include "G4Track.hh" +#include "G4Nucleus.hh" +#include "G4Fragment.hh" +#include "G4HadProjectile.hh" +//////////////////////////////////////////////////////////////////////////////// +// +class G4WilsonAbrasionModel : public G4HadronicInteraction +{ + public: + G4WilsonAbrasionModel (G4bool useAblation1 = false); + G4WilsonAbrasionModel (G4ExcitationHandler *); + ~G4WilsonAbrasionModel (); + + G4WilsonAbrasionModel(const G4WilsonAbrasionModel &right); + + const G4WilsonAbrasionModel& operator=(G4WilsonAbrasionModel &right); + + virtual G4HadFinalState *ApplyYourself + (const G4HadProjectile &, G4Nucleus &); + void SetVerboseLevel (G4int); + void SetUseAblation (G4bool); + G4bool GetUseAblation (); + void SetConserveMomentum (G4bool); + G4bool GetConserveMomentum (); + void SetExcitationHandler (G4ExcitationHandler *); + G4ExcitationHandler *GetExcitationHandler (); + + private: + void PrintWelcomeMessage (); + G4Fragment *GetAbradedNucleons (G4int, G4double, G4double, G4double); + G4double GetNucleonInducedExcitation (G4double, G4double, G4double); + void SetConserveEnergy (G4bool); + G4bool GetConserveEnergy (); + + private: + G4double r0sq; + G4double npK; + G4bool useAblation; + G4WilsonAblationModel *theAblation; + G4ExcitationHandler *theExcitationHandler; + G4ExcitationHandler *theExcitationHandlerx; + G4bool conserveEnergy; + G4bool conserveMomentum; + G4double B; + G4double third; +}; +//////////////////////////////////////////////////////////////////////////////// +// +inline void G4WilsonAbrasionModel::SetExcitationHandler + (G4ExcitationHandler *aExcitationHandler) + {theExcitationHandler = aExcitationHandler;} + +inline G4ExcitationHandler *G4WilsonAbrasionModel::GetExcitationHandler () + {return theExcitationHandler;} + +inline G4bool G4WilsonAbrasionModel::GetUseAblation () + {return useAblation;} + +inline void G4WilsonAbrasionModel::SetConserveEnergy (G4bool conserveEnergy1) + {conserveEnergy = conserveEnergy1;} + +inline G4bool G4WilsonAbrasionModel::GetConserveEnergy () + {return conserveEnergy;} + +inline void G4WilsonAbrasionModel::SetConserveMomentum + (G4bool conserveMomentum1) + {conserveMomentum = conserveMomentum1;} + +inline G4bool G4WilsonAbrasionModel::GetConserveMomentum () + {return conserveMomentum;} + +inline void G4WilsonAbrasionModel::SetVerboseLevel (G4int verboseLevel1) +{ + verboseLevel = verboseLevel1; + if (useAblation) + theAblation->SetVerboseLevel(verboseLevel); +} +//////////////////////////////////////////////////////////////////////////////// +// +#endif diff --git a/source/processes/hadronic/models/abrasion/src/G4NuclearAbrasionGeometry.cc b/source/processes/hadronic/models/abrasion/src/G4NuclearAbrasionGeometry.cc new file mode 100644 index 0000000000..188ac246a0 --- /dev/null +++ b/source/processes/hadronic/models/abrasion/src/G4NuclearAbrasionGeometry.cc @@ -0,0 +1,227 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4NuclearAbrasionGeometry.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 18 November 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// 4 June 2004, J.P. Wellisch, CERN, Switzerland +// resolving technical portability issues. +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4NuclearAbrasionGeometry.hh" +#include "G4WilsonRadius.hh" +//////////////////////////////////////////////////////////////////////////////// +// +G4NuclearAbrasionGeometry::G4NuclearAbrasionGeometry (G4double AP1, + G4double AT1, G4double r1) +{ +// +// +// Initialise variables for interaction geometry. +// + G4WilsonRadius aR; + AP = AP1; + AT = AT1; + rP = aR.GetWilsonRadius(AP); + rT = aR.GetWilsonRadius(AT); + r = r1; + n = rP / (rP + rT); + b = r / (rP + rT); + m = rT / rP; + Q = (1.0 - b)/n; + S = Q * Q; + T = S * Q; + R = sqrt(m*n); + U = 1.0/m - 2.0; +// +// +// Initialise the threshold radius-ratio at which interactions are considered +// peripheral or central. +// + rth = 2.0/3.0; + B = 10.0 * MeV; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4NuclearAbrasionGeometry::~G4NuclearAbrasionGeometry () +{;} +//////////////////////////////////////////////////////////////////////////////// +// +void G4NuclearAbrasionGeometry::SetPeripheralThreshold (G4double rth1) + {if (rth1 > 0.0 && rth1 <= 1.0) rth = rth1;} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4NuclearAbrasionGeometry::GetPeripheralThreshold () + {return rth;} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4NuclearAbrasionGeometry::P () +{ +// +// +// Initialise the value for P, then determine the actual value depending upon +// whether the projectile is larger or smaller than the target and these radii +// in relation to the impact parameter. +// + G4double P = 0.0; + + if (rT > rP) + { + if (rT-rP<=r && r<=rT+rP) P = 0.125*R*U*S - 0.125*(0.5*R*U+1.0)*T; + else P = -1.0; + } + else + { + if (rP-rT<=r && r<=rP+rT) P = 0.125*R*U*S - 0.125*(0.5*sqrt(n/m)*U- + (sqrt(1.0-m*m)/n - 1.0)*sqrt((2.0-m)/pow(m,5.0)))*T; + else P = (sqrt(1.0-m*m)/n-1.0)*sqrt(1.0-b*b/n/n); + } + + if (!(P <= 1.0 && P>= -1.0)) + { + if (P > 1.0) P = 1.0; + else P = -1.0; + } + return P; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4NuclearAbrasionGeometry::F () +{ +// +// +// Initialise the value for F, then determine the actual value depending upon +// whether the projectile is larger or smaller than the target and these radii +// in relation to the impact parameter. +// + G4double F = 0.0; + + if (rT > rP) + { + if (rT-rP<=r && r<=rT+rP) F = 0.75*R*S - 0.125*(3.0*R-1.0)*T; + else F = 1.0; + } + else + { + if (rP-rT<=r && r<=rP+rT) F = 0.75*R*S - 0.125*(3.0*sqrt(n/m)- + (1.0-pow(1.0-m*m,3.0/2.0))*sqrt(1.0-pow(1.0-m,2.0))/pow(m,3.0))*T; + else F = (1.0-pow(1.0-m*m,3.0/2.0))*sqrt(1.0-b*b/n/n); + } + + if (!(F <= 1.0 && F>= 0.0)) + { + if (F > 1.0) F = 1.0; + else F = 0.0; + } + return F; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4NuclearAbrasionGeometry::GetExcitationEnergyOfProjectile () +{ + G4double F1 = F(); + G4double P1 = P(); + G4double Es = 0.0; + + Es = 0.95 * MeV * 4.0 * pi * rP*rP/fermi/fermi * + (1.0+P1-pow(1.0-F1,2.0/3.0)); +// if (rT < rP && r < rP-rT) + if ((r-rP)/rT < rth) + { + G4double omega = 0.0; + if (AP < 12.0) omega = 1500.0; + else if (AP <= 16.0) omega = 1500.0 - 320.0*(AP-12.0); + Es *= 1.0 + F1*(5.0+omega*F1*F1); + } + + if (Es < 0.0) + Es = 0.0; + else if (Es > B * AP) + Es = B * AP; + return Es; +} +////////////////////////////////////////////////////////////////////////////////////// +// +G4double G4NuclearAbrasionGeometry::GetExcitationEnergyOfTarget () +{ +// +// +// This member function declares a new G4NuclearAbrasionGeometry object but with the +// projectile and target exchanged to determine the values for F and P. Determination +// of the excess surface area and excitation energy is as above. +// + G4NuclearAbrasionGeometry *revAbrasionGeometry = + new G4NuclearAbrasionGeometry(AT, AP, r); + G4double F1 = revAbrasionGeometry->F(); + G4double P1 = revAbrasionGeometry->P(); + G4double Es = 0.0; + + Es = 0.95 * MeV * 4.0 * pi * rT*rT/fermi/fermi * + (1.0+P1-pow(1.0-F1,2.0/3.0)); +// if (rP < rT && r < rT-rP) + if ((r-rT)/rP < rth) + { + G4double omega = 0.0; + if (AT < 12.0) omega = 1500.0; + else if (AT <= 16.0) omega = 1500.0 - 320.0*(AT-12.0); + Es *= 1.0 + F1*(5.0+omega*F1*F1); + } + + if (Es < 0.0) + Es = 0.0; + else if (Es > B * AT) + Es = B * AT; + return Es; +} +//////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc b/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc new file mode 100644 index 0000000000..f9193198a2 --- /dev/null +++ b/source/processes/hadronic/models/abrasion/src/G4WilsonAbrasionModel.cc @@ -0,0 +1,813 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4WilsonAbrasionModel.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4WilsonAbrasionModel.hh" +#include "G4WilsonRadius.hh" +#include "G4NuclearAbrasionGeometry.hh" +#include "G4WilsonAblationModel.hh" + +#include "G4ExcitationHandler.hh" +#include "G4Evaporation.hh" +#include "G4FermiBreakUp.hh" +#include "G4StatMF.hh" +#include "G4ParticleDefinition.hh" +#include "G4DynamicParticle.hh" +#include "Randomize.hh" +#include "G4Fragment.hh" +#include "G4VNuclearDensity.hh" +#include "G4NuclearShellModelDensity.hh" +#include "G4NuclearFermiDensity.hh" +#include "G4FermiMomentum.hh" +#include "G4ReactionProductVector.hh" +#include "G4LorentzVector.hh" +#include "G4ParticleMomentum.hh" +#include "G4Poisson.hh" +#include "G4ParticleTable.hh" +#include "G4IonTable.hh" +#include "globals.hh" +//////////////////////////////////////////////////////////////////////////////// +// +G4WilsonAbrasionModel::G4WilsonAbrasionModel (G4bool useAblation1) +{ +// +// +// Send message to stdout to advise that the G4Abrasion model is being used. +// + PrintWelcomeMessage(); +// +// +// Set the default verbose level to 0 - no output. +// + verboseLevel = 0; + useAblation = useAblation1; +// +// +// No de-excitation handler has been supplied - define the default handler. +// + theExcitationHandler = new G4ExcitationHandler; + theExcitationHandlerx = new G4ExcitationHandler; + if (useAblation) + { + theAblation = new G4WilsonAblationModel; + theAblation->SetVerboseLevel(verboseLevel); + theExcitationHandler->SetEvaporation(theAblation); + theExcitationHandlerx->SetEvaporation(theAblation); + } + else + { + theAblation = NULL; + G4Evaporation * theEvaporation = new G4Evaporation; + G4FermiBreakUp * theFermiBreakUp = new G4FermiBreakUp; + G4StatMF * theMF = new G4StatMF; + theExcitationHandler->SetEvaporation(theEvaporation); + theExcitationHandler->SetFermiModel(theFermiBreakUp); + theExcitationHandler->SetMultiFragmentation(theMF); + theExcitationHandler->SetMaxAandZForFermiBreakUp(12, 6); + theExcitationHandler->SetMinEForMultiFrag(5.0*MeV); + + theEvaporation = new G4Evaporation; + theFermiBreakUp = new G4FermiBreakUp; + theExcitationHandlerx->SetEvaporation(theEvaporation); + theExcitationHandlerx->SetFermiModel(theFermiBreakUp); + theExcitationHandlerx->SetMaxAandZForFermiBreakUp(12, 6); + } +// +// +// Set the minimum and maximum range for the model (despite nomanclature, this +// is in energy per nucleon number). +// + SetMinEnergy(70.0*MeV); + SetMaxEnergy(10.1*GeV); + isBlocked = false; +// +// +// npK, when mutiplied by the nuclear Fermi momentum, determines the range of +// momentum over which the secondary nucleon momentum is sampled. +// + npK = 5.0; + B = 10.0 * MeV; + third = 1.0 / 3.0; + conserveEnergy = false; + conserveMomentum = true; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4WilsonAbrasionModel::G4WilsonAbrasionModel (G4ExcitationHandler *aExcitationHandler) +{ +// +// +// Send message to stdout to advise that the G4Abrasion model is being used. +// + PrintWelcomeMessage(); +// +// +// Set the default verbose level to 0 - no output. +// + verboseLevel = 0; +// +// +// The user is able to provide the excitation handler as well as an argument +// which is provided in this instantiation is used to determine +// whether the spectators of the interaction are free following the abrasion. +// + theExcitationHandler = aExcitationHandler; + theExcitationHandlerx = new G4ExcitationHandler; + G4Evaporation * theEvaporation = new G4Evaporation; + G4FermiBreakUp * theFermiBreakUp = new G4FermiBreakUp; + theExcitationHandlerx->SetEvaporation(theEvaporation); + theExcitationHandlerx->SetFermiModel(theFermiBreakUp); + theExcitationHandlerx->SetMaxAandZForFermiBreakUp(12, 6); +// +// +// Set the minimum and maximum range for the model (despite nomanclature, this +// is in energy per nucleon number). +// + SetMinEnergy(70.0*MeV); + SetMaxEnergy(10.1*GeV); + isBlocked = false; +// +// +// npK, when mutiplied by the nuclear Fermi momentum, determines the range of +// momentum over which the secondary nucleon momentum is sampled. +// + npK = 5.0; + B = 10.0 * MeV; + third = 1.0 / 3.0; + conserveEnergy = false; + conserveMomentum = true; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4WilsonAbrasionModel::~G4WilsonAbrasionModel () +{ +// +// +// The destructor doesn't have to do a great deal! +// + delete theExcitationHandler; + delete theExcitationHandlerx; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4HadFinalState *G4WilsonAbrasionModel::ApplyYourself ( + const G4HadProjectile &theTrack, G4Nucleus &theTarget) +{ +// +// +// The secondaries will be returned in G4HadFinalState &theParticleChange - +// initialise this. The original track will always be discontinued and +// secondaries followed. +// + theParticleChange.Clear(); + theParticleChange.SetStatusChange(stopAndKill); +// +// +// Get relevant information about the projectile and target (A, Z, energy/nuc, +// momentum, etc). +// + const G4ParticleDefinition *definitionP = theTrack.GetDefinition(); + const G4double AP = definitionP->GetBaryonNumber(); + const G4double ZP = definitionP->GetPDGCharge(); + G4LorentzVector pP = theTrack.Get4Momentum(); + G4double E = theTrack.GetKineticEnergy()/AP; + G4double AT = theTarget.GetN(); + G4double ZT = theTarget.GetZ(); + G4double TotalEPre = theTrack.GetTotalEnergy() + + theTarget.AtomicMass(AT, ZT) + theTarget.GetEnergyDeposit(); + G4double TotalEPost = 0.0; +// +// +// Determine the radii of the projectile and target nuclei. +// + G4WilsonRadius aR; + G4double rP = aR.GetWilsonRadius(AP); + G4double rT = aR.GetWilsonRadius(AT); + G4double rPsq = rP * rP; + G4double rTsq = rT * rT; + if (verboseLevel >= 2) + { + G4cout <<"########################################" + <<"########################################" + <1, i.e. an interaction MUST occur. +// + while (Dabr == 0) + { +// +// +// Sample the impact parameter. For the moment, this class takes account of +// electrostatic effects on the impact parameter, but (like HZETRN AND NUCFRG2) +// does not make any correction for the effects of nuclear-nuclear repulsion. +// + G4double rPT = rP + rT; + G4double rPTsq = rPT * rPT; + r = 1.1 * rPT; + while (r > rPT) + { + G4double bsq = rPTsq * G4UniformRand(); + r = (rm + sqrt(rm*rm + 4.0*bsq)) / 2.0; + } + rsq = r * r; +// +// +// Now determine the chord-length through the target nucleus. +// + if (rT > rP) + { + G4double x = (rPsq + rsq - rTsq) / 2.0 / r; + if (x > 0.0) CT = 2.0 * sqrt(rTsq - x*x); + else CT = 2.0 * sqrt(rTsq - rsq); + } + else + { + G4double x = (rTsq + rsq - rPsq) / 2.0 / r; + if (x > 0.0) CT = 2.0 * sqrt(rTsq - x*x); + else CT = 2.0 * rT; + } +// +// +// Determine the number of abraded nucleons. Note that the mean number of +// abraded nucleons is used to sample the Poisson distribution. The Poisson +// distribution is sampled only ten times with the current impact parameter, +// and if it fails after this to find a case for which the number of abraded +// nucleons >1, the impact parameter is re-sampled. +// + theAbrasionGeometry = new G4NuclearAbrasionGeometry(AP,AT,r); + F = theAbrasionGeometry->F(); + G4double lambda = 16.6*fermi / pow(E/MeV,0.26); + G4double Mabr = F * AP * (1.0 - exp(-CT/lambda)); + G4long n = 0; + for (G4int i = 0; i<10; i++) + { + n = G4Poisson(Mabr); + if (n > 0) + { + if (n>AP) Dabr = (G4int) AP; + else Dabr = (G4int) n; + break; + } + } + } + if (verboseLevel >= 2) + { + G4cout <GetParticle()->DumpInfo(); + G4DynamicParticle *dyn = theParticleChange.GetSecondary(i)->GetParticle(); + G4cout <<"New nucleon (P) " <GetDefinition()->GetParticleName() + <<" : " <Get4Momentum() + <GetParticle()->DumpInfo(); + G4DynamicParticle *dyn = theParticleChange.GetSecondary(i)->GetParticle(); + G4cout <<"New nucleon (T) " <GetDefinition()->GetParticleName() + <<" : " <Get4Momentum() + <GetZ() != fragmentP->GetA()) + products = theExcitationHandler->BreakItUp(*fragmentP); + else + products = theExcitationHandlerx->BreakItUp(*fragmentP); + delete fragmentP; + fragmentP = NULL; + + G4ReactionProductVector::iterator iter; + for (iter = products->begin(); iter != products->end(); ++iter) + { + G4DynamicParticle *secondary = + new G4DynamicParticle((*iter)->GetDefinition(), + (*iter)->GetTotalEnergy(), (*iter)->GetMomentum()); + G4String particleName = (*iter)->GetDefinition()->GetParticleName(); + if (verboseLevel >= 2 && particleName.find("[",0) < particleName.size()) + { + G4cout <<"------------------------" <GetPDGMass(); + G4double E = sqrt(p*p + nucleonMass*nucleonMass)-nucleonMass; + dynamicNucleon = new G4DynamicParticle(typeNucleon,direction,E); + theParticleChange.AddSecondary (dynamicNucleon); + pabr += p*direction; + } +// +// +// Next determine the details of the nuclear prefragment .. that is if there +// is one or more protons in the residue. (Note that the 1 eV in the total +// energy is a safety factor to avoid any possibility of negative rest mass +// energy.) +// + G4Fragment *fragment = NULL; + if (Z-Zabr>=1.0) + { + G4double ionMass = G4ParticleTable::GetParticleTable()->GetIonTable()-> + GetIonMass(G4lrint(Z-Zabr),G4lrint(A-Aabr)); + G4double E = sqrt(pabr.mag2() + ionMass*ionMass); + G4LorentzVector lorentzVector = G4LorentzVector(-pabr, E + 1.0*eV); + fragment = + new G4Fragment((G4int) (A-Aabr), (G4int) (Z-Zabr), lorentzVector); + } + + return fragment; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4WilsonAbrasionModel::GetNucleonInducedExcitation + (G4double rP, G4double rT, G4double r) +{ +// +// +// Initialise variables. +// + G4double Cl = 0.0; + G4double rPsq = rP * rP; + G4double rTsq = rT * rT; + G4double rsq = r * r; +// +// +// Depending upon the impact parameter, a different form of the chord length is +// is used. +// + if (r > rT) Cl = 2.0*sqrt(rPsq + 2.0*r*rT - rsq - rTsq); + else Cl = 2.0*rP; + + G4double bP = (rPsq+rsq-rTsq)/2.0/r; + G4double Ct = 2.0*sqrt(rPsq - bP*bP); + + G4double Ex = 13.0 * Cl / fermi; + if (Ct > 1.5*fermi) + Ex += 13.0 * Cl / fermi /3.0 * (Ct/fermi - 1.5); + + return Ex; +} +//////////////////////////////////////////////////////////////////////////////// +// +void G4WilsonAbrasionModel::SetUseAblation (G4bool useAblation1) +{ + if (useAblation != useAblation1) + { + useAblation = useAblation1; + delete theExcitationHandler; + delete theExcitationHandlerx; + theExcitationHandler = new G4ExcitationHandler; + theExcitationHandlerx = new G4ExcitationHandler; + if (useAblation) + { + theAblation = new G4WilsonAblationModel; + theAblation->SetVerboseLevel(verboseLevel); + theExcitationHandler->SetEvaporation(theAblation); + theExcitationHandlerx->SetEvaporation(theAblation); + } + else + { + theAblation = NULL; + G4Evaporation * theEvaporation = new G4Evaporation; + G4FermiBreakUp * theFermiBreakUp = new G4FermiBreakUp; + G4StatMF * theMF = new G4StatMF; + theExcitationHandler->SetEvaporation(theEvaporation); + theExcitationHandler->SetFermiModel(theFermiBreakUp); + theExcitationHandler->SetMultiFragmentation(theMF); + theExcitationHandler->SetMaxAandZForFermiBreakUp(12, 6); + theExcitationHandler->SetMinEForMultiFrag(5.0*MeV); + + theEvaporation = new G4Evaporation; + theFermiBreakUp = new G4FermiBreakUp; + theExcitationHandlerx->SetEvaporation(theEvaporation); + theExcitationHandlerx->SetFermiModel(theFermiBreakUp); + theExcitationHandlerx->SetMaxAandZForFermiBreakUp(12, 6); + } + } + return; +} +//////////////////////////////////////////////////////////////////////////////// +// +void G4WilsonAbrasionModel::PrintWelcomeMessage () +{ + G4cout < 1e-5 ) + { + G4cout <<" BIC-weight change " << theParticleChange.GetWeightChange()<< G4endl; + } + for(iter = products->begin(); iter != products->end(); ++iter) { G4DynamicParticle * aNew = @@ -245,6 +250,10 @@ G4HadFinalState * G4BinaryCascade::ApplyYourself(const G4HadProjectile & aTrack, the3DNucleus = NULL; // protect from wrong usage... if(getenv("BCDEBUG") ) G4cerr << " ######### Binary Cascade Reaction number ends ######### "< 1e-5 ) + { + G4cout <<" BIC-fin-weight change " << theParticleChange.GetWeightChange()<< G4endl; + } return &theParticleChange; } @@ -425,6 +434,12 @@ G4ReactionProductVector * G4BinaryCascade::Propagate( PrintKTVector(&theFinalState,std::string(" FinalState uncorrected")); #endif +// + + + + + CorrectFinalPandE(); #ifdef debug_G4BinaryCascade @@ -436,41 +451,34 @@ G4ReactionProductVector * G4BinaryCascade::Propagate( G4double ExcitationEnergy=GetExcitationEnergy(); // G4cerr <<"mon - all pushed to limit 2"<::iterator i = secondaries->begin(); i != secondaries->end(); ++i) { - for(std::vector::iterator j = theImR.begin(); + if ( (*i)->GetTrackingMomentum().mag2() < -1.*eV ) + { + G4cout << "G4BinaryCascade::FindCollisions(): negative m2:" << (*i)->GetTrackingMomentum().mag2() << G4endl; + } +for(std::vector::iterator j = theImR.begin(); j!=theImR.end(); j++) { const std::vector & aCandList @@ -1157,7 +1169,6 @@ void G4BinaryCascade::StepParticlesOut() { G4int counter=0; G4int countreset=0; - G4double steplength=1.0 * fermi; //G4cout << " nucl. Radius " << radius << G4endl; // G4cerr <<"pre-while- theSecondaryList "< 0 ) @@ -1171,27 +1182,24 @@ void G4BinaryCascade::StepParticlesOut() G4KineticTrack * kt = *i; if( kt->GetState() == G4KineticTrack::inside ) { - if((kt->GetDefinition() == G4Proton::Proton()) || // @@@ GF why only for nucleons? - (kt->GetDefinition() == G4Neutron::Neutron())) - { nsec++; - G4double tStep = steplength / ( kt->Get4Momentum().beta() * c_light ); + G4double tStep(0), tdummy(0); + ((G4RKPropagation*)thePropagator)->GetSphereIntersectionTimes(kt,tdummy,tStep); #ifdef debug_G4BinaryCascade G4cout << " minTimeStep, tStep Particle " <GetDefinition()->GetParticleName() << " 4mom " << kt->GetTrackingMomentum()<GetDefinition()->GetParticleName() + << " 4mom " << kt->GetTrackingMomentum()< 0 ) { minTimeStep = tStep; -// G4cerr <<"Position "<GetPosition().mag()<<" " -// <GetTrackingMomentum().e()-kt->GetTrackingMomentum().mag()<GetState() != G4KineticTrack::outside ){ PrintKTVector(&theSecondaryList, std::string(" state ERROR.....")); throw G4HadronicException(__FILE__, __LINE__, "G4BinaryCascade::StepParticlesOut() particle not in nucleus"); } } + minTimeStep *= 1.2; // G4cerr << "CaptureCount = "< pInCM ) { +#ifdef debug_G4BinaryCascade +G4cerr << " -CorrectFinalPandE 5" << G4endl; +#endif G4ThreeVector p3finals=pInCM*pFinals.vect().unit(); // G4ThreeVector deltap=(p3finals - pFinals.vect() ) / nFinals; @@ -1356,7 +1391,10 @@ void G4BinaryCascade::CorrectFinalPandE() << " CMS pFinals , mag, 3.mag : " << qFinals << " " << qFinals.mag() << " " << qFinals.vect().mag()<< G4endl; #endif } - +#ifdef debug_G4BinaryCascade + else { G4cerr << " -CorrectFinalPandE 6" << G4endl; } +#endif + } //---------------------------------------------------------------------------- @@ -1963,7 +2001,7 @@ G4LorentzVector G4BinaryCascade::GetFinalNucleusMomentum() G4LorentzRotation nucleusBoost( -boost ); precompoundLorentzboost.set( boost ); #ifdef debug_G4BinaryCascade - G4cout << "it "< 100) + { + // abort!! + + G4cerr << "G4BinaryLightIonReaction no final state for: " << G4endl; + G4cerr << " Primary " << aTrack.GetDefinition() + << ", (A,Z)=(" << aTrack.GetDefinition()->GetBaryonNumber() + << "," << aTrack.GetDefinition()->GetPDGCharge() << ") " + << ", kinetic energy " << aTrack.GetKineticEnergy() + << G4endl; + G4cerr << " Target nucleus (A,Z)=(" << targetNucleus.GetN() + << "," << targetNucleus.GetZ() << G4endl; + G4cerr << " if frequent, please submit above information as bug report" + << G4endl << G4endl; + + theResult.Clear(); + theResult.SetStatusChange(isAlive); + theResult.SetEnergyChange(aTrack.GetKineticEnergy()); + theResult.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); + return &theResult; + + } } else { @@ -366,11 +389,27 @@ proFrag = theHandler.BreakItUp(aProRes); if ( momentum.vect().mag() > momentum.e() ) { - G4cout << "mom check: " << momentum + G4cerr << "mom check: " << momentum << " 3.mag "<< momentum.vect().mag() << G4endl << " .. iState/fState/spectators " << iState <<" " << fState << " " << pspectators << G4endl << " .. A,Z " << resA <<" "<< resZ << G4endl; + G4cerr << "G4BinaryLightIonReaction no final state for: " << G4endl; + G4cerr << " Primary " << aTrack.GetDefinition() + << ", (A,Z)=(" << aTrack.GetDefinition()->GetBaryonNumber() + << "," << aTrack.GetDefinition()->GetPDGCharge() << ") " + << ", kinetic energy " << aTrack.GetKineticEnergy() + << G4endl; + G4cerr << " Target nucleus (A,Z)=(" << targetNucleus.GetN() + << "," << targetNucleus.GetZ() << G4endl; + G4cerr << " if frequent, please submit above information as bug report" + << G4endl << G4endl; + + theResult.Clear(); + theResult.SetStatusChange(isAlive); + theResult.SetEnergyChange(aTrack.GetKineticEnergy()); + theResult.SetMomentumChange(aTrack.Get4Momentum().vect().unit()); + return &theResult; } G4LorentzRotation boost_fragments_here(momentum.boostVector()); @@ -477,6 +516,7 @@ if(swapped) { tmp*=toBreit.inverse(); + tmp.setVect(-tmp.vect()); } tmp *= toLab; aNew->Set4Momentum(tmp); diff --git a/source/processes/hadronic/models/binary_cascade/src/G4RKPropagation.cc b/source/processes/hadronic/models/binary_cascade/src/G4RKPropagation.cc index 6fc4098aec..f69f9cb16a 100644 --- a/source/processes/hadronic/models/binary_cascade/src/G4RKPropagation.cc +++ b/source/processes/hadronic/models/binary_cascade/src/G4RKPropagation.cc @@ -240,7 +240,7 @@ void G4RKPropagation::Init(G4V3DNucleus * nucleus) } - +//#define debug_1_RKPropagation 1 //---------------------------------------------------------------------------- void G4RKPropagation::Transport(G4KineticTrackVector & active, //---------------------------------------------------------------------------- @@ -328,7 +328,7 @@ void G4RKPropagation::Transport(G4KineticTrackVector & active, if(newE <= kt->GetActualMass()) // the particle cannot enter the nucleus { // FixMe: should be "pushed back?" -// for the moment take it past teh nucleus, so we'll not worry next time.. +// for the moment take it past the nucleus, so we'll not worry next time.. FreeTransport(kt, 1.1*t_leave); // take past nucleus kt->SetState(G4KineticTrack::miss_nucleus); continue; @@ -623,15 +623,15 @@ G4bool G4RKPropagation::GetSphereIntersectionTimes(const G4KineticTrack * kt, G4double radius = theOuterRadius + 3*fermi; // "safety" of 3 fermi G4ThreeVector speed = kt->GetTrackingMomentum().vect()/kt->GetTrackingMomentum().e(); // bost vector G4double scalarProd = kt->GetPosition().dot(speed); - G4double speedMag = speed.mag(); + G4double speedMag2 = speed.mag2(); G4double sqrtArg = scalarProd*scalarProd - - speedMag*speedMag*(kt->GetPosition().mag2()-radius*radius); + speedMag2*(kt->GetPosition().mag2()-radius*radius); if(sqrtArg <= 0.) // particle will not intersect the sphere { return false; } - t1 = (-scalarProd - sqrt(sqrtArg))/speedMag/speedMag/c_light; - t2 = (-scalarProd + sqrt(sqrtArg))/speedMag/speedMag/c_light; + t1 = (-scalarProd - sqrt(sqrtArg))/speedMag2/c_light; + t2 = (-scalarProd + sqrt(sqrtArg))/speedMag2/c_light; return true; } diff --git a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc index 37992f2363..262a071225 100644 --- a/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc +++ b/source/processes/hadronic/models/cascade/cascade/src/G4CascadeInterface.cc @@ -122,6 +122,8 @@ G4HadFinalState* G4CascadeInterface::ApplyYourself(const G4HadProjectile& aTrack // Set target G4InuclNuclei* target = NULL; G4InuclParticle* targetH = NULL; + // and outcoming particles + G4DynamicParticle* cascadeParticle = NULL; std::vector targetMomentum(4, 0.0); @@ -252,8 +254,6 @@ G4HadFinalState* G4CascadeInterface::ApplyYourself(const G4HadProjectile& aTrack sumEnergy -= ekin / GeV; - G4DynamicParticle* cascadeParticle = NULL; - switch(outgoingParticle) { case proton: @@ -320,7 +320,7 @@ G4HadFinalState* G4CascadeInterface::ApplyYourself(const G4HadProjectile& aTrack } // get nuclei fragments - G4DynamicParticle * aFragment = 0; + G4DynamicParticle * aFragment = NULL; G4ParticleDefinition * aIonDef = 0; G4ParticleTable *theTableOfParticles = G4ParticleTable::GetParticleTable(); @@ -377,5 +377,19 @@ G4HadFinalState* G4CascadeInterface::ApplyYourself(const G4HadProjectile& aTrack } } + delete bullet; + delete colep; + delete inc; + delete noneq; + delete fiss; + delete eqil; + delete bigb; + delete collider; + + if(target != NULL) delete target; + if(targetH != NULL) delete targetH; + if(cascadeParticle != NULL) delete cascadeParticle; + if(aFragment != NULL) delete aFragment; + return &theResult; } diff --git a/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QCaptureAtRest.hh b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QCaptureAtRest.hh new file mode 100644 index 0000000000..1da64d6902 --- /dev/null +++ b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QCaptureAtRest.hh @@ -0,0 +1,141 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: G4QCaptureAtRest.hh,v 1.2 2004/03/18 08:02:37 mkossov Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ---------------- G4QCaptureAtRest header ---------------- +// by Mikhail Kossov, December 2003. +// Header of G4QCaptureAtRest class (mu-,pi-,K-) of the CHIPS Simulation Branch in GEANT4 +// ------------------------------------------------------------------------------- +// This is a unique CHIPS class for the Nuclear Capture At Rest Prosesses. +// ------------------------------------------------------------------------------- +// At present (Dec.03) only pi-, K- and antiNucleon capture is implemented, which +// are the most crucial for the in matter simulation. The hyperon capture (Sigma-, +// Xi-, Omega-, antiSigma+) is implemented, but not tested and it is not clear how +// frequently this kind of interaction takes place in the simulation of the hadronic +// showers. The antiNeutron Capture At Rest is implemented by this G4QCaptureAtRest +// class, but it is not clear how the anti-neutrons are stopped in Geant4 tracking. +// It can be stopped only by interactions with electrons, as the annihilation +// cross section is huge and any interaction with nucleus results in annihilation. +// --> The mu-&tau- Capture At Rest (mu-,nu)&(mu-,nu) are weak processes, which must +// be simulated together with the reversed Betha decay (e-,nu). While mu- capture is +// similar to the pi- capture from the nuclear fragmentation point of view (the energy +// scale is shrinked mecause m_mu CHIPS is SU(3) event generator, so it does not include reactions with the +// heavy (c,b,t) quarks involved such as tau- or antiDs-, which can be simulated +// only by SU(6) QUIPS (QUark Invariant Phase Space) model.-December 2003.M.Kossov.- +// ------------------------------------------------------------------------------- +// All algorithms are similar: the captured particle is absorbed by a nuclear cluster +// with the subsequent Quark Exchange nuclear fragmentation. The Anti-Proton (antiSigma+) +// Capture algorithm is more complicated: the anti-baryon annihilates with the quasyfree +// nucleons on the nuclear periphery. The peripheral interaction results in a number +// of mesons. A part of them misses the nucleus and comes directly to the output, +// while others create Multy Quasmon Excitation in the nucleus with the subsequent +// Quark Excange Fragmentation of the nucleus. At present the two step mechanism of +// the antiProton-Nucleus interaction is hardwired in the G4QEnvironment class, but +// with time the first step of the interaction can be moved to this G4QCaptureAtRest +// class, to make the G4QEnvirement class simpler and better defined. This is +// necessary because the G4QEnvironment class is going to loos the previlage of +// the CHIPS Head Class (as previously the G4Quasmon class lost it) and G4QCollision +// class is going to be the CHIPS Head Class, where a few Nuclear Environments can +// exist (e.g. the Nuclear Environment of the Projectile Nucleus and the Nuclear +// Environment of the Target Nucleus). By the way the antiProton-H1 interaction At +// Rest (CHIPSI) can be still simulated with only the G4Quasmon class, as this +// reaction does not have any nuclear environment.- December 2003.Mikhail Kossov.- +// -------------------------------------------------------------------------------- +// **************************************************************************************** +// ********* This HEADER is temporary moved from the photolepton_hadron directory ********* +// ******* DO NOT MAKE ANY CHANGE! With time it'll move back to photolepton...(M.K.) ****** +// **************************************************************************************** + +#ifndef G4QCaptureAtRest_hh +#define G4QCaptureAtRest_hh + +// GEANT4 Headers +#include "globals.hh" +#include "G4ios.hh" +#include "G4VRestProcess.hh" +#include "G4ParticleTypes.hh" +#include "G4VParticleChange.hh" +#include "G4ParticleDefinition.hh" +#include "G4DynamicParticle.hh" +#include "G4NucleiPropertiesTable.hh" +#include "Randomize.hh" +#include "G4ThreeVector.hh" +#include "G4LorentzVector.hh" + +// CHIPS Headers +#include "G4QEnvironment.hh" +#include "G4QIsotope.hh" +// is included in G4QIsotope.hh +//#include + +class G4QCaptureAtRest : public G4VRestProcess +{ +private: + + // Hide assignment operator as private + G4QCaptureAtRest& operator=(const G4QCaptureAtRest &right); + + // Copy constructor + G4QCaptureAtRest(const G4QCaptureAtRest& ); + +public: + + // Constructor + G4QCaptureAtRest(const G4String& processName ="CHIPSNuclearAbsorptionAtRest"); + + // Destructor + ~G4QCaptureAtRest(); + + G4bool IsApplicable(const G4ParticleDefinition& particle); + + G4VParticleChange* AtRestDoIt(const G4Track& aTrack, const G4Step& aStep); + +protected: + + // zero mean lifetime + G4double GetMeanLifeTime(const G4Track& aTrack, G4ForceCondition* ); + void MuCaptureEMCascade(G4int Z, G4int N, std::vector* dV); + +private: + + G4bool RandomizeMuDecayOrCapture(G4int Z, G4int N); // true=MuCapture, false=MuDecay + void CalculateEnergyDepositionOfMuCapture(G4int Z); // (2p->1s, MeV) @@ Now N-independent + G4bool RandomizeTauDecayOrCapture(G4int Z, G4int N);// true=TauCapture, false=TauDecay + void CalculateEnergyDepositionOfTauCapture(G4int Z);// (2p->1s, MeV) @@N-independ,Improve + +private: + G4double Time; // Time shift of the capture reaction + G4double EnergyDeposition; // Energy deposited in the reaction + +}; +#endif + diff --git a/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QEnvironment.hh b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QEnvironment.hh index 3d7e6e47b0..7dc284c17e 100644 --- a/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QEnvironment.hh +++ b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QEnvironment.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4QEnvironment.hh,v 1.21.2.1 2004/03/25 10:44:38 gunter Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4QEnvironment.hh,v 1.24 2004/06/18 09:19:26 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // ---------------- G4QEnvironment ---------------- // by Mikhail Kossov, August 2000. @@ -59,9 +59,6 @@ public: // Static functions static void SetParameters(G4double solAn=0.4,G4bool efFlag=false,G4double piThresh=141.4, G4double mpisq=20000., G4double dinum=1880.); - // General purpose functions - G4ThreeVector RndmDir(); // Randomize 3D direction (@@subst by libFunc) - private: G4QHadronVector* FSInteraction(); // Final State Interaction after Hadronization G4QHadronVector HadronizeQEnvironment(); // Main HadronizationFunction used in Fragment @@ -105,14 +102,13 @@ private: G4int theTargetPDG; // PDG of the target nucleus in the interaction }; +//General function makes Random Unit 3D-Vector +G4ThreeVector RndmDir(); + +// Inline functions inline G4bool G4QEnvironment::operator==(const G4QEnvironment &rhs) const {return this == &rhs;} inline G4bool G4QEnvironment::operator!=(const G4QEnvironment &rhs) const {return this != &rhs;} inline G4QNucleus G4QEnvironment::GetEnvironment() const {return theEnvironment;} #endif - - - - - diff --git a/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QIsotope.hh b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QIsotope.hh new file mode 100644 index 0000000000..98f82f06d2 --- /dev/null +++ b/source/processes/hadronic/models/chiral_inv_phase_space/body/include/G4QIsotope.hh @@ -0,0 +1,134 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4QIsotope.hh,v 1.1 2004/03/17 13:01:39 mkossov Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// ---------------- G4QIsotope header ---------------- +// by Mikhail Kossov, December 2003. +// Header of the G4QIsotope class of the CHIPS Simulation Branch in GEANT4 +// ---------------------------------------------------------------------------- +// It contains information about natural abundances of stable and long living +// isotopes and a NEW "Element" can be initialised for any isotope set. +// Randomization of isotopes of the Natural Elements is hardwired and fast +// Randomization of isotopes of the user defined Elements is a bit slower +// CrossSectionWeighted randomisation of isotopes is slow (same for Nat and New) +// ------------------------------------------------------------------------------- +// +// 1 2 3 4 5 6 7 8 9 +//34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + +#ifndef G4QIsotope_hh +#define G4QIsotope_hh + +#include "globals.hh" +#include "G4ios.hh" +#include "Randomize.hh" +#include + +class G4QIsotope +{ +protected: + G4QIsotope(); // ***Singletone*** All natural elements are initialized in the Constructor + +public: + ~G4QIsotope(); // It's public for compilation purposes on Windows, user must not call it! + + // Create newElement with the Abundancy vector (User must delete elements of the vector) + // =================================================================================== + // Example of initialization of the new Element (not natural abanduncies of isotopes): + // ======= --------------------------------------------------------------------------- + //std::vector >*a= new std::vector >; + // a->push_back(std::make_pair(n1,abundancy1)); + // a->push_back(std::make_pair(n2,abundancy2)); + // a->push_back(std::make_pair(n3,1.-abundancy1-abundancy2)); + ////Sum of abundancies must be 1 otherwise worning appears & if less LastAbu is increased + // G4int Z=1; + // G4int ind=1; + //// ind>0, if =<0 then the InitElement member function returns the first free index !!! + //// For ind>0 if theIndex "ind" already exists, returns the first free index !!! + // G4QIsotope::Get()->InitElement(Z, ind, a); // G4QIsotope class is a Singletone + // std::for_each(a->begin(), a->end(), void operator()(std::pair >* P) + // {delete P;}); + //// OR just use the following, which is faser: + //// G4int nA=a->size(); + //// if(nA) for(G4int i=0; ioperator[](i);} + // + G4int InitElement(G4int Z, G4int index, std::vector >* abund); + + // A#ofNeutrons in Element with Z & UseDefIndex. Universal for Nat(index=0) & UserDefElem + // ====================================================================================== + G4int GetNeutrons(G4int Z, G4int index=0);//If theElement doesn't exist, returns negative + + // #ofProtons in stable isotopes with fixed A=Z+N. Returns length and fils VectOfIsotopes + // ====================================================================================== + // Example of printing of isotopes with A=152: + // ======= ----------------------------------- + // G4int A=152; // A can not be more than 269 + // std::vector isV(4); // At present A with nIso>4 are not known + // G4int nIso= G4QIsotope::Get()->GetProtons(A, isV); // isV is cleaned up before filling + // if(nIso)for(G4int i,i& isoV); + + // Get a pointer to the vector of pairs(N,CrosS), where N is used to calculate CrosS + // ================================================================================= + // Example of initialization of the Cross Section to randomize weighted isotopes: + // ======= ---------------------------------------------------------------------- + // std::vector*>* cs= G4QIsotope::Get()->GetCSVector(Z, index); + // G4int nIs=cs->size; // A#Of Isotopes in the element + // if(nIs) for(G4int i; iat(i)->first; // A#Of neuterons in the isotope + // cs->at(i)->second = CalculateCrossSection(particle,Z,N)// Calc particle+A(Z,N) CrosS + // } + std::vector*>* GetCSVector(G4int Z, G4int index = 0); + + // Get the abundancy vector for calculation of mean cross sections + std::vector*>* GetAbuVector(G4int Z, G4int index = 0); + + // Get the summed abundancy vector (e.g. for randomization by itself) + std::vector*>* GetSumAVector(G4int Z, G4int index = 0); + + // Calculates the mean Cross Section for the initialized Element(ind=0 Nat,ind>0 UserDef) + G4double GetMeanCrossSection(G4int Z, G4int index = 0); // IsoCS's must init, IfNotRet<0 + + // Randomize A#OfNeutrons in the Isotope weighted by theAbubdancies and theCrossSections + G4int GetCSNeutrons(G4int Z, G4int index = 0); // IsoCrosSections must init, IfNotRet<0 + + static G4QIsotope* Get(); // Get a pointer to the Singletone G4QIsotope + +private: + G4int RandomizeNeutrons(G4int Z); // Gives a#of neutrons in the Random Isotope for the Z + +private: + // Initialized in the constructor + static std::vector*>*> natElements; //NaturalElem's + static std::vector*>*> natSumAbund; //NatElemSumA's + static std::vector*>*> natIsoCrosS; //CSOfNatElem's + // It is initialized by user, but it is cleaned up in the destructor + static std::vector*>*>*> newElems; + static std::vector*>*>*> newSumAb; + static std::vector*>*>*> newIsoCS; +}; +#endif diff --git a/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QCaptureAtRest.cc b/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QCaptureAtRest.cc new file mode 100644 index 0000000000..3a9aa6a72a --- /dev/null +++ b/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QCaptureAtRest.cc @@ -0,0 +1,661 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// $Id: G4QCaptureAtRest.cc,v 1.4 2004/05/27 15:51:31 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ---------------- G4QCaptureAtRest class ----------------- +// by Mikhail Kossov, December 2003. +// G4QCaptureAtRest class of the CHIPS Simulation Branch in GEANT4 +// --------------------------------------------------------------- +// **************************************************************************************** +// ********** This CLASS is temporary moved from the photolepton_hadron directory ********* +// ******* DO NOT MAKE ANY CHANGE! With time it'll move back to photolepton...(M.K.) ****** +// **************************************************************************************** + +//#define debug +//#define pdebug + +#include "G4QCaptureAtRest.hh" + +G4QCaptureAtRest::G4QCaptureAtRest(const G4String& processName) + : G4VRestProcess(processName), Time(0.), EnergyDeposition(0.) +{ +#ifdef debug + G4cout<<"G4QCaptureAtRest::Constructor is called"<0) + { G4cout << GetProcessName() << " is created "<< G4endl; } + G4QCHIPSWorld::Get()->GetParticles(234); // Create CHIPS World of 234 particles + G4QNucleus::SetParameters(0.,0.,1.,1.); // Nuclear clusterization parameters + G4Quasmon::SetParameters(180.,.09,.3); // Temperature, s-antis, eta suppress + G4QEnvironment::SetParameters(.5); // SolAngle (pbar-A secondary capture) +} + + +// Destructor + +G4QCaptureAtRest::~G4QCaptureAtRest() +{} + +G4bool G4QCaptureAtRest::IsApplicable(const G4ParticleDefinition& particle) +{ + if (particle == *( G4PionMinus::PionMinus() )) return true; + else if (particle == *( G4KaonMinus::KaonMinus() )) return true; + else if (particle == *( G4AntiProton::AntiProton() )) return true; + else if (particle == *( G4MuonMinus::MuonMinus() )) return true; + else if (particle == *( G4TauMinus::TauMinus() )) return true; + else if (particle == *( G4SigmaMinus::SigmaMinus() )) return true; + else if (particle == *( G4XiMinus::XiMinus() )) return true; + else if (particle == *( G4OmegaMinus::OmegaMinus() )) return true; + else if (particle == *( G4Neutron::Neutron() )) return true; + else if (particle == *( G4AntiNeutron::AntiNeutron() )) return true; + else if (particle == *(G4AntiSigmaPlus::AntiSigmaPlus())) return true; +#ifdef debug + G4cout<<"***G4QCaptureAtRest::IsApplicable: PDG="<GetDefinition(); +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt is called"<GetElementVector(); + G4int i=0; + G4double sum=0.; + G4int nE=material->GetNumberOfElements(); +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: "< sumfra; + for(i=0; iGetFractionVector()[i]; + G4int cZ=static_cast((*theElementVector)[i]->GetZ()); + if(projPDG==13||projPDG==15) + { + frac*=cZ; + if(cZ==9||cZ==35||cZ==53||cZ==85) frac*=.66; + else if (cZ== 3) frac*=.50; + else if (cZ==24||cZ==28) frac*=.90; + else if (cZ== 5||cZ==17) frac*=.70; + else if (cZ== 8) frac*=.56; + } + sum+=frac; + sumfra.push_back(sum); // remember the summation steps + } + G4double rnd = sum*G4UniformRand(); + for(i=0; i((*theElementVector)[i]->GetZ()); + sum=sumfra[i]; + if (rndn+"<push_back(pigamma); // Fill pi0 or Gamma in the output + G4QHadron* neutron = new G4QHadron(2112,n4Mom); // Create Hadron for the Neutron + output->push_back(neutron); // Fill the neutron to the output + } + // @@ For pi-,d reactions one can use just nn dedcay (see above) ? + // @@ For K- Capture the quasifree n+Lambda+(A-n-p) reaction can be applyed as well... + else if(projPDG==-211 && G4UniformRand()>1.&& Z>0&&N>0) // @@Quasi-Free PiCapture => tune + { + G4double mt=G4QPDGCode(targPDG).GetMass();// Mass of the target Nucleus + G4LorentzVector totLV(0.,0.,0.,mp+mt); // 4-momentum of the (A+pi-) compound system + if(Z==1 && N==1) // Quasi-Free process on Deutron + { + G4LorentzVector f4Mom(0.,0.,0.,mNeut); // First neutron + G4LorentzVector s4Mom(0.,0.,0.,mNeut); // Second neutron + if(!G4QHadron(totLV).DecayIn2(f4Mom,s4Mom)) + { + G4cerr<<"---Worning---G4QCaptureAtRest::AtRestDoIt: H2+(pi-)=>n+n"<push_back(neutr1); // Fill pi0 or Gamma in the output + G4QHadron* neutr2 = new G4QHadron(2112,s4Mom); // Create Hadron for the 2nd Neutron + output->push_back(neutr2); // Fill the neutron to the output + } + else + { + G4int rPDG=targPDG-1001; + G4double mr=G4QPDGCode(rPDG).GetMass();// Mass of the residual Nucleus + G4LorentzVector f4Mom(0.,0.,0.,mNeut); // First neutron + G4LorentzVector s4Mom(0.,0.,0.,mNeut); // Second neutron + G4LorentzVector r4Mom(0.,0.,0.,mr); // Residual nucleus + if(!G4QHadron(totLV).DecayIn3(f4Mom,s4Mom,r4Mom)) + { + G4cerr<<"---Worning---G4QCaptureAtRest::AtRestDoIt: A+(pi-)=>n+n+(A-n-p)"<push_back(neutr1); // Fill the first neutron in the output + G4QHadron* neutr2 = new G4QHadron(2112,s4Mom); // Create Hadron for the 2nd Neutron + output->push_back(neutr2); // Fill the second neutron to the output + G4QHadron* resnuc = new G4QHadron(rPDG,r4Mom); // Create Hadron for the ResidualNucl + output->push_back(resnuc); // Fill the Residual Nucleus to the output + } + } + else if((projPDG==13||projPDG==15) && !lepChan)//Normal BoundLepton->e+nu+anti_nu_e decay + { + G4LorentzVector totLV(0.,0.,0.,mp-EnergyDeposition);// 4-momentum of the bounded muon +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: e+nu+nu decay 4M="<E+Nu_mu+anti_Nu_e"<n+nu_mu"<push_back(neutrino); // Fill pi0 or Gamma in the output + G4QHadron* neutron = new G4QHadron(2112,n4Mom); // Create Hadron for the Neutron + output->push_back(neutron); // Fill the neutron to the output + } + else if((projPDG==13||projPDG==15)&&lepChan&&targPDG==90001001)//LeptonCapture on Deutron + { + G4LorentzVector totLV(0.,0.,0.,mp+mDeut-EnergyDeposition);// 4-mom of theCompoundSystem +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: CapOnDeutr decay 4M="<n+n+nu_mu"<push_back(neutrino); // Fill pi0 or Gamma in the output + G4QHadron* neut1 = new G4QHadron(2112,n4Mom); // Create Hadron for the FirstNeutron + output->push_back(neut1); // Fill the neutron to the output + G4QHadron* neut2 = new G4QHadron(2112,s4Mom); // Create Hadron for the SecondNeutron + output->push_back(neut2); // Fill the neutron to the output + } + else if((projPDG==13||projPDG==15)&&lepChan&&G4UniformRand()>1&&Z>0&&N>0)//@@QuasiFreeCap + { + G4double mt=G4QPDGCode(targPDG).GetMass();// Mass of the target Nucleus + G4LorentzVector totLV(0.,0.,0.,mp+mt-EnergyDeposition);// 4-mom of the(A+mu-) compound +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: Quasi-Free decay 4M="<nu_mu+n+(A-p)"<push_back(neutrino); // Fill nutrino_mu in the output + G4QHadron* neutron = new G4QHadron(2112,s4Mom);// Create Hadron for the 2nd Neutron + output->push_back(neutron); // Fill the neutron to the output + G4QHadron* resnuc = new G4QHadron(rPDG,r4Mom); // Create Hadron for the ResidualNucl + output->push_back(resnuc); // Fill the Residual Nucleus to the output + } + else + { + if(projPDG==13||projPDG==15) mp-=EnergyDeposition;//TheEnergyDeposit is only for LepCap +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: CHIPS decay muMB="< DELETED ---------+ | | + std::for_each(projHV.begin(), projHV.end(), DeleteQHadron()); // ----------------+-+-+ + projHV.clear(); // --------------------------------------------------------------+-+ +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: pPDG="<size(); // A#of hadrons in the output + if(projPDG==13) + { + std::vector* cascE = new std::vector; + MuCaptureEMCascade(Z, N, cascE); + G4int nsec=cascE->size(); + aParticleChange.SetNumberOfSecondaries(nsec+tNH); + G4DynamicParticle* theSec = 0; // Prototype to fill particle in the G4ParticleChange + for(G4int is=0; isoperator[](is); + if(ener>0) theSec = new G4DynamicParticle(G4Electron::Electron(),RndmDir(),ener); + else theSec = new G4DynamicParticle(G4Gamma::Gamma(),RndmDir(),-ener); + G4Track* aNewTrack = new G4Track(theSec, localtime, position ); + aParticleChange.AddSecondary( aNewTrack ); + } + cascE->clear(); + delete cascE; + } + else aParticleChange.SetNumberOfSecondaries(tNH); + // Now add nuclear fragments + localtime += Time; +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: "< work for Hisaya @@ + // The decau process for hypernuclei must be developed in GEANT4 (change CHIPS body) + G4QHadron* hadr=output->operator[](i); // Pointer to the output hadron + if(hadr->GetNFragments()) // Intermediate hadron + { +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt: Intermediate particle is found i="<GetPDGCode(); +#ifdef pdebug + G4cout<<"G4QCaptureAtRest::AtRestDoIt:#"<80000000) // Defines hypernuclei as normal nuclei (N=N+S Correction!) + { + G4int aZ = hadr->GetCharge(); + G4int aA = hadr->GetBaryonNumber(); + theDefinition = G4ParticleTable::GetParticleTable()->FindIon(aZ,aA,0,aZ); + } + else theDefinition = G4ParticleTable::GetParticleTable()->FindParticle(PDGCode); + if(!theDefinition) + { + G4cout<<"---Worning---G4QCaptureAtRest::AtRestDoIt: drop PDG="<SetDefinition(theDefinition); + G4LorentzVector h4M=hadr->Get4Momentum(); +#ifdef debug + G4cout<<"G4QCaptureAtRest::AtRestDoIt:#"<Set4Momentum(h4M); + delete hadr; +#ifdef debug + G4ThreeVector curD=theSec->GetMomentumDirection(); + G4double curM=theSec->GetMass(); + G4double curE=theSec->GetKineticEnergy()+curM; + G4cout<<"G4QCapAtRest::AtRDoIt:p="<GetDefinition())==*(G4MuonMinus::MuonMinus()) || + *(stoppedHadron->GetDefinition())==*(G4TauMinus::TauMinus()) ) return Time; + else return 0.; +} + +// Muon can decay or to be captured by the nucleus (Z,N): true=MuCapture, false=MuDecay +G4bool G4QCaptureAtRest::RandomizeMuDecayOrCapture(G4int Z, G4int N) +{ +#ifdef debug + G4cout<<"G4QCaptureAtRest::RandomizeMuDecayOrCapture is called"< mPi0 ?"<nu,q) reaction succeded and Neutrino can be pushed to Output G4QContent targQC=targQPDG.GetQuarkContent(); // QC of the target nucleus (local!) targQC+=G4QContent(1,0,0,0,1,0); // Make iso-shift with a fake pi- (changed!) - G4LorentzVector fn4m=G4LorentzVector(0.,0.,0.,targM)-qi4m+qf4m; - G4double tm=fn4m.m(); // Real mass of the final nucleus + G4LorentzVector fn4m=G4LorentzVector(0.,0.,0.,0.); // Prototype of the residual 4M G4QNucleus fnN(targQC,fn4m); // Define the final state nucleus G4double fnm=fnN.GetMZNS(); // GS Mass of the final state nucleus + G4double tm=0.; // Prototype of RealMass of the final nucleus + G4LorentzVector tg4m=G4LorentzVector(0.,0.,0.,targM); + G4LorentzVector fd4m=tg4m-qi4m; + //while (tmn="<nu,q) reaction succeded and Neutrino can be pushed to Output G4QHadron* neutrino = 0; // Neutrino to be filled to Output +#ifdef mudebug + G4cout<<"G4QEnv::Const:fM="<nu"<SetQPDG(pimQPDG); @@ -243,7 +266,7 @@ G4QEnvironment::G4QEnvironment(const G4QHadronVector& projHadrons, const G4int t G4cout<<"G4QE:C:"<GetNFragments()<0.) // => "Final hadron" case - { + { G4int envPDG=theEnvironment.GetPDG(); if(envPDG==90000000) // ==> "Interaction with vacuum" case { @@ -258,10 +281,10 @@ G4QEnvironment::G4QEnvironment(const G4QHadronVector& projHadrons, const G4int t { G4int hQ = curHadr->GetQCode(); // One more check for valid of the QHadron if(hQ<0) - { + { G4cerr<<"---Warning---G4QEnv::Constructor:Q<0, PDG=("<GetQC(); #ifdef pdebug G4cout<<"G4QE::Const:CreateQuasm, 4M="<GetQCode(); // One more check for valid of the QHadron if(hQ<0) - { + { G4cerr<<"---Warning---G4QEnviron::Constructor:Vacuum,Q<0, 1st HPDG="<Get4Momentum(); @@ -322,12 +345,12 @@ G4QEnvironment::G4QEnvironment(const G4QHadronVector& projHadrons, const G4int t G4QPDGCode tQPDG(targPDG); G4int tQ = tQPDG.GetQCode(); if(tQ<0||targPDG==10) - { + { G4cerr<<"---Warning---G4QEnv::Constructor:TrgQC<0, Chipo?,PDG="<1) for(G4int ih=0; ihGetQC()<Get4Momentum()<SolidAngle) // Sum Up Hadrons and make Energy Flow ^ ^ - { + if(dir.dot(shDIR)>SolidAngle) // Sum Up Hadrons and make Energy Flow ^ ^ + { if(efFlag) // => Case of "Energy Flux approach" ^ ^ - { + { G4QContent shQC = curHadr->GetQC();// QuarkContent of the Current Hadron ^ ^ ef4Mom+=sh4m; EnFlQC+=shQC; @@ -713,46 +736,46 @@ void G4QEnvironment::CreateQuasmon(const G4QContent& projQC, const G4LorentzVect #ifdef pdebug G4int hPDG=curHadr->GetPDGCode(); // Only for gebug printing ^ ^ G4LorentzVector h4M = curHadr->Get4Momentum(); // Only for gebug printing^ ^ - G4cout<<"G4QE::CrQ:#"<"MultyQuasFragmentation"(!efFlag)^ ^ + { G4QHadron* mqHadron = new G4QHadron(curHadr); input.push_back(mqHadron); // Fill hadron-copy (del equiv) <...^ ^ #ifdef pdebug G4int hPDG=curHadr->GetPDGCode(); // Only for debug printing ^ ^ G4LorentzVector h4M = curHadr->Get4Momentum(); // Only for gebug printing ^ ^ - G4cout<<"G4QE::CrQ: Fill #"<begin(), output->end(), DeleteQHadron());//DESTRUCT output>-^-^ output->clear(); // ^ ^ delete output; // ==================================^=^ if(!efFlag) // =>NotEnergyFlux=MultyQuasmon Case ^ - { + { if(!(input.size())) // *RETURN* Without Quasmon creation-^ - { // ^ + { // ^ #ifdef pdebug - G4cout<<"*G4QEnv::CrQ:AnnihStack tC="<GetQC()<Get4Momentum()<begin(), outH->end(), DeleteQHadron());// >--------------^=^ ^ outH->clear(); // ^ ^ ^ delete outH; // >==============================^=^ ^ #ifdef pdebug - G4cout<<"G4QE::CrQ:befDel muq tC="< Energy Flux case - { + { if (!efCounter) return; // ***RETURN*** Without Quasmon creation - } - } // End of Hyperon annihilation case + } + } // End of Hyperon annihilation case else EnFlQC=projQC; // For notAntiBar, don't use EnergyFlux G4double EnFlP=ef4Mom.rho(); // Mom. of EnergyFlow forClusterCreation PrepareInteractionProbabilities(EnFlQC,EnFlP); // InteractionProbabilities for clusters @@ -819,13 +842,13 @@ void G4QEnvironment::CreateQuasmon(const G4QContent& projQC, const G4LorentzVect G4int i=0; G4QContent curQC; // Quark Content of the selected cluster if(nCandid<=0) - { - G4cerr<<"---Warning---G4QEnv::CreaQ:nC="<GetPreProbability(); // A number of clusters of the type G4double dOfCl=curCand->GetDenseProbability();// A number of clusters in dense region if(cPDG==91000000||cPDG==90001000||cPDG==90000001) - { + { allB+=nOfCl; denseB+=dOfCl; - } + } G4QContent pQC=curCand->GetQC(); // Quark Content of the candidate ////////////G4int pC = projQC.GetCharge(); // Charge of the projectile G4QContent qQC=pQC+projQC; // Total Quark content of the Compound @@ -965,10 +988,10 @@ void G4QEnvironment::PrepareInteractionProbabilities(const G4QContent& projQC, G G4double baryn = qQC.GetBaryonNumber(); G4double charge= qQC.GetCharge(); G4double dq= abs(baryn-charge-charge); - G4cout<<"G4QE::PrepIntProb:C="<>>> Fill Environment="<>>> Fill Environment="< "Environment is Vacuum" case @@ -1092,13 +1115,13 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4cout<<"G4QEnv::HadrQE: ***Vacuum*** #ofQ="<Get4Momentum(); totIn4M += Q4M; totInC += pQ->GetQC().GetCharge(); - } // End of TotInitial4Momentum summation LOOP over Quasmons + } // End of TotInitial4Momentum summation LOOP over Quasmons G4int nsHadr = theQHadrons.size(); // Update the value of OUTPUT entries if(nsHadr) for(G4int jso=0; jsoGet4Momentum(); totIn4M += hs4Mom; totInC += theQHadrons[jso]->GetCharge(); - } + } } #endif G4QNucleus vE(90000000); G4int nlq = 0; // Prototype of a#of Living Quasmons - if(nQuasmons) for(G4int lq=0; lqGetStatus())nlq++; - if(nQuasmons) for(G4int iq=0; iqGetStatus())nlq++; + if(nQuasmons) for(G4int iq=0; iqGetStatus();// Status of the Quasmon before fragmentation if(ist) - { + { G4QHadronVector* output=theQuasmons[iq]->Fragment(vE,1);//!!!DESTROY!!! <---------+ G4int ast=theQuasmons[iq]->GetStatus(); // Quasmon's Status after fragmentation ^ if(!ast) nlq--; // Reduce nlq is Quasmon decayed ^ @@ -1158,8 +1181,8 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4cout<<"G4QEnv::HadrQE: ***Vacuum*** Q#"<GetQC();// ^ G4int tQBN=totQC.GetBaryonNumber();// Baryon Number of not decayed Quasmon ^ G4QNucleus tqN(totQC); // Define the quasmon as a nucleus ^ @@ -1178,7 +1201,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4LorentzVector tot4M=theQuasmons[iq]->Get4Momentum(); G4double totQM=tot4M.m(); // Real Mass of Quasmon ^ if(tQBN>0&&totQM>gsM) // => "Try Quasmon evaporation" case ^ - { + { // ^ G4QHadron* nuclQ = new G4QHadron(totQC,tot4M); // ^ #ifdef fdebug G4cout<<"G4QEnv::HadrQE:Vac,tQC"<KillQuasmon(); // Kill evaporated Quasmon ^ nlq--; // ^ - } + } else if(iq+11) // => "Try to merge with next" case ^ - { + { G4int s=theQuasmons[iq+1]->GetStatus();//Status of the next Quasmon ^ theQuasmons[iq+1]->IncreaseBy(theQuasmons[iq]);// Merge with the next Quasmon ^ theQuasmons[iq]->KillQuasmon(); // Kill the week Quasmon ^ if(s) nlq--; // Reduce a number of "living Quasmons" ^ - } + } else if(iq+1==nQuasmons&&iq&&nlq>1) // => "Quasmon stack is exhosted" case ^ - { + { G4int s=theQuasmons[0]->GetStatus(); // Status of the first Quasmon ^ theQuasmons[0]->IncreaseBy(theQuasmons[iq]);// Merge with the first Quasmon ^ theQuasmons[iq]->KillQuasmon(); // Kill the week Quasmon ^ if(s) nlq--; // Reduce a number of "living Quasmons" ^ - } - else // "Have a chance to recover" case ^ - { // ^ + } + else // "Have a chance to recover" case ^ + { // ^ #ifdef pdebug - G4cout<<"***G4QE::HQE:"<InitQuasmon(totQC,tot4M);// Update the week Quasmon ^ G4QHadronVector* curout=theQuasmons[iq]->Fragment(vE,1);//!DESTROY! <---+ ^ G4int ast=theQuasmons[iq]->GetStatus(); // Status of the Quasmon ^ ^ @@ -1254,16 +1277,16 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4cout<<"G4QEnv::HadrQE:VacuumRecoverQ#"<0) // => "QHadrons from Quasmon to Output"^ ^ - { // ^ ^ - for (G4int ih=0; ihoperator[](ih)); // ^ ^ #ifdef fdebug G4cout<<"G4QEnv::HadrQE:Recovered, H#"<begin(), output->end(), DeleteQHadron()); // >-------------^ output->clear(); // ^ delete output; // >=====================================^ - } // End of check for the already decayed Quasmon - } // End of the LOOP over Quasmons + } // End of check for the already decayed Quasmon + } // End of the LOOP over Quasmons } else // ==> "Nuclear environment" case { @@ -1345,13 +1368,13 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4cout<<"G4QEnv::HadrQE:FRAGMENTATION IN NUCLEAR ENVIRONMENT nQ="<Get4Momentum(); totIn4M += Q4M; totInC += pQ->GetQC().GetCharge(); - } // End of TotInitial4Momentum summation LOOP over Quasmons + } // End of TotInitial4Momentum summation LOOP over Quasmons G4int nsHadr = theQHadrons.size(); // Update the value of OUTPUT entries if(nsHadr) for(G4int jso=0; jsoGet4Momentum(); totIn4M += hs4Mom; totInC += theQHadrons[jso]->GetCharge(); - } + } } #endif //G4int c3Max = 27; @@ -1384,7 +1407,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() //G4int totCM = 27; // Limit for this counter G4int nCnMax = 7; // MaxCounterOfHadrFolts to open shortCutSolut's while (sumstat||totCGetQC(); totQC += QQC; G4LorentzVector Q4M= pQ->Get4Momentum(); @@ -1446,7 +1469,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4int Qst= pQ->GetStatus(); sumstat += Qst; #ifdef pdebug - G4cout<<"G4QEnv::HadrQE:#"<"Still try to decay Quasmons" - { + { if(!fCount)premC--; // Reduce premium efforts counter - if(nQuasmons) for (G4int jq=0; jqGetStatus();// Old status of the Quasmon ^ if(status) // Skip dead Quasmons ^ { // ^ - G4QHadronVector* output=pQ->Fragment(theEnvironment,eCount);//*!DEST* <--<--^-+ + G4QHadronVector* output=pQ->Fragment(theEnvironment,eCount);//*!DEST* <--<--^-+ envM =theEnvironment.GetMass(); // new mass of Nuclear Environment ^ ^ status = pQ->GetStatus(); // NewStatus after FragmentationAttempt ^ ^ if(!status) eCount--; // Dec. ExistingQuasmonsCounter for Q=0 ^ ^ G4int nHadrons = output->size(); // ^ ^ #ifdef rdebug - G4cout<<"G4QE::HQE:**AfterFragmAttempt**#"<operator[](kpo);// Pointer to theOutputQHadron ^ ^ + G4QHadron* insH =output->operator[](kpo);// Pointer to theOutputQHadron ^ ^ G4int qhsNF = insH->GetNFragments(); // A#of secondary fragments ^ ^ if(!qhsNF) // Subtract only final hadrons ^ ^ - { // ^ ^ + { // ^ ^ G4LorentzVector qhs4Mom = insH->Get4Momentum();// 4M of theOutputQHadron^ ^ G4int hPDG = insH->GetPDGCode(); // PDG Code of the Q-output Hadron ^ ^ G4cout<<"G4QE::HQE:SUM-4-Mom qh("<GetCharge(); // ^ ^ - } // ^ ^ + } // ^ ^ } // End of the LOOP over output QHadrons ^ ^ G4cout<<"G4QEnv::HadrQE:|||||4-MomCHECK||||d4M="<0) // Transfer QHadrons from Quasm to Output ^ ^ { // ^ ^ - for (G4int ih=0; ihoperator[](ih); // ^ ^ G4int hC=inpH->GetCharge(); // Charge of the Hadron ^ ^ @@ -1600,30 +1623,30 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4int hB=inpH->GetBaryonNumber(); // ^ ^ hCB=theEnvironment.CoulombBarrier(hC,hB); // ^ ^ hKE=hLV.e()-hLV.m(); // ^ ^ - } // ^ ^ + } // ^ ^ if(can&&hKE "Suck Hadron in Quasm or Env" case ^ ^ - { // ^ ^ + { // ^ ^ if(status) // => "Suck in the existing Quasmon" case ^ ^ { // ^ ^ G4QContent tQC=inpH->GetQC()+pQ->GetQC(); // ^ ^ G4LorentzVector tLV=hLV+pQ->Get4Momentum();// ^ ^ pQ->InitQuasmon(tQC,tLV); // Reinitialize the current Quasmon ^ ^ #ifdef pdebug - G4cout<<"G4QE::HQE:Medium, H#"< "Suck in the existing Quasmon" case ^ ^ { // ^ ^ G4QContent tQC=inpH->GetQC()+theEnvironment.GetQCZNS();// ^ ^ G4LorentzVector tLV=hLV+theEnvironment.Get4Momentum(); // ^ ^ theEnvironment=G4QNucleus(tQC,tLV); // Reinit currentEnvironment ^ ^ #ifdef pdebug - G4cout<<"G4QE::HQE:Med,H#"<GetQPDG()<<",4M="//^ ^ + G4cout<<"G4QE::HQE:Med,H#"<GetQPDG()<<",4M="//^ ^ <Get4Momentum()<<" is suckedInEnvironment"< "Hadron can go out" case ^ ^ { // ^ ^ G4QHadron* curH = new G4QHadron(inpH); // ^ ^ @@ -1633,19 +1656,19 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4double phY=ph4M.y(); // p_y of the hadron ^ ^ G4double phZ=ph4M.z(); // p_x of the hadron ^ ^ G4double phCost=phZ/sqrt(phX*phX+phY*phY+phZ*phZ);// Hadr cos(theta)^ ^ - G4cout<<"G4QEnv::HadrQE:Medium, H#"<GetQPDG()//^ ^ + G4cout<<"G4QEnv::HadrQE:Medium, H#"<GetQPDG()//^ ^ <<", 4M="<GetQC(); // QuarkContent of the Quasmon ^ @@ -1676,16 +1699,16 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4double cqMass=cq4M.m(); // Real Mass of the current Quasmon ^ G4double fqMass=G4QPDGCode(22).GetNuclMass(pqC,pqB-pqC-pqS,pqS);//CQ FreeM^ #ifdef edebug - G4cout<<"G4QEnv::HQE:M="<fM="<fM="<KillQuasmon(); // If BackFusion succeeded, kill theQuasmon ^ #ifdef edebug - G4cout<<"G4QEnv::HQE:Status after kill (#"<GetStatus()// ^ + G4cout<<"G4QEnv::HQE:Status after kill (#"<GetStatus()// ^ <<", nH="<gsM="<gsM="< "Quasmon-Chipolino or Environment-Dibaryon" case ^ if(qPDG==10 || qPDG==92000000 || qPDG==90002000 || qPDG==90000002)//^ - { + { // ^ G4QPDGCode h1QPDG=nQPDG; // QPDG of the first hadron ^ G4double h1M =mNeut; // Mass of the first hadron ^ G4QPDGCode h2QPDG=h1QPDG;// QPDG of the second hadron ^ G4double h2M =mNeut; // Mass of the second hadron ^ if(qPDG==10) // CHIPOLINO decay case ^ - { // ^ + { // ^ G4QChipolino QChip(qQC);// define the Quasmon as a Chipolino ^ h1QPDG=QChip.GetQPDG1();// QPDG of the first hadron ^ h1M =h1QPDG.GetMass();// Mass of the first hadron ^ h2QPDG=QChip.GetQPDG2();// QPDG of the second hadron ^ h2M =h2QPDG.GetMass();// Mass of the second hadron ^ - } // ^ - else if(qPDG==90002000) // DiProton decay case ^ + } // ^ + else if(qPDG==90002000) // DiProton decay case ^ { // ^ h1QPDG=pQPDG; // QPDG of the first hadron ^ h1M =mProt; // Mass of the first hadron ^ h2QPDG=h1QPDG; // QPDG of the second hadron ^ h2M =mProt; // Mass of the second hadron ^ - } // ^ - else if(qPDG==92000000) // Two lambdas case ^ + } // ^ + else if(qPDG==92000000) // Two lambdas case ^ { // ^ h1QPDG=lQPDG; // QPDG of the first hadron ^ h1M =mLamb; // Mass of the first hadron ^ @@ -1749,7 +1772,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() h2M =mLamb; // Mass of the second hadron ^ G4double ddMass=totMass-envM; // Free CM energy ^ if(ddMass>mSigZ+mSigZ) // Sigma0+Sigma0 is possible ^ - { // @@ Only two particles PS is used ^ + { // @@ Only two particles PS is used ^ G4double dd2=ddMass*ddMass; // Squared free energy ^ G4double sma=mLamb+mLamb; // Lambda+Lambda sum ^ G4double pr1=sqrt((dd2-sma*sma)*dd2); // Lamb+Lamb PS ^ @@ -1773,7 +1796,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() } // ^ } // ^ else if(ddMass>mSigZ+mLamb) // Lambda+Sigma0 is possible ^ - { // @@ Only two particles PS is used ^ + { // @@ Only two particles PS is used ^ G4double dd2=ddMass*ddMass; // Squared free energy ^ G4double sma=mLamb+mLamb; // Lambda+Lambda sum ^ G4double pr1=sqrt((dd2-sma*sma)*dd2); // Lamb+Lamb PS ^ @@ -1786,7 +1809,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() h1M =mSigZ; // Mass of the first hadron ^ } // ^ } // ^ - } // ^ + } // ^ if(h1M+h2M+envM "Three parts decay" case ^ { // ^ G4LorentzVector h14M(0.,0.,0.,h1M); // ^ @@ -1794,15 +1817,15 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4LorentzVector e4M(0.,0.,0.,envM); // ^ if(!G4QHadron(tot4M).DecayIn3(h14M,h24M,e4M)) // ^ { // ^ - G4cerr<<"***G4QE::HQE:(0)tM="<h1="<h1="< totMass");//^ + //throw G4QException("G4QEnv::HQE:(0)Chi+Env mass > totMass");//^ #endif CleanUp(); // ^ G4QHadron* evH = new G4QHadron(totQC,tot4M);// ResidualNuclHadr ^ EvaporateResidual(evH); // Evaporate residual (del. equiv.) ^ return theQHadrons; // ^ - } // ^ - } // ^ + } // ^ + } // ^ else // => "Two particles decay" case ^ { // ^ G4LorentzVector fq4M(0.,0.,0.,qMass); // ^ @@ -1853,21 +1876,21 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() std::for_each(output->begin(),output->end(),DeleteQHadron());//>^ output->clear(); // -->-->-->-->-->-->-->-->-->-->-->-->-->--^ delete output; // >========================================^ - throw G4QException("***G4QEnv::HadrQEnv: Q+Env DecIn2 error");//^ - } // ^ + throw G4QException("***G4QEnv::HadrQEnv: Q+Env DecIn2 error");//^ + } // ^ G4QHadron* qH = new G4QHadron(qPDG,fq4M);// the out going Quasmon ^ theQHadrons.push_back(qH); // (delete equivalent) ^ #ifdef edebug - G4cout<<"G4QE::HQE:QuasmH="<h1="<h1="< H1="< H1="<h1="<h1="<mPi+mLamb) // "Lambda + Pi- is possible" case ^ - { // ^ + { // ^ hyM = mLamb; // Lambda mass ^ hyPDG = 3122; // Lambda PDG Code ^ - } // ^ + } // ^ else if(cqMass>mSigM) // "Sigma- gamma decay" case ^ - { // ^ + { // ^ hyM=mSigM; // Sigma- mass ^ hyPDG=3112; // Sigma- PDG Code ^ pigM=0.; // Gamma mass ^ pigPDG=22; // Gamma PDG Code ^ - } // ^ + } // ^ } // ^ else if(PDGQ==3222||PDGQ==91000999) // --> "Sigma+" case ^ - { // ^ + { // ^ pigPDG= 211; // Pi+ PDG Code ^ if(cqMass>mPi+mLamb) // --- "Lambda + Pi+ is possible" case ^ - { // ^ + { // ^ hyM = mLamb; // Lambda mass ^ hyPDG = 3122; // Lambda PDG Code ^ pigM = mPi; // Pi+ mass ^ pigPDG= 211; // Pi+ PDG Code ^ } // ^ else if(cqMass>mSigP) // "Sigma- gamma decay" case ^ - { // ^ + { // ^ hyM=mSigP; // Sigma+ mass ^ hyPDG=3222; // Sigma+ PDG Code ^ pigM=0.; // Gamma mass ^ pigPDG=22; // Gamma PDG Code ^ - } // ^ + } // ^ else if(cqMass>mPi0+mProt&&G4UniformRand()>.5) // "P + Pi0" case ^ - { // ^ + { // ^ hyM = mProt; // Proton mass ^ hyPDG = 2212; // Proton PDG Code ^ pigM = mPi0; // Pi0 mass ^ pigPDG= 111; // Pi0 PDG Code ^ - } // ^ + } // ^ else if(cqMass"<"< Hyperon="// ^ + G4cout<<"G4QEnv::HadronizeQEnv: Sigma="< Hyperon="// ^ < "DiNeutron+Pi-" case ^ - { // ^ + { // ^ dinFlag = true; // For the final decay ^ hyM=mNeut+mNeut; // Di-neutron ^ hyPDG=2112; // Neutron PDG Code ^ pigM=mPi; // Pi- mass ^ pigPDG=-211; // Pi- PDG Code ^ - } // ^ + } // ^ } // ^ else if(PDGQ==91001999) // --> "p+Sigma+" case ^ - { // ^ + { // ^ hyM=mSigP; // Sigma+ ^ hyPDG=3222; // PDG Code of Sigma+ ^ pigM=mProt; // Proton mass ^ pigPDG=2212; // PDG Code of proton ^ if(cqMass "Proton+Proton" case ^ - { // ^ + { // ^ hyM=mProt; // Proton mass ^ hyPDG=2212; // Proton PDG Code ^ pigM=mProt; // Proton mass ^ pigPDG=2212; // Proton PDG Code ^ - } // ^ + } // ^ } // ^ G4LorentzVector b4Mom(0.,0.,0.,hyM); // Hyperon (di-nucleon) mass ^ G4LorentzVector m4Mom(0.,0.,0.,pigM);// Nucleon (pion) mass ^ if(!G4QHadron(cq4M).DecayIn2(b4Mom, m4Mom)) // "DecayIn2 failed" case ^ - { // ^ + { // ^ G4cerr<<"--Warning--G4QE::HQE:S/D="<"<"< Sigma/dN="//^ + G4cout<<"G4QEnv::HadronizeQEnv: NSigma="< Sigma/dN="//^ < "DiNeutron+Pi-" case ^ - { // ^ + { // ^ dinFlag = true; // For the final decay ^ pigM=mNeut+mNeut+mNeut;// Tri-neutron ^ pigPDG=2112; // Neutron PDG Code ^ hyM=mPi; // Pi- mass ^ hyPDG=-211; // Pi- PDG Code ^ - } // ^ + } // ^ } // ^ else if(PDGQ==91002999) // --> "p+Sigma+" case ^ - { // ^ + { // ^ hyM=mSigP; // Sigma+ ^ hyPDG=3222; // PDG Code of Sigma+ ^ pigM=mProt+mProt; // Di-Proton mass ^ pigPDG=2212; // PDG Code of proton ^ if(cqMass "DiProton+Pi+" case ^ - { // ^ + { // ^ dinFlag = true; // For the final decay ^ pigM=mProt+mProt+mProt;// Tri-proton ^ pigPDG=2212; // Neutron PDG Code ^ hyM=mPi; // Pi+ mass ^ hyPDG=211; // Pi+ PDG Code ^ - } // ^ + } // ^ } // ^ G4LorentzVector b4Mom(0.,0.,0.,hyM); // Hyperon (di-nucleon) mass ^ G4LorentzVector m4Mom(0.,0.,0.,pigM);// Nucleon (pion) mass ^ if(!G4QHadron(cq4M).DecayIn2(b4Mom, m4Mom)) // "DecayIn2 failed" case ^ - { // ^ + { // ^ G4cerr<<"--Warning--G4QE::HQE:S/Pi="<"<"< Sigma/Pi="//^ + G4cout<<"G4QEnv::HadronizeQEnv:2NSigma="< Sigma/Pi="//^ <gsM="<gsM="<>** CGS Correction **>>**"<>** CGS Correction **>>**"<begin(), output->end(), DeleteQHadron());//->-^ output->clear(); // ^ @@ -2244,12 +2267,12 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() eCount--; // Reduce a#of the living Quasmons ^ return theQHadrons; // ^ } // ^ - else if(qMGetQC().GetSPDGCode()==1114 // ^ - || pQ->GetQC().GetSPDGCode()==2224) // ^ + else if(qMGetQC().GetSPDGCode()==1114 // ^ + || pQ->GetQC().GetSPDGCode()==2224) // ^ &&qM>theWorld->GetQParticle(QPDGQ)->MinMassOfFragm())//Del&Kill ^ { // ^ #ifdef edebug - G4cout<<"G4QEnv::HadrQEnv:**||** Copy&Decay **||**"<DecayQuasmon();//Dec.Quasm & fill decHV=*^ CopyAndDeleteHadronVector(decHV);// Copy output to QHadrV of G4Env ^ @@ -2257,13 +2280,13 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() totQC-=pQ->GetQC(); // totQC recalculation ^ pQ->KillQuasmon(); // Make done the current Quasmon ^ eCount--; // Reduce a#of the living Quasmons ^ - } // ^ - } // ^ - } // End of the Medium/Vacuum IF ^ - } // End of the status ELSE IF ^ + } // ^ + } // ^ + } // End of the Medium/Vacuum IF ^ + } // End of the status ELSE IF ^ else if(status==3) count3++; // ^ if(status<0) // Panic: Quasmon is below theMassShell ^ - { + { // ^ //if(eCount==1 && DecayInEnvQ(pQ)) // ^ //{ // ^ // std::for_each(output->begin(), output->end(), DeleteQHadron());//->---^ @@ -2276,49 +2299,49 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4int ppm=jq; // Initialized by PANIC Quasmon pointer ^ G4int nRQ=0; // Prot. of a#of additionalRealQuasmons ^ #ifdef edebug - G4cout<<"G4QEnv::HadrQEnv: ***PANIC*** for jq="<GetQC(); // ^ G4LorentzVector r4M= rQ->Get4Momentum(); // ^ rQC += pQ->GetQC(); // ^ r4M += pQ->Get4Momentum(); // ^ rQ->InitQuasmon(rQC, r4M); // Make new Quasmon ^ #ifdef edebug - G4cout<<"G4QE::HQE:"<GetQC()<<"+"<GetQC()<<"="<GetQC()<<"+"<GetQC()<<"="<KillQuasmon(); // Delete old Quasmon ^ eCount--; // Decrement counter of living Quasmons ^ - } // ^ + } // ^ else // No candidate to resolve PANIC was found ^ { // ^ #ifdef edebug - G4cout<<"G4QEnv::HQE: No Q-cand. nRQ="<KillQuasmon(); // Kill the only Quasmon ^ eCount--; // Reduce a#of the living Quasmons ^ @@ -2360,46 +2383,46 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() delete output; // >======================================^ force=true; // Make the force decision ^ break; // Out of the fragmentation loop >->+ ^ - } // | ^ - } // | ^ - } // | ^ + } // | ^ + } // | ^ + } // | ^ std::for_each(output->begin(), output->end(), DeleteQHadron()); // >----|-----^ output->clear(); // | ^ delete output; // >================================|=====^ - } // | - } // End of fragmentation LOOP over Quasmons (jq) <--------<----------<-----+ + } // | + } // End of fragmentation LOOP over Quasmons (jq) <--------<----------<-----+ } // @@@@ For 1 livingQuasmon & totMass>minRQ+mREnv -> decay in RE+RQ (in RQ direction) else if(totMass>totM+.001) // ==> "Try EvapDecayin2tion or decay" case - { + { #ifdef edebug - G4cout<<"G4QEnv::HadrQE: M="< mDel="< mDel="< Bar=" + G4cout<<"G4QEnv::HadronizeQEnv: DELTA="< Bar=" < mChipo="< mChipo="<1+2 decay failed"); + //throw G4QException("G4QEnvironment::HadrQEnv: Chipo->1+2 decay failed"); } delete quasH; return theQHadrons; } #ifdef edebug - G4cout<<"G4QEnv::HadronizeQEnv: Chipo="< h1=" + G4cout<<"G4QEnv::HadronizeQEnv: Chipo="< h1=" < mTot="<h="<h="< mTot="<h="<h="<Fragment(vacuum,1);//**!!DESTROY!!** <-<-+ ^ + G4QHadronVector* curout=resid->Fragment(vacuum,1);//**!!DESTROY!!** <-<-+ ^ G4int rest = resid->GetStatus(); // New status after fragm attempt ^ ^ if(!rest) eCount--; // Dec ExistingQuasmonsCounter ^ ^ delete resid; //_________________________________^___^ G4int nHadrons = curout->size(); // a#of Hadrons in the outHV ^ if(nHadrons>0) // Transfer QHadrons to Output ^ - { - for (G4int ih=0; ihclear(); // The instances are filled above ^ delete curout; // >===============================^ return theQHadrons; - } - } + } + } else - { + { G4QContent tQC =totQC; // Not subtracted copy for error prints G4int NSi =0; // a#of additional Sigma G4int SiPDG =0; // PDG of additional Sigma @@ -2644,27 +2666,27 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4int PiPDG =0; // PDG of additional pions G4double MPi =0.; // Total Mass of additional pions if (totBN>0&&totS<0&&totChg+totChg>=totBN)// => "additional K+" case - { + { aKPDG=321; NaK=-totS; MaK=mK*NaK; tQC+=totS*KpQC; totChg+=totS; // Charge reduction (totS<0!) totS=0; // Anti-strangness goes to anti-Kaons - } + } else if (totBN>0&&totS<0) // => "additional aK0" case - { + { aKPDG=311; NaK=-totS; MaK=mK0*NaK; tQC+=totS*K0QC; totS=0; // Anti-strangness goes to anti-Kaons - } + } else if (totBN>1&&totS>0&&(totChg<0||totChg>totBN-totS))//=>"additional Sigma" - { + { NSi=totS; // Prototype of a#of Sigmas if(totChg<0) // Negative Sigmas - { + { SiPDG=3112; if(-totChg0&&totS>totBN&&totBN "additional K0" case - {// @@ Here Ksi0 check should be added totS=2>totBN=1&&totBN=1totBN=1&&totBN=10&&totS>totBN&&totChg<0)// => "additional K-" case - {// @@ Here Ksi- check should be added totS=2>totBN=1&&totChg=-1<0 + {// @@ Here Ksi- check should be added totS=2>totBN=1&&totChg=-1<0 aKPDG=-321; NaK=totS-totBN; MaK=mK0*NaK; tQC+=NaK*KpQC; totChg+=NaK; // Increase residual charge totS-=NaK; // Reduce residual strangeness - } + } // === Now residual DELTAS should be subtracted === if (totBN>0&&totChg>totBN-totS) // => "additional PI+" case - {// @@ Here Sigma+ check should be added totChg=1>totBn=1-totS=1 + {// @@ Here Sigma+ check should be added totChg=1>totBn=1-totS=1 PiPDG=211; NPi=totChg-totBN+totS; MPi=mPi*NPi; tQC-=NPi*PiQC; totChg-=NPi; - } + } else if (totBN>0&&totChg<0) // => "additional PI-" case - {// @@ Here Sigma- check should be added totChg<0 + {// @@ Here Sigma- check should be added totChg<0 PiPDG=-211; NPi=-totChg; MPi=mPi*NPi; tQC+=NPi*PiQC; // Now anti-Pions must be subtracted totChg+=NPi; - } + } else if (!totBN&&totChg>1-totS) // => "additional PI+" case - {// @@ Here Sigma+ check should be added totChg=1>totBn=1-totS=1 + {// @@ Here Sigma+ check should be added totChg=1>totBn=1-totS=1 PiPDG=211; NPi=totChg+totS-1; MPi=mPi*NPi; tQC-=NPi*PiQC; totChg-=NPi; - } + } else if (!totBN&&totChg<-1-totS) // => "additional PI-" case - {// @@ Here Sigma- check should be added totChg<0 + {// @@ Here Sigma- check should be added totChg<0 PiPDG=-211; NPi-=totChg+totS+1; MPi=mPi*NPi; tQC+=NPi*PiQC; // Now anti-Pions must be subtracted totChg+=NPi; - } + } G4double totRM=0.; // min (GS) Mass of the Residual System if(totBN<2) // Calculate totPDG & totRM - { + { totPDG=tQC.GetSPDGCode(); // MinPDGCode for the Residual compound if(totPDG==10&&tQC.GetBaryonNumber()>0) totPDG=tQC.GetZNSPDGCode(); if(totPDG) totRM=G4QPDGCode(totPDG).GetMass(); // minMass of theResidualSystem @@ -2746,20 +2768,20 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() } } else - { + { G4QNucleus totN(tQC,tot4M); // Excited nucleus for the Residual System totRM=totN.GetMZNS(); // min (GS) Mass of the Residual System totPDG=totN.GetPDG(); // Total PDG Code for the Current compound - } + } if(NaK) // ==> "Decay in K0 or K+ + NPi" case - {//@@ Can (must) be moved to EvaporateResidual ?? + {//@@ Can (must) be moved to EvaporateResidual ?? if(!NPi) // ==> "Only anti-strange K" case - { + { G4LorentzVector m4Mom(0.,0.,0.,MaK); G4LorentzVector n4Mom(0.,0.,0.,totRM); G4double sum=MaK+totRM; if(fabs(totMass-sum) M=" + G4cout<<"G4QEnv::HadronizeQEnv: SN="< M=" <tM="< nK="< nK="< "Only Sigma's" case - { + { G4LorentzVector m4Mom(0.,0.,0.,MSi); G4LorentzVector n4Mom(0.,0.,0.,totRM); G4double sum=MSi+totRM; if(fabs(totMass-sum) Sig=" + G4cout<<"G4QEnv::HadronizeQEnv: SN="< Sig=" <tM="< nS="< nS="< "One isobar" case - { + { G4LorentzVector m4Mom(0.,0.,0.,MPi); G4LorentzVector n4Mom(0.,0.,0.,totRM); if(!G4QHadron(tot4M).DecayIn2(m4Mom, n4Mom)) { G4cerr<<"---Warning---G4QEnv::HadronizeQEnv:M="< mSN="< mSN="< M="< M="< "Many Isobars" case + { G4int N1Pi = NPi/2; // First pion cluster G4int N2Pi = NPi-N1Pi; // Second pion cluster G4double mM = MPi/NPi; // Mass of Pi @@ -2996,7 +3018,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() <(?)SN="< N*PI="< N*PI="<0,tBN="<0,tBN="< "Decay Quasmon or Q+Environ" case - { + { G4int envPDG = theEnvironment.GetPDG();// PDGCode of the NuclQEnvironment #ifdef pdebug - G4cout<<"G4QEnv::HadrQEnv: nQ=1, QPDG=="< "Quasmon-Chipolino or Environment-Dibaryon" case else if(QPDG==10||QPDG==92000000||QPDG==90002000||QPDG==90000002) - { + { G4QContent QQC = pQ->GetQC(); // Quark Content of the Quasmon G4QPDGCode h1QPDG=nQPDG; // QPDG of the first hadron G4double h1M =mNeut; // Mass of the first hadron @@ -3091,23 +3113,23 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() h1M =h1QPDG.GetMass(); // Mass of the first hadron h2QPDG=QChip.GetQPDG2(); // QPDG of the second hadron h2M =h2QPDG.GetMass(); // Mass of the second hadron - } - else if(QPDG==90002000) - { + } + else if(QPDG==90002000) + { h1QPDG=pQPDG; // QPDG of the first hadron h1M =mProt; // Mass of the first hadron h2QPDG=h1QPDG; // QPDG of the second hadron h2M =mProt; // Mass of the second hadron - } - else if(QPDG==92000000) - { + } + else if(QPDG==92000000) + { h1QPDG=lQPDG; // QPDG of the first hadron h1M =mLamb; // Mass of the first hadron h2QPDG=h1QPDG; // QPDG of the second hadron h2M =mLamb; // Mass of the second hadron G4double ddMass=totMass-envM; // Free CM energy if(ddMass>mSigZ+mSigZ) // Sigma0+Sigma0 is possible - { // @@ Only two particles PS is used + { // @@ Only two particles PS is used G4double dd2=ddMass*ddMass; // Squared free energy G4double sma=mLamb+mLamb; // Lambda+Lambda sum G4double pr1=sqrt((dd2-sma*sma)*dd2); // Lamb+Lamb PS @@ -3131,7 +3153,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() } // } // else if(ddMass>mSigZ+mLamb) // Lambda+Sigma0 is possible - { // @@ Only two particles PS is used + { // @@ Only two particles PS is used G4double dd2=ddMass*ddMass; // Squared free energy G4double sma=mLamb+mLamb; // Lambda+Lambda sum G4double pr1=sqrt((dd2-sma*sma)*dd2); // Lamb+Lamb PS @@ -3144,19 +3166,19 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() h1M =mSigZ; // Mass of the first hadron } // } // - } // + } // if(h1M+h2M+envM "Three parts decay" case - { + { G4LorentzVector h14M(0.,0.,0.,h1M); G4LorentzVector h24M(0.,0.,0.,h2M); G4LorentzVector e4M(0.,0.,0.,envM); if(!G4QHadron(tot4M).DecayIn3(h14M,h24M,e4M)) - { - G4cerr<<"Warning->G4QE::HQE:M="<"<G4QE::HQE:M="<"< than decaying mass"); + //throw G4QException("G4QEnv::HadrQEnv:QChipo+Env mass > than decaying mass"); #endif CleanUp(); G4QHadron* evH = new G4QHadron(totQC,tot4M);// Create a Hadron for ResidualNucl EvaporateResidual(evH); // Try to evaporate residual (del. equiv.) return theQHadrons; - } + } } else if(spbRN)// => "Join all quasmons to the residual compound and evaporate" case - { + { #ifdef fdebug G4cout<<"***G4QEnv::HadQEnv: Evaporate the total residual tRN="<3) // "Try to correct" case (change condition) - { + { #ifdef pdebug - G4cout<<"***G4QEnv::HadrQE: M="<1) // => "Skip K,gam & decayed" + { G4QHadron* thePrev = theQHadrons[nOfOUT-2]; theQHadrons.pop_back(); // the last QHadron is excluded from OUTPUT theQHadrons.pop_back(); // the prev QHadron is excluded from OUTPUT @@ -3232,7 +3254,7 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() theLast = thePrev; // Update parameters(thePrev becomes theLast) last4M = theLast->Get4Momentum(); lastQC = theLast->GetQC(); - } + } else { theQHadrons.pop_back(); // the last QHadron is excluded from OUTPUT @@ -3245,16 +3267,16 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() totPDG=totQC.GetSPDGCode(); if(totPDG==10&&totQC.GetBaryonNumber()>0) totPDG=totQC.GetZNSPDGCode(); if(bn>1) - { + { totS =totQC.GetStrangeness(); // Total Strangeness of this System if(totS>=0) // => "This is a normal nucleus" case - { + { G4QNucleus newN(totQC,tot4M); totPDG=newN.GetPDG(); totM =newN.GetMZNS(); // Calculate new minimum (GS) mass - } + } else if(totS==-1) // => "Try to decay in K+/aK0 and finish" - { + { G4double m1=mK; G4int PDG1=321; G4QNucleus newNp(totQC-KpQC); @@ -3263,23 +3285,23 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4QNucleus newN0(totQC-K0QC); G4double m3=newN0.GetMZNS(); if (m3+mK0 "aK0+ResA is better" case - { + { m1 =mK0; PDG1=311; m2 =m3; PDG2=newN0.GetPDG(); - } + } if(totMass>m1+m2) // => "can decay" case { G4LorentzVector fq4M(0.,0.,0.,m1); G4LorentzVector qe4M(0.,0.,0.,m2); if(!G4QHadron(tot4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"---Warning---G4QE::HadQE:tM="<aK="<"Try to decay in 2(K+/aK0) and finish" - { + { G4double m1=mK; G4int PDG1=321; G4double m2=mK0; @@ -3319,42 +3341,42 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4QNucleus newNpp(totQC-KpQC-KpQC); G4double m5=newNpp.GetMZNS(); // M-2*K^+ if (m4+mK0+mK0"2K0+ResA is theBest" - { + { m1 =mK0; PDG1=311; m3 =m4; PDG3=newN00.GetPDG(); - } + } else if(m5+mK+mK"2Kp+ResA isTheBest" - { + { m2 =mK; PDG1=321; m3 =m5; PDG3=newNpp.GetPDG(); - } + } if(totMass>m1+m2+m3) // => "can decay" case { G4LorentzVector k14M(0.,0.,0.,m1); G4LorentzVector k24M(0.,0.,0.,m2); G4LorentzVector ra4M(0.,0.,0.,m3); if(!G4QHadron(tot4M).DecayIn3(k14M,k24M,ra4M)) - { + { G4cerr<<"--Warning--G4QE::HQE:tM="<aK="< "Continue reversion" case - } + } else - { + { if (totPDG==1114||totPDG==2224||totPDG==10) // Decay right now and finish - { + { G4double m1=mNeut; G4int PDG1=2112; G4double m2=mPi; G4int PDG2=-211; - if(totPDG==2224) - { + if(totPDG==2224) + { m1=mProt; PDG1=2212; m2=mPi; PDG2=211; - } + } else if(totPDG==10) // "Chipolino" case - { + { G4QChipolino resChip(totQC); // define the residual as a Chipolino G4QPDGCode h1=resChip.GetQPDG1(); PDG1=h1.GetPDGCode(); // PDG code of the first hadron @@ -3400,18 +3422,18 @@ G4QHadronVector G4QEnvironment::HadronizeQEnvironment() G4QPDGCode h2=resChip.GetQPDG2(); PDG2=h2.GetPDGCode(); // PDG code of the second hadron m2 =h2.GetMass(); // Mass of the second hadron - } + } if(totMass>m1+m2) - { + { G4LorentzVector fq4M(0.,0.,0.,m1); G4LorentzVector qe4M(0.,0.,0.,m2); if(!G4QHadron(tot4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"---Warning---G4QE::HaQE:tM="< h1="<"<"<"<"< 2N="<1) DecayMultyBaryon(qH); @@ -3693,11 +3714,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4LorentzVector k14M(0.,0.,0.,mK1); G4LorentzVector k24M(0.,0.,0.,mK2); if(!G4QHadron(q4M).DecayIn3(n4M,k14M,k24M)) - { + { G4cerr<<"***G4QEnv::EvaRes: tM="< N="< " < GSM="< GSM="<GetBaryonNumber(); G4int nFragm = theLast->GetNFragments(); //////////////////G4int gam = theLast->GetPDGCode(); #ifdef debug - G4cout<<"G4QE::EvaRes:*BackFus,BN="< "Delete Decayed Hadrons" case + { G4QHadron* thePrev = theQHadrons[nOfOUT-2]; nFragm = thePrev->GetNFragments(); #ifdef debug G4int prevPDG = thePrev->GetPDGCode(); - G4cout<<"G4QEnv::EvaRes:DelTheLast, nFr="<Get4Momentum(); G4QContent lastQC = theLast->GetQC(); G4double lastM = last4M.m(); // Mass of the BackFused Fragment @@ -3797,11 +3818,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4int totBN=totQC.GetBaryonNumber();// BaryonNumber of the Total Residual Nucleus G4double dM=totMass-GSMass -lastM; #ifdef debug - G4cout<<"G4QE::EvaRes: tM="<-0.001) - { + { G4QHadron* evH = new G4QHadron(totPDG,q4M);// Create QHadron for TotalResidNucl if(dM<=0.) { @@ -3809,9 +3830,9 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) delete theLast; //When kill, DON'T forget to delete lastQHadron asAnInstance! if(totBN==2)DecayDibaryon(evH); // Fill dibaryon (with decay products) else theQHadrons.push_back(evH);// Fill TRN to HVect asIs (delete equivalent) - } + } else // Decay TotalResidualNucleus in GSM+Last and Break - { + { G4LorentzVector r4Mom(0.,0.,0.,GSMass); if(!G4QHadron(q4M).DecayIn2(last4M,r4Mom)) { @@ -3821,7 +3842,7 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) #ifdef debug G4cout<<"***G4QE::EvaR:DecayIn L"<totResN="<totResN="<0&&bA>1) // There's aNeutr in theNucl, which can be split - { + { G4QContent resQC=totQC-neutQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus nResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3894,11 +3915,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(nResPDG==90001000) nResM=mProt; else if(nResPDG==91000000) nResM=mLamb; else nResM=resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double pResM =1000000.; // Prototype of mass of residual for a proton G4int pResPDG=0; // Prototype of PDGCode of residual for a proton if(bsCond==2212&&bZ>0&&bA>1) // There's aProton in Nucl, which can be split - { + { G4QContent resQC=totQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus pResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3906,11 +3927,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(pResPDG==90001000) pResM=mProt; else if(pResPDG==91000000) pResM=mLamb; else pResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double lResM =1000000.; // Prototype of mass of residual for a Lambda G4int lResPDG=0; // Prototype of PDGCode of residual for a Lambda if(bsCond==3122&&bS>0&&bA>1) // There's aLambd in theNucl, which can be split - { + { G4QContent resQC=totQC-lambQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus lResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3918,11 +3939,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(lResPDG==90001000) lResM=mProt; else if(lResPDG==91000000) lResM=mLamb; else lResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double dResM =1000000.; // Prototype of mass of residual for a Alpha G4int dResPDG=0; // Prototype of PDGCode of residual for a Alpha if(bsCond==90001001&&bN>0&&bZ>0&&bA>2)// There's aDeuter in Nucl, which canBeRadiated - { + { G4QContent resQC=totQC-deutQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus dResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3930,11 +3951,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(dResPDG==90001000) dResM=mProt; else if(dResPDG==91000000) dResM=mLamb; else dResM =resN.GetMZNS(); // minMass of the Residual Nucleus - } + } G4double aResM =1000000.; // Prototype of mass of residual for a Alpha G4int aResPDG=0; // Prototype of PDGCode of residual for a Alpha if(bsCond==90002002&&bN>1&&bZ>1&&bA>4)// There's Alpha in theNucl, which can be split - { + { G4QContent resQC=totQC-alphQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus aResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3942,11 +3963,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(aResPDG==90001000) aResM=mProt; else if(aResPDG==91000000) aResM=mLamb; else aResM =resN.GetMZNS(); // minMass of the Residual Nucleus - } + } G4double nnResM =1000000.; // Prototype of mass of residual for a dineutron G4int nnResPDG=0; // Prototype of ResidualPDGCode for a dineutron if(dbsCond&&bN>1&&bA>2) // It's nucleus and there is a dineutron - { + { G4QContent resQC=totQC-neutQC-neutQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus nnResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3954,11 +3975,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(nnResPDG==90001000) nnResM=mProt; else if(nnResPDG==91000000) nnResM=mLamb; else nnResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double ppResM =1000000.; // Prototype of mass of residual for a diproton G4int ppResPDG=0; // Prototype of ResidualPDGCode for a diproton if(dbsCond&&bZ>1&&bA>2) // It's nucleus and there is a diproton - { + { G4QContent resQC=totQC-protQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus ppResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3966,11 +3987,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(ppResPDG==90001000) ppResM=mProt; else if(ppResPDG==91000000) ppResM=mLamb; else ppResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double npResM =1000000.; // Prototype of ResidualMass for proton+neutron G4int npResPDG=0; // Prototype of ResidualPDGCode for a prot+neut if(dbsCond&&bN>0&&bZ>0&&bA>2) // It's nucleus and there is aProton & aNeutron - { + { G4QContent resQC=totQC-neutQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus npResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3978,11 +3999,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(npResPDG==90001000) npResM=mProt; else if(npResPDG==91000000) npResM=mLamb; else npResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double lnResM =1000000.; // Prototype of residualMass for lambda+neutron G4int lnResPDG=0; // Prototype of ResidualPDGCode for aLambda+Neut if(dbsCond&&bN>0&&bS>0&&bA>2) // It's nucleus and there is aLambda & aNeutron - { + { G4QContent resQC=totQC-lambQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus lnResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -3990,11 +4011,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(lnResPDG==90001000) lnResM=mProt; else if(lnResPDG==91000000) lnResM=mLamb; else lnResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } G4double lpResM =1000000.; // Prototype of residualMass for a proton+lambda G4int lpResPDG=0; // Prototype of ResidualPDGCode for theProt+lamb if(dbsCond&&bS>0&&bZ>0&&bA>2) // It's nucleus and there is aProton and aLambda - { + { G4QContent resQC=totQC-neutQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus lpResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -4002,11 +4023,11 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(lpResPDG==90001000) lpResM=mProt; else if(lpResPDG==91000000) lpResM=mLamb; else lpResM =resN.GetMZNS(); // minMass of the Residual Nucleus - } + } G4double llResM =1000000.; // Prototype of mass of residual for a di-lambda G4int llResPDG=0; // Prototype of ResidPDGCode for the di-lambda if(dbsCond&&bS>1&&bA>2) // It's nucleus and there is a di-lambda - { + { G4QContent resQC=totQC-neutQC-protQC; G4QNucleus resN(resQC); // Pseudo nucleus for the Residual Nucleus llResPDG=resN.GetPDG(); // PDG of the Residual Nucleus @@ -4014,7 +4035,7 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) else if(llResPDG==90001000) llResM=mProt; else if(llResPDG==91000000) llResM=mLamb; else llResM =resN.GetMZNS(); // min mass of the Residual Nucleus - } + } #ifdef debug G4cout<<"G4QEnv::EvaRes: rP="<GSM="< bCB="<2 - unexpected evaporated fragment"<2) EvaporateResidual(rHadron); // Continue evaporation (@@ Self-call) else if(rB==2) // => "Dibaryon" case needs decay @@ DecayDibaryon - { + { G4double rGSM = rHadron->GetQPDG().GetMass();// Ground State mass of the dibaryon #ifdef debug - G4cout<<"G4QE::EvaRes:ResidDibM="< M="< "Dibaryon Decay" case (del.equivalent) - } + } else if(rB==5) DecayAlphaBar(rHadron); // "Alpha+Baryon Decay" case (del.equival.) else if(rPDG==90004002) DecayAlphaDiN(rHadron);//Decay alph+2p (alph+2n is stable) else if(rPDG==90004004) DecayAlphaAlpha(rHadron);// "Alpha+Alpha Decay" case(delEq) else theQHadrons.push_back(rHadron); // Fill ResidNucl=Baryon to OutputHadronVector - } // End of fail in decay check + } // End of fail in decay check //else delete qH; else { G4Quasmon* quasH = new G4Quasmon(qH->GetQC(),qH->Get4Momentum()); theEnvironment=G4QNucleus(90000000,G4LorentzVector(0.,0.,0.,0.)); - if(!CheckGroundState(quasH,true)) theQHadrons.push_back(qH); // Cor or fillAsItIs + if(!CheckGroundState(quasH,true)) theQHadrons.push_back(qH); // Cor or fillAsItIs else delete qH; delete quasH; } - } // End of Evaporation of excited system + } // End of Evaporation of excited system #ifdef debug G4cout<<"G4QEnv::EvaRes: === End of the evaporation attempt"<GetQC(); // Quark content of the hadron G4QChipolino resChip(totQC); // define the Residual as a Chipolino G4QPDGCode h1=resChip.GetQPDG1(); @@ -4376,10 +4397,10 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4LorentzVector fq4M(0.,0.,0.,m1); G4LorentzVector qe4M(0.,0.,0.,m2); if(!G4QHadron(q4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"***G4QEnv::EvaRes:tM="< h1M="<h1+h2 DecIn2 error"); - } + throw G4QException("G4QEnvironment::EvaporateResid:Chip->h1+h2 DecIn2 error"); + } G4QHadron* H2 = new G4QHadron(h2.GetPDGCode(),qe4M); #ifdef fdebug G4cout<<"G4QE::EvaRes:(2) h2="<2) theQHadrons.push_back(qH); else if ((thePDG==221||thePDG==331)&&totMass>mPi+mPi) // "Decay in pipi" case - { + { G4LorentzVector fq4M(0.,0.,0.,mPi); G4LorentzVector qe4M(0.,0.,0.,mPi); if(!G4QHadron(q4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"***G4QEnv::EvaporateResidual: tM="< pi+ + pi-"<Pi+Pi DecayIn2 error"); - } + throw G4QException("G4QEnv::EvaporateResidual: H->Pi+Pi DecayIn2 error"); + } delete qH; G4QHadron* H1 = new G4QHadron(211,fq4M); #ifdef fdebug @@ -4423,16 +4444,16 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4cout<<"G4QE::EvaRes:(3) PiMinus="<mPi0+mPi0) // "Decay in 2pi0" case - { + { G4LorentzVector fq4M(0.,0.,0.,mPi0); G4LorentzVector qe4M(0.,0.,0.,mPi0); if(!G4QHadron(q4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"***G4QEnv::EvaporateResidual: tM="< pi0 + pi0"<Pi+Pi DecayIn2 error"); - } + throw G4QException("G4QEnv::EvaporateResidual: H->Pi+Pi DecayIn2 error"); + } delete qH; G4QHadron* H1 = new G4QHadron(111,fq4M); #ifdef fdebug @@ -4444,16 +4465,16 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4cout<<"G4QE::EvaRes:(4) Pi02="<totM) // "Radiative Hadron decay" case - { + { G4LorentzVector fq4M(0.,0.,0.,0.); G4LorentzVector qe4M(0.,0.,0.,totM); if(!G4QHadron(q4M).DecayIn2(fq4M,qe4M)) - { + { G4cerr<<"***G4QEnv::EvaporateRes:tM="<h1M="<H+gamma DecIn2 error"); - } + throw G4QException("G4QEnv::EvaporateResidual:H*->H+gamma DecIn2 error"); + } delete qH; G4QHadron* H2 = new G4QHadron(thePDG,qe4M); #ifdef fdebug @@ -4465,16 +4486,16 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4cout<<"G4QE::EvaRes:(5) GamFortot="<gamma + gamma"<g+g DecIn2 error"); - } + throw G4QException("G4QEnv::EvaporateResidual:pi/eta->g+g DecIn2 error"); + } delete qH; G4QHadron* H2 = new G4QHadron(22,qe4M); #ifdef fdebug @@ -4486,15 +4507,15 @@ void G4QEnvironment::EvaporateResidual(G4QHadron* qH, G4bool corFlag) G4cout<<"G4QE::EvaRes:(6) gam2="<Get4Momentum(); totIn4M += Q4M; totInC += pQ->GetQC().GetCharge(); @@ -4749,7 +4752,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4LorentzVector hs4Mom = theQHadrons[jso]->Get4Momentum(); totIn4M += hs4Mom; totInC += theQHadrons[jso]->GetCharge(); - } + } } #endif #ifdef chdebug @@ -4793,7 +4796,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4cout<<"G4QEnv::FSI: subtract Environment="<GetStatus()) // Subtract only if Quasmon is alive { // G4LorentzVector Q4M= prQ->Get4Momentum(); // 4-momentum of the Quasmon @@ -4801,7 +4804,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4cout<<"G4QE::FSI: Subtract Quasmon("<GetQC().GetCharge(); // - } // + } // else G4cout<<"G4QE::FSI:Dead Quasmon("<GetStatus()<"<SetQPDG(fQPDG); @@ -5105,7 +5107,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4QHadron* sH = new G4QHadron(sPDG,s4M); theQHadrons.push_back(sH); // (delete equivalent) } - } + } else { G4bool fOK=true; @@ -5114,17 +5116,17 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4LorentzVector t4M(0.,0.,0.,tM); G4double sum=fM+sM+tM; if(fabs(hM-sum)<=eps) - { + { f4M=h4Mom*(fM/sum); s4M=h4Mom*(sM/sum); t4M=h4Mom*(tM/sum); - } + } else if(hM"<SetQPDG(fQPDG); @@ -5166,9 +5168,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4QHadron* tH = new G4QHadron(tPDG,t4M); theQHadrons.push_back(tH); // (delete equivalent) } - } + } nHadr=theQHadrons.size(); - } + } else if(hPDG==89999003||hPDG==90002999||hPDG==90000003||hPDG==90003000|| hPDG==90999002||hPDG==91001999) // "3-particles decays of dibaryons and 3N" { @@ -5183,26 +5185,26 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4int tPDG = -211; G4double tM = mPi; if(hPDG==90002999) // p,p,pi+ - { + { nuQPDG = pQPDG; // Substitute p for the first n nucM = mProt; barPDG = 2212; // Substitute p for the second n barM = mProt; tPDG = 211; // Substitute pi+ for the first pi- - } + } else if(hPDG==90003000) // 3p - { + { nuQPDG = pQPDG; // Substitute p for the first n nucM = mProt; barPDG = 2212; // Substitute p for the second n barM = mProt; tPDG = 2212; // Substitute p for pi- tM = mProt; - } + } else if(hPDG==90999002) // n,Lambda,pi-/n,Sigma0,pi-/n,Sigma-,gamma(@@) - { + { if(hM>mSigZ+mNeut+mPi) - { + { G4double ddMass=hM-mPi; // Free CM energy G4double dd2=ddMass*ddMass; // Squared free energy G4double sma=mLamb+mNeut; // Neutron+Lambda sum @@ -5219,7 +5221,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() { barPDG = 3122; // Substitute Lambda for the second n barM = mLamb; - } + } } else if(hM>mLamb+mNeut+mPi) { @@ -5233,14 +5235,14 @@ G4QHadronVector* G4QEnvironment::FSInteraction() tPDG = 22; tM = 0; } - } + } else if(hPDG==91001999) // p,Lambda,pi+/p,Sigma0,pi+/p,Sigma+,gamma(@@) - { + { nuQPDG = pQPDG; // Substitute p for the first n nucM = mProt; tPDG = 211; // Substitute pi+ for the first pi- if(hM>mSigZ+mProt+mPi) - { + { G4double ddMass=hM-mPi; // Free CM energy G4double dd2=ddMass*ddMass; // Squared free energy G4double sma=mLamb+mProt; // Lambda+Proton sum @@ -5257,7 +5259,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() { barPDG = 3122; // Substitute Lambda for the second n barM = mLamb; - } + } } if(hM>mLamb+mProt+mPi) { @@ -5271,25 +5273,25 @@ G4QHadronVector* G4QEnvironment::FSInteraction() tPDG = 22; tM = 0; } - } + } else if(hPDG==90000003) // 3n - { + { tPDG = 2112; // Substitute n for pi- tM = mNeut; - } + } G4bool fOK=true; G4LorentzVector nu4M(0.,0.,0.,nucM); G4LorentzVector ba4M(0.,0.,0.,barM); G4LorentzVector pi4M(0.,0.,0.,tM); G4double sum=nucM+barM+tM; if(fabs(hM-sum)<=eps) - { + { nu4M=h4Mom*(nucM/sum); ba4M=h4Mom*(barM/sum); pi4M=h4Mom*(tM/sum); - } + } if(hM N="<SetQPDG(nuQPDG); @@ -5350,7 +5353,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() theQHadrons.push_back(piH); // (delete equivalent) nHadr=theQHadrons.size(); } - } + } else if(hBN>1 && !sBN && (cBN<0 || cBN>hBN)) // "nN+mD- or nP+mD++ decay" { #ifdef pdebug @@ -5366,7 +5369,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4double tM = mPi; G4int nPi = -cBN; // a#of Pi-'s if( cBN>hBN) // reinitialization for the "(n+m)*P,m*pi+" case - { + { nuQPDG = pQPDG; // Substitute p for the first n nucM = mProt; barPDG = 2212; // Substitute p for the second n @@ -5382,13 +5385,13 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4LorentzVector pi4M(0.,0.,0.,tM); G4double sum=nucM+barM+tM; if(fabs(hM-sum)<=eps) - { + { nu4M=h4Mom*(nucM/sum); ba4M=h4Mom*(barM/sum); pi4M=h4Mom*(tM/sum); - } + } if(hMN="<SetQPDG(nuQPDG); @@ -5467,12 +5470,11 @@ G4QHadronVector* G4QEnvironment::FSInteraction() // *** (1) Charge Control Sum Calculation for the Charge Conservation Check *** G4int ccContSum=0; // Intermediate ChargeControlSum G4int cbContSum=0; // Intermediate BaryonNumberControlSum - if(nHadr)for(unsigned ic1=0; ic1GetNFragments())) - { - ccContSum+=theQHadrons[ic1]->GetCharge(); - cbContSum+=theQHadrons[ic1]->GetBaryonNumber(); - } + if(nHadr)for(unsigned ic1=0; ic1GetNFragments())) + { + ccContSum+=theQHadrons[ic1]->GetCharge(); + cbContSum+=theQHadrons[ic1]->GetBaryonNumber(); + } if(ccContSum-chContSum || cbContSum-bnContSum) { G4cerr<<"*G4QE::FSI:(1) dC="<"<SetQPDG(fQPDG); @@ -5581,7 +5583,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() hPDG = curHadr->GetPDGCode(); // Change PDG Code of theFirstFragment hQPDG= G4QPDGCode(hPDG); hGSM = hQPDG.GetMass(); // Change GroundStateMass of theFirstFragm - } + } nHadr=theQHadrons.size(); if(hPDG==89001001||hPDG==89002000||hPDG==89000002) { @@ -5593,14 +5595,14 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4int sPDG =311; G4double sM =mK0; if(hPDG==89000002) - { + { fQPDG=pQPDG; fM =mProt; sPDG =321; sM =mK; } if(hPDG==89001001) - { + { if(hM.5) { sPDG =321; @@ -5617,12 +5619,12 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4LorentzVector s4M(0.,0.,0.,sM); G4double sum=fM+sM; if(fabs(hM-sum)<=eps) - { + { f4M=h4Mom*(fM/sum); s4M=h4Mom*(sM/sum); - } + } else if(hM"<SetQPDG(fQPDG); @@ -5667,7 +5669,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() hPDG = curHadr->GetPDGCode(); // Change PDG Code of theFirstFragment hQPDG= G4QPDGCode(hPDG); hGSM = hQPDG.GetMass(); // Change GroundStateMass of theFirstFragm - } + } nHadr=theQHadrons.size(); G4int hS = curHadr->GetStrangeness(); G4int hF = curHadr->GetNFragments(); @@ -5683,12 +5685,12 @@ G4QHadronVector* G4QEnvironment::FSInteraction() #ifdef pdebug G4cout<<"G4QE::FSI:h="<0&&!hS&&(nHadr>3||hB<2)) // ThermoBackFus (VIMP for gamA TotCS) - //if(hadron&&!hF&&hB>0&&!hS&&(nHadr>2||hB<4)) // ThermoBackFus (VIMP for gamA TotCS) - if(hadron&&!hF&&hB>0&&!hS) // ThermoBackFusion cond. (VIMP for gamA TotCS) - //if(hadron&&!hF&&hB>0&&hB<4&&!hS) // ThermoBackFusion cond. (VIMP for gamA TotCS) - //if(hadron&&!hF&&hB>0&&!hS&&nHadr>2)//ThermoBackFusion MAX condition (VIMP for gamA) - //if(2>3) // Close the ThermoBackFusion (VIMP for gamA TotCS) + //if(hadron&&!hF&&hB>0&&!hS&&(nHadr>3||hB<2)) // ThermoBackFus (VIMP for gamA TotCS) + //if(hadron&&!hF&&hB>0&&!hS&&(nHadr>2||hB<4)) // ThermoBackFus (VIMP for gamA TotCS) + if(hadron&&!hF&&hB>0&&!hS) // ThermoBackFusion cond. (VIMP for gamA TotCS) + //if(hadron&&!hF&&hB>0&&hB<4&&!hS) // ThermoBackFusion cond. (VIMP for gamA TotCS) + //if(hadron&&!hF&&hB>0&&!hS&&nHadr>2)//ThermoBackFusion MAX condition (VIMP for gamA) + //if(2>3) // Close the ThermoBackFusion (VIMP for gamA TotCS) { #ifdef pdebug //if(nHadr==3) @@ -5696,7 +5698,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() #endif G4QContent hQC = curHadr->GetQC(); if(hadron&&!hF&&hB>0) for(unsigned pt=0; ptGetNFragments(); G4LorentzVector b4m= backH->Get4Momentum(); @@ -5722,29 +5724,29 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4int bS = backH->GetStrangeness(); #ifdef pdebug //if(nHadr==3) - G4cout<<"G4QE::FSI:"<tM="<tM+.001&&pCM20||hB==1&&bB>0)&&bM+hM>tM+.00001 + //if(!bF&&!bS&&(bB==1&&hB>0||hB==1&&bB>0)&&bM+hM>tM+.00001 // && (pCM23||pCM2tM+.001&&(pCM23 || - // pCM290000000)) + //if(!bF&&(bB==1||hB==1)&&bM+hM>tM+.001&&(pCM23 || + // pCM290000000)) //if(!bF&&bB<4&&bM+hM>tM+.001&&pCM20&&bM+hM>tM+.001&&pCM2tM+.001&&(pCM23||bPDG>90000000)&&bM+hM>tM+.001&&pCM2tM+.001&&pCM2tM+.001&&sM-bM-hMtM+.001&&sM-bM-hM3||bPDG>90000000)&&bM+hM>tM+.001&&pCM2tM+.001&&pCM2tM+.001&&sM-bM-hMtM+.001&&sM-bM-hMGetPDGCode(); - if(sPDG==89999003||sPDG==90002999||sPDG==89999002||sPDG==90001999) + if(sPDG==89999003||sPDG==90002999||sPDG==89999002||sPDG==90001999) G4cout<<"G4QE::FSI:**nD-/pD++**,h="<["<mSigZ+mSigZ) // Sigma0+Sigma0 is possible - { // @@ Only two particles PS is used + { // @@ Only two particles PS is used G4double sma=mLamb+mLamb; // Lambda+Lambda sum G4double pr1=sqrt((sM2-sma*sma)*sM2); // Lamb+Lamb PS sma=mLamb+mSigZ; // Lambda+Sigma0 sum @@ -5815,7 +5817,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() } // } else if(sM>mSigZ+mLamb) // Lambda+Sigma0 is possible - { // @@ Only two particles PS is used + { // @@ Only two particles PS is used G4double sma=mLamb+mLamb; // Lambda+Lambda sum G4double pr1=sqrt((sM2-sma*sma)*sM2); // Lamb+Lamb PS sma=mLamb+mSigZ; // Lambda+Sigma0 sum @@ -5827,9 +5829,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() f4Mom=G4LorentzVector(0.,0.,0.,mSigZ); } // } // - } + } else if(sPDG==89999003) // A=2 - { + { hQPDG=nQPDG; rQPDG=nQPDG; fQPDG=pimQPDG; @@ -5837,9 +5839,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mPi); three=true; - } + } else if(sPDG==90002999) - { + { hQPDG=pQPDG; rQPDG=pQPDG; fQPDG=pipQPDG; @@ -5847,9 +5849,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mPi); three=true; - } + } else if(sPDG==90000003) // A=3 - { + { hQPDG=nQPDG; rQPDG=nQPDG; fQPDG=nQPDG; @@ -5857,9 +5859,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mNeut); three=true; - } + } else if(sPDG==90003000) - { + { hQPDG=pQPDG; rQPDG=pQPDG; fQPDG=pQPDG; @@ -5867,37 +5869,37 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mProt); three=true; - } + } else if(sPDG==90001003) // A=4 - { + { rQPDG=nQPDG; fQPDG=tQPDG; g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mTrit); - } + } else if(sPDG==90003001) - { + { rQPDG=pQPDG; fQPDG=he3QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mHe3); - } + } else if(sPDG==90002003) // A=5 - { + { rQPDG=nQPDG; fQPDG=aQPDG; g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mAlph); - } + } else if(sPDG==90003002) - { + { rQPDG=pQPDG; fQPDG=aQPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mAlph); - } + } else if(sPDG==90004002) // A=6 - { + { hQPDG=pQPDG; rQPDG=pQPDG; fQPDG=aQPDG; @@ -5905,30 +5907,30 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mAlph); three=true; - } + } else if(sPDG==90002005) // A=7 - { + { rQPDG=nQPDG; fQPDG=a6QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mHe6); - } + } else if(sPDG==90005002) - { + { rQPDG=pQPDG; fQPDG=be6QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mBe6); - } + } else if(sPDG==90004004) // A=8 - { + { fQPDG=aQPDG; rQPDG=aQPDG; f4Mom=G4LorentzVector(0.,0.,0.,mAlph); g4Mom=f4Mom; - } + } //else if(sPDG==90006002) - //{ + //{ // hQPDG=pQPDG; // rQPDG=pQPDG; // fQPDG=be6QPDG; @@ -5936,9 +5938,9 @@ G4QHadronVector* G4QEnvironment::FSInteraction() // g4Mom=G4LorentzVector(0.,0.,0.,mProt); // f4Mom=G4LorentzVector(0.,0.,0.,mBe6); // three=true; - //} + //} //else if(sPDG==90002006) - //{ + //{ // hQPDG=nQPDG; // rQPDG=nQPDG; // fQPDG=a6QPDG; @@ -5946,16 +5948,16 @@ G4QHadronVector* G4QEnvironment::FSInteraction() // g4Mom=G4LorentzVector(0.,0.,0.,mNeut); // f4Mom=G4LorentzVector(0.,0.,0.,mHe6); // three=true; - //} + //} else if(sPDG==90002007) // A=9 - { + { rQPDG=nQPDG; fQPDG=a8QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mNeut); f4Mom=G4LorentzVector(0.,0.,0.,mHe8); - } + } else if(sPDG==90005004) // A=9 - { + { rQPDG=pQPDG; fQPDG=aQPDG; hQPDG=aQPDG; @@ -5963,16 +5965,16 @@ G4QHadronVector* G4QEnvironment::FSInteraction() f4Mom=G4LorentzVector(0.,0.,0.,mAlph); t4Mom=G4LorentzVector(0.,0.,0.,mAlph); three=true; - } + } else if(sPDG==90007002) // A=9 - { + { rQPDG=pQPDG; fQPDG=c8QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mC8); - } + } else if(sPDG==90008004) // A=12 - { + { hQPDG=pQPDG; rQPDG=pQPDG; fQPDG=c10QPDG; @@ -5980,23 +5982,23 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mC10); three=true; - } + } else if(sPDG==90009006) // A=15 - { + { rQPDG=pQPDG; fQPDG=o14QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mO14); - } + } else if(sPDG==90009007) // A=16 - { + { rQPDG=pQPDG; fQPDG=o15QPDG; g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mO15); - } + } else if(sPDG==90010006) // A=16 - { + { hQPDG=pQPDG; rQPDG=pQPDG; fQPDG=o14QPDG; @@ -6004,7 +6006,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() g4Mom=G4LorentzVector(0.,0.,0.,mProt); f4Mom=G4LorentzVector(0.,0.,0.,mO14); three=true; - } + } #ifdef pdebug G4cout<<"G4QE::FSI: "<900.) // MomentumIsConserved - recoverMissing - { + { if(fabs(re-mNeut)<.01) - { + { G4cout<<"...G4QE::FSI:E/M conservation is corrected by neutron"<Get4Momentum(); // 4-mom of thePreviousHadron G4double cHM = curHadr->GetMass(); // Mass of the current hadron G4double pHM = prevHadr->GetMass(); // Mass of the current hadron tot4Mom+=cH4Mom+pH4Mom; G4double totRM=tot4Mom.m(); - if(cHM+pHM<=totRM+.03) // *** Make the final correction *** - { + if(cHM+pHM<=totRM) // *** Make the final correction *** + { if(!G4QHadron(tot4Mom).DecayIn2(pH4Mom,cH4Mom)) { G4cerr<<"***G4QE::FSI:**Correction**tot4M="<sM="<"<GetNFragments())) - { - ccContSum+=theQHadrons[ic3]->GetCharge(); - cbContSum+=theQHadrons[ic3]->GetBaryonNumber(); - } + if(nHadr)for(unsigned ic3=0; ic3GetNFragments())) + { + ccContSum+=theQHadrons[ic3]->GetCharge(); + cbContSum+=theQHadrons[ic3]->GetBaryonNumber(); + } if(ccContSum-chContSum || cbContSum-bnContSum) { G4cerr<<"*G4QE::FSI:(3) dC="<2)for(unsigned f=0; fGetBaryonNumber()>1) frag=true; // The fragment is found - } - if(nHadr>2 && frag) for(G4int h=nHadr-1; h>=0; h--)//Collect gammas & kill DecayedHadrs + if(nHadr>2 && frag) for(G4int h=nHadr-1; h>=0; h--)//Collect gammas & kill DecayedHadrs { G4QHadron* curHadr = theQHadrons[h]; // Get a pointer to the current Hadron G4int hF = curHadr->GetNFragments(); @@ -6277,30 +6277,30 @@ G4QHadronVector* G4QEnvironment::FSInteraction() if(hPDG==89999003||hPDG==90002999) G4cerr<<"---Warning---G4QEnv::FSI:nD-/pD++(1)="<(theQHadrons.size())-1) // Need swap with the Last - { + { curHadr->SetNFragments(0); curHadr->Set4Momentum(theLast->Get4Momentum()); //curHadr->SetQC(theLast->GetQC()); curHadr->SetQPDG(theLast->GetQPDG()); #ifdef pdebug - G4cout<<"G4QE::FSI: Exchange with the last is done"<GetNFragments())) - { + if(nHadr)for(unsigned ic4=0; ic4GetNFragments())) + { ccContSum+=theQHadrons[ic4]->GetCharge(); cbContSum+=theQHadrons[ic4]->GetBaryonNumber(); - } + } if(ccContSum-chContSum || cbContSum-bnContSum) { G4cerr<<"*G4QE::FSI:(4) dC="<3) // Close the pair absorbtion of gamma - { + else if(nHadr) // Get LastHadrBefResNuc, absorb gam & decay + //else if(2>3) // Close the pair absorbtion of gamma + { if(nHadr>1)for(unsigned sh=0; shGet4Momentum(); // Accumulate the 4Momenta of photons G4QHadron* theLast = theQHadrons[nHadr-1];// Pointer to the Last Hadron G4QPDGCode theLQPDG=theLast->GetQPDG(); @@ -6624,7 +6620,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() #ifdef pdebug G4cout<<"G4QE::FSI:Rep. by lPDG="<Get4Momentum()+gamSum; G4double tRM=tR4M.m(); // TotMass of theResidualNucleus to decay if(theLB>4) - { - G4QContent lrQC=curHadr->GetQC()-G4QContent(6,6,0,0,0,0); + { + G4QContent lrQC=curHadr->GetQC()-G4QContent(6,6,0,0,0,0); G4QNucleus lrN(lrQC); G4double lrM=lrN.GetMZNS(); if(tRM>lrM+mAlph) - { + { G4LorentzVector lr4M(0.,0.,0.,lrM); G4LorentzVector al4M(0.,0.,0.,mAlph); if(!G4QHadron(tR4M).DecayIn2(lr4M,al4M)) @@ -6650,7 +6646,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() #ifdef fdebug G4cout<<"G4QE::FSI: After Evap (1) nH="<"<N="<1) n4M/=hBN; // Calculate the 4mom per one nucleon + if(hBN>1) n4M/=hBN; // Calculate the 4mom per one nucleon curHadr->Set4Momentum(n4M); curHadr->SetQPDG(G4QPDGCode(PDGnu)); // At least one nucleun always exists if(hBN>1) for(G4int ih=1; ih2 neutrons conversion (***Check it***)"<GetStrangeness()<0&&curHadr->GetBaryonNumber()>0)// AntistrangeNucleus - { + { G4LorentzVector r4M=curHadr->Get4Momentum(); // Real 4-mom of theAntiStrangeNucleus G4double reM=r4M.m(); // Real mass of the antiStrange nucleus G4QContent nQC=curHadr->GetQC(); // QCont of the Antistrange nucleus @@ -7089,11 +7084,25 @@ G4QHadronVector* G4QEnvironment::FSInteraction() mKaon=mK; kPDG=321; } + G4double sum=mR+mKaon; + if(sum>reM) // for GEANT4 (Can not decay in kaon and residual) + { + if(kPDG==321) // *** Very seldom *** "K+->pi+ conversion" + { + kPDG=211; + mKaon=mPi; + } + else // *** Very seldom *** "K0(S=-1)->pi- conversion" + { + kPDG=111; + mKaon=mPi0; + } + sum=mR+mKaon; + } G4LorentzVector n4M(0.,0.,0.,mR); G4LorentzVector k4M(0.,0.,0.,mKaon); - G4double sum=mR+mKaon; if(fabs(reM-sum)"<A="<Set4Momentum(n4M); - curHadr->SetQPDG(G4QPDGCode(RPDG)); // converted antiStrangeNucleus - G4QHadron* theKaon = new G4QHadron(kPDG,k4M);// Make a New Hadr for the kaon - theQHadrons.push_back(theKaon); // (del.eq.- user is responsible for del) - //theFragments->push_back(theKaon); // (delete equivalent for the kaon) + curHadr->Set4Momentum(k4M); // Kaon + curHadr->SetQPDG(G4QPDGCode(kPDG)); + G4QHadron* theRes = new G4QHadron(RPDG,n4M);// Make a New Hadr for the residual + EvaporateResidual(theRes); // Try to evaporate theResNuc (del.eq.) } } else if(hPDG>90500000&&hPDG!=91000000&&hPDG!=91000999&&hPDG!=90999001) // Only for G4 // @@ Xi & Omega- can be added here ^^^, if show up below - { + { #ifdef fdebug G4cerr<<"**G4QEnvironment::FSI:*G4* Hypernucleus PDG="<GetBaryonNumber(); // Total Baryon Number of the Hypernucleus G4int nC=curHadr->GetCharge(); // Charge of the Hypernucleus G4int nSM=0; // A#0f unavoidable Sigma- + G4int nSP=0; // A#0f unavoidable Sigma+ if(nC<0) // Negative hypernucleus - { + { if(-nCnB-nL) // Extra positive hypernucleus - { + else if(nC>nB-nL) // Extra positive hypernucleus + { if(nCGet4Momentum(); // Real 4-momentum of the hypernucleus G4double reM=r4M.m(); // Real mass of the hypernucleus - G4int rlPDG = hPDG-nL*1000000-nSP*1000999-nSM*999000;// Subtract Lamb/Sig from Nucl + G4int rlPDG = hPDG-nL*1000000-nSP*1000999-nSM*999001;// Subtract Lamb/Sig from Nucl G4int sPDG=3122; // Prototype for the Hyperon PDG G4double MLa=mLamb; // Prototype for one Hyperon decay if(nSP||nSM) - { + { if(nL) { G4cerr<<"***G4QE::FSI: HypNPDG="< Improve it"<1) MLa*=nL; G4double rlM=G4QNucleus(rlPDG).GetMZNS();// Mass of the new nonstrange nucleus if(nL==1&&reM>rlM+mSigZ&&G4UniformRand()>.5) // Sigma0 ! @@ Add it in hadronization - { + { sPDG=3212; MLa=mSigZ; } @@ -7221,22 +7229,22 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4double rnM=rnN.GetMZNS(); // Mass of the new nonstrange nucleus // @@ Take into account that there can be Iso-Hypernucleus (Add PI+,R & Pi-,R decays) if(rlPDG==90000000) // Multy Hyperon (@@ only Lambda is done) - { + { if(nL>1) r4M=r4M/nL; // split the 4-mom for the MultyLambda for(G4int il=0; ilpush_back(theLam); // (delete equivalent for the Hyperon) + //theFragments->push_back(theLam); // (delete equivalent for the Hyperon) } } - else if(reM>rlM+MLa) // Lambda(or Sigma) can be split - { + else if(reM>rlM+MLa-eps) // Lambda(or Sigma) can be split + { G4LorentzVector n4M(0.,0.,0.,rlM); G4LorentzVector h4M(0.,0.,0.,MLa); G4double sum=rlM+MLa; if(fabs(reM-sum)Set4Momentum(n4M); curHadr->SetQPDG(G4QPDGCode(rlPDG)); // converted hypernucleus if(rlPDG==90000002) // Additional action with curHadr change - { + { G4LorentzVector newLV=n4M/2.; curHadr->Set4Momentum(newLV); curHadr->SetQPDG(G4QPDGCode(90000001)); @@ -7260,7 +7268,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() //theFragments->push_back(secHadr); // (del.eq.- user is responsible for del) } else if(rlPDG==90002000) // Additional action with curHadr change - { + { G4LorentzVector newLV=n4M/2.; curHadr->Set4Momentum(newLV); curHadr->SetQPDG(G4QPDGCode(90001000)); @@ -7276,12 +7284,12 @@ G4QHadronVector* G4QEnvironment::FSInteraction() for(G4int il=0; ilpush_back(theLamb); // (delete equivalent for the Hyperon) } } - else if(reM>rnM+mPi0&&!nSP&&!nSM) // Lambda->N only if Sigmas are absent - { + else if(reM>rnM+mPi0-eps&&!nSP&&!nSM) // Lambda->N only if Sigmas are absent + { G4int nPi=static_cast((reM-rnM)/mPi0); if (nPi>nL) nPi=nL; G4double npiM=nPi*mPi0; @@ -7289,7 +7297,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() G4LorentzVector h4M(0.,0.,0.,npiM); G4double sum=rnM+npiM; if(fabs(reM-sum)push_back(thePion); // (delete equivalent for the pion) } if(rnPDG==90000002) // Additional action with curHadr change - { + { G4LorentzVector newLV=n4M/2.; curHadr->Set4Momentum(newLV); curHadr->SetQPDG(G4QPDGCode(90000001)); @@ -7320,7 +7328,7 @@ G4QHadronVector* G4QEnvironment::FSInteraction() //theFragments->push_back(secHadr); // (del.eq.- user is responsible for del) } else if(rnPDG==90002000) // Additional action with curHadr change - { + { G4LorentzVector newLV=n4M/2.; curHadr->Set4Momentum(newLV); curHadr->SetQPDG(G4QPDGCode(90001000)); @@ -7331,8 +7339,10 @@ G4QHadronVector* G4QEnvironment::FSInteraction() // @@ Add multybaryon decays if necessary } else // If this Excepton shows up (lowProbable appearance) => include gamma decay - { - G4double d=rnM+mPi0-reM; + { + G4double d=rlM+MLa-reM; + G4cerr<<"G4QE::FSI:R="<GetNFragments())) { - cfContSum+=curHadr->GetCharge(); - bfContSum+=curHadr->GetBaryonNumber(); + G4int chg=curHadr->GetCharge(); + cfContSum+=chg; + G4int brn=curHadr->GetBaryonNumber(); + bfContSum+=brn; + G4int str=curHadr->GetStrangeness(); + if(brn>1&&(!str&&(chg==brn||!chg) || !chg&&str==brn)) // Check for multibaryon(split) + { + G4int bPDG=90000001; // Prototype: multineutron + if (chg==brn) bPDG=90001000; // Multyproton + else if(str==brn) bPDG=91000000; // Multilambda + G4LorentzVector sp4m=curHadr->Get4Momentum()/brn; // Split 4-mom of the Multibaryon + curHadr->Set4Momentum(sp4m); + curHadr->SetQPDG(G4QPDGCode(bPDG)); // Substitute Multibaryon by a baryon + for (G4int ib=1; ibpush_back(bH); //(del eq. - user is responsible for deleting) + } + } theFragments->push_back(curHadr); //(del eq. - user is responsible for deleting) } } @@ -7471,7 +7498,7 @@ void G4QEnvironment::DecayIsonucleus(G4QHadron* qH) if(-qC==qS && qS==1) // Only one Sigma- like (qBN=1) { if(fabs(qM-mSigM) TotM="< TotM="<=mDeut) // "exited deutron" case { if(abs(qM-mDeut)GetQC(),qH->Get4Momentum()); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { #ifdef pdebug G4cerr<<"***G4QE::DecDiB:GSCorFailed. FillAsItIs,n="<GetQC(); G4Quasmon* quasH = new G4Quasmon(qQC,q4M); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { G4cerr<<"---Warning---G4QE::DecDiBaryon: FillAsItIs diBaryon="<GetQC(); G4Quasmon* quasH = new G4Quasmon(qQC,qH->Get4Momentum()); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { G4cerr<<"---Warning---G4QE::DecDibar:FillAsItIs DelDel QC/4M="<GetQC(),qH->Get4Momentum()); - if(!CheckGroundState(quasH,true)) theQHadrons.push_back(qH); // Cor or fill asItIs + if(!CheckGroundState(quasH,true)) theQHadrons.push_back(qH); // Cor or fill asItIs else delete qH; delete quasH; return; @@ -8275,9 +8302,9 @@ void G4QEnvironment::DecayAntiStrange(G4QHadron* qH) if(!n1||!n2) // AntiKaons of only one sort are found { if(!n1) // No K0's only K+'s - { + { if(n2==1 && mK+nucM>qM+.0001) // Mass limit: switch to K0 - { + { k1M=mK0; n1=1; qPDG=90000000+qP*1000+qN-1; // PDG of the Residual Nucleus @@ -8288,12 +8315,12 @@ void G4QEnvironment::DecayAntiStrange(G4QHadron* qH) k1M=mK; k1PDG=321; // Only K+'s (default K0's) n1=n2; // only n1 is used - } - } + } + } else // No K+'s only K0's { if(n1==1 && mK0+nucM>qM+.0001) // Mass limit: switch to K+ - { + { k1M=mK; k1PDG=321; // K+ instead of K0 qPDG=90000000+(qP-1)*1000+qN; // PDG of the Residual Nucleus @@ -8344,29 +8371,31 @@ void G4QEnvironment::DecayAntiStrange(G4QHadron* qH) } } if(fabs(qM-sum) TotM="<tM="< End of DecayAntiStrangness"< End of DecayAntiStrangness"<GetQC(); G4Quasmon* quasH = new G4Quasmon(qQC,q4M); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { G4cerr<<"---Warning---G4QE::DecMultyBar:FillAsItIsDiBar(I=1)="<GetQC(); G4Quasmon* quasH = new G4Quasmon(qQC,q4M); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { G4cerr<<"---Warning---G4QEnv::DecMultyBar:FillAsItIs 3Baryon="<GetQC(); G4Quasmon* quasH = new G4Quasmon(qQC,q4M); - if(!CheckGroundState(quasH,true)) + if(!CheckGroundState(quasH,true)) { G4cerr<<"---Warning---G4QEnv::DecayAlphaDiN:FillAsItIs AlphaNN="<1) // => "Can split baryon" case - { + { if(valQ.GetN()) // ===> "Can split neutron" case - { + { G4QContent resQC=valQ-neutQC; // QC of Residual for the Neutron G4int resPDG=resQC.GetSPDGCode(); // PDG of Residual for the Neutron if(resPDG==10&&resQC.GetBaryonNumber()>0) resPDG=resQC.GetZNSPDGCode(); G4double resMas=G4QPDGCode(resPDG).GetMass(); // GS Mass of the Residual if(resMas+mNeut "Can split proton" case - { + { G4QContent resQC=valQ-protQC; // QC of Residual for the Proton G4int resPDG=resQC.GetSPDGCode(); // PDG of Residual for the Proton if(resPDG==10&&resQC.GetBaryonNumber()>0) resPDG=resQC.GetZNSPDGCode(); G4double resMas=G4QPDGCode(resPDG).GetMass(); // GS Mass of the Residual if(resMas+mProt "Can split lambda" case - { + { G4QContent resQC=valQ-lambQC; // QC of Residual for the Lambda G4int resPDG=resQC.GetSPDGCode(); // PDG of Residual for the Lambda if(resPDG==10&&resQC.GetBaryonNumber()>0) resPDG=resQC.GetZNSPDGCode(); G4double resMas=G4QPDGCode(resPDG).GetMass(); // GS Mass of the Residual if(resMas+mLambresSMa && (resEMa || bsCond)) return true;// Why not ?? @@ (See G4Q the same) @@ -9198,14 +9256,14 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) G4int crPDG=theLast->GetPDGCode(); #ifdef cdebug //if(resQPDG==89998004) - G4cout<<"G4QE::CGS:***Correction***, lastNF="<rSM+hM="<rSM+hM="<resSMa+hadrMa &&!cNf && crPDG!=22) // Q(E)L contain QM(+EM)+lM ***Last CORR*** @@ -9234,7 +9292,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) else if(envPDG==90004002) DecayAlphaDiN(envaH);//Decay alph+2p(alph+2n IsStable) else if(envPDG==90004004) DecayAlphaAlpha(envaH); //DelEqu else theQHadrons.push_back(envaH); // Fill 2nd Hadron (delete equivalent) - } + } else { #ifdef cdebug @@ -9243,7 +9301,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) #endif return false; } - } + } else // => "Environ is vacuum" case (DecayIn2) { G4LorentzVector quas4M = G4LorentzVector(0.,0.,0.,resQMa); // GS Mass of Quasmon @@ -9260,7 +9318,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) else if(resQPDG==90004002) DecayAlphaDiN(quasH);//Decay alph+2p(alph+2n IsStable) else if(resQPDG==90004004) DecayAlphaAlpha(quasH); // DelEqu else theQHadrons.push_back(quasH); // Fill ResidQuasmHadron (del. equiv.) - } + } else { delete quasH; // Delete "Quasmon Hadron" @@ -9270,7 +9328,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) #endif return false; } - } + } } else // *** Try Last+Previous CORRECTION *** { @@ -9279,7 +9337,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) G4cout<<"G4QEnv::CheckGS: the Last did not help, nH="<1) // Cor with Last&Previous can be tryed - { + { G4QHadron* thePrev = theQHadrons[nOfOUT-2]; // Get pointer to Prev before Last if(thePrev->GetNFragments()||thePrev->GetNFragments()) return false;// Dec H/g G4LorentzVector prev4M = thePrev->Get4Momentum(); @@ -9290,7 +9348,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) G4double tQMa=G4QPDGCode(totPDG).GetMass(); // GS Mass of the Residual Nucleus #ifdef cdebug //if(resQPDG==89998004) - G4cout<<"G4QE::CGS: "<t+h+p="<t+h+p="<tQMa+hadrMa+prevMa) { @@ -9318,35 +9376,50 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) else if(totPDG==90002003||totPDG==90003002) DecayAlphaBar(nucH); //DelEqu else if(totPDG==90004004) DecayAlphaAlpha(nucH); //DelEqu else theQHadrons.push_back(nucH); // Fill ResidNuclHadron (del.eq.) - } - } + } + } else // --> Try to use photons or any hadron { #ifdef cdebug //if(resQPDG==89998004) - G4cout<<"G4QE::CGS: P&L didn't help,nH="<2"<<",MQ="<2, MQ="<=0; id--) // Search for photons and pi+, and pi- - { - G4QHadron* curHadr = theQHadrons[id]; - G4int hPDG=curHadr->GetPDGCode(); - if(hPDG== 22) nphot=id; - if(hPDG== 211) npip=id; - if(hPDG==-211) npim=id; + { + G4QHadron* curHadr = theQHadrons[id]; + G4int hPDG=curHadr->GetPDGCode(); + if(hPDG== 22) nphot=id; + else if(hPDG==211) npip=id; + else if(hPDG==111) + { + G4double piE=curHadr->Get4Momentum().e(); +#ifdef chdebug + if(resQPDG==89998004) + G4cout<<"G4QE::CheckGroundState:"<"<emaz) + { + npiz=id; + emaz=piE; + } + } + else if(hPDG==-211) npim=id; } if(nphot>=0) // Photon is found, try to use it to resolve PANIC - { + { G4QHadron* curHadr = theQHadrons[nphot]; // Pointer to the photon G4LorentzVector ch4M=curHadr->Get4Momentum(); // 4-Mom of the Photon G4LorentzVector tt4M=ch4M+reTLV;// (resQMa=GSMass of the ResidQuasmon(+Env.)) G4double ttM=tt4M.m(); // Mass of the Phot+ResidQm compaund system if(resQMaSet4Momentum(pi4M);// Change 4M of the Pion (reduced by decay) curHadr->SetQPDG(piQPDG); // Change Charge of thePion #ifdef cdebug - //if(resQPDG==89998004) - G4cout<<"G4QE::CGS:1="<1) pi4M/=npi; + curHadr->Set4Momentum(pi4M);// Change 4M of the Pion (reduced by decay) + curHadr->SetQPDG(piQPDG); // Change Charge of thePion + if(npi>1) for(G4int ip=1; ip1) fn4M/=resB; + for(G4int ib=0; ib Photons did not help, try to find an appropriate partner to join and decay G4int reTBN=reTQC.GetBaryonNumber(); // Baryon number of theHadronicState @@ -9453,24 +9602,24 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) if((!nnPDG||nnPDG==10)&&nnQC.GetBaryonNumber()>0) nnPDG=nnQC.GetZNSPDGCode(); #ifdef cdebug //if(resQPDG==89998004) - G4cout<<"G4QE::CGS: nnPDR="<0) nnPDG=nnQC.GetZNSPDGCode(); - } + } G4QPDGCode nnQPDG(nnPDG); // Now can even have Q-code ! if(nnPDG<80000000) nnM=nnQPDG.GetMass(); // Mass for the Fundamental Hadron else nnM=nnQPDG.GetNuclMass(nnPDG); // Mass for the Nucleus } for(G4int hd=nOfOUT-1; hd>=0; hd--)// Try to use any hadron to resolve PANIC - { + { G4QHadron* curHadr = theQHadrons[hd]; G4int chNF=curHadr->GetNFragments(); G4int chCH=curHadr->GetCharge(); @@ -9478,7 +9627,7 @@ G4bool G4QEnvironment::CheckGroundState(G4Quasmon* quasm, G4bool corFlag) G4LorentzVector ch4M=curHadr->Get4Momentum(); // 4Mom of the Current Hadron #ifdef cdebug //if(resQPDG==89998004) - G4cout<<"G4QE::CGS:#"<1.||r2<.000001) + { + x = G4UniformRand(); y = G4UniformRand(); z = G4UniformRand(); + r2=x*x+y*y+z*z; + } + G4double r=sqrt(r2), quad=G4UniformRand(); + if(quad>0.5) + { + if(quad>0.75) + { + if(quad>0.875) return G4ThreeVector(-x/r,-y/r,-z/r); + else return G4ThreeVector(-x/r,-y/r, z/r); + } + else + { + if(quad>0.625) return G4ThreeVector(-x/r, y/r,-z/r); + else return G4ThreeVector(-x/r, y/r, z/r); + } + } + else + { + if(quad>0.25) + { + if(quad>0.375) return G4ThreeVector( x/r,-y/r,-z/r); + else return G4ThreeVector( x/r,-y/r, z/r); + } + else if(quad>0.125) return G4ThreeVector( x/r, y/r,-z/r); + } + return G4ThreeVector( x/r, y/r, z/r); +} // End of RndmDir diff --git a/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QIsotope.cc b/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QIsotope.cc new file mode 100644 index 0000000000..8cca7b2bbf --- /dev/null +++ b/source/processes/hadronic/models/chiral_inv_phase_space/body/src/G4QIsotope.cc @@ -0,0 +1,1932 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4QIsotope.cc,v 1.3 2004/06/18 09:19:28 gunter Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// ---------------- G4QIsotope class ---------------- +// by Mikhail Kossov, December 2003. +// class G4QIsotope gives Isotopes for Elements (CHIPS branch of G4) +// ------------------------------------------------------------------ +// **************************************************************************************** +// ********** This CLASS is temporary moved from the photolepton_hadron directory ********* +// ******* DO NOT MAKE ANY CHANGE! With time it'll move back to photolepton...(M.K.) ****** +// **************************************************************************************** +// +// 1 2 3 4 5 6 7 8 9 +//34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 + +//#define debug +//#define pdebug +//#define sdebug + +#include "G4QIsotope.hh" +std::vector*>*>G4QIsotope::natElements;//NaturalElems +std::vector*>*>G4QIsotope::natSumAbund;//NaturalSumAb +std::vector*>*>G4QIsotope::natIsoCrosS;//CSOfNatElems +std::vector*>*>*>G4QIsotope::newElems; +std::vector*>*>*>G4QIsotope::newSumAb; +std::vector*>*>*>G4QIsotope::newIsoCS; + +G4QIsotope::G4QIsotope() +{ +#ifdef debug + G4cout<<"G4QIsotope::Constructor is called"< >*> natEl; +#ifdef pdebug + G4cout<<"G4QIsotope::Constructor natEl is booked"< >*a0=new std::vector >(1); +#ifdef pdebug + G4cout<<"G4QIsotope::Constructor a0 is booked"<push_back(std::make_pair(1,1.)); +#ifdef pdebug + G4cout<<"G4QIsotope::Constructor a0 is filled by a pair"< >*a1=new std::vector >(2); + a1->push_back(std::make_pair(0,.99985)); + a1->push_back(std::make_pair(1,1.)); + natEl.push_back(a1); + std::vector >*a2=new std::vector >(2); + a2->push_back(std::make_pair(2,.999999863)); + a2->push_back(std::make_pair(1,1.)); + natEl.push_back(a2); + std::vector >*a3=new std::vector >(2); + a3->push_back(std::make_pair(4,.925)); + a3->push_back(std::make_pair(3,1.)); + natEl.push_back(a3); + std::vector >*a4=new std::vector >(1); + a4->push_back(std::make_pair(5,1.)); + natEl.push_back(a4); + std::vector >*a5=new std::vector >(2); + a5->push_back(std::make_pair(6,.801)); + a5->push_back(std::make_pair(5,1.)); + natEl.push_back(a5); + std::vector >*a6=new std::vector >(2); + a6->push_back(std::make_pair(6,.989)); + a6->push_back(std::make_pair(7,1.)); + natEl.push_back(a6); + std::vector >*a7=new std::vector >(2); + a7->push_back(std::make_pair(7,.9963)); + a7->push_back(std::make_pair(8,1.)); + natEl.push_back(a7); + std::vector >*a8=new std::vector >(3); + a8->push_back(std::make_pair(6,.9976)); + a8->push_back(std::make_pair(8,.9996)); + a8->push_back(std::make_pair(7,1.)); + natEl.push_back(a8); + std::vector >*a9=new std::vector >(1); + a9->push_back(std::make_pair(10,1.)); + natEl.push_back(a9); + std::vector >*b0=new std::vector >(3); + b0->push_back(std::make_pair(10,.9948)); + b0->push_back(std::make_pair(11,.9975)); + b0->push_back(std::make_pair(12,1.)); + natEl.push_back(b0); + std::vector >*b1=new std::vector >(1); + b1->push_back(std::make_pair(12,1.)); + natEl.push_back(b1); + std::vector >*b2=new std::vector >(3); + b2->push_back(std::make_pair(12,.7899)); + b2->push_back(std::make_pair(13,.8899)); + b2->push_back(std::make_pair(14,1.)); + natEl.push_back(b2); + std::vector >*b3=new std::vector >(1); + b3->push_back(std::make_pair(14,1.)); + natEl.push_back(b3); + std::vector >*b4=new std::vector >(3); + b4->push_back(std::make_pair(14,.9223)); + b4->push_back(std::make_pair(15,.969)); + b4->push_back(std::make_pair(16,1.)); + natEl.push_back(b4); + std::vector >*b5=new std::vector >(1); + b5->push_back(std::make_pair(16,1.)); + natEl.push_back(b5); + std::vector >*b6=new std::vector >(4); + b6->push_back(std::make_pair(16,.9502)); + b6->push_back(std::make_pair(18,.9923)); + b6->push_back(std::make_pair(17,.9998)); + b6->push_back(std::make_pair(20,1.)); + natEl.push_back(b6); + std::vector >*b7=new std::vector >(2); + b7->push_back(std::make_pair(18,.7577)); + b7->push_back(std::make_pair(20,1.)); + natEl.push_back(b7); + std::vector >*b8=new std::vector >(3); + b8->push_back(std::make_pair(22,.996)); + b8->push_back(std::make_pair(18,.99937)); + b8->push_back(std::make_pair(20,1.)); + natEl.push_back(b8); + std::vector >*b9=new std::vector >(3); + b9->push_back(std::make_pair(20,.932581)); + b9->push_back(std::make_pair(22,.999883)); + b9->push_back(std::make_pair(21,1.)); + natEl.push_back(b9); + std::vector >*c0=new std::vector >(6); + c0->push_back(std::make_pair(20,.96941)); + c0->push_back(std::make_pair(24,.99027)); + c0->push_back(std::make_pair(22,.99674)); + c0->push_back(std::make_pair(28,.99861)); + c0->push_back(std::make_pair(23,.99996)); + c0->push_back(std::make_pair(26,1.)); + natEl.push_back(c0); + std::vector >*c1=new std::vector >(1); + c1->push_back(std::make_pair(24,1.)); + natEl.push_back(c1); + std::vector >*c2=new std::vector >(5); + c2->push_back(std::make_pair(1,.738)); + c2->push_back(std::make_pair(1,.818)); + c2->push_back(std::make_pair(1,.891)); + c2->push_back(std::make_pair(1,.946)); + c2->push_back(std::make_pair(1,1.)); + natEl.push_back(c2); + std::vector >*c3=new std::vector >(2); + c3->push_back(std::make_pair(28,.9975)); + c3->push_back(std::make_pair(27,1.)); + natEl.push_back(c3); + std::vector >*c4=new std::vector >(4); + c4->push_back(std::make_pair(28,.8379)); + c4->push_back(std::make_pair(29,.9329)); + c4->push_back(std::make_pair(26,.97635)); + c4->push_back(std::make_pair(30,1.)); + natEl.push_back(c4); + std::vector >*c5=new std::vector >(1); + c5->push_back(std::make_pair(30,1.)); + natEl.push_back(c5); + std::vector >*c6=new std::vector >(4); + c6->push_back(std::make_pair(30,.9172)); + c6->push_back(std::make_pair(28,.9762)); + c6->push_back(std::make_pair(31,.9972)); + c6->push_back(std::make_pair(32,1.)); + natEl.push_back(c6); + std::vector >*c7=new std::vector >(1); + c7->push_back(std::make_pair(32,1.)); + natEl.push_back(c7); + std::vector >*c8=new std::vector >(5); + c8->push_back(std::make_pair(30,.68077)); + c8->push_back(std::make_pair(32,.943)); + c8->push_back(std::make_pair(34,.97934)); + c8->push_back(std::make_pair(33,.99074)); + c8->push_back(std::make_pair(36,1.)); + natEl.push_back(c8); + std::vector >*c9=new std::vector >(2); + c9->push_back(std::make_pair(34,.6917)); + c9->push_back(std::make_pair(36,1.)); + natEl.push_back(c9); + std::vector >*d0=new std::vector >(5); + d0->push_back(std::make_pair(34,.486)); + d0->push_back(std::make_pair(36,.765)); + d0->push_back(std::make_pair(38,.953)); + d0->push_back(std::make_pair(37,.994)); + d0->push_back(std::make_pair(40,1.)); + natEl.push_back(d0); + std::vector >*d1=new std::vector >(2); + d1->push_back(std::make_pair(38,.60108)); + d1->push_back(std::make_pair(40,1.)); + natEl.push_back(d1); + std::vector >*d2=new std::vector >(5); + d2->push_back(std::make_pair(42,.3594)); + d2->push_back(std::make_pair(40,.6360)); + d2->push_back(std::make_pair(38,.8484)); + d2->push_back(std::make_pair(41,.9256)); + d2->push_back(std::make_pair(44,1.)); + natEl.push_back(d2); + std::vector >*d3=new std::vector >(1); + d3->push_back(std::make_pair(42,1.)); + natEl.push_back(d3); + std::vector >*d4=new std::vector >(6); + d4->push_back(std::make_pair(46,.4961)); + d4->push_back(std::make_pair(44,.7378)); + d4->push_back(std::make_pair(42,.8274)); + d4->push_back(std::make_pair(48,.9148)); + d4->push_back(std::make_pair(43,.9911)); + d4->push_back(std::make_pair(40,1.)); + natEl.push_back(d4); + std::vector >*d5=new std::vector >(2); + d5->push_back(std::make_pair(44,.5069)); + d5->push_back(std::make_pair(46,1.)); + natEl.push_back(d5); + std::vector >*d6=new std::vector >(6); + d6->push_back(std::make_pair(48,.57)); + d6->push_back(std::make_pair(50,.743)); + d6->push_back(std::make_pair(46,.859)); + d6->push_back(std::make_pair(47,.974)); + d6->push_back(std::make_pair(44,.9965)); + d6->push_back(std::make_pair(42,1.)); + natEl.push_back(d6); + std::vector >*d7=new std::vector >(2); + d7->push_back(std::make_pair(48,.7217)); + d7->push_back(std::make_pair(50,1.)); + natEl.push_back(d7); + std::vector >*d8=new std::vector >(4); + d8->push_back(std::make_pair(50,.8258)); + d8->push_back(std::make_pair(48,.9244)); + d8->push_back(std::make_pair(49,.9944)); + d8->push_back(std::make_pair(46,1.)); + natEl.push_back(d8); + std::vector >*d9=new std::vector >(1); + d9->push_back(std::make_pair(50,1.)); + natEl.push_back(d9); + std::vector >*e0=new std::vector >(5); + e0->push_back(std::make_pair(50,.5145)); + e0->push_back(std::make_pair(54,.6883)); + e0->push_back(std::make_pair(53,.8598)); + e0->push_back(std::make_pair(51,.972)); + e0->push_back(std::make_pair(56,1.)); + natEl.push_back(e0); + std::vector >*e1=new std::vector >(1); + e1->push_back(std::make_pair(52,1.)); + natEl.push_back(e1); + std::vector >*e2=new std::vector >(7); + e2->push_back(std::make_pair(56,.2413)); + e2->push_back(std::make_pair(54,.4081)); + e2->push_back(std::make_pair(53,.5673)); + e2->push_back(std::make_pair(50,.7157)); + e2->push_back(std::make_pair(58,.8120)); + e2->push_back(std::make_pair(55,.9075)); + e2->push_back(std::make_pair(52,1.)); + natEl.push_back(e2); + std::vector >*e3=new std::vector >(1); + e3->push_back(std::make_pair(55,1.)); + natEl.push_back(e3); + std::vector >*e4=new std::vector >(7); + e4->push_back(std::make_pair(58,.316)); + e4->push_back(std::make_pair(60,.502)); + e4->push_back(std::make_pair(57,.673)); + e4->push_back(std::make_pair(55,.8)); + e4->push_back(std::make_pair(56,.926)); + e4->push_back(std::make_pair(52,.9814)); + e4->push_back(std::make_pair(54,1.)); + natEl.push_back(e4); + std::vector >*e5=new std::vector >(1); + e5->push_back(std::make_pair(58,1.)); + natEl.push_back(e5); + std::vector >*e6=new std::vector >(6); + e6->push_back(std::make_pair(60,.2733)); + e6->push_back(std::make_pair(62,.5379)); + e6->push_back(std::make_pair(59,.7612)); + e6->push_back(std::make_pair(55,.8784)); + e6->push_back(std::make_pair(58,.9898)); + e6->push_back(std::make_pair(56,1.)); + natEl.push_back(e6); + std::vector >*e7=new std::vector >(2); + e7->push_back(std::make_pair(60,.51839)); + e7->push_back(std::make_pair(62,1.)); + natEl.push_back(e7); + std::vector >*e8=new std::vector >(8); + e8->push_back(std::make_pair(66,.2873)); + e8->push_back(std::make_pair(64,.5286)); + e8->push_back(std::make_pair(59,.6566)); + e8->push_back(std::make_pair(62,.7815)); + e8->push_back(std::make_pair(65,.9037)); + e8->push_back(std::make_pair(68,.9786)); + e8->push_back(std::make_pair(58,.9911)); + e8->push_back(std::make_pair(60,1.)); + natEl.push_back(e8); + std::vector >*e9=new std::vector >(2); + e9->push_back(std::make_pair(66,.9577)); + e9->push_back(std::make_pair(64,1.)); + natEl.push_back(e9); + std::vector >*f0=new std::vector >(9); + f0->push_back(std::make_pair(70,.3259)); + f0->push_back(std::make_pair(68,.5681)); + f0->push_back(std::make_pair(66,.7134)); + f0->push_back(std::make_pair(69,.7992)); + f0->push_back(std::make_pair(67,.8760)); + f0->push_back(std::make_pair(74,.9339)); + f0->push_back(std::make_pair(72,.9802)); + f0->push_back(std::make_pair(62,.9899)); + f0->push_back(std::make_pair(64,1.)); + //f0->push_back(std::make_pair(64,.9964)); + //f0->push_back(std::make_pair(65,1.)); // Nine isotopes is the maximum, so Sn155 is out + natEl.push_back(f0); + std::vector >*f1=new std::vector >(2); + f1->push_back(std::make_pair(70,.5736)); + f1->push_back(std::make_pair(72,1.)); + natEl.push_back(f1); + std::vector >*f2=new std::vector >(8); + f2->push_back(std::make_pair(78,.3387)); + f2->push_back(std::make_pair(76,.6557)); + f2->push_back(std::make_pair(74,.8450)); + f2->push_back(std::make_pair(73,.9162)); + f2->push_back(std::make_pair(72,.9641)); + f2->push_back(std::make_pair(70,.9900)); + f2->push_back(std::make_pair(71,.99905)); + f2->push_back(std::make_pair(68,1.)); + natEl.push_back(f2); + std::vector >*f3=new std::vector >(1); + f3->push_back(std::make_pair(74,1.)); + natEl.push_back(f3); + std::vector >*f4=new std::vector >(9); + f4->push_back(std::make_pair(78,.269)); + f4->push_back(std::make_pair(75,.533)); + f4->push_back(std::make_pair(77,.745)); + f4->push_back(std::make_pair(80,.849)); + f4->push_back(std::make_pair(82,.938)); + f4->push_back(std::make_pair(76,.979)); + f4->push_back(std::make_pair(74,.9981)); + f4->push_back(std::make_pair(70,.9991)); + f4->push_back(std::make_pair(72,1.)); + natEl.push_back(f4); + std::vector >*f5=new std::vector >(1); + f5->push_back(std::make_pair(78,1.)); + natEl.push_back(f5); + std::vector >*f6=new std::vector >(7); + f6->push_back(std::make_pair(82,.717)); + f6->push_back(std::make_pair(81,.8293)); + f6->push_back(std::make_pair(80,.9078)); + f6->push_back(std::make_pair(79,.97373)); + f6->push_back(std::make_pair(78,.99793)); + f6->push_back(std::make_pair(74,.99899)); + f6->push_back(std::make_pair(76,1.)); + natEl.push_back(f6); + std::vector >*f7=new std::vector >(2); + f7->push_back(std::make_pair(82,.999098)); + f7->push_back(std::make_pair(81,1.)); + natEl.push_back(f7); + std::vector >*f8=new std::vector >(4); + f8->push_back(std::make_pair(82,.8843)); + f8->push_back(std::make_pair(84,.9956)); + f8->push_back(std::make_pair(80,.9981)); + f8->push_back(std::make_pair(78,1.)); + natEl.push_back(f8); + std::vector >*f9=new std::vector >(1); + f9->push_back(std::make_pair(82,1.)); + natEl.push_back(f9); + std::vector >*g0=new std::vector >(7); + g0->push_back(std::make_pair(82,.2713)); + g0->push_back(std::make_pair(84,.5093)); + g0->push_back(std::make_pair(86,.6812)); + g0->push_back(std::make_pair(83,.8030)); + g0->push_back(std::make_pair(85,.8860)); + g0->push_back(std::make_pair(88,.9436)); + g0->push_back(std::make_pair(90,1.)); + natEl.push_back(g0); + std::vector >*g1=new std::vector >(1); + g1->push_back(std::make_pair(85,1.)); + natEl.push_back(g1); + std::vector >*g2=new std::vector >(7); + g2->push_back(std::make_pair(90,.267)); + g2->push_back(std::make_pair(92,.494)); + g2->push_back(std::make_pair(85,.644)); + g2->push_back(std::make_pair(87,.782)); + g2->push_back(std::make_pair(86,.895)); + g2->push_back(std::make_pair(88,.969)); + g2->push_back(std::make_pair(82,1.)); + natEl.push_back(g2); + std::vector >*g3=new std::vector >(2); + g3->push_back(std::make_pair(90,.522)); + g3->push_back(std::make_pair(89,1.)); + natEl.push_back(g3); + std::vector >*g4=new std::vector >(7); + g4->push_back(std::make_pair(94,.2484)); + g4->push_back(std::make_pair(96,.4670)); + g4->push_back(std::make_pair(92,.6717)); + g4->push_back(std::make_pair(93,.8282)); + g4->push_back(std::make_pair(91,.9762)); + g4->push_back(std::make_pair(90,.9980)); + g4->push_back(std::make_pair(88,1.)); + natEl.push_back(g4); + std::vector >*g5=new std::vector >(1); + g5->push_back(std::make_pair(94,1.)); + natEl.push_back(g5); + std::vector >*g6=new std::vector >(7); + g6->push_back(std::make_pair(98,.282)); + g6->push_back(std::make_pair(96,.537)); + g6->push_back(std::make_pair(97,.786)); + g6->push_back(std::make_pair(95,.975)); + g6->push_back(std::make_pair(94,.9984)); + g6->push_back(std::make_pair(92,.9994)); + g6->push_back(std::make_pair(90,1.)); + natEl.push_back(g6); + std::vector >*g7=new std::vector >(1); + g7->push_back(std::make_pair(98,1.)); + natEl.push_back(g7); + std::vector >*g8=new std::vector >(6); + g8->push_back(std::make_pair( 98,.3360)); + g8->push_back(std::make_pair(100,.6040)); + g8->push_back(std::make_pair( 99,.8335)); + g8->push_back(std::make_pair(102,.9825)); + g8->push_back(std::make_pair( 96,.9986)); + g8->push_back(std::make_pair( 94,1.)); + natEl.push_back(g8); + std::vector >*g9=new std::vector >(1); + g9->push_back(std::make_pair(100,1.)); + natEl.push_back(g9); + std::vector >*h0=new std::vector >(7); + h0->push_back(std::make_pair(104,.3180)); + h0->push_back(std::make_pair(102,.5370)); + h0->push_back(std::make_pair(103,.6982)); + h0->push_back(std::make_pair(101,.8412)); + h0->push_back(std::make_pair(106,.9682)); + h0->push_back(std::make_pair(100,.9987)); + h0->push_back(std::make_pair( 98,1.)); + natEl.push_back(h0); + std::vector >*h1=new std::vector >(2); + h1->push_back(std::make_pair(104,.9741)); + h1->push_back(std::make_pair(105,1.)); + natEl.push_back(h1); + std::vector >*h2=new std::vector >(6); + h2->push_back(std::make_pair(108,.35100)); + h2->push_back(std::make_pair(106,.62397)); + h2->push_back(std::make_pair(105,.81003)); + h2->push_back(std::make_pair(107,.94632)); + h2->push_back(std::make_pair(104,.99838)); + h2->push_back(std::make_pair(102,1.)); + natEl.push_back(h2); + std::vector >*h3=new std::vector >(2); + h3->push_back(std::make_pair(108,.99988)); + h3->push_back(std::make_pair(107,1.)); + natEl.push_back(h3); + std::vector >*h4=new std::vector >(5); + h4->push_back(std::make_pair(110,.307)); + h4->push_back(std::make_pair(112,.593)); + h4->push_back(std::make_pair(108,.856)); + h4->push_back(std::make_pair(109,.9988)); + h4->push_back(std::make_pair(106,1.)); + natEl.push_back(h4); + std::vector >*h5=new std::vector >(2); + h5->push_back(std::make_pair(112,.626)); + h5->push_back(std::make_pair(110,1.)); + natEl.push_back(h5); + std::vector >*h6=new std::vector >(7); + h6->push_back(std::make_pair(116,.410)); + h6->push_back(std::make_pair(114,.674)); + h6->push_back(std::make_pair(113,.835)); + h6->push_back(std::make_pair(112,.968)); + h6->push_back(std::make_pair(111,.984)); + h6->push_back(std::make_pair(110,.9998)); + h6->push_back(std::make_pair(108,1.)); + natEl.push_back(h6); + std::vector >*h7=new std::vector >(2); + h7->push_back(std::make_pair(116,.627)); + h7->push_back(std::make_pair(114,1.)); + natEl.push_back(h7); + std::vector >*h8=new std::vector >(6); + h8->push_back(std::make_pair(117,.338)); + h8->push_back(std::make_pair(116,.667)); + h8->push_back(std::make_pair(118,.920)); + h8->push_back(std::make_pair(120,.992)); + h8->push_back(std::make_pair(114,.9999)); + h8->push_back(std::make_pair(112,1.)); + natEl.push_back(h8); + std::vector >*h9=new std::vector >(1); + h9->push_back(std::make_pair(118,1.)); + natEl.push_back(h9); + std::vector >*i0=new std::vector >(7); + i0->push_back(std::make_pair(122,.2986)); + i0->push_back(std::make_pair(120,.5296)); + i0->push_back(std::make_pair(119,.6983)); + i0->push_back(std::make_pair(121,.8301)); + i0->push_back(std::make_pair(118,.9298)); + i0->push_back(std::make_pair(124,.9985)); + i0->push_back(std::make_pair(116,1.)); + natEl.push_back(i0); + std::vector >*i1=new std::vector >(2); + i1->push_back(std::make_pair(124,.70476)); + i1->push_back(std::make_pair(122,1.)); + natEl.push_back(i1); + std::vector >*i2=new std::vector >(4); + i2->push_back(std::make_pair(126,.524)); + i2->push_back(std::make_pair(124,.765)); + i2->push_back(std::make_pair(125,.986)); + i2->push_back(std::make_pair(122,1.)); + natEl.push_back(i2); + std::vector >*i3=new std::vector >(1); + i3->push_back(std::make_pair(126,1.)); + natEl.push_back(i3); + std::vector >*i4=new std::vector >(1); + i4->push_back(std::make_pair(125,1.)); + natEl.push_back(i4); + std::vector >*i5=new std::vector >(1); + i5->push_back(std::make_pair(136,1.)); + natEl.push_back(i5); + std::vector >*i6=new std::vector >(1); + i6->push_back(std::make_pair(136,1.)); + natEl.push_back(i6); + std::vector >*i7=new std::vector >(1); + i7->push_back(std::make_pair(138,1.)); + natEl.push_back(i7); + std::vector >*i8=new std::vector >(1); + i8->push_back(std::make_pair(138,1.)); + natEl.push_back(i8); + std::vector >*i9=new std::vector >(1); + i9->push_back(std::make_pair(142,1.)); + natEl.push_back(i9); + std::vector >*j0=new std::vector >(1); + j0->push_back(std::make_pair(142,1.)); + natEl.push_back(j0); + std::vector >*j1=new std::vector >(1); + j1->push_back(std::make_pair(140,1.)); + natEl.push_back(j1); + std::vector >*j2=new std::vector >(3); + j2->push_back(std::make_pair(146,.992745)); + j2->push_back(std::make_pair(143,.999945)); + j2->push_back(std::make_pair(142,1.)); + natEl.push_back(j2); + std::vector >*j3=new std::vector >(1); + j3->push_back(std::make_pair(144,1.)); + natEl.push_back(j3); + std::vector >*j4=new std::vector >(1); + j4->push_back(std::make_pair(150,1.)); + natEl.push_back(j4); + std::vector >*j5=new std::vector >(1); + j5->push_back(std::make_pair(148,1.)); + natEl.push_back(j5); + std::vector >*j6=new std::vector >(1); + j6->push_back(std::make_pair(151,1.)); + natEl.push_back(j6); + std::vector >*j7=new std::vector >(1); + j7->push_back(std::make_pair(150,1.)); + natEl.push_back(j7); + std::vector >*j8=new std::vector >(1); + j8->push_back(std::make_pair(153,1.)); + natEl.push_back(j8); + std::vector >*j9=new std::vector >(1); + j9->push_back(std::make_pair(157,1.)); + natEl.push_back(j9); + std::vector >*k0=new std::vector >(1); + k0->push_back(std::make_pair(157,1.)); + natEl.push_back(k0); + std::vector >*k1=new std::vector >(1); + k1->push_back(std::make_pair(157,1.)); + natEl.push_back(k1); + std::vector >*k2=new std::vector >(1); + k2->push_back(std::make_pair(157,1.)); + natEl.push_back(k2); + std::vector >*k3=new std::vector >(1); + k3->push_back(std::make_pair(157,1.)); + natEl.push_back(k3); + std::vector >*k4=new std::vector >(1); + k4->push_back(std::make_pair(157,1.)); + natEl.push_back(k4); + std::vector >*k5=new std::vector >(1); + k5->push_back(std::make_pair(157,1.)); + natEl.push_back(k5); + std::vector >*k6=new std::vector >(1); + k6->push_back(std::make_pair(157,1.)); + natEl.push_back(k6); + std::vector >*k7=new std::vector >(1); + k7->push_back(std::make_pair(155,1.)); + natEl.push_back(k7); + std::vector >*k8=new std::vector >(1); + k8->push_back(std::make_pair(157,1.)); + natEl.push_back(k8); + std::vector >*k9=new std::vector >(1); + k9->push_back(std::make_pair(157,1.)); + natEl.push_back(k9); + // Now fill natElements and natIsoCrossS + G4int nona=natEl.size(); +#ifdef debug + G4cout<<"G4QIsotope::Constructor natEl filling is finished nE="< >* is=natEl[i]; // Pointer to theElement + G4int n=is->size(); +#ifdef pdebug + G4cout<<"G4QIsotope::Constructor: Element # "<*>*c=new std::vector*>(n); + if(n) for(G4int j=0; j* cP = new std::pair(is->operator[](j).first,0.); + c->push_back(cP); +#ifdef pdebug + G4cout<<"G4QIsotope::Constructor: CrosSecPair i="<*>* curA=natElements[i]; + G4int nn=curA->size(); // Can not be 0 by definition + if(nn) for(G4int n=0; noperator[](n); // Delete pair(N,Ab) + delete curA; // Delet abundancy vector + std::vector*>* curS=natSumAbund[i]; + G4int ns=curS->size(); // Can not be 0 by definition + if(ns) for(G4int m=0; moperator[](m); // Delete pair(N,Ab) + delete curS; // Delet abundancy vector + std::vector*>* curC=natIsoCrosS[i]; + G4int nc=curC->size(); // Can not be 0 by definition + if(nc) for(G4int k=0; koperator[](k); // Delete pair(N,CS) + delete curC; // Delete cross section vector + } + G4int nP=newElems.size(); + if(nP) for(G4int j=0; j*>* >* nEl= newElems[j]; + G4int nEn=nEl->second->size(); + if(nEn) for(G4int k=0; k* curA=nEl->second->operator[](k); + delete curA; // Delete vect + } + delete nEl; // Delete vect*> newElementVector + // + std::pair*>* >* nSA= newSumAb[j]; + G4int nSn=nSA->second->size(); + if(nSn) for(G4int n=0; n* curS=nSA->second->operator[](n); + delete curS; // Delete vect + } + delete nSA; // Delete vect*> newSumAbunVector + // + std::pair*>* >* nCS= newIsoCS[j]; + G4int nCn=nCS->second->size(); + if(nCn) for(G4int m=0; m* curC = nCS->second->operator[](m); + delete curC; // Delete vect + } + delete nCS; // Delete vect*> newIsoCroSVector + // + if(nEn!=nCn) G4cerr<<"*G4QIsotope-WORNING-:#El="<& isoV) +// ========================================================= +{ + const G4int nAZ=270; // Dimension of the table + // Best Z for the given A + const G4int bestZ[nAZ] = { + 0, 1, 1, 2, 2, 0, 3, 3, 4, 4, //0 + 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, //10 + 10, 10, 10, 11, 12, 12, 12, 13, 14, 14, //20 + 14, 15, 16, 16, 16, 17, 18, 17, 18, 19, //30 + 18, 19, 20, 20, 20, 21, 22, 22, 23, 23, //40 + 22, 23, 24, 24, 26, 25, 26, 26, 28, 27, //50 + 28, 28, 28, 29, 30, 29, 30, 30, 30, 31, //60 + 32, 31, 32, 32, 32, 33, 34, 34, 34, 35, //70 + 34, 35, 36, 36, 36, 37, 39, 36, 38, 39, //80 + 40, 40, 41, 40, 40, 42, 42, 42, 42, 44, //90 + 44, 44, 44, 45, 44, 46, 46, 47, 46, 47, //100 + 48, 48, 48, 48, 48, 49, 50, 50, 50, 50, //110 + 50, 51, 50, 51, 50, 52, 52, 53, 52, 54, //120 + 52, 54, 54, 55, 54, 56, 54, 56, 56, 57, //130 + 58, 59, 60, 60, 60, 60, 60, 62, 62, 62, //140 + 62, 63, 62, 63, 62, 64, 64, 64, 64, 65, //150 + 64, 66, 66, 66, 66, 67, 68, 68, 68, 69, //160 + 68, 70, 70, 70, 70, 71, 70, 72, 72, 72, //170 + 72, 73, 74, 74, 74, 75, 74, 75, 76, 76, //180 + 76, 77, 76, 77, 78, 78, 78, 79, 80, 80, //190 + 80, 80, 80, 81, 80, 81, 82, 82, 82, 83, //200 + 82, 0, 82, 0, 82, 0, 84, 0, 0, 0, //210 + 86, 0, 86, 87, 88, 0, 88, 89, 88, 89, //220 + 89, 91, 90, 0, 92, 92, 0, 93, 92, 94, //230 + 0, 0, 0, 95, 94, 0, 0, 96, 0, 0, //240 + 0, 98, 99, 0, 0, 0, 0,100,101,102, //250 + 103,104,105,106, 0,108,109, 0, 0, 0}; //260 + // 0 1 2 3 4 5 6 7 8 9 + // Second candidate + const G4int secoZ[nAZ] = { + 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, //0 + 4, 6, 5, 7, 0, 8, 0, 0, 0, 8, //10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20 + 0, 0, 15, 0, 0, 16, 0, 0, 0, 0, //30 + 20, 20, 0, 0, 0, 0, 20, 0, 0, 0, //40 + 24, 0, 0, 0, 24, 0, 0, 0, 26, 0, //50 + 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, //60 + 30, 0, 0, 0, 34, 0, 32, 0, 0, 0, //70 + 36, 0, 34, 0, 38, 0, 38, 38, 0, 0, //80 + 0, 0, 42, 0, 42, 0, 44, 0, 44, 0, //90 + 42, 0, 46, 0, 46, 0, 48, 0, 48, 0, //100 + 46, 0, 50, 49, 50, 50, 48, 0, 0, 0, //110 + 52, 0, 52, 0, 52, 0, 54, 0, 54, 0, //120 + 54, 0, 56, 0, 56, 0, 56, 0, 58, 0, //130 + 54, 0, 58, 0, 62, 61, 0, 0, 60, 0, //140 + 60, 0, 64, 0, 64, 0, 66, 0, 66, 0, //150 + 66, 0, 68, 0, 68, 0, 0, 0, 70, 0, //160 + 70, 0, 0, 0, 72, 0, 72, 0, 0, 0, //170 + 74, 0, 0, 0, 76, 0, 76, 76, 0, 0, //180 + 78, 0, 78, 0, 0, 0, 80, 0, 78, 0, //190 + 0, 0, 0, 0, 82, 0, 0, 0, 0, 84, //200 + 84, 0, 83, 0, 83, 0, 0, 0, 0, 0, //210 + 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, //220 + 0, 0, 0, 0, 93, 0, 0, 0, 93, 0, //230 + 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, //240 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //250 + 0, 0,107, 0, 0, 0, 0, 0, 0, 0}; //260 + // 0 1 2 3 4 5 6 7 8 9 + // Third candidate + const G4int thrdZ[nAZ] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0 + 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, //10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20 + 0, 0, 0, 0, 0,20, 0, 0, 0, 0, //30 + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40 + 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80 + 0, 0,36, 0,38, 0,40, 0, 0, 0, //90 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120 + 56, 0,50, 0, 0, 0,58, 0,57, 0, //130 + 0, 0, 0, 0, 0, 0, 0, 0,65, 0, //140 + 0, 0,66, 0, 0, 0, 0, 0, 0, 0, //150 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160 + 0, 0, 0, 0, 0, 0,71, 0, 0, 0, //170 + 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200 + 83, 0,84, 0,84, 0, 0, 0, 0, 0, //210 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //250 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //260 + //0 1 2 3 4 5 6 7 8 9 + // Fourth candidate (only two isotopes) + const G4int quadZ[nAZ] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //20 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //30 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //40 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //50 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //60 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //70 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //80 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //90 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //100 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //110 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //120 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //130 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //140 + 0, 0,67, 0, 0, 0, 0, 0, 0, 0, //150 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //160 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //170 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //180 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //190 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //200 + 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, //210 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //220 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //230 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //240 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //250 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //260 + //0 1 2 3 4 5 6 7 8 9 + isoV.clear(); // Always cleans up before filling + if(A>=nAZ) return 0; + G4int fZ=bestZ[A]; + if(fZ) + { + isoV.push_back(fZ); + G4int sZ=secoZ[A]; + if(sZ) + { + isoV.push_back(sZ); + G4int tZ=thrdZ[A]; + if(tZ) + { + isoV.push_back(tZ); + G4int qZ=quadZ[A]; + if(qZ) + { + isoV.push_back(qZ); + return 4; + } + else return 3; + } + else return 2; + } + else return 1; + } + else return 0; +} + +// Randomize a#ofNeutrons in the Element (independent function @@ can be used for initial) +G4int G4QIsotope::RandomizeNeutrons(G4int i) +// ====================================== +{ + static const G4int nElements = 110; // Max=Meitnerium(Mt)Z=99(starts with Z=0 - neuteron) + // If an error is found in this simple tree, please, correct the initialization above + static G4int dN[nElements]= + { + // n Be F Al P + 1, -1, -1, -1, 5, -1, -1, -1, -1, 10, -1, 12, -1, 14, -1, 16, -1, -1, -1, -1, + // Sc Mn Co As Y + -1, 24, -1, -1, -1, 30, -1, 32, -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, 50, + // Nb Tc Rh I Cs Pr + -1, 52, -1, 55, -1, 58, -1, -1, -1, -1, -1, -1, -1, 74, -1, 78, -1, -1, -1, 82, + // Pm Tb Ho Tm Au + -1,-85, -1, -1, -1, 94, -1, 98, -1,100, -1, -1, -1, -1, -1, -1, -1, -1, -1,118, + // Po At Rn Fr Ra Ac + -1, -1, -1, 126,-125,-136,-136,-138,-138,-142, + // Th Pa U Np Pu Am Cm Bk Cf Es + 142,-140, -1,-144,-150,-148,-151,-150,-153,-153 + // Fm Md No Lr Rf Db Sg Bh Hs Mt + -157,-157,-157,-157,-157,-157,-157,-155,-157,-157 + }; +#ifdef debug + G4cout<<"G4QIsotope::RandomizeNeutrons is called Z="<.00015) N=0; + else N=1; + } + else // He (2) + { + if(rnd>1.37e-6) N=2; + else N=1; + } + } + else + { + if(i==3) // Li + { + if(rnd>.075) N=4; + else N=3; + } + else // B (5) + { + if(rnd>.199) N=6; + else N=5; + } + } + } + else // ...... C - Ne + { + if (i<8) + { + if(i==6) // C + { + if(rnd>.011) N=6; + else N=7; + } + else // N (7) + { + if(rnd>.0037) N=7; + else N=8; + } + } + else + { + if(i==8) // O + { + if (rnd<.9976) N=6; + else if(rnd<.9996) N=8; + else N=7; + } + else // Ne (10) + { + if (rnd<.9948) N=10; + else if(rnd<.9975) N=11; + else N=12; + } + } + } + } + else // ______ Mg - Ti + { + if (i<18) // ...... Mg - Cl + { + if (i<16) + { + if(i==12) // Mg + { + if (rnd<.7899) N=12; + else if(rnd<.8899) N=13; + else N=14; + } + else // Si (14) + { + if (rnd<.9223) N=14; + else if(rnd<.969) N=15; + else N=16; + } + } + else + { + if(i==16) // S + { + if (rnd<.9502) N=16; + else if(rnd<.9923) N=18; + else if(rnd<.9998) N=17; + else N=20; + } + else // Cl (17) + { + if (rnd>.7577) N=18; + else N=20; + } + } + } + else // ...... Ar - Ti + { + if (i<20) + { + if(i==18) // Ar + { + if (rnd<.996) N=22; + else if(rnd<.99937) N=18; + else N=20; + } + else // K (19) + { + if (rnd<.932581) N=20; + else if(rnd<.999883) N=22; + else N=21; + } + } + else + { + if(i==20) // Ca + { + if (rnd<.96941) N=20; + else if(rnd<.99027) N=24; + else if(rnd<.99674) N=22; + else if(rnd<.99861) N=28; + else if(rnd<.99996) N=23; + else N=26; + } + else // Ti (22) + { + if (rnd<.738) N=26; + else if(rnd<.818) N=24; + else if(rnd<.891) N=25; + else if(rnd<.946) N=27; + else N=28; + } + } + } + } + } + else // ------ V - Mo + { + if (i<32) // ______ V - Ga + { + if (i<28) // ...... H - Fe + { + if (i<26) + { + if(i==23) // V + { + if (rnd<.9975) N=28; + else N=27; + } + else // Cr (24) + { + if (rnd<.8379) N=28; + else if(rnd<.9329) N=29; + else if(rnd<.97635) N=26; + else N=30; + } + } + else // Fe (26) + { + if (rnd<.9172) N=30; + else if(rnd<.9762) N=28; + else if(rnd<.9972) N=31; + else N=32; + } + } + else // ...... Ni - Ga + { + if (i<30) + { + if(i==28) // Ni + { + if (rnd<.68077) N=30; + else if(rnd<.943) N=32; + else if(rnd<.97934) N=34; + else if(rnd<.99074) N=33; + else N=36; + } + else // Cu (29) + { + if (rnd<.6917) N=34; + else N=36; + } + } + else + { + if(i==30) // Zn + { + if (rnd<.486) N=34; + else if(rnd<.765) N=36; + else if(rnd<.953) N=38; + else if(rnd<.994) N=37; + else N=40; + } + else // Ga (31) + { + if (rnd<.60108) N=38; + else N=40; + } + } + } + } + else // ______ Ge - Mo + { + if (i<37) // ...... H - B + { + if (i<35) + { + if(i==32) // Ge + { + if (rnd<.3594) N=42; + else if(rnd<.6360) N=40; + else if(rnd<.8484) N=38; + else if(rnd<.9256) N=41; + else N=44; + } + else // Se (34) + { + if (rnd>.4961) N=46; + else if(rnd<.7378) N=44; + else if(rnd<.8274) N=42; + else if(rnd<.9148) N=48; + else if(rnd<.9911) N=43; + else N=40; + } + } + else + { + if(i==35) // Br + { + if (rnd<.5069) N=44; + else N=46; + } + else // Kr (36) + { + if (rnd<.57) N=48; + else if(rnd<.743) N=50; + else if(rnd<.859) N=46; + else if(rnd<.974) N=47; + else if(rnd<.9965) N=44; + else N=42; + } + } + } + else // ...... Rb - Mo + { + if (i<40) + { + if(i==37) // Rb + { + if (rnd<.7217) N=48; + else N=50; + } + else // SR (38) + { + if (rnd<.8258) N=50; + else if(rnd<.9244) N=48; + else if(rnd<.9944) N=49; + else N=46; + } + } + else + { + if(i==40) // Zr + { + if (rnd<.5145) N=50; + else if(rnd<.6883) N=54; + else if(rnd<.8598) N=53; + else if(rnd<.972) N=51; + else N=56; + } + else // Mo (42) + { + if (rnd<.2413) N=56; + else if(rnd<.4081) N=54; + else if(rnd<.5673) N=53; + else if(rnd<.7157) N=50; + else if(rnd<.8120) N=58; + else if(rnd<.9075) N=55; + else N=52; + } + } + } + } + } + } + else // ====== Ru - U + { + if (i<66) // ------ Ru - Gd + { + if (i<54) // ______ Ru - Te + { + if (i<49) // ...... Ru - Cd + { + if (i<47) + { + if(i==44) // Ru + { + if (rnd<.316) N=58; + else if(rnd<.502) N=60; + else if(rnd<.673) N=57; + else if(rnd<.8) N=55; + else if(rnd<.926) N=56; + else if(rnd<.9814) N=52; + else N=54; + } + else // Pd (46) + { + if (rnd<.2733) N=60; + else if(rnd<.5379) N=62; + else if(rnd<.7612) N=59; + else if(rnd<.8784) N=55; + else if(rnd<.9898) N=58; + else N=56; + } + } + else + { + if(i==47) // Ag + { + if(rnd<.51839) N=60; + else N=62; + } + else // Cd (48) + { + if (rnd<.2873) N=66; + else if(rnd<.5286) N=64; + else if(rnd<.6566) N=59; + else if(rnd<.7815) N=62; + else if(rnd<.9037) N=65; + else if(rnd<.9786) N=68; + else if(rnd<.9911) N=58; + else N=60; + } + } + } + else // ...... In - Te + { + if (i<51) + { + if(i==49) // In + { + if (rnd<.9577) N=66; + else N=64; + } + else // Sn (50) + { + if (rnd<.3259) N=70; + else if(rnd<.5681) N=68; + else if(rnd<.7134) N=66; + else if(rnd<.7992) N=69; + else if(rnd<.8760) N=67; + else if(rnd<.9339) N=74; + else if(rnd<.9802) N=72; + else if(rnd<.9899) N=62; + else N=64; + //else if(rnd<.9964) N=64; + //else N=65; + } + } + else + { + if(i==51) // Sb + { + if (rnd<.5736) N=70; + else N=72; + } + else // Te (52) + { + if (rnd<.3387) N=78; + else if(rnd<.6557) N=76; + else if(rnd<.8450) N=74; + else if(rnd<.9162) N=73; + else if(rnd<.9641) N=72; + else if(rnd<.9900) N=70; + else if(rnd<.99905) N=71; + else N=68; + } + } + } + } + else // ______ Xe - Gd + { + if (i<60) // ...... Xe - B + { + if (i<57) + { + if(i==54) // Xe + { + if (rnd<.269) N=78; + else if(rnd<.533) N=75; + else if(rnd<.745) N=77; + else if(rnd<.849) N=80; + else if(rnd<.938) N=82; + else if(rnd<.979) N=76; + else if(rnd<.9981) N=74; + else if(rnd<.9991) N=70; + else N=72; + } + else // Ba (56) + { + if (rnd<.717) N=82; + else if(rnd<.8293) N=81; + else if(rnd<.9078) N=80; + else if(rnd<.97373) N=79; + else if(rnd<.99793) N=78; + else if(rnd<.99899) N=74; + else N=76; + } + } + else + { + if(i==57) // La + { + if (rnd<.999098)N=82; + else N=81; + } + else // Ce (58) + { + if (rnd<.8843) N=82; + else if(rnd<.9956) N=84; + else if(rnd<.9981) N=80; + else N=78; + } + } + } + else // ...... Nd - Gd + { + if (i<63) + { + if(i==60) // Nd + { + if (rnd<.2713) N=82; + else if(rnd<.5093) N=84; + else if(rnd<.6812) N=86; + else if(rnd<.8030) N=83; + else if(rnd<.8860) N=85; + else if(rnd<.9436) N=88; + else N=90; + } + else // Sm (62) + { + if (rnd<.267) N=90; + else if(rnd<.494) N=92; + else if(rnd<.644) N=85; + else if(rnd<.782) N=87; + else if(rnd<.895) N=86; + else if(rnd<.969) N=88; + else N=82; + } + } + else + { + if(i==63) // Eu + { + if (rnd<.522) N=90; + else N=89; + } + else // Gd (64) + { + if (rnd<.2484) N=94; + else if(rnd<.4670) N=96; + else if(rnd<.6717) N=92; + else if(rnd<.8282) N=93; + else if(rnd<.9762) N=91; + else if(rnd<.9980) N=90; + else N=88; + } + } + } + } + } + else // ------ Dy - U + { + if (i<76) // ______ Dy - Re + { + if (i<72) // ...... Dy - Lu + { + if (i<70) + { + if(i==66) // Dy + { + if (rnd<.282) N=98; + else if(rnd<.537) N=96; + else if(rnd<.786) N=97; + else if(rnd<.975) N=95; + else if(rnd<.9984) N=94; + else if(rnd<.9994) N=92; + else N=90; + } + else // Er (68) + { + if (rnd<.3360) N= 98; + else if(rnd<.6040) N=100; + else if(rnd<.8335) N= 99; + else if(rnd<.9825) N=102; + else if(rnd<.9986) N= 96; + else N= 94; + } + } + else + { + if(i==70) // Yb + { + if (rnd<.3180) N=104; + else if(rnd<.5370) N=102; + else if(rnd<.6982) N=103; + else if(rnd<.8412) N=101; + else if(rnd<.9682) N=106; + else if(rnd<.9987) N=100; + else N= 98; + } + else // Lu (71) + { + if (rnd<.9741) N=104; + else N=105; + } + } + } + else // ...... Hf - Re + { + if (i<74) + { + if(i==72) // Hf + { + if (rnd<.35100) N=108; + else if(rnd<.62397) N=106; + else if(rnd<.81003) N=105; + else if(rnd<.94632) N=107; + else if(rnd<.99838) N=104; + else N=102; + } + else // Ta (73) + { + if(rnd<.99988) N=108; + else N=107; + } + } + else + { + if(i==74) // W + { + if (rnd<.307) N=110; + else if(rnd<.593) N=112; + else if(rnd<.856) N=108; + else if(rnd<.9988) N=109; + else N=106; + } + else // Re (75) + { + if (rnd<.626) N=112; + else N=110; + } + } + } + } + else // ______ Os - U + { + if (i<81) // ...... Os - Hg + { + if (i<78) + { + if(i==76) // Os + { + if (rnd<.410) N=116; + else if(rnd<.674) N=114; + else if(rnd<.835) N=113; + else if(rnd<.968) N=112; + else if(rnd<.984) N=111; + else if(rnd<.9998) N=110; + else N=108; + } + else // Ir (77) + { + if (rnd<.627) N=116; + else N=114; + } + } + else + { + if(i==78) // Pt + { + if (rnd<.338) N=117; + else if(rnd<.667) N=116; + else if(rnd<.920) N=118; + else if(rnd<.992) N=120; + else if(rnd<.9999) N=114; + else N=112; + } + else // Hg (80) + { + if (rnd<.2986) N=122; + else if(rnd<.5296) N=120; + else if(rnd<.6983) N=119; + else if(rnd<.8301) N=121; + else if(rnd<.9298) N=118; + else if(rnd<.9985) N=124; + else N=116; + } + } + } + else // ...... Tl - U + { + if (i<92) + { + if (i==81) // Tl + { + if (rnd<.70476) N=124; + else N=122; + } + else // Pb (82) + { + if (rnd<.524) N=126; + else if(rnd<.765) N=124; + else if(rnd<.986) N=125; + else N=122; + } + } + else // U (92) + { + if (rnd<.992745)N=146; + else if(rnd<.999945)N=143; + else N=142; + } + } + } + } + } + } + else if(N<0) + { + N=-N; + G4cerr<<"---Worn---G4QIsotope::RandomizeNeutrons:UnstableElement's used Z="<size(); + if(I<=0) + { + G4cerr<<"--Worning--G4QIsotope::InitEl:(-1)0VectorOfNewEl,Z="<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi) // The new Element with the same Z is found + { + if(in==index) found=true; + if(in>mind) mind=in; + } + } + if(found || index<=0) index=mind+1; // Index must be substituted by the NewFirstFreeIndex + G4int ZInd=1000*index+Z; // Fake Z increased by the UserDefinedIndex + std::vector*>*A=new std::vector*>(I); + std::vector*>*S=new std::vector*>(I); + std::vector*>*C=new std::vector*>(I); + G4double sumAbu=0; // Summ of abbundancies + for(G4int j=0; joperator[](j).first; + G4double abu=abund->operator[](j).second; + sumAbu+=abu; + if(j==I-1.) + { + if(fabs(sumAbu-1.)>.00001) + { + G4cerr<<"--Worning--G4QIsotope::InitEl:maxSum="<1.) + { + G4cerr<<"--Worning--G4QIsotope::InitEl:(-2)WrongAbund,Z="<operator[](k); + delete S->operator[](k); + delete C->operator[](k); + } + delete A; + delete S; + delete C; + return -2; + } + } + std::pair* abP= new std::pair(N,abu); + A->push_back(abP); + std::pair* saP= new std::pair(N,sumAbu); + S->push_back(saP); + std::pair* csP= new std::pair(N,0.); + C->push_back(csP); + } + std::pair*>*>* newAP= + new std::pair*>*>(ZInd,A); + newElems.push_back(newAP); + std::pair*>*>* newSA= + new std::pair*>*>(ZInd,S); + newSumAb.push_back(newSA); + std::pair*>*>* newCP= + new std::pair*>*>(ZInd,C); + newIsoCS.push_back(newCP); + return index; +} + +// A#ofNeutrons in theElement with Z & UserDefIndex. Universal for Nat(index=0) & UserDefEl +G4int G4QIsotope::GetNeutrons(G4int Z, G4int index) // If theElem doesn't exist, returns <0 +// ============================================= +{ +#ifdef debug + G4cout<<"G4QIsotope::GetNeutrons is called Z="<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"--Worning--G4QIsotope::GetNeutrons:(-1) NotFound Z="<*>* abu = newSumAb[i]->second; + G4int nn = abu->size(); // A#Of UserDefinedIsotopes for the newElement + if(nn>0) + { + if(nn==1) return abu->operator[](0)->first; + else + { + G4double rnd=G4UniformRand(); + G4int j=0; + for(j=0; joperator[](j)->second) break; + if(j>=nn) j=nn-1; + return abu->operator[](j)->first; + } + } + else + { + G4cerr<<"--Worning--G4QIsotope::GetNeutrons:(-3) Empty Z="<*>* G4QIsotope::GetCSVector(G4int Z, G4int index) +// ============================================= +{ +#ifdef debug + G4cout<<"G4QIsotope::GetCSVector is called"<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"--Worning--G4QIsotope::GetSCVector:(-2) NotFound Z="<second; +} + +// Get a pointer to the vector of pairs(N,IntAbundancy) for the element with Z +std::vector*>* G4QIsotope::GetAbuVector(G4int Z, G4int index) +// ============================================== +{ +#ifdef debug + G4cout<<"G4QIsotope::GetAbuVector is called"<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"--Worning--G4QIsotope::GetAbuVector:(-2)NotFound Z="<second; +} + +// Get a pointer to the vector of pairs(N,SumAbundancy) for the element with Z +std::vector*>* G4QIsotope::GetSumAVector(G4int Z, G4int index) +// =============================================== +{ +#ifdef debug + G4cout<<"G4QIsotope::GetSumAVector is called"<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"-Worning-G4QIsotope::GetSumAVector:(-2)Not Found Z="<second; +} + +// Calculates the mean Cross Section for the initialized Element(ind=0 Nat,ind>0 UserDef) +G4double G4QIsotope::GetMeanCrossSection(G4int Z, G4int index) +// ========================================= +{ + std::vector*>* ab; + std::vector*>* cs; +#ifdef debug + G4cout<<"G4QIsotope::GetMeanCrossSection is called"<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"--Worning--G4QIsotope::GetMeanCS:(-2) NotFound Z="<second; + cs=newIsoCS[i]->second; + } + G4int nis=ab->size(); + G4double last=0.; + if(!nis) + { + G4cerr<<"--Worning--G4QIsotope::GetMeanCS:(-3) Empty Z="<operator[](j)->second; + G4double abunda=cur-last; + last=cur; + sum+=abunda*cs->operator[](j)->second; + } + return sum; + } +} + +// Randomize A#OfNeutrons in the Isotope weighted by theAbubdancies and theCrossSections +G4int G4QIsotope::GetCSNeutrons(G4int Z, G4int index) +// =================================== +{ + std::vector*>* ab; + std::vector*>* cs; +#ifdef debug + G4cout<<"G4QIsotope::GetCSNeutrons is called"<first; + G4int in=zin/1000; // Existing index + G4int zi=zin%1000; // Existing Z + if(Z==zi && in==index) + { + found=true; // The newElement with the same Z & index is found + break; // Finish the search and quit the loop + } + } + if(!found) + { + G4cerr<<"--Worning--G4QIsotope::GetCSNeut:(-2) NotFound Z="<second; + cs=newIsoCS[i]->second; + } + G4int nis=ab->size(); + G4double last=0.; + if(!nis) + { + G4cerr<<"--Worning--G4QIsotope::GetCSNeutrons:(-3) Empty Z="< scs(nis); + for(G4int j=0; joperator[](j)->second; + G4double abunda=cur-last; + last=cur; + sum+=abunda*cs->operator[](j)->second;; + scs.push_back(sum); + } + G4double rnd=sum*G4UniformRand(); + sum=0; + G4int k=0; + if(nis>1) for(k=0; koperator[](k)->first; + } +} diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4DiffElasticHadrNucleus.hh b/source/processes/hadronic/models/coherent_elastic/include/G4DiffElasticHadrNucleus.hh new file mode 100644 index 0000000000..4c51ae6459 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/include/G4DiffElasticHadrNucleus.hh @@ -0,0 +1,125 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef G4DiffElasticHadrNucleus_h +#define G4DiffElasticHadrNucleus_h 1 + +#include "G4Nucleus.hh" +#include "G4DynamicParticle.hh" +#include "G4HadronValues.hh" +#include "G4IntegrHadrNucleus.hh" + +class G4DiffElasticHadrNucleus: public //G4HadronValues + G4IntegrHadrNucleus + { + + public: + G4DiffElasticHadrNucleus() : // G4HadronValues(), + G4IntegrHadrNucleus() {Factors();} + + ~G4DiffElasticHadrNucleus() {;} + + G4double HadrNuclDifferCrSec( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus, + G4double Q2); + + void GetNucleusParameters(G4Nucleus * aNucleus); + + private: + +// ++++++++++++++++++++++++++++++++++++++++++++++++++ + G4double binom(G4int N, G4int M) + { + G4double Fact1 = 1; + if ((N>1) & (N>=M)) + { + Fact1 = Factorials[N]/Factorials[M]/ + Factorials[N-M]; + } + return Fact1; + } + +// +++++++++++++++++++++++++++++++++++++++++++++++++++ + G4double Factorial(G4int N) + { + G4double Res; + Res = 1; + if(N == 0) return Res; + + if(N < 100) for(G4int M = 1; M<=N; M++) Res = Res*M; + + if(N >= 100) Res = 2.50662827*exp(-N-1.0)*pow(N+1.0,N+0.5)* + (1+1/12/(N+1)+1/288/(N+1)/(N+1)- + 139/51840/(N+1)/(N+1)/(N+1)- + 571/2488320/(N+1)/(N+1)/(N+1)/(N+1)); + + return Res; + } + +// +++++++++++++++++++++++++++++++++++++++++++++++++++ + void Factors() + { + G4int ii, ll, mm; + G4double Sum1, Fac1, Fac3, Sum3; + + Factorials[0] = 1; + + for( ii = 1; ii<250; ii++) + { + if(ii >= 100) Mnoj[ii] = 3.03; // there is the saturation + else + { + Sum1 = 0; + Fac1 = 1; + + Factorials[ii] = Factorial(ii); + + for( ll = 0; ll<=ii; ll++) + { + Fac1 = binom(ii,ll); + + Fac3 = 1; + Sum3 = 1; + for( mm = 1; mm<=ii-ll; mm++) + { + Fac3 = binom(ii-ll,mm); + Sum3 = Sum3 + 1/Fac3; + } // mm + Sum1 = Sum1 + Sum3/Fac1; + } // ll + Mnoj[ii] = Sum1; + } // else + } // ii + Mnoj[0] = 1; + + } // Factors +// -------------------------------------------------------- + + G4double Mnoj[250], Factorials[250]; + + public: + + G4double R1, R2, Pnucl, Aeff, AIm, ARe, DIm; + }; + +#endif diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4ElasticHadrNucleusHE.hh b/source/processes/hadronic/models/coherent_elastic/include/G4ElasticHadrNucleusHE.hh new file mode 100644 index 0000000000..908fa47dc7 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/include/G4ElasticHadrNucleusHE.hh @@ -0,0 +1,181 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// G4ElasticHadrNucleusHe.hh + +#ifndef G4ElasticHadrNucleusHE_h +#define G4ElasticHadrNucleusHE_h 1 + +#include + +#include "globals.hh" +#include "G4ParticleDefinition.hh" +#include "G4Ions.hh" +#include "G4ParticleTable.hh" +#include "G4NucleiProperties.hh" +#include "G4ParticleChange.hh" +#include "G4Track.hh" +#include "Randomize.hh" +#include "G4Nucleus.hh" +#include "G4IonTable.hh" + +#include "G4DiffElasticHadrNucleus.hh" +#include "G4IntegrHadrNucleus.hh" +#include "G4HadronicInteraction.hh" + +#define ONQ2 150 // The number of steps on Q2 +#define ONE 5 // The number of steps on E +#define AreaNumb 6 // The number of order steps on E +#define ONQ2XE ONQ2*ONE // The dimension of a distr. func. array +#define MaxN 10 // The atomic number where the calculation + // on the formula is changed on the integral + // one + + class ElasticData + { + public: + G4String hadrName; + G4int nuclAtomicNumber; + G4double TableE[ONE*AreaNumb]; + G4double TableQ2[ONQ2]; + G4double TableCrossSec[ONQ2XE*AreaNumb]; + + ElasticData() {;} + ~ElasticData(){;} + + ElasticData (const ElasticData &t) + { + G4int k; + + hadrName = t.hadrName; + nuclAtomicNumber = t.nuclAtomicNumber; + for(k = 0; k SetOfElasticData; + + G4IonTable MyIonTable; + G4DiffElasticHadrNucleus aDiffElHadNcls; +// G4HadFinalState FinState; + + G4int Nstep, // The number of steps on Q2 + iKindWork, // + iContr, // + iPoE; // The number of steps on E + G4int iTypeWork; + G4double aNucleon; //, +// * pTableCrSec, // The array of distr. func. +// // at all energies +// * pTableE; // The array of E values + G4double iQ2[ONQ2], // The array of Q2 values + pTableCrSec[ONQ2XE*AreaNumb], + pTableE[ONE*AreaNumb], + iIntgr[ONQ2], // The array of distr. func. + // at one energy + Factorials1[250]; // The array for factorials + G4double dEbeg1, dEend1, dQ2, maxQ2; + + }; // The end of the class description + +#endif diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4HadronValues.hh b/source/processes/hadronic/models/coherent_elastic/include/G4HadronValues.hh new file mode 100644 index 0000000000..a76699d151 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/include/G4HadronValues.hh @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// G4HadronValues.hh + +#ifndef G4HadronValues_h +#define G4HadronValues_h 1 + +#include "globals.hh" +#include "G4DynamicParticle.hh" +#include "G4Neutron.hh" +#include "G4Proton.hh" +#include "G4Lambda.hh" +#include "G4SigmaPlus.hh" +#include "G4SigmaMinus.hh" +#include "G4SigmaZero.hh" +#include "G4XiMinus.hh" +#include "G4XiZero.hh" +#include "G4OmegaMinus.hh" + +#include "G4AntiNeutron.hh" +#include "G4AntiProton.hh" +#include "G4AntiLambda.hh" +#include "G4AntiSigmaPlus.hh" +#include "G4AntiSigmaMinus.hh" +#include "G4AntiSigmaZero.hh" +#include "G4AntiXiMinus.hh" +#include "G4AntiXiZero.hh" +#include "G4AntiOmegaMinus.hh" + +#include "G4PionPlus.hh" +#include "G4PionMinus.hh" +#include "G4KaonPlus.hh" +#include "G4KaonMinus.hh" + +#define MyPi 3.141593 +#define MbToGeV2 2.568 +#define GeV2ToMb 0.38939 +#define MbToFm2 25.68 + +class G4HadronValues + { + public: + + G4HadronValues() {;} + ~G4HadronValues() {;} + +// protected: + + void GetHadronValues(const G4DynamicParticle * aHadron); + + G4double HadrTot, HadrSlope, HadrReIm, DDSect2, DDSect3, + MomentumCM; + + }; + +#endif + + diff --git a/source/processes/hadronic/models/coherent_elastic/include/G4IntegrHadrNucleus.hh b/source/processes/hadronic/models/coherent_elastic/include/G4IntegrHadrNucleus.hh new file mode 100644 index 0000000000..2896e7b598 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/include/G4IntegrHadrNucleus.hh @@ -0,0 +1,78 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// G4IntegrHadrNucleus.hh + +#ifndef G4IntegrHadrNucleus_h +#define G4IntegrHadrNucleus_h 1 + +#include "globals.hh" +#include "G4DynamicParticle.hh" +#include "G4Nucleus.hh" +#include "G4HadronValues.hh" + + class G4IntegrHadrNucleus : public G4HadronValues + { + + public: + + G4IntegrHadrNucleus() : G4HadronValues() {;} + ~G4IntegrHadrNucleus() {;} + + G4double GetElasticCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus); + + G4double GetTotalCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus); + + G4double GetProductionCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus); + + + G4double GetInelasticCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus); + + + G4double GetQuasyElasticCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus); + + private: + + void GetIntegralCrSec(G4Nucleus * aNucleus); + + G4double TotalCrSec, InelCrSec, ProdCrSec, ElasticCrSec, + QuasyElasticCrSec, HadrEnergy; + +// protected: + public: + G4double Tot00, DTot00; + + }; + +#endif + + diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4DiffElasticHadrNucleus.cc b/source/processes/hadronic/models/coherent_elastic/src/G4DiffElasticHadrNucleus.cc new file mode 100644 index 0000000000..b29d35ccc4 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/src/G4DiffElasticHadrNucleus.cc @@ -0,0 +1,334 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// + +//G4DiffElasticHadrNucleus.cc + +#include "globals.hh" +#include "G4DiffElasticHadrNucleus.hh" + +// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + void G4DiffElasticHadrNucleus:: + GetNucleusParameters(G4Nucleus * aNucleus) + { + G4int Nucleus = (int)aNucleus->GetN(); + + if(Nucleus == 208) + { // R1 = 20.73; R2 = 15.74. + R1 = 4.1408*pow(static_cast(Nucleus),0.3018); + R2 = 3.806*pow(Nucleus-10.068,0.2685); + Pnucl = 0.9; + Aeff = 1.1; + R1 = 19.5; + R2 = 15.74; + Pnucl = 0.4; + Aeff = 0.7; + } + + else if(Nucleus == 90) + { + R1 = 16.50; + R2 = 11.62; + Pnucl = 0.4; + Aeff = 0.9; + R1 = 16.5; + R2 = 11.62; + Pnucl = 0.4; + Aeff = 0.7; + } + + + else if(Nucleus == 58) + { + R1 = 15.0; + R2 = 9.9; + Pnucl = 0.45; + Aeff = 0.85; + } + else if(Nucleus == 16) + { + R1 = 10.50; + R2 = 5.5; + Pnucl = 0.7; + Aeff = 0.98; +// R1 = 11.3; +// R2 = 2.5; +// Pnucl = 0.75; +// Aeff = 0.9; + + } + else + { + R1 = 4.45*pow(Nucleus-1.0,0.309); + if(Nucleus == 28) + R1 = 4.25*pow(Nucleus-1.0,0.309); + R2 = 2.3*pow(static_cast(Nucleus),0.36); + Pnucl = 0.176+0.00167*Nucleus+ + 8.69E-6*Nucleus*Nucleus; + Aeff = 0.9; + } + + if(Nucleus == 9) + { + R1 = 9.0; + R2 = 7.0; + Pnucl = 0.190; + Aeff = 0.9; + } +/* + if(Nucleus == 12) + { + R1 = 9.336; + R2 = 5.63; + Pnucl = 0.197; + Aeff = 01.0; + } +*/ +/* + if(Nucleus == 11) + { + R1 = 10.8; + R2 = 7.5; + Pnucl = 0.85; + Aeff = 1.2; + } +*/ + if(Nucleus == 4) + { + R1 = 5.5; + R2 = 3.7; + Pnucl = 0.4; + Aeff = 0.87; + } + } + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + G4double G4DiffElasticHadrNucleus::HadrNuclDifferCrSec( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus, + G4double aQ2) + { +// ------ All external kinematical variables are in MeV ------- +// ------ but internal in GeV !!!! ------ + + G4double HadrEnergy = aHadron->GetTotalEnergy()/1000; // GeV + + G4int Nucleus = (int)aNucleus->GetN(); + + if(Nucleus<4) + { + G4Exception(" This nucleus is very light for this model !!!"); + } + + if(Nucleus>238) + { + G4Exception(" This nucleus is very heavy for this model !!!"); + } + + if(HadrEnergy < 1.4999) + { + G4cout<GetMass()/1000; + MassN = Nucleus*0.938; + S = 2*MassN*HadrEnergy+MassN*MassN+MassH*MassH; + EcmH = (S-MassN*MassN+MassH*MassH)/2/sqrt(S); + MomentumCMN = sqrt(EcmH*EcmH-MassH*MassH); + + G4double MbToB = 2.568; // from mb to GeV^-2 + G4double Pi1 = 3.1416; + G4double Stot = HadrTot*MbToB; //In GeV-2 + G4double Bhad = HadrSlope; //In GeV-2 + G4double Asq = 1+HadrReIm*HadrReIm; + G4double Rho2 = sqrt(Asq); + G4double Pnuclp = 0.001; + Pnuclp = Pnucl; + G4double R12 = R1*R1; + G4double R22 = R2*R2; + G4double R12B = R12+2*Bhad; + G4double R22B = R22+2*Bhad; +// G4double R12Bp = R12+20; +// G4double R22Bp = R22+20; +// G4double R13Bp = R12*R1/R12Bp; +// G4double R23Bp = R22*R2/R22Bp; + G4double R12Ap = R12+20; + G4double R22Ap = R22+20; + G4double R13Ap = R12*R1/R12Ap; + G4double R23Ap = R22*R2/R22Ap*Pnuclp; +// G4double R23App = R22*R2/R22Ap*Pnuclp; + G4double R23dR13 = R23Ap/R13Ap; + G4double R12Apd = 2/R12Ap; + G4double R22Apd = 2/R22Ap; + G4double R12ApdR22Ap = 0.5*(R12Apd+R22Apd); + + G4double DDSec1p = (DDSect2+DDSect3*log(1.06*2*HadrEnergy/R1/4)); + G4double DDSec2p = (DDSect2+DDSect3*log(1.06*2*HadrEnergy/ + sqrt((R12+R22)/2)/4)); + G4double DDSec3p = (DDSect2+DDSect3*log(1.06*2*HadrEnergy/R2/4)); + + G4double Norm = (R12*R1-Pnucl*R22*R2)*Aeff; + G4double Normp = (R12*R1-Pnuclp*R22*R2)*Aeff; + G4double R13 = R12*R1/R12B; + G4double R23 = Pnucl*R22*R2/R22B; + G4double Unucl = Stot/2/Pi1/Norm*R13; + G4double UnuclScr = Stot/2/Pi1/Normp*R13Ap; + G4double SinFi = HadrReIm/Rho2; + G4double FiH = asin(SinFi); + G4double N = -1; + G4double N2 = R23/R13; + + G4double ImElasticAmpl0 = 0; + G4double ReElasticAmpl0 = 0; + + G4double exp1; + G4double N4; + G4double Prod1, Tot1=0, medTot, DTot1, DmedTot; + G4int i; + + for( i=1; i<=Nucleus; i++) + { + N = -N*Unucl*(Nucleus-i+1)/i*Rho2; + N4 = 1; + Prod1 = exp(-Q2/i*R12B/4)/i*R12B; + medTot = R12B/i; + + for(G4int l=1; l<=i; l++) + { + exp1 = l/R22B+(i-l)/R12B; + N4 = -N4*(i-l+1)/l*N2; + Prod1 = Prod1+N4/exp1*exp(-Q2/exp1/4); + medTot = medTot+N4/exp1; + } // end l + + ReElasticAmpl0 = ReElasticAmpl0+Prod1*N*sin(FiH*i); + ImElasticAmpl0 = ImElasticAmpl0+Prod1*N*cos(FiH*i); + Tot1 = Tot1+medTot*N*cos(FiH*i); + if(abs(Prod1*N/ImElasticAmpl0) < 0.000001) break; + } // i + + ImElasticAmpl0 = ImElasticAmpl0*Pi1/2.568; // The amplitude in mB + ReElasticAmpl0 = ReElasticAmpl0*Pi1/2.568; // The amplitude in mB + Tot1 = Tot1*Pi1*2.0/2.568; + + G4double N1p = 1; + G4double Din1 = 0.5*(R13Ap*R13Ap*exp(-Q2/8*R12Ap)/2*R12Ap/2*DDSec1p- + 2*R23Ap*R13Ap/2/R12ApdR22Ap*exp(-Q2/4/R12ApdR22Ap)*DDSec2p+ + R23Ap*R23Ap/2*R22Ap/2*exp(-Q2/8*R22Ap)*DDSec3p); // at i=0 + + DTot1 = 0.5*(R13Ap*R13Ap/2*R12Ap/2*DDSec1p- + 2*R23Ap*R13Ap/2/R12ApdR22Ap*DDSec2p+ + R23Ap*R23Ap/2*R22Ap/2*DDSec3p); // at i=0 + +// G4cout<<" DTot00 "<95 && HadrEnergy>1000) {Din1=0; goto tam;} + + G4double exp1p; + G4double exp2p; + G4double exp3p; + G4double N2p; + G4double Din2, BinCoeff; + + BinCoeff = 1; + + for( i = 1; i<= Nucleus-2; i++) + { + N1p = -N1p*UnuclScr*(Nucleus-i-1)/i*Rho2; + N2p = 1; + Din2 = 0; + DmedTot = 0; + for(G4int l = 0; l<=i; l++) + { + if(l == 0) BinCoeff = 1; + else if(l !=0 ) BinCoeff = BinCoeff*(i-l+1)/l; + + exp1 = l/R22B+(i-l)/R12B; + exp1p = exp1+R12Apd; + exp2p = exp1+R12ApdR22Ap; + exp3p = exp1+R22Apd; + + Din2 = Din2 + N2p*BinCoeff* + (R13Ap*R13Ap/2/exp1p*exp(-Q2/4/exp1p)*DDSec1p- + 2*R13Ap*R23Ap/2/exp2p*exp(-Q2/4/exp2p)*DDSec2p+ + R23Ap*R23Ap/2/exp3p*exp(-Q2/4/exp3p)*DDSec3p); + + DmedTot = DmedTot + N2p*BinCoeff* + (R13Ap*R13Ap/2/exp1p*DDSec1p- + 2*R13Ap*R23Ap/2/exp2p*DDSec2p+ + R23Ap*R23Ap/2/exp3p*DDSec3p); + + N2p = -N2p*R23dR13; + } // l + + Din1 = Din1+Din2*N1p*Mnoj[i]/(i+2)/(i+1)*cos(FiH*i); + DTot1 = DTot1+DmedTot*N1p*Mnoj[i]/(i+2)/(i+1)*cos(FiH*i); + if(abs(Din2*N1p/Din1) < 0.000001) break; + } // i + + Din1 = -1*Din1*Nucleus*(Nucleus-1) + /2/Pi1/Normp/2/Pi1/Normp*16*Pi1*Pi1; + + DTot1 = 1*DTot1*Nucleus*(Nucleus-1) + /2/Pi1/Normp/2/Pi1/Normp*16*Pi1*Pi1; + +/// Din1 *= 0; +// ---------------- dSigma/dOmegaCM, mb/Ster ----------------- + +// tam: + G4double Corr0=Tot00/Tot1/1.0; // Corr1=DTot00/DTot1/1.0; + + ImElasticAmpl0 *= Corr0; +// Din1 *= Corr1; + + G4double DiffCrSec2 = (ReElasticAmpl0*ReElasticAmpl0+ + (ImElasticAmpl0+Din1)* + (ImElasticAmpl0+Din1))* + 2.568/4/Pi1/Pi1 + *MomentumCMN*MomentumCMN; + + AIm = ImElasticAmpl0; + ARe = ReElasticAmpl0; + DIm = Din1; + +// if(Q2<0.001) + { +// G4cout<<" DTot00 "<GetParticleName(); + G4int iNnucl = (int) aNucleus->GetN(); + G4double Energies[5] = {1.5, 2.0, 4.0, 6.0, 10.0}; + + if(iNnucl<4) + { + G4Exception(" This nucleus is very light for this model !!!"); + } + + if(iNnucl>238) + { + G4Exception(" This nucleus is very heavy for this model !!!"); + } + + Factorials1[0] = 1; + for( ii = 1; ii<110; ii++) + Factorials1[ii] = Factorial1(ii); + + G4DynamicParticle * innerHadron = new G4DynamicParticle(); + innerHadron->SetDefinition(const_cast(aHadron) ); + + G4ThreeVector inVector(0.,0.,0.); + + G4double mHadr = aHadron->GetPDGMass(); // MeV + G4double curE, curP; + + innerHadron->SetDefinition(const_cast(aHadron)); + + G4double dPower=1000.0; + +// G4cout<SetMomentum(inVector); + +// ------ The creating of the distribution function array ------ + CreationArray(innerHadron, aNucleus); + + for( kk = 0; kkGetParticleName(); + G4int iNnucl = (int) aNucleus->GetN(); + + if(iNnucl<4) + { + G4Exception(" This nucleus is very light for this model !!!"); + } + + if(iNnucl>238) + { + G4Exception(" This nucleus is very heavy for this model !!!"); + } + + G4String sPath; + + if(getenv("G4ELASTICDATA")) + { + sPath = getenv("G4ELASTICDATA"); + sPath = sPath+"/Elastic/"; + // G4cout << "@@@@ Path found "<GetN(); + + std::ifstream TestFile(sNameFile.str(), std::ios::in); + TestFile.setf(std::ios::scientific); + + if(TestFile) + { + ElasticData ElD; + +// G4cout<<" The file exists "<> iPoE; + + G4double dPower; + + for(ik=0; ik= ONE*AreaNumb) G4Exception("Fucked up !!!!!"); + TestFile >> ElD.TableE[kk+ik*iPoE]; + } + for(ii=0; ii> ElD.TableCrossSec[kk*ONQ2+ii+ik*ONQ2XE]; + if(kk*ONQ2+ii+ik*ONQ2XE>=ONQ2XE*AreaNumb) G4Exception("REALLY Fucked up !!!!!"); + } +// G4cout<<" iQ2 "<GetDefinition(); + + G4String sHadron; + +// G4cout<<" Name "<GetParticleName()<GetParticleName(); + + if(sHadron == "proton" || sHadron == "neutron") + sHadron="Nucleon"; + + else if(sHadron == "anti_proton" || sHadron == "anti_neutron") + sHadron="antiNucleon"; + + if(dHadron == G4Proton::Proton()|| + dHadron == G4Neutron::Neutron()) + sHadron="Nucleon"; + + if(dHadron == G4Proton::Proton()|| + dHadron == G4Neutron::Neutron()) + sHadron="Nucleon"; + + else if(dHadron == G4AntiProton::AntiProton()|| + dHadron == G4AntiNeutron::AntiNeutron()) + sHadron="AntiNucleon"; + + else if(dHadron == G4PionPlus::PionPlus()) + sHadron="PionPlus"; + + else if(dHadron == G4PionMinus::PionMinus()) + sHadron="PionMinus"; + + else if(dHadron == G4KaonPlus::KaonPlus()) + sHadron="KaonPlus"; + + else if(dHadron == G4KaonMinus::KaonMinus()) + sHadron="KaonMinus"; + + else if(dHadron == G4Lambda::Lambda()) + sHadron="Lambda"; + + else if(dHadron == G4AntiLambda::AntiLambda()) + sHadron="AntiLambda"; + + else if(dHadron == G4SigmaPlus::SigmaPlus()) + sHadron="SigmaPlus"; + + else if(dHadron == G4SigmaMinus::SigmaMinus()) + sHadron="SigmaMinus"; + + else if(dHadron == G4SigmaZero::SigmaZero()) + sHadron="SigmaZero"; + + else if(dHadron == G4AntiSigmaPlus::AntiSigmaPlus()) + sHadron="AntiSigmaPlus"; + + else if(dHadron == G4AntiSigmaMinus::AntiSigmaMinus()) + sHadron="AntiSigmaMinus"; + + else if(dHadron == G4AntiSigmaZero::AntiSigmaZero()) + sHadron="AntiSigmaZero"; + + else if(dHadron == G4XiMinus::XiMinus()) + sHadron="XiMinus"; + + else if(dHadron == G4XiZero::XiZero()) + sHadron="XiZero"; + + else if(dHadron == G4AntiXiMinus::AntiXiMinus()) + sHadron="AntiXiMinus"; + + else if(dHadron == G4AntiXiZero::AntiXiZero()) + sHadron="AntiXiZero"; + + else if(dHadron == G4OmegaMinus::OmegaMinus()) + sHadron="OmegaMinus"; + + else if(dHadron == G4AntiOmegaMinus::AntiOmegaMinus()) + sHadron="AntiOmegaMinus"; + + else { + G4cout << " There is not method for the hadron " << + dHadron->GetParticleName() << G4endl; + } + return sHadron; + } +// ======================================================== +// ++++++++++++++++++ ApplayYourself ++++++++++++++++++++ + G4HadFinalState * + G4ElasticHadrNucleusHE::ApplyYourself( + const G4HadProjectile &aHadron, + G4Nucleus &aNucleus) + { + G4int nN, nZ; + + iContr = 133; + + if(iContr==137) + G4cout<GetPDGMass(); + hadrName = aHadron.GetDefinition()->GetParticleName(); + + if(iContr==137) + G4cout<<" In Apply: HadMass HadName "<SetDefinition(const_cast(aHadron.GetDefinition() ) ); + aParticle->SetMomentum(hadrMomentum); + + G4double inLabMom = aHadron.GetTotalMomentum(); // MeV + G4double inEnHadr = aHadron.GetTotalEnergy(); // MeV + + if(iContr==137) + G4cout<<" Hadr: Energy TotMom "<GetN(); + nZ = (int) aNucl->GetZ(); + + G4ParticleDefinition * secNuclDef; + G4DynamicParticle * secNuclDyn = new G4DynamicParticle(); + + secNuclDef = MyIonTable.GetIon(nZ, nN); + secNuclDyn->SetDefinition(secNuclDef); +// ------------------------------------------- + size_t SizeData = SetOfElasticData.size(); + + G4int NumberOfRecord = 0; + +// G4cout<<" Appl SizeData 1: "< 0) + ElD = SetOfElasticData[NumberOfRecord-1]; + + else + { + G4int TestFile = ReadOfData(const_cast(aHadron.GetDefinition()), &aNucleus); + if(TestFile < 0) + { +// G4cout<<" File for elastic scattering of hadron " +// <GetDefinition()->GetParticleName()<GetDefinition()->GetParticleName()<GetMass(); // MeV + G4double MassNucl = aNucleus.GetN()*938.27; // MeV + G4double sqrMass = MassNucl*MassNucl+MassHadr*MassHadr; +// --------------- For final state of hadron ------------------ + G4double invS = sqrMass+2*inEnHadr*MassNucl; // MeV^2 + G4double invU = 2*sqrMass-invS+ranQ2; // MeV^2 + G4double outEnHadr = (sqrMass-invU)/2/MassNucl; // MeV + G4double outMomHdr = sqrt(outEnHadr*outEnHadr- // MeV + MassHadr*MassHadr); + G4double cosHadr = (-ranQ2-2*MassHadr*MassHadr+ + 2*inEnHadr*outEnHadr)/2 + /inLabMom/outMomHdr; +//---------------- For final state of nucleus ----------------- + G4double outEnNucl = (2*MassNucl*MassNucl+ranQ2)/2/MassNucl; + G4double outMomNcl = sqrt(outEnNucl*outEnNucl- // MeV + MassNucl*MassNucl); + G4double cosNucl = (invU-sqrMass+2*inEnHadr*outEnNucl) + /2/inLabMom/outMomNcl; + G4double ranFi = 6.2832*G4UniformRand(); +// ------ The transformation from Hadron frame to absolute one ------- + G4double RotMatrix[3][3]; + G4double NewMomHdrSys[3]; + G4double NewMomOldSys[3]; + G4double NucMomHdrSys[3]; + G4double NucMomOldSys[3]; +// ------------ The hadron angles in its own system ------------ + G4double sinHadr = sqrt(1-cosHadr*cosHadr); + G4double sinFiHadr = sin(ranFi); + G4double cosFiHadr = cos(ranFi); +// ---- The unit vector of a hadron momentum in its own system --- + NewMomHdrSys[0] = sinHadr*cosFiHadr; + NewMomHdrSys[1] = sinHadr*sinFiHadr; + NewMomHdrSys[2] = cosHadr; + G4double sinNucl = sqrt(1-cosNucl*cosNucl); +// ----------- The unit vector of a nucleus momentum ----------- + NucMomHdrSys[0] = -sinNucl*cosFiHadr; + NucMomHdrSys[1] = -sinNucl*sinFiHadr; + NucMomHdrSys[2] = cosNucl; +// __________ The angles of unit vector in absolute system ---------- + G4double cosTet = aParticle->GetMomentumDirection().z(); + G4double sinTet; + G4double sinFi; + G4double cosFi; + if(cosTet>0.99999 || cosTet<-0.99999) + { + sinTet = 0; + sinFi = 0; + cosFi = 1; + } + else + { + sinTet = sqrt(1-cosTet*cosTet); + sinFi = aParticle->GetMomentumDirection().y()/ + sinTet; + cosFi = aParticle->GetMomentumDirection().x()/ + sinTet; + } +// ----------------- The rotation matrix --------------- + RotMatrix[0][0] = cosFi*cosTet; + RotMatrix[0][1] = sinFi; + RotMatrix[0][2] = -cosFi*sinTet; + RotMatrix[1][0] = -sinFi*cosTet; + RotMatrix[1][1] = cosFi; + RotMatrix[1][2] = sinFi*sinTet; + RotMatrix[2][0] = sinTet; + RotMatrix[2][1] = 0; + RotMatrix[2][2] = cosTet; + + if(iContr == 137 ) + { + G4cout<<" Angles CosTet SinTet CosFi SinFi "<SetMomentum(aNuclMom); + + if(iContr==137) + G4cout<<" NuclMom "<GetMomentum()<0) +/// theParticleChange.AddSecondary( &secNuclTrack); +// --------------------------------------------- + + NumbPart = theParticleChange.GetNumberOfSecondaries(); + if(iContr==137) + G4cout << " NumbPart (thePartCh.) before "<< NumbPart <0) + theParticleChange.AddSecondary(secNuclDyn); + + theParticleChange.SetEnergyChange(outEnHadr); + theParticleChange.SetMomentumChange(pxnew, pynew, pznew); + + NumbPart = theParticleChange.GetNumberOfSecondaries(); + if(iContr==137) + G4cout << " NumbPart (thePartCh.) after "<< NumbPart <GetParticle(); + G4cout<<" NucleusName " + <GetDefinition()->GetParticleName()<GetMomentum(); +// G4double outENucl = SecPartNuc->GetTotalEnergy(); +// G4double outPNucl = sqrt(outENucl*outENucl- +// 938.27*938.27*MassNucl*MassNucl); +// G4double secEnergyNucl = SecPartNuc->GetKineticEnergy(); + G4cout<<"----------- End Applay ------------"< iIntgr[kk]) kk ++; + + if(kk == 1 ) kk = 2; + + G4double F1 = iIntgr[kk-2]; + G4double F2 = iIntgr[kk-1]; + G4double F3 = iIntgr[kk]; + G4double F12 = F1*F1; + G4double F22 = F2*F2; + G4double F32 = F3*F3; + G4double X1 = iQ2[kk-2]; // MeV^2 + G4double X2 = iQ2[kk-1]; + G4double X3 = iQ2[kk]; + G4double D0 = F12*F2+F1*F32+F3*F22-F32*F2-F22*F1-F12*F3; + + if(D0 == 0) + { + ranQ2 = (iQ2[kk-1]+(ranUni-iIntgr[kk-1])* + (iQ2[kk]-iQ2[kk-1]) + /(iIntgr[kk]-iIntgr[kk-1])); + } + + else { + G4double DA = X1*F2+X3*F1+X2*F3-X3*F2-X1*F3-X2*F1; + G4double DB = X2*F12+X1*F32+X3*F22-X2*F32-X3*F12-X1*F22; + G4double DC = X3*F2*F12+X2*F1*F32+X1*F3*F22 + -X1*F2*F32-X2*F3*F12-X3*F1*F22; + ranQ2 = (DA*ranUni*ranUni+DB*ranUni+DC)/D0; + } + return ranQ2; // MeV^2 + } +// +++++++++ The randomization of two dimensoinal array ++++++++ + G4double G4ElasticHadrNucleusHE::RandomElastic1( + const G4DynamicParticle * aHadron, + const ElasticData * ElD) + { + G4double forQ2[3]; + G4double curE = aHadron->GetTotalEnergy(); // in MeV + G4double X1; + G4double X2; + G4double X3; + G4double Y1; + G4double Y2; + G4double Y3; + G4int iiE = 0; + G4int k[3]; + + while(curE > ElD->TableE[iiE] ) + { + iiE++; + +// G4cout<<" Rand1: iiE "<< iiE <<" E "<TableE[iiE]< + ElD->TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2]) + { + +// G4cout<<"find kk ranUni Tab "<TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2]<TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2]<TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2-1]; + X2 = ElD->TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2]; + X3 = ElD->TableCrossSec[iiE*ONQ2+mm*ONQ2+kk-ONQ2+1]; + Y1 = ElD->TableQ2[kk-1]; // MeV^2 + Y2 = ElD->TableQ2[kk]; + Y3 = ElD->TableQ2[kk+1]; + + forQ2[mm] = InterPol(X1, X2, X3, Y1, Y2, Y3, ranUni); + +// G4cout<TableE[iiE-1]; + X2 = ElD->TableE[iiE]; + X3 = ElD->TableE[iiE+1]; + Y1 = forQ2[0]; // MeV^2 + Y2 = forQ2[1]; + Y3 = forQ2[2]; + + ranQ2 = InterPol(X1, X2, X3, Y1, Y2, Y3, curE); + +// G4cout<GetN() > MaxN ) + ArrayForHeavy( aHadron, aNucleus); + else + ArrayForLight( aHadron, aNucleus); + } +// +++++++++++++ The method for heavy nucleus ++++++++++++++++ +void G4ElasticHadrNucleusHE::ArrayForHeavy( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus) + { + GetNucleusParameters(aNucleus); + +////// G4double aNuc = aNucleus->GetN(); + G4double intgrS(0), intgStep(0); + G4int ii(0); + + iIntgr[0] = 0; + + for( ii=0; ii 3 ) aSimp = 2; + else aSimp = 4; + if(ll == 0) aSimp = 4; + } // ll + intgStep = curSum*ddQ2/3; +// -------------------------------------------------------------------- + iIntgr[ii+1] = iIntgr[ii]+intgStep; + intgrS = intgrS + intgStep; + } // ii +// ------------------- The normalization ---------------- + for( ii=0; iiGetN(); + G4int Nucleus = (G4int) aNuc; + + GetNucleusParameters(aNucleus); + + maxQ2 = GetQ2limit(R1)/1000/1000; // GeV^2 + +// ---------------- The preparing of probability function ------------ + + G4double MbToB = 2.568; // from mb to GeV^-2 + G4double Pi1 = 3.1416; + G4double Stot = HadrTot*MbToB; // Gev^-2 + G4double Bhad = HadrSlope; // GeV^-2 + G4double Asq = 1+HadrReIm*HadrReIm; + G4double Rho2 = sqrt(Asq); + + G4double R12 = R1*R1; + G4double R22 = R2*R2; + G4double R12B = R12+2*Bhad; + G4double R22B = R22+2*Bhad; +/// G4double R12Bp = R12+20; +/// G4double R22Bp = R22+20; +/// G4double R13Bp = R12*R1/R12Bp; +/// G4double R23Bp = R22*R2/R22Bp; +/// G4double R12Ap = R12+20; +/// G4double R22Ap = R22+20; +/// G4double R13Ap = R12*R1/R12Ap; +/// G4double R23Ap = R22*R2/R22Ap*PnuclP; +/// G4double R23dR13 = R23Ap/R13Ap; +/// G4double R12Apd = 2/R12Ap; +/// G4double R22Apd = 2/R22Ap; + + G4double Norm = R12*R1-Pnucl*R22*R2; +/// G4double NormP = R12*R1-PnuclP*R22*R2; + G4double R13 = R12*R1/R12B; + G4double R23 = Pnucl*R22*R2/R22B; + G4double Unucl = Stot/2/Pi1/Norm*R13; +//// G4double Unclprod = Stot/2/Pi1/NormP*R13Ap; + G4double FiH = asin(HadrReIm/Rho2); + G4double NN2 = R23/R13; + +/// G4double DDSec1p = (DDSect2+ +/// DDSect3*log(1.06*2*Ehad/R1/4)); + +/// G4double DDSec2p = (DDSect2+ +/// DDSect3*log(1.06*2*Ehad/sqrt((R12+R22)/2)/4)); + +/// G4double DDSec3p = (DDSect2+ +/// DDSect3*log(1.06*2*Ehad/R2/4)); + +/// G4double R12ApdR22Ap = 0.5*(R12Apd+R22Apd); + + iIntgr[0] = 0; + + G4int ii; + + for(ii=0; iiGetDefinition(); + + G4int iHadron; + + if(dHadron == G4Proton::Proton() || + dHadron == G4Neutron::Neutron() || + dHadron == G4Lambda::Lambda() || + dHadron == G4SigmaPlus::SigmaPlus() || + dHadron == G4SigmaMinus::SigmaMinus()|| + dHadron == G4SigmaZero::SigmaZero() || + dHadron == G4XiMinus::XiMinus() || + dHadron == G4XiZero::XiZero() || + dHadron == G4OmegaMinus::OmegaMinus()) iHadron=0; + + else if(dHadron == G4AntiProton::AntiProton() || + dHadron == G4AntiNeutron::AntiNeutron() || + dHadron == G4AntiLambda::AntiLambda() || + dHadron == G4AntiSigmaPlus::AntiSigmaPlus() || + dHadron == G4AntiSigmaMinus::AntiSigmaMinus()|| + dHadron == G4AntiSigmaZero::AntiSigmaZero() || + dHadron == G4AntiXiMinus::AntiXiMinus() || + dHadron == G4AntiXiZero::AntiXiZero() || + dHadron == G4AntiOmegaMinus::AntiOmegaMinus()) iHadron=1; + + else if(dHadron == G4PionPlus::PionPlus()) iHadron=2; + + else if(dHadron == G4PionMinus::PionMinus()) iHadron=3; + + else if(dHadron == G4KaonPlus::KaonPlus()) iHadron=4; + + else if(dHadron == G4KaonMinus::KaonMinus()) iHadron=5; + + else { + G4Exception(" There is not method for this hadron "); + } + + G4double mHadr = aHadron->GetMass()/1000.; // In GeV + G4double HadrEnergy = aHadron->GetTotalEnergy()/1000.; // In GeV + G4double sHadr = 2*HadrEnergy*0.938+0.938*0.938+mHadr*mHadr; + G4double sqrS = sqrt(sHadr); + G4double Ecm = (sHadr-mHadr*mHadr+0.938*.938)/2/sqrS; + MomentumCM = sqrt(Ecm*Ecm-0.938*0.938); + + if(HadrEnergy<1.0) + { + G4Exception(" The hadron Energy is very low for this method!"); + } + switch (iHadron) + { + + case 0: // proton + + G4double Delta; + + Delta=1; + + if(HadrEnergy<40) + Delta = 0.916+0.0021*HadrEnergy; + HadrTot = 5.2+5.2*log(HadrEnergy) + +51*pow(HadrEnergy,-0.35); // mb + HadrSlope = 6.44+0.88*log(sHadr)-1; // GeV-2 + HadrReIm = 0.13*log(sHadr/350)*pow(sHadr,-0.18); + DDSect2 = 11; //mb*GeV-2 + DDSect3 = 3; //mb*GeV-2 + +// if(HadrEnergy>1000) HadrReIm=0.15; + + if( dHadron == G4Lambda::Lambda() || + dHadron == G4SigmaPlus::SigmaPlus() || + dHadron == G4SigmaMinus::SigmaMinus()|| + dHadron == G4SigmaZero::SigmaZero()) + { + HadrTot *=0.80; + HadrSlope *=0.85; + } + + if( dHadron == G4XiMinus::XiMinus() || + dHadron == G4XiZero::XiZero()) + { + HadrTot *=0.70; + HadrSlope *=0.75; + } + + if( dHadron == G4OmegaMinus::OmegaMinus()) + { + HadrTot *=0.60; + HadrSlope *=0.65; + } + + break; + + case 1: // antiproton + + sqrS = sqrt(sHadr); + HadrTot = 5.2+5.2*log(HadrEnergy) + +123.2*pow(HadrEnergy,-0.5); // mb + HadrSlope = 8.32+0.57*log(sHadr); //GeV-2 + if(HadrEnergy<1000) + HadrReIm =0.06*(sqrS-2.236)*(sqrS-14.14)*pow(sHadr,-0.8); + else + HadrReIm = 0.6*log(sHadr/350)*pow(sHadr,-0.25); + + DDSect2 = 11; //mb*GeV-2 + DDSect3 = 3; //mb*GeV-2 + +// if(HadrEnergy>1000) HadrReIm=0.15; + + if( dHadron == G4AntiLambda::AntiLambda() || + dHadron == G4AntiSigmaPlus::AntiSigmaPlus() || + dHadron == G4AntiSigmaMinus::AntiSigmaMinus()|| + dHadron == G4AntiSigmaZero::AntiSigmaZero()) + { + HadrTot *=0.75; + HadrSlope *=0.85; + } + + if( dHadron == G4AntiXiMinus::AntiXiMinus() || + dHadron == G4AntiXiZero::AntiXiZero()) + { + HadrTot *=0.65; + HadrSlope *=0.75; + } + + if( dHadron == G4AntiOmegaMinus::AntiOmegaMinus()) + { + HadrTot *=0.55; + HadrSlope *=0.65; + } + + break; + + case 2: // pi plus + + HadrTot = 10.6+2.*log(HadrEnergy)+ + 25*pow(HadrEnergy,-0.43); // mb + HadrSlope = 7.28+0.245*log(sHadr); //GeV-2 + HadrReIm = 0.2*log(sHadr/100)*pow(sHadr,-0.15); + DDSect2 = 4.6; //mb*GeV-2 + DDSect3 = 1.33; //mb*GeV-2 + break; + + case 3: // pi minus + + HadrTot = 10.6+2*log(HadrEnergy)+ + 30*pow(HadrEnergy,-0.43); // mb + HadrSlope = 7.28+0.245*log(sHadr); // GeV-2 + HadrReIm = 0.2*log(sHadr/100)*pow(sHadr,-0.15); + DDSect2 = 4.6; //mb*GeV-2 + DDSect3 = 1.33; //mb*GeV-2 + break; + + case 4: // K plus + + HadrTot = 10.6+1.8*log(HadrEnergy)+ + 9.0*pow(HadrEnergy,-0.55); // mb + if(HadrEnergy>100) HadrSlope = 15.0; + else + HadrSlope = 5.28+1.76*log(sHadr)- + 2.84*pow(sHadr,-0.5); // GeV-2 + HadrReIm = 0.4*(sHadr-20)*(sHadr-150)*pow(sHadr+50,-2.1); + DDSect2 = 3.5; //mb*GeV-2 + DDSect3 = 1.03; //mb*GeV-2 + break; + + case 5: // K minus + + HadrTot = 10+1.8*log(HadrEnergy) + +25*pow(HadrEnergy,-0.5); // mb + HadrSlope = 6.98+0.127*log(sHadr); // GeV-2 +// if(HadrEnergy<8) HadrReIm = 0.7; +// else + HadrReIm = 0.4*(sHadr-20)*(sHadr-20)*pow(sHadr+50,-2.1); + DDSect2 = 3.5; //mb*GeV-2 + DDSect3 = 1.03; //mb*GeV-2 + break; + } + } + +/* end of file */ diff --git a/source/processes/hadronic/models/coherent_elastic/src/G4IntegrHadrNucleus.cc b/source/processes/hadronic/models/coherent_elastic/src/G4IntegrHadrNucleus.cc new file mode 100644 index 0000000000..857df6daf1 --- /dev/null +++ b/source/processes/hadronic/models/coherent_elastic/src/G4IntegrHadrNucleus.cc @@ -0,0 +1,223 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// IntegrHadrNucleus.cc + +#include "globals.hh" +#include "G4IntegrHadrNucleus.hh" + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++ + void G4IntegrHadrNucleus:: + GetIntegralCrSec(G4Nucleus * aNucleus) + { + G4int i, /*k,*/ l/*, m*/; + G4double N, N1, N2, N3, N4, Delta, Inel1/*, Inel3*/; + G4double Tot0, Inel0, /*Inel2,*/ Prod0, Prod1, + ak, Delt, Delt2, Delt3; + G4double Rnucl, R0, Stot, Bhad, Asq, MbToB, Pi1; + G4double Dtot, /*Dinel,*/ Dprod, Rnuc2, RB, R2B, bk, bd; + + G4int Anucleus = static_cast( aNucleus->GetN() ); + + if(Anucleus<4) + { + G4Exception(" This nucleus is very light for this model !!!"); + } + + if(Anucleus>238) + { + G4Exception(" This nucleus is very heavy for this model !!!"); + } + + MbToB = 2.568; + Pi1 = 3.1416; + + Stot = HadrTot*MbToB; //{In GeV-2} + Bhad = HadrSlope; //{In GeV-2} + Asq = 1+HadrReIm*HadrReIm; + + R0 = sqrt(0.99); //{ This is fermi} + if (Anucleus >10) R0 = sqrt(0.84); + if (Anucleus >20) R0 = sqrt((35.34+0.5*Anucleus) + /(40.97+Anucleus)); + if (Anucleus == 16) R0 = sqrt(0.75); + if (Anucleus == 58) R0 = sqrt(0.6); + +// R0 = sqrt(0.64); + + Rnucl = R0*pow(static_cast(Anucleus),0.3333); //{In Fermi } + + if(Anucleus == 4) Rnucl = 1.2; + + Rnuc2 = Rnucl*Rnucl*MbToB*10; //{ In GeV-2} + RB = Rnuc2+Bhad; + R2B = RB+Bhad; + Delta = Stot/R2B/2/Pi1; + Delt = Delta*Asq*0.5; + Delt2 = Delta*2; + Delt3 = Stot/RB/Bhad/16/Pi1*Asq*R2B; + + Tot0 = 0; + Inel0 = 0; + Inel1=0; + N = N1 = -1/Delta; + N3 = -1/Delt2; + Prod0 = 0; + + for (i=1; i<= Anucleus; i++) + + { + N = -N*Delta*(Anucleus-i+1)/i; + N1 = -N1*Delta*(2*Anucleus-i+1)/i; + N3 = -N3*Delt2*(Anucleus-i+1)/i; + Tot0 = Tot0+N/i; + Inel0 = Inel0+N1/i; + N2 = 1; + N4 = 1; + Inel1 = 0; + Prod1 = 0; + + for (l=0; l<= i; l++) + + { +// Inel1 = Inel1+N2/(i+l); + Prod1 = Prod1+N4*RB/(i*RB+l*Bhad); +// N2 = -N2*Delt*(i-l)/(l+1); + N4 = -N4*Delt3*(i-l)/(l+1); + } // l + +// Inel2 = Inel2+Inel1*N3; + Prod0 = Prod0+Prod1*N3; + if(abs(N1/i/Inel0) < 0.0001) break; + } // i + + Tot0 = Tot0*HadrTot; + Inel0 = Inel0*HadrTot*0.5; +// Inel2 = Inel2*HadrTot; + Prod0 = Prod0*HadrTot; + Tot00 = Tot0; + + ak = (Rnuc2*2*Pi1/Stot); + G4double DDSect1 = (DDSect2+DDSect3*log(1.06*2*HadrEnergy + /Rnucl/sqrt(25.68)/4)); + + Dtot = 8*Pi1*ak/HadrTot*(1-(1+Anucleus/ak) + *exp(-Anucleus/ak))*DDSect1/MbToB; + DTot00 = Dtot; + + bk = (1-1/ak)/Stot/(1-1/ak/4); + + bd = bk*bk*DDSect1*(1-(1+Anucleus/ak*(1-1/ak/4))* + exp(-Anucleus/ak*(1-1/4/ak)))*Rnuc2; + + Dprod = bd*4*Pi1*Pi1*MbToB; + + TotalCrSec = Tot0-Dtot; + InelCrSec = Inel0-Dprod; +// InelCrSec1 = Inel2; + ProdCrSec = Prod0-Dprod; + ElasticCrSec = TotalCrSec-InelCrSec; + QuasyElasticCrSec = InelCrSec-ProdCrSec; + } + +// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + G4double + G4IntegrHadrNucleus::GetElasticCrossSection( + const G4DynamicParticle * aHadron, + G4Nucleus * aNucleus) + + { + HadrEnergy = aHadron->GetTotalEnergy()/1000; + +if(HadrEnergy < 1.5) + G4cout << " The hadron energy is very low for this model !!!"<GetTotalEnergy()/1000; + +if(HadrEnergy < 1.5) + G4cout <<" The hadron energy is very low for this model !!!"<GetTotalEnergy()/1000; + +if(HadrEnergy < 1.5) + G4cout <<" The hadron energy is very low for this model !!!"<GetTotalEnergy()/1000; + +if(HadrEnergy < 1.5) + G4cout <<" The hadron energy is very low for this model !!!"<GetTotalEnergy()/1000; + +if(HadrEnergy < 1.5) + G4cout <<" The hadron energy is very low for this model !!!"< +//////////////////////////////////////////////////////////////////////////////// +// +class G4WilsonAblationModel : public G4VEvaporation +{ + public: + G4WilsonAblationModel(); + ~G4WilsonAblationModel(); + + typedef std::vector VectorOfFragmentTypes; + + G4FragmentVector * BreakItUp (const G4Fragment &theNucleus); + void SetProduceSecondaries (G4bool); + G4bool GetProduceSecondaries (); + void SetVerboseLevel (G4int); + G4int GetVerboseLevel (); + + private: + void SelectSecondariesByEvaporation (G4Fragment*); + void SelectSecondariesByDefault (G4ThreeVector); + void PrintWelcomeMessage (); + + private: + G4bool produceSecondaries; + G4int verboseLevel; + G4double B; + G4int nFragTypes; + G4ParticleDefinition *fragType[6]; + G4FragmentVector *fragmentVector; + VectorOfFragmentTypes evapType; + + class SumProbabilities : + public std::binary_function + { + public: + SumProbabilities() : total(0.0) {} + G4double operator() (G4double& /* probSoFar */, G4VEvaporationChannel*& frag) + { + total += frag->GetEmissionProbability(); + return total; + } + + G4double GetTotal() { return total; } + public: + G4double total; + }; + + + +}; +//////////////////////////////////////////////////////////////////////////////// +// +inline void G4WilsonAblationModel::SetProduceSecondaries + (G4bool produceSecondaries1) + {produceSecondaries = produceSecondaries1;} +//////////////////////////////////////////////////////////////////////////////// +// +inline G4bool G4WilsonAblationModel::GetProduceSecondaries () + {return produceSecondaries;} +//////////////////////////////////////////////////////////////////////////////// +// +inline void G4WilsonAblationModel::SetVerboseLevel (G4int verboseLevel1) + {verboseLevel = verboseLevel1;} +//////////////////////////////////////////////////////////////////////////////// +// +inline G4int G4WilsonAblationModel::GetVerboseLevel () + {return verboseLevel;} +//////////////////////////////////////////////////////////////////////////////// +// +#endif diff --git a/source/processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc b/source/processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc new file mode 100644 index 0000000000..fd68043484 --- /dev/null +++ b/source/processes/hadronic/models/de_excitation/ablation/src/G4WilsonAblationModel.cc @@ -0,0 +1,511 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4WilsonAblationModel.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4WilsonAblationModel.hh" +#include "Randomize.hh" +#include "G4ParticleTable.hh" +#include "G4IonTable.hh" +#include "G4Alpha.hh" +#include "G4He3.hh" +#include "G4Triton.hh" +#include "G4Deuteron.hh" +#include "G4Proton.hh" +#include "G4Neutron.hh" +#include "G4AlphaEvaporationChannel.hh" +#include "G4He3EvaporationChannel.hh" +#include "G4TritonEvaporationChannel.hh" +#include "G4DeuteronEvaporationChannel.hh" +#include "G4ProtonEvaporationChannel.hh" +#include "G4NeutronEvaporationChannel.hh" +#include "G4LorentzVector.hh" +#include "G4VEvaporationChannel.hh" + +#include +#include +//////////////////////////////////////////////////////////////////////////////// +// +G4WilsonAblationModel::G4WilsonAblationModel() +{ +// +// +// Send message to stdout to advise that the G4Abrasion model is being used. +// + PrintWelcomeMessage(); +// +// +// Set the default verbose level to 0 - no output. +// + verboseLevel = 0; +// +// +// Set the binding energy per nucleon .... did I mention that this is a crude +// model for nuclear de-excitation? +// + B = 10.0 * MeV; +// +// +// It is possuble to switch off secondary particle production (other than the +// final nuclear fragment). The default is on. +// + produceSecondaries = true; +// +// +// Now we need to define the decay modes. We're using the G4Evaporation model +// to help determine the kinematics of the decay. +// + nFragTypes = 6; + fragType[0] = G4Alpha::Alpha(); + fragType[1] = G4He3::He3(); + fragType[2] = G4Triton::Triton(); + fragType[3] = G4Deuteron::Deuteron(); + fragType[4] = G4Proton::Proton(); + fragType[5] = G4Neutron::Neutron(); +// +// +// Set verboseLevel default to no output. +// + verboseLevel = 0; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4WilsonAblationModel::~G4WilsonAblationModel() +{;} +//////////////////////////////////////////////////////////////////////////////// +// +G4FragmentVector *G4WilsonAblationModel::BreakItUp + (const G4Fragment &theNucleus) +{ +// +// +// Initilise the pointer to the G4FragmentVector used to return the information +// about the breakup. +// + fragmentVector = new G4FragmentVector; + fragmentVector->clear(); +// +// +// Get the A, Z and excitation of the nucleus. +// + G4int A = (G4int) theNucleus.GetA(); + G4int Z = (G4int) theNucleus.GetZ(); + G4double ex = theNucleus.GetExcitationEnergy(); + if (verboseLevel >= 2) + { + G4cout <<"oooooooooooooooooooooooooooooooooooooooo" + <<"oooooooooooooooooooooooooooooooooooooooo" + <= 2) + { + G4cout <<"No nucleus to decay" <push_back(fragment); + } + else + { + G4Fragment *fragment = new G4Fragment(lorentzVector,G4Proton::Proton()); + fragmentVector->push_back(fragment); + } + if (verboseLevel >= 2) + { + G4cout <<"Final fragment is in fact only a nucleon) :" < A) DAabl = A; + if (verboseLevel >= 2) + G4cout <<"Number of nucleons ejected = " < 0) + { + G4double AFd = static_cast(AF); + G4double R = 11.8 / pow(AFd, 0.45); + G4int minZ = Z - DAabl; + if (minZ <= 0) minZ = 1; +// +// +// Here we define an integral probability distribution based on the Rudstam +// equation assuming a constant AF. +// + G4double sig[100]; + G4double sum = 0.0; + for (G4int ii=minZ; ii<= Z; ii++) + { + sum += exp(-R*pow(abs(ii - 0.486*AFd + 3.8E-04*AFd*AFd),1.5)); + sig[ii] = sum; + } +// +// +// Now sample that distribution to determine a value for ZF. +// + G4double xi = G4UniformRand(); + G4int iz = minZ; + G4bool found = false; + while (iz <= Z && !found) + { + found = (xi <= sig[iz]/sum); + if (!found) iz++; + } + if (iz > Z) + ZF = Z; + else + ZF = iz; + } + G4int DZabl = Z - ZF; + if (verboseLevel >= 2) + G4cout <<"Final fragment A=" <GetParticleName() + <<", number of particles emitted = " < 0.0) + massFinalFrag = G4ParticleTable::GetParticleTable()->GetIonTable()-> + GetIonMass(ZF,AF); + totalEpost += massFinalFrag; +// +// +// Add the total energy from the fragment. Note that the fragment is assumed +// to be de-excited and does not undergo photo-evaporation .... I did mention +// this is a bit of a crude model? +// + G4double massPreFrag = theNucleus.GetGroundStateMass(); + G4double totalEpre = massPreFrag + ex; + G4double excess = totalEpre - totalEpost; +// G4Fragment *resultNucleus(theNucleus); + G4Fragment *resultNucleus = new G4Fragment(A, Z, theNucleus.GetMomentum()); + G4ThreeVector boost(0.0,0.0,0.0); + G4int nEvap = 0; + if (produceSecondaries && evapType.size()>0) + { + if (excess > 0.0) + { + SelectSecondariesByEvaporation (resultNucleus); + nEvap = fragmentVector->size(); + boost = resultNucleus->GetMomentum().findBoostToCM(); + if (evapType.size() > 0) + SelectSecondariesByDefault (boost); + } + else + SelectSecondariesByDefault(G4ThreeVector(0.0,0.0,0.0)); + } + if (AF > 0) + { + G4double mass = G4ParticleTable::GetParticleTable()->GetIonTable()-> + GetIonMass(ZF,AF); + G4double e = mass + 10.0*eV; + G4double p = sqrt(e*e-mass*mass); + G4ThreeVector direction(0.0,0.0,1.0); + G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e); + lorentzVector.boost(-boost); + *resultNucleus = G4Fragment(AF, ZF, lorentzVector); + fragmentVector->push_back(resultNucleus); + } +// +// +// Provide verbose output on the ablation products if requested. +// + if (verboseLevel >= 2) + { + if (nEvap > 0) + { + G4cout <<"----------------------" <begin(); iter != fragmentVector->end(); ++iter) + { + if (ie == nEvap) + { + G4cout <<*iter < theChannels; + theChannels.clear(); + VectorOfFragmentTypes::iterator iter; + std::vector iters; + iters.clear(); + iter = std::find(evapType.begin(), evapType.end(), G4Alpha::Alpha()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4AlphaEvaporationChannel); + iters.push_back(iter); + } + iter = std::find(evapType.begin(), evapType.end(), G4He3::He3()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4He3EvaporationChannel); + iters.push_back(iter); + } + iter = std::find(evapType.begin(), evapType.end(), G4Triton::Triton()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4TritonEvaporationChannel); + iters.push_back(iter); + } + iter = std::find(evapType.begin(), evapType.end(), G4Deuteron::Deuteron()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4DeuteronEvaporationChannel); + iters.push_back(iter); + } + iter = std::find(evapType.begin(), evapType.end(), G4Proton::Proton()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4ProtonEvaporationChannel); + iters.push_back(iter); + } + iter = std::find(evapType.begin(), evapType.end(), G4Neutron::Neutron()); + if (iter != evapType.end()) + { + theChannels.push_back(new G4NeutronEvaporationChannel); + iters.push_back(iter); + } + G4int nChannels = theChannels.size(); + + std::vector::iterator iterEv; + for (iterEv=theChannels.begin(); iterEv!=theChannels.end(); iterEv++) + (*iterEv)->Initialize(*intermediateNucleus); + G4double totalProb = std::accumulate(theChannels.begin(), + theChannels.end(), 0.0, SumProbabilities()); + if (totalProb > 0.0) + { +// +// +// The emission probability for at least one of the evaporation channels is +// positive, therefore work out which one should be selected and decay +// the nucleus. +// + G4double totalProb1 = 0.0; + G4double probEvapType[6] = {0.0}; + for (G4int ich=0; ichGetEmissionProbability(); + probEvapType[ich] = totalProb1 / totalProb; + } + G4double xi = G4UniformRand(); + G4int i = 0; + for (i=0; i nChannels) i = nChannels - 1; + G4FragmentVector *evaporationResult = theChannels[i]-> + BreakUp(*intermediateNucleus); + fragmentVector->push_back((*evaporationResult)[0]); + *intermediateNucleus = *(*evaporationResult)[1]; + delete evaporationResult->back(); + delete evaporationResult; + evapType.erase(iters[i]); + } + else + { +// +// +// Probability for further evaporation is nil so have to escape from this +// routine and set the energies of the secondaries to 10eV. +// + evaporate = false; + } + } + + return; +} +//////////////////////////////////////////////////////////////////////////////// +// +void G4WilsonAblationModel::SelectSecondariesByDefault (G4ThreeVector boost) +{ + for (unsigned i=0; iGetPDGMass(); + G4double e = mass + 10.0*eV; + G4double p = sqrt(e*e-mass*mass); + G4double costheta = 2.0*G4UniformRand() - 1.0; + G4double sintheta = sqrt((1.0 - costheta)*(1.0 + costheta)); + G4double phi = twopi * G4UniformRand() * rad; + G4ThreeVector direction(sintheta*cos(phi),sintheta*sin(phi),costheta); + G4LorentzVector lorentzVector = G4LorentzVector(direction*p, e); + lorentzVector.boost(-boost); + G4Fragment *fragment = + new G4Fragment(lorentzVector, type); + fragmentVector->push_back(fragment); + } +} +//////////////////////////////////////////////////////////////////////////////// +// +void G4WilsonAblationModel::PrintWelcomeMessage () +{ + G4cout < Configurations; + struct DeleteConfiguration + { + template + void operator()(const T* ptr) const + { + delete ptr; + } + }; + + }; diff --git a/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiSplitter.cc b/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiSplitter.cc index 74433539c3..a5c4b9d6d3 100644 --- a/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiSplitter.cc +++ b/source/processes/hadronic/models/de_excitation/fermi_breakup/src/G4FermiSplitter.cc @@ -50,7 +50,11 @@ G4int G4FermiSplitter::Initialize(const G4int a, const G4int z, const G4int n) A = a; Z = z; K = n; + splits.clear(); + + // Form all possible partition by combination + // of A partitions and Z partitions (Z partitions include null parts) G4FermiIntegerPartition PartitionA; PartitionA.Initialize(A,K); do // for each partition of A @@ -89,25 +93,47 @@ G4int G4FermiSplitter::Initialize(const G4int a, const G4int z, const G4int n) // fragments pool if (static_cast(multiplicities.size()) == K) { - splits.clear(); - splits.resize(num_rows); + std::vector > tsplits; + tsplits.clear(); + tsplits.resize(num_rows); + G4int group_size = num_rows; for (G4int i = 0; i < K; i++) - { + { az_pair = std::make_pair(partA[i],partZ[i]); - for (G4int j = 0; j < num_rows/multiplicities[i]; j++) - { // number of times that we have to introduce the same data - G4int k=0; - std::multimap, const G4VFermiFragment*, - std::less > >::iterator pos; - for (pos = theFragmentsPool->LowerBound(az_pair); - pos != theFragmentsPool->UpperBound(az_pair); ++pos) - { - G4int tmp = j*multiplicities[i]+k; - splits[tmp].push_back(pos->second); - k++; - } - } - } + group_size /= multiplicities[i]; + std::multimap, const G4VFermiFragment*, + std::less > >::iterator pos; + pos = theFragmentsPool->LowerBound(az_pair); + for (G4int k = 0; k < num_rows/group_size; k++) + { + if (pos == theFragmentsPool->UpperBound(az_pair)) + { + pos = theFragmentsPool->LowerBound(az_pair); + } + for (G4int l = 0; l < group_size; l++) + { + tsplits[k*group_size+l].push_back(pos->second); + } + pos++; + } + } + // Remove wrong splits + for (std::vector >::iterator + itsplits1 = tsplits.begin(); itsplits1 != tsplits.end(); itsplits1++) + { + std::sort((itsplits1)->begin(), (itsplits1)->end(), + std::greater()); + } + // add splits (eliminating a few of them that are repeated) + std::vector >::iterator + itlastsplit = tsplits.begin(); + splits.push_back((*itlastsplit)); + for (std::vector >::iterator + itsplits2 = itlastsplit+1; itsplits2 != tsplits.end(); itsplits2++) + { + if ( (*itsplits2) != (*itlastsplit)) splits.push_back((*itsplits2)); + itlastsplit++; + } } } while (PartitionZ.Next()); diff --git a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4E1Probability.cc b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4E1Probability.cc index 5898ff7c67..35358728a1 100644 --- a/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4E1Probability.cc +++ b/source/processes/hadronic/models/de_excitation/photon_evaporation/src/G4E1Probability.cc @@ -87,7 +87,7 @@ G4double G4E1Probability::EmissionProbDensity(const G4Fragment& frag, // For now, just use the constant approximation (not reliable near magic // nuclei). - G4ConstantLevelDensityParameter a; + static G4ConstantLevelDensityParameter a; G4double aLevelDensityParam = a.LevelDensityParameter(static_cast(Afrag), static_cast(Zfrag), @@ -106,7 +106,7 @@ G4double G4E1Probability::EmissionProbDensity(const G4Fragment& frag, G4double Egdp = (40.3 / pow(Afrag,0.2) )*MeV; G4double GammaR = 0.30 * Egdp; - G4double normC = 1.0 / ((pi * hbarc)*(pi * hbarc)); + static G4double normC = 1.0 / ((pi * hbarc)*(pi * hbarc)); // CD //cout<<" PROB TESTS "<SetEvaporation(theEvaporation); + theExcitationHandler->SetFermiModel(theFermiBreakUp); + theExcitationHandler->SetMultiFragmentation(theMF); + theExcitationHandler->SetMaxAandZForFermiBreakUp(12, 6); + theExcitationHandler->SetMinEForMultiFrag(5.0*MeV); + handlerDefinedInternally = true; +// +// +// This EM dissociation model needs access to the cross-sections held in +// G4EMDissociationCrossSection. +// + dissociationCrossSection = new G4EMDissociationCrossSection; + thePhotonSpectrum = new G4EMDissociationSpectrum; +// +// +// Set the minimum and maximum range for the model (despite nomanclature, this +// is in energy per nucleon number). +// + SetMinEnergy(100.0*MeV); + SetMaxEnergy(500.0*GeV); +// +// +// Set the default verbose level to 0 - no output. +// + verboseLevel = 0; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4EMDissociation::G4EMDissociation (G4ExcitationHandler *aExcitationHandler) +{ +// +// +// Send message to stdout to advise that the G4EMDissociation model is being +// used. +// + PrintWelcomeMessage(); + + theExcitationHandler = aExcitationHandler; + handlerDefinedInternally = false; +// +// +// This EM dissociation model needs access to the cross-sections held in +// G4EMDissociationCrossSection. +// + dissociationCrossSection = new G4EMDissociationCrossSection; + thePhotonSpectrum = new G4EMDissociationSpectrum; +// +// +// Set the minimum and maximum range for the model (despite nomanclature, this +// is in energy per nucleon number). +// + SetMinEnergy(100.0*MeV); + SetMaxEnergy(500.0*GeV); +// +// +// Set the default verbose level to 0 - no output. +// + verboseLevel = 0; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4EMDissociation::~G4EMDissociation () +{ + if (handlerDefinedInternally) delete theExcitationHandler; + delete dissociationCrossSection; + delete thePhotonSpectrum; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4HadFinalState *G4EMDissociation::ApplyYourself + (const G4HadProjectile &theTrack, G4Nucleus &theTarget) +{ +// +// +// The secondaries will be returned in G4HadFinalState &theParticleChange - +// initialise this. +// + theParticleChange.Clear(); + theParticleChange.SetStatusChange(stopAndKill); +// +// +// Get relevant information about the projectile and target (A, Z) and +// energy/nuc, momentum, velocity, Lorentz factor and rest-mass of the +// projectile. +// + const G4ParticleDefinition *definitionP = theTrack.GetDefinition(); + const G4double AP = definitionP->GetBaryonNumber(); + const G4double ZP = definitionP->GetPDGCharge(); + G4LorentzVector pP = theTrack.Get4Momentum(); + G4double E = theTrack.GetKineticEnergy()/AP; + G4double MP = theTrack.GetTotalEnergy() - E*AP; + G4double b = pP.beta(); + G4double AT = theTarget.GetN(); + G4double ZT = theTarget.GetZ(); + G4double MT = G4NucleiProperties::GetNuclearMass(AT,ZT); +// +// +// Depending upon the verbosity level, output the initial information on the +// projectile and target. +// + if (verboseLevel >= 2) + { + G4cout.precision(6); + G4cout <<"########################################" + <<"########################################" + <GetClosestApproach(AP, ZP, AT, ZT, b); + G4PhysicsFreeVector *crossSectionP = dissociationCrossSection-> + GetCrossSectionForProjectile(AP, ZP, AT, ZT, b, bmin); + G4PhysicsFreeVector *crossSectionT = dissociationCrossSection-> + GetCrossSectionForTarget(AP, ZP, AT, ZT, b, bmin); + + G4double totCrossSectionP = (*crossSectionP)[0]+(*crossSectionP)[1]; + G4double totCrossSectionT = (*crossSectionT)[0]+(*crossSectionT)[1]; +// +// +// Now sample whether the interaction involved EM dissociation of the projectile +// or the target. +// + if (G4UniformRand() < + totCrossSectionP / (totCrossSectionP + totCrossSectionT)) + { +// +// +// It was the projectile which underwent EM dissociation. Define the Lorentz +// boost to be applied to the secondaries, and sample whether a proton or a +// neutron was ejected. Then determine the energy of the virtual gamma ray +// which passed from the target nucleus ... this will be used to define the +// excitation of the projectile. +// + mass = MP; + if (G4UniformRand() < dissociationCrossSection-> + GetWilsonProbabilityForProtonDissociation (AP, ZP)) + { + if (verboseLevel >= 2) + G4cout <<"Projectile underwent EM dissociation producing a proton" + < + GetIon((G4int) ZP-1, (G4int) AP-1, 0.0); + } + else + { + if (verboseLevel >= 2) + G4cout <<"Projectile underwent EM dissociation producing a neutron" + < + GetIon((G4int) ZP, (G4int) AP-1, 0.0); + } + if (G4UniformRand() < (*crossSectionP)[0]/totCrossSectionP) + { + Eg = crossSectionP->GetLowEdgeEnergy(0); + if (verboseLevel >= 2) + G4cout <<"Transition type was E1" <GetLowEdgeEnergy(1); + if (verboseLevel >= 2) + G4cout <<"Transition type was E2" < + GetWilsonProbabilityForProtonDissociation (AT, ZT)) + { + if (verboseLevel >= 2) + G4cout <<"Target underwent EM dissociation producing a proton" + < + GetIon((G4int) ZT-1, (G4int) AT-1, 0.0); + } + else + { + if (verboseLevel >= 2) + G4cout <<"Target underwent EM dissociation producing a neutron" + < + GetIon((G4int) ZT, (G4int) AT-1, 0.0); + } + if (G4UniformRand() < (*crossSectionT)[0]/totCrossSectionT) + { + Eg = crossSectionT->GetLowEdgeEnergy(0); + if (verboseLevel >= 2) + G4cout <<"Transition type was E1" <GetLowEdgeEnergy(1); + if (verboseLevel >= 2) + G4cout <<"Transition type was E2" <(definitionP), v, E*AP-Eg); + theParticleChange.AddSecondary (changedP); + if (verboseLevel >= 2) + { + G4cout <<"Projectile change:" <DumpInfo(); + } + } +// +// +// Perform a two-body decay based on the restmass energy of the parent and +// gamma-ray, and the masses of the daughters. In the frame of reference of +// the nucles, the angular distribution is sampled isotropically, but the +// the nucleon and secondary nucleus are boosted if they've come from the +// projectile. +// + G4double e = mass + Eg; + G4double m1 = typeNucleon->GetPDGMass(); + G4double m2 = typeDaughter->GetPDGMass(); + G4double pp = (e+m1+m2)*(e+m1-m2)*(e-m1+m2)*(e-m1-m2)/(4.0*e*e); + if (pp < 0.0) + { + pp = 1.0*eV; +// if (verboseLevel >`= 1) +// { +// G4cout <<"IN G4EMDissociation::ApplyYoursef" <Set4Momentum(dynamicNucleon->Get4Momentum().boost(-boost)); + G4DynamicParticle *dynamicDaughter = + new G4DynamicParticle(typeDaughter, -direction*pp); + dynamicDaughter->Set4Momentum(dynamicDaughter->Get4Momentum().boost(-boost)); +// +// +// The "decay" products have to be transferred to the G4HadFinalState object. +// Furthermore, the residual nucleus should be de-excited. +// + theParticleChange.AddSecondary (dynamicNucleon); + if (verboseLevel >= 2) + { + G4cout <<"Nucleon from the EMD process:" <DumpInfo(); + } + + G4Fragment *theFragment = new + G4Fragment((G4int) typeDaughter->GetBaryonNumber(), + (G4int) typeDaughter->GetPDGCharge(), dynamicDaughter->Get4Momentum()); + if (verboseLevel >= 2) + { + G4cout <<"Dynamic properties of the prefragment:" <DumpInfo(); + G4cout <<"Nuclear properties of the prefragment:" <BreakItUp(*theFragment); + delete theFragment; + theFragment = NULL; + + G4ReactionProductVector::iterator iter; + for (iter = products->begin(); iter != products->end(); ++iter) + { + G4DynamicParticle *secondary = + new G4DynamicParticle((*iter)->GetDefinition(), + (*iter)->GetTotalEnergy(), (*iter)->GetMomentum()); + theParticleChange.AddSecondary (secondary); + } + + if (verboseLevel >= 2) + G4cout <<"########################################" + <<"########################################" + <0 ) G4cout << " dis1/2 square" << dis1 <<" "<< dis2 << G4endl; +// collisionTime = GetTimeToClosestApproach(trk1,trk2); + } if (collisionTime > 0) { + static const G4double maxCrossSection = 500*millibarn; + if(0.7*pi*distance_fast>maxCrossSection) return time; + + G4LorentzVector mom2(0,0,0,trk2.Get4Momentum().mag()); + +// G4ThreeVector momLab = mom1.vect();// frozen Nucleus - mom2.vect(); +// G4ThreeVector posLab = trk1.GetPosition() - trk2.GetPosition(); +// G4double disLab=posLab * posLab - (posLab*momLab) * (posLab*momLab) /(momLab.mag2()); + G4LorentzRotation toCMSFrame((-1)*(mom1 + mom2).boostVector()); mom1 = toCMSFrame * mom1; mom2 = toCMSFrame * mom2; @@ -101,9 +114,16 @@ G4double G4Scatterer::GetTimeToInteraction(const G4KineticTrack& trk1, // Calculate the impact parameter - G4double distance = pos * pos - (pos*mom) * (pos*mom) / (mom*mom); + G4double distance = pos * pos - (pos*mom) * (pos*mom) / (mom.mag2()); + +// G4cout << " disDiff " << distance-disLab << " " << disLab +// << " " << abs(distance-disLab)/distance << G4endl +// << " mom/Lab " << mom << " " << momLab << G4endl +// << " pos/Lab " << pos << " " << posLab +// << G4endl; + // global optimization - static const G4double maxCrossSection = 500*millibarn; +// static const G4double maxCrossSection = 500*millibarn; if(pi*distance>maxCrossSection) return time; // charged particles special @@ -112,6 +132,7 @@ G4double G4Scatterer::GetTimeToInteraction(const G4KineticTrack& trk1, abs(trk2.GetDefinition()->GetPDGCharge())>0.1 && pi*distance>maxChargedCrossSection) return time; + G4double sqrtS = (trk1.Get4Momentum() + trk2.Get4Momentum()).mag(); // neutrons special if(( trk1.GetDefinition() == G4Neutron::Neutron() || trk1.GetDefinition() == G4Neutron::Neutron() ) && @@ -149,6 +170,9 @@ G4double G4Scatterer::GetTimeToInteraction(const G4KineticTrack& trk1, * if(1) * return time; */ + + if ((trk1.GetActualMass()+trk2.GetActualMass()) > sqrtS) return time; + G4VCollision* collision = FindCollision(trk1,trk2); @@ -229,20 +253,6 @@ G4double G4Scatterer::GetTimeToInteraction(const G4KineticTrack& trk1, // End of debugging */ } - } - else - { - /* - // For debugging - G4cout << "G4Scatterer - Infinite time to interaction" - << ": sqrtS " << sqrtS - << ", mass1 = " << trk1.GetDefinition()->GetPDGMass() - << ", mass2 = " << trk2.GetDefinition()->GetPDGMass() - << G4endl; - throw G4HadronicException(__FILE__, __LINE__, "G4Scatterer TimeToInteraction is INF"); - // End of debugging - */ - } return time; } diff --git a/source/processes/hadronic/models/low_energy/src/G4LElastic.cc b/source/processes/hadronic/models/low_energy/src/G4LElastic.cc index 0dbd12c591..fb8478f48a 100644 --- a/source/processes/hadronic/models/low_energy/src/G4LElastic.cc +++ b/source/processes/hadronic/models/low_energy/src/G4LElastic.cc @@ -260,8 +260,16 @@ G4LElastic::ApplyYourself(const G4HadProjectile& aTrack, G4Nucleus& targetNucleu } else { - theParticleChange.SetMomentumChange(pxnew, pynew, pznew); - theParticleChange.SetEnergyChange(sqrt(m1*m1+it0.mag2())-m1); + try + { + theParticleChange.SetMomentumChange(pxnew, pynew, pznew); + theParticleChange.SetEnergyChange(sqrt(m1*m1+it0.mag2())-m1); + } + catch(G4HadronicException) + { + std::cerr << "GHADException originating from components of G4LElastic"<FindIon(Z,A,0,Z); G4ThreeVector it(pxre*GeV, pyre*GeV, pzre*GeV); G4DynamicParticle * aSec = diff --git a/source/processes/hadronic/models/management/include/G4HadronicInteraction.hh b/source/processes/hadronic/models/management/include/G4HadronicInteraction.hh index 24e426b664..c6f5b9c843 100644 --- a/source/processes/hadronic/models/management/include/G4HadronicInteraction.hh +++ b/source/processes/hadronic/models/management/include/G4HadronicInteraction.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4HadronicInteraction.hh,v 1.3 2003/11/03 17:54:18 hpw Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HadronicInteraction.hh,v 1.5 2004/05/26 09:56:52 hpw Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Hadronic Interaction abstract base class // This class is the base class for the model classes. @@ -98,32 +98,28 @@ inline G4double GetMinEnergy() const { return theMinEnergy; } - G4double GetMinEnergy( const G4Material *aMaterial, - const G4Element *anElement ) const; + virtual G4double GetMinEnergy( const G4Material *aMaterial, + const G4Element *anElement ) const; inline void SetMinEnergy( const G4double anEnergy ) { theMinEnergy = anEnergy; } - void SetMinEnergy( G4double anEnergy, - G4Element *anElement ); + virtual void SetMinEnergy( G4double anEnergy, G4Element *anElement ); - void SetMinEnergy( G4double anEnergy, - G4Material *aMaterial ); + virtual void SetMinEnergy( G4double anEnergy, G4Material *aMaterial ); inline G4double GetMaxEnergy() const { return theMaxEnergy; } - G4double GetMaxEnergy( const G4Material *aMaterial, - const G4Element *anElement ) const; + virtual G4double GetMaxEnergy( const G4Material *aMaterial, + const G4Element *anElement ) const; inline void SetMaxEnergy( const G4double anEnergy ) { theMaxEnergy = anEnergy; } - void SetMaxEnergy( G4double anEnergy, - G4Element *anElement ); + virtual void SetMaxEnergy( G4double anEnergy, G4Element *anElement ); - void SetMaxEnergy( G4double anEnergy, - G4Material *aMaterial ); + virtual void SetMaxEnergy( G4double anEnergy, G4Material *aMaterial ); inline const G4HadronicInteraction *GetMyPointer() const { return this; } @@ -139,29 +135,32 @@ public: // With description virtual G4HadFinalState *ApplyYourself( const G4HadProjectile &aTrack, G4Nucleus & targetNucleus ) = 0; + public: // Without description - void DeActivateFor( G4Material *aMaterial ); + virtual void DeActivateFor( G4Material *aMaterial ); - void ActivateFor( G4Material *aMaterial ) + virtual void ActivateFor( G4Material *aMaterial ) { Block(); SetMaxEnergy(GetMaxEnergy(), aMaterial); SetMinEnergy(GetMinEnergy(), aMaterial); } - void DeActivateFor( G4Element *anElement ); - void ActivateFor( G4Element *anElement ) + virtual void DeActivateFor( G4Element *anElement ); + virtual void ActivateFor( G4Element *anElement ) { Block(); SetMaxEnergy(GetMaxEnergy(), anElement); SetMinEnergy(GetMinEnergy(), anElement); } - G4bool IsBlocked( const G4Material *aMaterial ) const; + virtual G4bool IsBlocked( const G4Material *aMaterial ) const; - G4bool IsBlocked( const G4Element *anElement) const; + virtual G4bool IsBlocked( const G4Element *anElement) const; + virtual G4bool IsApplicable(const G4HadProjectile &/*aTrack*/, + G4Nucleus & /*targetNucleus*/){ return true;} protected: G4HadFinalState theParticleChange; diff --git a/source/processes/hadronic/models/management/src/G4InelasticInteraction.cc b/source/processes/hadronic/models/management/src/G4InelasticInteraction.cc index 18da8c727e..d8e3077133 100644 --- a/source/processes/hadronic/models/management/src/G4InelasticInteraction.cc +++ b/source/processes/hadronic/models/management/src/G4InelasticInteraction.cc @@ -402,9 +402,11 @@ if( p > DBL_MIN ) theParticleChange.SetMomentumChange( m.x()/p, m.y()/p, m.z()/p ); else - theParticleChange.SetMomentumChange( 0.0, 0.0, 0.0 ); + theParticleChange.SetMomentumChange( 1.0, 0.0, 0.0 ); - theParticleChange.SetEnergyChange( currentParticle.GetKineticEnergy() ); + G4double aE = currentParticle.GetKineticEnergy(); + if (fabs(aE)<.1*eV) aE=.1*eV; + theParticleChange.SetEnergyChange( aE ); } if( targetParticle.GetMass() > 0.0 ) // targetParticle can be eliminated in TwoBody { diff --git a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPData.hh b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPData.hh index 984c8fb64f..f9d98f3d76 100644 --- a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPData.hh +++ b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPData.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4NeutronHPData.hh,v 1.6 2002/12/12 19:18:10 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4NeutronHPData.hh,v 1.7 2004/05/24 10:32:59 hpw Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Hadronic Process: Very Low Energy Neutron X-Sections // original by H.P. Wellisch, TRIUMF, 14-Feb-97 @@ -67,19 +67,13 @@ public: G4PhysicsVector * DoPhysicsVector(G4NeutronHPVector * theVector); - static G4NeutronHPData * Instance() - { - if(theCrossSectionData==NULL) theCrossSectionData = new G4NeutronHPData; - return theCrossSectionData; - } + static G4NeutronHPData * Instance(); private: G4NeutronHPElementData * theData; G4int numEle; - static G4NeutronHPData * theCrossSectionData; - }; #endif diff --git a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPFission.hh b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPFission.hh index fb498731b6..b4fa8c8c09 100644 --- a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPFission.hh +++ b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPFission.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4NeutronHPFission.hh,v 1.7 2003/07/01 15:58:36 hpw Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4NeutronHPFission.hh,v 1.8 2004/05/24 10:32:59 hpw Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Hadronic Process: High Precision low E neutron tracking // original by H.P. Wellisch, TRIUMF, 14-Feb-97 @@ -68,7 +68,7 @@ class G4NeutronHPFission : public G4HadronicInteraction G4NeutronHPChannel * theFission; G4String dirName; G4int numEle; - static G4String theNames[3]; + // static G4String theNames[3]; }; #endif diff --git a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPGamma.hh b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPGamma.hh index e96efb4d19..41029ce995 100644 --- a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPGamma.hh +++ b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPGamma.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4NeutronHPGamma.hh,v 1.10 2003/06/16 17:10:44 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4NeutronHPGamma.hh,v 1.11 2004/05/24 10:32:59 hpw Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4NeutronHPGamma_h #define G4NeutronHPGamma_h 1 @@ -39,12 +39,8 @@ class G4NeutronHPGamma { public: - G4NeutronHPGamma() - { - next = NULL; - instancecount ++; - } - ~G4NeutronHPGamma() {instancecount--;} + G4NeutronHPGamma(); + ~G4NeutronHPGamma(); G4bool Init(std::ifstream & aDataFile); diff --git a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPNames.hh b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPNames.hh index fa7924d938..f63d622f6a 100644 --- a/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPNames.hh +++ b/source/processes/hadronic/models/neutron_hp/include/G4NeutronHPNames.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4NeutronHPNames.hh,v 1.11 2003/06/16 17:10:57 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4NeutronHPNames.hh,v 1.12 2004/05/24 10:32:59 hpw Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4NeutronHPNames_h #define G4NeutronHPNames_h 1 @@ -43,7 +43,7 @@ class G4NeutronHPNames ~G4NeutronHPNames(){} G4NeutronHPDataUsed GetName(G4int A, G4int Z, G4String base, G4String rest, G4bool & active); - G4String GetName(G4int i) { return theString[i]; } + G4String GetName(G4int i); void SetMaxOffSet(G4int anOffset) { theMaxOffSet = anOffset; } public: diff --git a/source/processes/hadronic/models/neutron_hp/src/G4NeutronHPData.cc b/source/processes/hadronic/models/neutron_hp/src/G4NeutronHPData.cc index 664a9b6aa5..029f343406 100644 --- a/source/processes/hadronic/models/neutron_hp/src/G4NeutronHPData.cc +++ b/source/processes/hadronic/models/neutron_hp/src/G4NeutronHPData.cc @@ -27,8 +27,6 @@ #include "G4NeutronHPData.hh" #include "G4LPhysicsFreeVector.hh" - G4NeutronHPData * G4NeutronHPData::theCrossSectionData = NULL; - G4NeutronHPData::G4NeutronHPData() { numEle = G4Element::GetNumberOfElements(); @@ -45,6 +43,12 @@ delete [] theData; } + G4NeutronHPData * G4NeutronHPData::Instance() + { + static G4NeutronHPData theCrossSectionData; + return &theCrossSectionData; + } + G4PhysicsVector * G4NeutronHPData::DoPhysicsVector(G4NeutronHPVector * theVector) { // G4cout << "Entered G4NeutronHPData::DoPhysicsVector."<(incidentParticle->GetDefinition()) ); - theNeutron.SetMomentum( incidentParticle->Get4Momentum().vect() ); - theNeutron.SetKineticEnergy( eKinetic ); + theResult.Clear(); + G4double eKinetic = theTrack.GetKineticEnergy(); + const G4HadProjectile *incidentParticle = &theTrack; + G4ReactionProduct theNeutron( const_cast(incidentParticle->GetDefinition()) ); + theNeutron.SetMomentum( incidentParticle->Get4Momentum().vect() ); + theNeutron.SetKineticEnergy( eKinetic ); // prepare target - G4Nucleus aNucleus; - G4ReactionProduct theTarget; - G4double targetMass = theFS.GetMass(); - G4ThreeVector neuVelo = (1./incidentParticle->GetDefinition()->GetPDGMass())*theNeutron.GetMomentum(); - theTarget = aNucleus.GetBiasedThermalNucleus( targetMass, neuVelo, theTrack.GetMaterial()->GetTemperature()); - + G4Nucleus aNucleus; + G4ReactionProduct theTarget; + G4double targetMass = theFS.GetMass(); + G4ThreeVector neuVelo = (1./incidentParticle->GetDefinition()->GetPDGMass())*theNeutron.GetMomentum(); + theTarget = aNucleus.GetBiasedThermalNucleus( targetMass, neuVelo, theTrack.GetMaterial()->GetTemperature()); + // set neutron and target in the FS classes - theFS.SetNeutron(theNeutron); - theFS.SetTarget(theTarget); - theFC.SetNeutron(theNeutron); - theFC.SetTarget(theTarget); - theSC.SetNeutron(theNeutron); - theSC.SetTarget(theTarget); - theTC.SetNeutron(theNeutron); - theTC.SetTarget(theTarget); - theLC.SetNeutron(theNeutron); - theLC.SetTarget(theTarget); - + theFS.SetNeutron(theNeutron); + theFS.SetTarget(theTarget); + theFC.SetNeutron(theNeutron); + theFC.SetTarget(theTarget); + theSC.SetNeutron(theNeutron); + theSC.SetTarget(theTarget); + theTC.SetNeutron(theNeutron); + theTC.SetTarget(theTarget); + theLC.SetNeutron(theNeutron); + theLC.SetTarget(theTarget); + // boost to target rest system and decide on channel. - theNeutron.Lorentz(theNeutron, -1*theTarget); + theNeutron.Lorentz(theNeutron, -1*theTarget); // dice the photons - G4DynamicParticleVector * thePhotons; - thePhotons = theFS.GetPhotons(); + G4DynamicParticleVector * thePhotons; + thePhotons = theFS.GetPhotons(); // select the FS in charge - eKinetic = theNeutron.GetKineticEnergy(); - G4double xSec[4]; - xSec[0] = theFC.GetXsec(eKinetic); - xSec[1] = xSec[0]+theSC.GetXsec(eKinetic); - xSec[2] = xSec[1]+theTC.GetXsec(eKinetic); - xSec[3] = xSec[2]+theLC.GetXsec(eKinetic); - G4int it; - unsigned int i=0; - G4double random = G4UniformRand(); - if(xSec[3]==0) - { - it=-1; - } - else - { - for(i=0; i<4; i++) - { - it =i; - if(randomsize(); - for(i=0; isize(); i++) - { - theResult.AddSecondary(theNeutrons->operator[](i)); - } - delete theNeutrons; - - G4DynamicParticleVector * theDelayed = NULL; - theDelayed = theFS.ApplyYourself(0, delayed, theDecayConstants); - for(i=0; isize(); i++) - { - G4double time = -log(G4UniformRand())/theDecayConstants[i]; - time += theTrack.GetGlobalTime(); - G4HadSecondary * track = new G4HadSecondary(theDelayed->operator[](i)); - track->SetTime(time); - theResult.AddSecondary(track); - } - delete theDelayed; - } - else - { -// cout << " all = "<size(); - G4int i0; - for(i0=0; i0operator[](i0)); - } - for(i0=Prompt; i0operator[](i)); - track->SetTime(time); - theResult.AddSecondary(track); - } - delete theNeutrons; - } - delete [] theDecayConstants; -// cout << "all delayed "<size(); - for(i=0; isize(); i++) - { - theResult.AddSecondary(thePhotons->operator[](i)); - } - delete thePhotons; - } + G4double * theDecayConstants; + + if(theNeutrons != NULL) + { + theDecayConstants = new G4double[delayed]; + G4int nPhotons = 0; + if(thePhotons!=NULL) nPhotons = thePhotons->size(); + for(i=0; isize(); i++) + { + theResult.AddSecondary(theNeutrons->operator[](i)); + } + delete theNeutrons; + + G4DynamicParticleVector * theDelayed = NULL; + theDelayed = theFS.ApplyYourself(0, delayed, theDecayConstants); + for(i=0; isize(); i++) + { + G4double time = -log(G4UniformRand())/theDecayConstants[i]; + time += theTrack.GetGlobalTime(); + G4HadSecondary * track = new G4HadSecondary(theDelayed->operator[](i)); + track->SetTime(time); + theResult.AddSecondary(track); + } + delete theDelayed; + } + else + { +// cout << " all = "<size(); + G4int i0; + for(i0=0; i0operator[](i0)); + } + for(i0=Prompt; i0operator[](i)); + track->SetTime(time); + theResult.AddSecondary(track); + } + delete theNeutrons; + } + delete [] theDecayConstants; +// cout << "all delayed "<size(); + for(i=0; ioperator[](i)); + } + delete thePhotons; + } -// do some rotating, if that helps to conserve momentum @@@@ - // finally deal with local energy depositions. // G4cout <<"Number of secondaries = "< 0 || result.GetNumberOfCharged() > 0) && - (G4UniformRand() <= static_cast(result.GetZ())/static_cast(result.GetA()))) + (G4UniformRand() <= static_cast(result.GetZ()-result.GetNumberOfCharged())/ + static_cast(result.GetA()-Nexcitons))) { result.SetNumberOfCharged(result.GetNumberOfCharged()+deltaN/2); } // Number of charged can not be greater that number of particles - if ( result.GetNumberOfParticles() < result.GetNumberOfCharged() ) { - result.SetNumberOfCharged(result.GetNumberOfParticles()); - } + if ( result.GetNumberOfParticles() < result.GetNumberOfCharged() ) + { + result.SetNumberOfCharged(result.GetNumberOfParticles()); + } return result; } diff --git a/source/processes/hadronic/models/util/include/G4GeneralPhaseSpaceDecay.hh b/source/processes/hadronic/models/util/include/G4GeneralPhaseSpaceDecay.hh index c616259632..1ed328bc0e 100644 --- a/source/processes/hadronic/models/util/include/G4GeneralPhaseSpaceDecay.hh +++ b/source/processes/hadronic/models/util/include/G4GeneralPhaseSpaceDecay.hh @@ -37,6 +37,7 @@ #include "G4ios.hh" #include "globals.hh" #include "G4VDecayChannel.hh" +#include "G4HadronicException.hh" class G4GeneralPhaseSpaceDecay : public G4VDecayChannel { @@ -59,6 +60,15 @@ class G4GeneralPhaseSpaceDecay : public G4VDecayChannel const G4String& theDaughterName2 = "", const G4String& theDaughterName3 = ""); + G4GeneralPhaseSpaceDecay(const G4String& theParentName, + G4double theParentMass, + G4double theBR, + G4int theNumberOfDaughters, + const G4String& theDaughterName1, + const G4String& theDaughterName2 , + const G4String& theDaughterName3 , + const G4double * masses); + // Destructor virtual ~G4GeneralPhaseSpaceDecay(); @@ -76,6 +86,7 @@ class G4GeneralPhaseSpaceDecay : public G4VDecayChannel private: G4double parentmass; + const G4double * theDaughterMasses; }; @@ -97,6 +108,10 @@ inline G4double G4GeneralPhaseSpaceDecay::Pmx(G4double e, G4double p1, G4double p2) { // calculate momentum of daughter particles in two-body decay + if (e-p1-p2 < 0 ) + { + G4HadronicException(__FILE__, __LINE__, "G4GeneralPhaseSpaceDecay::Pmx energy in cms > mass1+mass2"); + } G4double ppp = (e+p1+p2)*(e+p1-p2)*(e-p1+p2)*(e-p1-p2)/(4.0*e*e); if (ppp>0) return sqrt(ppp); else return -1.; diff --git a/source/processes/hadronic/models/util/include/G4WilsonRadius.hh b/source/processes/hadronic/models/util/include/G4WilsonRadius.hh new file mode 100644 index 0000000000..a9b83b9664 --- /dev/null +++ b/source/processes/hadronic/models/util/include/G4WilsonRadius.hh @@ -0,0 +1,91 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4WilsonRadius_h +#define G4WilsonRadius_h 1 +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4WilsonRadus.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 6 October 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// Class Description +// Provides functions to calculate the nuclear radius as used in the +// abrasion-ablation model (see Wilson, Tripathi, Cucinotta et al, NASA +// Technical Paper 3533, October 1995), and to determine total nuclear-nuclear +// cross-sections. The Algorithm comes from Tripathi, Cucinnota and Wilson, +// Nucl Instrum Meth Phys Res B, 152, pp425-431, 1999. +// +// Class Description - End +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "globals.hh" + +//////////////////////////////////////////////////////////////////////////////// +// +class G4WilsonRadius +{ + public: + G4WilsonRadius (); + ~G4WilsonRadius (); + + G4double GetWilsonRMSRadius (G4double A); + G4double GetWilsonRadius (G4double A); + + private: + G4double r0sq; + G4double factor; + G4double third; +}; +//////////////////////////////////////////////////////////////////////////////// +// +#endif diff --git a/source/processes/hadronic/models/util/src/G4Fancy3DNucleus.cc b/source/processes/hadronic/models/util/src/G4Fancy3DNucleus.cc index d7d97088dd..0621ce779e 100644 --- a/source/processes/hadronic/models/util/src/G4Fancy3DNucleus.cc +++ b/source/processes/hadronic/models/util/src/G4Fancy3DNucleus.cc @@ -271,45 +271,67 @@ void G4Fancy3DNucleus::ChooseNucleons() void G4Fancy3DNucleus::ChoosePositions() { G4int i=0; - G4ThreeVector aPos,center; + G4ThreeVector aPos, delta; + std::vector places; + places.reserve(myA); G4bool freeplace; + static G4double nd2 = sqr(nucleondistance); G4double maxR=GetNuclearRadius(0.01); // there are no nucleons at a // relative Density of 0.01 - + G4int jr=0; + G4int jx,jy; + G4double arand[600]; + G4double *prand=arand; +// G4int Attempt=0; while ( i < myA ) { do - { aPos=G4ThreeVector( (2*G4UniformRand()-1.), - (2*G4UniformRand()-1.), - (2*G4UniformRand()-1.)); + { +// ++Attempt; + if ( jr < 3 ) + { + jr=std::min(600,9*(myA - i)); + HepRandom::getTheEngine()->flatArray(jr, prand ); + } + jx=--jr; + jy=--jr; + aPos=G4ThreeVector( (2*arand[jx]-1.), + (2*arand[jy]-1.), + (2*arand[--jr]-1.)); } while (aPos.mag2() > 1. ); aPos *=maxR; G4double density=theDensity->GetRelativeDensity(aPos); if (G4UniformRand() < density) { freeplace= true; - G4double pFermi=theFermi.GetFermiMomentum(theDensity->GetDensity(aPos)); - // protons must at least have binding energy of CoulombBarrier, so - // assuming the Fermi energy corresponds to a potential, we must place these such - // that the Fermi Energy > CoulombBarrier - if (theNucleons[i].GetDefinition() == G4Proton::Proton()) - { - G4double eFermi= sqrt( sqr(pFermi) + sqr(theNucleons[i].GetDefinition()->GetPDGMass()) ) - - theNucleons[i].GetDefinition()->GetPDGMass(); - if (eFermi <= CoulombBarrier() ) freeplace=false; - } for( int j=0; j nucleondistance; + delta = places[j] - aPos; + freeplace= delta.mag2() > nd2; + } + + if ( freeplace ) + { + G4double pFermi=theFermi.GetFermiMomentum(theDensity->GetDensity(aPos)); + // protons must at least have binding energy of CoulombBarrier, so + // assuming the Fermi energy corresponds to a potential, we must place these such + // that the Fermi Energy > CoulombBarrier + if (theNucleons[i].GetDefinition() == G4Proton::Proton()) + { + G4double eFermi= sqrt( sqr(pFermi) + sqr(theNucleons[i].GetDefinition()->GetPDGMass()) ) + - theNucleons[i].GetDefinition()->GetPDGMass(); + if (eFermi <= CoulombBarrier() ) freeplace=false; + } } if ( freeplace ) { theNucleons[i].SetPosition(aPos); + places[i]=aPos; ++i; } } } +// G4cout << "Att " << myA << " " << Attempt << G4endl; } diff --git a/source/processes/hadronic/models/util/src/G4GeneralPhaseSpaceDecay.cc b/source/processes/hadronic/models/util/src/G4GeneralPhaseSpaceDecay.cc index 404af2022e..7a8a87a624 100644 --- a/source/processes/hadronic/models/util/src/G4GeneralPhaseSpaceDecay.cc +++ b/source/processes/hadronic/models/util/src/G4GeneralPhaseSpaceDecay.cc @@ -43,7 +43,8 @@ G4GeneralPhaseSpaceDecay::G4GeneralPhaseSpaceDecay(G4int Verbose) : - G4VDecayChannel("Phase Space", Verbose) + G4VDecayChannel("Phase Space", Verbose), + theDaughterMasses(0) { if (GetVerboseLevel()>1) G4cout << "G4GeneralPhaseSpaceDecay:: constructor " << G4endl; } @@ -59,7 +60,8 @@ G4GeneralPhaseSpaceDecay::G4GeneralPhaseSpaceDecay(const G4String& theParentName theNumberOfDaughters, theDaughterName1, theDaughterName2, - theDaughterName3) + theDaughterName3), + theDaughterMasses(0) { if (GetVerboseLevel()>1) G4cout << "G4GeneralPhaseSpaceDecay:: constructor " << G4endl; @@ -83,7 +85,28 @@ G4GeneralPhaseSpaceDecay::G4GeneralPhaseSpaceDecay(const G4String& theParentName theDaughterName1, theDaughterName2, theDaughterName3), - parentmass(theParentMass) + parentmass(theParentMass), + theDaughterMasses(0) +{ + if (GetVerboseLevel()>1) G4cout << "G4GeneralPhaseSpaceDecay:: constructor " << G4endl; +} + +G4GeneralPhaseSpaceDecay::G4GeneralPhaseSpaceDecay(const G4String& theParentName, + G4double theParentMass, + G4double theBR, + G4int theNumberOfDaughters, + const G4String& theDaughterName1, + const G4String& theDaughterName2, + const G4String& theDaughterName3, + const G4double *masses) : + G4VDecayChannel("Phase Space", + theParentName,theBR, + theNumberOfDaughters, + theDaughterName1, + theDaughterName2, + theDaughterName3), + parentmass(theParentMass), + theDaughterMasses(masses) { if (GetVerboseLevel()>1) G4cout << "G4GeneralPhaseSpaceDecay:: constructor " << G4endl; } @@ -162,15 +185,22 @@ G4DecayProducts *G4GeneralPhaseSpaceDecay::TwoBodyDecayIt() //daughters'mass G4double daughtermass[2]; G4double daughtermomentum; - daughtermass[0] = daughters[0]->GetPDGMass(); - daughtermass[1] = daughters[1]->GetPDGMass(); + if ( theDaughterMasses ) + { + daughtermass[0]= *(theDaughterMasses); + daughtermass[1] = *(theDaughterMasses+1); + } else { + daughtermass[0] = daughters[0]->GetPDGMass(); + daughtermass[1] = daughters[1]->GetPDGMass(); + } + // G4double sumofdaughtermass = daughtermass[0] + daughtermass[1]; //create parent G4DynamicParticle at rest G4ParticleMomentum dummy; G4DynamicParticle * parentparticle = new G4DynamicParticle( parent, dummy, 0.0); - //create G4Decayproducts + //create G4Decayproducts @@GF why dummy parentparticle? G4DecayProducts *products = new G4DecayProducts(*parentparticle); delete parentparticle; @@ -181,10 +211,12 @@ G4DecayProducts *G4GeneralPhaseSpaceDecay::TwoBodyDecayIt() G4double phi = 2.0*M_PI*G4UniformRand()*rad; G4ParticleMomentum direction(sintheta*cos(phi),sintheta*sin(phi),costheta); - //create daughter G4DynamicParticle - G4DynamicParticle * daughterparticle = new G4DynamicParticle( daughters[0], direction*daughtermomentum); + //create daughter G4DynamicParticle + G4double Etotal= sqrt(daughtermass[0]*daughtermass[0] + daughtermomentum*daughtermomentum); + G4DynamicParticle * daughterparticle = new G4DynamicParticle( daughters[0],Etotal, direction*daughtermomentum); products->PushProducts(daughterparticle); - daughterparticle = new G4DynamicParticle( daughters[1], direction*(-1.0*daughtermomentum)); + Etotal= sqrt(daughtermass[1]*daughtermass[1] + daughtermomentum*daughtermomentum); + daughterparticle = new G4DynamicParticle( daughters[1],Etotal, direction*(-1.0*daughtermomentum)); products->PushProducts(daughterparticle); if (GetVerboseLevel()>1) @@ -206,7 +238,12 @@ G4DecayProducts *G4GeneralPhaseSpaceDecay::ThreeBodyDecayIt() G4double sumofdaughtermass = 0.0; for (G4int index=0; index<3; index++) { - daughtermass[index] = daughters[index]->GetPDGMass(); + if ( theDaughterMasses ) + { + daughtermass[index]= *(theDaughterMasses+index); + } else { + daughtermass[index] = daughters[index]->GetPDGMass(); + } sumofdaughtermass += daughtermass[index]; } @@ -274,8 +311,9 @@ G4DecayProducts *G4GeneralPhaseSpaceDecay::ThreeBodyDecayIt() sinphi = sin(phi); cosphi = cos(phi); G4ParticleMomentum direction0(sintheta*cosphi,sintheta*sinphi,costheta); + G4double Etotal=sqrt( daughtermass[0]*daughtermass[0] + daughtermomentum[0]*daughtermomentum[0]); G4DynamicParticle * daughterparticle - = new G4DynamicParticle( daughters[0], direction0*daughtermomentum[0]); + = new G4DynamicParticle( daughters[0], Etotal, direction0*daughtermomentum[0]); products->PushProducts(daughterparticle); costhetan = (daughtermomentum[1]*daughtermomentum[1]-daughtermomentum[2]*daughtermomentum[2]-daughtermomentum[0]*daughtermomentum[0])/(2.0*daughtermomentum[2]*daughtermomentum[0]); @@ -287,14 +325,13 @@ G4DecayProducts *G4GeneralPhaseSpaceDecay::ThreeBodyDecayIt() direction2.setX( sinthetan*cosphin*costheta*cosphi - sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi); direction2.setY( sinthetan*cosphin*costheta*sinphi + sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi); direction2.setZ( -sinthetan*cosphin*sintheta + costhetan*costheta); - daughterparticle = new G4DynamicParticle( daughters[2], direction2*(daughtermomentum[2]/direction2.mag())); + Etotal=sqrt( daughtermass[2]*daughtermass[2] + daughtermomentum[2]*daughtermomentum[2]/direction2.mag2()); + daughterparticle = new G4DynamicParticle( daughters[2],Etotal, direction2*(daughtermomentum[2]/direction2.mag())); products->PushProducts(daughterparticle); - + G4ThreeVector mom=(direction0*daughtermomentum[0] + direction2*(daughtermomentum[2]/direction2.mag()))*(-1.0); + Etotal= sqrt( daughtermass[1]*daughtermass[1] + mom.mag2() ); daughterparticle = - new G4DynamicParticle( - daughters[1], - (direction0*daughtermomentum[0] + direction2*(daughtermomentum[2]/direction2.mag()))*(-1.0) - ); + new G4DynamicParticle(daughters[1], Etotal, mom); products->PushProducts(daughterparticle); if (GetVerboseLevel()>1) { diff --git a/source/processes/hadronic/models/util/src/G4KineticTrack.cc b/source/processes/hadronic/models/util/src/G4KineticTrack.cc index f1b6b0513a..87afee534a 100644 --- a/source/processes/hadronic/models/util/src/G4KineticTrack.cc +++ b/source/processes/hadronic/models/util/src/G4KineticTrack.cc @@ -491,6 +491,7 @@ G4KineticTrackVector* G4KineticTrack::Decay() G4int chargeBalance = G4lrint(theDefinition->GetPDGCharge() ); G4int baryonBalance = G4lrint(theDefinition->GetBaryonNumber() ); + G4LorentzVector energyMomentumBalance(Get4Momentum()); G4double theTotalActualWidth = this->EvaluateTotalActualWidth(); if (theTotalActualWidth !=0) { @@ -545,11 +546,28 @@ G4KineticTrackVector* G4KineticTrack::Decay() G4double theParentMass = this->GetActualMass(); G4double theBR = theActualWidth[index]; // cout << "**BR*** DECAYNEW " << theBR << G4endl; - // cout << "**PMass*** DECAYNEW " << theParentMass << G4endl; G4int theNumberOfDaughters = theDecayChannel->GetNumberOfDaughters(); G4String theDaughtersName1 = ""; G4String theDaughtersName2 = ""; - G4String theDaughtersName3 = ""; + G4String theDaughtersName3 = ""; + + G4double masses[3]={0.,0.,0.}; + G4int shortlivedDaughters[3]; + G4int numberOfShortliveds(0); + G4double SumLongLivedMass(0); + for (G4int aD=0; aD < theNumberOfDaughters ; aD++) + { + G4ParticleDefinition* aDaughter = theDecayChannel->GetDaughter(aD); + masses[aD] = aDaughter->GetPDGMass(); + if ( aDaughter->IsShortLived() ) + { + shortlivedDaughters[numberOfShortliveds]=aD; + numberOfShortliveds++; + } else { + SumLongLivedMass += aDaughter->GetPDGMass(); + } + + } switch (theNumberOfDaughters) { case 0: @@ -560,14 +578,37 @@ G4KineticTrackVector* G4KineticTrack::Decay() theDaughtersName3 = ""; break; case 2: - theDaughtersName1 = theDecayChannel->GetDaughterName(0); + theDaughtersName1 = theDecayChannel->GetDaughterName(0); theDaughtersName2 = theDecayChannel->GetDaughterName(1); theDaughtersName3 = ""; + if ( numberOfShortliveds == 1) + { G4SampleResonance aSampler; + G4double massmax=theParentMass - SumLongLivedMass; + G4ParticleDefinition * aDaughter=theDecayChannel->GetDaughter(shortlivedDaughters[0]); + masses[shortlivedDaughters[0]]= aSampler.SampleMass(aDaughter,massmax); + } else if ( numberOfShortliveds == 2) { + // choose masses one after the other, start with randomly choosen + G4int zero= (G4UniformRand() > 0.5) ? 0 : 1; + G4int one = 1-zero; + G4SampleResonance aSampler; + G4double massmax=theParentMass - aSampler.GetMinimumMass(theDecayChannel->GetDaughter(shortlivedDaughters[one])); + G4ParticleDefinition * aDaughter=theDecayChannel->GetDaughter(shortlivedDaughters[zero]); + masses[shortlivedDaughters[zero]]=aSampler.SampleMass(aDaughter,massmax); + massmax=theParentMass - masses[shortlivedDaughters[zero]]; + aDaughter=theDecayChannel->GetDaughter(shortlivedDaughters[one]); + masses[shortlivedDaughters[one]]=aSampler.SampleMass(aDaughter,massmax); + } break; default: theDaughtersName1 = theDecayChannel->GetDaughterName(0); theDaughtersName2 = theDecayChannel->GetDaughterName(1); theDaughtersName3 = theDecayChannel->GetDaughterName(2); + if ( numberOfShortliveds == 1) + { G4SampleResonance aSampler; + G4double massmax=theParentMass - SumLongLivedMass; + G4ParticleDefinition * aDaughter=theDecayChannel->GetDaughter(shortlivedDaughters[0]); + masses[shortlivedDaughters[0]]= aSampler.SampleMass(aDaughter,massmax); + } break; } @@ -581,7 +622,8 @@ G4KineticTrackVector* G4KineticTrack::Decay() theNumberOfDaughters, theDaughtersName1, theDaughtersName2, - theDaughtersName3); + theDaughtersName3, + masses); G4DecayProducts* theDecayProducts = thePhaseSpaceDecayChannel.DecayIt(); if(!theDecayProducts) { @@ -602,6 +644,7 @@ G4KineticTrackVector* G4KineticTrack::Decay() G4double theFormationTime = 0.0; G4ThreeVector thePosition = this->GetPosition(); G4LorentzVector momentum; + G4LorentzVector momentumBalanceCMS(0); G4KineticTrackVector* theDecayProductList = new G4KineticTrackVector; G4int dEntries = theDecayProducts->entries(); G4ParticleDefinition * aProduct = 0; @@ -611,7 +654,9 @@ G4KineticTrackVector* G4KineticTrack::Decay() aProduct = theDynamicParticle->GetDefinition(); chargeBalance -= G4lrint(aProduct->GetPDGCharge() ); baryonBalance -= G4lrint(aProduct->GetBaryonNumber() ); + momentumBalanceCMS += theDynamicParticle->Get4Momentum(); momentum = toMoving*theDynamicParticle->Get4Momentum(); + energyMomentumBalance -= momentum; theDecayProductList->push_back(new G4KineticTrack (aProduct, theFormationTime, thePosition, @@ -621,7 +666,9 @@ G4KineticTrackVector* G4KineticTrack::Decay() delete theDecayProducts; delete [] theCumActualWidth; if(getenv("DecayEnergyBalanceCheck")) - std::cout << "DEBUGGING energy balance D: " + std::cout << "DEBUGGING energy balance in cms and lab, charge baryon balance : " + << momentumBalanceCMS << " " + < 26.0) + radius = factor * (0.84*pow(A,third) + 0.55); + else + { + G4double r[27] = {0.0, 0.85, 2.095, 1.976, 1.671, 1.986, + 2.57, 2.41, 2.23, 2.519, 2.45, + 2.42, 2.471, 2.440, 2.58, 2.611, + 2.730, 2.662, 2.727, 2.9, 3.040, + 2.867, 2.969, 2.94, 3.075, 3.11, + 3.06}; + radius = factor * r[(G4int) (A+0.4)]; + } + return radius; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4WilsonRadius::GetWilsonRadius (G4double A) +{ + G4double r = GetWilsonRMSRadius(A); + return 1.29*sqrt(r*r-r0sq); +} +//////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/util/include/G4Bessel.hh b/source/processes/hadronic/util/include/G4Bessel.hh new file mode 100644 index 0000000000..4ba1b67da3 --- /dev/null +++ b/source/processes/hadronic/util/include/G4Bessel.hh @@ -0,0 +1,80 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +#ifndef G4Bessel_h +#define G4Bessel_h 1 +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4Bessel.hh +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 18 Noevmber 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "globals.hh" +//////////////////////////////////////////////////////////////////////////////// +// +class G4Bessel +{ + public: + G4Bessel (); + ~G4Bessel (); + + G4double I0 (G4double); + G4double I1 (G4double); + G4double K0 (G4double); + G4double K1 (G4double); + G4double pI0 (G4double); + G4double pI1 (G4double); + G4double pK0 (G4double); + G4double pK1 (G4double); +}; +//////////////////////////////////////////////////////////////////////////////// +// +#endif diff --git a/source/processes/hadronic/util/include/G4Fuzzy.hh b/source/processes/hadronic/util/include/G4Fuzzy.hh new file mode 100644 index 0000000000..8a3aa4acd1 --- /dev/null +++ b/source/processes/hadronic/util/include/G4Fuzzy.hh @@ -0,0 +1,43 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef G4Fuzzy_hh +#define G4Fuzzy_hh + +#include + +class G4Fuzzy : public std::pair +{ + public: + G4Fuzzy() + { + first=true; + second=false; + } + G4Fuzzy(bool aB) + { + first=false; + second=aB; + } +}; + +#endif diff --git a/source/processes/hadronic/util/src/G4Bessel.cc b/source/processes/hadronic/util/src/G4Bessel.cc new file mode 100644 index 0000000000..3f4170a15f --- /dev/null +++ b/source/processes/hadronic/util/src/G4Bessel.cc @@ -0,0 +1,350 @@ +// +// ******************************************************************** +// * 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. * +// * * +// * Parts of this code which have been developed by QinetiQ Ltd * +// * under contract to the European Space Agency (ESA) are the * +// * intellectual property of ESA. Rights to use, copy, modify and * +// * redistribute this software for general public use are granted * +// * in compliance with any licensing, distribution and development * +// * policy adopted by the Geant4 Collaboration. This code has been * +// * written by QinetiQ Ltd for the European Space Agency, under ESA * +// * contract 17191/03/NL/LvH (Aurora Programme). * +// * * +// * 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. * +// ******************************************************************** +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// MODULE: G4Bessel.cc +// +// Version: B.1 +// Date: 15/04/04 +// Author: P R Truscott +// Organisation: QinetiQ Ltd, UK +// Customer: ESA/ESTEC, NOORDWIJK +// Contract: 17191/03/NL/LvH +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +// +// CHANGE HISTORY +// -------------- +// +// 18 Noevmber 2003, P R Truscott, QinetiQ Ltd, UK +// Created. +// +// 15 March 2004, P R Truscott, QinetiQ Ltd, UK +// Beta release +// +// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +//////////////////////////////////////////////////////////////////////////////// +// +#include "G4Bessel.hh" +//////////////////////////////////////////////////////////////////////////////// +// +G4Bessel::G4Bessel () +{;} +//////////////////////////////////////////////////////////////////////////////// +// +G4Bessel::~G4Bessel () +{;} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::I0 (G4double x) +{ + const G4double P1 = 1.0, + P2 = 3.5156229, + P3 = 3.0899424, + P4 = 1.2067492, + P5 = 0.2659732, + P6 = 0.0360768, + P7 = 0.0045813; + const G4double Q1 = 0.39894228, + Q2 = 0.01328592, + Q3 = 0.00225319, + Q4 =-0.00157565, + Q5 = 0.00916281, + Q6 =-0.02057706, + Q7 = 0.02635537, + Q8 =-0.01647633, + Q9 = 0.00392377; + + G4double I = 0.0; + if (fabs(x) < 3.75) + { + G4double y = pow(x/3.75, 2.0); + I = P1+y*(P2+y*(P3+y*(P4+y*(P5+y*(P6+y*P7))))); + } + else + { + G4double ax = fabs(x); + G4double y = 3.75/ax; + I = exp(ax) / sqrt(ax) * + (Q1+y*(Q2+y*(Q3+y*(Q4+y*(Q5+y*(Q6+y*(Q7+y*(Q8+y*Q9)))))))); + } + return I; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::K0 (G4double x) +{ + const G4double P1 =-0.57721566, + P2 = 0.42278420, + P3 = 0.23069756, + P4 = 0.03488590, + P5 = 0.00262698, + P6 = 0.00010750, + P7 = 0.00000740; + const G4double Q1 = 1.25331414, + Q2 =-0.07832358, + Q3 = 0.02189568, + Q4 =-0.01062446, + Q5 = 0.00587872, + Q6 =-0.00251540, + Q7 = 0.00053208; + + G4double K = 0.0; + if (x <= 2.0) + { + G4double y = x * x / 4.0; + K = (-log(x/2.0)) * I0(x) + + P1+y*(P2+y*(P3+y*(P4+y*(P5+y*(P6+y*P7))))); + } + else + { + G4double y = 2.0 / x; + K = exp(-x) / sqrt(x) * + (Q1+y*(Q2+y*(Q3+y*(Q4+y*(Q5+y*(Q6+y*Q7)))))); + } + return K; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::I1 (G4double x) +{ + const G4double P1 = 0.5, + P2 = 0.87890594, + P3 = 0.51498869, + P4 = 0.15084934, + P5 = 0.02658733, + P6 = 0.00301532, + P7 = 0.00032411; + const G4double Q1 = 0.39894228, + Q2 =-0.03988024, + Q3 =-0.00362018, + Q4 = 0.00163801, + Q5 =-0.01031555, + Q6 = 0.02282967, + Q7 =-0.02895312, + Q8 = 0.01787654, + Q9 =-0.00420059; + + G4double I = 0.0; + if (fabs(x) < 3.75) + { + G4double ax = fabs(x); + G4double y = pow(x/3.75, 2.0); + I = ax*(P1+y*(P2+y*(P3+y*(P4+y*(P5+y*(P6+y*P7)))))); + } + else + { + G4double ax = fabs(x); + G4double y = 3.75/ax; + I = exp(ax) / sqrt(ax) * + (Q1+y*(Q2+y*(Q3+y*(Q4+y*(Q5+y*(Q6+y*(Q7+y*(Q8+y*Q9)))))))); + } + if (x < 0.0) I = -I; + return I; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::K1 (G4double x) +{ + const G4double P1 = 1.0, + P2 = 0.15443144, + P3 =-0.67278579, + P4 =-0.18156897, + P5 =-0.01919402, + P6 =-0.00110404, + P7 =-0.00004686; + const G4double Q1 = 1.25331414, + Q2 = 0.23498619, + Q3 =-0.03655620, + Q4 = 0.01504268, + Q5 =-0.00780353, + Q6 = 0.00325614, + Q7 =-0.00068245; + + G4double K = 0.0; + if (x <= 2.0) + { + G4double y = x * x / 4.0; + K = log(x/2.0)*I1(x) + 1.0/x * + (P1+y*(P2+y*(P3+y*(P4+y*(P5+y*(P6+y*P7)))))); + } + else + { + G4double y = 2.0 / x; + K = exp(-x) / sqrt(x) * + (Q1+y*(Q2+y*(Q3+y*(Q4+y*(Q5+y*(Q6+y*Q7)))))); + } + return K; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::pI0 (G4double x) +{ + const G4double A0 = 0.1250000000000E+00, + A1 = 7.0312500000000E-02, + A2 = 7.3242187500000E-02, + A3 = 1.1215209960938E-01, + A4 = 2.2710800170898E-01, + A5 = 5.7250142097473E-01, + A6 = 1.7277275025845E+00, + A7 = 6.0740420012735E+00, + A8 = 2.4380529699556E+01, + A9 = 1.1001714026925E+02, + A10 = 5.5133589612202E+02, + A11 = 3.0380905109224E+03; + + G4double I = 0.0; + if (x == 0.0) + { + I = 1.0; + } + else if (x < 18.0) + { + I = 1.0; + G4double y = x * x; + G4double s = 1.0; + for (G4int i=1; i<101; i++) + { + s *= 0.25 * y / i / i; + I += s; + if (abs(s/I) < 1.0E-15) break; + } + } + else + { + G4double y = 1.0 / x; + I = exp(x) / sqrt(twopi*x) * + (1.0 + y*(A0+y*(A1+y*(A2+y*(A3+y*(A4+y*(A5+y*(A6+y*(A7+y*(A8+y*(A9+y*(A10+y*A11)))))))))))); + } + + return I; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::pI1 (G4double x) +{ + const G4double A0 = -0.3750000000000E+00, + A1 = -1.1718750000000E-01, + A2 = -1.0253906250000E-01, + A3 = -1.4419555664063E-01, + A4 = -2.775764465332E-01, + A5 = -6.7659258842468E-01, + A6 = -1.9935317337513E+00, + A7 = -6.8839142681099E+00, + A8 = -2.7248827311269E+01, + A9 = -1.2159789187654E+02, + A10 = -6.0384407670507E+02, + A11 = -3.3022722944809E+03; + + G4double I = 0.0; + if (x == 0.0) + { + I = 0.0; + } + else if (x < 18.0) + { + I = 1.0; + G4double y = x * x; + G4double s = 1.0; + for (G4int i=1; i<101; i++) + { + s *= 0.25 * y / i / (i+1.0); + I += s; + if (abs(s/I) < 1.0E-15) break; + } + I *= 0.5 * x; + + } + else + { + G4double y = 1.0 / x; + I = exp(x) / sqrt(twopi*x) * + (1.0 + y*(A0+y*(A1+y*(A2+y*(A3+y*(A4+y*(A5+y*(A6+y*(A7+y*(A8+y*(A9+y*(A10+y*A11)))))))))))); + } + + return I; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::pK0 (G4double x) +{ + const G4double A0 = 0.1250000000000E+00, + A1 = 0.2109375000000E+00, + A2 = 1.0986328125000E+00, + A3 = 1.1775970458984E+01, + A4 = 2.1461706161499E+02, + A5 = 5.9511522710323E+03, + A6 = 2.3347645606175E+05, + A7 = 1.2312234987631E+07; + + G4double K = 0.0; + if (x == 0.0) + { + K = 1.0E+307; + } + else if (x < 9.0) + { + G4double y = x * x; + G4double C = -log(x/2.0) - 0.5772156649015329; + G4double s = 1.0; + G4double t = 0.0; + for (G4int i=1; i<51; i++) + { + s *= 0.25 * y / i / i; + t += 1.0 / i ; + K += s * (t+C); + } + K += C; + } + else + { + G4double y = 1.0 / x / x; + K = 0.5 / x / pI0(x) * + (1.0 + y*(A0+y*(A1+y*(A2+y*(A3+y*(A4+y*(A5+y*(A6+y*A7)))))))); + } + + return K; +} +//////////////////////////////////////////////////////////////////////////////// +// +G4double G4Bessel::pK1 (G4double x) +{ + G4double K = 0.0; + if (x == 0.0) + K = 1.0E+307; + else + K = (1.0/x - pI1(x)*pK0(x)) / pI0(x); + return K; +} +//////////////////////////////////////////////////////////////////////////////// +// diff --git a/source/processes/hadronic/util/src/G4HadFinalState.cc b/source/processes/hadronic/util/src/G4HadFinalState.cc index 588fdc7b46..1cb13ca974 100644 --- a/source/processes/hadronic/util/src/G4HadFinalState.cc +++ b/source/processes/hadronic/util/src/G4HadFinalState.cc @@ -34,6 +34,7 @@ theEnergy=anEnergy; if(theEnergy<0) { + std::cout << "Final state energy was: E = "<0.001) { - G4cout <<"We have negative theDirection.mag() "<= pVector->entries()) ) return -1; //check pointer and remove - if ((*pVector)[ip]== process) { - pVector->removeAt(ip); - } else { - return -1; - } + //if ((*pVector)[ip]== process) { + pVector->removeAt(ip); + //} else { + // return -1; + //} // correct index for(G4int iproc=0; iprocisActive) { - // remove process from vectors if the process is active - for (G4int ivec=0; ivecidxProcVector[ivec]; - if ((idx >= 0) && (idx < pVector->entries())) { - //remove - if (RemoveAt(idx, removedProcess, ivec) <0) { - G4String anErrorMessage("Bad index in attribute"); - anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] "; - anErrorMessage += "process[" + removedProcess->GetProcessName() + "] " ; - G4Exception( "G4ProcessManager::RemoveProcess()","Fatal Error", - FatalException,anErrorMessage); - return 0; - } - } else if (idx<0) { - // corresponding DoIt is not active - } else { - // idx is out of range - G4String anErrorMessage("Index is out of range "); + if (!(pAttr->isActive)) { ActivateProcess(index);} + // remove process from vectors if the process is active + for (G4int ivec=0; ivecidxProcVector[ivec]; + if ((idx >= 0) && (idx < pVector->entries())) { + //remove + if (RemoveAt(idx, removedProcess, ivec) <0) { + G4String anErrorMessage("Bad index in attribute"); anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] "; anErrorMessage += "process[" + removedProcess->GetProcessName() + "] " ; G4Exception( "G4ProcessManager::RemoveProcess()","Fatal Error", FatalException,anErrorMessage); return 0; - } + } + } else if (idx<0) { + // corresponding DoIt is not active + } else { + // idx is out of range + G4String anErrorMessage("Index is out of range "); + anErrorMessage += "for particle[" + theParticleType->GetParticleName() + "] "; + anErrorMessage += "process[" + removedProcess->GetProcessName() + "] " ; + G4Exception( "G4ProcessManager::RemoveProcess()","Fatal Error", + FatalException,anErrorMessage); + return 0; } - pAttr->isActive = false; - } else { - // the process is inactive } + pAttr->isActive = false; // remove from the process List and delete the attribute theProcessList->removeAt(index); G4ProcessAttrVector::iterator itr; @@ -911,9 +908,9 @@ void G4ProcessManager::CreateGPILvectors() //-- create GetPhysicalInteractionLength process vectors just as the inverse //-- order of DoIt process vector for(G4int k=0; kentries(); k++) { - GetAttribute((*theProcessList)(k))->idxProcVector[0]=-1; - GetAttribute((*theProcessList)(k))->idxProcVector[2]=-1; - GetAttribute((*theProcessList)(k))->idxProcVector[4]=-1; + GetAttribute((*theProcessList)[k])->idxProcVector[0]=-1; + GetAttribute((*theProcessList)[k])->idxProcVector[2]=-1; + GetAttribute((*theProcessList)[k])->idxProcVector[4]=-1; } for(G4int i=0; iGetProperty("REFLECTIVITY"); - if (PropertyPointer) theReflectivity = + if (PropertyPointer) { + theReflectivity = PropertyPointer->GetProperty(thePhotonMomentum); + } else { + theReflectivity = 1.0; + } PropertyPointer = aMaterialPropertiesTable->GetProperty("EFFICIENCY"); - if (PropertyPointer) theEfficiency = + if (PropertyPointer) { + theEfficiency = PropertyPointer->GetProperty(thePhotonMomentum); + } else { + theEfficiency = 0.0; + } if ( theModel == unified ) { PropertyPointer = aMaterialPropertiesTable->GetProperty("SPECULARLOBECONSTANT"); - if (PropertyPointer) prob_sl = + if (PropertyPointer) { + prob_sl = PropertyPointer->GetProperty(thePhotonMomentum); + } else { + prob_sl = 0.0; + } PropertyPointer = aMaterialPropertiesTable->GetProperty("SPECULARSPIKECONSTANT"); - if (PropertyPointer) prob_ss = + if (PropertyPointer) { + prob_ss = PropertyPointer->GetProperty(thePhotonMomentum); + } else { + prob_ss = 0.0; + } PropertyPointer = aMaterialPropertiesTable->GetProperty("BACKSCATTERCONSTANT"); - if (PropertyPointer) prob_bs = + if (PropertyPointer) { + prob_bs = PropertyPointer->GetProperty(thePhotonMomentum); + } else { + prob_bs = 0.0; + } } } else if (theFinish == polishedbackpainted || diff --git a/source/processes/optical/src/G4OpRayleigh.cc b/source/processes/optical/src/G4OpRayleigh.cc index 1933b078d2..9336a5ccce 100644 --- a/source/processes/optical/src/G4OpRayleigh.cc +++ b/source/processes/optical/src/G4OpRayleigh.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpRayleigh.cc,v 1.9 2003/12/01 15:20:05 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpRayleigh.cc,v 1.10 2004/04/27 00:27:30 gum Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //////////////////////////////////////////////////////////////////////// @@ -76,6 +76,8 @@ G4OpRayleigh::G4OpRayleigh(const G4String& processName) thePhysicsTable = 0; + DefaultWater = false; + if (verboseLevel>0) { G4cout << GetProcessName() << " is created " << G4endl; } @@ -201,21 +203,34 @@ void G4OpRayleigh::BuildThePhysicsTable() for (G4int i=0 ; i < numOfMaterials; i++) { - G4PhysicsOrderedFreeVector* ScatteringLengths = + G4PhysicsOrderedFreeVector* ScatteringLengths = new G4PhysicsOrderedFreeVector(); + G4MaterialPropertiesTable *aMaterialPropertiesTable = + (*theMaterialTable)[i]->GetMaterialPropertiesTable(); + + if(aMaterialPropertiesTable){ + + G4MaterialPropertyVector* AttenuationLengthVector = + aMaterialPropertiesTable->GetProperty("RAYLEIGH"); + + if(!AttenuationLengthVector){ + if ((*theMaterialTable)[i]->GetName() == "Water") { - G4MaterialPropertiesTable *MaterialPT = - (*theMaterialTable)[i]->GetMaterialPropertiesTable(); - // Call utility routine to Generate - // Rayleigh Scattering Lengths - ScatteringLengths = - RayleighAttenuationLengthGenerator(MaterialPT); - } + // Call utility routine to Generate + // Rayleigh Scattering Lengths - thePhysicsTable->insertAt(i,ScatteringLengths); - } + DefaultWater = true; + + ScatteringLengths = + RayleighAttenuationLengthGenerator(aMaterialPropertiesTable); + } + } + } + + thePhysicsTable->insertAt(i,ScatteringLengths); + } } // GetMeanFreePath() @@ -232,7 +247,7 @@ G4double G4OpRayleigh::GetMeanFreePath(const G4Track& aTrack, G4double AttenuationLength = DBL_MAX; - if (aMaterial->GetName() == "Water") { + if (aMaterial->GetName() == "Water" && DefaultWater){ G4bool isOutRange; @@ -298,9 +313,12 @@ G4OpRayleigh::RayleighAttenuationLengthGenerator(G4MaterialPropertiesTable *aMPT G4PhysicsOrderedFreeVector *RayleighScatteringLengths = new G4PhysicsOrderedFreeVector(); - Rindex->ResetIterator(); - while (++(*Rindex)) { + if (Rindex ) { + + Rindex->ResetIterator(); + + while (++(*Rindex)) { e = (Rindex->GetPhotonMomentum()); @@ -325,6 +343,8 @@ G4OpRayleigh::RayleighAttenuationLengthGenerator(G4MaterialPropertiesTable *aMPT } RayleighScatteringLengths-> InsertValues(Rindex->GetPhotonMomentum(), Dist); + } + } return RayleighScatteringLengths; diff --git a/source/readout/GNUmakefile b/source/readout/GNUmakefile index 579169d89b..e88a50a8b5 100644 --- a/source/readout/GNUmakefile +++ b/source/readout/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 2003/10/03 14:42:29 gcosmo Exp $ +# $Id: GNUmakefile,v 1.3 2004/06/01 15:39:56 gcosmo Exp $ # ----------------------------------------------------------- # GNUmakefile for digits+hits library. Makoto Asai, 1/11/96. # ----------------------------------------------------------- @@ -9,6 +9,12 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += \ diff --git a/source/run/GNUmakefile b/source/run/GNUmakefile index a6429a1340..4a68be5bb1 100644 --- a/source/run/GNUmakefile +++ b/source/run/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.8 2003/10/03 14:46:30 gcosmo Exp $ +# $Id: GNUmakefile,v 1.10 2004/06/11 14:27:44 gcosmo Exp $ # ---------------------------------------------------------- # GNUmakefile for run library. Gabriele Cosmo, 3/4/1997. # ---------------------------------------------------------- @@ -9,8 +9,15 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4RUN_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/run/History b/source/run/History index 9661eff133..08d924c3ca 100644 --- a/source/run/History +++ b/source/run/History @@ -1,4 +1,4 @@ -$Id: History,v 1.109 2004/03/18 08:48:09 gcosmo Exp $ +$Id: History,v 1.113 2004/06/11 15:17:17 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,26 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +June 11, 2004 G.Cosmo (run-V06-01-03) +- Use global flag G4RUN_ALLOC_EXPORT to export extern symbols for DLLs. + Modified GNUmakefile and rearranged usage of extern symbols in G4Run. + +June 09, 2004 G.Cosmo (run-V06-01-02) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Coworks with "global-V06-01-02b". + +June 04, 2004 G.Cosmo (run-V06-01-01) +- Updated date in G4RunManagerKernel for release 6.2. +- Export extern symbols for allowing support of DLLs on Windows. + Modified G4Run.hh. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +May 04, 2004, M.Asai (run-V06-01-00) +- Access methods to G4TrackingManager and G4StackManager are added + to G4RunManagerKernel. + March 18, 2004, M.Asai (run-V06-00-02) - Added NIM reference to header and WWW info. - Changed date for release 6.1. diff --git a/source/run/include/G4Run.hh b/source/run/include/G4Run.hh index c5af9b8128..24ced74cce 100644 --- a/source/run/include/G4Run.hh +++ b/source/run/include/G4Run.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Run.hh,v 1.7 2003/04/23 17:54:17 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Run.hh,v 1.10 2004/06/11 14:27:44 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifndef G4Run_h @@ -90,7 +90,11 @@ class G4Run { DCtable = DCtbl; } }; -extern G4Allocator aRunAllocator; +#if defined G4RUN_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aRunAllocator; +#else + extern G4DLLIMPORT G4Allocator aRunAllocator; +#endif inline void* G4Run::operator new(size_t) { diff --git a/source/run/include/G4RunManagerKernel.hh b/source/run/include/G4RunManagerKernel.hh index 5a5d078b94..9a0413bcc6 100644 --- a/source/run/include/G4RunManagerKernel.hh +++ b/source/run/include/G4RunManagerKernel.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RunManagerKernel.hh,v 1.3 2003/11/04 01:58:28 asaim Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4RunManagerKernel.hh,v 1.4 2004/05/04 16:43:25 asaim Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -52,13 +52,15 @@ #define G4RunManagerKernel_h 1 class G4VUserPhysicsList; -class G4EventManager; class G4VPhysicalVolume; class G4Region; class G4ExceptionHandler; +class G4StackManager; +class G4TrackingManager; #include "globals.hh" +#include "G4EventManager.hh" class G4RunManagerKernel { @@ -150,6 +152,10 @@ class G4RunManagerKernel public: inline G4EventManager* GetEventManager() const { return eventManager; } + inline G4StackManager* GetStackManager() const + { return eventManager->GetStackManager(); } + inline G4TrackingManager* GetTrackingManager() const + { return eventManager->GetTrackingManager(); } inline G4String GetVersionString() const { return versionString; } diff --git a/source/run/src/G4Run.cc b/source/run/src/G4Run.cc index d35960ce49..205ecadba3 100644 --- a/source/run/src/G4Run.cc +++ b/source/run/src/G4Run.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Run.cc,v 1.5 2003/04/23 17:54:31 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Run.cc,v 1.7 2004/06/11 14:27:45 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4Run.hh" diff --git a/source/run/src/G4RunManagerKernel.cc b/source/run/src/G4RunManagerKernel.cc index c25baa036e..3f7c769683 100644 --- a/source/run/src/G4RunManagerKernel.cc +++ b/source/run/src/G4RunManagerKernel.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RunManagerKernel.cc,v 1.13 2004/03/18 08:47:53 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4RunManagerKernel.cc,v 1.15 2004/06/07 13:56:42 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -31,7 +31,7 @@ #include "G4StateManager.hh" #include "G4ApplicationState.hh" #include "G4ExceptionHandler.hh" -#include "G4EventManager.hh" +//#include "G4EventManager.hh" #include "G4GeometryManager.hh" #include "G4TransportationManager.hh" //#include "G4Navigator.hh" @@ -79,12 +79,12 @@ G4RunManagerKernel::G4RunManagerKernel() // version banner versionString - = " Geant4 version $Name: geant4-06-01 $ (25-March-2004)"; + = " Geant4 version $Name: geant4-06-02 $ (25-June-2004)"; G4cout << G4endl << "*************************************************************" << G4endl << versionString << G4endl << " Copyright : Geant4 Collaboration" << G4endl - << " Reference : NIM A 506 (2003), 250-303." << G4endl + << " Reference : NIM A 506 (2003), 250-303" << G4endl << " WWW : http://cern.ch/geant4" << G4endl << "*************************************************************" << G4endl << G4endl; diff --git a/source/track/GNUmakefile b/source/track/GNUmakefile index 95754e4601..d42cadd1da 100644 --- a/source/track/GNUmakefile +++ b/source/track/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2003/10/03 15:49:20 gcosmo Exp $ +# $Id: GNUmakefile,v 1.5 2004/06/11 14:28:12 gcosmo Exp $ # ---------------------------------------------------------- # GNUmakefile for track library. Gabriele Cosmo, 3/4/1997. # ---------------------------------------------------------- @@ -9,8 +9,13 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4TRACK_ALLOC_EXPORT CPPFLAGS += \ -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ diff --git a/source/track/History b/source/track/History index 22e734862f..d8ba200a2d 100644 --- a/source/track/History +++ b/source/track/History @@ -1,4 +1,4 @@ -$Id: History,v 1.63 2004/01/20 15:29:41 vnivanch Exp $ +$Id: History,v 1.70 2004/06/15 08:19:02 vnivanch Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,33 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun. 15, 04 V.Ivanchenko (track-V06-01-05) +- G4ParticleChangeForLoss: fix initialization of ParentWeight + +Jun. 11, 04 G.Cosmo (track-V06-01-04) +- Use global flag G4TRACK_ALLOC_EXPORT to export extern symbols for DLLs. + Modified GNUmakefile and rearranged usage of extern symbols in G4Track. + +Jun. 09, 04 G.Cosmo (track-V06-01-03) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Coworks with "global-V06-01-02b". + +Jun. 07, 04 G.Cosmo (track-V06-01-02) +- Export extern symbols for allowing support of DLLs on Windows. + Modified G4Track.icc. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +May. 11, 04 V.Ivanchenko (track-V06-01-01) +- G4ParticleChangeForLoss: rename variables according to 00 tag; + fix of minor energy non-conservation in case of more than 1 + processes changing the energy + +May. 08, 04 H.Kurashige (track-V06-01-00) +- Add new methods of ProposeXXX (and corresponding GetXXX methods) + as replacements of old methods of SetXXXChange and GetXXXChange + Jan. 20, 04 V.Ivanchenko (track-V06-00-01) - Update G4ParticleChangeForLoss for utilisation in G4VEnergyLossProcess - Minor update G4ParticleChangeForMSC for utilisation in model design of msc diff --git a/source/track/include/G4ParticleChange.hh b/source/track/include/G4ParticleChange.hh index 64dcdf0407..cb7060a190 100644 --- a/source/track/include/G4ParticleChange.hh +++ b/source/track/include/G4ParticleChange.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChange.hh,v 1.9 2001/11/21 14:05:57 kurasige Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ParticleChange.hh,v 1.10 2004/05/08 15:28:11 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -121,51 +121,48 @@ class G4ParticleChange: public G4VParticleChange // ---------------------------------------------------- //--- methods to keep information of the final state-- - // IMPORTANT NOTE: Although the name of the class and methods are - // "Change", what it stores (and returns in get) are the "FINAL" - // values of the Position, Momentum, etc. + // IMPORTANT NOTE: + // These ProposeXXX methods stores (and returns in GetXXX methods) + // the "FINAL" values of the Position, Momentum, etc. - const G4ThreeVector* GetMomentumDirectionChange() const; - void SetMomentumDirectionChange(G4double Px, G4double Py, G4double Pz); - void SetMomentumDirectionChange(const G4ThreeVector& Pfinal); - const G4ThreeVector* GetMomentumChange() const; - void SetMomentumChange(G4double Px, G4double Py, G4double Pz); - void SetMomentumChange(const G4ThreeVector& Pfinal); - // Get/Set theMomentumDirectionChange vector: it is the final momentum direction. + const G4ThreeVector* GetMomentumDirection() const; + void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz); + void ProposeMomentumDirection(const G4ThreeVector& Pfinal); + // Get/Propose the MomentumDirection vector: it is the final momentum direction. - const G4ThreeVector* GetPolarizationChange() const; - void SetPolarizationChange(G4double Px, G4double Py, G4double Pz); - void SetPolarizationChange(const G4ThreeVector& finalPoralization); - // Get/Set thePolarizationChange vector. + const G4ThreeVector* GetPolarization() const; + void ProposePolarization(G4double Px, G4double Py, G4double Pz); + void ProposePolarization(const G4ThreeVector& finalPoralization); + // Get/Propose the final Polarization vector. - G4double GetEnergyChange() const; - void SetEnergyChange(G4double theEnergyChange); - // Get/Set the final kinetic energy of the current particle. + G4double GetEnergy() const; + void ProposeEnergy(G4double finalEnergy); + // Get/Propose the final kinetic energy of the current particle. - G4double GetProperTimeChange() const; - void SetProperTimeChange(G4double t); - // Get/Set theProperTimeChange vector + G4double GetProperTime() const; + void ProposeProperTime(G4double finalProperTime); + // Get/Propose th final eProperTime - const G4ThreeVector* GetPositionChange() const; - void SetPositionChange(G4double x, G4double y, G4double z); - void SetPositionChange(const G4ThreeVector& finalPosition); - // Get/Set the final position of the current particle. + const G4ThreeVector* GetPosition() const; + void ProposePosition(G4double x, G4double y, G4double z); + void ProposePosition(const G4ThreeVector& finalPosition); + // Get/Propose the final position of the current particle. - G4double GetTimeChange() const; - void SetTimeChange(G4double t); - // Get/Set theTimeChange vector. + G4double GetGlobalTime() const; + void ProposeGlobalTime(G4double finalGlobalTime); + // Get/Propose the final GlobalTime - G4double GetMassChange() const; - void SetMassChange(G4double mass); - // Get/Set theMassChange + G4double GetMass() const; + void ProposeMass(G4double finalMass); + // Get/Propose the final dynamical Mass in G4DynamicParticle - G4double GetChargeChange() const; - void SetChargeChange(G4double mass); - // Get/Set theChargeChange + G4double GetCharge() const; + void ProposeCharge(G4double finalCharge); + // Get/Propose the final dynamical Charge in G4DynamicParticl - G4double GetWeightChange() const; - void SetWeightChange(G4double w); - // Get/Set theWeightChange + G4double GetWeight() const; + void ProposeWeight(G4double finalWeight); + // Get/Propose the final Weight of the current particle // -- Utility functions -- G4ThreeVector GetGlobalPosition(const G4ThreeVector& displacement) const; @@ -204,6 +201,36 @@ class G4ParticleChange: public G4VParticleChange // position and are same as thePositionChange // ---------------------------------------------------- + public: + // Following methods will be removed in release 7.0 + // Using ProposeXXXX methods is recommended to setting + // properties in G4ParticleChange + const G4ThreeVector* GetMomentumDirectionChange() const; + void SetMomentumDirectionChange(G4double Px, G4double Py, G4double Pz); + void SetMomentumDirectionChange(const G4ThreeVector& Pfinal); + const G4ThreeVector* GetMomentum() const; + void SetMomentumChange(G4double Px, G4double Py, G4double Pz); + void SetMomentumChange(const G4ThreeVector& Pfinal); + const G4ThreeVector* GetMomentumChange() const; + const G4ThreeVector* GetPolarizationChange() const; + void SetPolarizationChange(G4double Px, G4double Py, G4double Pz); + void SetPolarizationChange(const G4ThreeVector& finalPoralization); + G4double GetEnergyChange() const; + void SetEnergyChange(G4double theEnergyChange); + G4double GetProperTimeChange() const; + void SetProperTimeChange(G4double t); + const G4ThreeVector* GetPositionChange() const; + void SetPositionChange(G4double x, G4double y, G4double z); + void SetPositionChange(const G4ThreeVector& finalPosition); + G4double GetTimeChange() const; + void SetTimeChange(G4double t); + G4double GetMassChange() const; + void SetMassChange(G4double mass); + G4double GetChargeChange() const; + void SetChargeChange(G4double mass); + G4double GetWeightChange() const; + void SetWeightChange(G4double w); + public: virtual void DumpInfo() const; @@ -241,14 +268,6 @@ class G4ParticleChange: public G4VParticleChange const G4Track* theCurrentTrack; - public: - // these methods is used for switch on/off EB in all ParticleChange objects - // static void SwOnAllEB(); - // static void SwOffAllEB(); - - private: - // static G4bool fUseEBForAll; - public: // for Debug virtual G4bool CheckIt(const G4Track&); diff --git a/source/track/include/G4ParticleChange.icc b/source/track/include/G4ParticleChange.icc index 155b42c2b9..e44137ae38 100644 --- a/source/track/include/G4ParticleChange.icc +++ b/source/track/include/G4ParticleChange.icc @@ -21,38 +21,36 @@ // ******************************************************************** // // -// $Id: G4ParticleChange.icc,v 1.9 2001/10/20 08:07:49 kurasige Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ParticleChange.icc,v 1.10 2004/05/08 15:28:11 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // inline G4Step* G4ParticleChange::UpdateStepInfo(G4Step* pStep) { - // use fUseEBForAll instead of fUseEB - // fUseEB = fUseEBForAll; return G4VParticleChange::UpdateStepInfo(pStep); } inline - G4double G4ParticleChange::GetEnergyChange() const + G4double G4ParticleChange::GetEnergy() const { return theEnergyChange; } inline - void G4ParticleChange::SetEnergyChange(G4double Energy) + void G4ParticleChange::ProposeEnergy(G4double finalEnergy) { - theEnergyChange = Energy; + theEnergyChange = finalEnergy; } inline - const G4ThreeVector* G4ParticleChange::GetMomentumChange() const + const G4ThreeVector* G4ParticleChange::GetMomentumDirection() const { return &theMomentumDirectionChange; } inline - void G4ParticleChange::SetMomentumChange( + void G4ParticleChange::ProposeMomentumDirection( G4double Px, G4double Py, G4double Pz ) @@ -63,48 +61,26 @@ inline } inline - void G4ParticleChange::SetMomentumChange(const G4ThreeVector& P) + void G4ParticleChange::ProposeMomentumDirection(const G4ThreeVector& P) { theMomentumDirectionChange = P; } -inline - const G4ThreeVector* G4ParticleChange::GetMomentumDirectionChange() const -{ - return &theMomentumDirectionChange; -} inline - void G4ParticleChange::SetMomentumDirectionChange( - G4double Px, - G4double Py, - G4double Pz ) -{ - theMomentumDirectionChange.setX(Px); - theMomentumDirectionChange.setY(Py); - theMomentumDirectionChange.setZ(Pz); -} - -inline - void G4ParticleChange::SetMomentumDirectionChange(const G4ThreeVector& P) -{ - theMomentumDirectionChange = P; -} - -inline - const G4ThreeVector* G4ParticleChange::GetPolarizationChange() const + const G4ThreeVector* G4ParticleChange::GetPolarization() const { return &thePolarizationChange; } inline - void G4ParticleChange::SetPolarizationChange( const G4ThreeVector& finalPoralization) + void G4ParticleChange::ProposePolarization( const G4ThreeVector& finalPoralization) { thePolarizationChange = finalPoralization; } inline - void G4ParticleChange::SetPolarizationChange( + void G4ParticleChange::ProposePolarization( G4double Px, G4double Py, G4double Pz ) @@ -115,38 +91,37 @@ inline } inline - const G4ThreeVector* G4ParticleChange::GetPositionChange() const + const G4ThreeVector* G4ParticleChange::GetPosition() const { return &thePositionChange; } inline - G4double G4ParticleChange::GetProperTimeChange() const -{ - return theProperTimeChange; -} - -inline - void G4ParticleChange::SetProperTimeChange(G4double tau) -{ - theProperTimeChange = tau; - -} - -inline - void G4ParticleChange::SetPositionChange(const G4ThreeVector& finalPosition) + void G4ParticleChange::ProposePosition(const G4ThreeVector& finalPosition) { thePositionChange= finalPosition; } inline - void G4ParticleChange::SetPositionChange(G4double x,G4double y, G4double z) + void G4ParticleChange::ProposePosition(G4double x,G4double y, G4double z) { thePositionChange.setX(x); thePositionChange.setY(y); thePositionChange.setZ(z); } +inline + G4double G4ParticleChange::GetProperTime() const +{ + return theProperTimeChange; +} + +inline + void G4ParticleChange::ProposeProperTime(G4double tau) +{ + theProperTimeChange = tau; +} + inline G4ThreeVector G4ParticleChange::GetGlobalPosition(const G4ThreeVector& displacement) const { @@ -162,49 +137,49 @@ inline } inline - G4double G4ParticleChange::GetTimeChange() const + G4double G4ParticleChange::GetGlobalTime() const { return theTimeChange; } inline - void G4ParticleChange::SetTimeChange(G4double t) + void G4ParticleChange::ProposeGlobalTime(G4double t) { theTimeChange = t; } inline - G4double G4ParticleChange::GetMassChange() const + G4double G4ParticleChange::GetMass() const { return theMassChange; } inline - void G4ParticleChange::SetMassChange(G4double t) + void G4ParticleChange::ProposeMass(G4double t) { theMassChange = t; } inline - G4double G4ParticleChange::GetChargeChange() const + G4double G4ParticleChange::GetCharge() const { return theChargeChange; } inline - void G4ParticleChange::SetChargeChange(G4double t) + void G4ParticleChange::ProposeCharge(G4double t) { theChargeChange = t; } inline - G4double G4ParticleChange::GetWeightChange() const + G4double G4ParticleChange::GetWeight() const { return theWeightChange; } inline - void G4ParticleChange::SetWeightChange(G4double w) + void G4ParticleChange::ProposeWeight(G4double w) { theWeightChange = w; theParentWeight = w; @@ -220,20 +195,161 @@ inline return direction*tMomentum; } -//inline -// void G4ParticleChange::SwOnAllEB() -//{ -// fUseEBForAll = true; -//} -//inline void G4ParticleChange::SwOffAllEB() -//{ -// fUseEBForAll = false; -//} +// Following methods will be removed in release 7.0 + +inline + G4double G4ParticleChange::GetEnergyChange() const +{ + return GetEnergy(); +} + +inline + void G4ParticleChange::SetEnergyChange(G4double energy) +{ + ProposeEnergy(energy); +} +inline + const G4ThreeVector* G4ParticleChange::GetMomentumChange() const +{ + return GetMomentumDirection(); +} + +inline + void G4ParticleChange::SetMomentumChange( + G4double Px, + G4double Py, + G4double Pz ) +{ + ProposeMomentumDirection(Px, Py, Pz); +} +inline + + void G4ParticleChange::SetMomentumChange(const G4ThreeVector& P) +{ + ProposeMomentumDirection(P); +} + +inline + const G4ThreeVector* G4ParticleChange::GetMomentumDirectionChange() const +{ + return GetMomentumDirection(); +} + +inline + void G4ParticleChange::SetMomentumDirectionChange( + G4double Px, + G4double Py, + G4double Pz ) +{ + ProposeMomentumDirection(Px, Py, Pz); +} +inline + + void G4ParticleChange::SetMomentumDirectionChange(const G4ThreeVector& P) +{ + ProposeMomentumDirection(P); +} + +inline + const G4ThreeVector* G4ParticleChange::GetPolarizationChange() const +{ + return GetPolarization(); +} + +inline + void G4ParticleChange::SetPolarizationChange( const G4ThreeVector& finalPoralization) +{ + ProposePolarization(finalPoralization); +} + +inline + void G4ParticleChange::SetPolarizationChange( + G4double Px, + G4double Py, + G4double Pz ) +{ + ProposePolarization(Px, Py, Pz); +} + +inline + const G4ThreeVector* G4ParticleChange::GetPositionChange() const +{ + return GetPosition(); +} +inline + void G4ParticleChange::SetPositionChange(const G4ThreeVector& finalPosition) +{ + ProposePosition(finalPosition); +} + +inline + void G4ParticleChange::SetPositionChange(G4double x,G4double y, G4double z) +{ + ProposePosition(x, y, z); +} + +inline + G4double G4ParticleChange::GetProperTimeChange() const +{ + return GetProperTime(); +} + +inline + void G4ParticleChange::SetProperTimeChange(G4double tau) +{ + ProposeProperTime(tau); +} +inline + G4double G4ParticleChange::GetTimeChange() const +{ + return GetGlobalTime(); +} +inline + void G4ParticleChange::SetTimeChange(G4double t) +{ + ProposeGlobalTime(t); +} + +inline + G4double G4ParticleChange::GetMassChange() const +{ + return GetMass(); +} + +inline + void G4ParticleChange::SetMassChange(G4double t) +{ + ProposeMass(t); +} + +inline + G4double G4ParticleChange::GetChargeChange() const +{ + return GetCharge(); +} + +inline + void G4ParticleChange::SetChargeChange(G4double t) +{ + ProposeCharge(t); +} + +inline + G4double G4ParticleChange::GetWeightChange() const +{ + return GetWeight(); +} + +inline + void G4ParticleChange::SetWeightChange(G4double w) +{ + ProposeWeight(w); +} diff --git a/source/track/include/G4ParticleChangeForDecay.hh b/source/track/include/G4ParticleChangeForDecay.hh index 4238346dc1..f305a55744 100644 --- a/source/track/include/G4ParticleChangeForDecay.hh +++ b/source/track/include/G4ParticleChangeForDecay.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForDecay.hh,v 1.5 2001/07/11 10:08:35 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ParticleChangeForDecay.hh,v 1.6 2004/05/08 15:28:11 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -83,9 +83,19 @@ class G4ParticleChangeForDecay: public G4VParticleChange virtual void Initialize(const G4Track&); // Initialize all propoerties by using G4Track information + G4double GetGlobalTime() const; + void ProposeGlobalTime(G4double t); + // Get/Propose the final GlobalTime + + G4double GetGlobalTime(G4double timeDelay) const; + // Convert the time delay to the global time. + + public: + // Following methods will be removed in release 7.0 + // Using ProposeXXXX methods is recommended to setting + // properties in G4ParticleChangeForDecay G4double GetTimeChange() const; void SetTimeChange(G4double t); - // Get/Set theTimeChange vector. public: virtual void DumpInfo() const; @@ -99,6 +109,26 @@ class G4ParticleChangeForDecay: public G4VParticleChange virtual G4bool CheckIt(const G4Track&); }; +inline + G4double G4ParticleChangeForDecay::GetGlobalTime() const +{ + return theTimeChange; +} + +inline + void G4ParticleChangeForDecay::ProposeGlobalTime(G4double t) +{ + theTimeChange = t; +} + +inline + G4double G4ParticleChangeForDecay::GetGlobalTime(G4double timeDelay) const +{ + // Convert the time delay to the global time. + return theTimeChange + timeDelay; +} + +// Following methods will be removed in release 7.0 inline G4double G4ParticleChangeForDecay::GetTimeChange() const { diff --git a/source/track/include/G4ParticleChangeForLoss.hh b/source/track/include/G4ParticleChangeForLoss.hh index b1ee817954..dece6254d2 100644 --- a/source/track/include/G4ParticleChangeForLoss.hh +++ b/source/track/include/G4ParticleChangeForLoss.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForLoss.hh,v 1.5 2004/01/20 15:29:41 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4ParticleChangeForLoss.hh,v 1.12 2004/06/15 08:17:38 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -78,12 +78,24 @@ public: void SetProposedCharge(G4double theCharge); // Get/Set theCharge + G4double GetCharge() const; + void ProposeCharge(G4double finalCharge); + // Get/Propose the final dynamical Charge in G4DynamicParticle + G4double GetProposedKineticEnergy() const; - void SetProposedKineticEnergy(G4double kinEnergy); + void SetProposedKineticEnergy(G4double proposedKinEnergy); // Get/Set the final kinetic energy of the current particle. + // G4double GetEnergy() const; + // void ProposeEnergy(G4double finalEnergy); + // Get/Propose the final kinetic energy of the current particle. + const G4ThreeVector& GetProposedMomentumDirection() const; void SetProposedMomentumDirection(const G4ThreeVector& dir); + const G4ThreeVector& GetMomentumDirection() const; + void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz); + void ProposeMomentumDirection(const G4ThreeVector& Pfinal); + // Get/Propose the MomentumDirection vector: it is the final momentum direction. virtual void DumpInfo() const; @@ -99,22 +111,25 @@ private: const G4Track* currentTrack; // The pointer to G4Track - G4double kinEnergy; + + G4double proposedKinEnergy; // The final kinetic energy of the current particle. + G4double currentCharge; // The final charge of the current particle. + G4ThreeVector proposedMomentumDirection; // The final momentum direction of the current particle. }; inline G4double G4ParticleChangeForLoss::GetProposedKineticEnergy() const { - return kinEnergy; + return proposedKinEnergy; } inline void G4ParticleChangeForLoss::SetProposedKineticEnergy(G4double energy) { - kinEnergy = energy; + proposedKinEnergy = energy; } inline G4double G4ParticleChangeForLoss::GetProposedCharge() const @@ -122,29 +137,60 @@ inline G4double G4ParticleChangeForLoss::GetProposedCharge() const return currentCharge; } +inline G4double G4ParticleChangeForLoss::GetCharge() const +{ + return currentCharge; +} + inline void G4ParticleChangeForLoss::SetProposedCharge(G4double theCharge) { currentCharge = theCharge; } +inline void G4ParticleChangeForLoss::ProposeCharge(G4double theCharge) +{ + currentCharge = theCharge; +} + inline const G4ThreeVector& G4ParticleChangeForLoss::GetProposedMomentumDirection() const { return proposedMomentumDirection; } +inline + const G4ThreeVector& G4ParticleChangeForLoss::GetMomentumDirection() const +{ + return proposedMomentumDirection; +} + +inline + void G4ParticleChangeForLoss::ProposeMomentumDirection(const G4ThreeVector& dir) +{ + proposedMomentumDirection = dir; +} + inline void G4ParticleChangeForLoss::SetProposedMomentumDirection(const G4ThreeVector& dir) { proposedMomentumDirection = dir; } +inline + void G4ParticleChangeForLoss::ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz) +{ + proposedMomentumDirection.setX(Px); + proposedMomentumDirection.setY(Py); + proposedMomentumDirection.setZ(Pz); +} + inline void G4ParticleChangeForLoss::InitializeForAlongStep(const G4Track& track) { theStatusChange = track.GetTrackStatus(); theLocalEnergyDeposit = 0.0; InitializeSecondaries(track); - kinEnergy = track.GetKineticEnergy(); + theParentWeight = track.GetWeight(); + proposedKinEnergy = track.GetKineticEnergy(); currentCharge = track.GetDynamicParticle()->GetCharge(); } @@ -153,7 +199,8 @@ inline void G4ParticleChangeForLoss::InitializeForPostStep(const G4Track& track) theStatusChange = track.GetTrackStatus(); theLocalEnergyDeposit = 0.0; InitializeSecondaries(track); - kinEnergy = track.GetKineticEnergy(); + theParentWeight = track.GetWeight(); + proposedKinEnergy = track.GetKineticEnergy(); currentCharge = track.GetDynamicParticle()->GetCharge(); proposedMomentumDirection = track.GetMomentumDirection(); currentTrack = &track; diff --git a/source/track/include/G4ParticleChangeForMSC.hh b/source/track/include/G4ParticleChangeForMSC.hh index 2c77005bc6..497a7f701c 100644 --- a/source/track/include/G4ParticleChangeForMSC.hh +++ b/source/track/include/G4ParticleChangeForMSC.hh @@ -21,7 +21,7 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForMSC.hh,v 1.6 2004/01/20 15:29:41 vnivanch Exp $ +// $Id: G4ParticleChangeForMSC.hh,v 1.7 2004/05/08 15:28:11 kurasige Exp $ // GEANT4 tag $ $ // // @@ -83,18 +83,28 @@ class G4ParticleChangeForMSC: public G4VParticleChange // "Change", what it stores (and returns in get) are the "FINAL" // values of the Position, Momentum, etc. - void SetMomentumChange(const G4ThreeVector& Pfinal); - void SetMomentumChange(G4double Px, G4double Py, G4double Pz); + void ProposeMomentumDirection(const G4ThreeVector& Pfinal); + void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz); + const G4ThreeVector* GetMomentumDirection() const; const G4ThreeVector* GetProposedMomentumDirection() const; void SetProposedMomentumDirection(const G4ThreeVector& Pfinal); // Get/Set theMomentumDirectionChange vector: it is the final momentum direction. - const G4ThreeVector* GetPositionChange() const; - void SetPositionChange(const G4ThreeVector& finalPosition); + const G4ThreeVector* GetPosition() const; + void ProposePosition(const G4ThreeVector& finalPosition); const G4ThreeVector* GetProposedPosition() const; - void SetProposedPosition(const G4ThreeVector& finalPosition); + void SetProposedPosition(const G4ThreeVector& finalPosition); // Get/Set the final position of the current particle. + public: + // Following methods will be removed in release 7.0 + // Using ProposeXXXX methods is recommended to setting + // properties in G4ParticleChangeForMSC + void SetMomentumChange(const G4ThreeVector& Pfinal); + void SetMomentumChange(G4double Px, G4double Py, G4double Pz); + const G4ThreeVector* GetPositionChange() const; + void SetPositionChange(const G4ThreeVector& finalPosition); + public: virtual void DumpInfo() const; // for Debug @@ -113,61 +123,6 @@ class G4ParticleChangeForMSC: public G4VParticleChange }; -inline - void G4ParticleChangeForMSC::SetMomentumChange(const G4ThreeVector& P) -{ - theMomentumDirection = P; -} - -inline - void G4ParticleChangeForMSC::SetProposedMomentumDirection(const G4ThreeVector& P) -{ - theMomentumDirection = P; -} - -inline - void G4ParticleChangeForMSC::SetMomentumChange(G4double Px, G4double Py, G4double Pz) -{ - theMomentumDirection.setX(Px); - theMomentumDirection.setY(Py); - theMomentumDirection.setZ(Pz); -} - -inline - const G4ThreeVector* G4ParticleChangeForMSC::GetProposedMomentumDirection() const -{ - return &theMomentumDirection; -} - -inline - void G4ParticleChangeForMSC::SetProposedPosition(const G4ThreeVector& P) -{ - thePosition = P; -} - -inline - const G4ThreeVector* G4ParticleChangeForMSC::GetProposedPosition() const -{ - return &thePosition; -} - -inline - void G4ParticleChangeForMSC::SetPositionChange(const G4ThreeVector& P) -{ - thePosition = P; -} - -inline - const G4ThreeVector* G4ParticleChangeForMSC::GetPositionChange() const -{ - return &thePosition; -} - -inline void G4ParticleChangeForMSC::Initialize(const G4Track& track) -{ - theStatusChange = track.GetTrackStatus(); - theMomentumDirection = track.GetMomentumDirection(); - thePosition = track.GetPosition(); -} - +#include "G4ParticleChangeForMSC.icc" #endif + diff --git a/source/track/include/G4ParticleChangeForMSC.icc b/source/track/include/G4ParticleChangeForMSC.icc index d332164939..48a75d55f5 100644 --- a/source/track/include/G4ParticleChangeForMSC.icc +++ b/source/track/include/G4ParticleChangeForMSC.icc @@ -21,73 +21,98 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForMSC.icc,v 1.4 2001/07/11 10:08:36 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ParticleChangeForMSC.icc,v 1.5 2004/05/08 15:28:12 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // -inline - const G4ThreeVector* G4ParticleChangeForMSC::GetMomentumChange() const + +inline + void G4ParticleChangeForMSC::ProposeMomentumDirection(const G4ThreeVector& P) { - return &theMomentumDirectionChange; + theMomentumDirection = P; } -inline - void G4ParticleChangeForMSC::SetMomentumChange( - G4double Px, - G4double Py, - G4double Pz ) +inline + void G4ParticleChangeForMSC::SetProposedMomentumDirection(const G4ThreeVector& P) { - theMomentumDirectionChange.setX(Px); - theMomentumDirectionChange.setY(Py); - theMomentumDirectionChange.setZ(Pz); + theMomentumDirection = P; } -inline +inline + void G4ParticleChangeForMSC::ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz) +{ + theMomentumDirection.setX(Px); + theMomentumDirection.setY(Py); + theMomentumDirection.setZ(Pz); +} + +inline + const G4ThreeVector* G4ParticleChangeForMSC::GetMomentumDirection() const +{ + return &theMomentumDirection; +} + +inline + const G4ThreeVector* G4ParticleChangeForMSC::GetProposedMomentumDirection() const +{ + return &theMomentumDirection; +} + +inline + void G4ParticleChangeForMSC::SetProposedPosition(const G4ThreeVector& P) +{ + thePosition = P; +} + +inline + const G4ThreeVector* G4ParticleChangeForMSC::GetPosition() const +{ + return &thePosition; +} + +inline + const G4ThreeVector* G4ParticleChangeForMSC::GetProposedPosition() const +{ + return &thePosition; +} + +inline + void G4ParticleChangeForMSC::ProposePosition(const G4ThreeVector& P) +{ + thePosition = P; +} + + +inline void G4ParticleChangeForMSC::Initialize(const G4Track& track) +{ + theStatusChange = track.GetTrackStatus(); + theMomentumDirection = track.GetMomentumDirection(); + thePosition = track.GetPosition(); +} + +// Following methods will be removed in release 7.0 +inline void G4ParticleChangeForMSC::SetMomentumChange(const G4ThreeVector& P) { - theMomentumDirectionChange = P; -} -inline - const G4ThreeVector* G4ParticleChangeForMSC::GetMomentumDirectionChange() const -{ - return &theMomentumDirectionChange; + ProposeMomentumDirection(P); } -inline - void G4ParticleChangeForMSC::SetMomentumDirectionChange( - G4double Px, - G4double Py, - G4double Pz ) +inline + void G4ParticleChangeForMSC::SetMomentumChange(G4double Px, G4double Py, G4double Pz) { - theMomentumDirectionChange.setX(Px); - theMomentumDirectionChange.setY(Py); - theMomentumDirectionChange.setZ(Pz); + ProposeMomentumDirection(Px, Py, Pz); } -inline - void G4ParticleChangeForMSC::SetMomentumDirectionChange(const G4ThreeVector& P) +inline + void G4ParticleChangeForMSC::SetPositionChange(const G4ThreeVector& P) { - theMomentumDirectionChange = P; + ProposePosition(P); } -inline +inline const G4ThreeVector* G4ParticleChangeForMSC::GetPositionChange() const { - return &thePositionChange; -} - -inline - void G4ParticleChangeForMSC::SetPositionChange(const G4ThreeVector& finalPosition) -{ - thePositionChange= finalPosition; -} - -inline - void G4ParticleChangeForMSC::SetPositionChange(G4double x,G4double y, G4double z) -{ - thePositionChange.setX(x); - thePositionChange.setY(y); - thePositionChange.setZ(z); + return GetPosition(); } diff --git a/source/track/include/G4ParticleChangeForTransport.hh b/source/track/include/G4ParticleChangeForTransport.hh index 8a694a1248..b4627ab110 100644 --- a/source/track/include/G4ParticleChangeForTransport.hh +++ b/source/track/include/G4ParticleChangeForTransport.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForTransport.hh,v 1.12 2003/09/19 19:08:14 kurasige Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParticleChangeForTransport.hh,v 1.13 2004/05/08 15:28:13 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -90,17 +90,26 @@ class G4ParticleChangeForTransport: public G4ParticleChange // Get/Set the touchable of the current particle. // Note: Touchable in PostStepPoint will be updated only after PostStepDoIt - G4Material* GetMaterialChange() const; - void SetMaterialChange(G4Material* fMaterial); - // Get/Set the material in the touchable of the current particle. + G4Material* GetMaterialInTouchable() const; + void SetMaterialInTouchable(G4Material* fMaterial); + // Get/Propose the material in the touchable of the current particle. - const G4MaterialCutsCouple* GetMaterialCutsCoupleChange() const; - void SetMaterialCutsCoupleChange(const G4MaterialCutsCouple* fMaterialCutsCouple); + const G4MaterialCutsCouple* GetMaterialCutsCoupleInTouchable() const; + void SetMaterialCutsCoupleInTouchable(const G4MaterialCutsCouple* fMaterialCutsCouple); // Get/Set the materialCutsCouple in the touchable of the current particle. G4bool GetMomentumChanged() const; void SetMomentumChanged(G4bool b); + public: + // Following methods will be removed in release 7.0 + // Using ProposeXXXX methods is recommended to setting + // properties in G4ParticleChangeForDecay + G4Material* GetMaterialChange() const; + void SetMaterialChange(G4Material* fMaterial); + const G4MaterialCutsCouple* GetMaterialCutsCoupleChange() const; + void SetMaterialCutsCoupleChange(const G4MaterialCutsCouple* fMaterialCutsCouple); + public: virtual void DumpInfo() const; @@ -131,3 +140,9 @@ class G4ParticleChangeForTransport: public G4ParticleChange #include "G4ParticleChangeForTransport.icc" #endif + + + + + + diff --git a/source/track/include/G4ParticleChangeForTransport.icc b/source/track/include/G4ParticleChangeForTransport.icc index 11fb6c5677..bd7fd7654f 100644 --- a/source/track/include/G4ParticleChangeForTransport.icc +++ b/source/track/include/G4ParticleChangeForTransport.icc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForTransport.icc,v 1.9 2003/06/16 17:12:57 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4ParticleChangeForTransport.icc,v 1.10 2004/05/08 15:28:13 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // inline @@ -40,25 +40,25 @@ inline inline - void G4ParticleChangeForTransport::SetMaterialChange(G4Material* fMaterial) + void G4ParticleChangeForTransport::SetMaterialInTouchable(G4Material* fMaterial) { theMaterialChange = fMaterial; } inline - G4Material* G4ParticleChangeForTransport::GetMaterialChange() const + G4Material* G4ParticleChangeForTransport::GetMaterialInTouchable() const { return theMaterialChange; } inline - void G4ParticleChangeForTransport::SetMaterialCutsCoupleChange(const G4MaterialCutsCouple* fMaterialCutsCouple) + void G4ParticleChangeForTransport::SetMaterialCutsCoupleInTouchable(const G4MaterialCutsCouple* fMaterialCutsCouple) { theMaterialCutsCoupleChange = fMaterialCutsCouple; } inline - const G4MaterialCutsCouple* G4ParticleChangeForTransport::GetMaterialCutsCoupleChange() const + const G4MaterialCutsCouple* G4ParticleChangeForTransport::GetMaterialCutsCoupleInTouchable() const { return theMaterialCutsCoupleChange; } @@ -126,3 +126,38 @@ G4ParticleChangeForTransport::GetPointerToVectorOfAuxiliaryPoints() const { return fpVectorOfAuxiliaryPointsPointer; } + + +// Following methods will be removed in release 7.0 +inline + void G4ParticleChangeForTransport::SetMaterialChange(G4Material* fMaterial) +{ + theMaterialChange = fMaterial; +} + +inline + G4Material* G4ParticleChangeForTransport::GetMaterialChange() const +{ + return theMaterialChange; +} + +inline + void G4ParticleChangeForTransport::SetMaterialCutsCoupleChange(const G4MaterialCutsCouple* fMaterialCutsCouple) +{ + theMaterialCutsCoupleChange = fMaterialCutsCouple; +} + +inline + const G4MaterialCutsCouple* G4ParticleChangeForTransport::GetMaterialCutsCoupleChange() const +{ + return theMaterialCutsCoupleChange; +} + + + + + + + + + diff --git a/source/track/include/G4Track.icc b/source/track/include/G4Track.icc index b2b253d385..18445b3c27 100644 --- a/source/track/include/G4Track.icc +++ b/source/track/include/G4Track.icc @@ -21,16 +21,22 @@ // ******************************************************************** // // -// $Id: G4Track.icc,v 1.10 2002/12/16 11:59:12 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Track.icc,v 1.13 2004/06/11 14:28:13 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //----------------------------------------------------------------- // Definitions of inline functions //----------------------------------------------------------------- // change GetMaterial 16 Feb. 2000 H.Kurashige - + +#if defined G4TRACK_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aTrackAllocator; +#else + extern G4DLLIMPORT G4Allocator aTrackAllocator; +#endif + // Operators - extern G4Allocator aTrackAllocator; + inline void* G4Track::operator new(size_t) { void *aTrack; aTrack = (void *) aTrackAllocator.MallocSingle(); diff --git a/source/track/include/G4VParticleChange.hh b/source/track/include/G4VParticleChange.hh index f54c80445b..e5d02c248b 100644 --- a/source/track/include/G4VParticleChange.hh +++ b/source/track/include/G4VParticleChange.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4VParticleChange.hh,v 1.10 2003/12/12 13:12:13 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4VParticleChange.hh,v 1.11 2004/05/08 15:28:13 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // ------------------------------------------------------------ @@ -66,6 +66,7 @@ // add CheckIt 13 Apr.,99 H.Kurashige // add accuracy leveles 5 May, 99 H.Kurashige // add check secondaries 11 June, 03 H.Kurashige +// add new methods of ProposeXXX 08 May, 04 H.Kurashige #ifndef G4VParticleChange_h #define G4VParticleChange_h 1 @@ -132,24 +133,24 @@ class G4VParticleChange public: // with description //---- the following methods are for TruePathLength ---- G4double GetTrueStepLength() const; - void SetTrueStepLength(G4double truePathLength); - // Get/Set theTrueStepLength + void ProposeTrueStepLength(G4double truePathLength); + // Get/Propose theTrueStepLength //---- the following methods are for LocalEnergyDeposit ---- G4double GetLocalEnergyDeposit() const; - void SetLocalEnergyDeposit(G4double anEnergyPart); - // Get/Set the locally deposited energy + void ProposeLocalEnergyDeposit(G4double anEnergyPart); + // Get/Propose the locally deposited energy //---- the following methods are for TrackStatus ----- - G4TrackStatus GetStatusChange() const; - void SetStatusChange(G4TrackStatus status); - // Get/Set the final TrackStatus of the current particle. + G4TrackStatus GetTrackStatus() const; + void ProposeTrackStatus(G4TrackStatus status); + // Get/Propose the final TrackStatus of the current particle. // ------------------------------------------------------ //---- the following methods are for managements of SteppingControl -- G4SteppingControl GetSteppingControl() const; - void SetSteppingControl(G4SteppingControl StepControlFlag); - // Set/Get a flag to control stepping manager behavier + void ProposeSteppingControl(G4SteppingControl StepControlFlag); + // Set/Propose a flag to control stepping manager behavier // ------------------------------------------------------ //---- the following methods are for managements of secondaries -- @@ -178,8 +179,9 @@ class G4VParticleChange G4double GetParentWeight() const ; // Get weight of the parent (i.e. current) track + void ProposeParentWeight(G4double); + // Propse new weight of the parent (i.e. current) track - void SetParentWeight(G4double); void SetParentWeightByProcess(G4bool); G4bool IsParentWeightSetByProcess() const; // If fParentWeightByProcess flag is false (true in default), @@ -199,6 +201,18 @@ class G4VParticleChange void SetVerboseLevel(G4int vLevel); G4int GetVerboseLevel() const; + public: + // Following methods will be removed in release 7.0 + // Using ProposeXXXX methods is recommended to setting + // properties in G4VParticleChange + + void SetTrueStepLength(G4double truePathLength); + void SetLocalEnergyDeposit(G4double anEnergyPart); + G4TrackStatus GetStatusChange() const; + void SetStatusChange(G4TrackStatus status); + void SetSteppingControl(G4SteppingControl StepControlFlag); + void SetParentWeight(G4double); + protected: G4TrackFastVector* theListOfSecondaries; diff --git a/source/track/include/G4VParticleChange.icc b/source/track/include/G4VParticleChange.icc index 16b3874291..b2df998e28 100644 --- a/source/track/include/G4VParticleChange.icc +++ b/source/track/include/G4VParticleChange.icc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4VParticleChange.icc,v 1.10 2003/06/11 07:16:28 kurasige Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4VParticleChange.icc,v 1.11 2004/05/08 15:28:13 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // //---------------------------------------------------------------- // Virtual methods for updating G4Step @@ -81,13 +81,13 @@ inline } inline - void G4VParticleChange::SetStatusChange(G4TrackStatus aStatus) + void G4VParticleChange::ProposeTrackStatus(G4TrackStatus aStatus) { theStatusChange = aStatus; } inline - G4TrackStatus G4VParticleChange::GetStatusChange() const + G4TrackStatus G4VParticleChange::GetTrackStatus() const { return theStatusChange; } @@ -99,7 +99,7 @@ G4SteppingControl G4VParticleChange::GetSteppingControl() const } inline -void G4VParticleChange::SetSteppingControl(G4SteppingControl StepControlFlag) +void G4VParticleChange::ProposeSteppingControl(G4SteppingControl StepControlFlag) { theSteppingControlFlag = StepControlFlag; } @@ -115,7 +115,7 @@ inline } inline - void G4VParticleChange::SetLocalEnergyDeposit(G4double anEnergyPart) + void G4VParticleChange::ProposeLocalEnergyDeposit(G4double anEnergyPart) { theLocalEnergyDeposit = anEnergyPart; } @@ -127,7 +127,7 @@ inline } inline - void G4VParticleChange::SetTrueStepLength(G4double aLength) + void G4VParticleChange::ProposeTrueStepLength(G4double aLength) { theTrueStepLength = aLength; } @@ -288,7 +288,7 @@ inline } inline - void G4VParticleChange::SetParentWeight(G4double w) + void G4VParticleChange::ProposeParentWeight(G4double w) { theParentWeight = w; } @@ -305,4 +305,41 @@ inline return fSetParentWeightByProcess; } +// Following methods will be removed in release 7.0 +inline + void G4VParticleChange::SetStatusChange(G4TrackStatus aStatus) +{ + ProposeTrackStatus(aStatus); +} + +inline + G4TrackStatus G4VParticleChange::GetStatusChange() const +{ + return GetTrackStatus(); +} + +inline +void G4VParticleChange::SetSteppingControl(G4SteppingControl StepControlFlag) +{ + ProposeSteppingControl(StepControlFlag); +} + +inline + void G4VParticleChange::SetLocalEnergyDeposit(G4double anEnergyPart) +{ + ProposeLocalEnergyDeposit(anEnergyPart); +} + + +inline + void G4VParticleChange::SetTrueStepLength(G4double aLength) +{ + ProposeTrueStepLength(aLength); +} + +inline + void G4VParticleChange::SetParentWeight(G4double w) +{ + ProposeParentWeight(w); +} diff --git a/source/track/src/G4ParticleChange.cc b/source/track/src/G4ParticleChange.cc index cd0a53a78a..8c5bfedcce 100644 --- a/source/track/src/G4ParticleChange.cc +++ b/source/track/src/G4ParticleChange.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChange.cc,v 1.24 2003/11/24 10:27:52 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4ParticleChange.cc,v 1.26 2004/05/08 15:28:13 kurasige Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -223,7 +223,6 @@ G4Step* G4ParticleChange::UpdateStepForAlongStep(G4Step* pStep) G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint(); G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); - G4Track* aTrack = pStep->GetTrack(); G4double mass = theMassChange; // Set Mass/Charge @@ -273,6 +272,7 @@ G4Step* G4ParticleChange::UpdateStepForAlongStep(G4Step* pStep) pPostStepPoint->SetWeight( newWeight ); #ifdef G4VERBOSE + G4Track* aTrack = pStep->GetTrack(); if (debugFlag) CheckIt(*aTrack); #endif @@ -421,7 +421,7 @@ G4bool G4ParticleChange::CheckIt(const G4Track& aTrack) G4double accuracy; // No check in case of "fStopAndKill" - if (GetStatusChange() == fStopAndKill ) { + if (GetTrackStatus() == fStopAndKill ) { return G4VParticleChange::CheckIt(aTrack); } diff --git a/source/track/src/G4ParticleChangeForLoss.cc b/source/track/src/G4ParticleChangeForLoss.cc index 7c37d79375..32fd426cd4 100644 --- a/source/track/src/G4ParticleChangeForLoss.cc +++ b/source/track/src/G4ParticleChangeForLoss.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4ParticleChangeForLoss.cc,v 1.9 2004/01/20 15:29:41 vnivanch Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4ParticleChangeForLoss.cc,v 1.13 2004/06/15 08:17:38 vnivanch Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // -------------------------------------------------------------- @@ -70,8 +70,9 @@ G4ParticleChangeForLoss::G4ParticleChangeForLoss( G4cout << "G4ParticleChangeForLoss:: copy constructor is called " << G4endl; } currentTrack = right.currentTrack; - kinEnergy = right.kinEnergy; + proposedKinEnergy = right.proposedKinEnergy; currentCharge = right.currentCharge; + //theProposedWeight = right.theProposedWeight; proposedMomentumDirection = right.proposedMomentumDirection; } @@ -92,8 +93,9 @@ G4ParticleChangeForLoss & G4ParticleChangeForLoss::operator=( theSteppingControlFlag = right.theSteppingControlFlag; currentTrack = right.currentTrack; - kinEnergy = right.kinEnergy; + proposedKinEnergy = right.proposedKinEnergy; currentCharge = right.currentCharge; + //theProposedWeight = right.theProposedWeight; proposedMomentumDirection = right.proposedMomentumDirection; } return *this; @@ -112,18 +114,29 @@ G4Step* G4ParticleChangeForLoss::UpdateStepForAlongStep(G4Step* pStep) // So, the differences (delta) between these two states have to be // calculated and be accumulated in PostStepPoint. + G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint(); G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); // calculate new kinetic energy - G4double energy = pPostStepPoint->GetKineticEnergy() - + (kinEnergy - pStep->GetPreStepPoint()->GetKineticEnergy()); + G4double kinEnergy = pPostStepPoint->GetKineticEnergy() + + (proposedKinEnergy - pPreStepPoint->GetKineticEnergy()); // update kinetic energy and momentum direction - if (energy < 0.0) energy = 0.0; + if (kinEnergy < 0.0) { + theLocalEnergyDeposit += kinEnergy; + kinEnergy = 0.0; + } - pPostStepPoint->SetKineticEnergy( energy ); + pPostStepPoint->SetKineticEnergy( kinEnergy ); pPostStepPoint->SetCharge( currentCharge ); + // update weight + // this feature is commented out, it should be overwritten in case + // if energy loss processes will use biasing + // G4double newWeight = theProposedWeight/(pPreStepPoint->GetWeight())*(pPostStepPoint->GetWeight()); + // pPostStepPoint->SetWeight( newWeight ); + + // Not necessary to check now //#ifdef G4VERBOSE // if (debugFlag) CheckIt(*aTrack); @@ -145,10 +158,15 @@ G4Step* G4ParticleChangeForLoss::UpdateStepForPostStep(G4Step* pStep) G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint(); - pPostStepPoint->SetKineticEnergy( kinEnergy ); + pPostStepPoint->SetKineticEnergy( proposedKinEnergy ); pPostStepPoint->SetCharge( currentCharge ); pPostStepPoint->SetMomentumDirection( proposedMomentumDirection ); + // update weight + // this feature is commented out, it should be overwritten in case + // if energy loss processes will use biasing + // pPostStepPoint->SetWeight( theProposedWeight ); + // Not necessary to check now //#ifdef G4VERBOSE // if (debugFlag) CheckIt(*aTrack); @@ -173,7 +191,7 @@ void G4ParticleChangeForLoss::DumpInfo() const << std::setw(20) << currentCharge/eplus << G4endl; G4cout << " Kinetic Energy (MeV): " - << std::setw(20) << kinEnergy/MeV + << std::setw(20) << proposedKinEnergy/MeV << G4endl; G4cout << " Momentum Direct - x : " << std::setw(20) << proposedMomentumDirection.x() @@ -194,7 +212,7 @@ G4bool G4ParticleChangeForLoss::CheckIt(const G4Track& aTrack) G4double accuracy; // Energy should not be lager than initial value - accuracy = ( kinEnergy - aTrack.GetKineticEnergy())/MeV; + accuracy = ( proposedKinEnergy - aTrack.GetKineticEnergy())/MeV; if (accuracy > accuracyForWarning) { #ifdef G4VERBOSE G4cout << "G4ParticleChangeForLoss::CheckIt: "; @@ -223,7 +241,7 @@ G4bool G4ParticleChangeForLoss::CheckIt(const G4Track& aTrack) //correction if (!itsOK) { - kinEnergy = aTrack.GetKineticEnergy(); + proposedKinEnergy = aTrack.GetKineticEnergy(); } itsOK = (itsOK) && G4VParticleChange::CheckIt(aTrack); diff --git a/source/track/src/G4Track.cc b/source/track/src/G4Track.cc index e822abd608..da79b3430c 100644 --- a/source/track/src/G4Track.cc +++ b/source/track/src/G4Track.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Track.cc,v 1.19 2003/05/20 22:24:41 asaim Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Track.cc,v 1.21 2004/06/11 14:28:14 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //--------------------------------------------------------------- @@ -33,6 +33,7 @@ // Add copy constructor Hisaya Feb. 07 01 // Fix GetVelocity Hisaya Feb. 17 01 // Modification for G4TouchableHandle 22 Oct. 2001 R.Chytracek// + #include "G4Track.hh" G4Allocator aTrackAllocator; diff --git a/source/tracking/GNUmakefile b/source/tracking/GNUmakefile index 311ccdfdfc..11005c25db 100644 --- a/source/tracking/GNUmakefile +++ b/source/tracking/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.3 2003/10/03 14:50:21 gcosmo Exp $ +# $Id: GNUmakefile,v 1.5 2004/06/11 14:30:16 gcosmo Exp $ # ---------------------------------------------------------- # GNUmakefile for tracking library. Katsuya Amako, 5/9/95. # ---------------------------------------------------------- @@ -9,8 +9,14 @@ ifndef G4INSTALL G4INSTALL = ../.. endif +GLOBLIBS = libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk +CPPFLAGS += -DG4TRACKING_ALLOC_EXPORT CPPFLAGS += -I$(G4BASE)/global/management/include \ -I$(G4BASE)/global/HEPRandom/include \ -I$(G4BASE)/global/HEPGeometry/include \ diff --git a/source/tracking/History b/source/tracking/History index 5296e9df78..c22e142b43 100644 --- a/source/tracking/History +++ b/source/tracking/History @@ -1,4 +1,4 @@ -$Id: History,v 1.72 2004/03/19 19:14:21 asaim Exp $ +$Id: History,v 1.75 2004/06/11 15:21:41 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -17,6 +17,22 @@ committal in the CVS repository ! * Reverse chronological order (last date on top), please * ---------------------------------------------------------- +Jun.11, 2004 G.Cosmo (tracking-V06-01-02) +- Use global flag G4TRACKING_ALLOC_EXPORT to export extern symbols for DLLs. + Modified GNUmakefile and rearranged usage of extern symbols in classes. + +Jun.09, 2004 G.Cosmo (tracking-V06-01-01) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Coworks with "global-V06-01-02b". + +Jun.07, 2004 G.Cosmo (tracking-V06-01-00) +- Export extern symbols for allowing support of DLLs on Windows. + Modified files: G4Trajectory.hh, G4TrajectoryPoint.hh, + G4SmoothTrajectory.hh, G4SmoothTrajectoryPoint.hh. +- GNUmakefile: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + Mar.19, 2004 M.Asai (tracking-V06-00-01) - G4SteppingManager2.cc has been restored back to the version in geant4-06-00. The tag tracking-V06-00-00 was meant to be internal diff --git a/source/tracking/include/G4SmoothTrajectory.hh b/source/tracking/include/G4SmoothTrajectory.hh index 61a70ccf80..be4bf0c92a 100644 --- a/source/tracking/include/G4SmoothTrajectory.hh +++ b/source/tracking/include/G4SmoothTrajectory.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SmoothTrajectory.hh,v 1.5 2003/06/16 17:13:07 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4SmoothTrajectory.hh,v 1.8 2004/06/11 14:30:17 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //--------------------------------------------------------------- @@ -124,7 +124,11 @@ public: // with description }; -extern G4Allocator aSmoothTrajectoryAllocator; +#if defined G4TRACKING_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aSmoothTrajectoryAllocator; +#else + extern G4DLLIMPORT G4Allocator aSmoothTrajectoryAllocator; +#endif inline void* G4SmoothTrajectory::operator new(size_t) { diff --git a/source/tracking/include/G4SmoothTrajectoryPoint.hh b/source/tracking/include/G4SmoothTrajectoryPoint.hh index 0b8da7463a..5d3b35a41d 100644 --- a/source/tracking/include/G4SmoothTrajectoryPoint.hh +++ b/source/tracking/include/G4SmoothTrajectoryPoint.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SmoothTrajectoryPoint.hh,v 1.7 2003/06/16 17:13:08 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4SmoothTrajectoryPoint.hh,v 1.10 2004/06/11 14:30:17 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //--------------------------------------------------------------- @@ -83,12 +83,13 @@ public: // without description // Member data G4ThreeVector fPosition; std::vector* fAuxiliaryPointVector; - - }; - -extern G4Allocator aSmoothTrajectoryPointAllocator; +#if defined G4TRACKING_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aSmoothTrajectoryPointAllocator; +#else + extern G4DLLIMPORT G4Allocator aSmoothTrajectoryPointAllocator; +#endif inline void* G4SmoothTrajectoryPoint::operator new(size_t) { diff --git a/source/tracking/include/G4Trajectory.hh b/source/tracking/include/G4Trajectory.hh index 25827b17b4..5cf2cff1a2 100644 --- a/source/tracking/include/G4Trajectory.hh +++ b/source/tracking/include/G4Trajectory.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Trajectory.hh,v 1.18 2003/06/16 17:13:11 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Trajectory.hh,v 1.21 2004/06/11 14:30:18 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //--------------------------------------------------------------- @@ -129,7 +129,11 @@ public: // with description }; -extern G4Allocator aTrajectoryAllocator; +#if defined G4TRACKING_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aTrajectoryAllocator; +#else + extern G4DLLIMPORT G4Allocator aTrajectoryAllocator; +#endif inline void* G4Trajectory::operator new(size_t) { diff --git a/source/tracking/include/G4TrajectoryPoint.hh b/source/tracking/include/G4TrajectoryPoint.hh index 5dabfcb383..76249abe24 100644 --- a/source/tracking/include/G4TrajectoryPoint.hh +++ b/source/tracking/include/G4TrajectoryPoint.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TrajectoryPoint.hh,v 1.11 2003/06/16 17:13:12 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4TrajectoryPoint.hh,v 1.14 2004/06/11 14:30:18 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // //--------------------------------------------------------------- @@ -92,8 +92,11 @@ public: // without description }; - -extern G4Allocator aTrajectoryPointAllocator; +#if defined G4TRACKING_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator aTrajectoryPointAllocator; +#else + extern G4DLLIMPORT G4Allocator aTrajectoryPointAllocator; +#endif inline void* G4TrajectoryPoint::operator new(size_t) { diff --git a/source/tracking/src/G4SmoothTrajectory.cc b/source/tracking/src/G4SmoothTrajectory.cc index 13248b3047..216b524278 100644 --- a/source/tracking/src/G4SmoothTrajectory.cc +++ b/source/tracking/src/G4SmoothTrajectory.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SmoothTrajectory.cc,v 1.10 2003/06/16 17:13:17 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4SmoothTrajectory.cc,v 1.12 2004/06/11 14:30:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- @@ -37,7 +37,6 @@ // // --------------------------------------------------------------- - #include "G4SmoothTrajectory.hh" #include "G4SmoothTrajectoryPoint.hh" #include "G4ParticleTable.hh" diff --git a/source/tracking/src/G4SmoothTrajectoryPoint.cc b/source/tracking/src/G4SmoothTrajectoryPoint.cc index d0c1e20d8f..b38e1aa6cc 100644 --- a/source/tracking/src/G4SmoothTrajectoryPoint.cc +++ b/source/tracking/src/G4SmoothTrajectoryPoint.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4SmoothTrajectoryPoint.cc,v 1.10 2003/06/16 17:13:18 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4SmoothTrajectoryPoint.cc,v 1.12 2004/06/11 14:30:19 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- diff --git a/source/tracking/src/G4Trajectory.cc b/source/tracking/src/G4Trajectory.cc index a7789e84af..87d0020e7d 100644 --- a/source/tracking/src/G4Trajectory.cc +++ b/source/tracking/src/G4Trajectory.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4Trajectory.cc,v 1.22 2003/06/16 17:13:24 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4Trajectory.cc,v 1.24 2004/06/11 14:30:20 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- @@ -37,7 +37,6 @@ // // --------------------------------------------------------------- - #include "G4Trajectory.hh" #include "G4TrajectoryPoint.hh" #include "G4ParticleTable.hh" diff --git a/source/tracking/src/G4TrajectoryPoint.cc b/source/tracking/src/G4TrajectoryPoint.cc index 67490a0751..4b0c60ee55 100644 --- a/source/tracking/src/G4TrajectoryPoint.cc +++ b/source/tracking/src/G4TrajectoryPoint.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4TrajectoryPoint.cc,v 1.12 2003/06/16 17:13:25 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4TrajectoryPoint.cc,v 1.14 2004/06/11 14:30:20 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // --------------------------------------------------------------- diff --git a/source/visualization/FukuiRenderer/GNUmakefile b/source/visualization/FukuiRenderer/GNUmakefile index 2d84e45b9d..eb7369a9f3 100644 --- a/source/visualization/FukuiRenderer/GNUmakefile +++ b/source/visualization/FukuiRenderer/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.4 2003/10/03 15:21:20 gcosmo Exp $ +# $Id: GNUmakefile,v 1.5 2004/06/03 11:40:12 gcosmo Exp $ name := G4FR @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/GNUmakefile b/source/visualization/GNUmakefile index 9d16296ff7..a87ede4205 100644 --- a/source/visualization/GNUmakefile +++ b/source/visualization/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.15 2003/11/06 14:53:11 johna Exp $ +# $Id: GNUmakefile,v 1.18 2004/06/03 11:40:11 gcosmo Exp $ # ----------------------------------------------------------------------- # GNUmakefile for visualization and modeling. John Allison, 5/7/95. # Modeling is always made. Others by environment. John Allison 4/7/98. @@ -48,14 +48,13 @@ endif #G4VIS_BUILD .PHONY: granular glob global clean +glob global: granular + granular: @for dir in $(SUBDIRS); do (cd $$dir; $(MAKE)); done includes: @for dir in $(SUBDIRS); do (cd $$dir && $(MAKE) $@ ); done -glob global: - @echo "ERROR: The global target not relevant for the visualization category." - clean clean_libs: @for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) $@); done diff --git a/source/visualization/HepRep/GNUmakefile b/source/visualization/HepRep/GNUmakefile index 411af6367d..cfa079d760 100644 --- a/source/visualization/HepRep/GNUmakefile +++ b/source/visualization/HepRep/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.15 2003/11/17 23:13:01 duns Exp $ +# $Id: GNUmakefile,v 1.18 2004/06/04 14:17:54 duns Exp $ name := G4visHepRep @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk @@ -15,15 +22,22 @@ CPPFLAGS += -I$(G4BASE)/visualization/HepRep/include/ref CPPFLAGS += -I$(G4BASE)/visualization/HepRep/include/zipios++ CPPFLAGS += -I$(G4BASE)/visualization/HepRep/include/zlib +CPPFLAGS += -I$(G4BASE)/event/include +CPPFLAGS += -I$(G4BASE)/track/include +CPPFLAGS += -I$(G4BASE)/run/include CPPFLAGS += -I$(G4BASE)/digits_hits/hits/include +CPPFLAGS += -I$(G4BASE)/particles/management/include CPPFLAGS += -I$(G4BASE)/tracking/include CPPFLAGS += -I$(G4BASE)/visualization/management/include CPPFLAGS += -I$(G4BASE)/visualization/modeling/include CPPFLAGS += -I$(G4BASE)/global/management/include +CPPFLAGS += -I$(G4BASE)/global/HEPRandom/include CPPFLAGS += -I$(G4BASE)/global/HEPGeometry/include CPPFLAGS += -I$(G4BASE)/graphics_reps/include CPPFLAGS += -I$(G4BASE)/intercoms/include +CPPFLAGS += -I$(G4BASE)/processes/management/include CPPFLAGS += -I$(G4BASE)/geometry/management/include +CPPFLAGS += -I$(G4BASE)/geometry/navigation/include CPPFLAGS += -I$(G4BASE)/geometry/solids/CSG/include CPPFLAGS += -I$(G4BASE)/geometry/volumes/include CPPFLAGS += -I$(G4BASE)/geometry/solids/specific/include diff --git a/source/visualization/HepRep/History b/source/visualization/HepRep/History index 576294b019..070d1f93c8 100644 --- a/source/visualization/HepRep/History +++ b/source/visualization/HepRep/History @@ -1,4 +1,4 @@ -.$Id: History,v 1.67 2004/03/15 08:05:37 perl Exp $ +.$Id: History,v 1.75 2004/06/17 06:50:35 duns Exp $ ------------------------------------------------------------------- ========================================================= @@ -19,6 +19,29 @@ committal in the CVS repository ! History file for visualization/HepRep sub-category -------------------------------------------------- +17 June 2004 Mark Donszelmann (vis-HepRep-V06-01-05 against geant4-06-02-cand-02) +- Fixed GEANT-50: + - Renamed zlib prefix from z_ to heprep_z_ + - Added symbol z_errmsg to list for renaming to avoid conflicts with other + programs who contain a copy of zlib (such as Root). + +4 June 2004 Mark Donszelmann (vis-HepRep-V06-01-04 against geant4-06-01-ref-02) +- Fixed compilation problem with G4RunManagerKernel + +27 May 2004 Joseph Perl (vis-HepRep-V06-01-02) +- Added attributes for Region and Root Region to both HepRep drivers. + +27 May 2004 Mark Donszelmann (vis-HepRep-V06-01-01) +- Fixed GEANT17: geometry files can be written separately. +- Updated README with instructions + see http://bugs.freehep.org/secure/BrowseProject.jspa?id=10041 + +26 May 2004 Mark Donszelmann (vis-HepRep-V06-01-00) +- Fixed GEANT-47: Added initial viewpoint settings and a command to set the + coordinate system. +- Fixed GEANT-41: copied new interfaces for HepRep, which uses fewer pointers, + see http://bugs.freehep.org/secure/BrowseProject.jspa?id=10041 + 14 March 2004 Joseph Perl (vis-HepRep-V06-00-06) - HepRepFile handle duplicate ShowView. - HepRepFile improve layering and hierarchy for hits. diff --git a/source/visualization/HepRep/README b/source/visualization/HepRep/README index deea465903..a29888fc8f 100644 --- a/source/visualization/HepRep/README +++ b/source/visualization/HepRep/README @@ -93,6 +93,18 @@ To write 10 events (and geometries), use: 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 @@ -109,5 +121,5 @@ 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 you can create as many views (SceneHandlers) as you like. -4 November 2003 +27 May 2004 Mark.Donszelmann@slac.stanford.edu diff --git a/source/visualization/HepRep/include/G4HepRepMessenger.hh b/source/visualization/HepRep/include/G4HepRepMessenger.hh index b914ba0c6e..3672f1700b 100644 --- a/source/visualization/HepRep/include/G4HepRepMessenger.hh +++ b/source/visualization/HepRep/include/G4HepRepMessenger.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepMessenger.hh,v 1.3 2003/12/11 21:55:54 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepMessenger.hh,v 1.5 2004/05/27 05:55:19 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // #ifndef G4HepRepMessenger_HH @@ -45,6 +45,7 @@ class G4HepRepMessenger : public G4UImessenger { virtual G4String getEventNumberSuffix(); virtual G4bool appendGeometry(); virtual G4bool addPointAttributes(); + virtual G4String getCoordinateSystem(); private: @@ -54,10 +55,13 @@ class G4HepRepMessenger : public G4UImessenger { G4UIcmdWithAString* setEventNumberSuffixCommand; G4bool geometry; -// G4UIcmdWithABool* appendGeometryCommand; + G4UIcmdWithABool* appendGeometryCommand; G4bool pointAttributes; G4UIcmdWithABool* addPointAttributesCommand; + + G4String coordinateSystem; + G4UIcmdWithAString* setCoordinateSystemCommand; }; #endif diff --git a/source/visualization/HepRep/include/G4HepRepSceneHandler.hh b/source/visualization/HepRep/include/G4HepRepSceneHandler.hh index ce3b238194..7ed3c7304c 100644 --- a/source/visualization/HepRep/include/G4HepRepSceneHandler.hh +++ b/source/visualization/HepRep/include/G4HepRepSceneHandler.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepSceneHandler.hh,v 1.30 2003/12/11 21:55:55 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepSceneHandler.hh,v 1.32 2004/05/27 05:55:20 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /** @@ -127,12 +127,16 @@ class G4HepRepSceneHandler: public G4VSceneHandler { void open(G4String name); void close(); + void writeLayers(HEPREP::HepRep* heprep); + 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); // 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, int depth); HEPREP::HepRepInstance* getGeometryInstance(G4String volumeName, int depth); @@ -172,6 +176,7 @@ class G4HepRepSceneHandler: public G4VSceneHandler { // DO NOT USE member vars directly, use get methods. HEPREP::HepRep* _heprep; + HEPREP::HepRep* _heprepGeometry; HEPREP::HepRepInstanceTree* _geometryInstanceTree; std::vector _geometryInstance; HEPREP::HepRepInstance* _geometryRootInstance; diff --git a/source/visualization/HepRep/include/G4HepRepViewer.hh b/source/visualization/HepRep/include/G4HepRepViewer.hh index 32e0cce7bd..5662ebeaec 100644 --- a/source/visualization/HepRep/include/G4HepRepViewer.hh +++ b/source/visualization/HepRep/include/G4HepRepViewer.hh @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepViewer.hh,v 1.16 2003/12/11 21:55:55 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepViewer.hh,v 1.17 2004/05/27 05:55:20 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /** @@ -37,9 +37,11 @@ // Geant4 #include "G4VViewer.hh" +#include "G4HepRepMessenger.hh" + class G4HepRepViewer: public G4VViewer { public: - G4HepRepViewer (G4VSceneHandler& scene, const G4String& name = ""); + G4HepRepViewer (G4VSceneHandler& scene, G4HepRepMessenger& messenger, const G4String& name = ""); virtual ~G4HepRepViewer (); void SetView (); void ClearView (); @@ -47,8 +49,11 @@ class G4HepRepViewer: public G4VViewer { void ShowView (); void FinishView (); + void reset(); + private: bool geometryIncluded; + G4HepRepMessenger& messenger; }; #endif diff --git a/source/visualization/HepRep/include/HEPREP/HepRep.h b/source/visualization/HepRep/include/HEPREP/HepRep.h index be5c3ae10c..9fbdc91733 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRep.h +++ b/source/visualization/HepRep/include/HEPREP/HepRep.h @@ -7,8 +7,9 @@ #ifndef HEPREP_HEPREP_H #define HEPREP_HEPREP_H 1 -// Copyright 2000-2003, FreeHEP. +// Copyright 2000-2004, FreeHEP. +#include #include #include @@ -17,14 +18,15 @@ #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/HepRepIteratorListener.h" #include "HEPREP/HepRepPoint.h" #include "HEPREP/HepRepSelectFilter.h" #include "HEPREP/HepRepTreeID.h" @@ -37,7 +39,6 @@ namespace HEPREP { class HepRepAction; class HepRepInstanceTree; class HepRepSelectFilter; -class HepRepType; class HepRepTypeTree; /** @@ -61,22 +62,21 @@ public: * * @param layer name of layer to be added to the back of the list. */ - virtual bool addLayer(std::string layer) = 0; + 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; + virtual std::vector getLayerOrder() = 0; /** * Add a typetree to this heprep. * * @param typeTree to be added. - * @return false only if the tree is written immediately to some stream. */ - virtual bool addTypeTree(HepRepTypeTree * typeTree) = 0; + virtual void addTypeTree(HepRepTypeTree * typeTree) = 0; /** * Remove a typetree from this heprep. @@ -90,7 +90,7 @@ public: * * @return collection of HepRepTypeTrees. */ - virtual std::vector * getTypeTrees() = 0; + virtual std::set getTypeTrees() = 0; /** * Returns a named and versioned typetree. @@ -108,15 +108,13 @@ public: * @param name name of type. * @return named HepRepType. */ - virtual HepRepType * getType(std::string name) = 0; - +// HepRepType* getType(String name); /** * Adds an instancetree to this heprep. * * @param instanceTree to be added. - * @return false only if the tree is written immediately to some stream. */ - virtual bool addInstanceTree(HepRepInstanceTree * instanceTree) = 0; + virtual void addInstanceTree(HepRepInstanceTree * instanceTree) = 0; /** * Overlays an instancetree to this heprep, overriding attributes and adding children. @@ -137,7 +135,7 @@ public: * * @return collection of HepRepInstanceTrees. */ - virtual std::vector * getInstanceTrees() = 0; + virtual std::set getInstanceTrees() = 0; /** * Returns a named and versioned instancetree. diff --git a/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h b/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h index 7c9a08aee2..b2763427a4 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepAttribute.h @@ -9,6 +9,7 @@ // Copyright 2000-2002, FreeHEP. +#include #include #include @@ -33,9 +34,8 @@ public: * Adds an attValue. * * @param attValue to be added. - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(HepRepAttValue * attValue) = 0; + virtual void addAttValue(HepRepAttValue * attValue) = 0; /** @@ -47,18 +47,16 @@ public: * @param key name of attValue * @param value value of attValue * @param showLabel show this as label - * @return false if an IOException was created. */ - virtual bool addAttValue(std::string key, char* value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + 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 - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, std::string value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + virtual void addAttValue(std::string key, std::string value, int showLabel = HepRepConstants::SHOW_NONE) = 0; /** * Adds an attValue. @@ -66,9 +64,8 @@ public: * @param key name of attValue * @param value value of attValue * @param showLabel show this as label - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, int value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + virtual void addAttValue(std::string key, int value, int showLabel = HepRepConstants::SHOW_NONE) = 0; /** * Adds an attValue. @@ -76,9 +73,8 @@ public: * @param key name of attValue * @param value value of attValue * @param showLabel show this as label - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, double value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + virtual void addAttValue(std::string key, double value, int showLabel = HepRepConstants::SHOW_NONE) = 0; /** * Adds an attValue. @@ -86,9 +82,8 @@ public: * @param key name of attValue * @param value value of attValue * @param showLabel show this as label - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, bool value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + virtual void addAttValue(std::string key, bool value, int showLabel = HepRepConstants::SHOW_NONE) = 0; /** * Adds a Color attValue. @@ -96,9 +91,8 @@ public: * @param key name of attValue * @param value value of attValue * @param showLabel show this as label - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, std::vector value, int showLabel = HepRepConstants::SHOW_NONE) = 0; + virtual void addAttValue(std::string key, std::vector value, int showLabel = HepRepConstants::SHOW_NONE) = 0; /** * Adds a Color attValue. @@ -109,9 +103,8 @@ public: * @param blue color * @param alpha value * @param showLabel show this as label - * @return false only if the value is immediately written to a stream. */ - virtual bool addAttValue(std::string key, double red, double green, double blue, double alpha = 1.0, int showLabel = HepRepConstants::SHOW_NONE) = 0; + 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. @@ -135,7 +128,7 @@ public: * * @return collection of HepRepAttValues. */ - virtual std::vector * getAttValuesFromNode() = 0; + virtual std::set getAttValuesFromNode() = 0; /** * Returns a named attribute value from this node. diff --git a/source/visualization/HepRep/include/HEPREP/HepRepIteratorListener.h b/source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h similarity index 86% rename from source/visualization/HepRep/include/HEPREP/HepRepIteratorListener.h rename to source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h index 5e74113254..5ee9038908 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepIteratorListener.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepAttributeListener.h @@ -4,10 +4,10 @@ // 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_HEPREPITERATORLISTENER_H -#define HEPREP_HEPREPITERATORLISTENER_H 1 +#ifndef HEPREP_HEPREPATTRIBUTELISTENER_H +#define HEPREP_HEPREPATTRIBUTELISTENER_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2004, FreeHEP. #include #include @@ -15,25 +15,25 @@ namespace HEPREP { /** - * HepRepIteratorListener interface. The implementor is called back for changes + * 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 HepRepIteratorListener { +class HepRepAttributeListener { public: /// Destructor. - virtual ~HepRepIteratorListener() { /* nop */; } + virtual ~HepRepAttributeListener() { /* nop */; } /** * Called if attribute key changes its value. * * @param key name of the changed attribute. * @param value value 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(std::string key, std::string value, std::string lowerCaseValue, int showLabel) = 0; @@ -91,4 +91,4 @@ public: virtual void removeAttribute(std::string key) = 0; }; // class } // namespace HEPREP -#endif /* ifndef HEPREP_HEPREPITERATORLISTENER_H */ +#endif /* ifndef HEPREP_HEPREPATTRIBUTELISTENER_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h b/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h index c1463bd3b8..1a822da6cd 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepDefinition.h @@ -9,8 +9,8 @@ // Copyright 2000-2002, FreeHEP. +#include #include -#include #include "HEPREP/HepRepAttribute.h" @@ -37,17 +37,15 @@ public: * @param desc description of the definition. * @param category category of the definition. * @param extra extra info of the definition. - * @return false only if this definition is written immediately to a stream. */ - virtual bool addAttDef(std::string name, std::string desc, std::string category, std::string extra) = 0; + virtual void addAttDef(std::string name, std::string desc, std::string category, std::string extra) = 0; /** * Adds an attdef. * * @param attDef to be added. - * @return false only if this definition is written immediately to a stream. */ - virtual bool addAttDef(HepRepAttDef * attDef) = 0; + virtual void addAttDef(HepRepAttDef * attDef) = 0; /** * Return a named attribute definition searched on this node and any parent nodes. @@ -62,7 +60,7 @@ public: * * @return collection of attributes definitions. */ - virtual std::vector * getAttDefsFromNode() = 0; + virtual std::set getAttDefsFromNode() = 0; /** * Returns a named attribute definition defined on this node. diff --git a/source/visualization/HepRep/include/HEPREP/HepRepFactory.h b/source/visualization/HepRep/include/HEPREP/HepRepFactory.h index 45f64e53f6..93949ecf2f 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepFactory.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepFactory.h @@ -113,6 +113,14 @@ public: */ 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. * diff --git a/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h b/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h new file mode 100644 index 0000000000..1befb0ea84 --- /dev/null +++ b/source/visualization/HepRep/include/HEPREP/HepRepFrameListener.h @@ -0,0 +1,34 @@ +// -*- 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, 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 index 4427c2ba73..880d7c7255 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepInstance.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepInstance.h @@ -7,7 +7,7 @@ #ifndef HEPREP_HEPREPINSTANCE_H #define HEPREP_HEPREPINSTANCE_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2004, FreeHEP. #include @@ -15,11 +15,11 @@ namespace HEPREP { -class HepRep; class HepRepInstanceTree; class HepRepPoint; class HepRepSelectFilter; class HepRepType; +class HepRepTypeTree; /** * HepRepInstance interface. @@ -45,9 +45,8 @@ public: * Adds an sub-instance to this instance. * * @param instance sub-instance. - * @return false only if written immediately to a stream. */ - virtual bool addInstance(HepRepInstance * instance) = 0; + virtual void addInstance(HepRepInstance * instance) = 0; /** * Removes a sub-instance from this instance. @@ -61,7 +60,7 @@ public: * * @return collection of HepRepInstances. */ - virtual std::vector * getInstances() = 0; + virtual std::vector getInstances() = 0; /** * Returns the associated type for this instance. @@ -74,36 +73,56 @@ public: * Adds a point to this instance. * * @param point to be added. - * @return false only if written immediately to a stream. */ - virtual bool addPoint(HepRepPoint * point) = 0; + virtual void addPoint(HepRepPoint * point) = 0; /** * Returns a collection of all points this instance keeps. * * @return collection of HepRepPoints. */ - virtual std::vector * getPoints() = 0; + 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 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 heprep needed to find the associated type. + * @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(HepRep * heprep, HepRepInstance * parent, HepRepSelectFilter * filter = NULL) = 0; + virtual HepRepInstance * copy(HepRepTypeTree * typeTree, HepRepInstance * parent, HepRepSelectFilter * filter = NULL) = 0; /** * Returns a deep copy of this instance. * - * @param heprep needed to find the associated type. + * @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(HepRep * heprep, HepRepInstanceTree * parent, HepRepSelectFilter * filter = NULL) = 0; + 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 index 6915a54814..a9a993de8b 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepInstanceTree.h @@ -7,18 +7,19 @@ #ifndef HEPREP_HEPREPINSTANCETREE_H #define HEPREP_HEPREPINSTANCETREE_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2004, FreeHEP. +#include #include #include "HEPREP/HepRepTreeID.h" namespace HEPREP { -class HepRep; class HepRepInstance; class HepRepSelectFilter; class HepRepTreeID; +class HepRepTypeTree; /** * HepRepInstanceTree interface. @@ -42,9 +43,8 @@ public: * Adds an instance to this instancetree. * * @param instance to be added. - * @return false only if written immediately to a stream. */ - virtual bool addInstance(HepRepInstance * instance) = 0; + virtual void addInstance(HepRepInstance * instance) = 0; /** * Removes an instance from this instancetree. @@ -58,22 +58,21 @@ public: * * @return collection of HepRepInstances. */ - virtual std::vector * getInstances() = 0; + virtual std::vector getInstances() = 0; /** * Adds a related instance tree to this instancetree. * * @param instanceTree related instancetree. - * @return false only if written immediately to a stream. */ - virtual bool addInstanceTree(HepRepTreeID * instanceTree) = 0; + virtual void addInstanceTree(HepRepTreeID * instanceTree) = 0; /** * Returns a collection of associated instance trees. * * @return collection of HepRepTreeIDs. */ - virtual std::vector * getInstanceTrees() = 0; + virtual std::set getInstanceTrees() = 0; /** * Returns the associated typetree. @@ -85,13 +84,10 @@ public: /** * Returns a deep copy of this instancetree. * - * @param heprep needed to find the associated type. * @param filter to filter the instances. * @return copy of this instancetree. */ - virtual HepRepInstanceTree * copy(HepRep * heprep, HepRepSelectFilter * filter = NULL) = 0; - - virtual HepRepTreeID * copy() = 0; + 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 index 44e47eba35..42f157a0b7 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepIterator.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepIterator.h @@ -7,15 +7,15 @@ #ifndef HEPREP_HEPREPITERATOR_H #define HEPREP_HEPREPITERATOR_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2004, FreeHEP. #include namespace HEPREP { -class HepRepAttValue; +class HepRepAttributeListener; +class HepRepFrameListener; class HepRepInstance; -class HepRepIteratorListener; /** * HepRepIterator interface. @@ -47,22 +47,41 @@ public: * * @param listener to be added. */ - virtual bool addHepRepIteratorListener(HepRepIteratorListener * listener) = 0; + virtual void addHepRepAttributeListener(std::string name, HepRepAttributeListener * listener) = 0; /** * Removes a listener. * * @param listener to be removed. */ - virtual void removeHepRepIteratorListener(HepRepIteratorListener * listener) = 0; + 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 tye attribute to be looked up. + * @param key name of the attribute to be looked up. * @return value associated to name at this point in the iteration. */ - virtual HepRepAttValue * getAttValue(std::string key) = 0; +// HepRepAttValue* getAttValue(String key); }; // class } // namespace HEPREP #endif /* ifndef HEPREP_HEPREPITERATOR_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h b/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h index 12b1364cfa..69f90e9515 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepTreeID.h @@ -7,7 +7,7 @@ #ifndef HEPREP_HEPREPTREEID_H #define HEPREP_HEPREPTREEID_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2003, FreeHEP. #include @@ -56,8 +56,9 @@ public: * Returns a deep copy of this treeID. * * @return copy of this treeID. + * @throws CloneNotSupportedException if copying is not possible. */ - virtual HepRepTreeID * copy() = 0; +// 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 index 1d84faee4d..af1466e719 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepType.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepType.h @@ -7,17 +7,15 @@ #ifndef HEPREP_HEPREPTYPE_H #define HEPREP_HEPREPTYPE_H 1 -// Copyright 2000-2002, FreeHEP. +// Copyright 2000-2003, FreeHEP. +#include #include -#include #include "HEPREP/HepRepDefinition.h" namespace HEPREP { -class HepRep; - /** * HepRepType interface. * @@ -33,9 +31,8 @@ public: * Adds a sub-type to this type. * * @param type sub-type to be added. - * @return false only if written directly to a stream. */ - virtual bool addType(HepRepType * type) = 0; + virtual void addType(HepRepType * type) = 0; /** * Returns the name of this type. @@ -65,6 +62,13 @@ public: */ 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. * @@ -72,6 +76,13 @@ public: */ 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. * @@ -84,16 +95,15 @@ public: * * @return collection of HepRepTypes. */ - virtual std::vector * getTypes() = 0; + virtual std::set getTypes() = 0; /** * Returns a deep copy of this type. * - * @param heprep top-level heprep. (Not sure if this is necessary). * @param parent to which this copy is added. * @return copy of this type. */ - virtual HepRepType * copy(HepRep * heprep, HepRepType * parent) = 0; + 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 index 20f9821c69..1c1e58e890 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepTypeTree.h @@ -9,14 +9,13 @@ // Copyright 2000-2002, FreeHEP. -#include +#include +#include #include "HEPREP/HepRepTreeID.h" namespace HEPREP { -class HepRep; -class HepRepTreeID; class HepRepType; /** @@ -34,29 +33,34 @@ public: * Adds a type to this typetree. * * @param type to be added. - * @return false only if written immediatelty to a stream. */ - virtual bool addType(HepRepType * type) = 0; + virtual void addType(HepRepType * type) = 0; /** * Returns a collection of all types in this tree. * * @return collection of HepRepTypes. */ - virtual std::vector * getTypes() = 0; + virtual std::set getTypes() = 0; + + /** + * Returns type + */ + virtual HepRepType * getType(std::string fullName) = 0; /** * Returns a deep copy of this typetree. * - * @param heprep top-level heprep. (Not sure if this is necessary). * @return copy of this typetree. */ - virtual HepRepTypeTree * copy(HepRep * heprep) = 0; + virtual HepRepTypeTree * copy() = 0; +// // To be enable in g++ 3.0 // using HepRep::HepRepTreeID::copy; // To be disabled in g++ 3.0 - virtual HepRepTreeID * copy() = 0; +// HepRepTreeID * copy(); +// }; // class } // namespace HEPREP #endif /* ifndef HEPREP_HEPREPTYPETREE_H */ diff --git a/source/visualization/HepRep/include/HEPREP/HepRepWriter.h b/source/visualization/HepRep/include/HEPREP/HepRepWriter.h index 9b9124c8aa..615a008195 100644 --- a/source/visualization/HepRep/include/HEPREP/HepRepWriter.h +++ b/source/visualization/HepRep/include/HEPREP/HepRepWriter.h @@ -38,6 +38,15 @@ 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. * @@ -60,7 +69,7 @@ public: * @param layerOrder to be written. * @return false in case of a stream problem. */ - virtual bool write(std::vector * layerOrder) = 0; + virtual bool write(std::vector layerOrder) = 0; /** * Writes a HepRepTypeTree. diff --git a/source/visualization/HepRep/include/ref/DefaultHepRep.h b/source/visualization/HepRep/include/ref/DefaultHepRep.h index 955c2b9341..f6503f11ce 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRep.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRep.h @@ -5,6 +5,7 @@ #include #include +#include #include "HEPREP/HepRep.h" #include "HEPREP/HepRepSelectFilter.h" @@ -21,22 +22,21 @@ class DefaultHepRep : public virtual HEPREP::HepRep { private: std::vector layers; - std::vector typeTrees; - std::vector instanceTrees; + std::set typeTrees; + std::set instanceTrees; public: DefaultHepRep(); ~DefaultHepRep(); HEPREP::HepRep* copy(HEPREP::HepRepSelectFilter* filter); - std::vector* getLayerOrder(); - bool addLayer(std::string layer); - bool addTypeTree(HEPREP::HepRepTypeTree* typeTree); + 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* getTypeTrees(); - HEPREP::HepRepType* getType(std::string name); - bool addInstanceTree(HEPREP::HepRepInstanceTree* instanceTree); + std::set getTypeTrees(); + void addInstanceTree(HEPREP::HepRepInstanceTree* instanceTree); void overlayInstanceTree(HEPREP::HepRepInstanceTree * instanceTree); void removeInstanceTree(HEPREP::HepRepInstanceTree* instanceTree); HEPREP::HepRepInstanceTree* getInstanceTreeTop(std::string name, std::string version); @@ -52,7 +52,7 @@ class DefaultHepRep : public virtual HEPREP::HepRep { bool getNonDrawAtts, std::vector invertAtts); std::string checkForException(); - std::vector* getInstanceTrees(); + std::set getInstanceTrees(); }; #endif diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepAttribute.h b/source/visualization/HepRep/include/ref/DefaultHepRepAttribute.h index 03fe1e8784..fd736a9828 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepAttribute.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepAttribute.h @@ -5,6 +5,7 @@ #include #include +#include #include #include "HEPREP/HepRepAttribute.h" @@ -20,21 +21,20 @@ class DefaultHepRepAttribute : public virtual HEPREP::HepRepAttribute { private: std::map attValues; - std::vector attList; public: DefaultHepRepAttribute(); ~DefaultHepRepAttribute(); - std::vector* getAttValuesFromNode(); - bool addAttValue(HEPREP::HepRepAttValue* hepRepAttValue); - bool addAttValue(std::string key, char *value, int showLabel); - bool addAttValue(std::string key, std::string value, int showLabel); - bool addAttValue(std::string key, int value, int showLabel); - bool addAttValue(std::string key, double value, int showLabel); - bool addAttValue(std::string key, bool value, int showLabel); - bool addAttValue(std::string key, std::vector value, int showLabel); - bool addAttValue(std::string key, double red, double green, double blue, double alpha, int showLabel); + 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, 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); diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepDefinition.h b/source/visualization/HepRep/include/ref/DefaultHepRepDefinition.h index f59329546c..50bb8b9924 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepDefinition.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepDefinition.h @@ -5,6 +5,7 @@ #include #include +#include #include "HEPREP/HepRepDefinition.h" #include "HEPREP/HepRepWriter.h" @@ -19,15 +20,14 @@ class DefaultHepRepDefinition : public DefaultHepRepAttribute, public virtual HE private: std::map attDefs; - std::vector attList; public: DefaultHepRepDefinition(); ~DefaultHepRepDefinition(); - bool addAttDef(HEPREP::HepRepAttDef* hepRepAttDef); - bool addAttDef(std::string name, std::string desc, std::string type, std::string extra); - std::vector* getAttDefsFromNode(); + 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; diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepFactory.h b/source/visualization/HepRep/include/ref/DefaultHepRepFactory.h index f88a124130..24c9c74288 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepFactory.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepFactory.h @@ -41,6 +41,7 @@ class DefaultHepRepFactory : public virtual HEPREP::HepRepFactory { 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 (); }; diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepInstance.h b/source/visualization/HepRep/include/ref/DefaultHepRepInstance.h index 0256b36c90..16c89768eb 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepInstance.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepInstance.h @@ -24,7 +24,7 @@ class DefaultHepRepInstance : public DefaultHepRepAttribute, public virtual HEPREP::HepRepInstance { private: - void* parent; + HEPREP::HepRepInstance* parent; HEPREP::HepRepType* type; std::vector points; std::vector instances; @@ -35,14 +35,15 @@ class DefaultHepRepInstance : public DefaultHepRepAttribute, public virtual HEPR ~DefaultHepRepInstance(); void overlay(HEPREP::HepRepInstance * instance); - HEPREP::HepRepInstance* copy(HEPREP::HepRep* heprep, HEPREP::HepRepInstance* parent, HEPREP::HepRepSelectFilter* filter); - HEPREP::HepRepInstance* copy(HEPREP::HepRep* heprep, HEPREP::HepRepInstanceTree* parent, HEPREP::HepRepSelectFilter* filter); + 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(); - bool addPoint(HEPREP::HepRepPoint* point); - std::vector* getPoints(); - bool addInstance(HEPREP::HepRepInstance* instance); + void addPoint(HEPREP::HepRepPoint* point); + std::vector getPoints(); + HEPREP::HepRepInstance* getSuperInstance(); + void addInstance(HEPREP::HepRepInstance* instance); void removeInstance(HEPREP::HepRepInstance* instance); - std::vector* getInstances(); + std::vector getInstances(); HEPREP::HepRepAttValue* getAttValue(std::string name); diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepInstanceTree.h b/source/visualization/HepRep/include/ref/DefaultHepRepInstanceTree.h index 023a2787f0..19638189a6 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepInstanceTree.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepInstanceTree.h @@ -5,6 +5,7 @@ #include #include +#include #include "HEPREP/HepRep.h" #include "HEPREP/HepRepSelectFilter.h" @@ -24,21 +25,20 @@ class DefaultHepRepInstanceTree : public DefaultHepRepTreeID, public virtual HEP private: HEPREP::HepRepTreeID* typeTree; std::vector instances; - std::vector instanceTrees; + std::set instanceTrees; public: DefaultHepRepInstanceTree(std::string name, std::string version, HEPREP::HepRepTreeID* typeTree); ~DefaultHepRepInstanceTree(); void overlay(HEPREP::HepRepInstanceTree * instanceTree); - HEPREP::HepRepInstanceTree* copy(HEPREP::HepRep* heprep, HEPREP::HepRepSelectFilter* filter); - HEPREP::HepRepTreeID* copy(); - bool addInstance(HEPREP::HepRepInstance* instance); + HEPREP::HepRepInstanceTree* copy(HEPREP::HepRepTypeTree* typeTree, HEPREP::HepRepSelectFilter* filter); + void addInstance(HEPREP::HepRepInstance* instance); void removeInstance(HEPREP::HepRepInstance* instance); - std::vector* getInstances(); - bool addInstanceTree(HEPREP::HepRepTreeID* treeID); + std::vector getInstances(); + void addInstanceTree(HEPREP::HepRepTreeID* treeID); HEPREP::HepRepTreeID* getTypeTree(); - std::vector* getInstanceTrees(); + std::set getInstanceTrees(); }; #endif diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepTreeID.h b/source/visualization/HepRep/include/ref/DefaultHepRepTreeID.h index 72c284eda5..bf6ee4c8fa 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepTreeID.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepTreeID.h @@ -27,7 +27,6 @@ class DefaultHepRepTreeID : public virtual HEPREP::HepRepTreeID { void setQualifier(std::string qualifier); std::string getName(); std::string getVersion(); - HEPREP::HepRepTreeID* copy(); }; #endif diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepType.h b/source/visualization/HepRep/include/ref/DefaultHepRepType.h index 0ea5ea990a..4f64cdff2e 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepType.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepType.h @@ -5,6 +5,7 @@ #include #include +#include #include "HEPREP/HepRep.h" #include "HEPREP/HepRepType.h" @@ -22,27 +23,28 @@ class DefaultHepRepType : public DefaultHepRepDefinition, public virtual HEPREP: private: HEPREP::HepRepType* parent; - std::vector types; + std::set 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::HepRep* heprep, HEPREP::HepRepType* parent); + 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); - bool addType(HEPREP::HepRepType* type); - std::vector* getTypes(); + void addType(HEPREP::HepRepType* type); + std::set getTypes(); }; #endif diff --git a/source/visualization/HepRep/include/ref/DefaultHepRepTypeTree.h b/source/visualization/HepRep/include/ref/DefaultHepRepTypeTree.h index 41712d921f..0b16936576 100644 --- a/source/visualization/HepRep/include/ref/DefaultHepRepTypeTree.h +++ b/source/visualization/HepRep/include/ref/DefaultHepRepTypeTree.h @@ -5,6 +5,7 @@ #include #include +#include #include "HEPREP/HepRep.h" #include "HEPREP/HepRepTypeTree.h" @@ -21,16 +22,16 @@ class DefaultHepRepTypeTree : public DefaultHepRepTreeID, public virtual HEPREP::HepRepTypeTree { private: - std::vector types; + std::set types; public: DefaultHepRepTypeTree(HEPREP::HepRepTreeID* typeTree); ~DefaultHepRepTypeTree(); - HEPREP::HepRepTypeTree* copy(HEPREP::HepRep* heprep); - HEPREP::HepRepTreeID* copy(); - bool addType(HEPREP::HepRepType* type); - std::vector* getTypes(); + HEPREP::HepRepTypeTree* copy(); + void addType(HEPREP::HepRepType* type); + std::set getTypes(); + HEPREP::HepRepType* getType(std::string name); }; #endif diff --git a/source/visualization/HepRep/include/ref/FreeHepTypes.h b/source/visualization/HepRep/include/ref/FreeHepTypes.h index c1d01e88a6..dd694fd388 100644 --- a/source/visualization/HepRep/include/ref/FreeHepTypes.h +++ b/source/visualization/HepRep/include/ref/FreeHepTypes.h @@ -4,11 +4,23 @@ #ifdef WIN32 #ifndef GNU_GCC // Disable warning C4786: identifier was truncated to '255' characters in the debug information - #pragma warning ( disable : 4786 ) + #pragma warning ( disable : 4786 ) // Disable warning C4250: inherits via dominance - #pragma warning ( disable : 4250 ) -#endif -#endif + #pragma warning ( disable : 4250 ) +#ifdef VC6 +// FIX for KB 168440 - VC6 +// Stream Operator << Cannot Handle __int64 Type + #include -#endif + 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 // FREEHEPTYPES_H diff --git a/source/visualization/HepRep/include/ref/XMLHepRepWriter.h b/source/visualization/HepRep/include/ref/XMLHepRepWriter.h index 983e928fdd..d5975f619b 100644 --- a/source/visualization/HepRep/include/ref/XMLHepRepWriter.h +++ b/source/visualization/HepRep/include/ref/XMLHepRepWriter.h @@ -6,7 +6,9 @@ #include #include #include +#include #include +#include #include "zipios++/zipoutputstream.h" #include "zipios++/gzipoutputstream.h" @@ -38,14 +40,16 @@ class XMLHepRepWriter : public virtual HEPREP::HepRepWriter { XMLWriter *xml; zipios::ZipOutputStream *zip; zipios::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(std::vector layers); bool write(HEPREP::HepRepTypeTree* typeTree); bool write(HEPREP::HepRepType* type); bool write(HEPREP::HepRepTreeID* treeID); diff --git a/source/visualization/HepRep/include/zlib/HepRep-zconf.h b/source/visualization/HepRep/include/zlib/HepRep-zconf.h index 8af555760b..0eb775e1eb 100644 --- a/source/visualization/HepRep/include/zlib/HepRep-zconf.h +++ b/source/visualization/HepRep/include/zlib/HepRep-zconf.h @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in HepRep-zlib.h */ -/* @(#) $Id: HepRep-zconf.h,v 1.1 2004/02/03 19:34:43 duns Exp $ */ +/* @(#) $Id: HepRep-zconf.h,v 1.2 2004/06/16 21:05:27 duns Exp $ */ #ifndef _HEPREP_ZCONF_H #define _HEPREP_ZCONF_H @@ -16,39 +16,43 @@ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateReset z_inflateReset -# define compress z_compress -# define compress2 z_compress2 -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table +/* MD: changes z_ into heprep_z_ */ +# define deflateInit_ heprep_z_deflateInit_ +# define deflate heprep_z_deflate +# define deflateEnd heprep_z_deflateEnd +# define inflateInit_ heprep_z_inflateInit_ +# define inflate heprep_z_inflate +# define inflateEnd heprep_z_inflateEnd +# define deflateInit2_ heprep_z_deflateInit2_ +# define deflateSetDictionary heprep_z_deflateSetDictionary +# define deflateCopy heprep_z_deflateCopy +# define deflateReset heprep_z_deflateReset +# define deflateParams heprep_z_deflateParams +# define inflateInit2_ heprep_z_inflateInit2_ +# define inflateSetDictionary heprep_z_inflateSetDictionary +# define inflateSync heprep_z_inflateSync +# define inflateSyncPoint heprep_z_inflateSyncPoint +# define inflateReset heprep_z_inflateReset +# define compress heprep_z_compress +# define compress2 heprep_z_compress2 +# define uncompress heprep_z_uncompress +# define adler32 heprep_z_adler32 +# define crc32 heprep_z_crc32 +# define get_crc_table heprep_z_get_crc_table -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp +# define Byte heprep_z_Byte +# define uInt heprep_z_uInt +# define uLong heprep_z_uLong +# define Bytef heprep_z_Bytef +# define charf heprep_z_charf +# define intf heprep_z_intf +# define uIntf heprep_z_uIntf +# define uLongf heprep_z_uLongf +# define voidpf heprep_z_voidpf +# define voidp heprep_z_voidp + +/* MD: added define for lonely symbol not renamed... */ +# define z_errmsg heprep_z_errmsg #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) diff --git a/source/visualization/HepRep/src/DefaultHepRep.cc b/source/visualization/HepRep/src/DefaultHepRep.cc index 9d0e789170..d5c1af168f 100644 --- a/source/visualization/HepRep/src/DefaultHepRep.cc +++ b/source/visualization/HepRep/src/DefaultHepRep.cc @@ -8,10 +8,10 @@ DefaultHepRep::DefaultHepRep() { } DefaultHepRep::~DefaultHepRep() { - for (vector::iterator i1 = typeTrees.begin(); i1 != typeTrees.end(); i1++) { + for (set::iterator i1 = typeTrees.begin(); i1 != typeTrees.end(); i1++) { delete (*i1); } - for (vector::iterator i2 = instanceTrees.begin(); i2 != instanceTrees.end(); i2++) { + for (set::iterator i2 = instanceTrees.begin(); i2 != instanceTrees.end(); i2++) { delete (*i2); } } @@ -21,18 +21,16 @@ HepRep* DefaultHepRep::copy(HepRepSelectFilter*) { return NULL; } -vector* DefaultHepRep::getLayerOrder() { - return &layers; +vector DefaultHepRep::getLayerOrder() { + return layers; } -bool DefaultHepRep::addLayer(string layer) { +void DefaultHepRep::addLayer(string layer) { layers.push_back(layer); - return true; } -bool DefaultHepRep::addTypeTree(HepRepTypeTree* typeTree) { - typeTrees.push_back(typeTree); - return true; +void DefaultHepRep::addTypeTree(HepRepTypeTree* typeTree) { + typeTrees.insert(typeTree); } void DefaultHepRep::removeTypeTree(HepRepTypeTree*) { @@ -44,18 +42,12 @@ HepRepTypeTree* DefaultHepRep::getTypeTree(string, string) { return NULL; } -vector* DefaultHepRep::getTypeTrees() { - return &typeTrees; +set DefaultHepRep::getTypeTrees() { + return typeTrees; } -HepRepType* DefaultHepRep::getType(string) { - cerr << "DefaultHepRep::getType(string) not implemented." << endl; - return NULL; -} - -bool DefaultHepRep::addInstanceTree(HepRepInstanceTree* instanceTree) { - instanceTrees.push_back(instanceTree); - return true; +void DefaultHepRep::addInstanceTree(HepRepInstanceTree* instanceTree) { + instanceTrees.insert(instanceTree); } void DefaultHepRep::overlayInstanceTree(HepRepInstanceTree *) { @@ -94,7 +86,7 @@ string DefaultHepRep::checkForException() { return NULL; } -vector* DefaultHepRep::getInstanceTrees() { - return &instanceTrees; +set DefaultHepRep::getInstanceTrees() { + return instanceTrees; } diff --git a/source/visualization/HepRep/src/DefaultHepRepAttribute.cc b/source/visualization/HepRep/src/DefaultHepRepAttribute.cc index 31093271b8..c8432d75ed 100644 --- a/source/visualization/HepRep/src/DefaultHepRepAttribute.cc +++ b/source/visualization/HepRep/src/DefaultHepRepAttribute.cc @@ -16,56 +16,53 @@ DefaultHepRepAttribute::~DefaultHepRepAttribute() { for (map::iterator i = attValues.begin(); i != attValues.end(); i++) { delete (*i).second; } - - attList.clear(); } -vector* DefaultHepRepAttribute::getAttValuesFromNode() { - attList.clear(); +set DefaultHepRepAttribute::getAttValuesFromNode() { + set attSet; for (map::iterator i = attValues.begin(); i != attValues.end(); i++) { - if ((*i).first != "layer") attList.push_back((*i).second); + if ((*i).first != "layer") attSet.insert((*i).second); } - return &attList; + return attSet; } -bool DefaultHepRepAttribute::addAttValue(HepRepAttValue* hepRepAttValue) { +void DefaultHepRepAttribute::addAttValue(HepRepAttValue* hepRepAttValue) { string lowerCaseName = hepRepAttValue->getLowerCaseName(); if (attValues[lowerCaseName] != NULL) delete attValues[lowerCaseName]; attValues[lowerCaseName] = hepRepAttValue; - return true; } -bool DefaultHepRepAttribute::addAttValue(string key, char *value, int showLabel) { - return addAttValue(key, (std::string)value, showLabel); +void DefaultHepRepAttribute::addAttValue(string key, char *value, int showLabel) { + addAttValue(key, (std::string)value, showLabel); } -bool DefaultHepRepAttribute::addAttValue(string key, string value, int showLabel) { - return addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); +void DefaultHepRepAttribute::addAttValue(string key, string value, int showLabel) { + addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); } -bool DefaultHepRepAttribute::addAttValue(string key, int value, int showLabel) { - return addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); +void DefaultHepRepAttribute::addAttValue(string key, int value, int showLabel) { + addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); } -bool DefaultHepRepAttribute::addAttValue(string key, double value, int showLabel) { - return addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); +void DefaultHepRepAttribute::addAttValue(string key, double value, int showLabel) { + addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); } -bool DefaultHepRepAttribute::addAttValue(string key, bool value, int showLabel) { - return addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); +void DefaultHepRepAttribute::addAttValue(string key, bool value, int showLabel) { + addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); } -bool DefaultHepRepAttribute::addAttValue(string key, vector value, int showLabel) { - return addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); +void DefaultHepRepAttribute::addAttValue(string key, vector value, int showLabel) { + addAttValue(new DefaultHepRepAttValue(key, value, showLabel)); } -bool DefaultHepRepAttribute::addAttValue(string key, double red, double green, double blue, double alpha, int 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); - return addAttValue(new DefaultHepRepAttValue(key, color, showLabel)); + addAttValue(new DefaultHepRepAttValue(key, color, showLabel)); } HepRepAttValue* DefaultHepRepAttribute::getAttValueFromNode(string name) { diff --git a/source/visualization/HepRep/src/DefaultHepRepDefinition.cc b/source/visualization/HepRep/src/DefaultHepRepDefinition.cc index 0e488a34c6..d9d2190840 100644 --- a/source/visualization/HepRep/src/DefaultHepRepDefinition.cc +++ b/source/visualization/HepRep/src/DefaultHepRepDefinition.cc @@ -13,29 +13,28 @@ DefaultHepRepDefinition::DefaultHepRepDefinition() } DefaultHepRepDefinition::~DefaultHepRepDefinition() { - vector* list = getAttDefsFromNode(); - for (vector::iterator i1 = list->begin(); i1 != list->end(); i1++) { + set list = getAttDefsFromNode(); + for (set::iterator i1 = list.begin(); i1 != list.end(); i1++) { delete (*i1); } } -vector* DefaultHepRepDefinition::getAttDefsFromNode() { - attList.clear(); +set DefaultHepRepDefinition::getAttDefsFromNode() { + set attSet; for (map::iterator i = attDefs.begin(); i != attDefs.end(); i++) { - attList.push_back((*i).second); + attSet.insert((*i).second); } - return &attList; + return attSet; } -bool DefaultHepRepDefinition::addAttDef(HepRepAttDef* hepRepAttDef) { +void DefaultHepRepDefinition::addAttDef(HepRepAttDef* hepRepAttDef) { string lowerCaseName = hepRepAttDef->getLowerCaseName(); if (attDefs[lowerCaseName] != NULL) delete attDefs[lowerCaseName]; attDefs[lowerCaseName] = hepRepAttDef; - return true; } -bool DefaultHepRepDefinition::addAttDef(string name, string desc, string type, string extra) { - return addAttDef(new DefaultHepRepAttDef(name, desc, type, extra)); +void DefaultHepRepDefinition::addAttDef(string name, string desc, string type, string extra) { + addAttDef(new DefaultHepRepAttDef(name, desc, type, extra)); } HepRepAttDef* DefaultHepRepDefinition::getAttDefFromNode(string name) { diff --git a/source/visualization/HepRep/src/DefaultHepRepFactory.cc b/source/visualization/HepRep/src/DefaultHepRepFactory.cc index 60d26c259d..333050d483 100644 --- a/source/visualization/HepRep/src/DefaultHepRepFactory.cc +++ b/source/visualization/HepRep/src/DefaultHepRepFactory.cc @@ -67,6 +67,10 @@ HepRepType* DefaultHepRepFactory::createHepRepType (HepRepType* parent, string n 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); } diff --git a/source/visualization/HepRep/src/DefaultHepRepInstance.cc b/source/visualization/HepRep/src/DefaultHepRepInstance.cc index 8229e59b70..ee74c7f6e7 100644 --- a/source/visualization/HepRep/src/DefaultHepRepInstance.cc +++ b/source/visualization/HepRep/src/DefaultHepRepInstance.cc @@ -10,14 +10,14 @@ DefaultHepRepInstance::DefaultHepRepInstance(HepRepInstance* instance, HepRepTyp : DefaultHepRepAttribute(), parent(instance), type(heprepType) { if (type == NULL) cerr << "HepRepInstance cannot be created without a HepRepType." << endl; - ((HepRepInstance*)parent)->addInstance(this); + parent->addInstance(this); } DefaultHepRepInstance::DefaultHepRepInstance(HepRepInstanceTree* instanceTree, HepRepType* heprepType) - : DefaultHepRepAttribute(), parent(instanceTree), type(heprepType) { + : DefaultHepRepAttribute(), parent(NULL), type(heprepType) { if (type == NULL) cerr << "HepRepInstance cannot be created without a HepRepType." << endl; - ((HepRepInstanceTree*)parent)->addInstance(this); + instanceTree->addInstance(this); } DefaultHepRepInstance::~DefaultHepRepInstance() { @@ -35,13 +35,13 @@ void DefaultHepRepInstance::overlay(HepRepInstance *) { cerr << "DefaultHepRepInstance::overlay(HepRepInstance * instance) not implemented." << endl; } -HepRepInstance* DefaultHepRepInstance::copy(HepRep*, HepRepInstance*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstance::copy(HepRep*, HepRepInstance*, HepRepSelectFilter*) not implemented." << endl; +HepRepInstance* DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstance*, HepRepSelectFilter*) { + cerr << "DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstance*, HepRepSelectFilter*) not implemented." << endl; return NULL; } -HepRepInstance* DefaultHepRepInstance::copy(HepRep*, HepRepInstanceTree*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstance::copy(HepRep*, HepRepInstanceTree*, HepRepSelectFilter*) not implemented." << endl; +HepRepInstance* DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstanceTree*, HepRepSelectFilter*) { + cerr << "DefaultHepRepInstance::copy(HepRepTypeTree*, HepRepInstanceTree*, HepRepSelectFilter*) not implemented." << endl; return NULL; } @@ -49,26 +49,28 @@ HepRepType* DefaultHepRepInstance::getType() { return type; } -bool DefaultHepRepInstance::addPoint(HepRepPoint* point) { +void DefaultHepRepInstance::addPoint(HepRepPoint* point) { points.push_back(point); - return true; } -vector* DefaultHepRepInstance::getPoints() { - return &points; +vector DefaultHepRepInstance::getPoints() { + return points; } -bool DefaultHepRepInstance::addInstance(HepRepInstance* instance) { +HepRepInstance* DefaultHepRepInstance::getSuperInstance() { + return parent; +} + +void DefaultHepRepInstance::addInstance(HepRepInstance* instance) { instances.push_back(instance); - return true; } void DefaultHepRepInstance::removeInstance(HepRepInstance*) { cerr << "DefaultHepRepInstance::removeInstance(HepRepInstance*) not implemented." << endl; } -vector* DefaultHepRepInstance::getInstances() { - return &instances; +vector DefaultHepRepInstance::getInstances() { + return instances; } HepRepAttValue* DefaultHepRepInstance::getAttValue(string name) { diff --git a/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc b/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc index 31bcb971f8..31277cca65 100644 --- a/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc +++ b/source/visualization/HepRep/src/DefaultHepRepInstanceTree.cc @@ -19,38 +19,32 @@ void DefaultHepRepInstanceTree::overlay(HepRepInstanceTree *) { cerr << "DefaultHepRepInstanceTree::overlay(HepRepInstanceTree * instanceTree) not implemented." << endl; } -HepRepTreeID* DefaultHepRepInstanceTree::copy() { - return DefaultHepRepTreeID::copy(); -} - -HepRepInstanceTree* DefaultHepRepInstanceTree::copy(HepRep*, HepRepSelectFilter*) { - cerr << "DefaultHepRepInstanceTree::copy(HepRep*, HepRepSelectFilter*) not implemented." << endl; +HepRepInstanceTree* DefaultHepRepInstanceTree::copy(HepRepTypeTree*, HepRepSelectFilter*) { + cerr << "DefaultHepRepInstanceTree::copy(HepRepTypeTree*, HepRepSelectFilter*) not implemented." << endl; return NULL; } -bool DefaultHepRepInstanceTree::addInstance(HepRepInstance* instance) { +void DefaultHepRepInstanceTree::addInstance(HepRepInstance* instance) { instances.push_back(instance); - return true; } void DefaultHepRepInstanceTree::removeInstance(HepRepInstance*) { cerr << "DefaultHepRepInstanceTree::removeInstance(HepRepInstance*) not implemented." << endl; } -vector* DefaultHepRepInstanceTree::getInstances() { - return &instances; +vector DefaultHepRepInstanceTree::getInstances() { + return instances; } -bool DefaultHepRepInstanceTree::addInstanceTree(HepRepTreeID* treeID) { - instanceTrees.push_back(treeID); - return true; +void DefaultHepRepInstanceTree::addInstanceTree(HepRepTreeID* treeID) { + instanceTrees.insert(treeID); } HepRepTreeID* DefaultHepRepInstanceTree::getTypeTree() { return typeTree; } -vector* DefaultHepRepInstanceTree::getInstanceTrees() { - return &instanceTrees; +set DefaultHepRepInstanceTree::getInstanceTrees() { + return instanceTrees; } diff --git a/source/visualization/HepRep/src/DefaultHepRepTreeID.cc b/source/visualization/HepRep/src/DefaultHepRepTreeID.cc index f4a08b99f5..84e576f545 100644 --- a/source/visualization/HepRep/src/DefaultHepRepTreeID.cc +++ b/source/visualization/HepRep/src/DefaultHepRepTreeID.cc @@ -28,8 +28,3 @@ string DefaultHepRepTreeID::getName() { string DefaultHepRepTreeID::getVersion() { return version; } - -HepRepTreeID* DefaultHepRepTreeID::copy() { - return new DefaultHepRepTreeID(name, version, qualifier); -} - diff --git a/source/visualization/HepRep/src/DefaultHepRepType.cc b/source/visualization/HepRep/src/DefaultHepRepType.cc index e855b45de4..82dc4da0fa 100644 --- a/source/visualization/HepRep/src/DefaultHepRepType.cc +++ b/source/visualization/HepRep/src/DefaultHepRepType.cc @@ -15,8 +15,16 @@ DefaultHepRepType::DefaultHepRepType(HepRepType* parentType, string typeName) } } +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++) { + for (set::iterator i1 = types.begin(); i1 != types.end(); i1++) { delete (*i1); } } @@ -56,8 +64,8 @@ HepRepAttValue* DefaultHepRepType::getAttValue(string attName) { return value; } -HepRepType* DefaultHepRepType::copy(HepRep*, HepRepType*) { - cerr << "DefaultHepRepType::copy(HepRep*, HepRepType*) not implemented." << endl; +HepRepType* DefaultHepRepType::copy(HepRepType*) { + cerr << "DefaultHepRepType::copy(HepRepType*) not implemented." << endl; return NULL; } @@ -85,12 +93,11 @@ void DefaultHepRepType::setInfoURL(string info) { this->infoURL = info; } -bool DefaultHepRepType::addType(HepRepType* type) { - types.push_back(type); - return true; +void DefaultHepRepType::addType(HepRepType* type) { + types.insert(type); } -vector* DefaultHepRepType::getTypes() { - return &types; +set DefaultHepRepType::getTypes() { + return types; } diff --git a/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc b/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc index b7c96cbc99..4bac972b09 100644 --- a/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc +++ b/source/visualization/HepRep/src/DefaultHepRepTypeTree.cc @@ -12,26 +12,25 @@ DefaultHepRepTypeTree::DefaultHepRepTypeTree(HepRepTreeID* typeTree) } DefaultHepRepTypeTree::~DefaultHepRepTypeTree() { - for (vector::iterator i1 = types.begin(); i1 != types.end(); i1++) { + for (set::iterator i1 = types.begin(); i1 != types.end(); i1++) { delete (*i1); } } -HepRepTreeID* DefaultHepRepTypeTree::copy() { - return DefaultHepRepTreeID::copy(); -} - -HepRepTypeTree* DefaultHepRepTypeTree::copy(HepRep*) { - cerr << "DefaultHepRepTypeTree::copy(HepRep*) not implemented." << endl; +HepRepTypeTree* DefaultHepRepTypeTree::copy() { + cerr << "DefaultHepRepTypeTree::copy() not implemented." << endl; return NULL; } -bool DefaultHepRepTypeTree::addType(HepRepType* type) { - types.push_back(type); - return true; +void DefaultHepRepTypeTree::addType(HepRepType* type) { + types.insert(type); } -vector* DefaultHepRepTypeTree::getTypes() { - return &types; +set DefaultHepRepTypeTree::getTypes() { + return types; } +HepRepType* DefaultHepRepTypeTree::getType(string /*typeName*/) { + cerr << "DefaultHepRepTypeTree::getType(string) not implemented." << endl; + return NULL; +} diff --git a/source/visualization/HepRep/src/G4HepRep.cc b/source/visualization/HepRep/src/G4HepRep.cc index 3e908d1d09..bd4e06b018 100644 --- a/source/visualization/HepRep/src/G4HepRep.cc +++ b/source/visualization/HepRep/src/G4HepRep.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRep.cc,v 1.20 2003/12/11 21:55:55 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRep.cc,v 1.21 2004/05/27 05:55:20 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /** @@ -71,7 +71,7 @@ G4VViewer* G4HepRep::CreateViewer (G4VSceneHandler& scene, const G4String& name) cout << "G4HepRep::CreateViewer: Cannot create more than one G4HepRepViewer" << endl; return NULL; } - viewer = new G4HepRepViewer ((G4HepRepSceneHandler&)scene, name); + viewer = new G4HepRepViewer ((G4HepRepSceneHandler&)scene, *messenger, name); return viewer; } diff --git a/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc b/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc index fe3068c0cf..a69f7d1a5a 100644 --- a/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc +++ b/source/visualization/HepRep/src/G4HepRepFileSceneHandler.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepFileSceneHandler.cc,v 1.18 2004/03/15 08:00:22 perl Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4HepRepFileSceneHandler.cc,v 1.19 2004/05/28 04:59:54 perl Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Joseph Perl 27th January 2002 @@ -674,6 +674,8 @@ void G4HepRepFileSceneHandler::AddHepRepInstance(const char* primName, // Additional attributes. hepRepXMLWriter->addAttValue("Layer",hepRepXMLWriter->typeDepth); hepRepXMLWriter->addAttValue("LVol", fpCurrentLV->GetName()); + hepRepXMLWriter->addAttValue("Region", fpCurrentLV->GetRegion()->GetName()); + hepRepXMLWriter->addAttValue("RootRegion", fpCurrentLV->IsRootRegion()); hepRepXMLWriter->addAttValue("Solid", fpCurrentLV->GetSolid()->GetName()); hepRepXMLWriter->addAttValue("EType", fpCurrentLV->GetSolid()->GetEntityType()); hepRepXMLWriter->addAttValue("Material", fpCurrentLV->GetMaterial()->GetName()); @@ -731,6 +733,8 @@ void G4HepRepFileSceneHandler::CheckFileOpen() { fileCounter++; 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",""); diff --git a/source/visualization/HepRep/src/G4HepRepMessenger.cc b/source/visualization/HepRep/src/G4HepRepMessenger.cc index cab6d2a29e..159a737ff4 100644 --- a/source/visualization/HepRep/src/G4HepRepMessenger.cc +++ b/source/visualization/HepRep/src/G4HepRepMessenger.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepMessenger.cc,v 1.4 2003/12/11 21:55:55 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepMessenger.cc,v 1.6 2004/05/27 05:55:20 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #include "G4HepRepMessenger.hh" @@ -39,35 +39,42 @@ G4HepRepMessenger::G4HepRepMessenger() : setEventNumberSuffixCommand->SetDefaultValue(""); setEventNumberSuffixCommand->AvailableForStates(G4State_Idle); -/* appendGeometryCommand = new G4UIcmdWithABool("/vis/heprep/appendGeometry", this); appendGeometryCommand->SetGuidance("Appends copy of geometry to every event."); 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->SetParameterName("flag",false); addPointAttributesCommand->SetDefaultValue(false); addPointAttributesCommand->AvailableForStates(G4State_Idle); + + setCoordinateSystemCommand = new G4UIcmdWithAString("/vis/heprep/setCoordinateSystem", this); + setCoordinateSystemCommand->SetGuidance("Sets the prefered Coordinate System (e.g. \"xyz\" or \"zxy\"."); + setCoordinateSystemCommand->SetParameterName("coordinateSystem",false); + setCoordinateSystemCommand->SetDefaultValue("xyz"); + setCoordinateSystemCommand->AvailableForStates(G4State_Idle); } G4HepRepMessenger::~G4HepRepMessenger() { delete setEventNumberSuffixCommand; -// delete appendGeometryCommand; + delete appendGeometryCommand; delete addPointAttributesCommand; delete heprepDirectory; + delete setCoordinateSystemCommand; } G4String G4HepRepMessenger::GetCurrentValue(G4UIcommand * command) { if (command==setEventNumberSuffixCommand) { return suffix; -// } else if (command==appendGeometryCommand) { -// return appendGeometryCommand->ConvertToString(geometry); + } else if (command==appendGeometryCommand) { + return appendGeometryCommand->ConvertToString(geometry); } else if (command==addPointAttributesCommand) { return addPointAttributesCommand->ConvertToString(pointAttributes); + } else if (command==setCoordinateSystemCommand) { + return coordinateSystem; } else { return ""; } @@ -76,10 +83,12 @@ G4String G4HepRepMessenger::GetCurrentValue(G4UIcommand * command) { void G4HepRepMessenger::SetNewValue(G4UIcommand * command, G4String newValue) { if (command==setEventNumberSuffixCommand) { suffix = newValue; -// } else if (command==appendGeometryCommand) { -// geometry = appendGeometryCommand->GetNewBoolValue(newValue); + } else if (command==appendGeometryCommand) { + geometry = appendGeometryCommand->GetNewBoolValue(newValue); } else if (command==addPointAttributesCommand) { pointAttributes = addPointAttributesCommand->GetNewBoolValue(newValue); + } else if (command==setCoordinateSystemCommand) { + coordinateSystem = newValue; } } @@ -94,3 +103,7 @@ G4bool G4HepRepMessenger::appendGeometry() { G4bool G4HepRepMessenger::addPointAttributes() { return pointAttributes; } + +G4String G4HepRepMessenger::getCoordinateSystem() { + return coordinateSystem; +} diff --git a/source/visualization/HepRep/src/G4HepRepSceneHandler.cc b/source/visualization/HepRep/src/G4HepRepSceneHandler.cc index 85874f778f..eb1e0c535d 100644 --- a/source/visualization/HepRep/src/G4HepRepSceneHandler.cc +++ b/source/visualization/HepRep/src/G4HepRepSceneHandler.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepSceneHandler.cc,v 1.70 2004/02/05 18:41:49 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepSceneHandler.cc,v 1.76 2004/05/28 04:59:54 perl Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /** @@ -43,6 +43,8 @@ #include "HEPREP/HepRep.h" //G4 +#include "G4Vector3D.hh" +#include "G4RunManagerKernel.hh" #include "G4Types.hh" #include "G4Point3D.hh" #include "G4Normal3D.hh" @@ -78,6 +80,7 @@ using namespace std; G4int G4HepRepSceneHandler::sceneCount = 0; +//#define LDEBUG 1 //#define SDEBUG 1 //#define PDEBUG 1 @@ -100,10 +103,11 @@ G4HepRepSceneHandler::G4HepRepSceneHandler (G4VGraphicsSystem& system, G4HepRepM currentDepth (0), currentPV (0), currentLV (0), - _heprep (NULL) + _heprep (NULL), + _heprepGeometry (NULL) { -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::G4HepRepSceneHandler: " << system << endl; #endif @@ -121,7 +125,7 @@ G4HepRepSceneHandler::G4HepRepSceneHandler (G4VGraphicsSystem& system, G4HepRepM G4HepRepSceneHandler::~G4HepRepSceneHandler () { -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::~G4HepRepSceneHandler() " << endl; #endif close(); @@ -137,7 +141,7 @@ void G4HepRepSceneHandler::open(G4String name) { if (writer != NULL) return; if (name == "stdout") { -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::Open() stdout" << endl; #endif writer = factory->createHepRepWriter(&cout, false, false); @@ -150,7 +154,7 @@ void G4HepRepSceneHandler::open(G4String name) { eventNumber = 0; eventNumberWidth = 0; } else if (name == "stderr") { -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::Open() stderr" << endl; #endif writer = factory->createHepRepWriter(&cerr, false, false); @@ -163,7 +167,7 @@ void G4HepRepSceneHandler::open(G4String name) { eventNumber = 0; eventNumberWidth = 0; } else { -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::Open() " << name << endl; #endif if (eventNumberWidth < 0) { @@ -231,13 +235,14 @@ void G4HepRepSceneHandler::open(G4String name) { void G4HepRepSceneHandler::openHepRep() { -#ifdef SDEBUG +#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(); @@ -262,7 +267,7 @@ void G4HepRepSceneHandler::openHepRep() { bool G4HepRepSceneHandler::closeHepRep(bool final) { if (_heprep == NULL) return true; -#ifdef SDEBUG +#ifdef LDEBUG cout << "G4HepRepSceneHandler::CloseHepRep() start" << endl; #endif @@ -278,10 +283,21 @@ bool G4HepRepSceneHandler::closeHepRep(bool final) { // using DrawView() called from /vis/viewer/flush) if (_eventInstanceTree != NULL) { GetCurrentViewer()->DrawView(); - - // couple geometry to event if geometry was written - if ((_geometryInstanceTree != NULL)) { - getEventInstanceTree()->addInstanceTree(getGeometryInstanceTree()); + + // 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", ".heprep", "G4GeometryData"); + } + getEventInstanceTree()->addInstanceTree(factory->createHepRepTreeID(name, "1.0")); } } @@ -296,16 +312,31 @@ bool G4HepRepSceneHandler::closeHepRep(bool final) { // Give this HepRep all of the layer order info for both geometry and event, // since these will both end up in a single HepRep. - if (_geometryRootType != NULL) _heprep->addLayer(geometryLayer); - if (_eventType != NULL) _heprep->addLayer(eventLayer); - if (_calHitType != NULL) _heprep->addLayer(calHitLayer); - if (_trajectoryType != NULL) _heprep->addLayer(trajectoryLayer); - if (_hitType != NULL) _heprep->addLayer(hitLayer); + 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)); + } + + if (!writeMultipleFiles) writer->addProperty("RecordLoop.ignore", "geometry.heprep"); + + writer->write(_heprepGeometry, G4String("geometry.heprep")); + + delete _heprepGeometry; + _heprepGeometry = NULL; + + if (writeMultipleFiles) closeFile(); + } if (writeMultipleFiles) { // NOTE: does not work on Solaris 5.2 and Linux 2.95.2 @@ -346,16 +377,19 @@ bool G4HepRepSceneHandler::closeHepRep(bool final) { void G4HepRepSceneHandler::close() { -#ifdef SDEBUG +#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) { @@ -372,6 +406,14 @@ void G4HepRepSceneHandler::closeFile() { 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::EstablishSpecials(G4PhysicalVolumeModel& model) { #ifdef SDEBUG @@ -937,6 +979,43 @@ bool G4HepRepSceneHandler::isEventData () { return !currentPV || fReadyForTransients; } +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", ""); + type->addAttValue("GeneratorVersion", G4RunManagerKernel::GetRunManagerKernel()->GetVersionString()); + + type->addAttDef( "CoordinateSystem", "Coordinate System", "Draw", ""); + type->addAttValue("CoordinateSystem", messenger.getCoordinateSystem()); + + 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")); +} + HepRep* G4HepRepSceneHandler::getHepRep() { if (_heprep == NULL) { // Create the HepRep that holds the Trees. @@ -945,11 +1024,23 @@ HepRep* G4HepRepSceneHandler::getHepRep() { 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()); - getHepRep()->addInstanceTree(_geometryInstanceTree); + if (messenger.appendGeometry()) { + getHepRep()->addInstanceTree(_geometryInstanceTree); + } else { + getHepRepGeometry()->addInstanceTree(_geometryInstanceTree); + } } return _geometryInstanceTree; } @@ -965,12 +1056,14 @@ HepRepInstance* G4HepRepSceneHandler::getGeometryRootInstance() { HepRepInstance* G4HepRepSceneHandler::getGeometryInstance(G4LogicalVolume* volume, int depth) { HepRepInstance* instance = getGeometryInstance(volume->GetName(), depth); - setAttribute(instance, "LVol", volume->GetName()); - setAttribute(instance, "Solid", volume->GetSolid()->GetName()); - setAttribute(instance, "EType", volume->GetSolid()->GetEntityType()); - setAttribute(instance, "Material", volume->GetMaterial()->GetName()); - setAttribute(instance, "Density", volume->GetMaterial()->GetDensity()); - setAttribute(instance, "Radlen", volume->GetMaterial()->GetRadlen()); + setAttribute(instance, "LVol", volume->GetName()); + setAttribute(instance, "Region", volume->GetRegion()->GetName()); + setAttribute(instance, "RootRegion", volume->IsRootRegion()); + setAttribute(instance, "Solid", volume->GetSolid()->GetName()); + setAttribute(instance, "EType", volume->GetSolid()->GetEntityType()); + setAttribute(instance, "Material", volume->GetMaterial()->GetName()); + setAttribute(instance, "Density", volume->GetMaterial()->GetDensity()); + setAttribute(instance, "Radlen", volume->GetMaterial()->GetRadlen()); G4String state = materialState[volume->GetMaterial()->GetState()]; setAttribute(instance, "State", state); @@ -1004,7 +1097,11 @@ HepRepTypeTree* G4HepRepSceneHandler::getGeometryTypeTree() { // Create the Geometry TypeTree. HepRepTreeID* geometryTreeID = factory->createHepRepTreeID("G4GeometryTypes", "1.0"); _geometryTypeTree = factory->createHepRepTypeTree(geometryTreeID); - getHepRep()->addTypeTree(_geometryTypeTree); + if (messenger.appendGeometry()) { + getHepRep()->addTypeTree(_geometryTypeTree); + } else { + getHepRepGeometry()->addTypeTree(_geometryTypeTree); + } } return _geometryTypeTree; } @@ -1012,12 +1109,16 @@ HepRepTypeTree* G4HepRepSceneHandler::getGeometryTypeTree() { HepRepType* G4HepRepSceneHandler::getGeometryRootType() { if (_geometryRootType == NULL) { // Create the top level Geometry Type. - _geometryRootType = factory->createHepRepType(NULL, rootVolumeName); + _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",""); @@ -1042,9 +1143,9 @@ HepRepType* G4HepRepSceneHandler::getGeometryRootType() { _geometryRootType->addAttValue("MarkSizeMultiplier", 4.0); _geometryRootType->addAttValue("LineWidthMultiplier", 1.0); - - getGeometryTypeTree()->addType(_geometryRootType); - + + addTopLevelAttributes(_geometryRootType); + _geometryType["/"+_geometryRootType->getName()] = _geometryRootType; } return _geometryRootType; @@ -1129,7 +1230,7 @@ HepRepTypeTree* G4HepRepSceneHandler::getEventTypeTree() { HepRepType* G4HepRepSceneHandler::getEventType() { if (_eventType == NULL) { // Create the top level Event Type. - _eventType = factory->createHepRepType(NULL, "Event"); + _eventType = factory->createHepRepType(getEventTypeTree(), "Event"); _eventType->addAttValue("Layer", eventLayer); // add defaults for Events @@ -1144,11 +1245,7 @@ HepRepType* G4HepRepSceneHandler::getEventType() { _eventType->addAttValue("MarkSizeMultiplier", 4.0); _eventType->addAttValue("LineWidthMultiplier", 1.0); - // Some non-standard attributes - _eventType->addAttDef("PointUnit", "Length", "Physics", ""); - _eventType->addAttValue("PointUnit", G4String("m")); - - getEventTypeTree()->addType(_eventType); + addTopLevelAttributes(_eventType); } return _eventType; diff --git a/source/visualization/HepRep/src/G4HepRepViewer.cc b/source/visualization/HepRep/src/G4HepRepViewer.cc index 084393dccb..d705622df5 100644 --- a/source/visualization/HepRep/src/G4HepRepViewer.cc +++ b/source/visualization/HepRep/src/G4HepRepViewer.cc @@ -20,8 +20,8 @@ // * statement, and all its terms. * // ******************************************************************** // -// $Id: G4HepRepViewer.cc,v 1.22 2003/12/11 21:55:55 duns Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4HepRepViewer.cc,v 1.25 2004/05/27 05:59:08 duns Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /** @@ -43,9 +43,10 @@ using namespace HEPREP; using namespace std; -G4HepRepViewer::G4HepRepViewer (G4VSceneHandler& sceneHandler, const G4String& name) +G4HepRepViewer::G4HepRepViewer (G4VSceneHandler& sceneHandler, G4HepRepMessenger& heprepMessenger, const G4String& name) : G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name), - geometryIncluded(false) { + geometryIncluded(false), + messenger(heprepMessenger) { #ifdef SDEBUG cout << "G4HepRepViewer::G4HepRepViewer " << name << endl; @@ -106,7 +107,7 @@ void G4HepRepViewer::ShowView () { G4HepRepSceneHandler* sceneHandler = dynamic_cast(GetSceneHandler()); if (sceneHandler->closeHepRep()) { sceneHandler->openHepRep(); - geometryIncluded = false; + if (messenger.appendGeometry()) geometryIncluded = false; } } @@ -116,3 +117,7 @@ void G4HepRepViewer::FinishView () { #endif G4VViewer::FinishView(); } + +void G4HepRepViewer::reset() { + geometryIncluded = false; +} diff --git a/source/visualization/HepRep/src/XMLHepRepWriter.cc b/source/visualization/HepRep/src/XMLHepRepWriter.cc index e929863c36..08d82e8102 100644 --- a/source/visualization/HepRep/src/XMLHepRepWriter.cc +++ b/source/visualization/HepRep/src/XMLHepRepWriter.cc @@ -37,9 +37,22 @@ XMLHepRepWriter::~XMLHepRepWriter() { delete xml; } +bool XMLHepRepWriter::addProperty(std::string key, std::string value) { + properties[key] = value; + return true; +} + bool XMLHepRepWriter::close() { xml->closeDoc(true); if (zip != NULL) { + zip->putNextEntry(ZipCDirEntry("heprep.properties")); + + map::iterator i = properties.begin(); + while (i != properties.end()) { + *zip << (*i).first << "=" << (*i).second << endl; + i++; + } + zip->closeEntry(); zip->finish(); zip->close(); } @@ -58,15 +71,15 @@ bool XMLHepRepWriter::write(HepRep* heprep, string name) { xml->openDoc(); xml->setAttribute("xmlns", "http://java.freehep.org/schemas/heprep/2.0"); xml->setAttribute("xmlns", "xsi", "http://www.w3.org/2001/XMLSchema-instance"); - xml->setAttribute("xsi", "schemaLocation", "HepRep.xsd"); + 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* typeTreeList = heprep->getTypeTrees(); - for (vector::iterator i1=typeTreeList->begin(); i1 != typeTreeList->end(); i1++) { + set typeTreeSet = heprep->getTypeTrees(); + for (set::iterator i1=typeTreeSet.begin(); i1 != typeTreeSet.end(); i1++) { write(*i1); } - vector* instanceTreeList = heprep->getInstanceTrees(); - for (vector::iterator i2=instanceTreeList->begin(); i2 != instanceTreeList->end(); i2++) { + set instanceTreeSet = heprep->getInstanceTrees(); + for (set::iterator i2=instanceTreeSet.begin(); i2 != instanceTreeSet.end(); i2++) { write(*i2); } xml->closeTag(); @@ -78,10 +91,10 @@ bool XMLHepRepWriter::write(HepRep* heprep, string name) { return true; } -bool XMLHepRepWriter::write(vector *layers) { +bool XMLHepRepWriter::write(vector layers) { string layerOrder = ""; bool comma = false; - for (vector::iterator i=layers->begin(); i != layers->end(); i++) { + for (vector::iterator i=layers.begin(); i != layers.end(); i++) { if (comma) { layerOrder.append(", "); } @@ -98,8 +111,8 @@ bool XMLHepRepWriter::write(HepRepTypeTree* typeTree) { xml->setAttribute("version", typeTree->getVersion()); xml->openTag(nameSpace, "typetree"); - vector* list = typeTree->getTypes(); - for (vector::iterator i=list->begin(); i != list->end(); i++) { + set types = typeTree->getTypes(); + for (set::iterator i=types.begin(); i != types.end(); i++) { write(*i); } xml->closeTag(); @@ -112,8 +125,8 @@ bool XMLHepRepWriter::write(HepRepType* type) { write((HepRepDefinition*)type); write((HepRepAttribute*)type); - vector* list = type->getTypes(); - for (vector::iterator i=list->begin(); i != list->end(); i++) { + set types = type->getTypes(); + for (set::iterator i=types.begin(); i != types.end(); i++) { write(*i); } xml->closeTag(); @@ -142,14 +155,14 @@ bool XMLHepRepWriter::write(HepRepInstanceTree* instanceTree) { xml->setAttribute("typetreeversion", instanceTree->getTypeTree()->getVersion()); xml->openTag(nameSpace, "instancetree"); // refs - vector* instanceTreeList = instanceTree->getInstanceTrees(); - for (vector::iterator i1=instanceTreeList->begin(); i1 != instanceTreeList->end(); i1++) { + set instanceTreeSet = instanceTree->getInstanceTrees(); + for (set::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++) { + vector instanceList = instanceTree->getInstances(); + for (vector::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) { write(*i2); } xml->closeTag(); @@ -162,13 +175,13 @@ bool XMLHepRepWriter::write(HepRepInstance* instance) { xml->openTag(nameSpace, "instance"); write((HepRepAttribute*)instance); - vector* pointList = instance->getPoints(); - for (vector::iterator i1=pointList->begin(); i1 != pointList->end(); i1++) { + 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++) { + vector instanceList = instance->getInstances(); + for (vector::iterator i2=instanceList.begin(); i2 != instanceList.end(); i2++) { write(*i2); } xml->closeTag(); @@ -179,7 +192,7 @@ 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) { + if (point->getAttValuesFromNode().size() != 0) { xml->openTag(nameSpace, "point"); write((HepRepAttribute*)point); xml->closeTag(); @@ -195,16 +208,16 @@ bool XMLHepRepWriter::write(HepRepAttribute* attribute) { HepRepAttValue* layerAtt = attribute->getAttValueFromNode("layer"); if (layerAtt != NULL) write(layerAtt); - vector* list = attribute->getAttValuesFromNode(); - for (vector::iterator i=list->begin(); i != list->end(); i++) { + set attSet = attribute->getAttValuesFromNode(); + for (set::iterator i=attSet.begin(); i != attSet.end(); i++) { write(*i); } return true; } bool XMLHepRepWriter::write(HepRepDefinition* definition) { - vector* list = definition->getAttDefsFromNode(); - for (vector::iterator i=list->begin(); i != list->end(); i++) { + set list = definition->getAttDefsFromNode(); + for (set::iterator i=list.begin(); i != list.end(); i++) { write(*i); } return true; diff --git a/source/visualization/History b/source/visualization/History index 3900395d4f..0686a76c1c 100644 --- a/source/visualization/History +++ b/source/visualization/History @@ -1,4 +1,4 @@ -$Id: History,v 1.241 2004/03/16 08:46:58 gcosmo Exp $ +$Id: History,v 1.247 2004/06/09 07:40:49 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -24,10 +24,37 @@ committal in the CVS repository ! History file for visualization category --------------------------------------- +9th June 2004 Gabriele Cosmo (vis-V06-01-03) +- Adopt G4DLLIMPORT/G4DLLEXPORT technique to handle extern simbols for + allowing support of DLLs on Windows. +- Minor correction in modeling/GNUmakefile for GLOBLIBS definition. +- Coworks with "global-V06-01-02b". + +7th June 2004 Gabriele Cosmo (vis-V06-01-02) +- Includes "vis-HepRep-V06-01-04". +- Export extern symbols for allowing support of DLLs on Windows. + Modified files: G4RayTrajectory.hh, G4RayTrajectoryPoint.hh. +- GNUmakefiles: added definition of GLOBLIBS for DLLs support on Windows. +- Coworks with "global-V06-01-02a". + +9th April 2004 John Allison (vis-V06-01-01 + interfaces-V06-01-00) +- Tagged OpenGL as below. Joint with interfaces-V06-01-00. + +7th April 2004 Guy Barrand +- visualization/OpenGL/* : use the G4OpenGL.hh file. +- Added : visualization/OpenGL/include/G4OpenGL.hh to encapsulate + the include of gl/gl.h and gl/glu.h that may be platform dependant. + It permits to rm some #ifdef WIN32 spread in the code. It opens also + the way to the usage of the Apple OpenGL on a Mac. + 14 March 2004 Joseph Perl (vis-V06-00-01) - HepRepFile handle duplicate ShowView. - HepRepFile improve layering and hierarchy for hits. +17th February 2004 John Allison (opengl-V06-00-00) +- Fixed bug #581: wrong order of statements in + G4OpenGLXViewer::~G4OpenGLXViewer (see bug report). + 1st December 2003 John Allison - Added checks and minor improvment of behaviour at end of event and run: o G4VisManager::EndOfRun: added check on MarkForClearingTransientStore. diff --git a/source/visualization/OpenGL/GNUmakefile b/source/visualization/OpenGL/GNUmakefile index 2042d11d43..293f10d8cc 100644 --- a/source/visualization/OpenGL/GNUmakefile +++ b/source/visualization/OpenGL/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/10/03 15:06:56 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/03 11:40:13 gcosmo Exp $ name := G4OpenGL @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4interfaces.lib libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/OpenGL/include/G4OpenGL.hh b/source/visualization/OpenGL/include/G4OpenGL.hh new file mode 100644 index 0000000000..5838de5216 --- /dev/null +++ b/source/visualization/OpenGL/include/G4OpenGL.hh @@ -0,0 +1,33 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +#ifndef G4OpenGL_h +#define G4OpenGL_h + +#ifdef WIN32 +#include +#endif + +#include +#include + +#endif diff --git a/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh b/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh index f61734b201..3b74f5a2a1 100644 --- a/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh +++ b/source/visualization/OpenGL/include/G4OpenGLSceneHandler.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLSceneHandler.hh,v 1.14 2003/06/10 17:58:55 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLSceneHandler.hh,v 1.15 2004/04/07 15:17:12 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 27th March 1996 @@ -37,11 +37,7 @@ #include "globals.hh" #include "G4RotationMatrix.hh" -#ifdef WIN32 - #include -#endif -#include -#include +#include "G4OpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLViewer.hh" diff --git a/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh b/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh index 95717250ff..073eb5f10c 100644 --- a/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh +++ b/source/visualization/OpenGL/include/G4OpenGLTransform3D.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLTransform3D.hh,v 1.5 2003/06/10 17:41:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLTransform3D.hh,v 1.6 2004/04/07 15:17:12 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 24th October 1996 @@ -36,10 +36,7 @@ #include "G4Transform3D.hh" -#ifdef WIN32 - #include -#endif -#include +#include "G4OpenGL.hh" class G4OpenGLTransform3D : public G4Transform3D { public: diff --git a/source/visualization/OpenGL/include/G4OpenGLXViewer.hh b/source/visualization/OpenGL/include/G4OpenGLXViewer.hh index 984f4b4c24..77378cdcdc 100644 --- a/source/visualization/OpenGL/include/G4OpenGLXViewer.hh +++ b/source/visualization/OpenGL/include/G4OpenGLXViewer.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLXViewer.hh,v 1.18 2003/09/22 10:37:50 johna Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpenGLXViewer.hh,v 1.19 2004/04/07 15:17:12 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 7th February 1997 @@ -42,9 +42,7 @@ #include #include -#include #include -#include class G4OpenGLSceneHandler; diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc index 813eb6ccde..1f11d09d4d 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLImmediateXViewer.cc,v 1.8 2003/06/10 17:13:32 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLImmediateXViewer.cc,v 1.9 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 7th February 1997 @@ -33,8 +33,6 @@ #include "G4OpenGLImmediateXViewer.hh" -#include - #include "G4ios.hh" G4OpenGLImmediateXViewer:: diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc index 6a2d3bdbd9..84850d1931 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXm.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLImmediateXm.cc,v 1.8 2002/02/24 01:48:05 johna Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLImmediateXm.cc,v 1.9 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 10th February 1997 @@ -30,8 +30,6 @@ #ifdef G4VIS_BUILD_OPENGLXM_DRIVER -#include - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" diff --git a/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc index c0035fd1a7..135bbada3b 100644 --- a/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLImmediateXmViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLImmediateXmViewer.cc,v 1.8 2003/06/10 17:13:33 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLImmediateXmViewer.cc,v 1.9 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 10th February 1997 @@ -33,8 +33,6 @@ #include "G4OpenGLImmediateXmViewer.hh" -#include - #include "G4ios.hh" G4OpenGLImmediateXmViewer:: diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc b/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc index a1f7aa9320..72d6fb87af 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredWin32.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLStoredWin32.cc,v 1.10 2003/06/10 17:41:04 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLStoredWin32.cc,v 1.11 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // OpenGLStoredWin32 graphics system factory. @@ -37,11 +37,6 @@ #include "G4OpenGLStoredWin32.hh" #include "G4OpenGLStoredWin32Viewer.hh" -#ifdef WIN32 - #include -#endif -#include - G4OpenGLStoredWin32::G4OpenGLStoredWin32 (): G4VGraphicsSystem ("OpenGLStoredWin32", "OGLSWin32", diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredX.cc b/source/visualization/OpenGL/src/G4OpenGLStoredX.cc index 114b5c1f25..61cf55a8f5 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredX.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredX.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLStoredX.cc,v 1.8 2002/02/24 01:48:17 johna Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLStoredX.cc,v 1.9 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 10th February 1997 @@ -31,8 +31,6 @@ #ifdef G4VIS_BUILD_OPENGLX_DRIVER -#include - #include "G4VisFeaturesOfOpenGL.hh" #include "G4VSceneHandler.hh" #include "G4OpenGLSceneHandler.hh" diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc index 07baf142c5..181325b367 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredXViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLStoredXViewer.cc,v 1.9 2003/06/10 17:13:34 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLStoredXViewer.cc,v 1.10 2004/04/07 15:18:22 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 7th February 1997 @@ -33,8 +33,6 @@ #include "G4OpenGLStoredXViewer.hh" -#include - #include "G4ios.hh" G4OpenGLStoredXViewer:: diff --git a/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc index b0fc5ac058..55efef259f 100644 --- a/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLStoredXmViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLStoredXmViewer.cc,v 1.8 2003/06/10 17:13:34 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLStoredXmViewer.cc,v 1.9 2004/04/07 15:18:23 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 10th February 1997 @@ -33,8 +33,6 @@ #include "G4OpenGLStoredXmViewer.hh" -#include - #include "G4ios.hh" G4OpenGLStoredXmViewer:: diff --git a/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc b/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc index b9db05ad5a..28e64c187e 100644 --- a/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLWin32Viewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLWin32Viewer.cc,v 1.9 2003/06/25 09:01:12 gcosmo Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLWin32Viewer.cc,v 1.13 2004/04/08 15:36:32 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // G4OpenGLWin32Viewer : Class to provide WindowsNT specific @@ -71,6 +71,12 @@ void G4OpenGLWin32Viewer::FinishView ( { if(!fHDC) return; ::SwapBuffers(fHDC); + // Empty the Windows message queue : + MSG event; + while ( ::PeekMessage(&event, NULL, 0, 0, PM_REMOVE) ) { + ::TranslateMessage(&event); + ::DispatchMessage (&event); + } } ////////////////////////////////////////////////////////////////////////////// @@ -197,10 +203,10 @@ LRESULT CALLBACK G4OpenGLWin32Viewer::WindowProc ( ////////////////////////////////////////////////////////////////////////////// //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// { +/* switch (aMessage) { case WM_PAINT:{ - G4OpenGLWin32Viewer* This = - (G4OpenGLWin32Viewer*)::GetWindowLong(aWindow,GWL_USERDATA); + printf("debug : PAINT\n"); HDC hDC; PAINTSTRUCT ps; hDC = BeginPaint(aWindow,&ps); @@ -208,11 +214,26 @@ LRESULT CALLBACK G4OpenGLWin32Viewer::WindowProc ( // FIXME : To have an automatic refresh someone have to redraw here. } EndPaint(aWindow, &ps); + + //FIXME : have to handle WM_RESIZE + //pView->WinSize_x = (G4int) width; + //pView->WinSize_y = (G4int) height; + G4OpenGLWin32Viewer* This = + (G4OpenGLWin32Viewer*)::GetWindowLong(aWindow,GWL_USERDATA); + if(This) { + This->SetView(); + glViewport(0,0,This->WinSize_x,This->WinSize_y); + This->ClearView(); + This->DrawView(); + // WARNING : the below empty the Windows message queue... + This->FinishView(); } - return 0; + } return 0; default: return DefWindowProc(aWindow,aMessage,aWParam,aLParam); } +*/ + return DefWindowProc(aWindow,aMessage,aWParam,aLParam); } ////////////////////////////////////////////////////////////////////////////// diff --git a/source/visualization/OpenGL/src/G4OpenGLXViewer.cc b/source/visualization/OpenGL/src/G4OpenGLXViewer.cc index c9ce285f19..0c58b9139b 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLXViewer.cc,v 1.20 2004/02/17 18:17:34 johna Exp $ -// GEANT4 tag $Name: geant4-06-01 $ +// $Id: G4OpenGLXViewer.cc,v 1.21 2004/04/07 15:18:23 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 7th February 1997 @@ -33,10 +33,6 @@ #include "G4OpenGLXViewer.hh" -#include -#include -#include - #include "G4ios.hh" #include "G4VisExtent.hh" diff --git a/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc b/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc index 42b7cfeb85..0a30fd482d 100644 --- a/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc +++ b/source/visualization/OpenGL/src/G4OpenGLXmViewer.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenGLXmViewer.cc,v 1.11 2002/02/24 01:48:29 johna Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenGLXmViewer.cc,v 1.12 2004/04/07 15:18:23 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 10th February 1997 @@ -35,10 +35,6 @@ #include "G4OpenGLXmViewer.hh" -#include -#include -#include - #include "G4ios.hh" #include "G4VisExtent.hh" diff --git a/source/visualization/OpenInventor/GNUmakefile b/source/visualization/OpenInventor/GNUmakefile index f897231338..3876b0fb4a 100644 --- a/source/visualization/OpenInventor/GNUmakefile +++ b/source/visualization/OpenInventor/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/10/03 15:11:05 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/03 11:40:13 gcosmo Exp $ name := G4OpenInventor @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4interfaces.lib libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/OpenInventor/History b/source/visualization/OpenInventor/History index 5a42898841..4cf8948333 100644 --- a/source/visualization/OpenInventor/History +++ b/source/visualization/OpenInventor/History @@ -1,4 +1,4 @@ -$Id: History,v 1.5 2003/10/29 10:02:24 gcosmo Exp $ +$Id: History,v 1.7 2004/06/14 09:27:33 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -20,6 +20,19 @@ committal in the CVS repository ! History file for visualization/OpenInventor ------------------------------------------- +08th April 2004 Guy Barrand (openinventor-V06-01-00) +- Bring in the repository the necessary HEPVis code. In fact few of HEPVis + is used in this G4 driver. Then HEPVis is no more needed. + Note that, to avoid clashes of G4/vis within experiments, the HEPVis + node are protected by some : #define Geant4_ . Then, for + example, within the G4OpenInventor lib there are Geant4_SoBox, etc... + (and not SoBox,... that may clash with other HEPVis code in experiments). +- Have code to run on Windows. +- Split Viewer to have G4OpenInventorXtViewer and G4OpenInventorWinViewer. +- Split G4OpenInventor to have G4OpenInventorXt and G4OpenInventorWin. + Xt and Win (and not X and Win32 like in vis/OpenGL) to follow + the conventions found in the OpenInventor world. + 29th October 2003 Cosmo Gabriele (openinventor-V05-02-00) - Patch in G4OpenInventorSceneHandler in PreAddThis() to cope with changes introduced in G4VPhysicalVolume in "geant4-05-02-ref-04", where pointer to diff --git a/source/visualization/OpenInventor/include/G4OpenInventor.hh b/source/visualization/OpenInventor/include/G4OpenInventor.hh index dfe6db7735..923235e947 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventor.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventor.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventor.hh,v 1.6 2001/07/11 10:08:59 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventor.hh,v 1.7 2004/04/08 09:39:37 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // Guy Barrand 26 Mar 1998. // OpenInventor graphics system factory. @@ -40,11 +40,10 @@ class G4OpenInventor: public G4VGraphicsSystem { public: G4OpenInventor(const G4String,const G4String,G4VGraphicsSystem::Functionality); virtual ~G4OpenInventor(); - G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = ""); void SetInteractorManager(G4VInteractorManager*); G4VInteractorManager* GetInteractorManager(); G4VSceneHandler* CreateSceneHandler (const G4String& name); - void InitHEPVis(); + void InitNodes(); private: G4VInteractorManager* interactorManager; }; diff --git a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh index 08fd35ebf2..1ae7650756 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorSceneHandler.hh,v 1.15 2003/10/29 10:01:35 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpenInventorSceneHandler.hh,v 1.16 2004/04/08 09:39:38 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // J Kallenbach 27th Aug 1996 @@ -44,7 +44,8 @@ class SoSeparator; // Base class for various OpenInventorScene classes. class G4OpenInventorSceneHandler: public G4VSceneHandler { -friend class G4OpenInventorViewer; +friend class G4OpenInventorXtViewer; +friend class G4OpenInventorWinViewer; public: diff --git a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.icc b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.icc index 6616faf775..a650e58832 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.icc +++ b/source/visualization/OpenInventor/include/G4OpenInventorSceneHandler.icc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorSceneHandler.icc,v 1.4 2001/07/11 10:08:59 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorSceneHandler.icc,v 1.5 2004/04/08 09:39:38 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // J Kallenbach 27th Aug 1996 diff --git a/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh b/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh index 6eeb7adb9a..b85b62b083 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorTransform3D.hh @@ -21,16 +21,16 @@ // ******************************************************************** // // -// $Id: G4OpenInventorTransform3D.hh,v 1.4 2001/07/11 10:09:00 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorTransform3D.hh,v 1.5 2004/04/08 09:39:38 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // jck 17 Dec 1996 // G4OpenGLInventorTransform3D provides SoSFMatrix transformation matrix // from G4Transform3D. -#ifndef G4OpenInventorTRANSFORM3D_HH -#define G4OpenInventorTRANSFORM3D_HH +#ifndef G4OPENINVENTORTRANSFORM3D_HH +#define G4OPENINVENTORTRANSFORM3D_HH #ifdef G4VIS_BUILD_OI_DRIVER diff --git a/source/visualization/OpenInventor/include/G4OpenInventorWin.hh b/source/visualization/OpenInventor/include/G4OpenInventorWin.hh new file mode 100644 index 0000000000..6ef5992284 --- /dev/null +++ b/source/visualization/OpenInventor/include/G4OpenInventorWin.hh @@ -0,0 +1,45 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4OpenInventorWin.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// OpenInventor graphics system factory. + +#if defined (G4VIS_BUILD_OIWIN32_DRIVER) || defined (G4VIS_USE_OIWIN32) + +#ifndef G4OPENINVENTORWIN_HH +#define G4OPENINVENTORWIN_HH + +#include "G4OpenInventor.hh" + +class G4OpenInventorWin: public G4OpenInventor { +public: + G4OpenInventorWin (); + virtual ~G4OpenInventorWin (); + G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = ""); +}; + +#endif + +#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorWin32.hh b/source/visualization/OpenInventor/include/G4OpenInventorWin32.hh index b5816916cd..5b13af8ab7 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorWin32.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorWin32.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorWin32.hh,v 1.5 2001/07/11 10:09:00 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorWin32.hh,v 1.6 2004/04/08 09:39:38 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // OpenInventor graphics system factory. @@ -31,12 +31,14 @@ #ifndef G4OPENINVENTORWIN32_HH #define G4OPENINVENTORWIN32_HH -#include "G4OpenInventor.hh" +// For backward compatibilty. -class G4OpenInventorWin32: public G4OpenInventor { +#include "G4OpenInventorWin.hh" + +class G4OpenInventorWin32: public G4OpenInventorWin { public: - G4OpenInventorWin32 (); - virtual ~G4OpenInventorWin32 (); + G4OpenInventorWin32 () {} + virtual ~G4OpenInventorWin32 () {} }; #endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh new file mode 100644 index 0000000000..a30ef356c0 --- /dev/null +++ b/source/visualization/OpenInventor/include/G4OpenInventorWinViewer.hh @@ -0,0 +1,69 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4OpenInventorWinViewer.hh,v 1.2 2004/04/08 10:49:10 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// Jeff Kallenbach 01 Aug 1996 +// OpenInventor viewer - opens window, hard copy, etc. + +#ifndef G4OPENINVENTORWINVIEWER_HH +#define G4OPENINVENTORWINVIEWER_HH + +#ifdef G4VIS_BUILD_OI_DRIVER + +#include "G4VViewer.hh" + +#include + +class SoWinExaminerViewer; +class SoSelection; +class G4OpenInventorSceneHandler; +class G4VInteractorManager; + +class G4OpenInventorWinViewer: public G4VViewer { + +public: + G4OpenInventorWinViewer(G4OpenInventorSceneHandler& scene, + const G4String& name = ""); + virtual ~G4OpenInventorWinViewer(); + void DrawView(); + void ShowView(); +private: + void ClearView(); + void FinishView(); + void SetView(); + void KernelVisitDecision(); + G4bool CompareForKernelVisit(G4ViewParameters&); + G4OpenInventorSceneHandler& fG4OpenInventorSceneHandler; + G4ViewParameters fLastVP; // Memory for making kernel visit decisions. + HWND fShell; + SoWinExaminerViewer* fViewer; + SoSelection* fSelection; + G4VInteractorManager* fInteractorManager; +}; + +#endif + +#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorX.hh b/source/visualization/OpenInventor/include/G4OpenInventorX.hh index 7bd64e7305..4bf4a33c15 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorX.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorX.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorX.hh,v 1.5 2001/07/11 10:09:00 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorX.hh,v 1.6 2004/04/08 09:39:38 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Andrew Walkden 27th March 1996 @@ -33,12 +33,14 @@ #ifndef G4OPENINVENTORX_HH #define G4OPENINVENTORX_HH -#include "G4OpenInventor.hh" +// For backward compatibilty. -class G4OpenInventorX: public G4OpenInventor { +#include "G4OpenInventorXt.hh" + +class G4OpenInventorX: public G4OpenInventorXt { public: - G4OpenInventorX (); - virtual ~G4OpenInventorX (); + G4OpenInventorX () {} + virtual ~G4OpenInventorX () {} }; #endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorXt.hh b/source/visualization/OpenInventor/include/G4OpenInventorXt.hh new file mode 100644 index 0000000000..86234f8884 --- /dev/null +++ b/source/visualization/OpenInventor/include/G4OpenInventorXt.hh @@ -0,0 +1,47 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4OpenInventorXt.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +// +// Andrew Walkden 27th March 1996 +// OpenInventor graphics system factory. + +#if defined (G4VIS_BUILD_OIX_DRIVER) || defined (G4VIS_USE_OIX) + +#ifndef G4OPENINVENTORXT_HH +#define G4OPENINVENTORXT_HH + +#include "G4OpenInventor.hh" + +class G4OpenInventorXt: public G4OpenInventor { +public: + G4OpenInventorXt (); + virtual ~G4OpenInventorXt (); + G4VViewer* CreateViewer(G4VSceneHandler&,const G4String& name = ""); +}; + +#endif + +#endif diff --git a/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh b/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh similarity index 75% rename from source/visualization/OpenInventor/include/G4OpenInventorViewer.hh rename to source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh index 0716fc2816..c1f3fd80f2 100644 --- a/source/visualization/OpenInventor/include/G4OpenInventorViewer.hh +++ b/source/visualization/OpenInventor/include/G4OpenInventorXtViewer.hh @@ -21,51 +21,48 @@ // ******************************************************************** // // -// $Id: G4OpenInventorViewer.hh,v 1.10 2001/11/14 14:56:11 barrand Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorXtViewer.hh,v 1.1 2004/04/08 09:37:30 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Jeff Kallenbach 01 Aug 1996 // OpenInventor viewer - opens window, hard copy, etc. -#ifndef G4OPENINVENTORVIEWER_HH -#define G4OPENINVENTORVIEWER_HH +#ifndef G4OPENINVENTORXTVIEWER_HH +#define G4OPENINVENTORXTVIEWER_HH #ifdef G4VIS_BUILD_OI_DRIVER -#include - #include "G4VViewer.hh" -class SoXtComponent; +#include +class SoXtExaminerViewer; + class SoSelection; -class G4SoWindow; class G4OpenInventorSceneHandler; class G4VInteractorManager; // // Base class for various OpenInventorView classes. // -class G4OpenInventorViewer: public G4VViewer { +class G4OpenInventorXtViewer: public G4VViewer { public: - G4OpenInventorViewer (G4OpenInventorSceneHandler& scene, - const G4String& name = ""); - virtual ~G4OpenInventorViewer (); - void DrawView (); - void ShowView (); + G4OpenInventorXtViewer(G4OpenInventorSceneHandler& scene, + const G4String& name = ""); + virtual ~G4OpenInventorXtViewer(); + void DrawView(); + void ShowView(); private: - void ClearView (); - void FinishView (); - void SetView (); - void KernelVisitDecision (); + void ClearView(); + void FinishView(); + void SetView(); + void KernelVisitDecision(); G4bool CompareForKernelVisit(G4ViewParameters&); - G4OpenInventorSceneHandler& fG4OpenInventorSceneHandler; G4ViewParameters fLastVP; // Memory for making kernel visit decisions. Widget fShell; - G4SoWindow* fWindow; - SoXtComponent* fViewer; // The Inventor Viewer + SoXtExaminerViewer* fViewer; SoSelection* fSelection; G4VInteractorManager* fInteractorManager; }; diff --git a/source/visualization/OpenInventor/include/HEPVis/SbMath.h b/source/visualization/OpenInventor/include/HEPVis/SbMath.h new file mode 100644 index 0000000000..7ec665b081 --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/SbMath.h @@ -0,0 +1,53 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SbMath.h,v 1.2 2004/06/14 09:27:34 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +#ifndef HEPVis_SbMath_h +#define HEPVis_SbMath_h + +#include +#ifndef M_PI +#define M_PI 3.1415926535897931160E0 +#define M_PI_2 1.5707963267948965580E0 +#endif + +#define SbMinimum(a,b) ((a)<(b)?a:b) +#define SbMaximum(a,b) ((a)>(b)?a:b) + +#define FCOS(x) ((float)cos((double)(x))) +#define FSIN(x) ((float)sin((double)(x))) +#define FACOS(x) ((float)acos((double)(x))) +#define FASIN(x) ((float)asin((double)(x))) +#define FTAN(x) ((float)tan((double)(x))) +#define FATAN(x) ((float)atan((double)(x))) +#define FSQRT(x) ((float)sqrt((double)(x))) +#define FPOW(x,y) ((float)pow((double)(x),(double)(y))) +#define FLOG(x) ((float)log((double)(x))) +#define FLOG10(x) ((float)log10((double)(x))) +#define FFLOOR(x) ((float)floor((double)(x))) +#define FFABS(x) ((float)fabs((double)(x))) +#define FCEIL(x) ((float)ceil((double)(x))) + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodekits/SoDetectorTreeKit.h b/source/visualization/OpenInventor/include/HEPVis/nodekits/SoDetectorTreeKit.h new file mode 100644 index 0000000000..69bffcd2bf --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodekits/SoDetectorTreeKit.h @@ -0,0 +1,115 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoDetectorTreeKit.h,v 1.2 2004/06/14 09:27:35 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoDetectorTreeKit */ +/* Description: Easy way of browsing through a tree of detectors */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoDetectorTreeKit_h +#define HEPVis_SoDetectorTreeKit_h + +#include +#include + +class SoSFNode; +class SoHandleEventAction; +class SoSeparator; + +#define SoDetectorTreeKit Geant4_SoDetectorTreeKit + + +class SoDetectorTreeKit:public SoBaseKit { + + // The following is required: + SO_KIT_HEADER(SoDetectorTreeKit); + //////////////////////////////////////////// + SoSFNode alternateRep; + //////////////////////////////////////////// + SO_KIT_CATALOG_ENTRY_HEADER(callbackList); + SO_KIT_CATALOG_ENTRY_HEADER(topSeparator); + SO_KIT_CATALOG_ENTRY_HEADER(pickStyle); + SO_KIT_CATALOG_ENTRY_HEADER(appearance); + SO_KIT_CATALOG_ENTRY_HEADER(units); + SO_KIT_CATALOG_ENTRY_HEADER(transform); + SO_KIT_CATALOG_ENTRY_HEADER(texture2Transform); + SO_KIT_CATALOG_ENTRY_HEADER(childList); + SO_KIT_CATALOG_ENTRY_HEADER(previewSeparator); + SO_KIT_CATALOG_ENTRY_HEADER(fullSeparator); + + +public: + + // Constructor, required + SoDetectorTreeKit(); + + // This is required + virtual SbBool affectsState() const; + + // Class Initializer, required + static void initClass(); + + // Turn the preview on or off + virtual void setPreview(SbBool Flag); + + // Return the preview state + virtual SbBool getPreview() const; + + // Return the preview Separator + virtual SoSeparator *getPreviewSeparator() const; + + // Return the full Separator + virtual SoSeparator *getFullSeparator() const; + + // Generate AlternateRep, required. Generating an alternate representation + // must be done upon users request. It allows an Inventor program to read + // back the file without requiring *this* code to be dynamically linked. + // If the users expects that *this* code will be dynamically linked, he + // need not invoke this method. + virtual void generateAlternateRep(); + + // We better be able to clear it, too! + virtual void clearAlternateRep(); + +protected: + + // Destructor. + virtual ~SoDetectorTreeKit(); + +private: + + // This is needed as well + void createInitialTree(); + + // This is the callback function that will be + // added to the callback list + static void expand (void *userData, SoEventCallback *eventCB); + static void contract (void *userData, SoEventCallback *eventCB); +}; + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodes/SoBox.h b/source/visualization/OpenInventor/include/HEPVis/nodes/SoBox.h new file mode 100644 index 0000000000..e9c48d5f26 --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodes/SoBox.h @@ -0,0 +1,155 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoBox.h,v 1.2 2004/06/14 09:27:36 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoBox */ +/* Description: Represents the G4Box Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoBox_h +#define HEPVis_SoBox_h + +#include +#include +#include + +class SoSFNode; + +//! SoBox - Inventor version of the G4Box Geant Geometry entity +/*! + * Node: SoBox + * + * Description: The Inventor version of the G4Box Geant Geometry entity + * + * Author: Joe Boudreau Nov 11 1996 + * + * class G4Box + * + * A Box is a cuboid of given half lengths dx,dy,dz. The Box is + * centred on the origin with sides parallel to the x/y/z axes. + * + * Always use Inventor Fields. This allows Inventor to detect a change to + * the data field and take the appropriate action; e.g., redraw the scene. +*/ + +#define SoBox Geant4_SoBox + +class SoBox:public SoShape { + + // The following is required: + SO_NODE_HEADER(SoBox); + +public: + + // + //! Half-length along X + // + SoSFFloat fDx; + // + //! Half-length along Y + // + SoSFFloat fDy; + // + //! Half-length along Z + // + SoSFFloat fDz; + // + //! Alternate rep - for use by users without HEPVis shared objects + // + SoSFNode alternateRep; + + // + //! Constructor, required + // + SoBox(); + + // + //! Class Initializer, required + // + static void initClass(); + + // + //! Generate AlternateRep, required. Generating an alternate representation + //! must be done upon users request. It allows an Inventor program to read + //! back the file without requiring *this* code to be dynamically linked. + //! If the users expects that *this* code will be dynamically linked, he + //! need not invoke this method. + // + virtual void generateAlternateRep(); + + // + //! We better be able to clear it, too! + // + virtual void clearAlternateRep(); + +protected: + + // + //! compute bounding Box, required + // + virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f ¢er ); + + // + //! Generate Primitives, required + // + virtual void generatePrimitives(SoAction *action); + + // + //! GetChildList, required whenever the class has hidden children + // + virtual SoChildList *getChildren() const; + + +protected: + // + //! Destructor, required + // + virtual ~SoBox(); + +private: + + // + //! Generate Children. Used to create the hidden children. Required whenever + //! the node has hidden children. + // + void generateChildren(); + + // + //! Used to modify hidden children when a data field is changed. Required + //! whenever the class has hidden children. + // + void updateChildren(); + + // + //! ChildList. Required whenever the class has hidden children. + // + SoChildList *children; + +}; + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodes/SoCons.h b/source/visualization/OpenInventor/include/HEPVis/nodes/SoCons.h new file mode 100644 index 0000000000..6cd985ddd4 --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodes/SoCons.h @@ -0,0 +1,191 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoCons.h,v 1.2 2004/06/14 09:27:36 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoCons */ +/* Description: Represents the G4Cons Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoCons_h +#define HEPVis_SoCons_h + +#include +#include +#include +#include + +class SoSFNode; +//! SoCons - Inventor version of the G4Cons Geant Geometry entity +/*! + * Node: SoCons + * + * Description: The Inventor version of the G4Cons Geant Geometry entity + * + * Author: Joe Boudreau Nov 11 1996 + * + * A G4Cons is, in the general case, a Phi segment of a cone, with half-length + * fDz, inner and outer radii specified at -fDz and +fDz. The Phi segment is + * described by a starting fSPhi angle, and the +fDPhi delta angle for the shape. + * If the delta angle is >=2*M_PI, the shape is treated as continuous in Phi + * + * Member Data: + * + * fRmin1 inside radius at -fDz + * fRmin2 inside radius at +fDz + * fRmax1 outside radius at -fDz + * fRmax2 outside radius at +fDz + * fDz half length in z + * + * fSPhi starting angle of the segment in radians + * fDPhi delta angle of the segment in radians +*/ + +#define SoCons Geant4_SoCons + +class SoCons:public SoShape { + + // The following is required: + SO_NODE_HEADER(SoCons); + +public: + + // + //! Inside radius at -fDz + // + SoSFFloat fRmin1; + // + //! Inside radius at +fDz + // + SoSFFloat fRmin2; + // + //! Outside radius at -fDz + // + SoSFFloat fRmax1; + // + //! Outside radius at +fDz + // + SoSFFloat fRmax2; + // + //! Half-length along Z + // + SoSFFloat fDz; + // + //! Starting angle, in radians + // + SoSFFloat fSPhi; + // + //! Delta-angle, in radians + // + SoSFFloat fDPhi; + // + //! An Inventor option - slightly better render, worse performance + // + SoSFBool smoothDraw; + // + //! Alternate rep required - for use by users without HEPVis shared objects + // + SoSFNode alternateRep; + + // + //! Constructor, required + // + SoCons(); + + // + //! Class Initializer, required + // + static void initClass(); + + // + //! Generate AlternateRep, required. Generating an alternate representation + //! must be done upon users request. It allows an Inventor program to read + //! back the file without requiring *this* code to be dynamically linked. + //! If the users expects that *this* code will be dynamically linked, he + //! need not invoke this method. + // + virtual void generateAlternateRep(); + + // + //! We better be able to clear it, too! + // + virtual void clearAlternateRep(); + +protected: + + // + //! compute bounding Box, required + // + virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f ¢er ); + + // + //! Generate Primitives, required + // + virtual void generatePrimitives(SoAction *action); + + // + //! GetChildList, required whenever the class has hidden children + // + virtual SoChildList *getChildren() const; + + +protected: + // + //! Destructor, required + // + virtual ~SoCons(); + +private: + + // + //! Generate Children. Used to create the hidden children. Required whenever + //! the node has hidden children. + // + void generateChildren(); + + // + //! Used to modify hidden children when a data field is changed. Required + //! whenever the class has hidden children. + // + void updateChildren(); + + // + //! ChildList. Required whenever the class has hidden children. + // + SoChildList *children; + + // + //! help with trigonometry. increments sines an cosines by an angle. + // + void inc(double & sinPhi, double & cosPhi, double sinDeltaPhi, double cosDeltaPhi) const { + double oldSin=sinPhi,oldCos=cosPhi; + sinPhi = oldSin*cosDeltaPhi+oldCos*sinDeltaPhi; + cosPhi = oldCos*cosDeltaPhi-oldSin*sinDeltaPhi; + } +}; + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrap.h b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrap.h new file mode 100644 index 0000000000..581fb4e39b --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrap.h @@ -0,0 +1,213 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTrap.h,v 1.2 2004/06/14 09:27:37 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoTrap */ +/* Description: Represents the G4Trap Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoTrap_h +#define HEPVis_SoTrap_h +#include +#include +#include + +//adding fields +#ifdef WIN32 +#include +#endif + + +// Defining Class +#ifdef WIN32 +#include +#endif + +class SoSFNode; + +//! SoTrap - Inventor version of the G4Trap Geant Geometry entity +/*! Node: SoTrap + * + * Description: Inventor version of the G4Trap Geant Geometry entity + * + * Author: Joe Boudreau Nov 11 1996 + * + * A G4Trap is a general trapezoid: The faces perpendicular to the z planes + * are tapezia, and their centres are not necessarily on a line parallel to + * the z axis. + * + * Note that of the 11 parameters desribed below, only 9 are really + * independent - a check for planarity is made in the calculation of the + * equation for each plane. If the planes are not parallel, a call to + * G4Exception is made. + * + * Always use Inventor Fields. This allows Inventor to detect a change to + * the data field and take the appropriate action; e.g., redraw the scene. + * +*/ + +#define SoTrap Geant4_SoTrap + +class SoTrap:public SoShape { + + // The following is required: + SO_NODE_HEADER(SoTrap); + +public: +#if defined(WIN32) && defined(BUILDING_DLL) + // When building the node as a DLL under Win32 we must explicitly + // declare this entry point as visible outside the DLL. The macro + // BUILDING_DLL is defined in the node's source file. + _declspec(dllexport) +#endif + + // + //! half-length along Z + // + SoSFFloat pDz; + // + //! Polar angle of the line joining the centres of the faces at -/+pDz + // + SoSFFloat pTheta; + // + //! Azimuthal angle of the line joing the centre of the face at -pDz + //! to the centre of the face at +pDz + // + SoSFFloat pPhi; + // + //! Half-length along y of the face at -pDz + // + SoSFFloat pDy1; + // + //! Half-length along x of the side at y=-pDy1 of the face at -pDz + // + SoSFFloat pDx1; + // + //! Half-length along x of the side at y=+pDy1 of the face at -pDz + // + SoSFFloat pDx2; + // + //! Half-length along y of the face at +pDz + // + SoSFFloat pDy2; + // + //! Half-length along x of the side at y=-pDy2 of the face at +pDz + // + SoSFFloat pDx3; + // + //! Half-length along x of the side at y=+pDy2 of the face at +pDz + // + SoSFFloat pDx4; + // + //! Angle with respect to the y axis from the centre of the side at + //! y=-pDy1 to the centre at y=+pDy1 of the face at -pDz + // + SoSFFloat pAlp1; + // + //! Angle with respect to the y axis from the centre of the side at + //! y=-pDy2 to the centre at y=+pDy2 of the face at +pDz + // + SoSFFloat pAlp2; + + // + //! Alternate rep - required + // + SoSFNode alternateRep; + + // + //! Constructor, required + // + SoTrap(); + + // + //! Class Initializer, required + // + static void initClass(); + + // + //! Generate AlternateRep, required. Generating an alternate representation + //! must be done upon users request. It allows an Inventor program to read + //! back the file without requiring *this* code to be dynamically linked. + //! If the users expects that *this* code will be dynamically linked, he + //! need not invoke this method. + // + virtual void generateAlternateRep(); + + // + //! We better be able to clear it, too! + // + virtual void clearAlternateRep(); + +protected: + + // + //! compute bounding Box, required + // + virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f ¢er ); + + // + //! Generate Primitives, required + // + virtual void generatePrimitives(SoAction *action); + + // + //! GetChildList, required whenever the class has hidden children + // + virtual SoChildList *getChildren() const; + + // + //! Destructor, required + // + virtual ~SoTrap(); + +private: + + // + //! Generate Children. Used to create the hidden children. Required whenever + //! the node has hidden children. + // + void generateChildren(); + + // + //! Used to modify hidden children when a data field is changed. Required + //! whenever the class has hidden children. + // + void updateChildren(); + + // + //! ChildList. Required whenever the class has hidden children. + // + SoChildList *children; + +}; + +#ifdef WIN32 +#include +#endif + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrd.h b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrd.h new file mode 100644 index 0000000000..307764bc1b --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTrd.h @@ -0,0 +1,169 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTrd.h,v 1.2 2004/06/14 09:27:37 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoTrd */ +/* Description: Represents the G4Trd Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoTrd_h +#define HEPVis_SoTrd_h + +#include +#include +#include +#include + +class SoSFNode; + +//! SoTrd - Inventor version of the G4Trd Geant Geometry entity +/*! + * Node: SoTrd + * + * Description: Inventor version of the G4Trd Geant Geometry entity + * + * Author: Joe Boudreau Nov 11 1996 + * + * A Trd is a trapezoid with the x and y dimensions varying along z + * + * Always use Inventor Fields. This allows Inventor to detect a change to + * the data field and take the appropriate action; e.g., redraw the scene. + * + */ + +#define SoTrd Geant4_SoTrd + +class SoTrd:public SoShape { + + // + //! This is required + // + SO_NODE_HEADER(SoTrd); + +public: + + // + //! half-length of x, at -fDz + // + SoSFFloat fDx1; + + // + //! half-length of x, at +fDz + // + SoSFFloat fDx2; + + // + //! half-length of y, at -fDz + // + SoSFFloat fDy1; + + // + //! half-length of y, at +fDz + // + SoSFFloat fDy2; + + // + //! half-length along Z + // + SoSFFloat fDz; + + // + //! Alternate rep - required + // + SoSFNode alternateRep; + + // + //! Constructor, required + // + SoTrd(); + + // + //! Class Initializer, required + // + static void initClass(); + + // + //! Generate AlternateRep, required. Generating an alternate representation + //! must be done upon users request. It allows an Inventor program to read + //! back the file without requiring *this* code to be dynamically linked. + //! If the users expects that *this* code will be dynamically linked, he + //! need not invoke this method. + // + virtual void generateAlternateRep(); + + // + //! We better be able to clear it, too! + // + virtual void clearAlternateRep(); + +protected: + + // + //! compute bounding Box, required + // + virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f ¢er ); + + // + //! Generate Primitives, required + // + virtual void generatePrimitives(SoAction *action); + + // + //! GetChildList, required whenever the class has hidden children + // + virtual SoChildList *getChildren() const; + + +protected: + + // + //! Destructor, required + // + virtual ~SoTrd(); + +private: + + // + //! Generate Children. Used to create the hidden children. Required whenever + //! the node has hidden children. + // + void generateChildren(); + + // + //! Used to modify hidden children when a data field is changed. Required + //! whenever the class has hidden children. + // + void updateChildren(); + + // + //! ChildList. Required whenever the class has hidden children. + // + SoChildList *children; +}; + +#endif diff --git a/source/visualization/OpenInventor/include/HEPVis/nodes/SoTubs.h b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTubs.h new file mode 100644 index 0000000000..557745587a --- /dev/null +++ b/source/visualization/OpenInventor/include/HEPVis/nodes/SoTubs.h @@ -0,0 +1,180 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTubs.h,v 1.2 2004/06/14 09:27:38 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoTubs */ +/* Description: Represents the G4Tubs Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#ifndef HEPVis_SoTubs_h +#define HEPVis_SoTubs_h + +#include +#include +#include +#include + +class SoSFNode; + +//! SoTubs - Inventor version of the G4Tubs Geant Geometry entity +/*! + * Node: SoTubs + * + * Description: The Inventor version of the G4Tubs Geant Geometry entity + * + * Author: Joe Boudreau Nov 11 1996 + * + * class G4Tubs + * + * A tube or tube segment with curved sides parallel to + * the z-axis. The tube has a specified half-length along + * the z axis, about which it is centred, and a given + * minimum and maximum radius. A minimum radius of 0 + * signifies a filled tube /cylinder. The tube segment is + * specified by starting and delta + * angles for phi, with 0 being the +x axis, PI/2 + * the +y axis. A delta angle of 2PI signifies a + * complete, unsegmented tube/cylinder + * + * Always use Inventor Fields. This allows Inventor to detect a change to + * the data field and take the appropriate action; e.g., redraw the scene. +*/ + +#define SoTubs Geant4_SoTubs + +class SoTubs:public SoShape { + + // The following is required: + SO_NODE_HEADER(SoTubs); + +public: + + // + //! Inside radius of the tube + // + SoSFFloat pRMin; + // + //! Outside radius of the tube + // + SoSFFloat pRMax; + // + //! Half-length in Z + // + SoSFFloat pDz; + // + //! Starting angle, in radians + // + SoSFFloat pSPhi; + // + //! Delta-angle, in radians + // + SoSFFloat pDPhi; + // + //! Alternate rep - required + // + SoSFNode alternateRep; + + // + //! Constructor, required + // + SoTubs(); + + // + //! Class Initializer, required + // + static void initClass(); + + // + //! Generate AlternateRep, required. Generating an alternate representation + //! must be done upon users request. It allows an Inventor program to read + //! back the file without requiring *this* code to be dynamically linked. + //! If the users expects that *this* code will be dynamically linked, he + //! need not invoke this method. + // + virtual void generateAlternateRep(); + + // + //! We better be able to clear it, too! + // + virtual void clearAlternateRep(); + +protected: + + // + //! compute bounding Box, required + // + virtual void computeBBox(SoAction *action, SbBox3f &box, SbVec3f ¢er ); + + // + //! Generate Primitives, required + // + virtual void generatePrimitives(SoAction *action); + + // + //! GetChildList, required whenever the class has hidden children + // + virtual SoChildList *getChildren() const; + + +protected: + // + //! Destructor, required + // + virtual ~SoTubs(); + +private: + + // + //! Generate Children. Used to create the hidden children. Required whenever + //! the node has hidden children. + // + void generateChildren(); + + // + //! Used to modify hidden children when a data field is changed. Required + //! whenever the class has hidden children. + // + void updateChildren(); + + // + //! ChildList. Required whenever the class has hidden children. + // + SoChildList *children; + + // + //! help with trigonometry. increments sines an cosines by an angle. + // + void inc(double & sinPhi, double & cosPhi, double sinDeltaPhi, double cosDeltaPhi) const { + double oldSin=sinPhi,oldCos=cosPhi; + sinPhi = oldSin*cosDeltaPhi+oldCos*sinDeltaPhi; + cosPhi = oldCos*cosDeltaPhi-oldSin*sinDeltaPhi; + } + +}; + +#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventor.cc b/source/visualization/OpenInventor/src/G4OpenInventor.cc index 7b962dd789..c0604d78c4 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventor.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventor.cc @@ -21,23 +21,22 @@ // ******************************************************************** // // -// $Id: G4OpenInventor.cc,v 1.9 2003/10/29 10:02:06 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpenInventor.cc,v 1.11 2004/06/14 09:27:38 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // #ifdef G4VIS_BUILD_OI_DRIVER -//#include -#include -#include -#include -#include -#include -#include - +// this : #include "G4OpenInventor.hh" -#include "G4OpenInventorSceneHandler.hh" -#include "G4OpenInventorViewer.hh" +#include "HEPVis/nodes/SoBox.h" +#include "HEPVis/nodes/SoTubs.h" +#include "HEPVis/nodes/SoCons.h" +#include "HEPVis/nodes/SoTrd.h" +#include "HEPVis/nodes/SoTrap.h" +#include "HEPVis/nodekits/SoDetectorTreeKit.h" + +#include "G4OpenInventorSceneHandler.hh" G4OpenInventor::G4OpenInventor ( const G4String name @@ -64,23 +63,13 @@ G4VSceneHandler* G4OpenInventor::CreateSceneHandler (const G4String& name) { return p; } -G4VViewer* G4OpenInventor::CreateViewer (G4VSceneHandler& scene, const G4String& name) +void G4OpenInventor::InitNodes() { - G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; - G4OpenInventorViewer* pView = new G4OpenInventorViewer (*pScene, name); - return pView; -} - -void G4OpenInventor::InitHEPVis() -{ - // The below is too much for most loaders : - // HEPVis_SoDB::init(); - - SoG4Box::initClass(); - SoG4Tubs::initClass(); - SoG4Cons::initClass(); - SoG4Trd::initClass(); - SoG4Trap::initClass(); + SoBox::initClass(); + SoTubs::initClass(); + SoCons::initClass(); + SoTrd::initClass(); + SoTrap::initClass(); SoDetectorTreeKit::initClass(); } diff --git a/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc b/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc index 68cfb14089..cd0a2ca76a 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorSceneHandler.cc @@ -21,14 +21,17 @@ // ******************************************************************** // // -// $Id: G4OpenInventorSceneHandler.cc,v 1.15 2003/10/29 10:01:36 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpenInventorSceneHandler.cc,v 1.17 2004/06/14 09:27:38 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Jeff Kallenbach 01 Aug 1996 // OpenInventor stored scene - creates OpenInventor display lists. #ifdef G4VIS_BUILD_OI_DRIVER +// this : +#include "G4OpenInventorSceneHandler.hh" + #include #include #include @@ -54,18 +57,16 @@ #include #include -#include -#include -#include -#include -#include -#include +#include "HEPVis/nodes/SoBox.h" +#include "HEPVis/nodes/SoTubs.h" +#include "HEPVis/nodes/SoCons.h" +#include "HEPVis/nodes/SoTrd.h" +#include "HEPVis/nodes/SoTrap.h" +#include "HEPVis/nodekits/SoDetectorTreeKit.h" #include "G4Scene.hh" #include "G4NURBS.hh" #include "G4OpenInventor.hh" -#include "G4OpenInventorSceneHandler.hh" -#include "G4OpenInventorViewer.hh" #include "G4OpenInventorTransform3D.hh" #include "G4ThreeVector.hh" #include "G4Point3D.hh" @@ -88,7 +89,7 @@ #include "G4Material.hh" #include "G4VisAttributes.hh" -typedef SoDetectorTreeKit SoG4DetectorTreeKit; +typedef SoDetectorTreeKit SoDetectorTreeKit; G4Point3D translation; G4OpenInventorSceneHandler::G4OpenInventorSceneHandler (G4OpenInventor& system, @@ -548,7 +549,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Box & Box) { } void G4OpenInventorSceneHandler::AddThis (const G4Tubs & Tubs) { if(currentSeparator==0) return; - SoG4Tubs *g4Tubs = new SoG4Tubs(); + SoTubs *g4Tubs = new SoTubs(); g4Tubs->pRMin = Tubs.GetRMin(); g4Tubs->pRMax = Tubs.GetRMax(); g4Tubs->pDz = Tubs.GetDz(); @@ -558,7 +559,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Tubs & Tubs) { } void G4OpenInventorSceneHandler::AddThis (const G4Cons &cons) { if(currentSeparator==0) return; - SoG4Cons *g4Cons = new SoG4Cons(); + SoCons *g4Cons = new SoCons(); g4Cons->fRmin1 = cons.GetRmin1(); g4Cons->fRmin2 = cons.GetRmin2(); g4Cons->fRmax1 = cons.GetRmax1(); @@ -572,7 +573,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Cons &cons) { void G4OpenInventorSceneHandler::AddThis (const G4Trap &trap) { if(currentSeparator==0) return; G4ThreeVector SymAxis=trap.GetSymAxis(); - SoG4Trap *g4Trap = new SoG4Trap(); + SoTrap *g4Trap = new SoTrap(); g4Trap->pDz = trap.GetZHalfLength(); g4Trap->pPhi = atan2(SymAxis(kYAxis),SymAxis(kXAxis)); g4Trap->pTheta = acos(SymAxis(kZAxis)); @@ -587,7 +588,7 @@ void G4OpenInventorSceneHandler::AddThis (const G4Trap &trap) { void G4OpenInventorSceneHandler::AddThis (const G4Trd &trd) { if(currentSeparator==0) return; - SoG4Trd *g4Trd = new SoG4Trd(); + SoTrd *g4Trd = new SoTrd(); g4Trd->fDx1 = trd.GetXHalfLength1(); g4Trd->fDx2 = trd.GetXHalfLength2(); g4Trd->fDy1 = trd.GetYHalfLength1(); @@ -650,7 +651,7 @@ void G4OpenInventorSceneHandler::PreAddThis // // Make the detector tree kit: // - SoG4DetectorTreeKit* g4DetectorTreeKit = new SoG4DetectorTreeKit(); + SoDetectorTreeKit* g4DetectorTreeKit = new SoDetectorTreeKit(); SoSeparator* previewSeparator = (SoSeparator*) g4DetectorTreeKit->getPart("previewSeparator",TRUE); diff --git a/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc b/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc index e6ab73be1e..d8e4b99518 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorTransform3D.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorTransform3D.cc,v 1.4 2001/07/11 10:09:01 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorTransform3D.cc,v 1.5 2004/04/08 09:41:11 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // jck 17 Dec 1996 @@ -31,10 +31,11 @@ #ifdef G4VIS_BUILD_OI_DRIVER -#include - +// this : #include "G4OpenInventorTransform3D.hh" +#include + G4OpenInventorTransform3D::G4OpenInventorTransform3D (const G4Transform3D &t) : G4Transform3D (t) { m[0] = xx; diff --git a/source/visualization/OpenInventor/src/G4OpenInventorWin32.cc b/source/visualization/OpenInventor/src/G4OpenInventorWin.cc similarity index 69% rename from source/visualization/OpenInventor/src/G4OpenInventorWin32.cc rename to source/visualization/OpenInventor/src/G4OpenInventorWin.cc index 4546a01fd3..58a01b0993 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorWin32.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorWin.cc @@ -21,36 +21,42 @@ // ******************************************************************** // // -// $Id: G4OpenInventorWin32.cc,v 1.5 2001/07/11 10:09:01 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorWin.cc,v 1.4 2004/04/08 10:49:57 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // OpenInventor graphics system factory. #ifdef G4VIS_BUILD_OIWIN32_DRIVER -#include +// this : +#include "G4OpenInventorWin.hh" -#include "G4OpenInventorWin32.hh" +#include #include "G4OpenInventorSceneHandler.hh" -#include "G4OpenInventorViewer.hh" - +#include "G4OpenInventorWinViewer.hh" #include "G4Win32.hh" -G4OpenInventorWin32::G4OpenInventorWin32 () -:G4OpenInventor("OpenInventorWin32","OIWIN32",G4VGraphicsSystem::threeD) +G4OpenInventorWin::G4OpenInventorWin () +:G4OpenInventor("OpenInventorWin","OIWin32",G4VGraphicsSystem::threeD) { SetInteractorManager (G4Win32::getInstance()); GetInteractorManager () -> RemoveDispatcher((G4DispatchFunction)G4Win32::dispatchWin32Event); - GetInteractorManager () -> AddDispatcher ((G4DispatchFunction)SoXt::dispatchEvent); + GetInteractorManager () -> AddDispatcher((G4DispatchFunction)SoWin::dispatchEvent); - Widget toplevel = (Widget)GetInteractorManager()->GetMainInteractor(); + HWND toplevel = (HWND)GetInteractorManager()->GetMainInteractor(); - SoXt::init(toplevel); + SoWin::init(toplevel); - InitHEPVis(); + InitNodes(); +} + +G4OpenInventorWin::~G4OpenInventorWin () {} +G4VViewer* G4OpenInventorWin::CreateViewer (G4VSceneHandler& scene, const G4String& name) +{ + G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; + return new G4OpenInventorWinViewer (*pScene, name); } -G4OpenInventorWin32::~G4OpenInventorWin32 () {} #endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc new file mode 100644 index 0000000000..7e83f07fa3 --- /dev/null +++ b/source/visualization/OpenInventor/src/G4OpenInventorWinViewer.cc @@ -0,0 +1,271 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: G4OpenInventorWinViewer.cc,v 1.2 2004/04/08 10:49:57 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/* + * jck 05 Feb 1997 - Initial Implementation + * jck 21 Apr 1997 + * Mods for SoXtHepViewer + * gb : on Win32 use an SoXtExaminerViewer. + * gb 05 April 2004 : creation. + */ +#ifdef G4VIS_BUILD_OIWIN32_DRIVER + +// this : +#include "G4OpenInventorWinViewer.hh" + +#include + +#include +#include + +#include "G4OpenInventor.hh" +#include "G4OpenInventorSceneHandler.hh" +#include "G4VInteractorManager.hh" + +#include + +// +// Global variables +// + +//static void SecondaryLoopPostAction (); + +static LRESULT CALLBACK WindowProc (HWND,UINT,WPARAM,LPARAM); + +static const char className[] = "G4OpenInventorShellWindow"; + +void G4OpenInventorWinViewer::FinishView () { + if(!fViewer) return; + fViewer->viewAll(); + fViewer->saveHomePosition(); +} + +void G4OpenInventorWinViewer::KernelVisitDecision () { + + // If there's a significant difference with the last view parameters + // of either the scene handler or this viewer, trigger a rebuild. + + if ( + //??fG4OpenInventorSceneHandler.fPODLList.size() == 0 || + // We need a test for empty scene graph, such as + // staticRoot.size() or something?????????? See temporary fix + // in contructor. (John Allison Aug 2001) + CompareForKernelVisit(fG4OpenInventorSceneHandler.fLastVP) || + CompareForKernelVisit(fLastVP)) { + NeedKernelVisit (); + } + fLastVP = fVP; + fG4OpenInventorSceneHandler.fLastVP = fVP; +} + +G4bool G4OpenInventorWinViewer::CompareForKernelVisit +(G4ViewParameters&) { + + if ( + (fLastVP.GetDrawingStyle () != fVP.GetDrawingStyle ()) || + (fLastVP.GetRepStyle () != fVP.GetRepStyle ()) || + (fLastVP.IsCulling () != fVP.IsCulling ()) || + (fLastVP.IsCullingInvisible () != fVP.IsCullingInvisible ()) || + (fLastVP.IsDensityCulling () != fVP.IsDensityCulling ()) || + (fLastVP.IsCullingCovered () != fVP.IsCullingCovered ()) || + (fLastVP.IsSection () != fVP.IsSection ()) || + // No need to visit kernel if section plane changes. + (fLastVP.IsCutaway () != fVP.IsCutaway ()) || + (fLastVP.GetCutawayPlanes ().size () != + fVP.GetCutawayPlanes ().size ()) || + // No need to visit kernel if cutaway planes change. + (fLastVP.IsExplode () != fVP.IsExplode ()) || + (fLastVP.GetNoOfSides () != fVP.GetNoOfSides ()) + ) { + return true;; + } + if (fLastVP.IsDensityCulling () && + (fLastVP.GetVisibleDensity () != fVP.GetVisibleDensity ())) + return true; + + if (fLastVP.IsExplode () && + (fLastVP.GetExplodeFactor () != fVP.GetExplodeFactor ())) + return true; + + return false; +} + +G4OpenInventorWinViewer::G4OpenInventorWinViewer +(G4OpenInventorSceneHandler& sceneHandler, + const G4String& name) +:G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name) +,fG4OpenInventorSceneHandler(sceneHandler) +,fShell(0) +,fViewer(0) +,fSelection(0) +,fInteractorManager(0) +{ + fNeedKernelVisit = true; //?? Temporary, until KernelVisitDecision fixed. + + fInteractorManager = + ((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())-> + GetInteractorManager(); + //Widget toplevel = (Widget)fInteractorManager->GetMainInteractor (); + + //fInteractorManager-> + //AddSecondaryLoopPostAction((G4SecondaryLoopAction)SecondaryLoopPostAction); + + G4cout << "Window name: " << fName << G4endl; + // + // Selection + // + fSelection = new SoSelection; + fSelection->policy = SoSelection::SINGLE; + fSelection->ref(); + fSelection->addChild(fG4OpenInventorSceneHandler.root); + + G4String wName = fName; + +#define SIZE 400 + HWND parent = (HWND)fInteractorManager->GetParentInteractor (); + if(!parent) { + //Create a shell window : + G4String shellName = wName; + shellName += "_shell"; + static SbBool done = FALSE; + if(done==FALSE) { + WNDCLASS wc; + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = (WNDPROC)WindowProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = ::GetModuleHandle(0); + wc.hIcon = ::LoadIcon(0, IDI_APPLICATION); + wc.hCursor = ::LoadCursor(0, IDC_ARROW); + wc.hbrBackground = 0; + wc.lpszMenuName = className; + wc.lpszClassName = className; + ::RegisterClass(&wc); + done = TRUE; + } + // Compell window to be created at 0,0 to bypass + // the 'black border' problem. + fShell = ::CreateWindow(className, shellName.c_str(), + WS_OVERLAPPEDWINDOW, + //CW_USEDEFAULT, CW_USEDEFAULT, + 0,0,400,400,0, 0,::GetModuleHandle(0),0); + // Retreive window and client sizez : + RECT wrect,crect; + GetWindowRect((HWND)fShell,&wrect); + GetClientRect((HWND)fShell,&crect); + int ww = wrect.right-wrect.left; + int wh = wrect.bottom-wrect.top; + int cw = crect.right-crect.left; + int ch = crect.bottom-crect.top; + // Compell client rect to be 400 400 : + MoveWindow((HWND)fShell,wrect.left,wrect.top,400+ww-cw,400+wh-ch,TRUE); + ::SetWindowLong((HWND)fShell,GWL_USERDATA,LONG(this)); + ::SetWindowText((HWND)fShell,shellName.c_str()); + parent = fShell; + fInteractorManager->AddShell(fShell); + } else { + char* str = fInteractorManager->GetCreationString(); + if(str!=0) wName = str; + } + fViewer = new SoWinExaminerViewer(parent,wName.c_str(),TRUE); + fViewer->setSize(SbVec2s(SIZE,SIZE)); + fViewer->setSceneGraph(fSelection); + fViewer->viewAll(); + fViewer->saveHomePosition(); + fViewer->setTitle(fName); + fViewer->show(); + if(fShell) { + SoWin::show(fShell); + fInteractorManager->FlushAndWaitExecution (); + } + fInteractorManager->SetCreatedInteractor (fViewer -> getWidget()); +} + +G4OpenInventorWinViewer::~G4OpenInventorWinViewer () { + if(fShell) fInteractorManager->RemoveShell(fShell); + if(fViewer) delete fViewer; + if(fShell) { + ::SetWindowLong((HWND)fShell,GWL_USERDATA,LONG(0)); + ::DestroyWindow((HWND)fShell); + } + if(fSelection) fSelection->unref(); +} + +void G4OpenInventorWinViewer::ClearView () { +} + +void G4OpenInventorWinViewer::SetView () { +} + +void G4OpenInventorWinViewer::DrawView () { + G4cout << "debug Iv::DrawViewer " < SecondaryLoop (); +} +////////////////////////////////////////////////////////////////////////////// +LRESULT CALLBACK WindowProc ( + HWND aWindow +,UINT aMessage +,WPARAM aWParam +,LPARAM aLParam +) +////////////////////////////////////////////////////////////////////////////// +// Below treatment of WM_SIZE, WM_SETFOCUS not necessary +// with TGS, but needed with SoFree. WM_DESTROY needed for +// 'main top level window' so that 'Close window' induces +// the end of the task. +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// +{ + switch (aMessage) { + case WM_SIZE:{ // Assume one child window ! + int width = LOWORD(aLParam); + int height = HIWORD(aLParam); + //printf("debug : G4SoWindow : WMS_SIZE : %d %d\n",width,height); + HWND hwnd = ::GetFirstChild(aWindow); + if(hwnd!=0) { + ::MoveWindow(hwnd,0,0,width,height,TRUE); + } + }return 0; + case WM_SETFOCUS:{ // Assume one child window ! + HWND hwnd = ::GetFirstChild(aWindow); + if(hwnd!=0) ::SetFocus(hwnd); + }return 0; + case WM_DESTROY:{ + //G4OpenInventorWinViewer* This = + // (G4OpenInventorWinViewer*)::GetWindowLong(aWindow,GWL_USERDATA); + //::PostQuitMessage(0); + }return 0; + default: + return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam)); + } +} + +#endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorX.cc b/source/visualization/OpenInventor/src/G4OpenInventorXt.cc similarity index 76% rename from source/visualization/OpenInventor/src/G4OpenInventorX.cc rename to source/visualization/OpenInventor/src/G4OpenInventorXt.cc index e38f188781..d39af15bb0 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorX.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXt.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4OpenInventorX.cc,v 1.5 2001/07/11 10:09:01 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4OpenInventorXt.cc,v 1.1 2004/04/08 09:41:11 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // Jeff Kallenbach 01 Aug 1996 @@ -30,16 +30,17 @@ #ifdef G4VIS_BUILD_OIX_DRIVER +// this : +#include "G4OpenInventorXt.hh" + #include -#include "G4OpenInventorX.hh" -#include "G4OpenInventorSceneHandler.hh" -#include "G4OpenInventorViewer.hh" - #include "G4Xt.hh" +#include "G4OpenInventorSceneHandler.hh" +#include "G4OpenInventorXtViewer.hh" -G4OpenInventorX::G4OpenInventorX () -:G4OpenInventor("OpenInventorX","OIX",G4VGraphicsSystem::threeD) +G4OpenInventorXt::G4OpenInventorXt () +:G4OpenInventor("OpenInventorXt","OIX",G4VGraphicsSystem::threeD) { SetInteractorManager (G4Xt::getInstance ()); GetInteractorManager () -> @@ -48,12 +49,17 @@ G4OpenInventorX::G4OpenInventorX () AddDispatcher ((G4DispatchFunction)SoXt::dispatchEvent); Widget toplevel = (Widget)GetInteractorManager()->GetMainInteractor(); + SoXt::init(toplevel); - SoXt::init (toplevel); - - InitHEPVis(); + InitNodes(); +} + +G4OpenInventorXt::~G4OpenInventorXt () {} +G4VViewer* G4OpenInventorXt::CreateViewer (G4VSceneHandler& scene, const G4String& name) +{ + G4OpenInventorSceneHandler* pScene = (G4OpenInventorSceneHandler*)&scene; + return new G4OpenInventorXtViewer (*pScene, name); } -G4OpenInventorX::~G4OpenInventorX () {} #endif diff --git a/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc b/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc similarity index 65% rename from source/visualization/OpenInventor/src/G4OpenInventorViewer.cc rename to source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc index 66635d80c6..bd1227e0f9 100644 --- a/source/visualization/OpenInventor/src/G4OpenInventorViewer.cc +++ b/source/visualization/OpenInventor/src/G4OpenInventorXtViewer.cc @@ -21,33 +21,29 @@ // ******************************************************************** // // -// $Id: G4OpenInventorViewer.cc,v 1.10 2003/08/28 11:44:22 gcosmo Exp $ -// GEANT4 tag $Name: geant4-06-00-patch-01 $ +// $Id: G4OpenInventorXtViewer.cc,v 1.1 2004/04/08 09:41:11 gbarrand Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // /* * jck 05 Feb 1997 - Initial Implementation * jck 21 Apr 1997 * Mods for SoXtHepViewer * gb : on Win32 use an SoXtExaminerViewer. + * gb 05 April 2004 : revisit to separate Windows things. */ -#ifdef G4VIS_BUILD_OI_DRIVER +#ifdef G4VIS_BUILD_OIX_DRIVER + +// this : +#include "G4OpenInventorXtViewer.hh" + +#include #include -#include -#include - -#include "G4SoWindow.hh" - -#ifdef WIN32 #include -#else -#include -#endif +#include #include "G4OpenInventor.hh" -#include "G4OpenInventorViewer.hh" #include "G4OpenInventorSceneHandler.hh" - #include "G4VInteractorManager.hh" // @@ -56,24 +52,10 @@ //static void SecondaryLoopPostAction (); -void G4OpenInventorViewer::FinishView () { - if(fViewer==0) return; -#ifdef WIN32 - ((SoXtViewer*)fViewer)->viewAll(); - ((SoXtViewer*)fViewer)->saveHomePosition(); -#else - ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll(); - ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition(); -#endif -} - -// -// Exit -// -int quitCB(void* interactorManager) { - ((G4VInteractorManager*)interactorManager) -> - RequireExitSecondaryLoop (OIV_EXIT_CODE); - return 0; +void G4OpenInventorXtViewer::FinishView () { + if(!fViewer) return; + fViewer->viewAll(); + fViewer->saveHomePosition(); } //static void SecondaryLoopPostAction () @@ -85,7 +67,7 @@ int quitCB(void* interactorManager) { // } //} -void G4OpenInventorViewer::KernelVisitDecision () { +void G4OpenInventorXtViewer::KernelVisitDecision () { // If there's a significant difference with the last view parameters // of either the scene handler or this viewer, trigger a rebuild. @@ -103,7 +85,7 @@ void G4OpenInventorViewer::KernelVisitDecision () { fG4OpenInventorSceneHandler.fLastVP = fVP; } -G4bool G4OpenInventorViewer::CompareForKernelVisit +G4bool G4OpenInventorXtViewer::CompareForKernelVisit (G4ViewParameters&) { if ( @@ -135,13 +117,12 @@ G4bool G4OpenInventorViewer::CompareForKernelVisit return false; } -G4OpenInventorViewer::G4OpenInventorViewer +G4OpenInventorXtViewer::G4OpenInventorXtViewer (G4OpenInventorSceneHandler& sceneHandler, const G4String& name) :G4VViewer (sceneHandler, sceneHandler.IncrementViewCount(), name) ,fG4OpenInventorSceneHandler(sceneHandler) ,fShell(0) -,fWindow(0) ,fViewer(0) ,fSelection(0) ,fInteractorManager(0) @@ -151,10 +132,10 @@ G4OpenInventorViewer::G4OpenInventorViewer fInteractorManager = ((G4OpenInventor*)fG4OpenInventorSceneHandler.GetGraphicsSystem())-> GetInteractorManager(); -//Widget toplevel = (Widget)fInteractorManager->GetMainInteractor (); + //Widget toplevel = (Widget)fInteractorManager->GetMainInteractor (); -//fInteractorManager-> -//AddSecondaryLoopPostAction ((G4SecondaryLoopAction)SecondaryLoopPostAction); + //fInteractorManager-> + //AddSecondaryLoopPostAction((G4SecondaryLoopAction)SecondaryLoopPostAction); G4cout << "Window name: " << fName << G4endl; // @@ -165,78 +146,68 @@ G4OpenInventorViewer::G4OpenInventorViewer fSelection->ref(); fSelection->addChild(fG4OpenInventorSceneHandler.root); - Widget parent = (Widget)fInteractorManager->GetParentInteractor (); - G4String wName = fName; - const char* wname = wName.data(); #define SIZE 400 - if(parent==0) { //Create a shell window : - fWindow = new G4SoWindow(wname); - fWindow->setTitle(wname); - fWindow->setSize(SbVec2s(SIZE,SIZE)); - fShell = parent = fWindow->getWidget(); + Widget parent = (Widget)fInteractorManager->GetParentInteractor (); + if(!parent) { + //Create a shell window : + G4String shellName = wName; + shellName += "_shell"; + Arg args[3]; + char s[32]; + sprintf(s,"%dx%d",SIZE,SIZE); + XtSetArg(args[0],XtNgeometry,XtNewString(s)); + XtSetArg(args[1],XtNborderWidth,0); + XtSetArg(args[2],XtNtitle,XtNewString(wName.c_str())); + fShell = XtAppCreateShell(shellName.c_str(),"Inventor", + topLevelShellWidgetClass, + SoXt::getDisplay(), + args,3); + parent = fShell; fInteractorManager->AddShell(fShell); } else { - char* str = fInteractorManager->GetCreationString (); - if(str!=0) wname = str; + char* str = fInteractorManager->GetCreationString(); + if(str!=0) wName = str; } // // Create and Customize the Viewer // -#ifdef WIN32 - fViewer = new SoXtExaminerViewer(parent,wname,TRUE); + fViewer = new SoXtExaminerViewer(parent,wName.c_str(),TRUE); fViewer->setSize(SbVec2s(SIZE,SIZE)); - ((SoXtViewer*)fViewer)->setSceneGraph(fSelection); - ((SoXtViewer*)fViewer)->viewAll(); - ((SoXtViewer*)fViewer)->saveHomePosition(); -#else - fViewer = new SoXtHepViewer (parent,wname,TRUE); - ((SoXtHepViewer*)fViewer)->hideTextArea(); - ((SoXtHepViewer*)fViewer)->resizeMain(SIZE,SIZE); - ((SoXtHepViewer*)fViewer)->setQuitCallback(quitCB, fInteractorManager); - ((SoXtHepViewer*)fViewer)->setSceneGraph(fSelection); - ((SoXtHepViewer*)fViewer)->getCurrentViewer()->viewAll(); - ((SoXtHepViewer*)fViewer)->getCurrentViewer()->saveHomePosition(); -#endif + fViewer->setSceneGraph(fSelection); + fViewer->viewAll(); + fViewer->saveHomePosition(); fViewer->setTitle(fName); fViewer->show(); - - if(fWindow!=0) { - fWindow->show(); + if(fShell) { + SoXt::show(fShell); fInteractorManager->FlushAndWaitExecution (); } - fInteractorManager->SetCreatedInteractor (fViewer -> getWidget()); } -G4OpenInventorViewer::~G4OpenInventorViewer () { - if(fShell!=0) fInteractorManager -> RemoveShell (fShell); - if(fViewer!=0) { -#ifdef WIN32 - delete ((SoXtExaminerViewer*)fViewer); -#else - delete ((SoXtHepViewer*)fViewer); -#endif - } - if(fWindow!=0) delete fWindow; - if(fSelection!=0) fSelection->unref(); +G4OpenInventorXtViewer::~G4OpenInventorXtViewer () { + if(fShell) fInteractorManager->RemoveShell(fShell); + if(fViewer) delete fViewer; + if(fShell) XtDestroyWidget(fShell); + if(fSelection) fSelection->unref(); } -void G4OpenInventorViewer::ClearView () { +void G4OpenInventorXtViewer::ClearView () { } -void G4OpenInventorViewer::SetView () { +void G4OpenInventorXtViewer::SetView () { } -void G4OpenInventorViewer::DrawView () { +void G4OpenInventorXtViewer::DrawView () { G4cout << "debug Iv::DrawViewer " < SecondaryLoop (); } diff --git a/source/visualization/OpenInventor/src/G4SoWindow.cc b/source/visualization/OpenInventor/src/G4SoWindow.cc deleted file mode 100644 index 25d6c8789d..0000000000 --- a/source/visualization/OpenInventor/src/G4SoWindow.cc +++ /dev/null @@ -1,403 +0,0 @@ -// -// ******************************************************************** -// * 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. * -// ******************************************************************** -// -#include -#include -#include -#define SbWarn printf - -#include - -// For backward compatibility : -#ifdef HEPVisWin -#define HEPVisWin32 -#endif - -#ifdef CDF -#ifndef LINUX -#define u_long unsigned long -#endif -#endif -#ifdef HEPVisXt -#include -#include -#include -#include -#endif -#ifdef HEPVisWin32 -#include //For GetWindowInstance. -#endif - -#include -#include - -#include "G4SoWindow.hh" - -#ifdef HEPVisXt -static XtTranslations trans_table = 0; -static XtActionsRec closeAction = -{(String)"CloseG4SoWindow",G4SoWindow::closeWindow}; -//static void XWidgetSetDimension(Widget,Dimension,Dimension); -#endif -#ifdef HEPVisWin32 -static LRESULT CALLBACK WindowProc (HWND,UINT,WPARAM,LPARAM); -static const char className[] = "G4SoWindow"; -#endif - -SbDict* G4SoWindow::fWidgetDictionary = 0; - -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::clearClass ( -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidgetDictionary!=0) delete fWidgetDictionary; - fWidgetDictionary = 0; -} -////////////////////////////////////////////////////////////////////////////// -G4SoWindow::G4SoWindow( - const char* aName -,SbBool aWMClose -) -:fWidget(0) -,fWMClose(aWMClose) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ -#ifdef HEPVisXt - if(trans_table==0) { - trans_table = - XtParseTranslationTable("WM_PROTOCOLS:CloseG4SoWindow()"); - XtAppAddActions(SoXt::getAppContext(),&closeAction,1); - } - SbString shellName = aName; - shellName += "_shell"; - Arg args[2]; - XtSetArg(args[0],XtNgeometry,XtNewString("400x400")); - XtSetArg(args[1],XtNborderWidth,0); - fWidget = XtAppCreateShell(shellName.getString(),"Inventor", - topLevelShellWidgetClass, - SoXt::getDisplay(), - args,2); - if(fWidget!=0) { - XtOverrideTranslations(fWidget,trans_table); - XtAddCallback(fWidget,XtNdestroyCallback, - (XtCallbackProc)G4SoWindow::widgetDestroyedCB,0); - } -#endif -#ifdef HEPVisWin32 - static SbBool done = FALSE; - if(done==FALSE) { - WNDCLASS wc; - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = (WNDPROC)WindowProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = ::GetModuleHandle(0); - wc.hIcon = ::LoadIcon(0, IDI_APPLICATION); - wc.hCursor = ::LoadCursor(0, IDC_ARROW); - wc.hbrBackground = 0; - wc.lpszMenuName = className; - wc.lpszClassName = className; - ::RegisterClass(&wc); - done = TRUE; - } - // Compell window to be created at 0,0 to bypass - // the 'black border' problem. - fWidget = ::CreateWindow(className, aName, - WS_OVERLAPPEDWINDOW, - //CW_USEDEFAULT, CW_USEDEFAULT, - 0,0, - 400,400, - 0, 0, - ::GetModuleHandle(0), - 0); - // Retreive window and client sizez : - RECT wrect,crect; - GetWindowRect((HWND)fWidget,&wrect); - GetClientRect((HWND)fWidget,&crect); - int ww = wrect.right-wrect.left; - int wh = wrect.bottom-wrect.top; - int cw = crect.right-crect.left; - int ch = crect.bottom-crect.top; - // Compell client rect to be 400 400 : - MoveWindow((HWND)fWidget,wrect.left,wrect.top,400+ww-cw,400+wh-ch,TRUE); - // - ::SetWindowLong((HWND)fWidget,GWL_USERDATA,LONG(this)); -#endif - registerWidget(fWidget); -} -////////////////////////////////////////////////////////////////////////////// -G4SoWindow::~G4SoWindow( -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidget==0) return; - unregisterWidget(fWidget); -#ifdef HEPVisXt - XtDestroyWidget(fWidget); -#endif -#ifdef HEPVisWin32 - ::SetWindowLong((HWND)fWidget,GWL_USERDATA,LONG(0)); - ::DestroyWindow((HWND)fWidget); -#endif -} -////////////////////////////////////////////////////////////////////////////// -Widget G4SoWindow::getWidget( -) const -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - return fWidget; -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::setWMClose( - SbBool aValue -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - fWMClose = aValue; -} -////////////////////////////////////////////////////////////////////////////// -SbBool G4SoWindow::getWMClose( -) const -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - return fWMClose; -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::show( -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidget==0) return; - SoXt::show(fWidget); -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::hide( -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidget==0) return; - SoXt::hide(fWidget); -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::setTitle( - const char* aString -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(aString==0) return; -#ifdef HEPVisXt - Arg args[1]; - XtSetArg(args[0],XtNtitle,XtNewString(aString)); - XtSetValues(fWidget,args,1); -#endif -#ifdef HEPVisWin32 - ::SetWindowText((HWND)fWidget,aString); -#endif -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::setSize( - const SbVec2s& aSize -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidget==0) return; -#ifdef HEPVisXt - Arg args[1]; - char s[32]; - sprintf(s,"%dx%d",aSize[0],aSize[1]); - XtSetArg(args[0],XtNgeometry,XtNewString(s)); - XtSetValues(fWidget,args,1); - //XWidgetSetDimension(fWidget,aSize[0],aSize[1]); -#endif -#ifdef HEPVisWin32 - // Retreive window and client sizez : - RECT wrect,crect; - GetWindowRect((HWND)fWidget,&wrect); - GetClientRect((HWND)fWidget,&crect); - int ww = wrect.right-wrect.left; - int wh = wrect.bottom-wrect.top; - int cw = crect.right-crect.left; - int ch = crect.bottom-crect.top; - // Compell client rect to be 400 400 : - MoveWindow((HWND)fWidget, - wrect.left,wrect.top, - aSize[0]+ww-cw,aSize[1]+wh-ch,TRUE); -#endif -} -////////////////////////////////////////////////////////////////////////////// -SbVec2s G4SoWindow::getSize( -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(fWidget==0) return SbVec2s(); -#ifdef HEPVisXt - Dimension width,height; - Arg args[2]; - XtSetArg(args[0],XtNwidth ,&width); - XtSetArg(args[1],XtNheight,&height); - XtGetValues(fWidget,args,2); - return SbVec2s(width,height); -#endif -#ifdef HEPVisWin32 - RECT rect; - ::GetClientRect((HWND)fWidget,&rect); - return SbVec2s((short)(rect.right-rect.left),(short)(rect.bottom-rect.top)); -#endif -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::registerWidget( - Widget aWidget -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(aWidget==0) return; - if(fWidgetDictionary==0) fWidgetDictionary = new SbDict; - fWidgetDictionary->enter((unsigned long)aWidget,this); -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::unregisterWidget( - Widget aWidget -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(aWidget==0) return; - if(fWidgetDictionary==0) return; - fWidgetDictionary->remove((unsigned long)aWidget); -} -////////////////////////////////////////////////////////////////////////////// -G4SoWindow* G4SoWindow::getWindow( - Widget aWidget -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - if(aWidget==0) return 0; - if(fWidgetDictionary==0) return 0; - void* value; - SbBool found = fWidgetDictionary->find((unsigned long)aWidget,value); - return (G4SoWindow*)(found==FALSE ? 0 : value); -} -#ifdef HEPVisXt -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::widgetDestroyedCB( - Widget aWidget -,XtPointer -,XtPointer -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - G4SoWindow* This = G4SoWindow::getWindow(aWidget); - if(This==0) return; // XtDestroyWidget called from ~G4SoWindow. - //printf("debug : G4SoWindow::widgetDestroyCB\n"); - This->unregisterWidget(aWidget); -} -////////////////////////////////////////////////////////////////////////////// -void G4SoWindow::closeWindow( - Widget aWidget -,XEvent* /*aEvent*/ -,char** /*aArgs*/ -,Cardinal* /*aNarg*/ -) -////////////////////////////////////////////////////////////////////////////// -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - G4SoWindow* This = G4SoWindow::getWindow(aWidget); - if( (This!=0) && (This->getWMClose()==TRUE) ) { - //SbWarn ("debug : CloseWindow : close\n"); -#ifdef SoFreePackage - SoXt::sendExit (); -#else - exit (EXIT_SUCCESS); -#endif - } else { - // Should destroy G4SoWindow. - XtUnmapWidget(aWidget); - } -} -/* -#include //Dangerous. -void XWidgetSetDimension(Widget aWidget,Dimension a_width,Dimension a_height){ - if(aWidget==0) return; - if((a_width<=0)||(a_height<=0)) return; - XtResizeWidget (aWidget,a_width,a_height,aWidget->core.border_width); -} -*/ -#endif -#ifdef HEPVisWin32 -////////////////////////////////////////////////////////////////////////////// -LRESULT CALLBACK WindowProc ( - HWND aWindow -,UINT aMessage -,WPARAM aWParam -,LPARAM aLParam -) -////////////////////////////////////////////////////////////////////////////// -// Below treatment of WM_SIZE, WM_SETFOCUS not necessary -// with TGS, but needed with SoFree. WM_DESTROY needed for -// 'main top level window' so that 'Close window' induces -// the end of the task. -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// -{ - switch (aMessage) { - case WM_SIZE:{ // Assume one child window ! - int width = LOWORD(aLParam); - int height = HIWORD(aLParam); - //printf("debug : G4SoWindow : WMS_SIZE : %d %d\n",width,height); - HWND hwnd = ::GetFirstChild(aWindow); - if(hwnd!=0) { - ::MoveWindow(hwnd,0,0,width,height,TRUE); - } - }return 0; - case WM_SETFOCUS:{ // Assume one child window ! - HWND hwnd = ::GetFirstChild(aWindow); - if(hwnd!=0) ::SetFocus(hwnd); - }return 0; - case WM_DESTROY:{ - G4SoWindow* This = (G4SoWindow*)::GetWindowLong(aWindow,GWL_USERDATA); - if( (This!=0) && (This->getWMClose()==TRUE) ) { - ::PostQuitMessage(0); - } - }return 0; - default: - return (::DefWindowProc(aWindow,aMessage,aWParam,aLParam)); - } -} -#endif - - - - diff --git a/source/visualization/OpenInventor/src/SoBox.cc b/source/visualization/OpenInventor/src/SoBox.cc new file mode 100644 index 0000000000..a5c66a6a3e --- /dev/null +++ b/source/visualization/OpenInventor/src/SoBox.cc @@ -0,0 +1,273 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoBox.cc,v 1.2 2004/06/14 09:27:39 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoBox */ +/* Description: Represents the G4Box Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*--------------------------------------------------------------------------*/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/nodes/SoBox.h" + +// This statement is required +SO_NODE_SOURCE(SoBox) + +// Constructor +SoBox::SoBox() { + // This statement is required + SO_NODE_CONSTRUCTOR(SoBox); + + // Data fields are initialized like this: + SO_NODE_ADD_FIELD(fDx, (1.0)); + SO_NODE_ADD_FIELD(fDy, (1.0)); + SO_NODE_ADD_FIELD(fDz, (1.0)); + SO_NODE_ADD_FIELD(alternateRep, (NULL)); + children = new SoChildList(this); +} + +// Destructor +SoBox::~SoBox() { + delete children; +} + + +// initClass +void SoBox::initClass(){ + // This statement is required. + SO_NODE_INIT_CLASS(SoBox,SoShape,"Shape"); +} + + +// generatePrimitives +void SoBox::generatePrimitives(SoAction *action) { + // This variable is used to store each vertex + SoPrimitiveVertex pv; + + // Access the stat from the action + SoState *state = action->getState(); + + // See if we have to use a texture coordinate function, + // rather than generating explicit texture coordinates. + SbBool useTexFunction= + (SoTextureCoordinateElement::getType(state) == + SoTextureCoordinateElement::FUNCTION); + + // If we need to generate texture coordinates with a function, + // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll + // set up the coordinates directly. + const SoTextureCoordinateElement *tce = NULL; + SbVec4f texCoord; + if (useTexFunction) { + tce = SoTextureCoordinateElement::getInstance(state); + } + else { + texCoord[2] = 0.0; + texCoord[3] = 1.0; + } + SbVec3f point, normal; + + + ////////////////////////////////////////// + //---------------------------------------- +#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ + point.setValue(x,y,z); \ + normal.setValue(nx,ny,nz); \ + if (useTexFunction) { \ + texCoord=tce->get(point,normal); \ + } \ + else { \ + texCoord[0]=s; \ + texCoord[1]=t; \ + } \ + pv.setPoint(point); \ + pv.setNormal(normal); \ + pv.setTextureCoords(texCoord); \ + shapeVertex(&pv); + //---------------------------------------- + ////////////////////////////////////////// + + const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; + int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back. + 4,5,6,7, SO_END_FACE_INDEX, //z front. + 0,1,5,4, SO_END_FACE_INDEX, //y up. + 1,2,6,5, SO_END_FACE_INDEX, //x left. + 2,3,7,6, SO_END_FACE_INDEX, //y down. + 3,0,4,7, SO_END_FACE_INDEX}; //x right. + + + // points for the eight vertices + float points[NPOINTS][3]; + points[0][0] = fDx.getValue(); + points[0][1] = fDy.getValue(); + points[0][2] = -fDz.getValue(); + + points[1][0] = -fDx.getValue(); + points[1][1] = fDy.getValue(); + points[1][2] = -fDz.getValue(); + + points[2][0] = -fDx.getValue(); + points[2][1] = -fDy.getValue(); + points[2][2] = -fDz.getValue(); + + points[3][0] = fDx.getValue(); + points[3][1] = -fDy.getValue(); + points[3][2] = -fDz.getValue(); + + points[4][0] = fDx.getValue(); + points[4][1] = fDy.getValue(); + points[4][2] = fDz.getValue(); + + points[5][0] = -fDx.getValue(); + points[5][1] = fDy.getValue(); + points[5][2] = fDz.getValue(); + + points[6][0] = -fDx.getValue(); + points[6][1] = -fDy.getValue(); + points[6][2] = fDz.getValue(); + + points[7][0] = fDx.getValue(); + points[7][1] = -fDy.getValue(); + points[7][2] = fDz.getValue(); + + float normals[NFACES][3]; + //z back. + normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1; + //z front. + normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1; + //y up. + normals[2][0] = 0 ; normals[2][1] = 1; normals [2][2] = 0; + //x left. + normals[3][0] = -1 ; normals[3][1] = 0; normals [3][2] = 0; + //y down. + normals[4][0] = 0 ; normals[4][1] = -1; normals [4][2] = 0; + //x right. + normals[5][0] = 1 ; normals[5][1] = 0; normals [5][2] = 0; + + float x,y,z; + int index; + for (int nf=0;nfgetLength()==1); + SoSeparator *sep = (SoSeparator *) ( *children)[0]; + SoScale *scale = (SoScale *)( sep->getChild(0)); + //SoCube *cube = (SoCube *)( sep->getChild(1)); + scale->scaleFactor.setValue(fDx.getValue(), fDy.getValue(), fDz.getValue()); +} + +// generateChildren +void SoBox::generateChildren() { + + // A box consists of a set of scale factors and a + // cube. + + assert(children->getLength() ==0); + SoSeparator *sep = new SoSeparator(); + SoScale *scale = new SoScale(); + SoCube *cube = new SoCube(); + + sep->addChild(scale); + sep->addChild(cube); + children->append(sep); +} + +// generateAlternateRep +void SoBox::generateAlternateRep() { + + // This routine sets the alternate representation to the child + // list of this mode. + + if (children->getLength() == 0) generateChildren(); + updateChildren(); + alternateRep.setValue((SoSeparator *) ( *children)[0]); +} + +// clearAlternateRep +void SoBox::clearAlternateRep() { + alternateRep.setValue(NULL); +} + diff --git a/source/visualization/OpenInventor/src/SoCons.cc b/source/visualization/OpenInventor/src/SoCons.cc new file mode 100644 index 0000000000..6b381c10dd --- /dev/null +++ b/source/visualization/OpenInventor/src/SoCons.cc @@ -0,0 +1,436 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoCons.cc,v 1.2 2004/06/14 09:27:39 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis---------------------------------------*/ +/* */ +/* Node: SoCons */ +/* Description: Represents the G4Cons Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*--------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/SbMath.h" +#include "HEPVis/nodes/SoCons.h" + +// This statement is required +SO_NODE_SOURCE(SoCons) + +// Constructor +SoCons::SoCons() { + // This statement is required + SO_NODE_CONSTRUCTOR(SoCons); + + // Data fields are initialized like this: + SO_NODE_ADD_FIELD(fRmin1, (0.0)); + SO_NODE_ADD_FIELD(fRmin2, (0.0)); + SO_NODE_ADD_FIELD(fRmax1, (1.0)); + SO_NODE_ADD_FIELD(fRmax2, (1.0)); + SO_NODE_ADD_FIELD(fDz, (10.0)); + SO_NODE_ADD_FIELD(fSPhi, (0.0)); + SO_NODE_ADD_FIELD(fDPhi, ((float)(2*M_PI))); + SO_NODE_ADD_FIELD(smoothDraw, (TRUE)); + SO_NODE_ADD_FIELD(alternateRep, (NULL)); + children = new SoChildList(this); +} + +// Destructor +SoCons::~SoCons() { + delete children; +} + + +// initClass +void SoCons::initClass(){ + // This statement is required. + SO_NODE_INIT_CLASS(SoCons,SoShape,"Shape"); +} + + +// generatePrimitives +void SoCons::generatePrimitives(SoAction *action) { + // This variable is used to store each vertex + SoPrimitiveVertex pv; + + // Access the stat from the action + SoState *state = action->getState(); + + // See if we have to use a texture coordinate function, + // rather than generating explicit texture coordinates. + SbBool useTexFunction= + (SoTextureCoordinateElement::getType(state) == + SoTextureCoordinateElement::FUNCTION); + + // If we need to generate texture coordinates with a function, + // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll + // set up the coordinates directly. + const SoTextureCoordinateElement *tce = NULL; + SbVec4f texCoord; + if (useTexFunction) { + tce = SoTextureCoordinateElement::getInstance(state); + } else { + texCoord[2] = 0.0; + texCoord[3] = 1.0; + } + SbVec3f point, normal; + + /////////////////////////////////////////////////////// + //----------------------------------------------------- +#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ + point.setValue((float)(x),(float)(y),(float)(z)); \ + normal.setValue((float)(nx),(float)(ny),(float)(nz)); \ + if (useTexFunction) { \ + texCoord=tce->get(point,normal); \ + } else { \ + texCoord[0]=(float)(s); \ + texCoord[1]=(float)(t); \ + } \ + pv.setPoint(point); \ + pv.setNormal(normal); \ + pv.setTextureCoords(texCoord); \ + shapeVertex(&pv); + //----------------------------------------------------- + /////////////////////////////////////////////////////// + + + int NPHI = (int)(2+22*fabs(fDPhi.getValue()/(2.0*M_PI))); + double deltaPhi = fDPhi.getValue()/NPHI; + double phi0 = fSPhi.getValue(); + double phi1 = phi0 + fDPhi.getValue(); + double rMax1 = fRmax1.getValue(); + double rMin1 = fRmin1.getValue(); + double rMax2 = fRmax2.getValue(); + double rMin2 = fRmin2.getValue(); + double zMax = fDz.getValue(); + double zMin = -zMax; + double cosPhi0 = cos(phi0); + double sinPhi0 = sin(phi0); + double cosPhi1 = cos(phi1); + double sinPhi1 = sin(phi1); + double cosDeltaPhi = cos(deltaPhi); + double sinDeltaPhi = sin(deltaPhi); + // + // The outer surface! + // + beginShape(action,TRIANGLE_STRIP); + int i; + double sinPhi=sinPhi0; + double cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,cosPhi,sinPhi,0); + GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,cosPhi,sinPhi,0); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + // + // The inner surface! + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,-cosPhi,-sinPhi,0); + GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,1.0,1.0,-cosPhi,-sinPhi,0); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + if (fabs(deltaPhi)<2.0*M_PI) { + // + // The end + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0); + endShape(); + // + // The other end + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi1; + cosPhi=cosPhi1; + GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0); + endShape(); + } + + // + // The outer surface at z=+PDZ + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin2*cosPhi,rMin2*sinPhi,zMax,0.0,0.0,0,0,1); + GEN_VERTEX(pv,rMax2*cosPhi,rMax2*sinPhi,zMax,1.0,1.0,0,0,1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + // + // The outer surface at z=-PDZ + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin1*cosPhi,rMin1*sinPhi,zMin,0.0,0.0,0,0,-1); + GEN_VERTEX(pv,rMax1*cosPhi,rMax1*sinPhi,zMin,1.0,1.0,0,0,-1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + +} + +// getChildren +SoChildList *SoCons::getChildren() const { + return children; +} + + +// computeBBox +void SoCons::computeBBox(SoAction *, SbBox3f &box, SbVec3f ¢er ){ + float fRmax= fRmax1.getValue(); + if (fRmax2.getValue() > fRmax) fRmax = fRmax2.getValue(); + + SbVec3f vmin(-fRmax,-fRmax,-fDz.getValue()), + vmax( fRmax, fRmax, fDz.getValue()); + center.setValue(0,0,0); + box.setBounds(vmin,vmax); +} + + + + +// updateChildren +void SoCons::updateChildren() { + + + // Redraw the G4Cons.... + + assert(children->getLength()==1); + SoSeparator *sep = (SoSeparator *) ( *children)[0]; + SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0)); + SoNormal *theNormals = (SoNormal *) ( sep->getChild(1)); + SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2)); + SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3)); + + const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFACES=4*NPHI+2, NINDICES = NFACES*5; + float points[NPOINTS][3], normals[NFACES][3]; +#ifdef INVENTOR2_0 + static long indices[NINDICES]; +#else + static int32_t indices[NINDICES]; +#endif + static int init=0; + double phi, pp, DeltaPhi; + + // Indices need to be generated once! This is here to keep it close to the point + // generation, since otherwise it will be confusing. + + int i; + if (!init) { + init = 1; + // Outer face + for (i = 0; i< NPHI; i++) { + // 0 1 3 2; + indices[5*i+0] = 2*i+0; + indices[5*i+1] = 2*i+1; + indices[5*i+2] = 2*i+3; + indices[5*i+3] = 2*i+2; + indices[5*i+4] = SO_END_FACE_INDEX; + } + // the inner face + for (i=0;ipoint.set1Value(np,points[np][0],points[np][1],points[np][2]); + theFaceSet->coordIndex.setValues(0,NINDICES,indices); + if (smoothDraw.getValue()) { + // This Line is replaced by the next one because of an apparent Bug in Inventor (mem. leak). + // theNormals->vector.deleteValues(0); + for (int nf=0;nfvector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]); + theNormalBinding->value=SoNormalBinding::PER_FACE; + } + else { + for (int nf=0;nfvector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]); + theNormalBinding->value=SoNormalBinding::PER_FACE; + } +} + +// generateChildren +void SoCons::generateChildren() { + + // This routines creates one SoSeparator, one SoCoordinate3, and + // one SoLineSet, and puts it in the child list. This is done only + // once, whereas redrawing the position of the coordinates occurs each + // time an update is necessary, in the updateChildren routine. + + assert(children->getLength() ==0); + SoSeparator *sep = new SoSeparator(); + SoCoordinate3 *theCoordinates = new SoCoordinate3(); + SoNormal *theNormals = new SoNormal(); + SoNormalBinding *theNormalBinding = new SoNormalBinding(); + SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet(); + // + // This line costs some in render quality! but gives speed. + // + sep->addChild(theCoordinates); + sep->addChild(theNormals); + sep->addChild(theNormalBinding); + sep->addChild(theFaceSet); + children->append(sep); +} + +// generateAlternateRep +void SoCons::generateAlternateRep() { + + // This routine sets the alternate representation to the child + // list of this mode. + + if (children->getLength() == 0) generateChildren(); + updateChildren(); + alternateRep.setValue((SoSeparator *) ( *children)[0]); +} + +// clearAlternateRep +void SoCons::clearAlternateRep() { + alternateRep.setValue(NULL); +} + diff --git a/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc b/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc new file mode 100644 index 0000000000..039af45a1d --- /dev/null +++ b/source/visualization/OpenInventor/src/SoDetectorTreeKit.cc @@ -0,0 +1,214 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoDetectorTreeKit.cc,v 1.2 2004/06/14 09:27:40 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoDetectorTreeKit */ +/* Description: Represents a single sided silicon strip detector */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/nodekits/SoDetectorTreeKit.h" + +// This statement is required +SO_KIT_SOURCE(SoDetectorTreeKit) + +// initClass +void SoDetectorTreeKit::initClass(){ + SO_KIT_INIT_CLASS(SoDetectorTreeKit,SoBaseKit,"BaseKit"); +} + +// Constructor +SoDetectorTreeKit::SoDetectorTreeKit() { + SO_KIT_CONSTRUCTOR(SoDetectorTreeKit); + + SO_NODE_ADD_FIELD(alternateRep, (NULL)); + + SO_KIT_ADD_CATALOG_ENTRY ( topSeparator, SoSeparator, FALSE, this,\0, FALSE); + SO_KIT_ADD_CATALOG_ENTRY ( pickStyle, SoSeparator, TRUE , topSeparator,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY ( appearance, SoAppearanceKit, TRUE, topSeparator ,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY ( units, SoUnits, TRUE, topSeparator ,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY ( transform, SoTransform, TRUE , topSeparator,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY (texture2Transform, SoTexture2Transform, TRUE, topSeparator ,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY ( childList, SoSwitch, FALSE, topSeparator,\0, FALSE); + SO_KIT_ADD_CATALOG_ENTRY ( previewSeparator, SoSeparator, FALSE, childList,\0, TRUE); + SO_KIT_ADD_CATALOG_ENTRY ( fullSeparator, SoSeparator, FALSE, childList,\0, TRUE); + + SO_KIT_INIT_INSTANCE(); + createInitialTree(); +} + +// Destructor +SoDetectorTreeKit::~SoDetectorTreeKit() { +} + + +SbBool SoDetectorTreeKit::affectsState() const { + return FALSE; +} + +void SoDetectorTreeKit::createInitialTree() { + + SoEventCallback *myCallback = new SoEventCallback(); + myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(), + SoDetectorTreeKit::expand, + this); + myCallback->addEventCallback(SoMouseButtonEvent::getClassTypeId(), + SoDetectorTreeKit::contract , + this); + if(setPart("callbackList[0]",myCallback)==FALSE) myCallback->unref(); + + SoSwitch *theChildList = (SoSwitch *) childList.getValue(); + theChildList->whichChild.setValue(0); +} + +void SoDetectorTreeKit::expand(void *userData, SoEventCallback *eventCB){ + + // Was the event previously handled? Is it the right kind? + + if (eventCB->isHandled()) return; + const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent(); + if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return; + if (!event->wasCtrlDown()) return; + if (event->wasShiftDown()) return; + + // Which Strip Detector is this being called for? + SoDetectorTreeKit *This = (SoDetectorTreeKit *) userData; + + // Find out whether that's the one that has been picked. This is the lowest detector + // tree kit in the hierarchy. + SoHandleEventAction *handleEventAction = eventCB->getAction(); + const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint(); + if (!pickedPoint) return; + + SoFullPath *path = (SoFullPath *) pickedPoint->getPath(); + SoNode *ancestorNode=NULL; + for (int i=0;igetLength();i++) { + ancestorNode = path->getNodeFromTail(i); + if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) break; + } + if (This!=ancestorNode) return; + // if (!ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) return; + + // Deactivate the Preview + This->setPreview(FALSE); + eventCB->setHandled(); + +} + +void SoDetectorTreeKit::contract(void *userData, SoEventCallback *eventCB){ + + // Was the event previously handled? Is it the right kind? + if (eventCB->isHandled()) return; + const SoMouseButtonEvent *event= (SoMouseButtonEvent *) eventCB->getEvent(); + if (!SoMouseButtonEvent::isButtonPressEvent(event,SoMouseButtonEvent::BUTTON1)) return; + if (event->wasCtrlDown()) return; + if (!event->wasShiftDown()) return; + + // Which Strip Detector is this being called for? + SoDetectorTreeKit *This = (SoDetectorTreeKit *) userData; + + // Find out whether that's the one that has been picked + SoHandleEventAction *handleEventAction = eventCB->getAction(); + const SoPickedPoint *pickedPoint = handleEventAction->getPickedPoint(); + if (!pickedPoint) return; + + // Find out whether that's the one that has been picked. This is the lowest detector + // tree kit in the hierarchy. + SoFullPath *path = (SoFullPath *) pickedPoint->getPath(); + SoNode *ancestorNode=NULL; + SbBool firstTreeFound=FALSE; + for (int i=0;igetLength();i++) { + ancestorNode = path->getNodeFromTail(i); + if (ancestorNode->isOfType(SoDetectorTreeKit::getClassTypeId())) { + if (!firstTreeFound) { + if (This!=ancestorNode) return; + firstTreeFound=TRUE; + } + SoDetectorTreeKit *That = (SoDetectorTreeKit *) ancestorNode; + if (!That->getPreview()) { + That->setPreview(TRUE); + eventCB->setHandled(); + return; + } + } + } +} + +void SoDetectorTreeKit::setPreview(SbBool Flag) { + SoSwitch *theChildList = (SoSwitch *) childList.getValue(); + if (Flag) { + theChildList->whichChild.setValue(0); + } + else { + theChildList->whichChild.setValue(1); + } +} + +SbBool SoDetectorTreeKit::getPreview() const { + SoSwitch *theChildList = (SoSwitch *) childList.getValue(); + if (theChildList->whichChild.getValue()==0) return TRUE; + return FALSE; +} + + +SoSeparator *SoDetectorTreeKit::getPreviewSeparator() const { + return (SoSeparator *) previewSeparator.getValue(); +} + +SoSeparator *SoDetectorTreeKit::getFullSeparator() const { + return (SoSeparator *) fullSeparator.getValue(); +} + + + + +// generateAlternateRep +void SoDetectorTreeKit::generateAlternateRep() { + alternateRep.setValue(topSeparator.getValue()); +} + +void SoDetectorTreeKit::clearAlternateRep() { + alternateRep.setValue(NULL); +} diff --git a/source/visualization/OpenInventor/src/SoTrap.cc b/source/visualization/OpenInventor/src/SoTrap.cc new file mode 100644 index 0000000000..01295d6fe1 --- /dev/null +++ b/source/visualization/OpenInventor/src/SoTrap.cc @@ -0,0 +1,403 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTrap.cc,v 1.2 2004/06/14 09:27:40 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis----------------------------------------*/ +/* */ +/* Node: SoTrap */ +/* Description: Represents the G4Trap Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/* */ +/*---------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/SbMath.h" +#include "HEPVis/nodes/SoTrap.h" + +// This statement is required +SO_NODE_SOURCE(SoTrap) + +// Constructor +SoTrap::SoTrap() { + // This statement is required + SO_NODE_CONSTRUCTOR(SoTrap); + + // Data fields are initialized like this: + SO_NODE_ADD_FIELD(pDz, (1.0)); + SO_NODE_ADD_FIELD(pTheta, (0.0)); + SO_NODE_ADD_FIELD(pPhi, (0.0)); + SO_NODE_ADD_FIELD(pDy1, (1.0)); + SO_NODE_ADD_FIELD(pDx1, (1.0)); + SO_NODE_ADD_FIELD(pDx2, (1.0)); + SO_NODE_ADD_FIELD(pDy2, (1.0)); + SO_NODE_ADD_FIELD(pDx3, (1.0)); + SO_NODE_ADD_FIELD(pDx4, (1.0)); + SO_NODE_ADD_FIELD(pAlp1, (0.0)); + SO_NODE_ADD_FIELD(pAlp2, (0.0)); + SO_NODE_ADD_FIELD(alternateRep, (NULL)); + children = new SoChildList(this); +} + +// Destructor +SoTrap::~SoTrap() { + delete children; +} + + +// initClass +void SoTrap::initClass(){ + // This statement is required. + SO_NODE_INIT_CLASS(SoTrap,SoShape,"Shape"); +} + + +// generatePrimitives +void SoTrap::generatePrimitives(SoAction *action) { + // This variable is used to store each vertex + SoPrimitiveVertex pv; + + // Access the stat from the action + SoState *state = action->getState(); + + // See if we have to use a texture coordinate function, + // rather than generating explicit texture coordinates. + SbBool useTexFunction= + (SoTextureCoordinateElement::getType(state) == + SoTextureCoordinateElement::FUNCTION); + + // If we need to generate texture coordinates with a function, + // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll + // set up the coordinates directly. + const SoTextureCoordinateElement *tce = NULL; + SbVec4f texCoord; + if (useTexFunction) { + tce = SoTextureCoordinateElement::getInstance(state); + } + else { + texCoord[2] = 0.0; + texCoord[3] = 1.0; + } + SbVec3f point, normal; + + + ////////////////////////////////////////// + //---------------------------------------- +#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ + point.setValue(x,y,z); \ + normal.setValue(nx,ny,nz); \ + if (useTexFunction) { \ + texCoord=tce->get(point,normal); \ + } \ + else { \ + texCoord[0]=s; \ + texCoord[1]=t; \ + } \ + pv.setPoint(point); \ + pv.setNormal(normal); \ + pv.setTextureCoords(texCoord); \ + shapeVertex(&pv); + //---------------------------------------- + ////////////////////////////////////////// + + const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; + int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back. + 4,5,6,7, SO_END_FACE_INDEX, //z front. + 0,1,5,4, SO_END_FACE_INDEX, //y up. + 1,2,6,5, SO_END_FACE_INDEX, //x left. + 2,3,7,6, SO_END_FACE_INDEX, //y down. + 3,0,4,7, SO_END_FACE_INDEX}; //x right. + + // points for the eight vertices + float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); + float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); + float Talp1 = FTAN(pAlp1.getValue()); + float Talp2 = FTAN(pAlp2.getValue()); + + float points[NPOINTS][3]; + points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1; + points[0][1] = pDy1.getValue(); + points[0][2] = -pDz.getValue(); + + points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1; + points[1][1] = pDy1.getValue(); + points[1][2] = -pDz.getValue(); + + points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1; + points[2][1] = -pDy1.getValue(); + points[2][2] = -pDz.getValue(); + + points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1; + points[3][1] = -pDy1.getValue(); + points[3][2] = -pDz.getValue(); + + points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2; + points[4][1] = pDy2.getValue(); + points[4][2] = pDz.getValue(); + + points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2; + points[5][1] = pDy2.getValue(); + points[5][2] = pDz.getValue(); + + points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2; + points[6][1] = -pDy2.getValue(); + points[6][2] = pDz.getValue(); + + points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2; + points[7][1] = -pDy2.getValue(); + points[7][2] = pDz.getValue(); + + int i; + for (i=0;i<4;i++) { + points[i][0] -= pDz.getValue()*TthetaCphi; + points[i][1] -= pDz.getValue()*TthetaSphi; + } + for (i=4;i<8;i++) { + points[i][0] += pDz.getValue()*TthetaCphi; + points[i][1] += pDz.getValue()*TthetaSphi; + } + + SbVec3f normals[NFACES]; + int nf; + for (nf=0;nf pDx) pDx = pDx2.getValue(); + if (pDx3.getValue() > pDx) pDx = pDx3.getValue(); + if (pDx4.getValue() > pDx) pDx = pDx4.getValue(); + if (pDy2.getValue() > pDy) pDy = pDy2.getValue(); + float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); + float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); + float Xalp = FFABS(tan(pAlp1.getValue())*pDy1.getValue()); + float Xalp2 = FFABS(tan(pAlp2.getValue())*pDy2.getValue()); + if (Xalp< Xalp2) Xalp=Xalp2; + pDx += FFABS(TthetaCphi*pDz.getValue()); + pDx += Xalp; + pDy += FFABS(TthetaSphi*pDz.getValue()); + + + center.setValue(0,0,0); + box.setBounds(SbVec3f(-pDx,-pDy,-pDz.getValue()), + SbVec3f( pDx, pDy, pDz.getValue())); +} + + + + +// updateChildren +void SoTrap::updateChildren() { + + + // Redraw the G4Trap.... + + assert(children->getLength()==1); + SoSeparator *sep = (SoSeparator *) ( *children)[0]; + SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0)); + SoNormal *theNormals = (SoNormal *) ( sep->getChild(1)); + SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2)); + SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3)); + + const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; + float points[NPOINTS][3]; + // Indices for the eight faces +#ifdef INVENTOR2_0 + static long +#else + static int32_t +#endif + indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, // bottom + 4,5,6,7, SO_END_FACE_INDEX, // top + 0,1,5,4, SO_END_FACE_INDEX, + 1,2,6,5, SO_END_FACE_INDEX, + 2,3,7,6, SO_END_FACE_INDEX, + 3,0,4,7, SO_END_FACE_INDEX}; + + + // points for the eight vertices + float TthetaCphi = FTAN(pTheta.getValue())*FCOS(pPhi.getValue()); + float TthetaSphi = FTAN(pTheta.getValue())*FSIN(pPhi.getValue()); + float Talp1 = FTAN(pAlp1.getValue()); + float Talp2 = FTAN(pAlp2.getValue()); + + points[0][0] = pDx2.getValue()+pDy1.getValue()*Talp1; + points[0][1] = pDy1.getValue(); + points[0][2] = -pDz.getValue(); + + points[1][0] = -pDx2.getValue()+pDy1.getValue()*Talp1; + points[1][1] = pDy1.getValue(); + points[1][2] = -pDz.getValue(); + + points[2][0] = -pDx1.getValue()-pDy1.getValue()*Talp1; + points[2][1] = -pDy1.getValue(); + points[2][2] = -pDz.getValue(); + + points[3][0] = pDx1.getValue()-pDy1.getValue()*Talp1; + points[3][1] = -pDy1.getValue(); + points[3][2] = -pDz.getValue(); + + points[4][0] = pDx4.getValue()+pDy2.getValue()*Talp2; + points[4][1] = pDy2.getValue(); + points[4][2] = pDz.getValue(); + + points[5][0] = -pDx4.getValue()+pDy2.getValue()*Talp2; + points[5][1] = pDy2.getValue(); + points[5][2] = pDz.getValue(); + + points[6][0] = -pDx3.getValue()-pDy2.getValue()*Talp2; + points[6][1] = -pDy2.getValue(); + points[6][2] = pDz.getValue(); + + points[7][0] = pDx3.getValue()-pDy2.getValue()*Talp2; + points[7][1] = -pDy2.getValue(); + points[7][2] = pDz.getValue(); + + int i; + for (i=0;i<4;i++) { + points[i][0] -= pDz.getValue()*TthetaCphi; + points[i][1] -= pDz.getValue()*TthetaSphi; + } + for (i=4;i<8;i++) { + points[i][0] += pDz.getValue()*TthetaCphi; + points[i][1] += pDz.getValue()*TthetaSphi; + } + + for (int np=0;nppoint.set1Value(np,points[np][0],points[np][1],points[np][2]); + theFaceSet->coordIndex.setValues(0,NINDICES,indices); + theNormals->vector.deleteValues(0); + theNormals->vector.insertSpace(0,6); + for (int n=0;n<6;n++) { + int i0 = 5*n+0,i1=5*n+1,i2=5*n+2; + int j0 = theFaceSet->coordIndex[i0]; + int j1 = theFaceSet->coordIndex[i1]; + int j2 = theFaceSet->coordIndex[i2]; + SbVec3f p0= theCoordinates->point[j0]; + SbVec3f p1= theCoordinates->point[j1]; + SbVec3f p2= theCoordinates->point[j2]; + SbVec3f normal = (p1-p0).cross(p2-p0); + normal.normalize(); + theNormals->vector.set1Value(n,normal); + } + theNormalBinding->value=SoNormalBinding::PER_FACE; +} + +// generateChildren +void SoTrap::generateChildren() { + + // This routines creates one SoSeparator, one SoCoordinate3, and + // one SoLineSet, and puts it in the child list. This is done only + // once, whereas redrawing the position of the coordinates occurs each + // time an update is necessary, in the updateChildren routine. + + assert(children->getLength() ==0); + SoSeparator *sep = new SoSeparator(); + SoCoordinate3 *theCoordinates = new SoCoordinate3(); + SoNormal *theNormals = new SoNormal(); + SoNormalBinding *theNormalBinding = new SoNormalBinding(); + SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet(); + // + // This line costs some in render quality! but gives speed. + // + sep->addChild(theCoordinates); + sep->addChild(theNormals); + sep->addChild(theNormalBinding); + sep->addChild(theFaceSet); + children->append(sep); +} + +// generateAlternateRep +void SoTrap::generateAlternateRep() { + + // This routine sets the alternate representation to the child + // list of this mode. + + if (children->getLength() == 0) generateChildren(); + updateChildren(); + alternateRep.setValue((SoSeparator *) ( *children)[0]); +} + +// clearAlternateRep +void SoTrap::clearAlternateRep() { + alternateRep.setValue(NULL); +} + diff --git a/source/visualization/OpenInventor/src/SoTrd.cc b/source/visualization/OpenInventor/src/SoTrd.cc new file mode 100644 index 0000000000..425662b5e9 --- /dev/null +++ b/source/visualization/OpenInventor/src/SoTrd.cc @@ -0,0 +1,339 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTrd.cc,v 1.2 2004/06/14 09:27:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis---------------------------------------*/ +/* */ +/* Node: SoTrd */ +/* Description: Represents the G4Trd Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*--------------------------------------------------------------------------*/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/SbMath.h" +#include "HEPVis/nodes/SoTrd.h" + +// This statement is required +SO_NODE_SOURCE(SoTrd) + +// initClass +void SoTrd::initClass(){ + SO_NODE_INIT_CLASS(SoTrd,SoShape,"Shape"); +} +// Constructor +SoTrd::SoTrd() { + // This statement is required + SO_NODE_CONSTRUCTOR(SoTrd); + // Data fields are initialized like this: + SO_NODE_ADD_FIELD(fDx1,(1.0)); + SO_NODE_ADD_FIELD(fDx2,(1.0)); + SO_NODE_ADD_FIELD(fDy1,(1.0)); + SO_NODE_ADD_FIELD(fDy2,(1.0)); + SO_NODE_ADD_FIELD(fDz,(1.0)); + SO_NODE_ADD_FIELD(alternateRep,(NULL)); + children = new SoChildList(this); +} +// Destructor +SoTrd::~SoTrd() { + delete children; +} +// generatePrimitives +void SoTrd::generatePrimitives(SoAction *action) { + // This variable is used to store each vertex + SoPrimitiveVertex pv; + + // Access the stat from the action + SoState *state = action->getState(); + + // See if we have to use a texture coordinate function, + // rather than generating explicit texture coordinates. + SbBool useTexFunction= + (SoTextureCoordinateElement::getType(state) == + SoTextureCoordinateElement::FUNCTION); + + // If we need to generate texture coordinates with a function, + // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll + // set up the coordinates directly. + const SoTextureCoordinateElement *tce = NULL; + SbVec4f texCoord; + if (useTexFunction) { + tce = SoTextureCoordinateElement::getInstance(state); + } + else { + texCoord[2] = 0.0; + texCoord[3] = 1.0; + } + SbVec3f point, normal; + + + ////////////////////////////////////////// + //---------------------------------------- +#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ + point.setValue(x,y,z); \ + normal.setValue(nx,ny,nz); \ + if (useTexFunction) { \ + texCoord=tce->get(point,normal); \ + } \ + else { \ + texCoord[0]=s; \ + texCoord[1]=t; \ + } \ + pv.setPoint(point); \ + pv.setNormal(normal); \ + pv.setTextureCoords(texCoord); \ + shapeVertex(&pv); + //---------------------------------------- + ////////////////////////////////////////// + + const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; + int indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, //z back. + 4,5,6,7, SO_END_FACE_INDEX, //z front. + 0,1,5,4, SO_END_FACE_INDEX, //y up. + 1,2,6,5, SO_END_FACE_INDEX, //x left. + 2,3,7,6, SO_END_FACE_INDEX, //y down. + 3,0,4,7, SO_END_FACE_INDEX}; //x right. + + + // points for the eight vertices + float points[NPOINTS][3]; + points[0][0] = fDx1.getValue(); + points[0][1] = fDy1.getValue(); + points[0][2] = -fDz.getValue(); + + points[1][0] = -fDx1.getValue(); + points[1][1] = fDy1.getValue(); + points[1][2] = -fDz.getValue(); + + points[2][0] = -fDx1.getValue(); + points[2][1] = -fDy1.getValue(); + points[2][2] = -fDz.getValue(); + + points[3][0] = fDx1.getValue(); + points[3][1] = -fDy1.getValue(); + points[3][2] = -fDz.getValue(); + + points[4][0] = fDx2.getValue(); + points[4][1] = fDy2.getValue(); + points[4][2] = fDz.getValue(); + + points[5][0] = -fDx2.getValue(); + points[5][1] = fDy2.getValue(); + points[5][2] = fDz.getValue(); + + points[6][0] = -fDx2.getValue(); + points[6][1] = -fDy2.getValue(); + points[6][2] = fDz.getValue(); + + points[7][0] = fDx2.getValue(); + points[7][1] = -fDy2.getValue(); + points[7][2] = fDz.getValue(); + + float t1 = FATAN((fDx2.getValue()-fDx1.getValue())/(2*fDz.getValue())); + float t2 = FATAN((fDy2.getValue()-fDy1.getValue())/(2*fDz.getValue())); + float st1 = FSIN(t1); + float st2 = FSIN(t2); + float ct1 = FCOS(t1); + float ct2 = FCOS(t2); + + float normals[NFACES][3]; + //z back. + normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1; + //z front. + normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1; + //y up. + normals[2][0] = 0 ; normals[2][1] = ct2; normals [2][2] = -st2; + //x left. + normals[3][0] = -ct1; normals[3][1] = 0; normals [3][2] = -st1; + //y down. + normals[4][0] = 0 ; normals[4][1] = -ct2; normals [4][2] = -st2; + //x right. + normals[5][0] = ct1; normals[5][1] = 0; normals [5][2] = -st1; + + float x,y,z; + int index; + for (int nf=0;nf fDx) fDx = fDx2.getValue(); + if (fDy2.getValue() > fDy) fDy = fDy2.getValue(); + + SbVec3f vmin(-fDx,-fDy,-fDz.getValue()), + vmax( fDx, fDy, fDz.getValue()); + + center.setValue(0,0,0); + box.setBounds(vmin,vmax); +} + + + + +// updateChildren +void SoTrd::updateChildren() { + + + // Redraw the G4Trd.... + + assert(children->getLength()==1); + SoSeparator *sep = (SoSeparator *) ( *children)[0]; + SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0)); + SoNormal *theNormals = (SoNormal *) ( sep->getChild(1)); + SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2)); + SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3)); + + const int NPOINTS=8, NFACES=6, NINDICES = NFACES*5; + float points[NPOINTS][3]; + float normals[NFACES][3]= {{0,0,-1}, {0,0,1}, {0,1,0}, {-1, 0, 0}, {0, -1, 0}, {1,0,0}}; + + // Indices for the eight faces +#ifdef INVENTOR2_0 + static long +#else + static int32_t +#endif + indices[NINDICES] = {3,2,1,0, SO_END_FACE_INDEX, // bottom + 4,5,6,7, SO_END_FACE_INDEX, // top + 0,1,5,4, SO_END_FACE_INDEX, + 1,2,6,5, SO_END_FACE_INDEX, + 2,3,7,6, SO_END_FACE_INDEX, + 3,0,4,7, SO_END_FACE_INDEX}; + + + // points for the eight vertices + points[0][0] = fDx1.getValue(); points[0][1] = fDy1.getValue(); points[0][2] = -fDz.getValue(); + points[1][0] = -fDx1.getValue(); points[1][1] = fDy1.getValue(); points[1][2] = -fDz.getValue(); + points[2][0] = -fDx1.getValue(); points[2][1] = -fDy1.getValue(); points[2][2] = -fDz.getValue(); + points[3][0] = fDx1.getValue(); points[3][1] = -fDy1.getValue(); points[3][2] = -fDz.getValue(); + points[4][0] = fDx2.getValue(); points[4][1] = fDy2.getValue(); points[4][2] = fDz.getValue(); + points[5][0] = -fDx2.getValue(); points[5][1] = fDy2.getValue(); points[5][2] = fDz.getValue(); + points[6][0] = -fDx2.getValue(); points[6][1] = -fDy2.getValue(); points[6][2] = fDz.getValue(); + points[7][0] = fDx2.getValue(); points[7][1] = -fDy2.getValue(); points[7][2] = fDz.getValue(); + + float t1 = FATAN((fDx2.getValue()-fDx1.getValue())/(2*fDz.getValue())); + float t2 = FATAN((fDy2.getValue()-fDy1.getValue())/(2*fDz.getValue())); + float st1 = FSIN(t1); + float st2 = FSIN(t2); + float ct1 = FCOS(t1); + float ct2 = FCOS(t2); + + normals[0][0] = 0 ; normals[0][1] = 0; normals [0][2] = -1; + normals[1][0] = 0 ; normals[1][1] = 0; normals [1][2] = 1; + normals[2][0] = 0 ; normals[2][1] = ct2; normals [2][2] = -st2; + normals[3][0] = -ct1; normals[3][1] = 0; normals [3][2] = -st1; + normals[4][0] = 0 ; normals[4][1] = -ct2; normals [4][2] = -st2; + normals[5][0] = ct1; normals[5][1] = 0; normals [5][2] = -st1; + + for (int np=0;nppoint.set1Value(np,points[np][0],points[np][1],points[np][2]); + theFaceSet->coordIndex.setValues(0,NINDICES,indices); + for (int nf=0;nfvector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]); + theNormalBinding->value=SoNormalBinding::PER_FACE; +} + +// generateChildren +void SoTrd::generateChildren() { + + // This routines creates one SoSeparator, one SoCoordinate3, and + // one SoLineSet, and puts it in the child list. This is done only + // once, whereas redrawing the position of the coordinates occurs each + // time an update is necessary, in the updateChildren routine. + + assert(children->getLength() ==0); + SoSeparator *sep = new SoSeparator(); + SoCoordinate3 *theCoordinates = new SoCoordinate3(); + SoNormal *theNormals = new SoNormal(); + SoNormalBinding *theNormalBinding = new SoNormalBinding(); + SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet(); + // + // This line costs some in render quality! but gives speed. + // + sep->addChild(theCoordinates); + sep->addChild(theNormals); + sep->addChild(theNormalBinding); + sep->addChild(theFaceSet); + children->append(sep); +} + +// generateAlternateRep +void SoTrd::generateAlternateRep() { + + // This routine sets the alternate representation to the child + // list of this mode. + + if (children->getLength() == 0) generateChildren(); + updateChildren(); + alternateRep.setValue((SoSeparator *) ( *children)[0]); +} + +// clearAlternateRep +void SoTrd::clearAlternateRep() { + alternateRep.setValue(NULL); +} + diff --git a/source/visualization/OpenInventor/src/SoTubs.cc b/source/visualization/OpenInventor/src/SoTubs.cc new file mode 100644 index 0000000000..35c5bf2201 --- /dev/null +++ b/source/visualization/OpenInventor/src/SoTubs.cc @@ -0,0 +1,462 @@ +// +// ******************************************************************** +// * 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. * +// ******************************************************************** +// +// +// $Id: SoTubs.cc,v 1.2 2004/06/14 09:27:41 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ +// +/*-----------------------------Hepvis---------------------------------------*/ +/* */ +/* Node: SoTubs */ +/* Description: Represents the G4Tubs Geant Geometry entity */ +/* Author: Joe Boudreau Nov 11 1996 */ +/* */ +/*--------------------------------------------------------------------------*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "HEPVis/SbMath.h" +#include "HEPVis/nodes/SoTubs.h" + +// This statement is required +SO_NODE_SOURCE(SoTubs) + +// Constructor +SoTubs::SoTubs() { + + + // This statement is required + SO_NODE_CONSTRUCTOR(SoTubs); + + // Data fields are initialized like this: + SO_NODE_ADD_FIELD(pRMin, (0)); + SO_NODE_ADD_FIELD(pRMax, (1)); + SO_NODE_ADD_FIELD(pDz, (10)); + SO_NODE_ADD_FIELD(pSPhi, (0)); + SO_NODE_ADD_FIELD(pDPhi, ((float)(2*M_PI))); + SO_NODE_ADD_FIELD(alternateRep, (NULL)); + children = new SoChildList(this); +} + +// Destructor +SoTubs::~SoTubs() { + delete children; +} + + +// initClass +void SoTubs::initClass(){ + // This statement is required. + SO_NODE_INIT_CLASS(SoTubs,SoShape,"Shape"); +} + +// generatePrimitives +void SoTubs::generatePrimitives(SoAction *action) { + // This variable is used to store each vertex + SoPrimitiveVertex pv; + + // Access the stat from the action + SoState *state = action->getState(); + + // See if we have to use a texture coordinate function, + // rather than generating explicit texture coordinates. + SbBool useTexFunction= + (SoTextureCoordinateElement::getType(state) == + SoTextureCoordinateElement::FUNCTION); + + // If we need to generate texture coordinates with a function, + // we'll need an SoGLTextureCoordinateElement. Otherwise, we'll + // set up the coordinates directly. + const SoTextureCoordinateElement* tce = NULL; + SbVec4f texCoord; + if (useTexFunction) { + tce = SoTextureCoordinateElement::getInstance(state); + } + else { + texCoord[2] = 0.0; + texCoord[3] = 1.0; + } + SbVec3f point, normal; + + + /////////////////////////////////////////////////////// + //----------------------------------------------------- +#define GEN_VERTEX(pv,x,y,z,s,t,nx,ny,nz) \ + point.setValue((float)(x),(float)(y),(float)(z)); \ + normal.setValue((float)(nx),(float)(ny),(float)(nz)); \ + if (useTexFunction) { \ + texCoord=tce->get(point,normal); \ + } else { \ + texCoord[0]=(float)(s); \ + texCoord[1]=(float)(t); \ + } \ + pv.setPoint(point); \ + pv.setNormal(normal); \ + pv.setTextureCoords(texCoord); \ + shapeVertex(&pv); + //----------------------------------------------------- + /////////////////////////////////////////////////////// + + int NPHI = (int)(2+22*fabs(pDPhi.getValue()/(2.0*M_PI))); + double deltaPhi = pDPhi.getValue()/NPHI, phi0 = pSPhi.getValue(),phi1=phi0+pDPhi.getValue(); + double rMax=pRMax.getValue(),rMin=pRMin.getValue(); + double zMax=pDz.getValue(),zMin=-zMax; + double cosPhi0=cos(phi0), sinPhi0=sin(phi0); + double cosPhi1=cos(phi1), sinPhi1=sin(phi1); + double cosDeltaPhi=cos(deltaPhi),sinDeltaPhi=sin(deltaPhi); + // + // The outer surface! + // + int i; + double sinPhi,cosPhi; + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,0.0,0.0,cosPhi,sinPhi,0); + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,cosPhi,sinPhi,0); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + // + // The inner surface! + // + if(rMin!=0.F) { + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,0.0,0.0,-cosPhi,-sinPhi,0); + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,1.0,1.0,-cosPhi,-sinPhi,0); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + } + if (fabs(deltaPhi)<2.0*M_PI) { + // + // The end + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,0.0,0.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,1.0,0.0,sinPhi,-cosPhi,0); + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,0.0,1.0,sinPhi,-cosPhi,0); + endShape(); + // + // The other end + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi1; + cosPhi=cosPhi1; + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi, zMax,0.0,0.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi, zMin,1.0,1.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi, zMax,1.0,0.0,-sinPhi,+cosPhi,0); + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi, zMin,0.0,1.0,-sinPhi,+cosPhi,0); + endShape(); + } + // + // The outer surface at z=+PDZ + // + if(rMin==0.F) { + beginShape(action,TRIANGLE_FAN); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + GEN_VERTEX(pv,0,0,zMax,0.0,0.0,0,0,1); + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,1.0,1.0,0,0,1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + // + // The outer surface at z=-PDZ + // + beginShape(action,TRIANGLE_FAN); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + GEN_VERTEX(pv,0,0,zMin,0.0,0.0,0,0,-1); + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,0,0,-1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + } else { + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMax,0.0,0.0,0,0,1); + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMax,1.0,1.0,0,0,1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + // + // The outer surface at z=-PDZ + // + beginShape(action,TRIANGLE_STRIP); + sinPhi=sinPhi0; + cosPhi=cosPhi0; + for (i = 0; i<=NPHI; i++) { + GEN_VERTEX(pv,rMin*cosPhi,rMin*sinPhi,zMin,0.0,0.0,0,0,-1); + GEN_VERTEX(pv,rMax*cosPhi,rMax*sinPhi,zMin,1.0,1.0,0,0,-1); + inc(sinPhi, cosPhi, sinDeltaPhi, cosDeltaPhi); + } + endShape(); + } +} + +// getChildren +SoChildList *SoTubs::getChildren() const { + return children; +} + + +// computeBBox +void SoTubs::computeBBox(SoAction *, SbBox3f &box, SbVec3f ¢er ){ + SbVec3f vmin(-pRMax.getValue(),-pRMax.getValue(),-pDz.getValue()), + vmax( pRMax.getValue(), pRMax.getValue(), pDz.getValue()); + center.setValue(0,0,0); + box.setBounds(vmin,vmax); +} + + +// updateChildren +void SoTubs::updateChildren() { + + // Redraw the G4Tubs.... + + assert(children->getLength()==1); + SoSeparator *sep = (SoSeparator *) ( *children)[0]; + SoCoordinate3 *theCoordinates = (SoCoordinate3 *) ( sep->getChild(0)); + SoNormal *theNormals = (SoNormal *) ( sep->getChild(1)); + SoNormalBinding *theNormalBinding = (SoNormalBinding *) ( sep->getChild(2)); + SoIndexedFaceSet *theFaceSet = (SoIndexedFaceSet *) ( sep->getChild(3)); + + + const int NPHI=24, NPOINTS=2*(2*NPHI+2), NFACES=4*NPHI+2, NINDICES = NFACES*5; + float points[NPOINTS][3],normals[NFACES][3]; +#ifdef INVENTOR2_0 + static long indices[NINDICES]; +#else + static int32_t indices[NINDICES]; +#endif + + static int init=0; + double phi, pp, DeltaPhi; + + // Indices need to be generated once! This is here to keep it close to the point + // generation, since otherwise it will be confusing. + + int i; + if (!init) { + init = 1; + // Outer face + for (i = 0; i< NPHI; i++) { + // 0 1 3 2; + indices[5*i+0] = 2*i+0; + indices[5*i+1] = 2*i+1; + indices[5*i+2] = 2*i+3; + indices[5*i+3] = 2*i+2; + indices[5*i+4] = SO_END_FACE_INDEX; + } + // the inner face + for (i=0;ipoint.set1Value(np,points[np][0],points[np][1],points[np][2]); + for (int ni=0;nicoordIndex.set1Value(ni,indices[ni]); + for (int nf=0;nfvector.set1Value(nf,normals[nf][0],normals[nf][1],normals[nf][2]); + theNormalBinding->value=SoNormalBinding::PER_FACE; +} + +// generateChildren +void SoTubs::generateChildren() { + + // This routines creates one SoSeparator, one SoCoordinate3, and + // one SoLineSet, and puts it in the child list. This is done only + // once, whereas redrawing the position of the coordinates occurs each + // time an update is necessary, in the updateChildren routine. + + assert(children->getLength() ==0); + SoSeparator *sep = new SoSeparator(); + SoCoordinate3 *theCoordinates = new SoCoordinate3(); + SoNormal *theNormals = new SoNormal(); + SoNormalBinding *theNormalBinding = new SoNormalBinding(); + SoIndexedFaceSet *theFaceSet = new SoIndexedFaceSet(); + // + // This line costs some in render quality! but gives speed. + // + sep->addChild(theCoordinates); + sep->addChild(theNormals); + sep->addChild(theNormalBinding); + sep->addChild(theFaceSet); + children->append(sep); +} + +// generateAlternateRep +void SoTubs::generateAlternateRep() { + + // This routine sets the alternate representation to the child + // list of this mode. + + if (children->getLength() == 0) generateChildren(); + updateChildren(); + alternateRep.setValue((SoSeparator *) ( *children)[0]); +} + +// clearAlternateRep +void SoTubs::clearAlternateRep() { + alternateRep.setValue(NULL); +} + diff --git a/source/visualization/RayTracer/GNUmakefile b/source/visualization/RayTracer/GNUmakefile index 3de2c3faca..eca9fb1b25 100644 --- a/source/visualization/RayTracer/GNUmakefile +++ b/source/visualization/RayTracer/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.7 2003/11/12 22:46:00 duns Exp $ +# $Id: GNUmakefile,v 1.9 2004/06/11 14:30:49 gcosmo Exp $ name := G4RayTracer @@ -6,10 +6,19 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk +CPPFLAGS += -DG4VIS_ALLOC_EXPORT + CPPFLAGS += -I$(G4BASE)/visualization/modeling/include CPPFLAGS += -I$(G4BASE)/visualization/management/include CPPFLAGS += -I$(G4BASE)/graphics_reps/include diff --git a/source/visualization/RayTracer/History b/source/visualization/RayTracer/History index 0b6b2a3a81..453fcc2b89 100644 --- a/source/visualization/RayTracer/History +++ b/source/visualization/RayTracer/History @@ -1,4 +1,4 @@ -$Id: History,v 1.24 2003/11/12 22:46:00 duns Exp $ +$Id: History,v 1.25 2004/06/11 15:23:39 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -24,6 +24,10 @@ committal in the CVS repository ! History file for visualization category --------------------------------------- +11th June 2004 Gabriele Cosmo (raytracer-V06-01-00) +- Use global flag G4VIS_ALLOC_EXPORT to export extern symbols for DLLs. + Modified GNUmakefile and rearranged usage of extern symbols in classes. + 12th November 2003 Mark Donszelmann - GNUmakefile: added Modeling/include directory to compile on Windows. diff --git a/source/visualization/RayTracer/include/G4RayTrajectory.hh b/source/visualization/RayTracer/include/G4RayTrajectory.hh index 8351bf6da6..0a8b6c541b 100644 --- a/source/visualization/RayTracer/include/G4RayTrajectory.hh +++ b/source/visualization/RayTracer/include/G4RayTrajectory.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RayTrajectory.hh,v 1.11 2003/06/16 17:13:42 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4RayTrajectory.hh,v 1.14 2004/06/11 14:30:49 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -87,8 +87,11 @@ class G4RayTrajectory : public G4VTrajectory std::vector* positionRecord; }; - -extern G4Allocator G4RayTrajectoryAllocator; +#if defined G4VIS_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator G4RayTrajectoryAllocator; +#else + extern G4DLLIMPORT G4Allocator G4RayTrajectoryAllocator; +#endif inline void* G4RayTrajectory::operator new(size_t) { diff --git a/source/visualization/RayTracer/include/G4RayTrajectoryPoint.hh b/source/visualization/RayTracer/include/G4RayTrajectoryPoint.hh index c3d8c857ce..df90f129cc 100644 --- a/source/visualization/RayTracer/include/G4RayTrajectoryPoint.hh +++ b/source/visualization/RayTracer/include/G4RayTrajectoryPoint.hh @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RayTrajectoryPoint.hh,v 1.5 2002/10/16 11:42:48 johna Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4RayTrajectoryPoint.hh,v 1.8 2004/06/11 14:30:50 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // @@ -77,7 +77,11 @@ class G4RayTrajectoryPoint :public G4VTrajectoryPoint // Dummy function (not used) to satisfy base class pure virtual function. }; -extern G4Allocator G4RayTrajectoryPointAllocator; +#if defined G4VIS_ALLOC_EXPORT + extern G4DLLEXPORT G4Allocator G4RayTrajectoryPointAllocator; +#else + extern G4DLLIMPORT G4Allocator G4RayTrajectoryPointAllocator; +#endif inline void* G4RayTrajectoryPoint::operator new(size_t) { diff --git a/source/visualization/RayTracer/src/G4RayTrajectory.cc b/source/visualization/RayTracer/src/G4RayTrajectory.cc index 17feb2bc04..749637bfe0 100644 --- a/source/visualization/RayTracer/src/G4RayTrajectory.cc +++ b/source/visualization/RayTracer/src/G4RayTrajectory.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RayTrajectory.cc,v 1.12 2003/06/16 17:13:45 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4RayTrajectory.cc,v 1.14 2004/06/11 14:30:51 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // @@ -31,7 +31,6 @@ //G4RayTrajectory.cc /////////////////// - #include "G4RayTrajectory.hh" #include "G4RayTrajectoryPoint.hh" #include "G4Step.hh" diff --git a/source/visualization/RayTracer/src/G4RayTrajectoryPoint.cc b/source/visualization/RayTracer/src/G4RayTrajectoryPoint.cc index 509eb7bdc2..535fd0955e 100644 --- a/source/visualization/RayTracer/src/G4RayTrajectoryPoint.cc +++ b/source/visualization/RayTracer/src/G4RayTrajectoryPoint.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4RayTrajectoryPoint.cc,v 1.3 2001/07/11 10:09:05 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4RayTrajectoryPoint.cc,v 1.5 2004/06/11 14:30:51 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // // @@ -31,7 +31,6 @@ //G4RayTrajectoryPoint.cc /////////////////////// - #include"G4RayTrajectoryPoint.hh" G4Allocator G4RayTrajectoryPointAllocator; diff --git a/source/visualization/Tree/GNUmakefile b/source/visualization/Tree/GNUmakefile index b51c6b98ea..62a7a4d0aa 100644 --- a/source/visualization/Tree/GNUmakefile +++ b/source/visualization/Tree/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.2 2003/10/03 15:19:27 gcosmo Exp $ +# $Id: GNUmakefile,v 1.3 2004/06/03 11:40:14 gcosmo Exp $ name := G4Tree @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/VRML/GNUmakefile b/source/visualization/VRML/GNUmakefile index 7e3d34530b..42544fed08 100644 --- a/source/visualization/VRML/GNUmakefile +++ b/source/visualization/VRML/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.6 2003/10/03 15:18:22 gcosmo Exp $ +# $Id: GNUmakefile,v 1.7 2004/06/03 11:40:14 gcosmo Exp $ # lib name name := G4VRML @@ -7,6 +7,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/VRML/History b/source/visualization/VRML/History index ca2404ed94..148d39f74c 100644 --- a/source/visualization/VRML/History +++ b/source/visualization/VRML/History @@ -1,4 +1,4 @@ -$Id: History,v 1.10 2003/11/06 15:04:40 johna Exp $ +$Id: History,v 1.11 2004/04/27 09:01:40 gcosmo Exp $ ------------------------------------------------------------------- ========================================================= @@ -20,6 +20,10 @@ committal in the CVS repository ! History file for visualization/VRML sub-category ------------------------------------------------ +19th April 2004 Gabriele Cosmo (VRML-V06-01-00) +- Fixed typo in printout in G4VRML1FileSceneHandler.cc and + G4VRML2FileSceneHandler.cc. + 6th November 2003 John Allison (vis-V05-02-03) - G4VRML2SceneHandlerFunc: changed const char* pv_name to G4String pv_name. diff --git a/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc b/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc index 68f4ea045d..3cd19f50a8 100644 --- a/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc +++ b/source/visualization/VRML/src/G4VRML1FileSceneHandler.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4VRML1FileSceneHandler.cc,v 1.8 2003/06/16 17:13:57 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4VRML1FileSceneHandler.cc,v 1.9 2004/04/19 09:08:37 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G4VRML1FileSceneHandler.cc // Satoshi Tanaka & Yasuhide Sawada @@ -165,8 +165,8 @@ void G4VRML1FileSceneHandler::connectPort() // open a VRML 1.0 file with determined file name G4cerr << "===========================================" << G4endl; G4cerr << "Output VRML 1.0 file: " << fVRMLFileName << G4endl; - G4cerr << "Muximal number of file in the destination directory: " << fMaxFileNum << G4endl; - G4cerr << " (Customizable as: setenv G4VRMLFILE_MAX_FILE_NUM number) " << G4endl; + G4cerr << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; + G4cerr << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; G4cerr << "===========================================" << G4endl; fDest.open(fVRMLFileName) ; fFlagDestOpen = true ; diff --git a/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc b/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc index daa3b4b15f..0fe8ab8b6e 100644 --- a/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc +++ b/source/visualization/VRML/src/G4VRML2FileSceneHandler.cc @@ -21,8 +21,8 @@ // ******************************************************************** // // -// $Id: G4VRML2FileSceneHandler.cc,v 1.9 2003/06/16 17:13:59 gunter Exp $ -// GEANT4 tag $Name: geant4-05-02-patch-01 $ +// $Id: G4VRML2FileSceneHandler.cc,v 1.10 2004/04/19 09:08:38 gcosmo Exp $ +// GEANT4 tag $Name: geant4-06-02 $ // // G4VRML2FileSceneHandler.cc // Satoshi Tanaka & Yasuhide Sawada @@ -180,8 +180,8 @@ void G4VRML2FileSceneHandler::connectPort() // open a VRML 2.0 file with determined file name G4cerr << "===========================================" << G4endl; G4cerr << "Output VRML 2.0 file: " << fVRMLFileName << G4endl; - G4cerr << "Muximal number of file in the destination directory: " << fMaxFileNum << G4endl; - G4cerr << " (Customizable as: setenv G4VRMLFILE_MAX_FILE_NUM number) " << G4endl; + G4cerr << "Maximum number of files in the destination directory: " << fMaxFileNum << G4endl; + G4cerr << " (Customizable with the environment variable: G4VRMLFILE_MAX_FILE_NUM) " << G4endl; G4cerr << "===========================================" << G4endl; fDest.open(fVRMLFileName) ; fFlagDestOpen = true ; diff --git a/source/visualization/XXX/GNUmakefile b/source/visualization/XXX/GNUmakefile index caf5abed68..3db071e8a9 100644 --- a/source/visualization/XXX/GNUmakefile +++ b/source/visualization/XXX/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.5 2003/10/03 15:16:02 gcosmo Exp $ +# $Id: GNUmakefile,v 1.6 2004/06/03 11:40:15 gcosmo Exp $ name := G4visXXX @@ -6,6 +6,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4vis_management.lib libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk include $(G4INSTALL)/config/interactivity.gmk diff --git a/source/visualization/management/GNUmakefile b/source/visualization/management/GNUmakefile index 9279b7dee5..21c9bb9a90 100644 --- a/source/visualization/management/GNUmakefile +++ b/source/visualization/management/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.6 2003/11/06 15:08:18 johna Exp $ +# $Id: GNUmakefile,v 1.8 2004/06/17 13:54:27 gcosmo Exp $ # ------------------------------------------------------------- # GNUmakefile for visualization library. John Allison, 5/7/95. @@ -8,6 +8,13 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4modeling.lib +GLOBLIBS += libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk include $(G4INSTALL)/config/G4VIS_BUILD.gmk diff --git a/source/visualization/modeling/GNUmakefile b/source/visualization/modeling/GNUmakefile index 1b1fae169f..dc7d1af389 100644 --- a/source/visualization/modeling/GNUmakefile +++ b/source/visualization/modeling/GNUmakefile @@ -1,4 +1,4 @@ -# $Id: GNUmakefile,v 1.6 2003/11/06 15:15:08 johna Exp $ +# $Id: GNUmakefile,v 1.8 2004/06/08 08:18:26 gcosmo Exp $ # -------------------------------------------------------------- # GNUmakefile for modeling library. John Allison, 31/12/1997. # -------------------------------------------------------------- @@ -9,6 +9,12 @@ ifndef G4INSTALL G4INSTALL = ../../.. endif +GLOBLIBS = libG4run.lib libG4event.lib +GLOBLIBS += libG4tracking.lib libG4processes.lib libG4digits_hits.lib +GLOBLIBS += libG4track.lib libG4particles.lib libG4geometry.lib +GLOBLIBS += libG4materials.lib libG4graphics_reps.lib +GLOBLIBS += libG4intercoms.lib libG4global.lib + include $(G4INSTALL)/config/architecture.gmk CPPFLAGS += -I$(G4BASE)/global/management/include

    487bd+)ymmUdrX6VR2(RSDQwlsUl~ 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�{?ruBw;WIz5BQx@ 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