G4eCoulombScatteringModel Class Reference

#include <G4eCoulombScatteringModel.hh>

Inheritance diagram for G4eCoulombScatteringModel:

G4VEmModel

Public Member Functions

 G4eCoulombScatteringModel (const G4String &nam="eCoulombScattering")
virtual ~G4eCoulombScatteringModel ()
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A, G4double cut, G4double emax)
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
void SetLowEnergyThreshold (G4double val)
void SetRecoilThreshold (G4double eth)

Protected Member Functions

void DefineMaterial (const G4MaterialCutsCouple *)
void SetupParticle (const G4ParticleDefinition *)

Protected Attributes

G4ParticleTable * theParticleTable
G4ParticleChangeForGamma * fParticleChange
G4WentzelOKandVIxSection * wokvi
G4NistManager * fNistManager
const std::vector< G4double > * pCuts
const G4MaterialCutsCouple * currentCouple
const G4Material * currentMaterial
G4int currentMaterialIndex
G4double cosThetaMin
G4double cosThetaMax
G4double cosTetMinNuc
G4double cosTetMaxNuc
G4double recoilThreshold
G4double elecRatio
G4double mass
const G4ParticleDefinition * particle
const G4ParticleDefinition * theProton
G4double lowEnergyThreshold

Detailed Description

Definition at line 78 of file G4eCoulombScatteringModel.hh.


Constructor & Destructor Documentation

G4eCoulombScatteringModel::G4eCoulombScatteringModel ( const G4String &  nam = "eCoulombScattering"  ) 

Definition at line 79 of file G4eCoulombScatteringModel.cc.

References cosTetMaxNuc, cosTetMinNuc, currentCouple, currentMaterial, currentMaterialIndex, elecRatio, fNistManager, fParticleChange, G4ParticleTable::GetParticleTable(), G4NistManager::Instance(), lowEnergyThreshold, mass, particle, pCuts, G4Proton::Proton(), recoilThreshold, theParticleTable, theProton, and wokvi.

00080   : G4VEmModel(nam),
00081     cosThetaMin(1.0),
00082     cosThetaMax(-1.0),
00083     isInitialised(false)
00084 {
00085   fParticleChange = 0;
00086   fNistManager = G4NistManager::Instance();
00087   theParticleTable = G4ParticleTable::GetParticleTable();
00088   theProton   = G4Proton::Proton();
00089   currentMaterial = 0; 
00090 
00091   pCuts = 0;
00092 
00093   lowEnergyThreshold = 1*keV;  // particle will be killed for lower energy
00094   recoilThreshold = 0.*keV; // by default does not work
00095 
00096   particle = 0;
00097   currentCouple = 0;
00098   wokvi = new G4WentzelOKandVIxSection();
00099 
00100   currentMaterialIndex = 0;
00101 
00102   cosTetMinNuc = 1.0;
00103   cosTetMaxNuc = -1.0;
00104   elecRatio = 0.0;
00105   mass = proton_mass_c2;
00106 }

G4eCoulombScatteringModel::~G4eCoulombScatteringModel (  )  [virtual]

Definition at line 110 of file G4eCoulombScatteringModel.cc.

References wokvi.

00111 {
00112   delete wokvi;
00113 }


Member Function Documentation

G4double G4eCoulombScatteringModel::ComputeCrossSectionPerAtom ( const G4ParticleDefinition *  ,
G4double  kinEnergy,
G4double  Z,
G4double  A,
G4double  cut,
G4double  emax 
) [virtual]

Reimplemented from G4VEmModel.

Definition at line 148 of file G4eCoulombScatteringModel.cc.

References G4WentzelOKandVIxSection::ComputeElectronCrossSection(), G4WentzelOKandVIxSection::ComputeNuclearCrossSection(), cosTetMaxNuc, cosTetMinNuc, cosThetaMax, G4VEmModel::CurrentCouple(), currentMaterial, DefineMaterial(), elecRatio, particle, G4WentzelOKandVIxSection::SetupKinematic(), SetupParticle(), G4WentzelOKandVIxSection::SetupTarget(), theProton, and wokvi.

Referenced by SampleSecondaries().

