ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcPhysicsList.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcPhysicsList.hh
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 
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