物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python: イオンの質量

この記事の 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)
        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

似た記事

phst.hateblo.jp