00153 {
00154   //G4cout << "### G4eCoulombScatteringModel::ComputeCrossSectionPerAtom  for " 
00155   //  << p->GetParticleName()<<" Z= "<<Z<<" e(MeV)= "<< kinEnergy/MeV << G4endl; 
00156   G4double cross = 0.0;
00157   if(p != particle) { SetupParticle(p); }
00158 
00159   // cross section is set to zero to avoid problems in sample secondary
00160   if(kinEnergy <= 0.0) { return cross; }
00161   DefineMaterial(CurrentCouple());
00162   cosTetMinNuc = wokvi->SetupKinematic(kinEnergy, currentMaterial);
00163   if(cosThetaMax < cosTetMinNuc) {
00164     G4int iz = G4int(Z);
00165     cosTetMinNuc = wokvi->SetupTarget(iz, cutEnergy);
00166     cosTetMaxNuc = cosThetaMax; 
00167     if(iz == 1 && cosTetMaxNuc < 0.0 && particle == theProton) { 
00168       cosTetMaxNuc = 0.0; 
00169     }
00170     cross =  wokvi->ComputeNuclearCrossSection(cosTetMinNuc, cosTetMaxNuc);
00171     elecRatio = wokvi->ComputeElectronCrossSection(cosTetMinNuc, cosThetaMax);
00172     cross += elecRatio;
00173     if(cross > 0.0) { elecRatio /= cross; }  
00174   }
00175   /*
00176   if(p->GetParticleName() == "e-") 
00177   G4cout << "e(MeV)= " << kinEnergy/MeV << " cross(b)= " << cross/barn  
00178          << " 1-cosTetMinNuc= " << 1-cosTetMinNuc
00179          << " 1-cosTetMaxNuc= " << 1-cosTetMaxNuc
00180          << G4endl;
00181   */
00182   return cross;  
00183 }

void G4eCoulombScatteringModel::DefineMaterial ( const G4MaterialCutsCouple *   )  [inline, protected]

Definition at line 156 of file G4eCoulombScatteringModel.hh.

References currentCouple, currentMaterial, currentMaterialIndex, G4MaterialCutsCouple::GetIndex(), and G4MaterialCutsCouple::GetMaterial().

Referenced by ComputeCrossSectionPerAtom(), and SampleSecondaries().

00157 { 
00158   if(cup != currentCouple) {
00159     currentCouple = cup;
00160     currentMaterial = cup->GetMaterial();
00161     currentMaterialIndex = currentCouple->GetIndex(); 
00162   }
00163 }

void G4eCoulombScatteringModel::Initialise ( const G4ParticleDefinition *  ,
const G4DataVector &   
) [virtual]

Implements G4VEmModel.

Definition at line 117 of file G4eCoulombScatteringModel.cc.

References cosThetaMin, currentCouple, fParticleChange, G4ProductionCutsTable::GetEnergyCutsVector(), G4VEmModel::GetParticleChangeForGamma(), G4ProductionCutsTable::GetProductionCutsTable(), G4WentzelOKandVIxSection::Initialise(), G4VEmModel::InitialiseElementSelectors(), mass, pCuts, G4VEmModel::PolarAngleLimit(), SetupParticle(), and wokvi.

00119 {
00120   SetupParticle(p);
00121   currentCouple = 0;
00122   cosThetaMin = cos(PolarAngleLimit());
00123   wokvi->Initialise(p, cosThetaMin);
00124   /*    
00125   G4cout << "G4eCoulombScatteringModel: " << particle->GetParticleName()
00126          << "  1-cos(ThetaLimit)= " << 1 - cosThetaMin
00127          << "  cos(thetaMax)= " <<  cosThetaMax
00128          << G4endl;
00129   */
00130   pCuts = G4ProductionCutsTable::GetProductionCutsTable()->GetEnergyCutsVector(3);
00131   /*
00132   G4cout << "!!! G4eCoulombScatteringModel::Initialise for " 
00133          << p->GetParticleName() << "  cos(TetMin)= " << cosThetaMin 
00134          << "  cos(TetMax)= " << cosThetaMax <<G4endl;
00135   G4cout << "cut0= " << cuts[0] << "  cut1= " << cuts[1] << G4endl;
00136   */
00137   if(!isInitialised) {
00138     isInitialised = true;
00139     fParticleChange = GetParticleChangeForGamma();
00140   }
00141   if(mass < GeV) {
00142     InitialiseElementSelectors(p,cuts);
00143   }
00144 }

void G4eCoulombScatteringModel::SampleSecondaries ( std::vector< G4DynamicParticle * > *  ,
const G4MaterialCutsCouple *  ,
const G4DynamicParticle *  ,
G4double  tmin,
G4double  maxEnergy 
) [virtual]

Implements G4VEmModel.

Definition at line 187 of file G4eCoulombScatteringModel.cc.

