Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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