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 // neutron_hp -- source file 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron transport model. 29 // 30 // P. Arce, June-2014 Conversion neutron_hp to particle_hp 31 // 32 #include "G4ParticleHPFissionBaseFS.hh" 33 34 #include "G4Alpha.hh" 35 #include "G4Deuteron.hh" 36 #include "G4LorentzVector.hh" 37 #include "G4Nucleus.hh" 38 #include "G4ParticleHPDataUsed.hh" 39 #include "G4ParticleHPManager.hh" 40 #include "G4Proton.hh" 41 #include "G4ReactionProduct.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4ThreeVector.hh" 44 #include "G4Triton.hh" 45 46 void G4ParticleHPFissionBaseFS::Init(G4double A, G4double Z, G4int M, const G4String& dirName, 47 const G4String& bit, G4ParticleDefinition*) 48 { 49 G4String tString = dirName; 50 G4bool dbool; 51 const G4ParticleHPDataUsed& aFile = 52 theNames.GetName(static_cast<G4int>(A), static_cast<G4int>(Z), M, tString, bit, dbool); 53 const G4String& filename = aFile.GetName(); 54 SetAZMs(A, Z, M, aFile); 55 // theBaseA = aFile.GetA(); 56 // theBaseZ = aFile.GetZ(); 57 // if(!dbool || ( Z<2.5 && ( std::abs(theBaseZ - Z)>0.0001 || std::abs(theBaseA - A)>0.0001) ) ) 58 if (!dbool 59 || (Z < 2.5 && (std::abs(theNDLDataZ - Z) > 0.0001 || std::abs(theNDLDataA - A) > 0.0001))) 60 { 61 hasAnyData = false; 62 hasFSData = false; 63 hasXsec = false; 64 return; // no data for exactly this isotope. 65 } 66 67 // std::ifstream theData(filename, std::ios::in); 68 std::istringstream theData(std::ios::in); 69 G4ParticleHPManager::GetInstance()->GetDataStream(filename, theData); 70 G4int dummy; 71 if (!(theData)) { 72 // theData.close(); 73 hasFSData = false; 74 hasXsec = false; 75 hasAnyData = false; 76 return; // no data for this FS for this isotope 77 } 78 theData >> dummy >> dummy; 79 G4int total; 80 theData >> total; 81 theXsection->Init(theData, total, eV); 82 if (!(theData >> dummy)) { 83 hasFSData = false; 84 // theData.close(); 85 return; 86 } 87 theData >> dummy; 88 89 theAngularDistribution.Init(theData); 90 91 theData >> dummy >> dummy; 92 93 theEnergyDistribution.Init(theData); 94 // theData.close(); 95 } 96 97 G4DynamicParticleVector* G4ParticleHPFissionBaseFS::ApplyYourself(G4int nPrompt) 98 { 99 // if therere were no data for this isotope, break out. 100 if (!HasFSData()) { 101 return nullptr; 102 } 103 104 G4int i; 105 auto aResult = new G4DynamicParticleVector; 106 G4ReactionProduct boosted; 107 boosted.Lorentz(*(fCache.Get().theNeutronRP), *(fCache.Get().theTarget)); 108 G4double eKinetic = boosted.GetKineticEnergy(); 109 110 // Build neutrons 111 std::vector<G4ReactionProduct> theNeutrons; 112 for (i = 0; i < nPrompt; i++) { 113 theNeutrons.emplace_back(); 114 theNeutrons[i].SetDefinition(G4Neutron::Neutron()); 115 } 116 117 // sample energies 118 G4int dummy; 119 for (i = 0; i < nPrompt; i++) { 120 // always in the lab system (if file-5) 121 theNeutrons[i].SetKineticEnergy(theEnergyDistribution.Sample(eKinetic, dummy)); 122 } 123 124 // sample neutron angular distribution 125 for (i = 0; i < nPrompt; i++) { 126 theAngularDistribution.SampleAndUpdate(theNeutrons[i]); 127 } 128 129 // already in lab. Add neutrons to dynamic particle vector 130 for (i = 0; i < nPrompt; i++) { 131 auto it = new G4DynamicParticle; 132 it->SetDefinition(theNeutrons[i].GetDefinition()); 133 it->SetMomentum(theNeutrons[i].GetMomentum()); 134 aResult->push_back(it); 135 } 136 137 // return the result 138 return aResult; 139 } 140