この記事の Awkward のバージョンは1.X.Xです
単一原子の基底状態のイオンの質量をPythonで求める。データは nds.iaea.org から引っ張ってきた。APIの説明。
def get_ion_mass(z, a, q): import os gs_filename = "ground_states.csv" if not os.path.exists(gs_filename): import urllib.request url = "https://nds.iaea.org/relnsd/v0/data?fields=ground_states&nuclides=all" req = urllib.request.Request(url) req.add_header('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0') with urllib.request.urlopen(req) as web_file: data = web_file.read() with open(gs_filename, mode='wb') as local_file: local_file.write(data) import csv reader = csv.reader(open(gs_filename)) lines = tuple(reader) legends = list(lines[0]) obj={} for legend in legends: obj[legend] = [] for line in lines[1:]: if len(line)!=len(legends):continue for i in range(len(legends)): try: obj[legends[i]].append(float(line[i])) except: if line[i] ==" ": obj[legends[i]].append(float("nan")) else: obj[legends[i]].append(line[i]) import awkward as ak gs_table = ak.Array(obj) e_mass = 0.00054858 if len(gs_table[(gs_table["z"]==z)&(gs_table["n"]==a-z)])==0: print((f"Not found nuclide with z={z} a={a}")) raise atomic_mass = gs_table[(gs_table["z"]==z)&(gs_table["n"]==a-z)][0]["atomic_mass"]/1000000 return atomic_mass - q*e_mass # 238U90+ z,a,q=92,238,90 print(f"Z={z}, A={a}, Q={q}+, Mass={get_ion_mass(z,a,q):.4f} amu")
出力
Z=92, A=238, Q=90+, Mass=238.0014 amu
ここでは電子の質量も除いている。
不安定核を含めたイオンの質量は mass excess を使って得る。
def get_mass_excess(z,a): import os mas20_filename = "mass_1.mas20.txt" if not os.path.exists(mas20_filename): print("Download https://www.anl.gov/sites/www/files/2021-05/mass_1.mas20.txt") raise raw_data = open(mas20_filename,"r").read() for line in raw_data.strip().split('\n')[36:]: Z = int(line[9:14]) A = int(line[14:19]) mass_excess = float(line[27:41].rstrip(" #")) if a==A and z==Z: return mass_excess print(f"Not found Z={z} A={a} Q={q}") raise def get_ion_mass2(z, a, q): e_mass = 0.00054858 return get_mass_excess(z,a)/931494.0954 + a - q*e_mass z,a,q=92,238,90 print(f"Z={z}, A={a}, Q={q}+, Mass={get_ion_mass2(z,a,q):.4f} amu")
https://www.anl.gov/sites/www/files/2021-05/mass_1.mas20.txt からデータをダウンロードしておく必要がある。結果は同じ。
似た記事