G4MuMinusCaptureCascade Class Reference

#include <G4MuMinusCaptureCascade.hh>


Public Member Functions

 G4MuMinusCaptureCascade ()
 ~G4MuMinusCaptureCascade ()
G4int DoCascade (const G4double Z, const G4double A, G4GHEKinematicsVector *Cascade)
void DoBoundMuonMinusDecay (G4double Z, G4int *nCascade, G4GHEKinematicsVector *Cascade)
G4double GetKShellEnergy (G4double Z)
G4ThreeVectorGetRandomVec ()


Detailed Description

Definition at line 48 of file G4MuMinusCaptureCascade.hh.


Constructor & Destructor Documentation

G4MuMinusCaptureCascade::G4MuMinusCaptureCascade (  ) 

Definition at line 55 of file G4MuMinusCaptureCascade.cc.

References G4Electron::Electron(), G4Gamma::Gamma(), G4ParticleDefinition::GetPDGMass(), and G4MuonMinus::MuonMinus().

00056 { 
00057   theElectron = G4Electron::Electron();
00058   theGamma = G4Gamma::Gamma();
00059   Emass = theElectron->GetPDGMass();
00060   MuMass = G4MuonMinus::MuonMinus()->GetPDGMass();
00061 }

G4MuMinusCaptureCascade::~G4MuMinusCaptureCascade (  ) 

Definition at line 65 of file G4MuMinusCaptureCascade.cc.

00066 { }


Member Function Documentation

void G4MuMinusCaptureCascade::DoBoundMuonMinusDecay ( G4double  Z,
G4int nCascade,
G4GHEKinematicsVector Cascade 
)

Definition at line 181 of file G4MuMinusCaptureCascade.cc.

References G4AntiNeutrinoE::AntiNeutrinoE(), G4UniformRand, GetKShellEnergy(), GetRandomVec(), and G4NeutrinoMu::NeutrinoMu().

Referenced by G4MuonMinusCaptureAtRest::AtRestDoIt().

00184 {
00185   // Simulation on Decay of mu- on a K-shell of the muonic atom
00186   G4double xmax = ( 1.0 + Emass*Emass/ (MuMass*MuMass) );
00187   G4double xmin = 2.0*Emass/MuMass;
00188   G4double KEnergy = GetKShellEnergy(Z);
00189   /*
00190   G4cout << "G4MuMinusCaptureCascade::DoBoundMuonMinusDecay" 
00191          << " XMAX= " << xmax
00192          << " Ebound= " << KEnergy
00193          << G4endl;
00194   */
00195   G4double pmu = std::sqrt(KEnergy*(KEnergy + 2.0*MuMass));
00196   G4double emu = KEnergy + MuMass;
00197   G4ThreeVector moment = GetRandomVec();
00198   G4LorentzVector MU(pmu*moment,emu);
00199   G4ThreeVector bst = MU.boostVector();
00200 
00201   G4double Eelect, Pelect, x, ecm;
00202   G4LorentzVector EL, NN;
00203   // Calculate electron energy
00204   do {
00205     do {
00206       x = xmin + (xmax-xmin)*G4UniformRand();
00207     } while (G4UniformRand() > (3.0 - 2.0*x)*x*x );
00208     Eelect = x*MuMass*0.5;
00209     Pelect = 0.0;
00210     if(Eelect > Emass) { 
00211       Pelect = std::sqrt( Eelect*Eelect - Emass*Emass );
00212     } else {
00213       Pelect = 0.0;
00214       Eelect = Emass;
00215     }
00216     G4ThreeVector e_mom = GetRandomVec();
00217     EL = G4LorentzVector(Pelect*e_mom,Eelect);
00218     EL.boost(bst);
00219     Eelect = EL.e() - Emass - 2.0*KEnergy;
00220     //
00221     // Calculate rest frame parameters of 2 neutrinos
00222     //
00223     NN = MU - EL;
00224     ecm = NN.mag2();
00225   } while (Eelect < 0.0 || ecm < 0.0);
00226 
00227   //
00228   // Create electron
00229   //
00230   moment = std::sqrt(Eelect * (Eelect + 2.0*Emass))*(EL.vect().unit());
00231   AddNewParticle(theElectron, moment, Emass, nCascade, Cascade);
00232   //
00233   // Create Neutrinos
00234   //
00235   ecm = 0.5*std::sqrt(ecm);
00236   bst = NN.boostVector();
00237   G4ThreeVector p1 = ecm * GetRandomVec();
00238   G4LorentzVector N1 = G4LorentzVector(p1,ecm);
00239   N1.boost(bst);
00240   G4ThreeVector p1lab = N1.vect();
00241   AddNewParticle(G4AntiNeutrinoE::AntiNeutrinoE(),p1lab,0.0,nCascade,Cascade);
00242   NN -= N1;
00243   G4ThreeVector p2lab = NN.vect();
00244   AddNewParticle(G4NeutrinoMu::NeutrinoMu(),p2lab,0.0,nCascade,Cascade);
00245 
00246   return;
00247 }

G4int G4MuMinusCaptureCascade::DoCascade ( const G4double  Z,
const G4double  A,
G4GHEKinematicsVector Cascade 
)

