XDSの回折点viewer
放射光X線回折における2次元検出器上の画像解析に用いるXDSはlinux上のコマンドラインで実行するため万人向きではないですが強力な吸収補正機能が魅力です。その一方で、反射のprediction確認に難があるため回折点viewerを作成しました。ADXVを外部プログラムとしてcbfからjpegに変換し、XDS_ASCII.HKLにあるpredictionを観測した像に重ね合わせるpythonコードが以下です。あくまで簡易的なものなのでその点考慮してください。
# -*- coding: utf-8 -*-
# ピラタスなどの2次元検出器で撮影しXDSで解析したときに反射のpredictionを連続的に見たい時があります
# ADXVを外部プログラムとしてcbfからjpegに変換し、XDS_ASCII.HKLにある反射predictionを重ね合わせるコードです、SPOT.XDSに変更してもよいです
# 0からframe_numまでをstep_numで飛ばしてframe_num/step_num枚のjpegを作成します
# 書き出し専用dirを作り、そこでImageJのstacking機能を利用してチェックします
# なのでPATHが設定済みのADXVが必要です、適宜dir、file名を書き換えてください
# コメントアウトしてますが、cv2を使ったrainbow疑似カラーのセットも作れるようになってます
# Linux terminal上で>>python3 xds-spotview.py 他お好みの方法で動かしてください
#共同利用者以外への利用責任はなく質問受付はしません。D2MatEのプロジェクト支援を受けて行われています
import pandas as pd
import matplotlib.pyplot as plt
from PIL import Image
import subprocess
#import cv2
# setting parameter
delta_omega = 0.1 # delta omega value
mosaicity = 0.5 # draw the frame in Evald_frame+-mosaicity/delta_omega
delta_frame = mosaicity/delta_omega
start_frame = 100 # start frame of cbf-to-jpeg
end_frame = 1800
step_num = 50 # prediction steps: frame_num/step_num frames will be converted
cbf_file = './image-tth30/220213_cytidine_m90-90_2_' # cbf file without numbering and extension
jpg_file = 'cytidine-tth30HS_' # jpg file without numbering and extension
jpgsp_file = './imagestack/cytidine-tth30HS_sp_' # jpg file with SPOT without numbering and extension
XDS_FullSPOT = 'XDS_ASCII.HKL' # XDS SPOT list
# jpg_col_file = 'test_col_' # jpg file without numbering and extension
# SPOT data reading to pandas DataFrame
df1 = pd.read_csv(XDS_FullSPOT, delim_whitespace=True, comment="!", header=None, usecols=[0,1,2], names=['h','k','l'], dtype='int')
df2 = pd.read_csv(XDS_FullSPOT, delim_whitespace=True, comment="!", header=None, usecols=[5,6,7], names=['dfx','dfy','dfz'], dtype='float')
df_s = pd.concat([df1, df2], axis=1).sort_values('dfz') # conbine df1 (=dfx,dfy,dfz) and df2 (flag,h,k,l)
# main routine of SPOT selection, SPOT draw, convert cbf-to-jpg, jpg draw with SPOT
for Ewald_frame in range(start_frame, end_frame, step_num):
# selection the SPOT data near the Bragg condiction
bfEw_frame = int(Ewald_frame - delta_frame)
afEw_frame = int(Ewald_frame + delta_frame)
df_bfEw = df_s[(bfEw_frame < df_s['dfz']) & (df_s['dfz'] < Ewald_frame)]
df_onEw = df_s[df_s['dfz'].astype(int) == Ewald_frame ]
df_afEw = df_s[(Ewald_frame < df_s['dfz']) & (df_s['dfz'] < afEw_frame)]
print(Ewald_frame)
print(df_bfEw)
print(df_onEw)
print(df_afEw)
# plot scatter figure of SPOT data
fig, ax = plt.subplots(figsize=(10,10))
plt.xlim(1, 981)
plt.ylim(1034, 1)
plt.rcParams["font.size"] = 18
plt.xlabel('pixcel x')
plt.ylabel('pixcel y')
plt.scatter(df_bfEw['dfx'], df_bfEw['dfy'], marker="D", s=100, facecolor='None', edgecolors='blue')
plt.scatter(df_onEw['dfx'], df_onEw['dfy'], marker="o", s=100, facecolor='None', edgecolors='blue')
plt.scatter(df_afEw['dfx'], df_afEw['dfy'], marker="s", s=100, facecolor='None', edgecolors='blue')
# convert cbf-to-jpg file on ADXV
fnamecbf = cbf_file + f'{Ewald_frame:05d}' + '.cbf'
fnamejpg = jpg_file + f'{Ewald_frame:05d}' + '.jpeg'
#fnamejpg_col = jpg_col_file + f'{Ewald_frame:05d}' + '.jpeg'
# change the {0:05d} part depending on the file number of digits
cmd = 'adxv -sa -jpeg_scale 0.9 '+ fnamecbf + ' ' +fnamejpg
print(cmd)
subprocess.run(cmd, shell=True)
# plot jpg data with the SPOT
fnamejpgsp = jpgsp_file + f'{Ewald_frame:05d}' + '.jpeg'
im = Image.open(fnamejpg)
xlim_size = ax.get_xlim()
ylim_size = ax.get_ylim()
plt.imshow(im, extent=[*xlim_size, *ylim_size], aspect='auto', alpha=1)
plt.savefig(fnamejpgsp)
#pic=cv2.imread(fnamejpg)
#rb_color = cv2.applyColorMap(pic, cv2.COLORMAP_RAINBOW)
#cv2.imwrite(fnamejpg_col, np.array(rb_color))