nucleus_class.py
Go to the documentation of this file.
1 
2 from scipy.interpolate import interp1d
3 import numpy as np
4 import math
5 import os
6 import sys
7 import inspect
8 
9 class nucleus(object):
10  """
11  nucleus: contains basic information of a nuclei. For example the name, the name in the network, the amount of protons, neutrons and the mass number
12  """
13 
14  # constructor
15  def __init__(self,name='',Z=-1,N=-1,Y=0.,quiet=False,init_prop=False):
16  """
17  Input:
18  name - name of the nuclei. All informations are extracted from this name.
19  """
20  self.__input_name = name
21  self.__name = name.lower()
22  self.__A = -1
23  self.__Z = -1
24  self.__N = -1
25  self.__warn = False
26  self.__quiet = quiet
27  self.__ab = Y
28  self.__is_stable = False
29  #Sorting criteria
30  self.__sort_Z = True
31 
32  #Special cases
33  if self.__name == 'p':
34  self.__name = 'h1'
35  if self.__name == 'n' or self.__name == 'neutrons':
36  self.__name = 'neutron'
37  if self.__name == 'd':
38  self.__name = 'h2'
39  if self.__name == 't':
40  self.__name = 'h3'
41  if self.__name == 'al-6':
42  self.__name = 'al26'
43  if self.__name == 'al*6':
44  self.__name = 'al26'
45 
46  self.__elementname = ''
47  self.__elname = ('neutron','h','he','li','be','b','c','n','o','f','ne','na','mg','al','si','p','s','cl','ar','k','ca','sc','ti','v','cr','mn','fe',
48  'co','ni','cu','zn','ga','ge','as','se','br','kr','rb','sr','y','zr','nb','mo','tc','ru','rh','pd','ag','cd','in','sn','sb',
49  'te', 'i','xe','cs','ba','la','ce','pr','nd','pm','sm','eu','gd','tb','dy','ho','er','tm','yb','lu','hf','ta','w','re','os',
50  'ir','pt','au','hg','tl','pb','bi','po','at','rn','fr','ra','ac','th','pa','u','np','pu','am','cm','bk','cf','es','fm','md',
51  'no','lr','rf','db','sg','bh','hs','mt','ds','rg','cn','nh','fl','mc','lv','ts','og',"uue","ubn","ubu","ubb","ubt","ubq","ubp",
52  "ubh","ubs","ubo","ube","utn","utu","utb","utt","utq","utp","uth","uts","uto","ute","uqn","uqu")
53 
54 
55  if (Z!=-1 and N!=-1):
56  if ((Z >= len(self.__elname)) and not self.__quiet):
57  print('Proton number exceeds the one of database ',Z)
58  self.__A = Z + N
59  self.__name = self.__elname[Z] + str(self.__A)
60 
61  self.__initialize()
62 
63  if init_prop:
64  self.__init_properties()
65 
66  # Check if an error occured
67  self.__not_a_isotope = (self.__Z == -1)
68 
69 
70 
71  def __init_properties(self):
72  """
73  Initialize basic properties, like stableness etc.
74  """
75  # Check if it is stable
76  stable_nuc = np.loadtxt(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))+'/data/stableiso.dat',unpack=True,usecols=[0],dtype=str)
77  if self.__name in stable_nuc:
78  self.__is_stable = True
79  else:
80  self.__is_stable = False
81 
82 
83 
84  def is_stable(self):
85  """
86  Is it a stable nucleus?
87  """
88  return self.__is_stable
89 
90 
91  def get_not_a_isotope(self):
92  """
93  Check if the input was a valid isotope. True if not, False if it is valid
94  """
95  return self.__not_a_isotope
96 
97  def __initialize(self):
98  """
99  Extract the information of protonnumber neutronnumber out of the name.
100  """
101  self.__A = ''.join([x for x in self.__name if x.isdigit()])
102 
103  if (self.__A != ''):
104  self.__A = int(self.__A)
105  else:
106  self.__A = 1
107 
108  self.__elementname = ''.join([x for x in self.__name if not x.isdigit()]).strip()
109 
110  if self.__elementname in self.__elname:
111  self.__Z = self.__elname.index(self.__elementname) #protonnumber
112  else:
113  self.__Z = -1
114  if not self.__quiet:
115  print('Warning: The element '+self.__elementname+' is not known by nuclei class.')
116  self.__warn = True
117 
118  self.__N = self.__A - self.__Z
119  self.__nrnname='i'+self.__name
120  self.__A = ''.join([x for x in self.__name if x.isdigit()])
121 
122  if (self.__A != ''):
123  self.__A = int(self.__A)
124  else:
125  self.__A = 1
126 
127  self.__elementname = ''.join([x for x in self.__name if not x.isdigit()]).strip()
128  if self.__elementname in self.__elname:
129  self.__Z = self.__elname.index(self.__elementname) #protonnumber
130  else:
131  self.__Z = -1
132  if not self.__quiet:
133  print('Warning: The element '+self.__elementname+' is not known by nuclei class.')
134  self.__warn = True
135 
136  self.__N = self.__A - self.__Z
137 
138  #~ Getters
139  def get_A(self):
140  """
141  get_A : Get the mass number of the nucleus
142  """
143  return self.__A
144 
145  def get_elnames(self):
146  """
147  get_elnames : Get elementnames
148  """
149  return self.__elname
150 
151  def get_Z(self):
152  """
153  get_Z : Get the proton number of the nucleus
154  """
155  return self.__Z
156 
157  def get_N(self):
158  """
159  get_N : Get the neutron number of the nucleus
160  """
161  return self.__N
162 
163  def get_Y(self):
164  """
165  get_Y : Get the abundance of the nucleus
166  """
167  return self.__ab
168 
169  def get_X(self):
170  """
171  get_X : Get the mass fraction of the nucleus
172  """
173  return self.__ab * self.__A
174 
175  def get_elementname(self):
176  """
177  get_elementname : Get the corresponding name of the element (as a string)
178  """
179  return self.__elementname
180 
181  def get_name(self):
182  """
183  get_name : Get the full name of the nucleus. The name is the elementname plus the massnumber as a string
184  """
185  return self.__name
186 
187  def get_input_name(self):
188  """
189  get_input_name : Get the name as it was inputted
190  """
191  return self.__input_name
192 
193 
194 
195 
196  def get_seedline(self):
197  """
198  get_seedline : Get the line for the nucleus as it is necessary for the seed file
199  """
200  mafra = '%1.6e' % float(self.get_X())
201  nam = self.get_name()
202  if nam.strip() == 'neutron':
203  nam = 'n'
204  elif nam.strip() == 'h1':
205  nam = 'p'
206  elif nam.strip() == 'h2':
207  nam = 'd'
208  elif nam.strip() == 'h3':
209  nam = 't'
210 
211  line = nam.rjust(5) + ' '*7 + mafra
212  return line
213 
214  def set_X(self,X):
215  """
216  set_X : set the massfraction of the nucleus
217  """
218  self.__ab = X / self.__A
219 
220  def set_Y(self,Y):
221  """
222  set_X : set the massfraction of the nucleus
223  """
224  self.__ab = Y
225 
226  def set_sortcriteria(self,criteria):
227  """
228  set_sortcriteria : Set the criteria for sorting (possible values are "A" and "Z")
229  """
230  if criteria == 'Z':
231  self.__sort_Z = True
232  if criteria == 'A':
233  self.__sort_Z = False
234 
235  def __gt__(self,other):
236  """
237  A nucleus is greater if it has an higher proton number
238  """
239  if self.__sort_Z == True: #Sort Z
240  if (self.__Z > other.get_Z()):
241  return True
242  elif (self.__Z == other.get_Z()):
243  if (self.__A >= other.get_A()):
244  return True
245  else:
246  return False
247  else:
248  return False
249  else: #Sort A
250  if (self.__A > other.get_A()):
251  return True
252  elif (self.__A == other.get_A()):
253  if (self.__Z >= other.get_Z()):
254  return True
255  else:
256  return False
257  else:
258  return False
bin.class_files.nucleus_class.nucleus.__warn
__warn
Definition: nucleus_class.py:25
bin.class_files.nucleus_class.nucleus.get_Y
def get_Y(self)
Definition: nucleus_class.py:163
bin.class_files.nucleus_class.nucleus.__elname
__elname
Definition: nucleus_class.py:47
bin.class_files.nucleus_class.nucleus.get_elnames
def get_elnames(self)
Definition: nucleus_class.py:145
bin.class_files.nucleus_class.nucleus.get_name
def get_name(self)
Definition: nucleus_class.py:181
bin.class_files.nucleus_class.nucleus.__init__
def __init__(self, name='', Z=-1, N=-1, Y=0., quiet=False, init_prop=False)
Definition: nucleus_class.py:15
bin.class_files.nucleus_class.nucleus.__initialize
def __initialize(self)
Definition: nucleus_class.py:97
bin.class_files.nucleus_class.nucleus.get_N
def get_N(self)
Definition: nucleus_class.py:157
bin.class_files.nucleus_class.nucleus.__elementname
__elementname
Definition: nucleus_class.py:46
bin.class_files.nucleus_class.nucleus.is_stable
def is_stable(self)
Definition: nucleus_class.py:84
bin.class_files.nucleus_class.nucleus.__input_name
__input_name
Definition: nucleus_class.py:20
bin.class_files.nucleus_class.nucleus.__sort_Z
__sort_Z
Definition: nucleus_class.py:30
bin.class_files.nucleus_class.nucleus.get_X
def get_X(self)
Definition: nucleus_class.py:169
bin.class_files.nucleus_class.nucleus.__Z
__Z
Definition: nucleus_class.py:23
bin.class_files.nucleus_class.nucleus.__ab
__ab
Definition: nucleus_class.py:27
bin.class_files.nucleus_class.nucleus.get_not_a_isotope
def get_not_a_isotope(self)
Definition: nucleus_class.py:91
bin.class_files.nucleus_class.nucleus.get_Z
def get_Z(self)
Definition: nucleus_class.py:151
bin.class_files.nucleus_class.nucleus.set_X
def set_X(self, X)
Definition: nucleus_class.py:214
bin.class_files.nucleus_class.nucleus.get_input_name
def get_input_name(self)
Definition: nucleus_class.py:187
bin.class_files.nucleus_class.nucleus.__quiet
__quiet
Definition: nucleus_class.py:26
bin.class_files.nucleus_class.nucleus.__name
__name
Definition: nucleus_class.py:21
bin.class_files.nucleus_class.nucleus
Definition: nucleus_class.py:9
bin.class_files.nucleus_class.nucleus.__nrnname
__nrnname
Definition: nucleus_class.py:119
bin.class_files.nucleus_class.nucleus.get_A
def get_A(self)
Definition: nucleus_class.py:139
bin.class_files.nucleus_class.nucleus.get_seedline
def get_seedline(self)
Definition: nucleus_class.py:196
bin.class_files.nucleus_class.nucleus.__gt__
def __gt__(self, other)
Definition: nucleus_class.py:235
bin.class_files.nucleus_class.nucleus.set_Y
def set_Y(self, Y)
Definition: nucleus_class.py:220
bin.class_files.nucleus_class.nucleus.set_sortcriteria
def set_sortcriteria(self, criteria)
Definition: nucleus_class.py:226
bin.class_files.nucleus_class.nucleus.get_elementname
def get_elementname(self)
Definition: nucleus_class.py:175
bin.class_files.nucleus_class.nucleus.__A
__A
Definition: nucleus_class.py:22
bin.class_files.nucleus_class.nucleus.__not_a_isotope
__not_a_isotope
Definition: nucleus_class.py:67
bin.class_files.nucleus_class.nucleus.__is_stable
__is_stable
Definition: nucleus_class.py:28
bin.class_files.nucleus_class.nucleus.__init_properties
def __init_properties(self)
Definition: nucleus_class.py:71
bin.class_files.nucleus_class.nucleus.__N
__N
Definition: nucleus_class.py:24