Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Static Public Member Functions
G4MuonMinusBoundDecay Class Reference

#include <G4MuonMinusBoundDecay.hh>

Inheritance diagram for G4MuonMinusBoundDecay:
G4HadronicInteraction

Public Member Functions

 G4MuonMinusBoundDecay ()
 
 ~G4MuonMinusBoundDecay ()
 
G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
 
void ModelDescription (std::ostream &outFile) const
 
- Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
 
virtual ~G4HadronicInteraction ()
 
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
 
virtual G4bool IsApplicable (const G4HadProjectile &, G4Nucleus &)
 
G4double GetMinEnergy () const
 
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMinEnergy (G4double anEnergy)
 
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
 
G4double GetMaxEnergy () const
 
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
 
void SetMaxEnergy (const G4double anEnergy)
 
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
 
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
 
const G4HadronicInteractionGetMyPointer () const
 
virtual G4int GetVerboseLevel () const
 
virtual void SetVerboseLevel (G4int value)
 
const G4StringGetModelName () const
 
void DeActivateFor (const G4Material *aMaterial)
 
void ActivateFor (const G4Material *aMaterial)
 
void DeActivateFor (const G4Element *anElement)
 
void ActivateFor (const G4Element *anElement)
 
G4bool IsBlocked (const G4Material *aMaterial) const
 
G4bool IsBlocked (const G4Element *anElement) const
 
void SetRecoilEnergyThreshold (G4double val)
 
G4double GetRecoilEnergyThreshold () const
 
G4bool operator== (const G4HadronicInteraction &right) const
 
G4bool operator!= (const G4HadronicInteraction &right) const
 
virtual const std::pair
< G4double, G4double
GetFatalEnergyCheckLevels () const
 
virtual std::pair< G4double,
G4double
GetEnergyMomentumCheckLevels () const
 
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
 

Static Public Member Functions

static G4double GetMuonCaptureRate (G4int Z, G4int A)
 
static G4double GetMuonDecayRate (G4int Z)
 
static G4double GetMuonZeff (G4int Z)
 

Additional Inherited Members

- Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
 
G4bool IsBlocked () const
 
void Block ()
 
- Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
 
G4int verboseLevel
 
G4double theMinEnergy
 
G4double theMaxEnergy
 
G4bool isBlocked
 

Detailed Description

Definition at line 71 of file G4MuonMinusBoundDecay.hh.

Constructor & Destructor Documentation

G4MuonMinusBoundDecay::G4MuonMinusBoundDecay ( )

Definition at line 62 of file G4MuonMinusBoundDecay.cc.

References G4ParticleDefinition::GetPDGMass(), and G4MuonMinus::MuonMinus().

63  : G4HadronicInteraction("muMinusBoundDeacy")
64 {
65  fMuMass = G4MuonMinus::MuonMinus()->GetPDGMass();
66 }
G4HadronicInteraction(const G4String &modelName="HadronicModel")
G4double GetPDGMass() const
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:100
G4MuonMinusBoundDecay::~G4MuonMinusBoundDecay ( )

Definition at line 70 of file G4MuonMinusBoundDecay.cc.

71 {}

Member Function Documentation

G4HadFinalState * G4MuonMinusBoundDecay::ApplyYourself ( const G4HadProjectile aTrack,
G4Nucleus targetNucleus 
)
virtual

Implements G4HadronicInteraction.

Definition at line 76 of file G4MuonMinusBoundDecay.cc.

References G4AntiNeutrinoE::AntiNeutrinoE(), CLHEP::HepLorentzVector::boost(), CLHEP::HepLorentzVector::boostVector(), G4HadFinalState::Clear(), CLHEP::HepLorentzVector::e(), G4Electron::Electron(), python.hepunit::electron_mass_c2, G4RandomDirection(), G4UniformRand, G4Nucleus::GetA_asInt(), G4HadProjectile::GetBoundEnergy(), GetMuonCaptureRate(), GetMuonDecayRate(), G4Nucleus::GetZ_asInt(), isAlive, G4InuclParticleNames::lambda, CLHEP::HepLorentzVector::mag2(), G4NeutrinoMu::NeutrinoMu(), G4HadProjectile::SetGlobalTime(), G4HadFinalState::SetStatusChange(), stopAndKill, CLHEP::Hep3Vector::unit(), CLHEP::HepLorentzVector::vect(), and test::x.

