Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions
G4PSFlatSurfaceFlux Class Reference

#include <G4PSFlatSurfaceFlux.hh>

Inheritance diagram for G4PSFlatSurfaceFlux:
G4VPrimitiveScorer G4PSFlatSurfaceFlux3D RE02PSFlatSurfaceFlux

Public Member Functions

 G4PSFlatSurfaceFlux (G4String name, G4int direction, G4int depth=0)
 
 G4PSFlatSurfaceFlux (G4String name, G4int direction, const G4String &unit, G4int depth=0)
 
virtual ~G4PSFlatSurfaceFlux ()
 
void Weighted (G4bool flg=true)
 
void DivideByArea (G4bool flg=true)
 
virtual void Initialize (G4HCofThisEvent *)
 
virtual void EndOfEvent (G4HCofThisEvent *)
 
virtual void clear ()
 
virtual void DrawAll ()
 
virtual void PrintAll ()
 
virtual void SetUnit (const G4String &unit)
 
- Public Member Functions inherited from G4VPrimitiveScorer
 G4VPrimitiveScorer (G4String name, G4int depth=0)
 
virtual ~G4VPrimitiveScorer ()
 
G4int GetCollectionID (G4int)
 
void SetUnit (const G4String &unit)
 
const G4StringGetUnit () const
 
G4double GetUnitValue () const
 
void SetMultiFunctionalDetector (G4MultiFunctionalDetector *d)
 
G4MultiFunctionalDetectorGetMultiFunctionalDetector () const
 
G4String GetName () const
 
void SetFilter (G4VSDFilter *f)
 
G4VSDFilterGetFilter () const
 
void SetVerboseLevel (G4int vl)
 
G4int GetVerboseLevel () const
 
void SetNijk (G4int i, G4int j, G4int k)
 

Protected Member Functions

virtual G4bool ProcessHits (G4Step *, G4TouchableHistory *)
 
G4int IsSelectedSurface (G4Step *, G4Box *)
 
virtual void DefineUnitAndCategory ()
 
- Protected Member Functions inherited from G4VPrimitiveScorer
virtual G4int GetIndex (G4Step *)
 
void CheckAndSetUnit (const G4String &unit, const G4String &category)
 

Additional Inherited Members

- Protected Attributes inherited from G4VPrimitiveScorer
G4String primitiveName
 
G4MultiFunctionalDetectordetector
 
G4VSDFilterfilter
 
G4int verboseLevel
 
G4int indexDepth
 
G4String unitName
 
G4double unitValue
 
G4int fNi
 
G4int fNj
 
G4int fNk
 

Detailed Description

Definition at line 62 of file G4PSFlatSurfaceFlux.hh.

Constructor & Destructor Documentation

G4PSFlatSurfaceFlux::G4PSFlatSurfaceFlux ( G4String  name,
G4int  direction,
G4int  depth = 0 
)

Definition at line 60 of file G4PSFlatSurfaceFlux.cc.

References DefineUnitAndCategory(), and SetUnit().

62  : G4VPrimitiveScorer(name,depth),HCID(-1),fDirection(direction),
63  weighted(true),divideByArea(true)
64 {
66  SetUnit("percm2");
67 }
virtual void DefineUnitAndCategory()
virtual void SetUnit(const G4String &unit)
G4VPrimitiveScorer(G4String name, G4int depth=0)
G4PSFlatSurfaceFlux::G4PSFlatSurfaceFlux ( G4String  name,
G4int  direction,
const G4String unit,
G4int  depth = 0 
)

Definition at line 69 of file G4PSFlatSurfaceFlux.cc.

References DefineUnitAndCategory(), and SetUnit().

73  : G4VPrimitiveScorer(name,depth),HCID(-1),fDirection(direction),
74  weighted(true),divideByArea(true)
75 {
77  SetUnit(unit);
78 }
virtual void DefineUnitAndCategory()
virtual void SetUnit(const G4String &unit)
G4VPrimitiveScorer(G4String name, G4int depth=0)
G4PSFlatSurfaceFlux::~G4PSFlatSurfaceFlux ( )
virtual

Definition at line 80 of file G4PSFlatSurfaceFlux.cc.

81 {;}

Member Function Documentation

