// 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: G4IMuIonisation.icc,v 1.2 1999/12/15 14:51:42 gunter Exp $ // GEANT4 tag $Name: geant4-02-00 $ // // // --------------------------------------------------------------- // GEANT 4 class inlined methods file // // For information related to this code contact: // CERN, CN Division, ASD group // History: first implementation, based on object model of // 2nd December 1995, G.Cosmo // ------------ G4IMuIonisation physics process ------------- // by Laszlo Urban, September 1997 // --------------------------------------------------------------- // It is the implementation of the NEW IONISATION PROCESS. // It calculates the ionisation of muons. // *************************************************************** // 24/11/97: correction on MeanFreePath for KinEnergy > HighestLimit // --------------------------------------------------------------- inline G4double G4IMuIonisation::PostStepGetPhysicalInteractionLength( const G4Track& track, G4double previousStepSize, G4ForceCondition* condition ) {// get particle,particle type,kin.energy,material,mat.index const G4double eps=1.e-2 ; const G4double Tfac=0.95,Tfac1=1.-Tfac ; G4double nl,nll,nlold,range,rangeold,rangenext, dEdx,KineticEnergyOld,KineticEnergyNext,value; G4bool isOut; const G4DynamicParticle* particle = track.GetDynamicParticle(); const G4ParticleDefinition* particletype = particle->GetDefinition() ; G4double KineticEnergy = particle->GetKineticEnergy(); G4Material* material = track.GetMaterial(); const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); G4int materialindex = material->GetIndex(); nl = (*theNlambdaTable)[materialindex]-> GetValue(KineticEnergy,isOut); range = G4EnergyLossTables::GetPreciseRangeFromEnergy(particletype, KineticEnergy,material) ; if ( (previousStepSize <=0.0) || (theNumberOfInteractionLengthLeft<=0.0)) { // beggining of tracking (or just after DoIt of this process) ResetNumberOfInteractionLengthLeft(); } else { // subtract NumberOfInteractionLengthLeft if(previousStepSize/range < eps) { nll = (*theNlambdaTable)[materialindex]-> GetValue(Tfac*KineticEnergy,isOut) ; dEdx = G4EnergyLossTables::GetPreciseDEDX(particletype, KineticEnergy, material) ; nlold = nl + dEdx*previousStepSize*(nl-nll)/ (Tfac1*KineticEnergy) ; } else { rangeold = range + previousStepSize ; KineticEnergyOld = G4EnergyLossTables::GetPreciseEnergyFromRange( particletype, rangeold,material); nlold = (*theNlambdaTable)[materialindex]-> GetValue(KineticEnergyOld,isOut); if(nlold < nl) { if(verboseLevel>2) { G4cout << "G4IMuIonisation PostStepGPIL : Nlambda has been" << " increased at update.Nlambda old/new :" << nlold << " " << nl << G4endl; G4cout << "(theNumberOfInteractionLengthLeft has been increased!)" << G4endl ; G4cout << " correction : Nlambda old=new ........." << G4endl; } //corr. of num errror nlold = nl ; } } theNumberOfInteractionLengthLeft -= nlold-nl ; if(theNumberOfInteractionLengthLeft GetValue(Tfac*KineticEnergy,isOut) ; dEdx = G4EnergyLossTables::GetPreciseDEDX(particletype, KineticEnergy, material) ; value = theNumberOfInteractionLengthLeft*Tfac1*KineticEnergy/(dEdx*(nl-nll)) ; } else { KineticEnergyNext = (*theInverseNlambdaTable)[materialindex]-> GetValue(nl-theNumberOfInteractionLengthLeft,isOut); rangenext = G4EnergyLossTables::GetPreciseRangeFromEnergy(particletype, KineticEnergyNext,material); value = range - rangenext ; if(range2) { G4cout << "G4IMuIonisation PostStepGPIL: Step < 0.!, Step=" << value << G4endl ; G4cout << "range,rangenext:" << range << " " << rangenext << G4endl ; G4cout << "correction : rangenext=range ....." << G4endl; } //corr. of num error rangenext = range ; value = range - rangenext ; } } } return value; } inline G4bool G4IMuIonisation::IsApplicable( const G4ParticleDefinition& particle) { return ( (&particle == (const G4ParticleDefinition *)theMuonPlus) ||(&particle == (const G4ParticleDefinition *)theMuonMinus) ); }