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

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

Python: イオンの質量 NDSライブラリ (使えません)

この記事の 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 からデータをダウンロードしておく必要がある。結果は同じ。

似た記事

phst.hateblo.jp