78 {
79  result.Clear();
80  G4int Z = targetNucleus.GetZ_asInt();
81  G4int A = targetNucleus.GetA_asInt();
82 
83  // Decide on Decay or Capture, and doit.
84  G4double lambdac = GetMuonCaptureRate(Z, A);
85  G4double lambdad = GetMuonDecayRate(Z);
86  G4double lambda = lambdac + lambdad;
87 
88  // === sample capture time and change time of projectile
89 
90  G4double time = -std::log(G4UniformRand()) / lambda;
91  G4HadProjectile* p = const_cast<G4HadProjectile*>(&projectile);
92  p->SetGlobalTime(time);
93 
94  //G4cout << "lambda= " << lambda << " lambdac= " << lambdac
95  //<< " t= " << time << G4endl;
96 
97  // cascade
98  if( G4UniformRand()*lambda < lambdac) {
99  result.SetStatusChange(isAlive);
100 
101  } else {
102 
103  // Simulation on Decay of mu- on a K-shell of the muonic atom
105  G4double xmax = 1 + electron_mass_c2*electron_mass_c2/(fMuMass*fMuMass);
106  G4double xmin = 2.0*electron_mass_c2/fMuMass;
107  G4double KEnergy = projectile.GetBoundEnergy();
108 
109  /*
110  G4cout << "G4MuonMinusBoundDecay::ApplyYourself"
111  << " XMAX= " << xmax << " Ebound= " << KEnergy<< G4endl;
112  */
113  G4double pmu = std::sqrt(KEnergy*(KEnergy + 2.0*fMuMass));
114  G4double emu = KEnergy + fMuMass;
116  G4LorentzVector MU(pmu*dir, emu);
117  G4ThreeVector bst = MU.boostVector();
118 
119  G4double Eelect, Pelect, x, ecm;
120  G4LorentzVector EL, NN;
121  // Calculate electron energy
122  do {
123  do {
124  x = xmin + (xmax-xmin)*G4UniformRand();
125  } while (G4UniformRand() > (3.0 - 2.0*x)*x*x );
126  Eelect = x*fMuMass*0.5;
127  Pelect = 0.0;
128  if(Eelect > electron_mass_c2) {
129  Pelect = std::sqrt(Eelect*Eelect - electron_mass_c2*electron_mass_c2);
130  } else {
131  Pelect = 0.0;
132  Eelect = electron_mass_c2;
133  }
134  dir = G4RandomDirection();
135  EL = G4LorentzVector(Pelect*dir,Eelect);
136  EL.boost(bst);
137  Eelect = EL.e() - electron_mass_c2 - 2.0*KEnergy;
138  //
139  // Calculate rest frame parameters of 2 neutrinos
140  //
141  NN = MU - EL;
142  ecm = NN.mag2();
143  } while (Eelect < 0.0 || ecm < 0.0);
144 
145  //
146  // Create electron
147  //
149  EL.vect().unit(),
150  Eelect);
151 
152  AddNewParticle(dp, time);
153  //
154  // Create Neutrinos
155  //
156  ecm = 0.5*std::sqrt(ecm);
157  bst = NN.boostVector();
158  G4ThreeVector p1 = ecm * G4RandomDirection();
159  G4LorentzVector N1 = G4LorentzVector(p1,ecm);
160  N1.boost(bst);
162  AddNewParticle(dp, time);
163  NN -= N1;
165  AddNewParticle(dp, time);
166  }
167  return &result;
168 }
G4int GetA_asInt() const
Definition: G4Nucleus.hh:109
Hep3Vector boostVector() const
const char * p
Definition: xmltok.h:285
void SetGlobalTime(G4double t)
G4ThreeVector G4RandomDirection()
int G4int
Definition: G4Types.hh:78
void SetStatusChange(G4HadFinalStateStatus aS)
static G4AntiNeutrinoE * AntiNeutrinoE()
#define G4UniformRand()
Definition: Randomize.hh:87
static G4NeutrinoMu * NeutrinoMu()
Definition: G4NeutrinoMu.cc:85
HepLorentzVector & boost(double, double, double)
float electron_mass_c2
Definition: hepunit.py:274
double mag2() const
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:115
static G4Electron * Electron()
Definition: G4Electron.cc:94
double G4double
Definition: G4Types.hh:76
static G4double GetMuonDecayRate(G4int Z)
static G4double GetMuonCaptureRate(G4int Z, G4int A)
CLHEP::HepLorentzVector G4LorentzVector
G4double G4MuonMinusBoundDecay::GetMuonCaptureRate ( G4int  Z,
G4int  A 
)
static

