Geant4 Cross Reference |
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 // File: G4ProtonDecay.cc // 29 // Author: L.G. Sarmiento (Lund) // 30 // Date: 10 March 2015 // 31 // // 32 //////////////////////////////////////////////////////////////////////////////// 33 34 #include "G4ProtonDecay.hh" 35 #include "G4IonTable.hh" 36 #include "Randomize.hh" 37 #include "G4ThreeVector.hh" 38 #include "G4DynamicParticle.hh" 39 #include "G4DecayProducts.hh" 40 #include "G4PhysicalConstants.hh" 41 #include "G4SystemOfUnits.hh" 42 #include <iostream> 43 #include <iomanip> 44 45 G4ProtonDecay::G4ProtonDecay(const G4ParticleDefinition* theParentNucleus, 46 const G4double& branch, const G4double& Qvalue, 47 const G4double& excitationE, 48 const G4Ions::G4FloatLevelBase& flb) 49 : G4NuclearDecay("proton decay", Proton, excitationE, flb), transitionQ(Qvalue) 50 { 51 SetParent(theParentNucleus); // Store name of parent nucleus, delete G4MT_parent 52 SetBR(branch); 53 54 SetNumberOfDaughters(2); 55 G4IonTable* theIonTable = 56 (G4IonTable*)(G4ParticleTable::GetParticleTable()->GetIonTable()); 57 G4int daughterZ = theParentNucleus->GetAtomicNumber() - 1; 58 G4int daughterA = theParentNucleus->GetAtomicMass() - 1; 59 SetDaughter(0, theIonTable->GetIon(daughterZ, daughterA, excitationE, flb) ); 60 SetDaughter(1, "proton"); 61 } 62 63 64 G4ProtonDecay::~G4ProtonDecay() 65 {} 66 67 68 G4DecayProducts* G4ProtonDecay::DecayIt(G4double) 69 { 70 // Fill G4MT_parent with theParentNucleus (stored by SetParent in ctor) 71 CheckAndFillParent(); 72 73 // Fill G4MT_daughters with proton and residual nucleus (stored by SetDaughter) 74 CheckAndFillDaughters(); 75 76 G4double protonMass = G4MT_daughters[1]->GetPDGMass(); 77 // Excitation energy included in PDG mass 78 G4double nucleusMass = G4MT_daughters[0]->GetPDGMass(); 79 80 // Q value was calculated from atomic masses. 81 // Use it to get correct proton energy. 82 G4double cmMomentum = std::sqrt(transitionQ*(transitionQ + 2.*protonMass)* 83 (transitionQ + 2.*nucleusMass)* 84 (transitionQ + 2.*protonMass + 2.*nucleusMass) )/ 85 (transitionQ + protonMass + nucleusMass)/2.; 86 87 // Set up final state 88 // parentParticle is set at rest here because boost with correct momentum 89 // is done later 90 G4DynamicParticle parentParticle(G4MT_parent, G4ThreeVector(0,0,0), 0.0); 91 G4DecayProducts* products = new G4DecayProducts(parentParticle); 92 93 G4double costheta = 2.*G4UniformRand()-1.0; 94 G4double sintheta = std::sqrt(1.0 - costheta*costheta); 95 G4double phi = twopi*G4UniformRand()*rad; 96 G4ThreeVector direction(sintheta*std::cos(phi),sintheta*std::sin(phi), 97 costheta); 98 99 G4double KE = std::sqrt(cmMomentum*cmMomentum + protonMass*protonMass) 100 - protonMass; 101 G4DynamicParticle* daughterparticle = 102 new G4DynamicParticle(G4MT_daughters[1], direction, KE, protonMass); 103 products->PushProducts(daughterparticle); 104 105 KE = std::sqrt(cmMomentum*cmMomentum + nucleusMass*nucleusMass) - nucleusMass; 106 daughterparticle = 107 new G4DynamicParticle(G4MT_daughters[0], -1.0*direction, KE, nucleusMass); 108 products->PushProducts(daughterparticle); 109 110 // Energy conservation check 111 // For proton decays, do final energy check against reaction Q value 112 // which is well-measured using atomic mass differences. Nuclear masses 113 // should not be used since they are not usually directly measured and we 114 // always decay atoms and not fully stripped nuclei. 115 /* 116 G4int nProd = products->entries(); 117 G4DynamicParticle* temp = 0; 118 G4double Esum = 0.0; 119 for (G4int i = 0; i < nProd; i++) { 120 temp = products->operator[](i); 121 Esum += temp->GetKineticEnergy(); 122 } 123 G4double eCons = (transitionQ - Esum)/keV; 124 if (eCons > 1.e-07) G4cout << " Proton decay check: Ediff (keV) = " << eCons << G4endl; 125 */ 126 return products; 127 } 128 129 130 void G4ProtonDecay::DumpNuclearInfo() 131 { 132 G4cout << " G4ProtonDecay for parent nucleus " << GetParentName() << G4endl; 133 G4cout << " decays to " << GetDaughterName(0) << " + " << GetDaughterName(1) 134 << " with branching ratio " << GetBR() << "% and Q value " 135 << transitionQ << G4endl; 136 } 137 138