void G4PSFlatSurfaceFlux::clear ( void  )
virtual

Reimplemented from G4VPrimitiveScorer.

Definition at line 183 of file G4PSFlatSurfaceFlux.cc.

References G4THitsMap< T >::clear().

183  {
184  EvtMap->clear();
185 }
void clear()
Definition: G4THitsMap.hh:209
void G4PSFlatSurfaceFlux::DefineUnitAndCategory ( )
protectedvirtual

Definition at line 219 of file G4PSFlatSurfaceFlux.cc.

References python.hepunit::cm2, python.hepunit::m2, and python.hepunit::mm2.

Referenced by G4PSFlatSurfaceFlux().

219  {
220  // Per Unit Surface
221  new G4UnitDefinition("percentimeter2","percm2","Per Unit Surface",(1./cm2));
222  new G4UnitDefinition("permillimeter2","permm2","Per Unit Surface",(1./mm2));
223  new G4UnitDefinition("permeter2","perm2","Per Unit Surface",(1./m2));
224 }
void G4PSFlatSurfaceFlux::DivideByArea ( G4bool  flg = true)
inline

Definition at line 73 of file G4PSFlatSurfaceFlux.hh.

Referenced by G4ScoreQuantityMessenger::SetNewValue().

73 { divideByArea = flg; }
void G4PSFlatSurfaceFlux::DrawAll ( void  )
virtual

Reimplemented from G4VPrimitiveScorer.

Definition at line 187 of file G4PSFlatSurfaceFlux.cc.

188 {;}
void G4PSFlatSurfaceFlux::EndOfEvent ( G4HCofThisEvent )
virtual

Reimplemented from G4VPrimitiveScorer.

Definition at line 180 of file G4PSFlatSurfaceFlux.cc.

181 {;}
void G4PSFlatSurfaceFlux::Initialize ( G4HCofThisEvent HCE)
virtual
G4int G4PSFlatSurfaceFlux::IsSelectedSurface ( G4Step aStep,
G4Box boxSolid 
)
protected

Definition at line 143 of file G4PSFlatSurfaceFlux.cc.

References fFlux_In, fFlux_Out, fGeomBoundary, G4VTouchable::GetHistory(), G4GeometryTolerance::GetInstance(), G4StepPoint::GetPosition(), G4Step::GetPostStepPoint(), G4Step::GetPreStepPoint(), G4StepPoint::GetStepStatus(), G4GeometryTolerance::GetSurfaceTolerance(), G4NavigationHistory::GetTopTransform(), G4StepPoint::GetTouchableHandle(), G4Box::GetZHalfLength(), G4AffineTransform::TransformPoint(), and CLHEP::Hep3Vector::z().

Referenced by ProcessHits().

143  {
144 
145  G4TouchableHandle theTouchable =
148 
149  if (aStep->GetPreStepPoint()->GetStepStatus() == fGeomBoundary ){
150  // Entering Geometry
151  G4ThreeVector stppos1= aStep->GetPreStepPoint()->GetPosition();
152  G4ThreeVector localpos1 =
153  theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos1);
154  if(std::fabs( localpos1.z() + boxSolid->GetZHalfLength())<kCarTolerance ){
155  return fFlux_In;
156  }
157  }
158 
159  if (aStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary ){
160  // Exiting Geometry
161  G4ThreeVector stppos2= aStep->GetPostStepPoint()->GetPosition();
162  G4ThreeVector localpos2 =
163  theTouchable->GetHistory()->GetTopTransform().TransformPoint(stppos2);
164  if(std::fabs( localpos2.z() + boxSolid->GetZHalfLength())<kCarTolerance ){
165  return fFlux_Out;
166  }
167  }
168 
169  return -1;
170 }
G4StepStatus GetStepStatus() const
G4double GetSurfaceTolerance() const
virtual const G4NavigationHistory * GetHistory() const
Definition: G4VTouchable.cc:86
G4double GetZHalfLength() const
double z() const
G4StepPoint * GetPreStepPoint() const
const G4ThreeVector & GetPosition() const
G4ThreeVector TransformPoint(const G4ThreeVector &vec) const
G4StepPoint * GetPostStepPoint() const
const G4AffineTransform & GetTopTransform() const
double G4double
Definition: G4Types.hh:76
const G4TouchableHandle & GetTouchableHandle() const
static G4GeometryTolerance * GetInstance()
void G4PSFlatSurfaceFlux::PrintAll ( void  )
virtual