Definition at line 172 of file G4MuonMinusBoundDecay.cc.

References GetMuonZeff(), G4InuclParticleNames::lambda, python.hepunit::microsecond, and plottest35::t1.

Referenced by ApplyYourself(), and G4StopElementSelector::GetMuonCaptureRate().

173 {
174 
175  // Initialize data
176 
177  // Mu- capture data from
178  // T. Suzuki, D. F. Measday, J.P. Roalsvig Phys.Rev. C35 (1987) 2212
179  // weighted average of the two most precise measurements
180 
181  // Data for Hydrogen from Phys. Rev. Lett. 99(2007)032002
182  // Data for Helium from D.F. Measday Phys. Rep. 354(2001)243
183 
184  struct capRate {
185  G4int Z;
186  G4int A;
187  G4double cRate;
188  G4double cRErr;
189  };
190 
191  // this struct has to be sorted by Z when initialized as we exit the
192  // loop once Z is above the stored value; cRErr are not used now but
193  // are included for completeness and future use
194 
195  const capRate capRates [] = {
196  { 1, 1, 0.000725, 0.000017 },
197  { 2, 3, 0.002149, 0.00017 },
198  { 2, 4, 0.000356, 0.000026 },
199  { 3, 6, 0.004647, 0.00012 },
200  { 3, 7, 0.002229, 0.00012 },
201  { 4, 9, 0.006107, 0.00019 },
202  { 5, 10, 0.02757 , 0.00063 },
203  { 5, 11, 0.02188 , 0.00064 },
204  { 6, 12, 0.03807 , 0.00031 },
205  { 6, 13, 0.03474 , 0.00034 },
206  { 7, 14, 0.06885 , 0.00057 },
207  { 8, 16, 0.10242 , 0.00059 },
208  { 8, 18, 0.0880 , 0.0015 },
209  { 9, 19, 0.22905 , 0.00099 },
210  { 10, 20, 0.2288 , 0.0045 },
211  { 11, 23, 0.3773 , 0.0014 },
212  { 12, 24, 0.4823 , 0.0013 },
213  { 13, 27, 0.6985 , 0.0012 },
214  { 14, 28, 0.8656 , 0.0015 },
215  { 15, 31, 1.1681 , 0.0026 },
216  { 16, 32, 1.3510 , 0.0029 },
217  { 17, 35, 1.800 , 0.050 },
218  { 17, 37, 1.250 , 0.050 },
219  { 18, 40, 1.2727 , 0.0650 },
220  { 19, 39, 1.8492 , 0.0050 },
221  { 20, 40, 2.5359 , 0.0070 },
222  { 21, 45, 2.711 , 0.025 },
223  { 22, 48, 2.5908 , 0.0115 },
224  { 23, 51, 3.073 , 0.022 },
225  { 24, 50, 3.825 , 0.050 },
226  { 24, 52, 3.465 , 0.026 },
227  { 24, 53, 3.297 , 0.045 },
228  { 24, 54, 3.057 , 0.042 },
229  { 25, 55, 3.900 , 0.030 },
230  { 26, 56, 4.408 , 0.022 },
231  { 27, 59, 4.945 , 0.025 },
232  { 28, 58, 6.11 , 0.10 },
233  { 28, 60, 5.56 , 0.10 },
234  { 28, 62, 4.72 , 0.10 },
235  { 29, 63, 5.691 , 0.030 },
236  { 30, 66, 5.806 , 0.031 },
237  { 31, 69, 5.700 , 0.060 },
238  { 32, 72, 5.561 , 0.031 },
239  { 33, 75, 6.094 , 0.037 },
240  { 34, 80, 5.687 , 0.030 },
241  { 35, 79, 7.223 , 0.28 },
242  { 35, 81, 7.547 , 0.48 },
243  { 37, 85, 6.89 , 0.14 },
244  { 38, 88, 6.93 , 0.12 },
245  { 39, 89, 7.89 , 0.11 },
246  { 40, 91, 8.620 , 0.053 },
247  { 41, 93, 10.38 , 0.11 },
248  { 42, 96, 9.298 , 0.063 },
249  { 45, 103, 10.010 , 0.045 },
250  { 46, 106, 10.000 , 0.070 },
251  { 47, 107, 10.869 , 0.095 },
252  { 48, 112, 10.624 , 0.094 },
253  { 49, 115, 11.38 , 0.11 },
254  { 50, 119, 10.60 , 0.11 },
255  { 51, 121, 10.40 , 0.12 },
256  { 52, 128, 9.174 , 0.074 },
257  { 53, 127, 11.276 , 0.098 },
258  { 55, 133, 10.98 , 0.25 },
259  { 56, 138, 10.112 , 0.085 },
260  { 57, 139, 10.71 , 0.10 },
261  { 58, 140, 11.501 , 0.087 },
262  { 59, 141, 13.45 , 0.13 },
263  { 60, 144, 12.35 , 0.13 },
264  { 62, 150, 12.22 , 0.17 },
265  { 64, 157, 12.00 , 0.13 },
266  { 65, 159, 12.73 , 0.13 },
267  { 66, 163, 12.29 , 0.18 },
268  { 67, 165, 12.95 , 0.13 },
269  { 68, 167, 13.04 , 0.27 },
270  { 72, 178, 13.03 , 0.21 },
271  { 73, 181, 12.86 , 0.13 },
272  { 74, 184, 12.76 , 0.16 },
273  { 79, 197, 13.35 , 0.10 },
274  { 80, 201, 12.74 , 0.18 },
275  { 81, 205, 13.85 , 0.17 },
276  { 82, 207, 13.295 , 0.071 },
277  { 83, 209, 13.238 , 0.065 },
278  { 90, 232, 12.555 , 0.049 },
279  { 92, 238, 12.592 , 0.035 },
280  { 92, 233, 14.27 , 0.15 },
281  { 92, 235, 13.470 , 0.085 },
282  { 92, 236, 13.90 , 0.40 },
283  { 93, 237, 13.58 , 0.18 },
284  { 94, 239, 13.90 , 0.20 },
285  { 94, 242, 12.86 , 0.19 }
286  };
287 
288  G4double lambda = -1.;
289 
290  size_t nCapRates = sizeof(capRates)/sizeof(capRates[0]);
291  for (size_t j = 0; j < nCapRates; ++j) {
292  if( capRates[j].Z == Z && capRates[j].A == A ) {
293  lambda = capRates[j].cRate / microsecond;
294  break;
295  }
296  // make sure the data is sorted for the next statement to work correctly
297  if (capRates[j].Z > Z) {break;}
298  }
299 
300  if (lambda < 0.) {
301 
302  // == Mu capture lifetime (Goulard and Primakoff PRC10(1974)2034.
303 
304  const G4double b0a = -0.03;
305  const G4double b0b = -0.25;
306  const G4double b0c = 3.24;
307  const G4double t1 = 875.e-9; // -10-> -9 suggested by user
308  G4double r1 = GetMuonZeff(Z);
309  G4double zeff2 = r1 * r1;
310 
311  // ^-4 -> ^-5 suggested by user
312  G4double xmu = zeff2 * 2.663e-5;
313  G4double a2ze = 0.5 *G4double(A) / G4double(Z);
314  G4double r2 = 1.0 - xmu;
315  lambda = t1 * zeff2 * zeff2 * (r2 * r2) * (1.0 - (1.0 - xmu) * .75704) *
316  (a2ze * b0a + 1.0 - (a2ze - 1.0) * b0b -
317  G4double(2 * (A - Z) + std::fabs(a2ze - 1.) ) * b0c / G4double(A * 4) );
318 
319  }
320 
321  return lambda;
322 
323 }
int G4int
Definition: G4Types.hh:78
static G4double GetMuonZeff(G4int Z)
tuple t1
Definition: plottest35.py:33
double G4double
Definition: G4Types.hh:76
int microsecond
Definition: hepunit.py:85
G4double G4MuonMinusBoundDecay::GetMuonDecayRate ( G4int  Z)
static

