Import Geant4 10.5.0.beta source tree
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 :)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
+26
-10
@@ -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
|
||||
+58
-54
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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......
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user