Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4NuclearDecayChannel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27//
28// MODULES: G4NuclearDecayChannel.cc
29//
30// Version: 0.b.4
31// Date: 14/04/00
32// Author: F Lei & P R Truscott
33// Organisation: DERA UK
34// Customer: ESA/ESTEC, NOORDWIJK
35// Contract: 12115/96/JG/NL Work Order No. 3
36//
37// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38//
39// CHANGE HISTORY
40// --------------
41//
42// 29 February 2000, P R Truscott, DERA UK
43// 0.b.3 release.
44//
45// 18 October 2002, F Lei
46// modified link metheds in DecayIt() to G4PhotoEvaporation() in order to
47// use the new Internal Coversion feature.
48// 13 April 2000, F Lei, DERA UK
49// Changes made are:
50// 1) Use PhotonEvaporation instead of DiscreteGammaDeexcitation
51// 2) verbose control
52//
53// 17 October 2011, L. Desorgher
54// -Allow the atomic relaxation after de-excitation of exited
55// nuclei even for beta and alpha
56// decay. Bug found and solution proposed by Ko Abe.
57// -Set halflifethreshold by default to a negative value
58//
59// 20 November 2011, V.Ivanchenko
60// - Migration to new design of atomic deexcitation
61//
62// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63///////////////////////////////////////////////////////////////////////////////
64//
66#include "G4SystemOfUnits.hh"
70#include "G4DynamicParticle.hh"
71#include "G4DecayProducts.hh"
72#include "G4DecayTable.hh"
73#include "G4PhysicsLogVector.hh"
75#include "G4IonTable.hh"
76#include "G4HadTmpUtil.hh"
77
80
82#include "G4AtomicShells.hh"
83#include "G4LossTableManager.hh"
84
85//#include "G4AtomicTransitionManager.hh"
86//#include "G4AtomicShell.hh"
87//#include "G4AtomicDeexcitation.hh"
88
91//const G4bool G4NuclearDecayChannel:: FermiOn = true;
92
93//
94// Constructor for one decay product (the nucleus).
95//
98 G4int Verbose,
99 const G4ParticleDefinition* theParentNucleus,
100 G4double theBR,
101 G4double theQtransition,
102 G4int A,
103 G4int Z,
104 G4double theDaughterExcitation)
105 :G4GeneralPhaseSpaceDecay(Verbose), decayMode(theMode), dynamicDaughter(0),
106 RandomEnergy(0)
107{
108#ifdef G4VERBOSE
109 if (GetVerboseLevel()>1)
110 {G4cout <<"G4NuclearDecayChannel constructor for " <<G4int(theMode) <<G4endl;}
111#endif
112 SetParent(theParentNucleus);
113 FillParent();
114 parent_mass = theParentNucleus->GetPDGMass();
115 SetBR (theBR);
117 FillDaughterNucleus (0, A, Z, theDaughterExcitation);
118 Qtransition = theQtransition;
119 halflifethreshold = -1.*second;
120 applyICM = true;
121 applyARM = true;
122}
123
124//
125// Constructor for a daughter nucleus and one other particle.
126//
129 G4int Verbose,
130 const G4ParticleDefinition *theParentNucleus,
131 G4double theBR,
132 G4double theQtransition,
133 G4int A,
134 G4int Z,
135 G4double theDaughterExcitation,
136 const G4String theDaughterName1)
137 :G4GeneralPhaseSpaceDecay(Verbose), decayMode(theMode), dynamicDaughter(0),
138 RandomEnergy(0)
139{
140#ifdef G4VERBOSE
141 if (GetVerboseLevel()>1)
142 {G4cout <<"G4NuclearDecayChannel constructor for " <<G4int(theMode) <<G4endl;}
143#endif
144 SetParent (theParentNucleus);
145 FillParent();
146 parent_mass = theParentNucleus->GetPDGMass();
147 SetBR (theBR);
149 SetDaughter(0, theDaughterName1);
150 FillDaughterNucleus (1, A, Z, theDaughterExcitation);
151 Qtransition = theQtransition;
152 halflifethreshold = -1.*second;
153 applyICM = true;
154 applyARM = true;
155}
156
157//
158// Constructor for a daughter nucleus and two other particles
159//
162 G4int Verbose,
163 const G4ParticleDefinition *theParentNucleus,
164 G4double theBR,
165 G4double /* theFFN */,
166 G4bool /* betaS */,
167 CLHEP::RandGeneral* randBeta,
168 G4double theQtransition,
169 G4int A,
170 G4int Z,
171 G4double theDaughterExcitation,
172 const G4String theDaughterName1,
173 const G4String theDaughterName2)
174 :G4GeneralPhaseSpaceDecay(Verbose), decayMode(theMode), dynamicDaughter(0)
175{
176#ifdef G4VERBOSE
177 if (GetVerboseLevel()>1)
178 {G4cout <<"G4NuclearDecayChannel constructor for " <<G4int(theMode) <<G4endl;}
179#endif
180 SetParent (theParentNucleus);
181 FillParent();
182 parent_mass = theParentNucleus->GetPDGMass();
183 SetBR (theBR);
185 SetDaughter(0, theDaughterName1);
186 SetDaughter(2, theDaughterName2);
187 FillDaughterNucleus(1, A, Z, theDaughterExcitation);
188 RandomEnergy = randBeta;
189 Qtransition = theQtransition;
190 halflifethreshold = -1*second;
191 applyICM = true;
192 applyARM = true;
193}
194
195
196void G4NuclearDecayChannel::FillDaughterNucleus(G4int index, G4int A, G4int Z,
197 G4double theDaughterExcitation)
198{
199 // Determine if the proposed daughter nucleus has a sensible A, Z and excitation
200 // energy.
201 if (A<1 || Z<0 || theDaughterExcitation <0.0)
202 {
203// G4cerr <<"Error in G4NuclearDecayChannel::FillDaughterNucleus";
204// G4cerr <<"Inappropriate values of daughter A, Z or excitation" <<G4endl;
205// G4cerr <<"A = " <<A <<" and Z = " <<Z;
206// G4cerr <<" Ex = " <<theDaughterExcitation*MeV <<"MeV" <<G4endl;
208 ed << "Inappropriate values of daughter A, Z or excitation: "
209 << A << " , " << Z << " , " << theDaughterExcitation*MeV << " MeV "
210 << G4endl;
211 G4Exception("G4NuclearDecayChannel::FillDaughterNucleus()", "HAD_RDM_006",
212 FatalException, ed);
213
214 // G4Exception(__FILE__, G4inttostring(__LINE__), FatalException, "G4NuclearDecayChannel::FillDaughterNucleus");
215 }
216
217 // Save A and Z to local variables. Find the GROUND STATE of the daughter
218 // nucleus and save this, as an ion, in the array of daughters.
219 daughterA = A;
220 daughterZ = Z;
221 if (Z == 1 && A == 1) {
223 } else if (Z == 0 && A == 1) {
225 } else {
226 G4IonTable *theIonTable =
228 daughterNucleus = theIonTable->GetIon(daughterZ, daughterA, theDaughterExcitation*MeV);
229 }
230 daughterExcitation = theDaughterExcitation;
232}
233
234
236{
237 // Load the details of the parent and daughter particles if they have not
238 // been defined properly
239
240 if (parent == 0) FillParent();
241 if (daughters == 0) FillDaughters();
242
243 // We want to ensure that the difference between the total
244 // parent and daughter masses equals the energy liberated by the transition.
245
246 theParentMass = 0.0;
247 for( G4int index=0; index < numberOfDaughters; index++)
248 {theParentMass += daughters[index]->GetPDGMass();}
249 theParentMass += Qtransition ;
250 // bug fix for beta+ decay (flei 25/09/01)
251 if (decayMode == 2) theParentMass -= 2*0.511 * MeV;
252 //
253#ifdef G4VERBOSE
254 if (GetVerboseLevel()>1) {
255 G4cout << "G4NuclearDecayChannel::DecayIt "<< G4endl;
256 G4cout << "the decay mass = " << theParentMass << G4endl;
257 }
258#endif
259
260 SetParentMass (theParentMass);
261
262 // Define a product vector.
263 G4DecayProducts* products = 0;
264
265 // Depending upon the number of daughters, select the appropriate decay
266 // kinematics scheme.
267 switch (numberOfDaughters) {
268 case 0:
269 G4cerr << "G4NuclearDecayChannel::DecayIt ";
270 G4cerr << " daughters not defined " <<G4endl;
271 break;
272 case 1:
273 products = OneBodyDecayIt();
274 break;
275 case 2:
276 products = TwoBodyDecayIt();
277 break;
278 case 3:
279 products = BetaDecayIt();
280 break;
281 default:
282 // G4cerr <<"Error in G4NuclearDecayChannel::DecayIt" <<G4endl;
283 // G4cerr <<"Number of daughters in decay = " <<numberOfDaughters <<G4endl;
284 // G4Exception(__FILE__, G4inttostring(__LINE__), FatalException, "G4NuclearDecayChannel::DecayIt");
285 {
287 ed << " More than 3 daughters in decay: N = " << numberOfDaughters
288 << G4endl;
289 G4Exception("G4NuclearDecayChannel::DecayIt()", "HAD_RDM_007",
290 FatalException, ed);
291 }
292 }
293
294 if (products == 0) {
296 ed << " Parent nucleus " << *parent_name << " was not decayed " << G4endl;
297 G4Exception("G4NuclearDecayChannel::DecayIt()", "HAD_RDM_008",
298 JustWarning, ed);
299 DumpInfo();
300 } else {
301
302 // If the decay is to an excited state of the daughter nuclide, we need
303 // to apply the photo-evaporation process. This includes the IT decay mode itself.
304
305 // Need to hold the shell idex after ICM
306 G4int shellIndex = -1;
307
308 if (daughterExcitation > 0.0) {
309 // Pop the daughter nucleus off the product vector - we need to retain
310 // the momentum of this particle.
311
312 dynamicDaughter = products->PopProducts();
313 G4LorentzVector daughterMomentum = dynamicDaughter->Get4Momentum();
314 G4ThreeVector const daughterMomentum1(static_cast<const G4LorentzVector> (daughterMomentum));
315
316 // Now define a G4Fragment with the correct A, Z and excitation,
317 // and declare and initialise a G4PhotonEvaporation object
318 G4Fragment nucleus(daughterA, daughterZ, daughterMomentum);
319 G4PhotonEvaporation* deexcitation = new G4PhotonEvaporation;
320 deexcitation->SetVerboseLevel(GetVerboseLevel());
321
322 // switch on/off internal electron conversion
323 deexcitation->SetICM(applyICM);
324
325 // Set the maximum life-time for a level that will be treated
326 // Level with life-time longer than this will be outputed as meta-stable
327 // isotope
328 deexcitation->SetMaxHalfLife(halflifethreshold);
329
330 // but in IT mode, we need to force the transition
331 if (decayMode == 0) {
332 deexcitation->RDMForced(true);
333 } else {
334 deexcitation->RDMForced(false);
335 }
336
337 //////////////////////////////////////////////////////////////////////////
338 // //
339 // Now apply photo-evaporation //
340 // Use BreakUp() so limit to one transition at a time, if ICM is //
341 // requested. //
342 // //
343 //////////////////////////////////////////////////////////////////////////
344 // this change is related to bug #1001 (F.Lei 07/05/2010)
345
346 G4FragmentVector* gammas = 0;
347 if (applyICM) {
348 gammas = deexcitation->BreakUp(nucleus);
349 } else {
350 gammas = deexcitation->BreakItUp(nucleus);
351 }
352
353 // the returned G4FragmentVector contains the residual nuclide
354 // as its last entry.
355 G4int nGammas=gammas->size()-1;
356
357 // Go through each gamma/e- and add it to the decay product. The angular
358 // distribution of the gammas is isotropic, and the residual nucleus is
359 // assumed not to have suffered any recoil as a result of this de-excitation.
360 for (G4int ig = 0; ig < nGammas; ig++) {
361 G4DynamicParticle* theGammaRay =
362 new G4DynamicParticle(gammas->operator[](ig)->GetParticleDefinition(),
363 gammas->operator[](ig)->GetMomentum());
364 theGammaRay -> SetProperTime(gammas->operator[](ig)->GetCreationTime());
365 products->PushProducts (theGammaRay);
366 }
367
368 // now the nucleus
369 G4double finalDaughterExcitation = gammas->operator[](nGammas)->GetExcitationEnergy();
370 // f.lei (03/01/03) this is needed to fix the crach in test18
371 if (finalDaughterExcitation <= 1.0*keV) finalDaughterExcitation = 0;
372
374
375 G4IonTable* theIonTable =
378 theIonTable->GetIon(daughterZ,daughterA,finalDaughterExcitation),
379 daughterMomentum1);
380 products->PushProducts (dynamicDaughter);
381
382 // retrive the ICM shell index
383 shellIndex = deexcitation->GetVacantShellNumber();
384
385 // Delete/reset variables associated with the gammas.
386 while (!gammas->empty()) {
387 delete *(gammas->end()-1);
388 gammas->pop_back();
389 }
390 delete gammas;
391 delete deexcitation;
392 } // if daughter excitation > 0
393
394 // Now take care of the EC products which have to go through the ARM
395 G4int eShell = -1;
396 if (decayMode == 3 || decayMode == 4 || decayMode == 5) {
397 switch (decayMode)
398 {
399 case KshellEC:
400 //
401 {
402 eShell = 0; // --> 0 from 1 (f.lei 30/4/2008)
403 }
404 break;
405 case LshellEC:
406 //
407 {
408 eShell = G4int(G4UniformRand()*3)+1;
409 }
410 break;
411 case MshellEC:
412 //
413 {
414 // limit the shell index to 6 as specified by the ARM (F.Lei 06/05/2010)
415 // eShell = G4int(G4UniformRand()*5)+4;
416 eShell = G4int(G4UniformRand()*3)+4;
417 }
418 break;
419 case ERROR:
420 default:
421 G4Exception("G4NuclearDecayChannel::DecayIt()", "HAD_RDM_009",
422 FatalException, "Incorrect decay mode selection");
423 }
424 } else {
425 // For other cases eShell comes from shellIndex resulting from the photo decay
426 // modeled by G4PhotonEvaporation* de-excitation (see above)
427 eShell = shellIndex;
428 }
429
430 // now apply ARM if it is requested and there is a vaccancy
431 if (applyARM && eShell != -1) {
432 G4int aZ = daughterZ;
433
434 // V.Ivanchenko migration to new interface to atomic deexcitation
435 // no check on index of G4MaterialCutsCouple, simplified
436 // check on secondary energy Esec < 0.1 keV
437 G4VAtomDeexcitation* atomDeex =
439 if (atomDeex) {
440 if(atomDeex->IsFluoActive() && aZ > 5 && aZ < 100) { // only applies to 5< Z <100
441 if (eShell >= G4AtomicShells::GetNumberOfShells(aZ)){
443 }
445 const G4AtomicShell* shell = atomDeex->GetAtomicShell(aZ, as);
446 std::vector<G4DynamicParticle*> armProducts;
447 const G4double deexLimit = 0.1*keV;
448 atomDeex->GenerateParticles(&armProducts, shell, aZ, deexLimit, deexLimit);
449 size_t narm = armProducts.size();
450 if (narm > 0) {
451 // L.Desorgher: need to initialize dynamicDaughter in some decay
452 // cases (for example Hg194)
453 dynamicDaughter = products->PopProducts();
455 for (size_t i = 0; i<narm; ++i) {
456 G4DynamicParticle* dp = armProducts[i];
457 G4LorentzVector lv = dp->Get4Momentum().boost(bst);
458 dp->Set4Momentum(lv);
459 products->PushProducts(dp);
460 }
461 products->PushProducts(dynamicDaughter);
462 }
463 }
464 }
465 }
466 } // Parent nucleus decayed
467 /*
468
469 if (atomDeex && aZ > 5 && aZ < 100) { // only applies to 5< Z <100
470 // Retrieve the corresponding identifier and binding energy of the selected shell
471 const G4AtomicTransitionManager* transitionManager = G4AtomicTransitionManager::Instance();
472
473 //check that eShell is smaller than the max number of shells
474 //this to avoid a warning from transitionManager(otherwise the output is the same)
475 //Correction to Bug 1662. L Desorgher (04/02/2011)
476 if (eShell >= transitionManager->NumberOfShells(aZ)){
477 eShell=transitionManager->NumberOfShells(aZ)-1;
478 }
479
480 const G4AtomicShell* shell = transitionManager->Shell(aZ, eShell);
481 G4double bindingEnergy = shell->BindingEnergy();
482 G4int shellId = shell->ShellId();
483
484 G4AtomicDeexcitation* atomDeex = new G4AtomicDeexcitation();
485 //the default is no Auger electron generation.
486 // Switch it on/off here!
487 atomDeex->ActivateAugerElectronProduction(true);
488 std::vector<G4DynamicParticle*>* armProducts = atomDeex->GenerateParticles(aZ,shellId);
489
490 // pop up the daughter before insertion;
491 // f.lei (30/04/2008) check if the total kinetic energy is less than
492 // the shell binding energy; if true add the difference to the daughter to conserve the energy
493 dynamicDaughter = products->PopProducts();
494 G4double tARMEnergy = 0.0;
495 for (size_t i = 0; i < armProducts->size(); i++) {
496 products->PushProducts ((*armProducts)[i]);
497 tARMEnergy += (*armProducts)[i]->GetKineticEnergy();
498 }
499 if ((bindingEnergy - tARMEnergy) > 0.1*keV){
500 G4double dEnergy = dynamicDaughter->GetKineticEnergy() + (bindingEnergy - tARMEnergy);
501 dynamicDaughter->SetKineticEnergy(dEnergy);
502 }
503 products->PushProducts(dynamicDaughter);
504
505#ifdef G4VERBOSE
506 if (GetVerboseLevel()>0)
507 {
508 G4cout <<"G4NuclearDecayChannel::Selected shell number for ARM = " <<shellId <<G4endl;
509 G4cout <<"G4NuclearDecayChannel::ARM products = " <<armProducts->size()<<G4endl;
510 G4cout <<" The binding energy = " << bindingEnergy << G4endl;
511 G4cout <<" Total ARM particle kinetic energy = " << tARMEnergy << G4endl;
512 }
513#endif
514
515 delete armProducts;
516 delete atomDeex;
517 }
518 }
519 */
520 return products;
521}
522
523
524G4DecayProducts* G4NuclearDecayChannel::BetaDecayIt()
525{
526 if (GetVerboseLevel()>1) G4cout << "G4Decay::BetaDecayIt()"<<G4endl;
527
528 //daughters'mass
529 G4double daughtermass[3];
530 G4double sumofdaughtermass = 0.0;
531 G4double pmass = GetParentMass();
532 for (G4int index=0; index<3; index++)
533 {
534 daughtermass[index] = daughters[index]->GetPDGMass();
535 sumofdaughtermass += daughtermass[index];
536 }
537
538 //create parent G4DynamicParticle at rest
539 G4ParticleMomentum dummy;
540 G4DynamicParticle * parentparticle = new G4DynamicParticle( parent, dummy, 0.0);
541
542 //create G4Decayproducts
543 G4DecayProducts *products = new G4DecayProducts(*parentparticle);
544 delete parentparticle;
545
546 G4double Q = pmass - sumofdaughtermass;
547
548 // faster method as suggested by Dirk Kruecker of FZ-Julich
549 G4double daughtermomentum[3];
550 G4double daughterenergy[3];
551 // Use the histogram distribution to generate the beta energy
552 daughterenergy[0] = RandomEnergy->shoot() * Q;
553 daughtermomentum[0] = std::sqrt(daughterenergy[0]*daughterenergy[0] +
554 2.0*daughterenergy[0] * daughtermass[0]);
555
556 // neutrino energy distribution is flat within the kinematical limits
557 G4double rd = 2*G4UniformRand()-1;
558 // limits
559 G4double Mme=pmass-daughtermass[0];
560 G4double K=0.5-daughtermass[1]*daughtermass[1]/(2*Mme*Mme-4*pmass*daughterenergy[0]);
561
562 daughterenergy[2]=K*(Mme-daughterenergy[0]+rd*daughtermomentum[0]);
563 daughtermomentum[2] = daughterenergy[2] ;
564
565 // the recoil nucleus
566 daughterenergy[1] = Q-daughterenergy[0]-daughterenergy[2];
567 G4double recoilmomentumsquared = daughterenergy[1]*daughterenergy[1] +
568 2.0*daughterenergy[1] * daughtermass[1];
569 if (recoilmomentumsquared < 0.0) recoilmomentumsquared = 0.0;
570 daughtermomentum[1] = std::sqrt(recoilmomentumsquared);
571
572 // output message
573 if (GetVerboseLevel()>1) {
574 G4cout <<" daughter 0:" <<daughtermomentum[0]/GeV <<"[GeV/c]" <<G4endl;
575 G4cout <<" daughter 1:" <<daughtermomentum[1]/GeV <<"[GeV/c]" <<G4endl;
576 G4cout <<" daughter 2:" <<daughtermomentum[2]/GeV <<"[GeV/c]" <<G4endl;
577 }
578 //create daughter G4DynamicParticle
579 G4double costheta, sintheta, phi, sinphi, cosphi;
580 G4double costhetan, sinthetan, phin, sinphin, cosphin;
581 costheta = 2.*G4UniformRand()-1.0;
582 sintheta = std::sqrt((1.0-costheta)*(1.0+costheta));
583 phi = twopi*G4UniformRand()*rad;
584 sinphi = std::sin(phi);
585 cosphi = std::cos(phi);
586 G4ParticleMomentum direction0(sintheta*cosphi,sintheta*sinphi,costheta);
587 G4DynamicParticle * daughterparticle
588 = new G4DynamicParticle( daughters[0], direction0*daughtermomentum[0]);
589 products->PushProducts(daughterparticle);
590
591 costhetan = (daughtermomentum[1]*daughtermomentum[1]-
592 daughtermomentum[2]*daughtermomentum[2]-
593 daughtermomentum[0]*daughtermomentum[0])/
594 (2.0*daughtermomentum[2]*daughtermomentum[0]);
595 // added the following test to avoid rounding erros. A problem
596 // reported bye Ben Morgan of Uni.Warwick
597 if (costhetan > 1.) costhetan = 1.;
598 if (costhetan < -1.) costhetan = -1.;
599 sinthetan = std::sqrt((1.0-costhetan)*(1.0+costhetan));
600 phin = twopi*G4UniformRand()*rad;
601 sinphin = std::sin(phin);
602 cosphin = std::cos(phin);
603 G4ParticleMomentum direction2;
604 direction2.setX(sinthetan*cosphin*costheta*cosphi -
605 sinthetan*sinphin*sinphi + costhetan*sintheta*cosphi);
606 direction2.setY(sinthetan*cosphin*costheta*sinphi +
607 sinthetan*sinphin*cosphi + costhetan*sintheta*sinphi);
608 direction2.setZ(-sinthetan*cosphin*sintheta + costhetan*costheta);
609 daughterparticle = new G4DynamicParticle(daughters[2],
610 direction2*(daughtermomentum[2]/direction2.mag()));
611 products->PushProducts(daughterparticle);
612
613 daughterparticle =
615 (direction0*daughtermomentum[0] +
616 direction2*(daughtermomentum[2]/direction2.mag()))*(-1.0));
617 products->PushProducts(daughterparticle);
618
619 if (GetVerboseLevel()>1) {
620 G4cout << "G4NuclearDecayChannel::BetaDecayIt ";
621 G4cout << " create decay products in rest frame " <<G4endl;
622 products->DumpInfo();
623 }
624 return products;
625}
G4AtomicShellEnumerator
@ JustWarning
@ FatalException
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:65
#define ERROR(x)
G4RadioactiveDecayMode
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
void setY(double)
void setZ(double)
double mag() const
void setX(double)
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
static G4int GetNumberOfShells(G4int Z)
void DumpInfo() const
G4DynamicParticle * PopProducts()
G4int PushProducts(G4DynamicParticle *aParticle)
G4LorentzVector Get4Momentum() const
void Set4Momentum(const G4LorentzVector &momentum)
void SetParentMass(const G4double aParentMass)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int J=0)
Definition: G4IonTable.cc:267
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
static G4Neutron * Definition()
Definition: G4Neutron.cc:54
G4ParticleDefinition * daughterNucleus
G4RadioactiveDecayMode decayMode
G4NuclearDecayChannel(const G4RadioactiveDecayMode &, G4int Verbose)
CLHEP::RandGeneral * RandomEnergy
G4DynamicParticle * dynamicDaughter
static const G4double levelTolerance
G4DecayProducts * DecayIt(G4double theParentMass)
static const G4double pTolerance
static G4ParticleTable * GetParticleTable()
G4IonTable * GetIonTable()
virtual G4FragmentVector * BreakItUp(const G4Fragment &nucleus)
void SetMaxHalfLife(G4double)
virtual G4FragmentVector * BreakUp(const G4Fragment &nucleus)
void SetVerboseLevel(G4int verbose)
static G4Proton * Definition()
Definition: G4Proton.cc:49
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
G4String * parent_name
void SetBR(G4double value)
G4int GetVerboseLevel() const
void SetNumberOfDaughters(G4int value)
void SetDaughter(G4int anIndex, const G4ParticleDefinition *particle_type)
G4ParticleDefinition * parent
G4ParticleDefinition ** daughters
void SetParent(const G4ParticleDefinition *particle_type)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76