Reimplemented from G4VPrimitiveScorer.

Definition at line 190 of file G4PSFlatSurfaceFlux.cc.

References G4VPrimitiveScorer::detector, G4THitsMap< T >::entries(), G4cout, G4endl, G4THitsMap< T >::GetMap(), G4VPrimitiveScorer::GetName(), G4VSensitiveDetector::GetName(), G4VPrimitiveScorer::GetUnit(), and G4VPrimitiveScorer::GetUnitValue().

191 {
192  G4cout << " MultiFunctionalDet " << detector->GetName() << G4endl;
193  G4cout << " PrimitiveScorer" << GetName() <<G4endl;
194  G4cout << " Number of entries " << EvtMap->entries() << G4endl;
195  std::map<G4int,G4double*>::iterator itr = EvtMap->GetMap()->begin();
196  for(; itr != EvtMap->GetMap()->end(); itr++) {
197  G4cout << " copy no.: " << itr->first
198  << " flux : " << *(itr->second)/GetUnitValue()
199  << " [" << GetUnit() <<"]"
200  << G4endl;
201  }
202 }
G4String GetName() const
G4GLOB_DLL std::ostream G4cout
G4double GetUnitValue() const
G4int entries() const
Definition: G4THitsMap.hh:79
std::map< G4int, T * > * GetMap() const
Definition: G4THitsMap.hh:68
#define G4endl
Definition: G4ios.hh:61
G4MultiFunctionalDetector * detector
const G4String & GetUnit() const
G4bool G4PSFlatSurfaceFlux::ProcessHits ( G4Step aStep,
G4TouchableHistory  
)
protectedvirtual

Implements G4VPrimitiveScorer.

Definition at line 83 of file G4PSFlatSurfaceFlux.cc.

References G4THitsMap< T >::add(), G4VSolid::ComputeDimensions(), G4VPVParameterisation::ComputeSolid(), FALSE, fFlux_In, fFlux_InOut, fFlux_Out, G4cout, G4endl, G4VTouchable::GetHistory(), G4VPrimitiveScorer::GetIndex(), G4VPhysicalVolume::GetLogicalVolume(), G4StepPoint::GetMomentumDirection(), G4VPhysicalVolume::GetParameterisation(), G4StepPoint::GetPhysicalVolume(), G4Step::GetPostStepPoint(), G4Step::GetPreStepPoint(), G4LogicalVolume::GetSolid(), G4NavigationHistory::GetTopTransform(), G4StepPoint::GetTouchable(), G4StepPoint::GetTouchableHandle(), G4StepPoint::GetWeight(), G4Box::GetXHalfLength(), G4Box::GetYHalfLength(), G4VPrimitiveScorer::indexDepth, IsSelectedSurface(), G4AffineTransform::TransformAxis(), TRUE, and CLHEP::Hep3Vector::z().

