Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // neutron_hp -- source file 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron trans 29 // 30 // P. Arce, June-2014 Conversion neutron_hp to 31 // 32 #include "G4ParticleHPFSFissionFS.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 "G4Poisson.hh" 41 #include "G4Proton.hh" 42 #include "G4ReactionProduct.hh" 43 #include "G4ThreeVector.hh" 44 #include "G4Triton.hh" 45 46 void G4ParticleHPFSFissionFS::Init(G4double A, 47 const G4Str 48 { 49 G4String tString = "/FS/"; 50 G4bool dbool; 51 const G4ParticleHPDataUsed& aFile = 52 theNames.GetName(static_cast<G4int>(A), st 53 const G4String& filename = aFile.GetName(); 54 SetAZMs(A, Z, M, aFile); 55 if (!dbool) { 56 hasAnyData = false; 57 hasFSData = false; 58 hasXsec = false; 59 return; 60 } 61 62 std::istringstream theData(std::ios::in); 63 G4ParticleHPManager::GetInstance()->GetDataS 64 65 G4int infoType, dataType; 66 hasFSData = false; 67 while (theData >> infoType) // Loop checkin 68 { 69 hasFSData = true; 70 theData >> dataType; 71 switch (infoType) { 72 case 1: 73 if (dataType == 4) theNeutronAngularDi 74 if (dataType == 5) thePromptNeutronEnD 75 if (dataType == 12) theFinalStatePhoto 76 if (dataType == 14) theFinalStatePhoto 77 if (dataType == 15) theFinalStatePhoto 78 break; 79 case 2: 80 if (dataType == 1) theFinalStateNeutro 81 break; 82 case 3: 83 if (dataType == 1) theFinalStateNeutro 84 if (dataType == 5) theDelayedNeutronEn 85 break; 86 case 4: 87 if (dataType == 1) theFinalStateNeutro 88 break; 89 case 5: 90 if (dataType == 1) theEnergyRelease.In 91 break; 92 default: 93 G4cout << "G4ParticleHPFSFissionFS::In 94 throw G4HadronicException(__FILE__, __ 95 "G4ParticleH 96 break; 97 } 98 } 99 } 100 101 G4DynamicParticleVector* G4ParticleHPFSFission 102 103 { 104 G4int i; 105 auto aResult = new G4DynamicParticleVector; 106 G4ReactionProduct boosted; 107 boosted.Lorentz(*(fCache.Get().theNeutronRP) 108 G4double eKinetic = boosted.GetKineticEnergy 109 110 // Build neutrons 111 std::vector<G4ReactionProduct> theNeutrons; 112 for (i = 0; i < nPrompt + nDelayed; ++i) { 113 theNeutrons.emplace_back(); 114 theNeutrons[i].SetDefinition(G4Neutron::Ne 115 } 116 117 // sample energies 118 G4int it, dummy; 119 G4double tempE; 120 for (i = 0; i < nPrompt; ++i) { 121 tempE = 122 thePromptNeutronEnDis.Sample(eKinetic, d 123 theNeutrons[i].SetKineticEnergy(tempE); 124 } 125 for (i = nPrompt; i < nPrompt + nDelayed; ++ 126 theNeutrons[i].SetKineticEnergy(theDelayed 127 if (it == 0) theNeutrons[i].SetKineticEner 128 theDecayConst[i - nPrompt] = theFinalState 129 } 130 131 // sample neutron angular distribution 132 for (i = 0; i < nPrompt + nDelayed; ++i) { 133 theNeutronAngularDis.SampleAndUpdate( 134 theNeutrons[i]); // angular comes back 135 } 136 137 // already in lab. Add neutrons to dynamic p 138 for (i = 0; i < nPrompt + nDelayed; ++i) { 139 auto dp = new G4DynamicParticle; 140 dp->SetDefinition(theNeutrons[i].GetDefini 141 dp->SetMomentum(theNeutrons[i].GetMomentum 142 aResult->push_back(dp); 143 } 144 return aResult; 145 } 146 147 void G4ParticleHPFSFissionFS::SampleNeutronMul 148 149 { 150 G4double promptNeutronMulti = 0; 151 promptNeutronMulti = theFinalStateNeutrons.G 152 G4double delayedNeutronMulti = 0; 153 delayedNeutronMulti = theFinalStateNeutrons. 154 155 if (delayedNeutronMulti == 0 && promptNeutro 156 Prompt = 0; 157 delayed = 0; 158 G4double totalNeutronMulti = theFinalState 159 all = (G4int)G4Poisson(totalNeutronMulti - 160 all += off; 161 } 162 else { 163 Prompt = (G4int)G4Poisson(promptNeutronMul 164 Prompt += off; 165 delayed = (G4int)G4Poisson(delayedNeutronM 166 all = Prompt + delayed; 167 } 168 } 169 170 G4DynamicParticleVector* G4ParticleHPFSFission 171 { 172 // sample photons 173 G4ReactionProductVector* temp; 174 G4ReactionProduct boosted; 175 176 // the photon distributions are in the Nucle 177 boosted.Lorentz(*(fCache.Get().theNeutronRP) 178 G4double anEnergy = boosted.GetKineticEnergy 179 temp = theFinalStatePhotons.GetPhotons(anEne 180 if (temp == nullptr) { 181 return nullptr; 182 } 183 184 // lorentz transform, and add photons to fin 185 unsigned int i; 186 auto result = new G4DynamicParticleVector; 187 for (i = 0; i < temp->size(); ++i) { 188 // back to lab 189 temp->operator[](i)->Lorentz(*(temp->opera 190 auto theOne = new G4DynamicParticle; 191 theOne->SetDefinition(temp->operator[](i)- 192 theOne->SetMomentum(temp->operator[](i)->G 193 result->push_back(theOne); 194 delete temp->operator[](i); 195 } 196 delete temp; 197 return result; 198 } 199