ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4PSPassageCellFlux.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4PSPassageCellFlux.cc
1
//
2
// ********************************************************************
3
// * License and Disclaimer *
4
// * *
5
// * The Geant4 software is copyright of the Copyright Holders of *
6
// * the Geant4 Collaboration. It is provided under the terms and *
7
// * conditions of the Geant4 Software License, included in the file *
8
// * LICENSE and available at http://cern.ch/geant4/license . These *
9
// * include a list of copyright holders. *
10
// * *
11
// * Neither the authors of this software system, nor their employing *
12
// * institutes,nor the agencies providing financial support for this *
13
// * work make any representation or warranty, express or implied, *
14
// * regarding this software system or assume any liability for its *
15
// * use. Please see the license in the file LICENSE and URL above *
16
// * for the full disclaimer and the limitation of liability. *
17
// * *
18
// * This code implementation is the result of the scientific and *
19
// * technical work of the GEANT4 collaboration. *
20
// * By using, copying, modifying or distributing the software (or *
21
// * any work based on the software) you agree to acknowledge its *
22
// * use in resulting scientific publications, and indicate your *
23
// * acceptance of all terms of the Geant4 Software license. *
24
// ********************************************************************
25
//
26
//
27
//
28
// G4PSPassageCellFlux
29
#include "
G4PSPassageCellFlux.hh
"
30
31
#include "
G4SystemOfUnits.hh
"
32
#include "
G4StepStatus.hh
"
33
#include "
G4Track.hh
"
34
#include "
G4VSolid.hh
"
35
#include "
G4VPhysicalVolume.hh
"
36
#include "
G4VPVParameterisation.hh
"
37
#include "
G4UnitsTable.hh
"
39
// (Description)
40
// This is a primitive scorer class for scoring cell flux.
41
// The Cell Flux is defined by a track length divided by a geometry
42
// volume, where only tracks passing through the geometry are taken
43
// into account. e.g. the unit of Cell Flux is mm/mm3.
44
//
45
// If you want to score all tracks in the geometry volume,
46
// please use G4PSCellFlux.
47
//
48
// Created: 2005-11-14 Tsukasa ASO, Akinori Kimura.
49
// 2010-07-22 Introduce Unit specification.
50
// 2010-07-22 Add weighted option
51
//
53
54
G4PSPassageCellFlux::G4PSPassageCellFlux
(
G4String
name
,
G4int
depth)
55
:
G4VPrimitiveScorer
(name,depth),HCID(-1),fCurrentTrkID(-1),fCellFlux(0),
56
EvtMap(0),weighted(
true
)
57
{
58
DefineUnitAndCategory
();
59
SetUnit
(
"percm2"
);
60
}
61
62
G4PSPassageCellFlux::G4PSPassageCellFlux
(
G4String
name
,
const
G4String
& unit,
63
G4int
depth)
64
:
G4VPrimitiveScorer
(name,depth),HCID(-1),fCurrentTrkID(-1),fCellFlux(0),
65
EvtMap(0),weighted(
true
)
66
{
67
DefineUnitAndCategory
();
68
SetUnit
(unit);
69
}
70
71
G4PSPassageCellFlux::~G4PSPassageCellFlux
()
72
{;}
73
74
G4bool
G4PSPassageCellFlux::ProcessHits
(
G4Step
* aStep,
G4TouchableHistory
*)
75
{
76
77
if
(
IsPassed
(aStep) ) {
78
G4int
idx
= ((
G4TouchableHistory
*)
79
(aStep->
GetPreStepPoint
()->
GetTouchable
()))
80
->GetReplicaNumber(
indexDepth
);
81
G4double
cubicVolume =
ComputeVolume
(aStep, idx);
82
83
fCellFlux
/= cubicVolume;
84
G4int
index =
GetIndex
(aStep);
85
EvtMap
->
add
(index,
fCellFlux
);
86
}
87
88
return
TRUE
;
89
}
90
91
G4bool
G4PSPassageCellFlux::IsPassed
(
G4Step
* aStep){
92
G4bool
Passed =
FALSE
;
93
94
G4bool
IsEnter = aStep->
GetPreStepPoint
()->
GetStepStatus
() ==
fGeomBoundary
;
95
G4bool
IsExit = aStep->
GetPostStepPoint
()->
GetStepStatus
() ==
fGeomBoundary
;
96
97
G4int
trkid = aStep->
GetTrack
()->
GetTrackID
();
98
G4double
trklength = aStep->
GetStepLength
();
99
if
(
weighted
) trklength *= aStep->
GetPreStepPoint
()->
GetWeight
();
100
101
if
( IsEnter &&IsExit ){
// Passed at one step
102
fCellFlux
= trklength;
// Track length is absolutely given.
103
Passed =
TRUE
;
104
}
else
if
( IsEnter ){
// Enter a new geometry
105
fCurrentTrkID
= trkid;
// Resetting the current track.
106
fCellFlux
= trklength;
107
}
else
if
( IsExit ){
// Exit a current geometry
108
if
(
fCurrentTrkID
== trkid ) {
// if the track is same as entered,
109
fCellFlux
+= trklength;
// add the track length to current one.
110
Passed =
TRUE
;
111
}
112
}
else
{
// Inside geometry
113
if
(
fCurrentTrkID
== trkid ){
// if the track is same as entered,
114
fCellFlux
+= trklength;
// adding the track length to current one.
115
}
116
}
117
118
return
Passed;
119
}
120
121
void
G4PSPassageCellFlux::Initialize
(
G4HCofThisEvent
* HCE)
122
{
123
fCurrentTrkID
= -1;
124
125
EvtMap
=
new
G4THitsMap<G4double>
(
detector
->
GetName
(),
126
GetName
());
127
if
(
HCID
< 0 )
HCID
=
GetCollectionID
(0);
128
HCE->
AddHitsCollection
(
HCID
,
EvtMap
);
129
130
}
131
132
void
G4PSPassageCellFlux::EndOfEvent
(
G4HCofThisEvent
*)
133
{;}
134
135
void
G4PSPassageCellFlux::clear
(){
136
EvtMap
->
clear
();
137
}
138
139
void
G4PSPassageCellFlux::DrawAll
()
140
{;}
141
142
void
G4PSPassageCellFlux::PrintAll
()
143
{
144
G4cout
<<
" MultiFunctionalDet "
<<
detector
->
GetName
() <<
G4endl
;
145
G4cout
<<
" PrimitiveScorer "
<<
GetName
() <<
G4endl
;
146
G4cout
<<
" Number of entries "
<<
EvtMap
->
entries
() <<
G4endl
;
147
std::map<G4int,G4double*>::iterator itr =
EvtMap
->
GetMap
()->begin();
148
for
(; itr !=
EvtMap
->
GetMap
()->end(); itr++) {
149
G4cout
<<
" copy no.: "
<< itr->first
150
<<
" cell flux : "
<< *(itr->second)/
GetUnitValue
()
151
<<
" ["
<<
GetUnit
()
152
<<
G4endl
;
153
}
154
}
155
156
void
G4PSPassageCellFlux::SetUnit
(
const
G4String
& unit)
157
{
158
CheckAndSetUnit
(unit,
"Per Unit Surface"
);
159
}
160
161
void
G4PSPassageCellFlux::DefineUnitAndCategory
(){
162
// Per Unit Surface
163
new
G4UnitDefinition
(
"percentimeter2"
,
"percm2"
,
"Per Unit Surface"
,(1./
cm2
));
164
new
G4UnitDefinition
(
"permillimeter2"
,
"permm2"
,
"Per Unit Surface"
,(1./
mm2
));
165
new
G4UnitDefinition
(
"permeter2"
,
"perm2"
,
"Per Unit Surface"
,(1./
m2
));
166
}
167
168
169
G4double
G4PSPassageCellFlux::ComputeVolume
(
G4Step
* aStep,
G4int
idx
){
170
171
G4VPhysicalVolume
* physVol = aStep->
GetPreStepPoint
()->
GetPhysicalVolume
();
172
G4VPVParameterisation
* physParam = physVol->
GetParameterisation
();
173
G4VSolid
* solid = 0;
174
if
(physParam)
175
{
// for parameterized volume
176
if
(idx<0)
177
{
178
G4ExceptionDescription
ED;
179
ED <<
"Incorrect replica number --- GetReplicaNumber : "
<< idx <<
G4endl
;
180
G4Exception
(
"G4PSPassageCellFlux::ComputeVolume"
,
"DetPS0013"
,
JustWarning
,ED);
181
}
182
solid = physParam->
ComputeSolid
(idx, physVol);
183
solid->
ComputeDimensions
(physParam,idx,physVol);
184
}
185
else
186
{
// for ordinary volume
187
solid = physVol->
GetLogicalVolume
()->
GetSolid
();
188
}
189
190
return
solid->
GetCubicVolume
();
191
}
geant4
tree
geant4-10.6-release
source
digits_hits
scorer
src
G4PSPassageCellFlux.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:12
using
1.8.2 with
ECCE GitHub integration