Definition at line 360 of file G4MuonMinusBoundDecay.cc.

References python.hepunit::fine_structure_const, GetMuonZeff(), G4InuclParticleNames::lambda, python.hepunit::microsecond, and test::x.

Referenced by ApplyYourself(), and G4StopElementSelector::GetMuonDecayRate().

361 {
362  // Decay time on K-shell
363  // N.C.Mukhopadhyay Phys. Rep. 30 (1977) 1.
364 
365  // this is the "small Z" approximation formula (2.9)
366  // Lambda(bound)/Lambda(free) = 1-beta(Z*alpha)**2 with beta~=2.5
367  // we assume that Z is Zeff
368 
369  // PDG 2012 muon lifetime value is 2.1969811(22) 10e-6s
370  // which when inverted gives 0.45517005 10e+6/s
371 
372  struct decRate {
373  G4int Z;
374  G4double dRate;
375  G4double dRErr;
376  };
377 
378  // this struct has to be sorted by Z when initialized as we exit the
379  // loop once Z is above the stored value
380 
381  const decRate decRates [] = {
382  { 1, 0.4558514, 0.0000151 }
383  };
384 
385  G4double lambda = -1.;
386 
387  // size_t nDecRates = sizeof(decRates)/sizeof(decRates[0]);
388  // for (size_t j = 0; j < nDecRates; ++j) {
389  // if( decRates[j].Z == Z ) {
390  // lambda = decRates[j].dRate / microsecond;
391  // break;
392  // }
393  // // make sure the data is sorted for the next statement to work
394  // if (decRates[j].Z > Z) {break;}
395  // }
396 
397  // we'll use the above code once we have more data
398  // since we only have one value we just assign it
399  if (Z == 1) {lambda = decRates[0].dRate/microsecond;}
400 
401  if (lambda < 0.) {
402  const G4double freeMuonDecayRate = 0.45517005 / microsecond;
403  lambda = 1.0;
405  lambda -= 2.5 * x * x;
406  lambda *= freeMuonDecayRate;
407  }
408 
409  return lambda;
410 
411 }
int G4int
Definition: G4Types.hh:78
static G4double GetMuonZeff(G4int Z)
double G4double
Definition: G4Types.hh:76
int microsecond
Definition: hepunit.py:85
G4double G4MuonMinusBoundDecay::GetMuonZeff ( G4int  Z)
static

