00001
00002
00003 from data import units
00004 import elements
00005
00006 class G4RadData(object):
00007
00008
00009 states = {}
00010
00011 def nuclideData(self,z,a):
00012 '''Return given nuclide data'''
00013 try:
00014 return G4RadData.states[(z,a)]
00015 except KeyError:
00016 pass
00017 try:
00018 nuc = NuclideData(z,a)
00019 except IOError,err:
00020 err = 'Illegal Z=%d, A=%d\n%s'%(z,a,err)
00021 raise ValueError,err
00022 G4RadData.states[(z,a)] = nuc
00023 return nuc
00024
00025 class NuclideDecay:
00026 'Holds decay type, fraction qvalue and daughter excitation energy'
00027 def __init__(self,type,fraction,qvalue,daughterExcitation=0,daughterZ=0,daughterA=0,rad = None):
00028 self.type = type
00029 self.fraction = fraction
00030 self.qvalue = qvalue
00031 self.daughterExcitation = daughterExcitation
00032 self.radiation = rad
00033 self.daughterZ = daughterZ
00034 self.daughterA = daughterA
00035 return
00036
00037 def __str__(self):
00038 return '\t\t%s %6.3f%% Q=%8.4f [%8.4f] (%s)'%(self.type,self.fraction*100,self.qvalue,self.daughterExcitation,self.radiation)
00039 pass
00040
00041 class NuclideState:
00042 'Holds nuclide halflife, excitation energy and collection of NuclideDecay'
00043 def __init__(self,name,halflife=None):
00044 self.name = name
00045 self.halflife = halflife
00046 self.excitation = 0.0
00047 self.decays = []
00048 return
00049
00050 def __str__(self):
00051 ret = ['\tstate %s (%s) [%.2f] %d decays:'%(self.name,self.halflife,self.excitation,len(self.decays))]
00052 for dk in self.decays:
00053 ret.append(str(dk))
00054 continue
00055 return '\n'.join(ret)
00056 pass
00057
00058
00059 class NuclideData(object):
00060 'Hold all decay data about a nuclide from G4RadioActivity data files'
00061
00062 def __init__(self,z,a):
00063 '''Create data for given Z and A'''
00064 self.Z = z
00065 self.A = a
00066 self.states = []
00067 self.name = '%d%s'%(self.A,elements.symbol(self.Z))
00068 self.load()
00069 return
00070
00071 def __str__(self):
00072 ret = ['z%d.a%d %s %d excited state(s):'%(self.Z,self.A,self.name,len(self.states))]
00073 for s in self.states:
00074 ret.append(str(s))
00075 continue
00076 return '\n'.join(ret)
00077
00078 def excitedState(self,nucexenergy = 0.0):
00079 '''Return state with given excitation energy'''
00080 for s in self.states:
00081 if nucexenergy == s.excitation: return s
00082 continue
00083 return None
00084
00085 def load(self):
00086 import os
00087 dir = os.getenv('G4RADIOACTIVEDATA')
00088 if dir is None:
00089 raise EnvironmentError,'No G4RADIOACTIVEDATA variable, can not find data for Z=%d, A=%d'%(self.Z,self.A)
00090 file = dir + '/z%d.a%d'%(self.Z,self.A)
00091 file = open(file)
00092 types_seen = {}
00093 for line in file.readlines():
00094 line = line.strip()
00095
00096
00097
00098 if line[0] == '#': continue
00099
00100
00101 if line[0] == 'P':
00102 self.states.append(NuclideState(self.name))
00103 types_seen = {}
00104 p,ex,hl = line.split()
00105 self.states[-1].excitation = float(ex)
00106 self.states[-1].halflife = float(hl)*units.second
00107 continue
00108
00109
00110 if line[0] == 'W':
00111
00112 continue
00113
00114
00115 chunks = line.split()
00116
00117
00118 if not types_seen.has_key(chunks[0]):
00119 types_seen[chunks[0]] = float(chunks[2])
00120 continue
00121
00122 dk = NuclideDecay(chunks[0],float(chunks[2])/100.0,
00123 float(chunks[3])*units.keV,float(chunks[1])*units.keV)
00124 import decay
00125 if dk.type == 'Alpha':
00126 dk.daughterZ = self.Z - 2
00127 dk.daughterA = self.A - 4
00128 dk.radiation = decay.AlphaDecay(dk.qvalue,self.Z)
00129 elif dk.type == 'BetaMinus':
00130 dk.daughterZ = self.Z + 1
00131 dk.daughterA = self.A
00132 dk.radiation = decay.BetaDecay(dk.qvalue,self.Z)
00133 elif dk.type == 'BetaPlus':
00134 dk.daughterZ = self.Z - 1
00135 dk.daughterA = self.A
00136 dk.radiation = decay.BetaDecay(dk.qvalue,-1*self.Z)
00137 else:
00138 print 'Warning - not yet supported decay type: %s'%dk.type
00139 continue
00140
00141 self.states[-1].decays.append(dk)
00142 continue
00143 return
00144
00145 pass
00146
00147 if '__main__' == __name__:
00148 import sys
00149 nd = NuclideData(int(sys.argv[1]),int(sys.argv[2]))
00150 print nd
00151