Geant4  10.00.p02
CexmcPhysicsList.hh
Go to the documentation of this file.
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  *
29  * Filename: CexmcPhysicsList.hh
30  *
31  * Description: mandatory physics list
32  *
33  * Version: 1.0
34  * Created: 11.10.2009 14:51:08
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #ifndef CEXMC_PHYSICS_LIST_HH
45 #define CEXMC_PHYSICS_LIST_HH
46 
47 #include <Randomize.hh>
48 #include <G4Track.hh>
49 #include <G4StepPoint.hh>
50 #include <G4ThreeVector.hh>
51 #include <G4AffineTransform.hh>
52 #include "CexmcPhysicsManager.hh"
53 #include "CexmcProductionModel.hh"
55 #include "CexmcSetup.hh"
56 #include "CexmcException.hh"
57 #include "CexmcCommon.hh"
58 
59 
60 template < typename BasePhysics, template < typename > class StudiedPhysics,
61  typename ProductionModel >
62 class CexmcPhysicsList : public BasePhysics, public CexmcPhysicsManager
63 {
64  public:
66 
67  public:
69 
70  G4bool IsStudiedProcessAllowed( void ) const;
71 
72  void ResampleTrackLengthInTarget( const G4Track * track,
73  const G4StepPoint * stepPoint );
74 
75  void SetupConstructionHook( const CexmcSetup * setup );
76 
77  protected:
78  void CalculateBasicMaxIL( const G4ThreeVector & direction );
79 
80  private:
81  StudiedPhysics< ProductionModel > * studiedPhysics;
82 
84 
86 };
87 
88 
89 template < typename BasePhysics, template < typename > class StudiedPhysics,
90  typename ProductionModel >
92  CexmcPhysicsList() : studiedPhysics( NULL ), targetSolid( NULL )
93 {
94  studiedPhysics = new StudiedPhysics< ProductionModel >( this );
95  this->RegisterPhysics( studiedPhysics );
96 }
97 
98 
99 template < typename BasePhysics, template < typename > class StudiedPhysics,
100  typename ProductionModel >
104 {
105  return studiedPhysics->GetProductionModel();
106 }
107 
108 
109 template < typename BasePhysics, template < typename > class StudiedPhysics,
110  typename ProductionModel >
113 {
114  return numberOfTriggeredStudiedInteractions == 0;
115 }
116 
117 
118 template < typename BasePhysics, template < typename > class StudiedPhysics,
119  typename ProductionModel >
122  const G4StepPoint * stepPoint )
123 {
124  /* BEWARE: all callers must ensure that:
125  * 1) track (or stepPoint if not NULL) is inside target volume:
126  * in this case we can use already calculated targetTransform
127  * 2) track info object is of type CexmcIncidentParticleTrackInfo*:
128  * in this case we can use static_cast<> for trackInfo */
129  CexmcIncidentParticleTrackInfo * trackInfo(
130  static_cast< CexmcIncidentParticleTrackInfo * >(
131  track->GetUserInformation() ) );
132 
133  if ( ! trackInfo )
134  return;
135 
137  G4ThreeVector direction;
138 
139  if ( stepPoint )
140  {
141  position = targetTransform.TransformPoint( stepPoint->GetPosition() );
142  direction = targetTransform.TransformAxis(
143  stepPoint->GetMomentumDirection() );
144  }
145  else
146  {
147  position = targetTransform.TransformPoint( track->GetPosition() );
148  direction = targetTransform.TransformAxis(
149  track->GetMomentumDirection() );
150  }
151 
152  G4double distanceInTarget( targetSolid->DistanceToOut( position,
153  direction ) );
154  trackInfo->ResetCurrentTrackLengthInTarget();
156  std::max( distanceInTarget, proposedMaxIL ) );
157  trackInfo->SetNeedsTrackLengthResampling( false );
158 }
159 
160 
161 template < typename BasePhysics, template < typename > class StudiedPhysics,
162  typename ProductionModel >
165 {
166  /* basicMaxIL is double distance from the point (0, 0, 0) to the edge of the
167  * target solid along the specified direction */
168  basicMaxIL = targetSolid->DistanceToOut( G4ThreeVector(),
169  targetTransform.TransformAxis( direction ) ) * 2;
170 }
171 
172 
173 template < typename BasePhysics, template < typename > class StudiedPhysics,
174  typename ProductionModel >
177 {
178  targetSolid = setup->GetVolume( CexmcSetup::Target )->GetSolid();
179  targetTransform = setup->GetTargetTransform().Inverse();
180 }
181 
182 
183 #endif
184 
CLHEP::Hep3Vector G4ThreeVector
G4AffineTransform Inverse() const
const G4ThreeVector & GetPosition() const
G4VSolid * targetSolid
CexmcProductionModel * GetProductionModel(void)
void ResampleTrackLengthInTarget(const G4Track *track, const G4StepPoint *stepPoint)
G4VUserTrackInformation * GetUserInformation() const
const G4LogicalVolume * GetVolume(SpecialVolumeType volume) const
Definition: CexmcSetup.hh:188
void CalculateBasicMaxIL(const G4ThreeVector &direction)
const G4ThreeVector & GetMomentumDirection() const
#define G4UniformRand()
Definition: Randomize.hh:87
const G4ThreeVector & GetPosition() const
bool G4bool
Definition: G4Types.hh:79
G4bool IsStudiedProcessAllowed(void) const
G4AffineTransform targetTransform
const G4ThreeVector & GetMomentumDirection() const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
int position
Definition: filter.cc:7
const G4AffineTransform & GetTargetTransform(void) const
Definition: CexmcSetup.hh:161
double G4double
Definition: G4Types.hh:76
void SetupConstructionHook(const CexmcSetup *setup)
G4VSolid * GetSolid() const
StudiedPhysics< ProductionModel > * studiedPhysics