Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64 //
65 #include "G4PhysicalConstants.hh"
66 #include "G4SystemOfUnits.hh"
67 #include "G4NuclearLevelManager.hh"
68 #include "G4NuclearLevelStore.hh"
69 #include "G4NuclearDecayChannel.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 
78 #include "G4BetaFermiFunction.hh"
79 #include "G4PhotonEvaporation.hh"
80 
81 #include "G4VAtomDeexcitation.hh"
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;
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;
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;
191  applyICM = true;
192  applyARM = true;
193 }
194 
195 
196 void 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 
338  // //
339  // Now apply photo-evaporation //
340  // Use BreakUp() so limit to one transition at a time, if ICM is //
341  // requested. //
342  // //
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 
373  if (dynamicDaughter) delete dynamicDaughter;
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)){
442  eShell = G4AtomicShells::GetNumberOfShells(aZ)-1;
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 
524 G4DecayProducts* 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 }