Definition at line 114 of file G4MuMinusCaptureCascade.cc.

References G4UniformRand, GetKShellEnergy(), and GetRandomVec().

Referenced by G4MuonMinusCaptureAtRest::AtRestDoIt().

00116 {
00117   // Inicialization - cascade start from 14th level
00118   // N.C.Mukhopadhyay Phy. Rep. 30 (1977) 1.
00119   G4int nPart = 0;
00120   G4double EnergyLevel[14];
00121 
00122   G4double mass = MuMass * massA / (MuMass + massA) ;
00123 
00124   const G4double KEnergy = 13.6 * eV * Z * Z * mass/ electron_mass_c2;
00125 
00126   EnergyLevel[0] = GetKShellEnergy(Z);
00127   for( G4int i = 2; i < 15; i++ ) {
00128     EnergyLevel[i-1] = KEnergy / (i*i) ;
00129   }
00130 
00131   G4int nElec  = G4int(Z);
00132   G4int nAuger = 1;
00133   G4int nLevel = 13;
00134   G4double DeltaE;
00135   G4double pGamma = Z*Z*Z*Z;
00136 
00137   // Capture on 14-th level
00138   G4double ptot = std::sqrt(EnergyLevel[13]*(EnergyLevel[13] + 2.0*Emass));
00139   G4ThreeVector moment = ptot * GetRandomVec();
00140 
00141   AddNewParticle(theElectron,moment,Emass,&nPart,Cascade);
00142 
00143   // Emit new photon or electron
00144   // Simplified model for probabilities
00145   // N.C.Mukhopadhyay Phy. Rep. 30 (1977) 1.
00146   do {
00147 
00148     // case of Auger electrons
00149     if((nAuger < nElec) && ((pGamma + 10000.0) * G4UniformRand() < 10000.0) ) {
00150         nAuger++;
00151         DeltaE = EnergyLevel[nLevel-1] - EnergyLevel[nLevel];
00152         nLevel--;
00153 
00154         ptot = std::sqrt(DeltaE * (DeltaE + 2.0*Emass));
00155         moment = ptot * GetRandomVec();
00156 
00157         AddNewParticle(theElectron, moment, Emass, &nPart, Cascade);
00158 
00159     } else {
00160 
00161       // Case of photon cascade, probabilities from
00162       // C.S.Wu and L.Wilets, Ann. Rev. Nuclear Sci. 19 (1969) 527.
00163 
00164       G4double var = (10.0 + G4double(nLevel - 1) ) * G4UniformRand();
00165       G4int iLevel = nLevel - 1 ;
00166       if(var > 10.0) iLevel -= G4int(var-10.0) + 1;
00167       if( iLevel < 0 ) iLevel = 0;
00168       DeltaE = EnergyLevel[iLevel] - EnergyLevel[nLevel];
00169       nLevel = iLevel;
00170       moment = DeltaE * GetRandomVec();
00171       AddNewParticle(theGamma, moment, 0.0, &nPart, Cascade);
00172     }
00173 
00174   } while( nLevel > 0 );
00175 
00176   return nPart;
00177 }

G4double G4MuMinusCaptureCascade::GetKShellEnergy ( G4double  Z  ) 

Definition at line 70 of file G4MuMinusCaptureCascade.cc.

Referenced by DoBoundMuonMinusDecay(), and DoCascade().

00071 { 
00072   // Calculate the Energy of K Mesoatom Level for this Element using
00073   // the Energy of Hydrogen Atom taken into account finite size of the
00074   // nucleus (V.Ivanchenko)
00075   const G4int ListK = 28;
00076   static G4double ListZK[ListK] = {
00077       1., 2.,  4.,  6.,  8., 11., 14., 17., 18., 21., 24.,
00078      26., 29., 32., 38., 40., 41., 44., 49., 53., 55.,
00079      60., 65., 70., 75., 81., 85., 92.};
00080   static G4double ListKEnergy[ListK] = {
00081      0.00275, 0.011, 0.043, 0.098, 0.173, 0.326,
00082      0.524, 0.765, 0.853, 1.146, 1.472,
00083      1.708, 2.081, 2.475, 3.323, 3.627, 
00084      3.779, 4.237, 5.016, 5.647, 5.966,
00085      6.793, 7.602, 8.421, 9.249, 10.222,
00086     10.923,11.984};
00087 
00088   // Energy with finit size corrections
00089   G4double KEnergy = GetLinApprox(ListK,ListZK,ListKEnergy,Z);
00090 
00091   return KEnergy;
00092 }

G4ThreeVector & G4MuMinusCaptureCascade::GetRandomVec (  )  [inline]

Definition at line 111 of file G4MuMinusCaptureCascade.hh.

References G4UniformRand.

Referenced by DoBoundMuonMinusDecay(), and DoCascade().

00112 {
00113   //
00114   // generate uniform vector
00115   //
00116   G4double cost = 2.0 * G4UniformRand() - 1.0;
00117   G4double sint = std::sqrt((1.0 - cost)*(1.0 + cost));
00118   G4double Phi  = CLHEP::twopi * G4UniformRand();
00119   randomVect = G4ThreeVector(sint * std::cos(Phi), sint * std::sin(Phi), cost);
00120   return randomVect;
00121 }


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