References ComputeCrossSectionPerAtom(), cosTetMinNuc, cosThetaMax, currentMaterialIndex, DefineMaterial(), elecRatio, fParticleChange, G4DynamicParticle::GetDefinition(), G4ParticleTable::GetIon(), G4DynamicParticle::GetKineticEnergy(), G4DynamicParticle::GetMomentumDirection(), G4WentzelOKandVIxSection::GetMomentumSquare(), G4NucleiProperties::GetNuclearMass(), G4Element::GetZ(), lowEnergyThreshold, mass, particle, pCuts, G4VParticleChange::ProposeLocalEnergyDeposit(), G4ParticleChangeForGamma::ProposeMomentumDirection(), G4VParticleChange::ProposeNonIonizingEnergyDeposit(), recoilThreshold, G4WentzelOKandVIxSection::SampleSingleScattering(), G4VEmModel::SelectIsotopeNumber(), G4VEmModel::SelectRandomAtom(), G4ParticleChangeForGamma::SetProposedKineticEnergy(), G4WentzelOKandVIxSection::SetTargetMass(), SetupParticle(), theParticleTable, and wokvi.

00193 {
00194   G4double kinEnergy = dp->GetKineticEnergy();
00195 
00196   // absorb particle below low-energy limit to avoid situation
00197   // when a particle has no energy loss
00198   if(kinEnergy < lowEnergyThreshold) { 
00199     fParticleChange->SetProposedKineticEnergy(0.0);
00200     fParticleChange->ProposeLocalEnergyDeposit(kinEnergy);
00201     fParticleChange->ProposeNonIonizingEnergyDeposit(kinEnergy);
00202     return; 
00203   }
00204   SetupParticle(dp->GetDefinition());
00205   DefineMaterial(couple);
00206   /*
00207   G4cout << "G4eCoulombScatteringModel::SampleSecondaries e(MeV)= " 
00208          << kinEnergy << "  " << particle->GetParticleName() 
00209          << " cut= " << cutEnergy<< G4endl;
00210   */
00211   // Choose nucleus
00212   const G4Element* currentElement = 
00213     SelectRandomAtom(couple,particle,kinEnergy,cutEnergy,kinEnergy);
00214 
00215   G4double Z = currentElement->GetZ();
00216 
00217   if(ComputeCrossSectionPerAtom(particle,kinEnergy, Z,
00218                                 kinEnergy, cutEnergy, kinEnergy) == 0.0) 
00219     { return; }
00220 
00221   G4int iz = G4int(Z);
00222   G4int ia = SelectIsotopeNumber(currentElement);
00223   G4double targetMass = G4NucleiProperties::GetNuclearMass(ia, iz);
00224   wokvi->SetTargetMass(targetMass);
00225 
00226   G4ThreeVector newDirection = 
00227     wokvi->SampleSingleScattering(cosTetMinNuc, cosThetaMax, elecRatio);
00228   G4double cost = newDirection.z();
00229 
00230   G4ThreeVector direction = dp->GetMomentumDirection(); 
00231   newDirection.rotateUz(direction);   
00232 
00233   fParticleChange->ProposeMomentumDirection(newDirection);   
00234 
00235   // recoil sampling assuming a small recoil
00236   // and first order correction to primary 4-momentum
00237   G4double mom2 = wokvi->GetMomentumSquare();
00238   G4double trec = mom2*(1.0 - cost)/(targetMass + (mass + kinEnergy)*(1.0 - cost));
00239   G4double finalT = kinEnergy - trec; 
00240   //G4cout<<"G4eCoulombScatteringModel: finalT= "<<finalT<<" Trec= "<<trec<<G4endl;
00241   if(finalT <= lowEnergyThreshold) { 
00242     trec = kinEnergy;  
00243     finalT = 0.0;
00244   } 
00245 
00246   fParticleChange->SetProposedKineticEnergy(finalT);
00247   G4double tcut = recoilThreshold;
00248   if(pCuts) { tcut= std::max(tcut,(*pCuts)[currentMaterialIndex]); }
00249 
00250   if(trec > tcut) {
00251     G4ParticleDefinition* ion = theParticleTable->GetIon(iz, ia, 0.0);
00252     G4ThreeVector dir = (direction*sqrt(mom2) - 
00253                          newDirection*sqrt(finalT*(2*mass + finalT))).unit();
00254     G4DynamicParticle* newdp = new G4DynamicParticle(ion, dir, trec);
00255     fvect->push_back(newdp);
00256   } else {
00257     fParticleChange->ProposeLocalEnergyDeposit(trec);
00258     fParticleChange->ProposeNonIonizingEnergyDeposit(trec);
00259   }
00260  
00261   return;
00262 }