84 {
85  G4StepPoint* preStep = aStep->GetPreStepPoint();
86  G4VPhysicalVolume* physVol = preStep->GetPhysicalVolume();
87  G4VPVParameterisation* physParam = physVol->GetParameterisation();
88  G4VSolid * solid = 0;
89  if(physParam)
90  { // for parameterized volume
92  ->GetReplicaNumber(indexDepth);
93  solid = physParam->ComputeSolid(idx, physVol);
94  solid->ComputeDimensions(physParam,idx,physVol);
95  }
96  else
97  { // for ordinary volume
98  solid = physVol->GetLogicalVolume()->GetSolid();
99  }
100 
101  G4Box* boxSolid = (G4Box*)(solid);
102 
103  G4int dirFlag =IsSelectedSurface(aStep,boxSolid);
104  if ( dirFlag > 0 ) {
105  if ( fDirection == fFlux_InOut || fDirection == dirFlag ){
106 
107  G4StepPoint* thisStep=0;
108  if ( dirFlag == fFlux_In ){
109  thisStep = preStep;
110  }else if ( dirFlag == fFlux_Out ){
111  thisStep = aStep->GetPostStepPoint();
112  }else{
113  return FALSE;
114  }
115 
116  G4TouchableHandle theTouchable = thisStep->GetTouchableHandle();
117  G4ThreeVector pdirection = thisStep->GetMomentumDirection();
118  G4ThreeVector localdir =
119  theTouchable->GetHistory()->GetTopTransform().TransformAxis(pdirection);
120  //
121  G4double angleFactor = localdir.z();
122  if ( angleFactor < 0 ) angleFactor *= -1.;
123  G4double flux = 1.0;
124  if ( weighted ) flux *=preStep->GetWeight(); // Current (Particle Weight)
125  //
126  G4double square = 4.*boxSolid->GetXHalfLength()*boxSolid->GetYHalfLength();
127  //
128  flux = flux/angleFactor; // Flux with angle.
129  if ( divideByArea ) flux /= square;
130  //
131  G4int index = GetIndex(aStep);
132  EvtMap->add(index,flux);
133  }
134  }
135 #ifdef debug
136  G4cout << " PASSED vol "
137  << index << " trk "<<trkid<<" len " << fFlatSurfaceFlux<<G4endl;
138 #endif
139 
140  return TRUE;
141 }
G4double GetXHalfLength() const
G4double GetWeight() const
G4int IsSelectedSurface(G4Step *, G4Box *)
virtual void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
Definition: G4VSolid.cc:137
Definition: G4Box.hh:63
virtual G4VSolid * ComputeSolid(const G4int, G4VPhysicalVolume *)
virtual const G4NavigationHistory * GetHistory() const
Definition: G4VTouchable.cc:86
const G4VTouchable * GetTouchable() const
int G4int
Definition: G4Types.hh:78
double z() const
G4StepPoint * GetPreStepPoint() const
const G4ThreeVector & GetMomentumDirection() const
G4GLOB_DLL std::ostream G4cout
G4VPhysicalVolume * GetPhysicalVolume() const
G4int add(const G4int &key, T *&aHit) const
Definition: G4THitsMap.hh:138
#define FALSE
Definition: globals.hh:52
virtual G4VPVParameterisation * GetParameterisation() const =0
virtual G4int GetIndex(G4Step *)
G4double GetYHalfLength() const
#define TRUE
Definition: globals.hh:55
G4LogicalVolume * GetLogicalVolume() const
G4StepPoint * GetPostStepPoint() const
G4ThreeVector TransformAxis(const G4ThreeVector &axis) const
#define G4endl
Definition: G4ios.hh:61
const G4AffineTransform & GetTopTransform() const
double G4double
Definition: G4Types.hh:76
const G4TouchableHandle & GetTouchableHandle() const
G4VSolid * GetSolid() const
void G4PSFlatSurfaceFlux::SetUnit ( const G4String unit)
virtual

Definition at line 204 of file G4PSFlatSurfaceFlux.cc.

References G4VPrimitiveScorer::CheckAndSetUnit(), G4Exception(), G4VPrimitiveScorer::GetName(), G4VPrimitiveScorer::GetUnit(), JustWarning, G4VPrimitiveScorer::unitName, and G4VPrimitiveScorer::unitValue.

Referenced by G4PSFlatSurfaceFlux(), G4PSFlatSurfaceFlux3D::G4PSFlatSurfaceFlux3D(), and G4ScoreQuantityMessenger::SetNewValue().

205 {
206  if ( divideByArea ) {
207  CheckAndSetUnit(unit,"Per Unit Surface");
208  } else {
209  if (unit == "" ){
210  unitName = unit;
211  unitValue = 1.0;
212  }else{
213  G4String msg = "Invalid unit ["+unit+"] (Current unit is [" +GetUnit()+"] ) for " + GetName();
214  G4Exception("G4PSFlatSurfaceFlux::SetUnit","DetPS0008",JustWarning,msg);
215  }
216  }
217 }
G4String GetName() const
void CheckAndSetUnit(const G4String &unit, const G4String &category)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
const G4String & GetUnit() const
void G4PSFlatSurfaceFlux::Weighted ( G4bool  flg = true)
inline

Definition at line 70 of file G4PSFlatSurfaceFlux.hh.

Referenced by G4ScoreQuantityMessenger::SetNewValue().

70 { weighted = flg; }

The documentation for this class was generated from the following files: