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 // 29 // GEANT4 header file 30 // 31 // File name: G4NucLevel 32 // 33 // Author: V.Ivanchenko 34 // 35 // Creation date: 4 January 2012 36 // 37 // Modifications: 38 // 39 // ------------------------------------------------------------------- 40 // 41 // Container class keeping information about gamma transition 42 // and for a given nuclear level 43 // 44 45 #ifndef G4NUCLEVEL_HH 46 #define G4NUCLEVEL_HH 1 47 48 #include "globals.hh" 49 #include <vector> 50 #include <iostream> 51 52 class G4NucLevel 53 { 54 public: 55 56 explicit G4NucLevel(std::size_t ntrans, G4double tgamma, 57 const std::vector<G4int>& vTrans, 58 const std::vector<G4float>& wLevelGamma, 59 const std::vector<G4float>& wGamma, 60 const std::vector<G4float>& vRatio, 61 const std::vector<const std::vector<G4float>*>& wShell); 62 63 ~G4NucLevel(); 64 65 inline std::size_t NumberOfTransitions() const; 66 67 inline std::size_t FinalExcitationIndex(std::size_t idx) const; 68 69 inline G4int TransitionType(std::size_t idx) const; 70 71 inline G4double GetTimeGamma() const; 72 73 inline G4float GammaProbability(std::size_t idx) const; 74 75 inline G4float GammaCumProbability(std::size_t idx) const; 76 77 inline G4float MultipolarityRatio(std::size_t idx) const; 78 79 inline std::size_t SampleGammaTransition(G4double rndm) const; 80 81 inline G4int SampleShell(std::size_t idx, G4double rndm) const; 82 83 inline const std::vector<G4float>* ShellProbabilty(std::size_t idx) const; 84 85 void StreamInfo(std::ostream& os) const; 86 87 G4NucLevel(const G4NucLevel &right) = delete; 88 G4bool operator==(const G4NucLevel &right) const = delete; 89 G4bool operator!=(const G4NucLevel &right) const = delete; 90 G4bool operator<(const G4NucLevel &right) const = delete; 91 const G4NucLevel& operator=(const G4NucLevel &right) = delete; 92 93 private: 94 95 std::size_t length; 96 G4double fTimeGamma; 97 98 std::vector<G4int> fTrans; 99 std::vector<G4float> fGammaCumProbability; 100 std::vector<G4float> fGammaProbability; 101 std::vector<G4float> fMpRatio; 102 std::vector<const std::vector<G4float>*> fShellProbability; 103 }; 104 105 inline std::size_t G4NucLevel::NumberOfTransitions() const 106 { 107 return length; 108 } 109 110 inline std::size_t G4NucLevel::FinalExcitationIndex(const std::size_t idx) const 111 { 112 return (std::size_t)(fTrans[idx]/10000); 113 } 114 115 inline G4int G4NucLevel::TransitionType(const std::size_t idx) const 116 { 117 return fTrans[idx]%10000; 118 } 119 120 inline G4double G4NucLevel::GetTimeGamma() const 121 { 122 return fTimeGamma; 123 } 124 125 inline G4float G4NucLevel::GammaProbability(const std::size_t idx) const 126 { 127 return fGammaProbability[idx]; 128 } 129 130 inline G4float G4NucLevel::GammaCumProbability(const std::size_t idx) const 131 { 132 return fGammaCumProbability[idx]; 133 } 134 135 inline G4float G4NucLevel::MultipolarityRatio(const std::size_t idx) const 136 { 137 return fMpRatio[idx]; 138 } 139 140 inline std::size_t G4NucLevel::SampleGammaTransition(const G4double rndm) const 141 { 142 G4float x = rndm; 143 std::size_t idx = 0; 144 for(; idx<length; ++idx) { 145 if(x <= fGammaCumProbability[idx]) { break; } 146 } 147 return idx; 148 } 149 150 inline G4int 151 G4NucLevel::SampleShell(const std::size_t idx, const G4double rndm) const 152 { 153 const std::vector<G4float>* prob = fShellProbability[idx]; 154 G4int i(-1); 155 if(nullptr != prob) { 156 G4int nn = (G4int)prob->size(); 157 G4float x = rndm; 158 for(i=0; i<nn; ++i) { if(x <= (*prob)[i]) { break; } } 159 } 160 return i; 161 } 162 163 inline const std::vector<G4float>* 164 G4NucLevel::ShellProbabilty(std::size_t idx) const 165 { 166 return fShellProbability[idx]; 167 } 168 169 #endif 170