Definition at line 328 of file G4MuonMinusBoundDecay.cc.

Referenced by GetMuonCaptureRate(), and GetMuonDecayRate().

329 {
330 
331  // == Effective charges from
332  // "Total Nuclear Capture Rates for Negative Muons"
333  // T. Suzuki, D. F. Measday, J.P. Roalsvig Phys.Rev. C35 (1987) 2212
334  // and if not present from
335  // Ford and Wills Nucl Phys 35(1962)295 or interpolated
336 
337 
338  const size_t maxZ = 100;
339  const G4double zeff[maxZ+1] =
340  { 0.,
341  1.00, 1.98, 2.94, 3.89, 4.81, 5.72, 6.61, 7.49, 8.32, 9.14,
342  9.95,10.69,11.48,12.22,12.90,13.64,14.24,14.89,15.53,16.15,
343  16.77,17.38,18.04,18.49,19.06,19.59,20.13,20.66,21.12,21.61,
344  22.02,22.43,22.84,23.24,23.65,24.06,24.47,24.85,25.23,25.61,
345  25.99,26.37,26.69,27.00,27.32,27.63,27.95,28.20,28.42,28.64,
346  28.79,29.03,29.27,29.51,29.75,29.99,30.22,30.36,30.53,30.69,
347  30.85,31.01,31.18,31.34,31.48,31.62,31.76,31.90,32.05,32.19,
348  32.33,32.47,32.61,32.76,32.94,33.11,33.29,33.46,33.64,33.81,
349  34.21,34.18,34.00,34.10,34.21,34.31,34.42,34.52,34.63,34.73,
350  34.84,34.94,35.05,35.16,35.25,35.36,35.46,35.57,35.67,35.78 };
351 
352  if (Z<0) {Z=0;}
353  if (Z>G4int(maxZ)) {Z=maxZ;}
354 
355  return zeff[Z];
356 
357 }
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76
void G4MuonMinusBoundDecay::ModelDescription ( std::ostream &  outFile) const
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 415 of file G4MuonMinusBoundDecay.cc.

416 {
417  outFile << "Sample probabilities of mu- nuclear capture of decay"
418  << " from K-shell orbit.\n"
419  << " Time of projectile is changed taking into account life time"
420  << " of muonic atom.\n"
421  << " If decay is sampled primary state become stopAndKill,"
422  << " else - isAlive.\n"
423  << " Based of reviews:\n"
424  << " N.C.Mukhopadhyay Phy. Rep. 30 (1977) 1.\n"
425  << " T. Suzuki, D. F. Measday, J.P. Roalsvig Phys.Rev. C35 (1987) 2212\n";
426 
427 }
std::ofstream outFile
Definition: GammaRayTel.cc:68

The documentation for this class was generated from the following files: