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)