1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SPring-8 BL37XU の 2D_Data_Viewer 代替スクリプト

Last updated at Posted at 2024-10-29

Abstract

私が時々利用する放射光ビームラインにSPring-8のBL37XUがあります。HXマイクロビームでイメージングもできて嬉しいのですが, 取得したマップのビューワーである Labviewベースのソフト 2D_Data_Viewer がどうしても私の環境で走らなかったので代替となるスクリプトを書きました。

スクリプトと同じディレクトリにあるマップの生データファイルを適当に読み込んでtif画像ファイルを新たに作るディレクトリ "processed" の下に出力するだけの簡単なpythonスクリプトです。吐き出されたtifファイルはImageJなんかで解析できます。高速化を特に考えてないので5重forループとかいう本職が見たらぶっ倒れるだろうことを平気で書いてます。赦してくだしあ

Script

ファイルごと, ROIごと, スキャン高さ, スキャン幅, SDDのチャンネルごとにループをかけました。途中でスキャン方向を判別して条件分岐

map_to_tif.py
# この .py ファイルを 生データと同じ階層 に配置
import os
import re
import gc
import pandas as pd
import numpy as np
from PIL import Image

# setting global params
files = os.listdir()
files.remove('map_to_tiff.py')

# 生データファイルがあるディレクトリに格納されるはず
for file in files:
    lines = []
    with open(file, 'r', encoding = 'UTF-8') as paramset:
        line_num = 0
        while line_num < 10:
            line_num += 1
            txt = paramset.readline()
            lines.append(txt)
# 正規表現の練習がてら
    x_start = re.findall(r'\D\d+\.\d+', lines[4])
    x_end = re.findall(r'\D\d+\.\d+', lines[5])
    x_step = re.findall(r'\D\d+\.\d+', lines[6])
    z_start = re.findall(r'\D\d+\.\d+', lines[7])
    z_end = re.findall(r'\D\d+\.\d+', lines[8])
    z_step = re.findall(r'\D\d+\.\d+', lines[9])

    scan_width = int((float(x_end[0]) - float(x_start[0]))/float(x_step[0])) # スキャンの幅
    scan_hight = int((float(z_end[0]) - float(z_start[0]))/float(z_step[0])) # スキャンの高さ
    
    del lines, line_num, txt, x_start, x_end, x_step, z_start, z_end, z_step
    gc.collect()

# スキャン方向判別
# 初動の座標値変化をみる
    df = pd.read_csv(file, header = 12, sep = '\t')
    ch_num = 7 # しばらくCh数は変わんないと思う
    roi_num = int((df.shape[1] - 4)/ch_num -1)
    if abs(df['x/um'][1]-df['x/um'][0]) > abs(df['z/um'][1]-df['z/um'][0]):
        on_the_fly = 0
    else:
        on_the_fly = 1
    for m in range(roi_num):
        os.makedirs('processed/' + file, exist_ok=True)
    
    print(file)
    for i in range(roi_num):
        im_2d = np.zeros((scan_hight, scan_width))
        if on_the_fly == 0:
            for j in range(scan_hight):
                for k in range(scan_width):
                    for l in range(ch_num):
                        im_2d[j][k] += df['ROI'+str(i + 1)+'_Ch'+ str(l + 1)][k + scan_width*j]
                    im_2d[j][k] = im_2d[j][k] / df['ch1(I0)'][k + scan_width*j]
            img = Image.fromarray(im_2d)
            img.save('processed/' + file + '/roi_' + str(i + 1)+'.tif')
        else:
            for j in range(scan_width):
                for k in range(scan_hight):
                    for l in range(ch_num):
                        im_2d[k][j] += df['ROI'+str(i + 1)+'_Ch'+ str(l + 1)][k + scan_hight*j]
                    im_2d[k][j] = im_2d[k][j] / df['ch1(I0)'][k + scan_hight*j]
            img = Image.fromarray(im_2d)
            img.save('processed/' + file + '/roi_' + str(i + 1)+'.tif')

Github

Notes

本スクリプトは2024年4月現在の仕様に基づいて記述しています。
標準ライブラリのほかにpandas, numpy, pillowを使用しています。
再実行する際は既に作られている "processed" ディレクトリを移動するか削除してください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?