Files
geant4/source/processes/hadronic/models/low_energy/src/G4LETritonInelastic.cc
T
2016-06-08 16:18:25 +02:00

96 lines
4.5 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * authors in the GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// Hadronic Process: Triton Inelastic Process
// J.L. Chuma, TRIUMF, 25-Feb-1997
// Last modified: 27-Mar-1997
// J.L. Chuma, 08-May-2001: Update original incident passed back in vec[0]
// from NuclearReaction
//
#include "G4LETritonInelastic.hh"
#include "Randomize.hh"
#include "G4Electron.hh"
G4VParticleChange *
G4LETritonInelastic::ApplyYourself( const G4Track &aTrack,
G4Nucleus &targetNucleus )
{
theParticleChange.Initialize( aTrack );
const G4DynamicParticle *originalIncident = aTrack.GetDynamicParticle();
if (originalIncident->GetKineticEnergy()<= 0.1*MeV) return &theParticleChange;
if( verboseLevel > 1 )
{
G4Material *targetMaterial = aTrack.GetMaterial();
G4cout << "G4LETritonInelastic::ApplyYourself called" << G4endl;
G4cout << "kinetic energy = " << originalIncident->GetKineticEnergy()/MeV << "MeV, ";
G4cout << "target material = " << targetMaterial->GetName() << ", ";
}
// Work-around for lack of model above 100 MeV
if (originalIncident->GetKineticEnergy()/MeV > 100. ||
originalIncident->GetKineticEnergy() <= 0.) return &theParticleChange;
G4double N = targetNucleus.GetN();
G4double Z = targetNucleus.GetZ();
G4double theAtomicMass = targetNucleus.AtomicMass( N, Z )-(Z)*G4Electron::Electron()->GetPDGMass();
G4double massVec[9];
massVec[0] = targetNucleus.AtomicMass( N+3.0, Z+1.0 )-(Z+1.0)*G4Electron::Electron()->GetPDGMass();
massVec[1] = targetNucleus.AtomicMass( N+2.0, Z+1.0 )-(Z+1.0)*G4Electron::Electron()->GetPDGMass();
massVec[2] = targetNucleus.AtomicMass( N+2.0, Z )-(Z)*G4Electron::Electron()->GetPDGMass();
massVec[3] = targetNucleus.AtomicMass( N+1.0, Z )-(Z)*G4Electron::Electron()->GetPDGMass();
massVec[4] = theAtomicMass;
massVec[5] = targetNucleus.AtomicMass( N-1.0, Z-1.0 )-(Z-1.0)*G4Electron::Electron()->GetPDGMass();
massVec[6] = targetNucleus.AtomicMass( N+1.0, Z+1.0 )-(Z+1.0)*G4Electron::Electron()->GetPDGMass();
massVec[7] = massVec[3];
massVec[8] = targetNucleus.AtomicMass( N+1.0, Z-1.0 )-(Z-1.0)*G4Electron::Electron()->GetPDGMass();
G4FastVector<G4ReactionProduct,4> vec; // vec will contain the secondary particles
G4int vecLen = 0;
vec.Initialize( 0 );
theReactionDynamics.NuclearReaction( vec, vecLen, originalIncident,
targetNucleus, theAtomicMass, massVec );
//
G4double p = vec[0]->GetMomentum().mag();
theParticleChange.SetMomentumChange( vec[0]->GetMomentum()*(1./p) );
theParticleChange.SetEnergyChange( vec[0]->GetKineticEnergy() );
//
theParticleChange.SetNumberOfSecondaries( vecLen-1 );
G4DynamicParticle *pd;
for( G4int i=1; i<vecLen; ++i )
{
pd = new G4DynamicParticle();
pd->SetDefinition( vec[i]->GetDefinition() );
pd->SetMomentum( vec[i]->GetMomentum() );
theParticleChange.AddSecondary( pd );
delete vec[i];
}
return &theParticleChange;
}
/* end of file */