Import Geant4 10.5.0.beta source tree

This commit is contained in:
Gabriele Cosmo
2018-06-29 10:58:11 +02:00
parent fe81a77428
commit 6aa23be517
1581 changed files with 124288 additions and 83758 deletions
-602
View File
@@ -1,602 +0,0 @@
//$Id$
///\file "optical/LXe/.README.txt"
///\brief Example LXe README page
/*! \page ExampleLXe Example LXe
\section LXe_s1 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.
\verbatim
LXeMainVolume(G4RotationMatrix *pRot,
const G4ThreeVector &tlate,
G4LogicalVolume *pMotherLogical,
G4bool pMany,
G4int pCopyNo,
LXeDetectorConstruction* c);
\endverbatim
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.
\verbatim
if(!fHousing_log || fUpdated){
//...
//Define logical volume
//...
}
SetLogicalVolume(fHousing_log);
\endverbatim
\subsection LXe_subs10 Modifying the geometry at runtime
This example allows the user to modify the geometry definition at runtime. This
is accomplished through LXeDetectorMessenger, 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.
\verbatim
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();
}
\endverbatim
\section LXe_s2 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.
\verbatim
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);
\endverbatim
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.
\verbatim
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;
}
//...
}
\endverbatim
\section LXe_s3 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.
\verbatim
RegisterPhysics( new LXeGeneralPhysics("general") );
\endverbatim
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.
\section LXe_s4 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:
\verbatim
fpTrackingManager->SetTrajectory(new LXeTrajectory(aTrack));
\endverbatim
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.
\verbatim
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(*fPhysVol,attribs,trans);//Draw it
\endverbatim
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.
\section LXe_s5 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.
\verbatim
G4RunManager::SetRandomNumberStore(G4bool)
\endverbatim
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.
\verbatim
G4RunManager::rndmSaveThisEvent()
\endverbatim
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.
\verbatim
G4RunManager::SetRandomNumberStoreDir(G4String)
\endverbatim
\section LXe_s6 LXeRecorderBase
LXeRecorderBase 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:
\verbatim
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()
\endverbatim
For the reasoning behind why it is done this way see LXeRecorderBase.hh
\section LXe_s7 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:
\verbatim
/LXe/saveThreshold <int, default = 4500>
\endverbatim
- 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".
\verbatim
/LXe/eventVerbose <int, default = 1>
\endverbatim
- Enables end of event verbose data to be printed. This includes information
counted and calculated by the user action classes.
\verbatim
/LXe/pmtThreshold <int, default = 1>
\endverbatim
- 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.
\verbatim
/LXe/oneStepPrimaries <bool>
\endverbatim
- 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.
\verbatim
/LXe/forceDrawPhotons <bool>
\endverbatim
- 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.
\verbatim
/LXe/forceDrawNoPhotons <bool>
\endverbatim
- 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.
\verbatim
/LXe/detector/dimensions <double x y z> <unit, default = cm>
\endverbatim
- Sets the dimensions of the main scintillator volume.
\verbatim
/LXe/detector/housingThickness <double>
\endverbatim
- Sets the thickness of the housing surrounding the main detector volume.
\verbatim
/LXe/detector/pmtRadius <double> <unit, default = cm>
\endverbatim
- Sets the radius of the PMTs
\verbatim
/LXe/detector/nx
/LXe/detector/ny
/LXe/detector/nz
\endverbatim
- Sets the number of PMTs placed in a row along each axis.
\verbatim
/LXe/detector/reflectivity <double>
\endverbatim
- Sets the reflectivity of the inside of the aluminum housing. The geometry
uses a default value of 1.00 for a fully reflective surface.
\verbatim
/LXe/detector/nfibers <int>
\endverbatim
- Sets the number of WLS fibers placed in the WLS scintillator slab. The
geometry uses a default value of 15 fibers.
\verbatim
/LXe/detector/scintYieldFactor <double>
\endverbatim
- 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.
\verbatim
/LXe/detector/update
\endverbatim
- 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***
\verbatim
/LXe/detector/defaults
\endverbatim
- Resets all detector values customizable with commands above to their defaults.
\verbatim
/LXe/detector/volumes/sphere <bool>
\endverbatim
- 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.
\verbatim
/LXe/detector/volumes/wls <bool>
\endverbatim
- 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.
\verbatim
/LXe/detector/volumes/lxe <bool>
\endverbatim
- Enables/disables the main LXe scintillator volume. By default this is part of
the geometry.
\section LXe_s8 Macro files
The following are the macro files included in this example and what they do.
- LXe.in \n
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 \n
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 \n
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 \n
This is a standard vis.mac file to tell the vis manager how to visualize the
simulation.
- photon.mac \n
A very simple test in which the gun is set to produce a single photon inside
the main scintillator volume.
- reviewEvent.mac \n
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 \n
This resets all values that can be changed with the /LXe/ commands back to
their initial configuration including those that are not reset with
\verbatim
/LXe/detector/defaults
\endverbatim
<hr>
\section LXe_s9 Classes Used
\subsection LXe_subs11 main ()
See LXe.cc.
- Use G4UItcsh if available
- Provide interactive and macro mode
\subsection LXe_subs12 G4VModularPhysicsList
Class: LXePhysicsList
- Registers General, EM, Muon, and Optical physics lists
- define particles; including
- G4OpticalPhoton
- define processes; including
- G4Cerenkov
- G4Scintillation
- G4OpAbsorption
- G4OpRayleigh
- G4OpBoundaryProcess
- G4OpWLS
\subsection LXe_subs13 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.
\subsection LXe_subs14 G4VUserPrimaryGeneratorAction
Class: LXePrimaryGeneratorAction
- Use G4ParticleGun to shoot a 511 keV gamma through the housing into
liquid xenon scintillator
\subsection LXe_subs15 G4UserStackingAction
Class: LXeStackingAction
- show how to count the number of secondary particles in an event
differentiates between different creator processes
\subsection LXe_subs16 G4UserRunAction
Class: LXeRunAction
- Call recorder class for begin and end of run
\subsection LXe_subs17 G4UserSteppingAction
Class: LXeSteppingAction
- Identify which secondaries were generated during a particular step
- Count reflections/absorptions/detections due to G4OpBoundaryProcess \n
Count absorptions due to G4OpAbsorption \n
Manually trigger a sensitive detector when a boundary process detects
- Call recorder class at end of step
\subsection LXe_subs18 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
\subsection LXe_subs19 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
\subsection LXe_subs110 G4VSensitiveDetector
Classes: LXePMTSD, LXeScintSD
- Basic sensitive detectors keeping hit collections
- Keep one G4VHit object per hit \n
or \n
Keep one G4VHit object per volume containing hits
- LXePMTSD decides if the hits it is creating should be redrawn
\subsection LXe_subs111 G4VHit
Classes: LXePMTHit, LXeScintHIT
- Store individual hit positions \n
or \n
Store a count of hits in a particular volume
- Selectively redraw volumes containing hits at the end of event
\subsection LXe_subs112 G4VUserEventInformation & G4VUserTrackInformation
Classes: LXeUserEventInformation, LXeUserTrackInformation
- Store aditional information along with the G4Event/G4Track objects
\subsection LXe_subs113 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.
\subsection LXe_subs114 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
\subsection LXe_subs115 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
\subsection LXe_subs116 LXeRecorderBase
Class LXeRecorderBase
- Virtual class provided for recording of simulation data
- Derive your own implementation from it and instantiate the recorder
object in main () (see LXe.cc)
- For full description see LXeRecorderBase.hh
*/
@@ -42,7 +42,6 @@ target_link_libraries(LXe ${Geant4_LIBRARIES} )
set(LXe_SCRIPTS
LXe.out
LXe.in
defaults.mac
cerenkov.mac
wls.mac
photon.mac
+41 -2
View File
@@ -1,4 +1,4 @@
$Id: History 110132 2018-05-16 06:48:25Z gcosmo $
$Id: History 110280 2018-05-17 14:50:16Z gcosmo $
-------------------------------------------------------------------
=========================================================
@@ -15,7 +15,46 @@ track of all tags.
* Reverse chronological order (last date on top), please *
----------------------------------------------------------
March 6, 2018 P. Gumplinger (LXe-V10-03-01)
May 17, 2018 J. Allison (LXe-V10-04-08)
- LXe.cc: Removed remaining G4UI_USE and G4VIS_USE.
May 17, 2018 J. Allison (LXe-V10-04-07)
- LXe.cc: Instantiate vis manager always (including batch).
May 15, 2018 D. Sawkey (LXe-V10-04-06)
- update README, remove WALKTHROUGH
- update LXe.cc use vis.mac, gui.mac if no command line args
- update vis.mac
- use nullptr throughout
- remove redundant 'this'
May 8, 2018 D. Sawkey (LXe-V10-04-05)
- remove LXeRecorderBase, replace with LXeHistoManager
May 8, 2018 B. Morgan (LXe-V10-04-04)
- Include G4Types before use of G4MULTITHREADED. For forward
compatibility with move to #defines over -D for G4 preprocessor
symbols.
May 3, 2018 D. Sawkey (LXe-V10-04-03)
- Add LXeRun to record, print results at end
- Remove LXeUserEventInformation, use LXeEventAction instead
- Use G4EmStandard_option4 EM physics
May 1, 2018 D. Sawkey (LXe-V10-04-02)
- replace local physics with FTFP_BERT + G4OpticalPhysics
- deleted LXeEMPhysics, LXeGeneralPhysics,LXeMuonPhysics,LXePhysicsList
- remove LXeSteppingVerbose
- cleaning of macros
April 4, 2018 D. Sawkey (LXe-V10-04-01)
- problem report 2042.
Macros: remove /LXe/detector/update, add /run/initialize
LXeDetectorConstruction: move DefineMaterials to ctor
LXeGeneralPhysics, LXeEMPhysics, LXeMuonPhysics: construct particles in
LXeGeneralPhysics using G4BosonConstructor etc
March 6, 2018 P. Gumplinger (LXe-V10-04-00)
- address problem report 2041
May 31, 2017 P. Gumplinger (LXe-V10-03-00)
+45 -36
View File
@@ -23,13 +23,15 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXe.cc 77782 2013-11-28 08:12:12Z gcosmo $
// $Id: LXe.cc 110280 2018-05-17 14:50:16Z gcosmo $
//
/// \file optical/LXe/LXe.cc
/// \brief Main program of the optical/LXe example
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4Types.hh"
#ifdef G4MULTITHREADED
#include "G4MTRunManager.hh"
#else
@@ -39,75 +41,82 @@
#include "G4UImanager.hh"
#include "G4String.hh"
#include "LXePhysicsList.hh"
#include "FTFP_BERT.hh"
#include "G4OpticalPhysics.hh"
#include "G4EmStandardPhysics_option4.hh"
#include "LXeDetectorConstruction.hh"
#include "LXeActionInitialization.hh"
#include "LXeRecorderBase.hh"
#ifdef G4VIS_USE
#include "G4VisExecutive.hh"
#endif
#ifdef G4UI_USE
#include "G4UIExecutive.hh"
#endif
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
int main(int argc, char** argv)
{
//detect interactive mode (if no arguments) and define UI session
G4UIExecutive* ui = nullptr;
if (argc == 1) ui = new G4UIExecutive(argc,argv);
#ifdef G4MULTITHREADED
G4MTRunManager * runManager = new G4MTRunManager;
G4int nThreads = std::min(G4Threading::G4GetNumberOfCores(), 4);
runManager->SetNumberOfThreads(nThreads);
G4cout << "===== LXe is started with "
<< runManager->GetNumberOfThreads() << " threads =====" << G4endl;
#else
G4RunManager * runManager = new G4RunManager;
#endif
runManager->SetUserInitialization(new LXeDetectorConstruction());
runManager->SetUserInitialization(new LXePhysicsList());
LXeRecorderBase* recorder = NULL; //No recording is done in this example
G4VModularPhysicsList* physicsList = new FTFP_BERT;
physicsList->ReplacePhysics(new G4EmStandardPhysics_option4());
G4OpticalPhysics* opticalPhysics = new G4OpticalPhysics();
opticalPhysics->SetWLSTimeProfile("delta");
runManager->SetUserInitialization(new LXeActionInitialization(recorder));
opticalPhysics->SetScintillationYieldFactor(1.0);
opticalPhysics->SetScintillationExcitationRatio(0.0);
#ifdef G4VIS_USE
opticalPhysics->SetMaxNumPhotonsPerStep(100);
opticalPhysics->SetMaxBetaChangePerStep(10.0);
opticalPhysics->SetTrackSecondariesFirst(kCerenkov, true);
opticalPhysics->SetTrackSecondariesFirst(kScintillation, true);
physicsList->RegisterPhysics(opticalPhysics);
runManager->SetUserInitialization(physicsList);
runManager->SetUserInitialization(new LXeActionInitialization());
//initialize visualization
G4VisManager* visManager = new G4VisExecutive;
// G4VisExecutive can take a verbosity argument - see /vis/verbose guidance.
// G4VisManager* visManager = new G4VisExecutive("Quiet");
visManager->Initialize();
#endif
// runManager->Initialize();
// get the pointer to the UI manager and set verbosities
//get the pointer to the User Interface manager
G4UImanager* UImanager = G4UImanager::GetUIpointer();
if(argc==1){
#ifdef G4UI_USE
G4UIExecutive* ui = new G4UIExecutive(argc, argv);
#ifdef G4VIS_USE
if (ui) {
//interactive mode
UImanager->ApplyCommand("/control/execute vis.mac");
#endif
if (ui->IsGUI())
UImanager->ApplyCommand("/control/execute gui.mac");
if (ui->IsGUI()) {
UImanager->ApplyCommand("/control/execute gui.mac");
}
ui->SessionStart();
delete ui;
#endif
}
else{
else {
//batch mode
G4String command = "/control/execute ";
G4String filename = argv[1];
UImanager->ApplyCommand(command+filename);
G4String fileName = argv[1];
UImanager->ApplyCommand(command+fileName);
}
// if(recorder)delete recorder;
#ifdef G4VIS_USE
delete visManager;
#endif
// job termination
delete visManager;
delete runManager;
return 0;
}
+708 -85
View File
@@ -4,7 +4,7 @@
############################################
**************************************************************
Geant4 version Name: geant4-10-04-patch-02 (25-May-2018)
Geant4 version Name: geant4-10-05-beta-01 (29-June-2018)
Copyright : Geant4 Collaboration
References : NIM A 506 (2003), 250-303
: IEEE-TNS 53 (2006), 270-278
@@ -12,6 +12,9 @@
WWW : http://geant4.org/
**************************************************************
<<< Geant4 Physics List simulation engine: FTFP_BERT 2.0
G4VModularPhysicsList::ReplacePhysics: G4EmStandardwith type : 2 is replaces with G4EmStandard_opt4
Visualization Manager instantiating with verbosity "warnings (3)"...
Visualization Manager initialising...
Registering graphics systems...
@@ -61,133 +64,731 @@ Some /vis commands (optionally) take a string to specify colour.
"/vis/list" to see available colours.
Construction /LXeDet/pmtSD
Construction /LXeDet/scintSD
FTFP_BERT : new threshold between BERT and FTFP is over the interval
for pions : 3 to 12 GeV
for kaons : 3 to 12 GeV
for proton : 3 to 12 GeV
for neutron : 3 to 12 GeV
### Adding tracking cuts for neutron TimeCut(ns)= 10000 KinEnergyCut(MeV)= 0
### Birks coefficients used in run time
LXe 0.126 mm/MeV 0.038052 g/cm^2/MeV massFactor= 7.14643 effCharge= 2916
Polystyrene 0.126 mm/MeV 0.012978 g/cm^2/MeV massFactor= 101.167 effCharge= 0.027027
### === Deexcitation model UAtomDeexcitation is activated for 1 region:
DefaultRegionForTheWorld 1 1 0
### === Auger cascade flag: 1
### === Ignore cuts flag: 0
phot: for gamma SubType= 12 BuildTable= 0
LambdaPrime table from 200 keV to 100 TeV in 61 bins
LambdaPrime table from 200 keV to 100 TeV in 174 bins
===== EM models for the G4Region DefaultRegionForTheWorld ======
PhotoElectric : Emin= 0 eV Emax= 100 TeV AngularGenSauterGavrila
LivermorePhElectric : Emin= 0 eV Emax= 100 TeV AngularGenSauterGavrila FluoActive
compt: for gamma SubType= 13 BuildTable= 1
Lambda table from 100 eV to 1 MeV, 7 bins per decade, spline: 1
LambdaPrime table from 1 MeV to 100 TeV in 56 bins
Lambda table from 100 eV to 1 MeV, 20 bins per decade, spline: 1
LambdaPrime table from 1 MeV to 100 TeV in 160 bins
===== EM models for the G4Region DefaultRegionForTheWorld ======
Klein-Nishina : Emin= 0 eV Emax= 100 TeV
LowEPComptonModel : Emin= 0 eV Emax= 20 MeV FluoActive
KleinNishina : Emin= 20 MeV Emax= 100 TeV FluoActive
conv: for gamma SubType= 14 BuildTable= 1
Lambda table from 1.022 MeV to 100 TeV, 18 bins per decade, spline: 1
Lambda table from 1.022 MeV to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
BetheHeitler : Emin= 0 eV Emax= 80 GeV
BetheHeitlerLPM : Emin= 80 GeV Emax= 100 TeV
PenConversion : Emin= 0 eV Emax= 80 GeV
BetheHeitlerLPM : Emin= 80 GeV Emax= 100 TeV AngularGenUrban
Rayl: for gamma SubType= 11 BuildTable= 1
Lambda table from 100 eV to 100 keV, 20 bins per decade, spline: 0
LambdaPrime table from 100 keV to 100 TeV in 180 bins
===== EM models for the G4Region DefaultRegionForTheWorld ======
LivermoreRayleigh : Emin= 0 eV Emax= 100 TeV CullenGenerator
msc: for e- SubType= 10
RangeFactor= 0.04, stepLimitType: 1, latDisplacement: 1
RangeFactor= 0.2, stepLimitType: 2, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV Table with 84 bins Emin= 100 eV Emax= 100 TeV
GoudsmitSaunderson : Emin= 0 eV Emax= 100 MeV Table with 120 bins Emin= 100 eV Emax= 100 MeV
WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Table with 120 bins Emin= 100 MeV Emax= 100 TeV
eIoni: for e- SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
finalRange(mm)= 1, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
MollerBhabha : Emin= 0 eV Emax= 100 TeV
PenIoni : Emin= 0 eV Emax= 1 MeV
MollerBhabha : Emin= 1 MeV Emax= 100 TeV deltaVI
eBrem: for e- SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000
===== EM models for the G4Region DefaultRegionForTheWorld ======
eBremSB : Emin= 0 eV Emax= 1 GeV DipBustGen
eBremLPM : Emin= 1 GeV Emax= 100 TeV DipBustGen
eBremSB : Emin= 0 eV Emax= 1 GeV AngularGen2BS
eBremLPM : Emin= 1 GeV Emax= 100 TeV AngularGen2BS
ePairProd: for e- SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 25x1001 from 0.1 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
ePairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for e-, integral: 1 SubType= 1 BuildTable= 1
Lambda table from 100 MeV to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 100 MeV Emax= 100 TeV
msc: for e+ SubType= 10
RangeFactor= 0.04, stepLimitType: 1, latDisplacement: 1
RangeFactor= 0.2, stepLimitType: 2, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV Table with 84 bins Emin= 100 eV Emax= 100 TeV
GoudsmitSaunderson : Emin= 0 eV Emax= 100 MeV Table with 120 bins Emin= 100 eV Emax= 100 MeV
WentzelVIUni : Emin= 100 MeV Emax= 100 TeV Table with 120 bins Emin= 100 MeV Emax= 100 TeV
eIoni: for e+ SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
finalRange(mm)= 1, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
MollerBhabha : Emin= 0 eV Emax= 100 TeV
PenIoni : Emin= 0 eV Emax= 1 MeV
MollerBhabha : Emin= 1 MeV Emax= 100 TeV deltaVI
eBrem: for e+ SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
LPM flag: 1 for E > 1 GeV, VertexHighEnergyTh(GeV)= 100000
===== EM models for the G4Region DefaultRegionForTheWorld ======
eBremSB : Emin= 0 eV Emax= 1 GeV DipBustGen
eBremLPM : Emin= 1 GeV Emax= 100 TeV DipBustGen
eBremSB : Emin= 0 eV Emax= 1 GeV AngularGen2BS
eBremLPM : Emin= 1 GeV Emax= 100 TeV AngularGen2BS
ePairProd: for e+ SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 25x1001 from 0.1 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
ePairProd : Emin= 0 eV Emax= 100 TeV
annihil: for e+, integral: 1 SubType= 5 BuildTable= 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
eplus2gg : Emin= 0 eV Emax= 100 TeV
msc: for mu+ SubType= 10
RangeFactor= 0.2, step limit type: 0, lateralDisplacement: 0, polarAngleLimit(deg)= 180
CoulombScat: for e+, integral: 1 SubType= 1 BuildTable= 1
Lambda table from 100 MeV to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV Table with 84 bins Emin= 100 eV Emax= 100 TeV
eCoulombScattering : Emin= 100 MeV Emax= 100 TeV
msc: for proton SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for proton SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.1, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
Bragg : Emin= 0 eV Emax= 2 MeV deltaVI
BetheBloch : Emin= 2 MeV Emax= 100 TeV deltaVI
hBrems: for proton SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for proton SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 17x1001 from 7.50618 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for proton, integral: 1 SubType= 1 BuildTable= 1
Lambda table from threshold to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
nuclearStopping: for proton SubType= 8 BuildTable= 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV
msc: for GenericIon SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV
ionIoni: for GenericIon SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.001, dRoverRange= 0.1, integral: 1, fluct: 1, linLossLimit= 0.02
===== EM models for the G4Region DefaultRegionForTheWorld ======
ParamICRU73 : Emin= 0 eV Emax= 100 TeV deltaVI
nuclearStopping: for GenericIon SubType= 8 BuildTable= 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV
msc: for alpha SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
ionIoni: for alpha SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.1, integral: 1, fluct: 1, linLossLimit= 0.02
===== EM models for the G4Region DefaultRegionForTheWorld ======
BraggIon : Emin= 0 eV Emax= 7.9452 MeV deltaVI
BetheBloch : Emin= 7.9452 MeV Emax= 100 TeV deltaVI
nuclearStopping: for alpha SubType= 8 BuildTable= 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV
msc: for anti_proton SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for anti_proton SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.1, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU73QO : Emin= 0 eV Emax= 2 MeV deltaVI
BetheBloch : Emin= 2 MeV Emax= 100 TeV deltaVI
hBrems: for anti_proton SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for anti_proton SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 17x1001 from 7.50618 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for anti_proton, integral: 1 SubType= 1 BuildTable= 1
Lambda table from threshold to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
nuclearStopping: for anti_proton SubType= 8 BuildTable= 0
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU49NucStopping : Emin= 0 eV Emax= 1 MeV
msc: for kaon+ SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for kaon+ SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
Bragg : Emin= 0 eV Emax= 1.05231 MeV deltaVI
BetheBloch : Emin= 1.05231 MeV Emax= 100 TeV deltaVI
hBrems: for kaon+ SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for kaon+ SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 18x1001 from 3.94942 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for kaon+, integral: 1 SubType= 1 BuildTable= 1
Lambda table from threshold to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
msc: for kaon- SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for kaon- SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU73QO : Emin= 0 eV Emax= 1.05231 MeV deltaVI
BetheBloch : Emin= 1.05231 MeV Emax= 100 TeV deltaVI
hBrems: for kaon- SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for kaon- SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 18x1001 from 3.94942 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for kaon-, integral: 1 SubType= 1 BuildTable= 1
Used Lambda table of kaon+
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
msc: for mu+ SubType= 10
RangeFactor= 0.2, step limit type: 0, lateralDisplacement: 1, polarAngleLimit(deg)= 180
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
muIoni: for mu+ SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
finalRange(mm)= 0.1, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
Bragg : Emin= 0 eV Emax= 200 keV
BetheBloch : Emin= 200 keV Emax= 1 GeV
Bragg : Emin= 0 eV Emax= 200 keV deltaVI
BetheBloch : Emin= 200 keV Emax= 1 GeV deltaVI
MuBetheBloch : Emin= 1 GeV Emax= 100 TeV
muBrems: for mu+ SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
MuBrem : Emin= 0 eV Emax= 100 TeV
muPairProd: for mu+ SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 21x1001 from 1 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
muPairProd : Emin= 0 eV Emax= 100 TeV
msc: for mu- SubType= 10
RangeFactor= 0.2, step limit type: 0, lateralDisplacement: 0, polarAngleLimit(deg)= 180
CoulombScat: for mu+, integral: 1 SubType= 1 BuildTable= 1
Lambda table from threshold to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
UrbanMsc : Emin= 0 eV Emax= 100 TeV Table with 84 bins Emin= 100 eV Emax= 100 TeV
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
msc: for mu- SubType= 10
RangeFactor= 0.2, step limit type: 0, lateralDisplacement: 1, polarAngleLimit(deg)= 180
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
muIoni: for mu- SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
finalRange(mm)= 0.1, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU73QO : Emin= 0 eV Emax= 200 keV
BetheBloch : Emin= 200 keV Emax= 1 GeV
ICRU73QO : Emin= 0 eV Emax= 200 keV deltaVI
BetheBloch : Emin= 200 keV Emax= 1 GeV deltaVI
MuBetheBloch : Emin= 1 GeV Emax= 100 TeV
muBrems: for mu- SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
MuBrem : Emin= 0 eV Emax= 100 TeV
muPairProd: for mu- SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 84 bins
Lambda tables from threshold to 100 TeV, 7 bins per decade, spline: 1
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 21x1001 from 1 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
muPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for mu-, integral: 1 SubType= 1 BuildTable= 1
Used Lambda table of mu+
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
msc: for pi+ SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for pi+ SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
Bragg : Emin= 0 eV Emax= 297.505 keV deltaVI
BetheBloch : Emin= 297.505 keV Emax= 100 TeV deltaVI
hBrems: for pi+ SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for pi+ SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 20x1001 from 1.11656 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for pi+, integral: 1 SubType= 1 BuildTable= 1
Lambda table from threshold to 100 TeV, 20 bins per decade, spline: 1
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
msc: for pi- SubType= 10
RangeFactor= 0.2, stepLimitType: 0, latDisplacement: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
WentzelVIUni : Emin= 0 eV Emax= 100 TeV Table with 240 bins Emin= 100 eV Emax= 100 TeV
hIoni: for pi- SubType= 2
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
finalRange(mm)= 0.01, dRoverRange= 0.2, integral: 1, fluct: 1, linLossLimit= 0.01
===== EM models for the G4Region DefaultRegionForTheWorld ======
ICRU73QO : Emin= 0 eV Emax= 297.505 keV deltaVI
BetheBloch : Emin= 297.505 keV Emax= 100 TeV deltaVI
hBrems: for pi- SubType= 3
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
===== EM models for the G4Region DefaultRegionForTheWorld ======
hBrem : Emin= 0 eV Emax= 100 TeV
hPairProd: for pi- SubType= 4
dE/dx and range tables from 100 eV to 100 TeV in 240 bins
Lambda tables from threshold to 100 TeV, 20 bins per decade, spline: 1
Sampling table 20x1001 from 1.11656 GeV to 100 TeV
===== EM models for the G4Region DefaultRegionForTheWorld ======
hPairProd : Emin= 0 eV Emax= 100 TeV
CoulombScat: for pi-, integral: 1 SubType= 1 BuildTable= 1
Used Lambda table of pi+
ThetaMin(p) < Theta(degree) < 180 pLimit(GeV^1)= 0.139531
===== EM models for the G4Region DefaultRegionForTheWorld ======
eCoulombScattering : Emin= 0 eV Emax= 100 TeV
====================================================================
HADRONIC PROCESSES SUMMARY (verbose level 1)
---------------------------------------------------
Hadronic Processes for neutron
Process: hadElastic
Model: hElasticCHIPS: 0 eV ---> 100 TeV
Cr_sctns: G4NeutronElasticXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: neutronInelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: G4NeutronInelasticXS: 0 eV ---> 100 TeV
Cr_sctns: Barashenkov-Glauber: 0 eV ---> 100 TeV
Process: nCapture
Model: nRadCapture: 0 eV ---> 100 TeV
Cr_sctns: G4NeutronCaptureXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaCaptureXS: 0 eV ---> 100 TeV
Process: nKiller
---------------------------------------------------
Hadronic Processes for GenericIon
Process: ionInelastic
Model: Binary Light Ion Cascade: 0 eV /n ---> 4 GeV/n
Model: FTFP: 2 GeV/n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for He3
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: He3Inelastic
Model: Binary Light Ion Cascade: 0 eV /n ---> 4 GeV/n
Model: FTFP: 2 GeV/n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for alpha
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: alphaInelastic
Model: Binary Light Ion Cascade: 0 eV /n ---> 4 GeV/n
Model: FTFP: 2 GeV/n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for anti_He3
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n
Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_He3Inelastic
Model: FTFP: 0 eV /n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hFritiofCaptureAtRest
---------------------------------------------------
Hadronic Processes for anti_alpha
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n
Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_alphaInelastic
Model: FTFP: 0 eV /n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hFritiofCaptureAtRest
---------------------------------------------------
Hadronic Processes for anti_deuteron
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n
Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_deuteronInelastic
Model: FTFP: 0 eV /n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hFritiofCaptureAtRest
---------------------------------------------------
Hadronic Processes for anti_neutron
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 100 TeV
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_neutronInelastic
Model: FTFP: 0 eV ---> 100 TeV
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for anti_proton
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 100.1 MeV
Model: AntiAElastic: 100 MeV ---> 100 TeV
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_protonInelastic
Model: FTFP: 0 eV ---> 100 TeV
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hFritiofCaptureAtRest
---------------------------------------------------
Hadronic Processes for anti_triton
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100.1 MeV/n
Model: AntiAElastic: 100 MeV/n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: anti_tritonInelastic
Model: FTFP: 0 eV /n ---> 100 TeV/n
Cr_sctns: AntiAGlauber: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hFritiofCaptureAtRest
---------------------------------------------------
Hadronic Processes for deuteron
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: dInelastic
Model: Binary Light Ion Cascade: 0 eV /n ---> 4 GeV/n
Model: FTFP: 2 GeV/n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for e+
Process: positronNuclear
Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV
Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for e-
Process: electronNuclear
Model: G4ElectroVDNuclearModel: 0 eV ---> 1 PeV
Cr_sctns: ElectroNuclearXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for gamma
Process: photonNuclear
Model: BertiniCascade: 0 eV ---> 3.5 GeV
Model: TheoFSGenerator: 3 GeV ---> 100 TeV
Cr_sctns: PhotoNuclearXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for kaon+
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 100 TeV
Cr_sctns: Glauber-Gribov: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: kaon+Inelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: Glauber-Gribov: 0 eV ---> 2.88022e+295 J
Cr_sctns: ChipsKaonPlusInelasticXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for kaon-
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 100 TeV
Cr_sctns: Glauber-Gribov: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: kaon-Inelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: Glauber-Gribov: 0 eV ---> 2.88022e+295 J
Cr_sctns: ChipsKaonMinusInelasticXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hBertiniCaptureAtRest
---------------------------------------------------
Hadronic Processes for lambda
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 100 TeV
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: lambdaInelastic
Model: BertiniCascade: 0 eV ---> 6 GeV
Model: FTFP: 2 GeV ---> 100 TeV
Cr_sctns: ChipsHyperonInelasticXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for mu+
Process: muonNuclear
Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV
Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for mu-
Process: muonNuclear
Model: G4MuonVDNuclearModel: 0 eV ---> 1 PeV
Cr_sctns: KokoulinMuonNuclearXS: 0 eV ---> 100 TeV
Process: muMinusCaptureAtRest
---------------------------------------------------
Hadronic Processes for pi+
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 1.0001 GeV
Model: hElasticGlauber: 1 GeV ---> 100 TeV
Cr_sctns: Barashenkov-Glauber: 0 eV ---> 100 TeV
Process: pi+Inelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: G4CrossSectionPairGG: 0 eV ---> 100 TeV
G4CrossSectionPairGG: G4PiNuclearCrossSection cross sections
below 91 GeV, Glauber-Gribov above
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for pi-
Process: hadElastic
Model: hElasticLHEP: 0 eV ---> 1.0001 GeV
Model: hElasticGlauber: 1 GeV ---> 100 TeV
Cr_sctns: Barashenkov-Glauber: 0 eV ---> 100 TeV
Process: pi-Inelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: G4CrossSectionPairGG: 0 eV ---> 100 TeV
G4CrossSectionPairGG: G4PiNuclearCrossSection cross sections
below 91 GeV, Glauber-Gribov above
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
Process: hBertiniCaptureAtRest
---------------------------------------------------
Hadronic Processes for proton
Process: hadElastic
Model: hElasticCHIPS: 0 eV ---> 100 TeV
Cr_sctns: ChipsProtonElasticXS: 0 eV ---> 100 TeV
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: protonInelastic
Model: FTFP: 3 GeV ---> 100 TeV
Model: BertiniCascade: 0 eV ---> 12 GeV
Cr_sctns: Barashenkov-Glauber: 0 eV ---> 100 TeV
---------------------------------------------------
Hadronic Processes for triton
Process: hadElastic
Model: hElasticLHEP: 0 eV /n ---> 100 TeV/n
Cr_sctns: GheishaElastic: 0 eV ---> 100 TeV
Process: tInelastic
Model: Binary Light Ion Cascade: 0 eV /n ---> 4 GeV/n
Model: FTFP: 2 GeV/n ---> 100 TeV/n
Cr_sctns: Glauber-Gribov nucleus nucleus: 0 eV ---> 2.88022e+295 J
Cr_sctns: GheishaInelastic: 0 eV ---> 100 TeV
================================================================
=======================================================================
====== Pre-compound/De-excitation Physics Parameters ========
@@ -204,7 +805,7 @@ Level density (1/MeV) 0.1
Time limit for long lived isomeres (ns) 1e+12
Internal e- conversion flag 1
Store e- internal conversion data 0
Electron internal conversion ID 0
Electron internal conversion ID 2
Correlated gamma emission flag 0
Max 2J for sampling of angular correlations 10
=======================================================================
@@ -213,107 +814,129 @@ Max 2J for sampling of angular correlations 10
Index : 0 used in the geometry : Yes
Material : Vacuum
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 1 used in the geometry : Yes
Material : Al
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 6.90363 keV e- 598.345 keV e+ 570.85 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 5.87535 keV e- 460.395 keV e+ 442.201 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 2 used in the geometry : Yes
Material : LXe
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 29.6749 keV e- 509.223 keV e+ 485.824 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 23.933 keV e- 391.82 keV e+ 376.336 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 3 used in the geometry : Yes
Material : Glass
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 2.40367 keV e- 356.639 keV e+ 344.855 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 2.09434 keV e- 281.891 keV e+ 276.265 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
====================================================================
### Run 0 starts.
Energy weighted position of hits in LXe : (-0.0164407,0.0641416,-109.073)
Total energy deposition in scintillator : 539.559 (keV)
Energy weighted position of hits in LXe : (-5.27634,-0.0965279,-81.3922)
Total energy deposition in scintillator : 535.365 (keV)
Reconstructed position of hits in LXe : (0,0,0)
WARNING: G4VisManager::IsValidView(): Attempt to draw when no graphics system
has been instantiated. Use "/vis/open" or "/vis/sceneHandler/create".
Alternatively, to avoid this message, suppress instantiation of vis
manager (G4VisExecutive) and ensure drawing code is executed only if
G4VVisManager::GetConcreteInstance() is non-zero.
Number of photons that hit PMTs in this event : 1538
Number of photons that hit PMTs in this event : 1391
Number of PMTs above threshold(2) : 32
Number of photons produced by scintillation in this event : 5578
Number of photons produced by scintillation in this event : 4837
Number of photons produced by cerenkov in this event : 0
Number of photons absorbed (OpAbsorption) in this event : 4040
Number of photons absorbed (OpAbsorption) in this event : 3446
Number of photons absorbed at boundaries (OpBoundary) in this event : 0
Unacounted for photons in this event : 0
Unaccounted for photons in this event : 0
Run terminated.
Run Summary
Number of events processed : 1
User=0.07s Real=0.08s Sys=0s
User=0.070000s Real=0.068448s Sys=0.000000s
======================== run summary ======================
The run was 1 events.
Number of hits per event: 1391 +- 0
Number of hits per event above threshold: 32 +- 0
Number of scintillation photons per event : 4837 +- 0
Number of Cerenkov photons per event: 0 +- 0
Number of absorbed photons per event : 3446 +- 0
Number of photons absorbed at boundary per event: 0 +- 0
Total energy deposition in scintillator per event: 535.4 +- 0 keV.
========= Table of registered couples ==============================
Index : 0 used in the geometry : Yes
Material : Vacuum
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 990 eV e- 990 eV e+ 990 eV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 1 used in the geometry : Yes
Material : Al
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 6.90363 keV e- 598.345 keV e+ 570.85 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 5.87535 keV e- 460.395 keV e+ 442.201 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 2 used in the geometry : Yes
Material : LXe
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 29.6749 keV e- 509.223 keV e+ 485.824 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 23.933 keV e- 391.82 keV e+ 376.336 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
Index : 3 used in the geometry : Yes
Material : Glass
Range cuts : gamma 1 mm e- 1 mm e+ 1 mm proton 1 mm
Energy thresholds : gamma 2.40367 keV e- 356.639 keV e+ 344.855 keV proton 100 keV
Range cuts : gamma 700 um e- 700 um e+ 700 um proton 700 um
Energy thresholds : gamma 2.09434 keV e- 281.891 keV e+ 276.265 keV proton 70 keV
Region(s) which use this couple :
DefaultRegionForTheWorld
====================================================================
### Run 1 starts.
Energy weighted position of hits in LXe : (-0.234713,0.416708,-85.5965)
Total energy deposition in scintillator : 538.485 (keV)
Energy weighted position of hits in LXe : (-1.14756,-0.55423,-25.1669)
Total energy deposition in scintillator : 537.665 (keV)
Reconstructed position of hits in LXe : (0,0,0)
Number of photons that hit PMTs in this event : 1519
Number of photons that hit PMTs in this event : 1533
Number of PMTs above threshold(2) : 32
Number of photons produced by scintillation in this event : 5407
Number of photons produced by scintillation in this event : 5305
Number of photons produced by cerenkov in this event : 0
Number of photons absorbed (OpAbsorption) in this event : 3888
Number of photons absorbed (OpAbsorption) in this event : 3772
Number of photons absorbed at boundaries (OpBoundary) in this event : 0
Unacounted for photons in this event : 0
Unaccounted for photons in this event : 0
Run terminated.
Run Summary
Number of events processed : 1
User=0.07s Real=0.06s Sys=0s
User=0.060000s Real=0.073511s Sys=0.000000s
======================== run summary ======================
The run was 1 events.
Number of hits per event: 1533 +- 0
Number of hits per event above threshold: 32 +- 0
Number of scintillation photons per event : 5305 +- 0
Number of Cerenkov photons per event: 0 +- 0
Number of absorbed photons per event : 3772 +- 0
Number of photons absorbed at boundary per event: 0 +- 0
Total energy deposition in scintillator per event: 537.7 +- 0 keV.
Graphics systems deleted.
Visualization Manager deleting...
G4 kernel has come to Quit state.
================== Deleting memory pools ===================
Number of memory pools allocated: 15 of which, static: 0
Dynamic pools deleted: 15 / Total memory freed: 2.7 MB
Dynamic pools deleted: 15 / Total memory freed: 1.9 MB
============================================================
RunManagerKernel is deleted. Good bye :)
+147 -361
View File
@@ -2,25 +2,87 @@
LXe Example
-----------
**********
*Geometry*
**********
------------
Introduction
------------
This example demonstrates usage of optical physics.
-----------------------------
Geometry and primary particle
-----------------------------
The main volume is a box of LXe. PMTs are placed around the outside. There
may be a reflective sphere placed inside the box, and a wavelength shifting
slab and fibers.
The geometry implementation is different from many of the other examples.
See the discussion below.
G4ParticleGun creates the primary particle. The type of particle is selectable
by the user.
-------
Physics
-------
The physics list is FTFP_BERT, with G4EmStandard_option4 electromagnetic
physics and G4OpticalPhysics.
-----------
Macro files
-----------
cerenkov.mac disables scintillation, so the optical photons that are produced
are Cerenkov photons.
wls.mac implements a scintillating slab and wavelength shifting fibers.
---------------------------
List of built-in histograms
---------------------------
1 "hits per event"
2 "hits per event above threshold"
3 "scintillation photons per event"
4 "Cerenkov photons per event"
5 "absorbed photons per event"
6 "photons absorbed at boundary per event"
7 "energy deposition in scintillator per event"
-------------
How to start?
-------------
- execute LXe in 'batch' mode from macro files, e.g.
$ ./LXe cerenkov.mac
- execute LXe in 'interactive' mode with visualization, e.g.
$ ./LXe
The type commands, for instance
Session: /run/beamOn 1
-----------------------------------------------
Detailed Explanation of Geometry Implementation
-----------------------------------------------
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
oriented, way to construct geometry. It separates 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);
-------
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
@@ -39,62 +101,57 @@ 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);
------
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*
***********************************
---------------------------------
Modifying the geometry at runtime
---------------------------------
This example allows the user to modify the geometry definition at runtime. This
is accomplished through LXeDetectorMessenger, 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.
are used when constructing the geometry.
------
void LXeDetectorConstruction::UpdateGeometry(){
// clean-up previous geometry
G4SolidStore::GetInstance()->Clean();
G4LogicalVolumeStore::GetInstance()->Clean();
G4PhysicalVolumeStore::GetInstance()->Clean();
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();
}
//define new one
G4RunManager::GetRunManager()->DefineWorldVolume(ConstructDetector());
G4RunManager::GetRunManager()->GeometryHasBeenModified();
}
----------------------
PMT sensitive detector
----------------------
************************
*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);
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
@@ -103,59 +160,36 @@ 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;
}
//...
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") );
--------------------------------------------------------
Selectively drawing trajectories or highlighting volumes
--------------------------------------------------------
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
@@ -181,15 +215,13 @@ 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
------
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
@@ -198,9 +230,10 @@ 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*
****************************
--------------------------
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
@@ -226,38 +259,9 @@ 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 LXeRecorderBase.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.
-----------
UI commands
-----------
Directories:
/LXe/ - All custom commands belong below this directory
@@ -320,10 +324,6 @@ geometry uses a default value of 15 fibers.
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.
@@ -341,217 +341,3 @@ scintillator volume.
-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
**************
*Classes Used*
**************
main()
------
See LXe.cc.
==> 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
-76
View File
@@ -1,76 +0,0 @@
#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) Run initialize - do this only once
/run/initialize
#3b)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
#3c)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
+20 -4
View File
@@ -6,7 +6,14 @@
##
#################
/control/execute defaults.mac
/run/initialize
/control/verbose 1
/tracking/verbose 0
/run/verbose 1
/LXe/eventVerbose 0
/LXe/detector/defaults
/LXe/oneStepPrimaries false
#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,
@@ -17,13 +24,12 @@
/LXe/detector/nx 20
/LXe/detector/ny 20
/LXe/detector/nz 0
/LXe/detector/nz 1
/LXe/detector/dimensions 60 60 25 cm
/LXe/detector/housingThickness 0.0635 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
@@ -33,4 +39,14 @@
/LXe/oneStepPrimaries true
#reset from a random seed that shows a good cone
/random/resetEngineFrom random/goodCerenkov.rndm
#/random/resetEngineFrom random/goodCerenkov.rndm
/analysis/h1/set 1 100 -1 50
/analysis/h1/set 2 100 -1 50
/analysis/h1/set 4 100 -1 200
/analysis/h1/set 5 100 -1 200
/analysis/h1/set 6 100 -1 50
/analysis/h1/set 7 100 0 20 MeV
/run/printProgress 1000
/run/beamOn 100000
@@ -1,6 +0,0 @@
#Resets all defaults
/LXe/detector/defaults
/LXe/detector/update
/LXe/oneStepPrimaries false
/gun/particle gamma
/gun/energy 511 keV
+1 -15
View File
@@ -28,18 +28,4 @@
/gui/addButton gun "neutron" "/gun/particle neutron"
/gui/addButton gun "proton" "/gun/particle proton"
#
# Field menu :
#/gui/addMenu field Field
#/gui/addButton field "off" "/B2/det/setField 0.2 tesla"
#/gui/addButton field "0.2 tesla" "/B2/det/setField 0.2 tesla"
#/gui/addButton field "2.0 tesla" "/B2/det/setField 2.0 tesla"
#
# Viewer menu :
/gui/addMenu viewer Viewer
/gui/addButton viewer "Set style surface" "/vis/viewer/set/style surface"
/gui/addButton viewer "Set style wireframe" "/vis/viewer/set/style wireframe"
/gui/addButton viewer "Refresh viewer" "/vis/viewer/refresh"
/gui/addButton viewer "Update viewer (interaction or end-of-file)" "/vis/viewer/update"
/gui/addButton viewer "Flush viewer (= refresh + update)" "/vis/viewer/flush"
/gui/addButton viewer "Update scene" "/vis/scene/notifyHandlers"
#
@@ -33,8 +33,6 @@
#include "G4VUserActionInitialization.hh"
class LXeRecorderBase;
class B4DetectorConstruction;
/// Action initialization class.
@@ -43,16 +41,13 @@ class B4DetectorConstruction;
class LXeActionInitialization : public G4VUserActionInitialization
{
public:
LXeActionInitialization(LXeRecorderBase*);
LXeActionInitialization();
virtual ~LXeActionInitialization();
virtual void BuildForMaster() const;
virtual void Build() const;
virtual G4VSteppingVerbose* InitializeSteppingVerbose() const;
private:
LXeRecorderBase* fRecorder;
};
#endif
@@ -1,68 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeEMPhysics.hh 81557 2014-06-03 08:32:44Z gcosmo $
//
/// \file optical/LXe/include/LXeEMPhysics.hh
/// \brief Definition of the LXeEMPhysics class
//
//
#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 "G4eMultipleScattering.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();
};
#endif
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeEventAction.hh 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeEventAction.hh 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/include/LXeEventAction.hh
/// \brief Definition of the LXeEventAction class
@@ -38,13 +38,12 @@
#include "G4ThreeVector.hh"
class G4Event;
class LXeRecorderBase;
class LXeEventAction : public G4UserEventAction
{
public:
LXeEventAction(LXeRecorderBase*);
LXeEventAction();
virtual ~LXeEventAction();
public:
@@ -61,9 +60,45 @@ class LXeEventAction : public G4UserEventAction
void SetForceDrawPhotons(G4bool b){fForcedrawphotons=b;}
void SetForceDrawNoPhotons(G4bool b){fForcenophotons=b;}
void IncPhotonCount_Scint(){fPhotonCount_Scint++;}
void IncPhotonCount_Ceren(){fPhotonCount_Ceren++;}
void IncEDep(G4double dep){fTotE+=dep;}
void IncAbsorption(){fAbsorptionCount++;}
void IncBoundaryAbsorption(){fBoundaryAbsorptionCount++;}
void IncHitCount(G4int i=1){fHitCount+=i;}
void SetEWeightPos(const G4ThreeVector& p){fEWeightPos=p;}
void SetReconPos(const G4ThreeVector& p){fReconPos=p;}
void SetConvPos(const G4ThreeVector& p){fConvPos=p;fConvPosSet=true;}
void SetPosMax(const G4ThreeVector& p,G4double edep) {
fPosMax = p;
fEdepMax = edep;
}
G4int GetPhotonCount_Scint()const {return fPhotonCount_Scint;}
G4int GetPhotonCount_Ceren()const {return fPhotonCount_Ceren;}
G4int GetHitCount()const {return fHitCount;}
G4double GetEDep()const {return fTotE;}
G4int GetAbsorptionCount()const {return fAbsorptionCount;}
G4int GetBoundaryAbsorptionCount() const {return fBoundaryAbsorptionCount;}
G4ThreeVector GetEWeightPos(){return fEWeightPos;}
G4ThreeVector GetReconPos(){return fReconPos;}
G4ThreeVector GetConvPos(){return fConvPos;}
G4ThreeVector GetPosMax(){return fPosMax;}
G4double GetEDepMax(){return fEdepMax;}
G4double IsConvPosSet(){return fConvPosSet;}
//Gets the total photon count produced
G4int GetPhotonCount(){return fPhotonCount_Scint+fPhotonCount_Ceren;}
void IncPMTSAboveThreshold(){fPMTsAboveThreshold++;}
G4int GetPMTSAboveThreshold(){return fPMTsAboveThreshold;}
private:
LXeRecorderBase* fRecorder;
LXeEventMessenger* fEventMessenger;
G4int fSaveThreshold;
@@ -78,6 +113,28 @@ class LXeEventAction : public G4UserEventAction
G4bool fForcedrawphotons;
G4bool fForcenophotons;
G4int fHitCount;
G4int fPhotonCount_Scint;
G4int fPhotonCount_Ceren;
G4int fAbsorptionCount;
G4int fBoundaryAbsorptionCount;
G4double fTotE;
//These only have meaning if totE > 0
//If totE = 0 then these wont be set by EndOfEventAction
G4ThreeVector fEWeightPos;
G4ThreeVector fReconPos; //Also relies on hitCount>0
G4ThreeVector fConvPos;//true (initial) converstion position
G4bool fConvPosSet;
G4ThreeVector fPosMax;
G4double fEdepMax;
G4int fPMTsAboveThreshold;
};
#endif
@@ -1,58 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeGeneralPhysics.hh 90338 2015-05-26 08:35:43Z gcosmo $
//
/// \file optical/LXe/include/LXeGeneralPhysics.hh
/// \brief Definition of the LXeGeneralPhysics class
//
//
#ifndef LXeGeneralPhysics_h
#define LXeGeneralPhysics_h 1
#include "globals.hh"
#include "G4ios.hh"
#include "G4VPhysicsConstructor.hh"
class LXeGeneralPhysics : public G4VPhysicsConstructor
{
public:
LXeGeneralPhysics(const G4String& name = "general");
virtual ~LXeGeneralPhysics();
// 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();
};
#endif
@@ -23,21 +23,37 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeUserEventInformation.cc 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/src/LXeUserEventInformation.cc
/// \brief Implementation of the LXeUserEventInformation class
/// \file optical/LXe/include/LXeHistoManager.hh
/// \brief Definition of the LXeHistoManager class
//
//
#include "LXeUserEventInformation.hh"
// $Id: LXeHistoManager.hh
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef LXeHistoManager_h
#define LXeHistoManager_h 1
#include "globals.hh"
#include "g4root.hh"
//#include "g4xml.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeUserEventInformation::LXeUserEventInformation()
:fHitCount(0),fPhotonCount_Scint(0),fPhotonCount_Ceren(0),fAbsorptionCount(0),
fBoundaryAbsorptionCount(0),fTotE(0.),fEWeightPos(0.),fReconPos(0.),fConvPos(0.),
fConvPosSet(false),fPosMax(0.),fEdepMax(0.),fPMTsAboveThreshold(0) {}
class LXeHistoManager
{
public:
LXeHistoManager();
~LXeHistoManager();
private:
void Book();
G4String fFileName;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeUserEventInformation::~LXeUserEventInformation() {}
#endif
@@ -1,65 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeMuonPhysics.hh 85587 2014-10-31 09:12:28Z gcosmo $
//
/// \file optical/LXe/include/LXeMuonPhysics.hh
/// \brief Definition of the LXeMuonPhysics class
//
//
#ifndef LXeMuonPhysics_h
#define LXeMuonPhysics_h 1
#include "globals.hh"
#include "G4ios.hh"
#include "G4VPhysicsConstructor.hh"
#include "G4MuMultipleScattering.hh"
#include "G4MuBremsstrahlung.hh"
#include "G4MuPairProduction.hh"
#include "G4MuIonisation.hh"
#include "G4hIonisation.hh"
#include "G4MuonMinusCapture.hh"
class LXeMuonPhysics : public G4VPhysicsConstructor
{
public:
LXeMuonPhysics(const G4String& name="muon");
virtual ~LXeMuonPhysics();
// 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();
};
#endif
@@ -1,52 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXePhysicsList.hh 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/include/LXePhysicsList.hh
/// \brief Definition of the LXePhysicsList class
//
//
#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
@@ -1,94 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeRecorderBase.hh 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/include/LXeRecorderBase.hh
/// \brief Definition of the LXeRecorderBase class
//
// LXeRecorderBase.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 LXeRecorderBase {
public:
virtual ~LXeRecorderBase() {};
// 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
@@ -23,67 +23,71 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeGeneralPhysics.cc 100259 2016-10-17 08:02:30Z gcosmo $
/// \file optical/LXe/include/Run.hh
/// \brief Definition of the Run class
//
/// \file optical/LXe/src/LXeGeneralPhysics.cc
/// \brief Implementation of the LXeGeneralPhysics class
// $Id: Run.hh 71375 2013-06-14 07:39:33Z maire $
//
//
#include "LXeGeneralPhysics.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#ifndef LXeRun_h
#define LXeRun_h 1
#include "G4Run.hh"
#include "globals.hh"
#include "G4ios.hh"
#include <iomanip>
#include "G4Decay.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeGeneralPhysics::LXeGeneralPhysics(const G4String& name)
: G4VPhysicsConstructor(name) {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeGeneralPhysics::~LXeGeneralPhysics() {
//fDecayProcess = NULL;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4ParticleDefinition.hh"
#include "G4ProcessManager.hh"
#include "G4Geantino.hh"
#include "G4ChargedGeantino.hh"
#include "G4GenericIon.hh"
#include "G4Proton.hh"
void LXeGeneralPhysics::ConstructParticle()
class LXeRun : public G4Run
{
// pseudo-particles
G4Geantino::GeantinoDefinition();
G4ChargedGeantino::ChargedGeantinoDefinition();
public:
LXeRun();
~LXeRun();
G4GenericIon::GenericIonDefinition();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeGeneralPhysics::ConstructProcess()
{
G4Decay* fDecayProcess = new G4Decay();
// Add Decay Process
auto particleIterator=GetParticleIterator();
particleIterator->reset();
while( (*particleIterator)() ){
G4ParticleDefinition* particle = particleIterator->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);
void IncPhotonCount_Scint(G4int count) {
fPhotonCount_Scint += count;
fPhotonCount_Scint2 += count*count;
}
}
}
void IncPhotonCount_Ceren(G4int count) {
fPhotonCount_Ceren += count;
fPhotonCount_Ceren2 += count*count;
}
void IncEDep(G4double dep) {
fTotE += dep;
fTotE2 += dep*dep;
}
void IncAbsorption(G4int count) {
fAbsorptionCount += count;
fAbsorptionCount2 += count*count;
}
void IncBoundaryAbsorption(G4int count) {
fBoundaryAbsorptionCount += count;
fBoundaryAbsorptionCount2 += count*count;
}
void IncHitCount(G4int count) {
fHitCount += count;
fHitCount2 += count*count;
}
void IncHitsAboveThreshold(G4int count) {
fPMTsAboveThreshold += count;
fPMTsAboveThreshold2 += count*count;
}
virtual void Merge(const G4Run* run);
void EndOfRun();
private:
G4int fHitCount, fHitCount2;
G4int fPhotonCount_Scint, fPhotonCount_Scint2;
G4int fPhotonCount_Ceren, fPhotonCount_Ceren2;
G4int fAbsorptionCount, fAbsorptionCount2;
G4int fBoundaryAbsorptionCount, fBoundaryAbsorptionCount2;
G4int fPMTsAboveThreshold, fPMTsAboveThreshold2;
G4double fTotE, fTotE2;
};
#endif // LXeRun_h
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeRunAction.hh 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeRunAction.hh 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/include/LXeRunAction.hh
/// \brief Definition of the LXeRunAction class
@@ -34,21 +34,25 @@
#ifndef LXeRunAction_h
#define LXeRunAction_h 1
class LXeRecorderBase;
class LXeRun;
class LXeHistoManager;
class G4Run;
class LXeRunAction : public G4UserRunAction
{
public:
LXeRunAction(LXeRecorderBase*);
LXeRunAction();
virtual ~LXeRunAction();
virtual G4Run* GenerateRun();
virtual void BeginOfRunAction(const G4Run*);
virtual void EndOfRunAction(const G4Run*);
private:
LXeRecorderBase* fRecorder;
LXeRun* fRun;
LXeHistoManager* fHistoManager;
};
#endif
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeStackingAction.hh 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeStackingAction.hh 109652 2018-05-04 08:49:34Z gcosmo $
//
/// \file optical/LXe/include/LXeStackingAction.hh
/// \brief Definition of the LXeStackingAction class
@@ -35,11 +35,13 @@
#include "globals.hh"
#include "G4UserStackingAction.hh"
class LXeEventAction;
class LXeStackingAction : public G4UserStackingAction
{
public:
LXeStackingAction();
LXeStackingAction(LXeEventAction*);
virtual ~LXeStackingAction();
virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track* aTrack);
@@ -47,6 +49,7 @@ class LXeStackingAction : public G4UserStackingAction
virtual void PrepareNewEvent();
private:
LXeEventAction* fEventAction;
};
#endif
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeSteppingAction.hh 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeSteppingAction.hh 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/include/LXeSteppingAction.hh
/// \brief Definition of the LXeSteppingAction class
@@ -36,7 +36,6 @@
#include "G4OpBoundaryProcess.hh"
class LXeRecorderBase;
class LXeEventAction;
class LXeTrackingAction;
class LXeSteppingMessenger;
@@ -45,7 +44,7 @@ class LXeSteppingAction : public G4UserSteppingAction
{
public:
LXeSteppingAction(LXeRecorderBase*);
LXeSteppingAction(LXeEventAction*);
virtual ~LXeSteppingAction();
virtual void UserSteppingAction(const G4Step*);
@@ -54,9 +53,9 @@ class LXeSteppingAction : public G4UserSteppingAction
private:
LXeRecorderBase* fRecorder;
G4bool fOneStepPrimaries;
LXeSteppingMessenger* fSteppingMessenger;
LXeEventAction* fEventAction;
G4OpBoundaryProcessStatus fExpectedNextStatus;
};
@@ -1,51 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeSteppingVerbose.hh 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/include/LXeSteppingVerbose.hh
/// \brief Definition of the LXeSteppingVerbose class
//
//
#ifndef LXeSteppingVerbose_h
#define LXeSteppingVerbose_h 1
#include "G4SteppingVerbose.hh"
class LXeSteppingVerbose : public G4SteppingVerbose
{
public:
LXeSteppingVerbose();
virtual ~LXeSteppingVerbose();
virtual void StepInfo();
virtual void TrackingStarted();
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#endif
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeTrackingAction.hh 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeTrackingAction.hh 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/include/LXeTrackingAction.hh
/// \brief Definition of the LXeTrackingAction class
@@ -35,13 +35,11 @@
#include "G4UserTrackingAction.hh"
#include "globals.hh"
class LXeRecorderBase;
class LXeTrackingAction : public G4UserTrackingAction {
public:
LXeTrackingAction(LXeRecorderBase*);
LXeTrackingAction();
virtual ~LXeTrackingAction() {};
virtual void PreUserTrackingAction(const G4Track*);
@@ -49,8 +47,6 @@ class LXeTrackingAction : public G4UserTrackingAction {
private:
LXeRecorderBase* fRecorder;
};
#endif
@@ -1,102 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeUserEventInformation.hh 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/include/LXeUserEventInformation.hh
/// \brief Definition of the LXeUserEventInformation class
//
#include "G4VUserEventInformation.hh"
#include "G4ThreeVector.hh"
#include "globals.hh"
#ifndef LXeUserEventInformation_h
#define LXeUserEventInformation_h 1
class LXeUserEventInformation : public G4VUserEventInformation
{
public:
LXeUserEventInformation();
virtual ~LXeUserEventInformation();
inline virtual void Print()const{};
void IncPhotonCount_Scint(){fPhotonCount_Scint++;}
void IncPhotonCount_Ceren(){fPhotonCount_Ceren++;}
void IncEDep(G4double dep){fTotE+=dep;}
void IncAbsorption(){fAbsorptionCount++;}
void IncBoundaryAbsorption(){fBoundaryAbsorptionCount++;}
void IncHitCount(G4int i=1){fHitCount+=i;}
void SetEWeightPos(const G4ThreeVector& p){fEWeightPos=p;}
void SetReconPos(const G4ThreeVector& p){fReconPos=p;}
void SetConvPos(const G4ThreeVector& p){fConvPos=p;fConvPosSet=true;}
void SetPosMax(const G4ThreeVector& p,G4double edep){fPosMax=p;fEdepMax=edep;}
G4int GetPhotonCount_Scint()const {return fPhotonCount_Scint;}
G4int GetPhotonCount_Ceren()const {return fPhotonCount_Ceren;}
G4int GetHitCount()const {return fHitCount;}
G4double GetEDep()const {return fTotE;}
G4int GetAbsorptionCount()const {return fAbsorptionCount;}
G4int GetBoundaryAbsorptionCount() const {return fBoundaryAbsorptionCount;}
G4ThreeVector GetEWeightPos(){return fEWeightPos;}
G4ThreeVector GetReconPos(){return fReconPos;}
G4ThreeVector GetConvPos(){return fConvPos;}
G4ThreeVector GetPosMax(){return fPosMax;}
G4double GetEDepMax(){return fEdepMax;}
G4double IsConvPosSet(){return fConvPosSet;}
//Gets the total photon count produced
G4int GetPhotonCount(){return fPhotonCount_Scint+fPhotonCount_Ceren;}
void IncPMTSAboveThreshold(){fPMTsAboveThreshold++;}
G4int GetPMTSAboveThreshold(){return fPMTsAboveThreshold;}
private:
G4int fHitCount;
G4int fPhotonCount_Scint;
G4int fPhotonCount_Ceren;
G4int fAbsorptionCount;
G4int fBoundaryAbsorptionCount;
G4double fTotE;
//These only have meaning if totE > 0
//If totE = 0 then these wont be set by EndOfEventAction
G4ThreeVector fEWeightPos;
G4ThreeVector fReconPos; //Also relies on hitCount>0
G4ThreeVector fConvPos;//true (initial) converstion position
G4bool fConvPosSet;
G4ThreeVector fPosMax;
G4double fEdepMax;
G4int fPMTsAboveThreshold;
};
#endif
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeWLSFiber.hh 110132 2018-05-16 06:48:25Z gcosmo $
// $Id: LXeWLSFiber.hh 108789 2018-03-07 08:42:56Z gcosmo $
//
/// \file optical/LXe/include/LXeWLSFiber.hh
/// \brief Definition of the LXeWLSFiber class
+3
View File
@@ -1,8 +1,11 @@
#This sets the gun up to shoot an optical photon
/run/initialize
/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
/run/beamOn 1
@@ -1,6 +1,7 @@
#quickly review a particular event
#replace file name with that of the correct event
/run/initialize
/random/resetEngineFrom random/run0.rndm
/tracking/verbose 1
/run/beamOn
@@ -37,14 +37,11 @@
#include "LXeTrackingAction.hh"
#include "LXeSteppingAction.hh"
#include "LXeStackingAction.hh"
#include "LXeSteppingVerbose.hh"
#include "LXeRecorderBase.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeActionInitialization::LXeActionInitialization(LXeRecorderBase* recorder)
: G4VUserActionInitialization(), fRecorder(recorder)
LXeActionInitialization::LXeActionInitialization()
: G4VUserActionInitialization()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -56,7 +53,7 @@ LXeActionInitialization::~LXeActionInitialization()
void LXeActionInitialization::BuildForMaster() const
{
SetUserAction(new LXeRunAction(fRecorder));
SetUserAction(new LXeRunAction());
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -65,19 +62,13 @@ void LXeActionInitialization::Build() const
{
SetUserAction(new LXePrimaryGeneratorAction());
SetUserAction(new LXeStackingAction());
LXeEventAction* eventAction = new LXeEventAction();
SetUserAction(eventAction);
SetUserAction(new LXeStackingAction(eventAction));
SetUserAction(new LXeRunAction(fRecorder));
SetUserAction(new LXeEventAction(fRecorder));
SetUserAction(new LXeTrackingAction(fRecorder));
SetUserAction(new LXeSteppingAction(fRecorder));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4VSteppingVerbose* LXeActionInitialization::InitializeSteppingVerbose() const
{
return new LXeSteppingVerbose();
SetUserAction(new LXeRunAction());
SetUserAction(new LXeTrackingAction());
SetUserAction(new LXeSteppingAction(eventAction));
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeDetectorConstruction.cc 104474 2017-06-01 07:35:19Z gcosmo $
// $Id: LXeDetectorConstruction.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeDetectorConstruction.cc
/// \brief Implementation of the LXeDetectorConstruction class
@@ -66,19 +66,20 @@ G4bool LXeDetectorConstruction::fSphereOn = true;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeDetectorConstruction::LXeDetectorConstruction()
: fLXe_mt(NULL), fMPTPStyrene(NULL)
: fLXe_mt(nullptr), fMPTPStyrene(nullptr)
{
fExperimentalHall_box = NULL;
fExperimentalHall_log = NULL;
fExperimentalHall_phys = NULL;
fExperimentalHall_box = nullptr;
fExperimentalHall_log = nullptr;
fExperimentalHall_phys = nullptr;
fLXe = fAl = fAir = fVacuum = fGlass = NULL;
fPstyrene = fPMMA = fPethylene1 = fPethylene2 = NULL;
fLXe = fAl = fAir = fVacuum = fGlass = nullptr;
fPstyrene = fPMMA = fPethylene1 = fPethylene2 = nullptr;
fN = fO = fC = fH = NULL;
fN = fO = fC = fH = nullptr;
SetDefaults();
DefineMaterials();
fDetectorMessenger = new LXeDetectorMessenger(this);
}
@@ -250,7 +251,6 @@ G4VPhysicalVolume* LXeDetectorConstruction::Construct(){
G4LogicalBorderSurface::CleanSurfaceTable();
}
DefineMaterials();
return ConstructDetector();
}
@@ -357,44 +357,52 @@ void LXeDetectorConstruction::ConstructSDandField() {
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetDimensions(G4ThreeVector dims) {
this->fScint_x=dims[0];
this->fScint_y=dims[1];
this->fScint_z=dims[2];
//this->fScint_x=dims[0];
//this->fScint_y=dims[1];
//this->fScint_z=dims[2];
fScint_x=dims[0];
fScint_y=dims[1];
fScint_z=dims[2];
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetHousingThickness(G4double d_mtl) {
this->fD_mtl=d_mtl;
//this->fD_mtl=d_mtl;
fD_mtl=d_mtl;
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetNX(G4int nx) {
this->fNx=nx;
//this->fNx=nx;
fNx=nx;
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetNY(G4int ny) {
this->fNy=ny;
//this->fNy=ny;
fNy=ny;
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetNZ(G4int nz) {
this->fNz=nz;
//this->fNz=nz;
fNz=nz;
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeDetectorConstruction::SetPMTRadius(G4double outerRadius_pmt) {
this->fOuterRadius_pmt=outerRadius_pmt;
//this->fOuterRadius_pmt=outerRadius_pmt;
fOuterRadius_pmt=outerRadius_pmt;
G4RunManager::GetRunManager()->ReinitializeGeometry();
}
@@ -416,13 +424,13 @@ void LXeDetectorConstruction::SetDefaults() {
fOuterRadius_pmt = 2.3*cm;
fSphereOn = true;
fRefl=1.0;
fRefl = 1.0;
fNfibers=15;
fWLSslab=false;
fMainVolumeOn=true;
fMainVolume=NULL;
fSlab_z=2.5*mm;
fNfibers = 15;
fWLSslab = false;
fMainVolumeOn = true;
fMainVolume = nullptr;
fSlab_z = 2.5*mm;
G4UImanager::GetUIpointer()
->ApplyCommand("/LXe/detector/scintYieldFactor 1.");
@@ -1,127 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeEMPhysics.cc 81557 2014-06-03 08:32:44Z gcosmo $
//
/// \file optical/LXe/src/LXeEMPhysics.cc
/// \brief Implementation of the LXeEMPhysics class
//
//
#include "LXeEMPhysics.hh"
#include "globals.hh"
#include "G4ios.hh"
#include <iomanip>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeEMPhysics::LXeEMPhysics(const G4String& name)
: G4VPhysicsConstructor(name)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeEMPhysics::~LXeEMPhysics() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#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();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4ProcessManager.hh"
void LXeEMPhysics::ConstructProcess()
{
G4PhotoElectricEffect* fPhotoEffect =
new G4PhotoElectricEffect();
G4ComptonScattering* fComptonEffect =
new G4ComptonScattering();
G4GammaConversion* fPairProduction =
new G4GammaConversion();
// Electron physics
G4eMultipleScattering* fElectronMultipleScattering =
new G4eMultipleScattering();
G4eIonisation* fElectronIonisation =
new G4eIonisation();
G4eBremsstrahlung* fElectronBremsStrahlung =
new G4eBremsstrahlung();
//Positron physics
G4eMultipleScattering* fPositronMultipleScattering =
new G4eMultipleScattering();
G4eIonisation* fPositronIonisation =
new G4eIonisation();
G4eBremsstrahlung* fPositronBremsStrahlung =
new G4eBremsstrahlung();
G4eplusAnnihilation* fAnnihilation =
new G4eplusAnnihilation();
G4ProcessManager* pManager = 0;
// Gamma Physics
pManager = G4Gamma::Gamma()->GetProcessManager();
pManager->AddDiscreteProcess(fPhotoEffect);
pManager->AddDiscreteProcess(fComptonEffect);
pManager->AddDiscreteProcess(fPairProduction);
// Electron Physics
pManager = G4Electron::Electron()->GetProcessManager();
pManager->AddProcess(fElectronMultipleScattering, -1, 1, 1);
pManager->AddProcess(fElectronIonisation, -1, 2, 2);
pManager->AddProcess(fElectronBremsStrahlung, -1, 3, 3);
//Positron Physics
pManager = G4Positron::Positron()->GetProcessManager();
pManager->AddProcess(fPositronMultipleScattering, -1, 1, 1);
pManager->AddProcess(fPositronIonisation, -1, 2, 2);
pManager->AddProcess(fPositronBremsStrahlung, -1, 3, 3);
pManager->AddProcess(fAnnihilation, 0,-1, 4);
}
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeEventAction.cc 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeEventAction.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeEventAction.cc
/// \brief Implementation of the LXeEventAction class
@@ -32,9 +32,9 @@
#include "LXeEventAction.hh"
#include "LXeScintHit.hh"
#include "LXePMTHit.hh"
#include "LXeUserEventInformation.hh"
#include "LXeTrajectory.hh"
#include "LXeRecorderBase.hh"
#include "LXeRun.hh"
#include "LXeHistoManager.hh"
#include "G4EventManager.hh"
#include "G4SDManager.hh"
@@ -50,11 +50,23 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeEventAction::LXeEventAction(LXeRecorderBase* r)
: fRecorder(r),fSaveThreshold(0),fScintCollID(-1),fPMTCollID(-1),fVerbose(0),
LXeEventAction::LXeEventAction()
: fSaveThreshold(0),fScintCollID(-1),fPMTCollID(-1),fVerbose(0),
fPMTThreshold(1),fForcedrawphotons(false),fForcenophotons(false)
{
fEventMessenger = new LXeEventMessenger(this);
fHitCount = 0;
fPhotonCount_Scint = 0;
fPhotonCount_Ceren = 0;
fAbsorptionCount = 0;
fBoundaryAbsorptionCount = 0;
fTotE = 0.0;
fConvPosSet = false;
fEdepMax = 0.0;
fPMTsAboveThreshold = 0;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -63,28 +75,31 @@ LXeEventAction::~LXeEventAction(){}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeEventAction::BeginOfEventAction(const G4Event* anEvent){
void LXeEventAction::BeginOfEventAction(const G4Event*) {
//New event, add the user information object
G4EventManager::
GetEventManager()->SetUserInformation(new LXeUserEventInformation);
fHitCount = 0;
fPhotonCount_Scint = 0;
fPhotonCount_Ceren = 0;
fAbsorptionCount = 0;
fBoundaryAbsorptionCount = 0;
fTotE = 0.0;
fConvPosSet = false;
fEdepMax = 0.0;
fPMTsAboveThreshold = 0;
G4SDManager* SDman = G4SDManager::GetSDMpointer();
if(fScintCollID<0)
fScintCollID=SDman->GetCollectionID("scintCollection");
if(fPMTCollID<0)
fPMTCollID=SDman->GetCollectionID("pmtHitCollection");
if(fRecorder)fRecorder->RecordBeginOfEvent(anEvent);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeEventAction::EndOfEventAction(const G4Event* anEvent){
LXeUserEventInformation* eventInformation
=(LXeUserEventInformation*)anEvent->GetUserInformation();
G4TrajectoryContainer* trajectoryContainer=anEvent->GetTrajectoryContainer();
G4int n_trajectories = 0;
@@ -103,14 +118,18 @@ void LXeEventAction::EndOfEventAction(const G4Event* anEvent){
}
}
LXeScintHitsCollection* scintHC = 0;
LXePMTHitsCollection* pmtHC = 0;
LXeScintHitsCollection* scintHC = nullptr;
LXePMTHitsCollection* pmtHC = nullptr;
G4HCofThisEvent* hitsCE = anEvent->GetHCofThisEvent();
//Get the hit collections
if(hitsCE){
if(fScintCollID>=0)scintHC = (LXeScintHitsCollection*)(hitsCE->GetHC(fScintCollID));
if(fPMTCollID>=0)pmtHC = (LXePMTHitsCollection*)(hitsCE->GetHC(fPMTCollID));
if(fScintCollID>=0) {
scintHC = (LXeScintHitsCollection*)(hitsCE->GetHC(fScintCollID));
}
if(fPMTCollID>=0) {
pmtHC = (LXePMTHitsCollection*)(hitsCE->GetHC(fPMTCollID));
}
}
//Hits in scintillator
@@ -122,21 +141,25 @@ void LXeEventAction::EndOfEventAction(const G4Event* anEvent){
for(int i=0;i<n_hit;i++){ //gather info on hits in scintillator
edep=(*scintHC)[i]->GetEdep();
eventInformation->IncEDep(edep); //sum up the edep
fTotE += edep;
eWeightPos += (*scintHC)[i]->GetPos()*edep;//calculate energy weighted pos
if(edep>edepMax){
edepMax=edep;//store max energy deposit
G4ThreeVector posMax=(*scintHC)[i]->GetPos();
eventInformation->SetPosMax(posMax,edep);
fPosMax = posMax;
fEdepMax = edep;
}
}
if(eventInformation->GetEDep()==0.){
G4AnalysisManager::Instance()->FillH1(7, fTotE);
if(fTotE == 0.){
if(fVerbose>0)G4cout<<"No hits in the scintillator this event."<<G4endl;
}
else{
//Finish calculation of energy weighted position
eWeightPos/=eventInformation->GetEDep();
eventInformation->SetEWeightPos(eWeightPos);
eWeightPos /= fTotE;
fEWeightPos = eWeightPos;
if(fVerbose>0){
G4cout << "\tEnergy weighted position of hits in LXe : "
<< eWeightPos/mm << G4endl;
@@ -144,7 +167,7 @@ void LXeEventAction::EndOfEventAction(const G4Event* anEvent){
}
if(fVerbose>0){
G4cout << "\tTotal energy deposition in scintillator : "
<< eventInformation->GetEDep() / keV << " (keV)" << G4endl;
<< fTotE / keV << " (keV)" << G4endl;
}
}
@@ -153,55 +176,72 @@ void LXeEventAction::EndOfEventAction(const G4Event* anEvent){
G4int pmts=pmtHC->entries();
//Gather info from all PMTs
for(G4int i=0;i<pmts;i++){
eventInformation->IncHitCount((*pmtHC)[i]->GetPhotonCount());
fHitCount += (*pmtHC)[i]->GetPhotonCount();
reconPos+=(*pmtHC)[i]->GetPMTPos()*(*pmtHC)[i]->GetPhotonCount();
if((*pmtHC)[i]->GetPhotonCount()>=fPMTThreshold){
eventInformation->IncPMTSAboveThreshold();
fPMTsAboveThreshold++;
}
else{//wasnt above the threshold, turn it back off
(*pmtHC)[i]->SetDrawit(false);
}
}
if(eventInformation->GetHitCount()>0){//dont bother unless there were hits
reconPos/=eventInformation->GetHitCount();
G4AnalysisManager::Instance()->FillH1(1, fHitCount);
G4AnalysisManager::Instance()->FillH1(2, fPMTsAboveThreshold);
if(fHitCount > 0) {//dont bother unless there were hits
reconPos/=fHitCount;
if(fVerbose>0){
G4cout << "\tReconstructed position of hits in LXe : "
<< reconPos/mm << G4endl;
}
eventInformation->SetReconPos(reconPos);
fReconPos = reconPos;
}
pmtHC->DrawAllHits();
}
G4AnalysisManager::Instance()->FillH1(3, fPhotonCount_Scint);
G4AnalysisManager::Instance()->FillH1(4, fPhotonCount_Ceren);
G4AnalysisManager::Instance()->FillH1(5, fAbsorptionCount);
G4AnalysisManager::Instance()->FillH1(6, fBoundaryAbsorptionCount);
if(fVerbose>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;
<< fHitCount << G4endl;
G4cout << "\tNumber of PMTs above threshold("<<fPMTThreshold<<") : "
<< eventInformation->GetPMTSAboveThreshold() << G4endl;
<< fPMTsAboveThreshold << G4endl;
G4cout << "\tNumber of photons produced by scintillation in this event : "
<< eventInformation->GetPhotonCount_Scint() << G4endl;
<< fPhotonCount_Scint << G4endl;
G4cout << "\tNumber of photons produced by cerenkov in this event : "
<< eventInformation->GetPhotonCount_Ceren() << G4endl;
<< fPhotonCount_Ceren << G4endl;
G4cout << "\tNumber of photons absorbed (OpAbsorption) in this event : "
<< eventInformation->GetAbsorptionCount() << G4endl;
<< fAbsorptionCount << 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())
<< "this event : " << fBoundaryAbsorptionCount << G4endl;
G4cout << "Unaccounted for photons in this event : "
<< (fPhotonCount_Scint + fPhotonCount_Ceren -
fAbsorptionCount - fHitCount - fBoundaryAbsorptionCount)
<< G4endl;
}
//If we have set the flag to save 'special' events, save here
if(fSaveThreshold&&eventInformation->GetPhotonCount() <= fSaveThreshold)
G4RunManager::GetRunManager()->rndmSaveThisEvent();
if(fRecorder)fRecorder->RecordEndOfEvent(anEvent);
// update the run statistics
LXeRun* run = static_cast<LXeRun*>(
G4RunManager::GetRunManager()->GetNonConstCurrentRun());
run->IncHitCount(fHitCount);
run->IncPhotonCount_Scint(fPhotonCount_Scint);
run->IncPhotonCount_Ceren(fPhotonCount_Ceren);
run->IncEDep(fTotE);
run->IncAbsorption(fAbsorptionCount);
run->IncBoundaryAbsorption(fBoundaryAbsorptionCount);
run->IncHitsAboveThreshold(fPMTsAboveThreshold);
//If we have set the flag to save 'special' events, save here
if (fSaveThreshold &&
(fPhotonCount_Scint + fPhotonCount_Ceren <= fSaveThreshold))
G4RunManager::GetRunManager()->rndmSaveThisEvent();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeEventMessenger.cc 70256 2013-05-28 07:29:30Z gcosmo $
// $Id: LXeEventMessenger.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeEventMessenger.cc
/// \brief Implementation of the LXeEventMessenger class
@@ -95,6 +95,5 @@ void LXeEventMessenger::SetNewValue(G4UIcommand* command, G4String newValue){
else if(command == fForceDrawNoPhotonsCmd){
fLXeEvent->SetForceDrawNoPhotons(fForceDrawNoPhotonsCmd
->GetNewBoolValue(newValue));
G4cout<<"TEST"<<G4endl;
}
}
@@ -0,0 +1,93 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
/// \file optical/LXe/src/LXeHistoManager.cc
/// \brief Implementation of the LXeHistoManager class
//
//
// $Id: LXeHistoManager.cc
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "LXeHistoManager.hh"
#include "G4UnitsTable.hh"
//#include<vector>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeHistoManager::LXeHistoManager()
: fFileName("lxe")
{
Book();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeHistoManager::~LXeHistoManager()
{
delete G4AnalysisManager::Instance();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeHistoManager::Book()
{
// Create or get analysis manager
// The choice of analysis technology is done via selection of a namespace
// in LXeHistoManager.hh
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
analysisManager->SetFileName(fFileName);
analysisManager->SetVerboseLevel(1);
analysisManager->SetActivation(true); // enable inactivation of histograms
// Define histogram indices, titles
std::vector<std::pair<G4String, G4String> > histograms =
{ std::pair<G4String, G4String>("0", "dummy"),
std::pair<G4String, G4String>("1", "hits per event"),
std::pair<G4String, G4String>("2", "hits per event above threshold"),
std::pair<G4String, G4String>("3", "scintillation photons per event"),
std::pair<G4String, G4String>("4", "Cerenkov photons per event"),
std::pair<G4String, G4String>("5", "absorbed photons per event"),
std::pair<G4String, G4String>
("6", "photons absorbed at boundary per event"),
std::pair<G4String, G4String>
("7", "energy deposition in scintillator per event"),
};
// Default values (to be reset via /analysis/h1/set command)
G4int nbins = 100;
G4double vmin = 0.;
G4double vmax = 100.;
// Create all histograms as inactivated
// as we have not yet set nbins, vmin, vmax
for (auto histogram : histograms) {
G4int ih = analysisManager->
CreateH1("h" + histogram.first, histogram.second, nbins, vmin, vmax);
analysisManager->SetH1Activation(ih, false);
}
}
@@ -1,126 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeMuonPhysics.cc 85911 2014-11-06 08:56:31Z gcosmo $
//
/// \file optical/LXe/src/LXeMuonPhysics.cc
/// \brief Implementation of the LXeMuonPhysics class
//
//
#include "LXeMuonPhysics.hh"
#include "globals.hh"
#include "G4ios.hh"
#include "G4PhysicalConstants.hh"
#include <iomanip>
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeMuonPhysics::LXeMuonPhysics(const G4String& name)
: G4VPhysicsConstructor(name) {
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeMuonPhysics::~LXeMuonPhysics() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4ParticleDefinition.hh"
#include "G4ParticleTable.hh"
#include "G4MuonPlus.hh"
#include "G4MuonMinus.hh"
#include "G4NeutrinoMu.hh"
#include "G4AntiNeutrinoMu.hh"
#include "G4Neutron.hh"
#include "G4Proton.hh"
#include "G4PionZero.hh"
#include "G4PionPlus.hh"
#include "G4PionMinus.hh"
void LXeMuonPhysics::ConstructParticle()
{
// Mu
G4MuonPlus::MuonPlusDefinition();
G4MuonMinus::MuonMinusDefinition();
G4NeutrinoMu::NeutrinoMuDefinition();
G4AntiNeutrinoMu::AntiNeutrinoMuDefinition();
//These are needed for the mu- capture
G4Neutron::Neutron();
G4Proton::Proton();
G4PionMinus::PionMinus();
G4PionZero::PionZero();
G4PionPlus::PionPlus();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "G4ProcessManager.hh"
void LXeMuonPhysics::ConstructProcess()
{
G4MuIonisation* fMuPlusIonisation =
new G4MuIonisation();
G4MuMultipleScattering* fMuPlusMultipleScattering =
new G4MuMultipleScattering();
G4MuBremsstrahlung* fMuPlusBremsstrahlung=
new G4MuBremsstrahlung();
G4MuPairProduction* fMuPlusPairProduction=
new G4MuPairProduction();
G4MuIonisation* fMuMinusIonisation =
new G4MuIonisation();
G4MuMultipleScattering* fMuMinusMultipleScattering =
new G4MuMultipleScattering();
G4MuBremsstrahlung* fMuMinusBremsstrahlung =
new G4MuBremsstrahlung();
G4MuPairProduction* fMuMinusPairProduction =
new G4MuPairProduction();
G4MuonMinusCapture* fMuMinusCaptureAtRest =
new G4MuonMinusCapture();
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);
}
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXePMTHit.cc 72250 2013-07-12 08:59:26Z gcosmo $
// $Id: LXePMTHit.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXePMTHit.cc
/// \brief Implementation of the LXePMTHit class
@@ -42,7 +42,7 @@ G4ThreadLocal G4Allocator<LXePMTHit>* LXePMTHitAllocator=0;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXePMTHit::LXePMTHit()
: fPmtNumber(-1),fPhotons(0),fPhysVol(0),fDrawit(false) {}
: fPmtNumber(-1),fPhotons(0),fPhysVol(nullptr),fDrawit(false) {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXePMTSD.cc 73915 2013-09-17 07:32:26Z gcosmo $
// $Id: LXePMTSD.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXePMTSD.cc
/// \brief Implementation of the LXePMTSD class
@@ -47,8 +47,8 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXePMTSD::LXePMTSD(G4String name)
: G4VSensitiveDetector(name),fPMTHitCollection(0),fPMTPositionsX(0)
,fPMTPositionsY(0),fPMTPositionsZ(0)
: G4VSensitiveDetector(name),fPMTHitCollection(nullptr),
fPMTPositionsX(nullptr),fPMTPositionsY(nullptr),fPMTPositionsZ(nullptr)
{
collectionName.insert("pmtHitCollection");
}
@@ -109,7 +109,7 @@ G4bool LXePMTSD::ProcessHits_constStep(const G4Step* aStep,
//Find the correct hit collection
G4int n=fPMTHitCollection->entries();
LXePMTHit* hit=NULL;
LXePMTHit* hit = nullptr;
for(G4int i=0;i<n;i++){
if((*fPMTHitCollection)[i]->GetPMTNumber()==pmtNumber){
hit=(*fPMTHitCollection)[i];
@@ -117,7 +117,7 @@ G4bool LXePMTSD::ProcessHits_constStep(const G4Step* aStep,
}
}
if(hit==NULL){//this pmt wasnt previously hit in this event
if (hit == nullptr) {//this pmt wasnt previously hit in this event
hit = new LXePMTHit(); //so create new hit
hit->SetPMTNumber(pmtNumber);
hit->SetPMTPhysVol(physVol);
@@ -1,86 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXePhysicsList.cc 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/src/LXePhysicsList.cc
/// \brief Implementation of the LXePhysicsList class
//
//
#include "LXePhysicsList.hh"
#include "LXeGeneralPhysics.hh"
#include "LXeEMPhysics.hh"
#include "LXeMuonPhysics.hh"
#include "G4OpticalPhysics.hh"
#include "G4OpticalProcessIndex.hh"
#include "G4SystemOfUnits.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXePhysicsList::LXePhysicsList() : G4VModularPhysicsList()
{
// default cut value (1.0mm)
defaultCutValue = 1.0*mm;
// General Physics
RegisterPhysics( new LXeGeneralPhysics("general") );
// EM Physics
RegisterPhysics( new LXeEMPhysics("standard EM"));
// Muon Physics
RegisterPhysics( new LXeMuonPhysics("muon"));
// Optical Physics
G4OpticalPhysics* opticalPhysics = new G4OpticalPhysics();
RegisterPhysics( opticalPhysics );
opticalPhysics->SetWLSTimeProfile("delta");
opticalPhysics->SetScintillationYieldFactor(1.0);
opticalPhysics->SetScintillationExcitationRatio(0.0);
opticalPhysics->SetMaxNumPhotonsPerStep(100);
opticalPhysics->SetMaxBetaChangePerStep(10.0);
opticalPhysics->SetTrackSecondariesFirst(kCerenkov,true);
opticalPhysics->SetTrackSecondariesFirst(kScintillation,true);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXePhysicsList::~LXePhysicsList() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXePhysicsList::SetCuts(){
// " G4VUserPhysicsList::SetCutsWithDefault" method sets
// the default cut value for all particle types
SetCutsWithDefault();
}
+157
View File
@@ -0,0 +1,157 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeRunAction.cc 66587 2012-12-21 11:06:44Z ihrivnac $
//
/// \file optical/LXe/src/LXeRun.cc
/// \brief Implementation of the LXeRun class
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
#include "LXeRun.hh"
#include "G4SystemOfUnits.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeRun::LXeRun() : G4Run()
{
fHitCount = fHitCount2 = 0;
fPhotonCount_Scint = fPhotonCount_Scint2 = 0;
fPhotonCount_Ceren = fPhotonCount_Ceren2 = 0;
fAbsorptionCount = fAbsorptionCount2 = 0;
fBoundaryAbsorptionCount = fBoundaryAbsorptionCount2 = 0;
fPMTsAboveThreshold = fPMTsAboveThreshold2 = 0;
fTotE = fTotE2 = 0.0;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeRun::~LXeRun()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRun::Merge(const G4Run* run)
{
const LXeRun* localRun = static_cast<const LXeRun*>(run);
fHitCount += localRun->fHitCount;
fHitCount2 += localRun->fHitCount2;
fPMTsAboveThreshold += localRun->fPMTsAboveThreshold;
fPMTsAboveThreshold2 += localRun->fPMTsAboveThreshold2;
fPhotonCount_Scint += localRun->fPhotonCount_Scint;
fPhotonCount_Scint2 += localRun->fPhotonCount_Scint2;
fPhotonCount_Ceren += localRun->fPhotonCount_Ceren;
fPhotonCount_Ceren2 += localRun->fPhotonCount_Ceren2;
fAbsorptionCount += localRun->fAbsorptionCount;
fAbsorptionCount2 += localRun->fAbsorptionCount2;
fBoundaryAbsorptionCount += localRun->fBoundaryAbsorptionCount;
fBoundaryAbsorptionCount2 += localRun->fBoundaryAbsorptionCount2;
fTotE += localRun->fTotE;
fTotE2 += localRun->fTotE2;
G4Run::Merge(run);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRun::EndOfRun()
{
G4cout << "\n ======================== run summary ======================\n";
G4int prec = G4cout.precision();
G4int n_evt = numberOfEvent;
G4cout << "The run was " << n_evt << " events." << G4endl;
G4cout.precision(4);
G4double hits = G4double(fHitCount)/n_evt;
G4double hits2 = G4double(fHitCount2)/n_evt;
G4double rms_hits = hits2 - hits*hits;
if (rms_hits > 0.) rms_hits = std::sqrt(rms_hits/n_evt);
else rms_hits = 0.;
G4cout << "Number of hits per event:\t " << hits << " +- " << rms_hits
<< G4endl;
G4double hitsAbove = G4double(fPMTsAboveThreshold)/n_evt;
G4double hitsAbove2 = G4double(fPMTsAboveThreshold2)/n_evt;
G4double rms_hitsAbove = hitsAbove2 - hitsAbove*hitsAbove;
if (rms_hitsAbove > 0.) rms_hitsAbove = std::sqrt(rms_hitsAbove/n_evt);
else rms_hitsAbove = 0.;
G4cout << "Number of hits per event above threshold:\t " << hitsAbove
<< " +- " << rms_hitsAbove << G4endl;
G4double scint = G4double(fPhotonCount_Scint)/n_evt;
G4double scint2 = G4double(fPhotonCount_Scint2)/n_evt;
G4double rms_scint = scint2 - scint*scint;
if (rms_scint > 0.) rms_scint = std::sqrt(rms_scint/n_evt);
else rms_scint = 0.;
G4cout << "Number of scintillation photons per event :\t " << scint << " +- "
<< rms_scint << G4endl;
G4double ceren = G4double(fPhotonCount_Ceren)/n_evt;
G4double ceren2 = G4double(fPhotonCount_Ceren2)/n_evt;
G4double rms_ceren = ceren2 - ceren*ceren;
if (rms_ceren > 0.) rms_ceren = std::sqrt(rms_ceren/n_evt);
else rms_ceren = 0.;
G4cout << "Number of Cerenkov photons per event:\t " << ceren << " +- "
<< rms_ceren << G4endl;
G4double absorb = G4double(fAbsorptionCount)/n_evt;
G4double absorb2 = G4double(fAbsorptionCount2)/n_evt;
G4double rms_absorb = absorb2 - absorb*absorb;
if (rms_absorb > 0.) rms_absorb = std::sqrt(rms_absorb/n_evt);
else rms_absorb = 0.;
G4cout << "Number of absorbed photons per event :\t " << absorb << " +- "
<< rms_absorb << G4endl;
G4double bdry = G4double(fBoundaryAbsorptionCount)/n_evt;
G4double bdry2 = G4double(fBoundaryAbsorptionCount2)/n_evt;
G4double rms_bdry = bdry2 - bdry*bdry;
if (rms_bdry > 0.) rms_bdry = std::sqrt(rms_bdry/n_evt);
else rms_bdry = 0.;
G4cout << "Number of photons absorbed at boundary per event:\t " << bdry
<< " +- " << rms_bdry << G4endl;
//G4cout << "Number of unaccounted for photons: " << G4endl;
G4double en = fTotE/n_evt;
G4double en2 = fTotE2/n_evt;
G4double rms_en = en2 - en*en;
if (rms_en > 0.) rms_en = std::sqrt(rms_en/n_evt);
else rms_en = 0.;
G4cout << "Total energy deposition in scintillator per event:\t " << en/keV
<< " +- " << rms_en/keV << " keV." << G4endl;
G4cout << G4endl;
G4cout.precision(prec);
}
@@ -23,31 +23,57 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeRunAction.cc 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeRunAction.cc 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/src/LXeRunAction.cc
/// \brief Implementation of the LXeRunAction class
//
//
#include "LXeRunAction.hh"
#include "LXeRecorderBase.hh"
#include "LXeRun.hh"
#include "LXeHistoManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeRunAction::LXeRunAction(LXeRecorderBase* r) : fRecorder(r) {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeRunAction::~LXeRunAction() {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRunAction::BeginOfRunAction(const G4Run* aRun){
if(fRecorder)fRecorder->RecordBeginOfRun(aRun);
LXeRunAction::LXeRunAction() : fRun(nullptr), fHistoManager(nullptr)
{
// Book predefined histograms
fHistoManager = new LXeHistoManager();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRunAction::EndOfRunAction(const G4Run* aRun){
if(fRecorder)fRecorder->RecordEndOfRun(aRun);
LXeRunAction::~LXeRunAction()
{
delete fHistoManager;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4Run* LXeRunAction::GenerateRun()
{
fRun = new LXeRun();
return fRun;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRunAction::BeginOfRunAction(const G4Run*)
{
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
if (analysisManager->IsActive()) {
analysisManager->OpenFile();
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeRunAction::EndOfRunAction(const G4Run*){
if (isMaster) fRun->EndOfRun();
// save histograms
G4AnalysisManager* analysisManager = G4AnalysisManager::Instance();
if (analysisManager->IsActive()) {
analysisManager->Write();
analysisManager->CloseFile();
}
}
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeScintHit.cc 72250 2013-07-12 08:59:26Z gcosmo $
// $Id: LXeScintHit.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeScintHit.cc
/// \brief Implementation of the LXeScintHit class
@@ -37,11 +37,11 @@
#include "G4LogicalVolume.hh"
#include "G4VPhysicalVolume.hh"
G4ThreadLocal G4Allocator<LXeScintHit>* LXeScintHitAllocator=0;
G4ThreadLocal G4Allocator<LXeScintHit>* LXeScintHitAllocator = nullptr;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeScintHit::LXeScintHit() : fEdep(0.), fPos(0.), fPhysVol(0) {}
LXeScintHit::LXeScintHit() : fEdep(0.), fPos(0.), fPhysVol(nullptr) {}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeScintSD.cc 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeScintSD.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeScintSD.cc
/// \brief Implementation of the LXeScintSD class
@@ -46,7 +46,7 @@
LXeScintSD::LXeScintSD(G4String name)
: G4VSensitiveDetector(name)
{
fScintCollection = NULL;
fScintCollection = nullptr;
collectionName.insert("scintCollection");
}
@@ -23,14 +23,14 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeStackingAction.cc 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeStackingAction.cc 109652 2018-05-04 08:49:34Z gcosmo $
//
/// \file optical/LXe/src/LXeStackingAction.cc
/// \brief Implementation of the LXeStackingAction class
//
//
#include "LXeStackingAction.hh"
#include "LXeUserEventInformation.hh"
#include "LXeEventAction.hh"
#include "LXeSteppingAction.hh"
#include "G4ios.hh"
@@ -43,7 +43,9 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeStackingAction::LXeStackingAction() {}
LXeStackingAction::LXeStackingAction(LXeEventAction* ea)
: fEventAction(ea)
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -54,19 +56,15 @@ 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();
fEventAction->IncPhotonCount_Scint();
else if(aTrack->GetCreatorProcess()->GetProcessName()=="Cerenkov")
eventInformation->IncPhotonCount_Ceren();
fEventAction->IncPhotonCount_Ceren();
}
}
else{
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeSteppingAction.cc 73915 2013-09-17 07:32:26Z gcosmo $
// $Id: LXeSteppingAction.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeSteppingAction.cc
/// \brief Implementation of the LXeSteppingAction class
@@ -35,9 +35,7 @@
#include "LXeTrajectory.hh"
#include "LXePMTSD.hh"
#include "LXeUserTrackInformation.hh"
#include "LXeUserEventInformation.hh"
#include "LXeSteppingMessenger.hh"
#include "LXeRecorderBase.hh"
#include "G4SteppingManager.hh"
#include "G4SDManager.hh"
@@ -54,8 +52,9 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeSteppingAction::LXeSteppingAction(LXeRecorderBase* r)
: fRecorder(r),fOneStepPrimaries(false)
LXeSteppingAction::LXeSteppingAction(LXeEventAction* ea)
: fOneStepPrimaries(false),
fEventAction(ea)
{
fSteppingMessenger = new LXeSteppingMessenger(this);
@@ -76,9 +75,6 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
LXeUserTrackInformation* trackInformation
=(LXeUserTrackInformation*)theTrack->GetUserInformation();
LXeUserEventInformation* eventInformation
=(LXeUserEventInformation*)G4EventManager::GetEventManager()
->GetConstCurrentEvent()->GetUserInformation();
G4StepPoint* thePrePoint = theStep->GetPreStepPoint();
G4VPhysicalVolume* thePrePV = thePrePoint->GetPhysicalVolume();
@@ -87,7 +83,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
G4VPhysicalVolume* thePostPV = thePostPoint->GetPhysicalVolume();
G4OpBoundaryProcessStatus boundaryStatus=Undefined;
static G4ThreadLocal G4OpBoundaryProcess* boundary=NULL;
static G4ThreadLocal G4OpBoundaryProcess* boundary = nullptr;
//find the boundary process only once
if(!boundary){
@@ -114,7 +110,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
//If we havent already found the conversion position and there were
//secondaries generated, then search for it
if(!eventInformation->IsConvPosSet() && tN2ndariesTot>0 ){
if(!fEventAction->IsConvPosSet() && tN2ndariesTot>0 ){
for(size_t lp1=(*fSecondary).size()-tN2ndariesTot;
lp1<(*fSecondary).size(); lp1++){
const G4VProcess* creator=(*fSecondary)[lp1]->GetCreatorProcess();
@@ -123,7 +119,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
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());
fEventAction->SetConvPos((*fSecondary)[lp1]->GetPosition());
}
}
}
@@ -152,7 +148,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
//Was the photon absorbed by the absorption process
if(thePostPoint->GetProcessDefinedStep()->GetProcessName()
=="OpAbsorption"){
eventInformation->IncAbsorption();
fEventAction->IncAbsorption();
trackInformation->AddTrackStatusFlag(absorbed);
}
@@ -177,7 +173,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
switch(boundaryStatus){
case Absorption:
trackInformation->AddTrackStatusFlag(boundaryAbsorbed);
eventInformation->IncBoundaryAbsorption();
fEventAction->IncBoundaryAbsorption();
break;
case Detection: //Note, this assumes that the volume causing detection
//is the photocathode because it is the only one with
@@ -188,7 +184,7 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
G4SDManager* SDman = G4SDManager::GetSDMpointer();
G4String sdName="/LXeDet/pmtSD";
LXePMTSD* pmtSD = (LXePMTSD*)SDman->FindSensitiveDetector(sdName);
if(pmtSD)pmtSD->ProcessHits_constStep(theStep,NULL);
if(pmtSD)pmtSD->ProcessHits_constStep(theStep, nullptr);
trackInformation->AddTrackStatusFlag(hitPMT);
break;
}
@@ -208,6 +204,4 @@ void LXeSteppingAction::UserSteppingAction(const G4Step * theStep){
trackInformation->AddTrackStatusFlag(hitSphere);
}
}
if(fRecorder)fRecorder->RecordStep(theStep);
}
@@ -1,176 +0,0 @@
//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeSteppingVerbose.cc 68752 2013-04-05 10:23:47Z gcosmo $
//
/// \file optical/LXe/src/LXeSteppingVerbose.cc
/// \brief Implementation of the LXeSteppingVerbose class
//
//
#include "LXeSteppingVerbose.hh"
#include "G4SteppingManager.hh"
#include "G4UnitsTable.hh"
//....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 ){
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 LXeSteppingVerbose::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......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeTrackingAction.cc 68752 2013-04-05 10:23:47Z gcosmo $
// $Id: LXeTrackingAction.cc 109784 2018-05-09 08:14:08Z gcosmo $
//
/// \file optical/LXe/src/LXeTrackingAction.cc
/// \brief Implementation of the LXeTrackingAction class
@@ -33,7 +33,6 @@
#include "LXeTrackingAction.hh"
#include "LXeUserTrackInformation.hh"
#include "LXeDetectorConstruction.hh"
#include "LXeRecorderBase.hh"
#include "G4TrackingManager.hh"
#include "G4Track.hh"
@@ -41,8 +40,8 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeTrackingAction::LXeTrackingAction(LXeRecorderBase* r)
: fRecorder(r) {}
LXeTrackingAction::LXeTrackingAction()
{}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -66,7 +65,8 @@ void LXeTrackingAction::PreUserTrackingAction(const G4Track* aTrack)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void LXeTrackingAction::PostUserTrackingAction(const G4Track* aTrack){
LXeTrajectory* trajectory=(LXeTrajectory*)fpTrackingManager->GimmeTrajectory();
LXeTrajectory* trajectory =
(LXeTrajectory*)fpTrackingManager->GimmeTrajectory();
LXeUserTrackInformation*
trackInformation=(LXeUserTrackInformation*)aTrack->GetUserInformation();
@@ -95,6 +95,4 @@ void LXeTrackingAction::PostUserTrackingAction(const G4Track* aTrack){
if(trackInformation->GetForceDrawTrajectory())
trajectory->SetDrawTrajectory(true);
if(fRecorder)fRecorder->RecordTrack(aTrack);
}
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeTrajectory.cc 72349 2013-07-16 12:13:16Z gcosmo $
// $Id: LXeTrajectory.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeTrajectory.cc
/// \brief Implementation of the LXeTrajectory class
@@ -42,14 +42,15 @@
#include "G4VVisManager.hh"
#include "G4Polymarker.hh"
G4ThreadLocal G4Allocator<LXeTrajectory>* LXeTrajectoryAllocator = 0;
G4ThreadLocal G4Allocator<LXeTrajectory>* LXeTrajectoryAllocator = nullptr;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
LXeTrajectory::LXeTrajectory()
:G4Trajectory(),fWls(false),fDrawit(false),fForceNoDraw(false),fForceDraw(false)
:G4Trajectory(),fWls(false),fDrawit(false),
fForceNoDraw(false),fForceDraw(false)
{
fParticleDefinition=0;
fParticleDefinition = nullptr;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeWLSFiber.cc 77486 2013-11-25 10:14:16Z gcosmo $
// $Id: LXeWLSFiber.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeWLSFiber.cc
/// \brief Implementation of the LXeWLSFiber class
@@ -35,7 +35,7 @@
#include "G4LogicalBorderSurface.hh"
#include "G4SystemOfUnits.hh"
G4LogicalVolume* LXeWLSFiber::fClad2_log=NULL;
G4LogicalVolume* LXeWLSFiber::fClad2_log = nullptr;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@@ -23,7 +23,7 @@
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
// $Id: LXeWLSSlab.cc 77486 2013-11-25 10:14:16Z gcosmo $
// $Id: LXeWLSSlab.cc 110138 2018-05-16 07:31:43Z gcosmo $
//
/// \file optical/LXe/src/LXeWLSSlab.cc
/// \brief Implementation of the LXeWLSSlab class
@@ -37,7 +37,7 @@
#include "G4LogicalBorderSurface.hh"
#include "G4SystemOfUnits.hh"
G4LogicalVolume* LXeWLSSlab::fScintSlab_log=NULL;
G4LogicalVolume* LXeWLSSlab::fScintSlab_log = nullptr;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+63 -32
View File
@@ -1,46 +1,77 @@
#
# Macro file for the initialization phase of "LXe.cc"
# when runing in interactive mode
#
# Macro file for the initialization phase of "TestEm5.cc"
# Sets some default verbose
# and initializes the graphic.
#
/run/verbose 2
/control/verbose 2
/run/verbose 2
/run/initialize
#
# Create a scene handler/viewer for a specific graphics system
# The compound command "/vis/open <vis-driver-name>"
# 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
# Use this open statement to create an OpenGL view:
/vis/open OGL 600x600-0+0
#
/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
# Use this open statement to create a .prim file suitable for
# viewing in DAWN:
#/vis/open DAWNFILE
#
# The compound command "/vis/drawVolume"
# is equivalent to the following set of commands:
# Use this open statement to create a .heprep file suitable for
# viewing in HepRApp:
#/vis/open HepRepFile
#
# /vis/scene/create
# /vis/scene/add/volume
# /vis/sceneHandler/attach
# Create an empty scene and add the detector geometry to it
# Use this open statement to create a .wrl file suitable for
# viewing in a VRML viewer:
#/vis/open VRML2FILE
#
# Disable auto refresh and quieten vis messages whilst scene and
# trajectories are established:
/vis/viewer/set/autoRefresh false
/vis/verbose errors
#
# Draw geometry:
/vis/drawVolume
#
# Store particle trajectories for visualization
# (if too many tracks cause core dump => storeTrajectory 0)
/tracking/storeTrajectory 1
# Specify view angle:
#/vis/viewer/set/viewpointThetaPhi 90. 0.
#
# 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
# Specify zoom value:
/vis/viewer/zoom 1.4
#
# Requests viewer to accumulate hits, tracks, etc. at end of event.
# detector remains or is redrawn.
# Specify style (surface or wireframe):
#/vis/viewer/set/style wireframe
#
# Draw coordinate axes:
#/vis/scene/add/axes 0 0 0 1 m
#
# Draw smooth trajectories at end of event, showing trajectory points
# as markers 2 pixels wide:
/vis/scene/add/trajectories smooth
/vis/modeling/trajectories/create/drawByCharge
/vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true
/vis/modeling/trajectories/drawByCharge-0/default/setStepPtsSize 1
# (if too many tracks cause core dump => /tracking/storeTrajectory 0)
#
# Draw hits at end of event:
#/vis/scene/add/hits
#
# To draw only gammas:
#/vis/filtering/trajectories/create/particleFilter
#/vis/filtering/trajectories/particleFilter-0/add gamma
#
# To invert the above, drawing all particles except gammas,
# keep the above two lines but also add:
#/vis/filtering/trajectories/particleFilter-0/invert true
#
# Many other options are available with /vis/modeling and /vis/filtering.
# For example, to select colour by particle ID:
#/vis/modeling/trajectories/create/drawByParticleID
#/vis/modeling/trajectories/drawByParticleID-0/set e- blue
#
# To superimpose all of the events from a given run:
/vis/scene/endOfEventAction accumulate
#
# Re-establish auto refreshing and verbosity:
/vis/viewer/set/autoRefresh true
/vis/verbose warnings
#
# For file-based drivers, use this to create an empty detector view:
#/vis/viewer/flush
+15 -2
View File
@@ -1,9 +1,22 @@
/control/execute defaults.mac
/run/initialize
/control/verbose 2
/run/verbose 2
/tracking/verbose 0
/LXe/eventVerbose 0
/LXe/detector/defaults
/LXe/oneStepPrimaries false
/LXe/detector/volumes/wls 1
/LXe/detector/volumes/lxe 0
/LXe/detector/nfibers 15
/LXe/detector/WLSScintYield 10000
/LXe/detector/update
/gun/particle e-
/gun/energy 511 keV
/analysis/h1/set 3 100 -1 10000
/analysis/h1/set 4 100 -1 100
/analysis/h1/set 5 100 -1 10000
/run/printProgress 10
/run/beamOn 1000