ECCE @ EIC Software
 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 
55  : G4VPrimitiveScorer(name,depth),HCID(-1),fCurrentTrkID(-1),fCellFlux(0),
56  EvtMap(0),weighted(true)
57 {
59  SetUnit("percm2");
60 }
61 
63  G4int depth)
64  : G4VPrimitiveScorer(name,depth),HCID(-1),fCurrentTrkID(-1),fCellFlux(0),
65  EvtMap(0),weighted(true)
66 {
68  SetUnit(unit);
69 }
70 
72 {;}
73 
75 {
76 
77  if ( IsPassed(aStep) ) {
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 
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 
122 {
123  fCurrentTrkID = -1;
124 
126  GetName());
127  if ( HCID < 0 ) HCID = GetCollectionID(0);
129 
130 }
131 
133 {;}
134 
136  EvtMap->clear();
137 }
138 
140 {;}
141 
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 
157 {
158  CheckAndSetUnit(unit,"Per Unit Surface");
159 }
160 
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 
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  {
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 }