Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcTrackingAction.cc

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:  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"
 50 #include "CexmcIncidentParticleTrackInfo.hh"
 51 #include "CexmcProductionModel.hh"
 52 #include "CexmcPhysicsManager.hh"
 53 #include "CexmcSetup.hh"
 54 #include "CexmcException.hh"
 55 #include "CexmcCommon.hh"
 56 
 57 
 58 CexmcTrackingAction::CexmcTrackingAction(
 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(
 66                                     physicsManager->GetProductionModel() );
 67     if ( ! productionModel )
 68         throw CexmcException( CexmcWeirdException );
 69 
 70     incidentParticle = productionModel->GetIncidentParticle();
 71     outputParticle = productionModel->GetOutputParticle();
 72     nucleusOutputParticle = productionModel->GetNucleusOutputParticle();
 73 
 74     if ( ! incidentParticle || ! outputParticle || ! nucleusOutputParticle )
 75         throw CexmcException( CexmcIncompleteProductionModel );
 76 
 77     G4RunManager *      runManager( G4RunManager::GetRunManager() );
 78     const CexmcSetup *  setup( static_cast< const CexmcSetup * >(
 79                                 runManager->GetUserDetectorConstruction() ) );
 80     targetVolume = setup->GetVolume( CexmcSetup::Target );
 81 }
 82 
 83 
 84 void  CexmcTrackingAction::PreUserTrackingAction( const G4Track *  track )
 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(
101                                                     CexmcBeamParticleTrack );
102                 theTrack->SetUserInformation( trackInfo );
103                 SetupIncidentParticleTrackInfo( track );
104             }
105             else
106             {
107                 trackInfo = new CexmcTrackInfo( CexmcBeamParticleTrack );
108             }
109             break;
110         }
111 
112         if ( track->GetCreatorProcess()->GetProcessName() ==
113              CexmcStudiedProcessFullName )
114         {
115             do
116             {
117                 if ( *track->GetDefinition() == *outputParticle )
118                 {
119                     outputParticleTrackId = track->GetTrackID();
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(
135                                     CexmcOutputParticleDecayProductTrack,
136                                     outputParticleDecayProductCopyNumber++ );
137             break;
138         }
139 
140         if ( *track->GetDefinition() == *incidentParticle )
141         {
142             if ( physicsManager->OnlyBeamParticleCanTriggerStudiedProcess() )
143                 break;
144             trackInfo = new CexmcIncidentParticleTrackInfo( CexmcInsipidTrack );
145             theTrack->SetUserInformation( trackInfo );
146             SetupIncidentParticleTrackInfo( track );
147             break;
148         }
149     } while ( false );
150 
151     if ( ! trackInfo )
152         return;
153 
154     if ( ! track->GetUserInformation() )
155         theTrack->SetUserInformation( trackInfo );
156 }
157 
158 
159 void  CexmcTrackingAction::SetupIncidentParticleTrackInfo(
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     {
173         physicsManager->ResampleTrackLengthInTarget( track );
174         trackInfo->ActivateStudiedProcess();
175     }
176 }
177 
178