// // ******************************************************************** // * 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 * // * 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. * // ******************************************************************** // // // $Id: ExN05MinRangeCuts.cc,v 1.4 2002/01/09 17:24:20 ranjard Exp $ // GEANT4 tag $Name: geant4-04-01 $ // // // -------------------------------------------------------------- // GEANT 4 class implementation file // // History: first implementation, based on object model of // 2nd December 1995, G.Cosmo // -------------------------------------------------------------- // 15 April 1998 M.Maire // -------------------------------------------------------------- #include "ExN05MinRangeCuts.hh" #include "G4Step.hh" #include "G4UserLimits.hh" #include "G4VParticleChange.hh" #include "G4EnergyLossTables.hh" ExN05MinRangeCuts::ExN05MinRangeCuts(const G4String& aName) : ExN05SpecialCuts(aName) { if (verboseLevel>1) { G4cout << GetProcessName() << " is created "<< G4endl; } SetProcessType(fUserDefined); } ExN05MinRangeCuts::~ExN05MinRangeCuts() {} ExN05MinRangeCuts::ExN05MinRangeCuts(ExN05MinRangeCuts& right) {} G4double ExN05MinRangeCuts::PostStepGetPhysicalInteractionLength( const G4Track& aTrack, G4double , G4ForceCondition* condition ) { // condition is set to "Not Forced" *condition = NotForced; G4double proposedStep = DBL_MAX; // get the pointer to UserLimits G4UserLimits* pUserLimits = aTrack.GetVolume()->GetLogicalVolume()->GetUserLimits(); const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle(); G4ParticleDefinition* aParticleDef = aTrack.GetDefinition(); if (pUserLimits) { G4double temp = DBL_MAX; //min remaining range G4double eKine = aParticle->GetKineticEnergy(); G4Material* aMaterial = aTrack.GetMaterial(); G4double rangeNow = DBL_MAX; if (aParticleDef->GetPDGCharge() != 0.0) { rangeNow = G4EnergyLossTables::GetRange(aParticleDef,eKine,aMaterial); } temp = (rangeNow - pUserLimits->GetUserMinRange(aTrack)); if (temp < 0.) { proposedStep = 0.; } else { if (proposedStep > temp) proposedStep = temp; } } return proposedStep; }