Geant4 Cross Reference |
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" 54 #include "CexmcIncidentParticleTrackInfo.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: 65 CexmcPhysicsList(); 66 67 public: 68 CexmcProductionModel * GetProductionModel( void ); 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 83 G4VSolid * targetSolid; 84 85 G4AffineTransform targetTransform; 86 }; 87 88 89 template < typename BasePhysics, template < typename > class StudiedPhysics, 90 typename ProductionModel > 91 CexmcPhysicsList< BasePhysics, StudiedPhysics, 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 > 101 CexmcProductionModel * 102 CexmcPhysicsList< BasePhysics, StudiedPhysics, ProductionModel >:: 103 GetProductionModel( void ) 104 { 105 return studiedPhysics->GetProductionModel(); 106 } 107 108 109 template < typename BasePhysics, template < typename > class StudiedPhysics, 110 typename ProductionModel > 111 G4bool CexmcPhysicsList< BasePhysics, StudiedPhysics, ProductionModel >:: 112 IsStudiedProcessAllowed( void ) const 113 { 114 return numberOfTriggeredStudiedInteractions == 0; 115 } 116 117 118 template < typename BasePhysics, template < typename > class StudiedPhysics, 119 typename ProductionModel > 120 void CexmcPhysicsList< BasePhysics, StudiedPhysics, ProductionModel >:: 121 ResampleTrackLengthInTarget( const G4Track * track, 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 136 G4ThreeVector position; 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(); 155 trackInfo->SetFinalTrackLengthInTarget( G4UniformRand() * 156 std::max( distanceInTarget, proposedMaxIL ) ); 157 trackInfo->SetNeedsTrackLengthResampling( false ); 158 } 159 160 161 template < typename BasePhysics, template < typename > class StudiedPhysics, 162 typename ProductionModel > 163 void CexmcPhysicsList< BasePhysics, StudiedPhysics, ProductionModel >:: 164 CalculateBasicMaxIL( const G4ThreeVector & direction ) 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 > 175 void CexmcPhysicsList< BasePhysics, StudiedPhysics, ProductionModel >:: 176 SetupConstructionHook( const CexmcSetup * setup ) 177 { 178 targetSolid = setup->GetVolume( CexmcSetup::Target )->GetSolid(); 179 targetTransform = setup->GetTargetTransform().Inverse(); 180 } 181 182 183 #endif 184 185