f2plusからShelx形式への変換

PFのBL8A/8Bなどでは、imaging plate型回折計が未だ現役です。これらはshelx形式のデータを出力しないのでolex2やwinGXでの構造解析には変換が必要なので、そのための簡単なコードが以下です。Dataframe形式てのコーディングを試みましたが、配列はできても(3I4, 2F8.2)形式での書き込みがうまくできませんでしたので、泣く泣くforループを使用しています。その点も含めてあり合わせなので、ご承知おきください。

# -*- coding: utf-8 -*-
#!/usr/bin/env python3
#RAPID data exhanger: f2plus.dat to Shelx.hkl
#PFのBL8A/8Bでimaging plate型回折計を用いて構造解析データを取得した場合
#shelx形式のデータを出力しないのでolex2やwinGXでの構造解析には変換が必要です
#(crystal structure, yadokari等での解析にはそのままf2plus.datが使える)
#f2plus.datは、h k l F2 F2sigma F2Raw Absorption flag のカラム形式になっており
#F2はLP補正済み、吸収無し、未平均の積分強度で、これにAbsorptionで割ったshelx形式(3I4,2F8.2,I4)のデータに変換します
#denominatorの桁数は、データに応じて実数部分が6桁を超えないF2値になるよう変更して下さい
#平均化はそれぞれが使用の解析ソフト上で行ってください。textfileのライブラリが必要です
#pip install textfile (自分はanacondaですが競合はなさそうなのでpipで入れました)等でどうぞ
import textfile

#filenames
rname = 'f2plus.dat'
wname = 'shelx.hkl'
denominator = 100

arr = ""
alllines = ""
count = 0
with open(rname, 'r') as f:
    for line in f:
        df = line.split()
        h = df[0]
        k = df[1]
        l = df[2]
        f2 = float(df[3])/float(df[6])/denominator
        sf2 = float(df[4])/float(df[6])/denominator
        arr = f'{h:>4s}' + f'{k:>4s}' + f'{l:>4s}' + f'{f2:>8.2f}' + f'{sf2:>8.2f}'
        alllines = alllines + arr + '\n'
        count += 1

with open(wname, mode='w') as f:
    f.write(alllines)

textfile.insert(wname, '   0   0   0     0.0     0.0\n', line=count)

Leave a Reply

Your email address will not be published. Required fields are marked *

Previous article

談話会

Next article

引っ越し