Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/include/CexmcPhysicsList.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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