void G4eCoulombScatteringModel::SetLowEnergyThreshold ( G4double  val  )  [inline]

Definition at line 180 of file G4eCoulombScatteringModel.hh.

References lowEnergyThreshold.

00181 {
00182   lowEnergyThreshold = val;
00183 }

void G4eCoulombScatteringModel::SetRecoilThreshold ( G4double  eth  )  [inline]

Definition at line 187 of file G4eCoulombScatteringModel.hh.

References recoilThreshold.

00188 {
00189   recoilThreshold = eth;
00190 }

void G4eCoulombScatteringModel::SetupParticle ( const G4ParticleDefinition *   )  [inline, protected]

Definition at line 168 of file G4eCoulombScatteringModel.hh.

References G4ParticleDefinition::GetPDGMass(), mass, particle, G4WentzelOKandVIxSection::SetupParticle(), and wokvi.

Referenced by ComputeCrossSectionPerAtom(), Initialise(), and SampleSecondaries().

00169 {
00170   // Initialise mass and charge
00171   if(p != particle) {
00172     particle = p;
00173     mass = particle->GetPDGMass();
00174     wokvi->SetupParticle(p);
00175   }
00176 }


Field Documentation

G4double G4eCoulombScatteringModel::cosTetMaxNuc [protected]

Definition at line 137 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), and G4eCoulombScatteringModel().

G4double G4eCoulombScatteringModel::cosTetMinNuc [protected]

Definition at line 136 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), G4eCoulombScatteringModel(), and SampleSecondaries().

G4double G4eCoulombScatteringModel::cosThetaMax [protected]

Definition at line 135 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), and SampleSecondaries().

G4double G4eCoulombScatteringModel::cosThetaMin [protected]

Definition at line 134 of file G4eCoulombScatteringModel.hh.

Referenced by Initialise().

const G4MaterialCutsCouple* G4eCoulombScatteringModel::currentCouple [protected]

Definition at line 130 of file G4eCoulombScatteringModel.hh.

Referenced by DefineMaterial(), G4eCoulombScatteringModel(), and Initialise().

const G4Material* G4eCoulombScatteringModel::currentMaterial [protected]

Definition at line 131 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), DefineMaterial(), and G4eCoulombScatteringModel().

G4int G4eCoulombScatteringModel::currentMaterialIndex [protected]

Definition at line 132 of file G4eCoulombScatteringModel.hh.

Referenced by DefineMaterial(), G4eCoulombScatteringModel(), and SampleSecondaries().

G4double G4eCoulombScatteringModel::elecRatio [protected]

Definition at line 139 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), G4eCoulombScatteringModel(), and SampleSecondaries().

G4NistManager* G4eCoulombScatteringModel::fNistManager [protected]

Definition at line 126 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel().

G4ParticleChangeForGamma* G4eCoulombScatteringModel::fParticleChange [protected]

Definition at line 124 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), Initialise(), and SampleSecondaries().

G4double G4eCoulombScatteringModel::lowEnergyThreshold [protected]

Definition at line 146 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), SampleSecondaries(), and SetLowEnergyThreshold().

G4double G4eCoulombScatteringModel::mass [protected]

Definition at line 140 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), Initialise(), SampleSecondaries(), and SetupParticle().

const G4ParticleDefinition* G4eCoulombScatteringModel::particle [protected]

Definition at line 143 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), G4eCoulombScatteringModel(), SampleSecondaries(), and SetupParticle().

const std::vector<G4double>* G4eCoulombScatteringModel::pCuts [protected]

Definition at line 128 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), Initialise(), and SampleSecondaries().

G4double G4eCoulombScatteringModel::recoilThreshold [protected]

Definition at line 138 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), SampleSecondaries(), and SetRecoilThreshold().

G4ParticleTable* G4eCoulombScatteringModel::theParticleTable [protected]

Definition at line 123 of file G4eCoulombScatteringModel.hh.

Referenced by G4eCoulombScatteringModel(), and SampleSecondaries().

const G4ParticleDefinition* G4eCoulombScatteringModel::theProton [protected]

Definition at line 144 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), and G4eCoulombScatteringModel().

G4WentzelOKandVIxSection* G4eCoulombScatteringModel::wokvi [protected]

Definition at line 125 of file G4eCoulombScatteringModel.hh.

Referenced by ComputeCrossSectionPerAtom(), G4eCoulombScatteringModel(), Initialise(), SampleSecondaries(), SetupParticle(), and ~G4eCoulombScatteringModel().


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:51:49 2013 for Geant4 by  doxygen 1.4.7