ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcTrackingAction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcTrackingAction.cc
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: CexmcTrackingAction.cc
30  *
31  * Description: tracking action
32  *
33  * Version: 1.0
34  * Created: 22.11.2009 18:22:22
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * ============================================================================
42  */
43 
44 #include <G4ParticleDefinition.hh>
45 #include <G4VProcess.hh>
46 #include <G4Track.hh>
47 #include <G4RunManager.hh>
48 #include "CexmcTrackingAction.hh"
49 #include "CexmcTrackInfo.hh"
51 #include "CexmcProductionModel.hh"
52 #include "CexmcPhysicsManager.hh"
53 #include "CexmcSetup.hh"
54 #include "CexmcException.hh"
55 #include "CexmcCommon.hh"
56 
57 
59  CexmcPhysicsManager * physicsManager_ ) :
60  physicsManager( physicsManager_ ), targetVolume( NULL ),
61  outputParticleTrackId( CexmcInvalidTrackId ),
62  outputParticleDecayProductCopyNumber( 0 ), incidentParticle( NULL ),
63  outputParticle( NULL ), nucleusOutputParticle( NULL )
64 {
65  CexmcProductionModel * productionModel(
67  if ( ! productionModel )
69 
70  incidentParticle = productionModel->GetIncidentParticle();
71  outputParticle = productionModel->GetOutputParticle();
72  nucleusOutputParticle = productionModel->GetNucleusOutputParticle();
73 
76 
77  G4RunManager * runManager( G4RunManager::GetRunManager() );
78  const CexmcSetup * setup( static_cast< const CexmcSetup * >(
79  runManager->GetUserDetectorConstruction() ) );
81 }
82 
83 
85 {
86  CexmcTrackInfo * trackInfo( static_cast< CexmcTrackInfo * >(
87  track->GetUserInformation() ) );
88 
89  if ( trackInfo )
90  return;
91 
92  G4Track * theTrack( const_cast< G4Track * >( track ) );
93 
94  do
95  {
96  if ( track->GetParentID() == 0 )
97  {
98  if ( *track->GetDefinition() == *incidentParticle )
99  {
100  trackInfo = new CexmcIncidentParticleTrackInfo(
102  theTrack->SetUserInformation( trackInfo );
104  }
105  else
106  {
107  trackInfo = new CexmcTrackInfo( CexmcBeamParticleTrack );
108  }
109  break;
110  }
111 
112  if ( track->GetCreatorProcess()->GetProcessName() ==
114  {
115  do
116  {
117  if ( *track->GetDefinition() == *outputParticle )
118  {
120  trackInfo = new CexmcTrackInfo( CexmcOutputParticleTrack );
121  break;
122  }
123  if ( *track->GetDefinition() == *nucleusOutputParticle )
124  {
125  trackInfo = new CexmcTrackInfo( CexmcNucleusParticleTrack );
126  break;
127  }
128  } while ( false );
129  break;
130  }
131 
132  if ( track->GetParentID() == outputParticleTrackId )
133  {
134  trackInfo = new CexmcTrackInfo(
137  break;
138  }
139 
140  if ( *track->GetDefinition() == *incidentParticle )
141  {
143  break;
145  theTrack->SetUserInformation( trackInfo );
147  break;
148  }
149  } while ( false );
150 
151  if ( ! trackInfo )
152  return;
153 
154  if ( ! track->GetUserInformation() )
155  theTrack->SetUserInformation( trackInfo );
156 }
157 
158 
160  const G4Track * track )
161 {
162  CexmcIncidentParticleTrackInfo * trackInfo(
163  static_cast< CexmcIncidentParticleTrackInfo * >(
164  track->GetUserInformation() ) );
165 
166  if ( ! trackInfo )
167  return;
168 
169  G4VPhysicalVolume * volume( track->GetVolume() );
170 
171  if ( volume && volume->GetLogicalVolume() == targetVolume )
172  {
174  trackInfo->ActivateStudiedProcess();
175  }
176 }
177