D4Mat2Slicer(Step By Step測定及び連続回転測定)用コマンド

(2022/3/9更新 作成中)

多次元系単結晶試料に対する非弾性散乱測定において、広い運動量空間をカバーするためには、試料に対する入射中性子の方位の異なる測定を複数回行い一つの運動量エネルギー空間にあるものとみなしてデータを扱う必要がある。

その測定手法には2種類、 Step By Step測定連続回転測定 とがある。これらの測定データを処理するソフトウェアとして、 D4mat2Slicer ( 参照: 「D4mat2Slicerマニュアル」 があるが、本章ではそのコマンドラインインターフェースを紹介する。

使用される関数(C++クラス)は、 UtsusemiD4Matrix2 である。

注意

まだ機能的には未完成で不十分なところが多いので、使用には十分気をつけること。

サンプルコード(Step By Step測定用)

Step By Step測定のデータを利用する場合に使用できるものを紹介する。

多次元系単結晶試料非弾性散乱測定(回転測定)のデータ処理(Step-by-Step法) でも使用される RunListファイルを利用して処理を行うスクリプトである。

そのため、D4Mat変換用ファイル(vbinファイル)を作成するスクリプト(Extractスクリプト)とよく似た構造であり、特にRunListファイルを処理する部分は全く同じである。

処理として想定している流れとしては以下のようなものである。

  1. RunListファイルを利用してそれぞれのRun情報とゴニオの角度情報を取り出す

  2. スクリプトに記述したパラメータと1.の情報を利用してそれぞれのデータをヒストグラム化し、角度情報とともに取り込む

  3. スクリプトに記述した試料情報を利用し、射影処理を行う

  4. 2Dや3Dのスライス及び可視化を行う

  5. D4MatSlicerで可視化できるD4Matデータを出力する。

大雑把にいえば、D4Mat用のスクリプト(いわゆる Extract_runlist.py )との相違点は、vbinファイルを書き出すコマンドである

Cmm.VisContMOutputFileByPhi(DAT, XtalParam, PhiValue, savePath)

の部分をD4Mat2へ取り込むためのコマンド

UD.ImportEcmStepByStep( DAT, PhiValue, str(PhiValue) ) # 非弾性処理済みデータを回転角度とともに入力

に置き換えるところと、射影処理の部分

UD.SetD4MatSampleInfo( LatticeConst, Uvector, Vvector, RotateSteps ) # 試料情報の入力
UD.Projection( ProjAxes )                                  # 射影処理の実行

である。

サンプルコード (A-1)

上記のステップのうち

  1. RunListファイルを利用してそれぞれのRun情報とゴニオの角度情報を取り出す

  2. スクリプトに記述したパラメータと1.の情報を利用してそれぞれのデータをヒストグラム化し、角度情報とともに取り込む

  3. スクリプトに記述した試料情報を利用し、射影処理を行う

を行うコードを示す。

D4MatSlicer command script
#! /usr/bin/env python3
from __future__ import print_function
import os
import sys
import DR
import Cmm

#####################
# modify here
####################
Ei=30.04
delta_hw = 0.2
hw_min = -5.0
hw_max = 28.0
maskfile = "default"
normFactor = 1000000.0
XtalParam = "XtalParam.xml"
outFile = "Sample1.d4m"
gonioValueAtZero = 31.032

# Sample Info
LatticeConst = [ 3.615, 3.615, 3.615, 90.0, 90.0, 90.0 ]
Uvector = [ 1.0, 0.0, 0.0 ]
Vvector = [ 0.0, 1.0, 1.0 ]
RotateSteps = []
ProjAxes = [ 1.0, 0.0, 0.0, 0.0,
             0.0, 1.0, 1.0, 0.0,
             0.0,-1.0, 1.0, 0.0,
             0.0, 0.0, 0.0, 1.0 ]
#########################

argv = sys.argv
print("len(argv)={}".format(len(argv)))

listFileName=""
if len(argv)==2:
    if os.path.exists(argv[1]):
        listFileName=argv[1]
        print("RunList=[]".format(listFileName))
    else:
        raise UserWarning("Not found file=%s"%(argv[1]))
else:
    print("Usage::")
    print("        $ ./{} <filename of runlist>".format(argv[0]))
    print("        ")
    print("        $ python {} <filename of runlist>".format(argv[0]))
    sys.exit(0)

import utsusemi.ana.Reduction.BaseCommandsInEla as BC
paramDic = {"normFactor":normFactor,"gonio":gonioValueAtZero}
AngleList, condsDict  = BC.LoadRunListToExtract( listFileName, paramDic, mergeAngles=True )

## Data Reduction
import Manyo
import Manyo.Utsusemi as mu

UD = mu.UtsusemiD4Matrix2()               # D4matSlicer2のコマンドを実行するための用意
UD.ClearAll()                             # データのクリア(念のため)
# UD.LoadData(outFile)                    # 以前のデータに追記する場合に読み込み

for angle_key in AngleList:
    angle  = float( angle_key )
    runNos = condsDict[ angle_key ][0]
    norm   = condsDict[ angle_key ][1]
    print("==============[ %s:%8.3f,%10.5f ]" % (runNos,angle,norm))
    DAT = DR.GetDataOfMonochroEi3( runNos, Ei, delta_hw, "%g %g"%(hw_min,hw_max), MaskFile=maskfile, NormFactor=norm )
    UD.ImportEcmStepByStep( DAT, angle, angle_key ) # 非弾性処理済みデータを回転角度とともに入力
    del DAT                               # 入力済みのデータは削除して良い(推奨)

### Save Data
#UD.SetXtalParam(XtalParam)                                           # 保存用XtalParam情報(VisualCont情報のみ)
#UD.SaveData( outFile )                                               # ファイルに保存

### Projection
UD.SetD4MatSampleInfo( LatticeConst, Uvector, Vvector, RotateSteps ) # 試料情報の入力
UD.Projection( ProjAxes )                                  # 射影処理の実行

もしデータをファイルに保存すれば、そのままD4Mat2Slicerから読み込むことができ、すぐにProjectionやSliceができる。

使用上の注意と問題点

ただし、以下にあげるような問題点(未実装)がある。

  • XtalParamとの連携が不十分

    • 個別に取り込んだRunのメタ情報(RunNOやGonio角度、Proton数など)がXtalParamの情報として反映されない(修正予定)

    • Eiやhwの範囲などの情報も同様(修正予定)

    • データ保存用として既存のXtalparamを登録する( UD.SetXtalParam(XtalParam) )ことはできるが、あくまでD4MatSlicerで読み込んだときに格子定数やUV情報、射影、スライスの情報を示すためだけである。

  • 既存のd4mデータファイルに追記する形で利用する場合、同じ角度のデータであってもマージされないため、再度d4mデータファイルに保存するとサイズが大きくなる

    • これはD4Mat2Slicerでも同様であると思われるが未確認

    • 大きな仕様変更が必要なため、当面の修正は行わない

    • 同じ角度を何度も測定する場合、一連の測定が終了したときに最初から処理しなおした方が良い

サンプルコード(A-2)

前述の射影まで処理スクリプトに以下のコードを加えると、2Dスライス+プロットを行うことができる。 すなわち前述の

  1. 2Dスライス及び可視化を行う

を行うためのスクリプトである。

スライスに必要な各軸のパラメータの与え方は 運動量エネルギー空間への射影に関連するコマンド と同等である。

### Slice 2D
ax1 = ["T", -0.420,2.350]
ax2 = ["T", -0.876,3.006]
ax3 = ["X", -0.916,0.841,0.02]
ax4 = ["Y", -0.600,35.70,0.3]
ax_dFold = []
ax_units = ["rlu","rlu","rlu","meV"]

sliced_eca = Manyo.ElementContainerArray()
if UD.Slice2d( sliced_eca, ax1, ax2, ax3, ax4, ax_dFold, ax_units ):
    print("## Slice succeeded.")
    ## Plot sliced data on display with GUI
    import uGao.M2PlotPlusCui as mp                 # 夕顔のGUIを起動してプロットする
    p=mp.M2PlotPlusCui(sliced_eca)
    p.ShowData()
    p.SetLabels("Qa [rlu]","Qb [rlu]")
    del p

    ## Save sliced data as PNG figure file          # 夕顔で表示させずに画像だけ保存も可能
    import uGao.U2IFInDark as UIF
    p=UIF.U2IFInDark()
    p.SetKeys("ax3","ax4","Intensity")              # 横軸、縦軸のキー("ax1", "ax2", "ax3", "ax4")、および強度のキー
    p.SetData(sliced_eca)                           # データの読み込み
    p.SetRange(False,0.0,40.0)                      # 強度の範囲指定(最初のFalseはAuto Scaleはしないの意味)
    p.SetTitles("Test Data","SubTitle")             # TitleとSubTitle
    p.SetLabels("Qa (rlu)","hw (meV)")              # 軸のラベル
    p.SaveFile( "TestData.png" )                    # 画像ファイルとして保存
    del p
else:
    print("## Slice failed.")

サンプルコード(A-3)

前述の射影まで処理スクリプトに以下のコードを加えると、D4Matデータへの書き出しが行える。

  1. D4MatSlicerで可視化できるD4Matデータを出力する。

### Make D4Mat data
v=UD.PutQRange()

ax1 = [v[0],v[1],0.02]
ax2 = [v[2],v[3],0.02]
ax3 = [v[4],v[5],0.1]
ax4 = [v[6],v[7],0.5]
titles = [ "Qa","Qb","Qc","Energy" ]
data_dir = "./D4Mat"
paramfile = "D4Mat.xml"

ret = UD.AllocateD4MatOnDisk(ax1, ax2, ax3, ax4, titles, data_dir, paramfile )
if ret:
    print("Suceeded to output D4Mat data")

サンプルコード(連続回転測定用)

連続回転測定のデータを処理する場合に使用するものを紹介する。

  1. 測定情報をパラメータとしてデータを角度毎のヒストグラムに落とし込む処理をする (Data Reduction)

  2. 試料の情報を利用してヒストグラムデータを見たい座標に射影する (Projection))

  3. 射影データを2Dスライスする

  4. 射影データを3Dスライスしてテキストファイルに保存する

サンプルコード(B-1)

連続回転測定のデータ処理のステップのうち

  1. 測定情報をパラメータとしてデータを角度毎のヒストグラムに落とし込む処理をする (Data Reduction)

  2. 試料の情報を利用してヒストグラムデータを見たい座標に射影する (Projection))

を行うものである。

D4Mat2 commands scripts for the continuous rotation method
#!/usr/bin/python
# -*- coding: utf-8 -*-

############################
# Data Reduction parameters
############################
runNo = 17714
Ei = 50.0     #[meV]
HW_min = 0.0  #[meV]
HW_max = 3.0  #[meV]
HW_bin = 1.0  #[meV]

mask_file = "mask.txt"

st_deg = -31.0 #[degree]
ed_deg = 90.0  #[degree]
w_deg = 0.5    #[degree]

t_start = -1   #[seconds]
t_end = -1     #[seconds]
############################
# Sample Info
############################
LatticeConst = [ 3.615, 3.615, 3.615, 90.0, 90.0, 90.0 ]
Uvector = [ 0.0, 0.0, 1.0 ]
Vvector = [ 1.0, 1.0, 0.0 ]
ProjAxes = [ 0.0, 0.0, 1.0, 0.0,
             1.0, 1.0, 0.0, 0.0,
             1.0,-1.0, 0.0, 0.0,
             0.0, 0.0, 0.0, 1.0 ]
RotateSteps = []
############################
DataReductParams = [t_start, t_end, Ei, HW_bin, HW_min, HW_max, st_deg, ed_deg, w_deg ]
data_dir = "/data"
############################



################################
import Manyo
import Manyo.Utsusemi as mu
try:
    from vis.D4Mat2Slicer import D4Mat2Utils ## for Utsusemi 0.3.7
except:
    from utsusemi.vis.D4Mat2SlicerQ import D4Mat2Utils ## for Utsusemi 4.0
import sys

#### Data Reduction from raw data files
### Make parameter files
st_Params = "hw,%f,%f,%f,%f"%( (Ei,HW_min,HW_max,HW_bin ) )
DU = D4Mat2Utils()
wfile,dfile = DU.MakeTempInfoFiles(runNo,st_Params)
cfile = DU.MakeCaseInfoFile( st_deg, ed_deg, w_deg, runNo )

### Do Data Reduction
EDC=mu.UtsusemiEventDataConverterNeunet()
EDC.LoadParamFiles( wfile, dfile, cfile )

if t_start<0 and t_end<0:
    pass
else:
    if not EDC.SetRangeOfSingleTimeSlicing( t_start, t_end ):
        msg = "TimeSlicing arguments are invalid : "+str(t_start)+","+str(t_end)
        raise UserWarning(msg)

EDC.LoadTrignetEventFile( runNo, data_dir, "" )
EDC.SetHistAllocation()
EDC.LoadEventDataFiles( runNo, data_dir, "" )

print( " ------------ Data Reduction finish" )

#### Projection
### Make Angle inforamtion
num_of_cases = EDC.PutNumOfCases()
case_list = EDC.PutListOfCounterConditions()

IND = Manyo.MakeUInt4Vector()
PHI = Manyo.MakeDoubleVector()
for i in range(num_of_cases):
    IND.push_back(i+1)
    PHI.push_back( (case_list[(i+1)*2] + case_list[(i+1)*2 +1])/2.0 )

### Get parameter for Solid Angle Corrections
dOmega = 1.0
hh = Manyo.HeaderBase()
if EDC.AddRunInfoToHeader(hh):
    L2 = hh.PutDouble("TypicalL2")
    dS = hh.PutDouble("TypicalDS")
    dOmega = dS/(L2*L2)

mask_path = mu.FindParamFilePath( mask_file )

### Set Data to D4Matrix2 and Do Projection
D4M = mu.UtsusemiD4Matrix2()
D4M.SetD4MatSampleInfo( LatticeConst, Uvector, Vvector, RotateSteps )
D4M.SetD4MatDataReductionInfo( DataReductParams )
D4M.SetD4MatRunNo( runNo )
D4M.SetD4MatProjectionAxesInfo( ProjAxes )
D4M.ImportEcmsContRot( EDC, IND, PHI, mask_path, dOmega )

print( " ------------ Projection finish" )

サンプルコード(B-2)

  1. 射影データを2Dスライスする

#### Slice on D4Matrix2
### Get maximum range of D4Matrix2 data axes
limRange = D4M.GetAxLimit()

##### 2D slice test
### Make parameters for slicing
Ax1_slice = [ "X", limRange[0], limRange[1], 0.02 ]
Ax2_slice = [ "Y", limRange[2], limRange[3], 0.02 ]
Ax3_slice = [ "T", -0.1, 0.1 ]
Ax4_slice = [ "T", HW_min, HW_min+HW_bin ]
Foldings = []

### Do Slice and plot
sliced_eca = Manyo.ElementContainerArray()
if D4M.Slice2d( sliced_eca, Ax1_slice, Ax2_slice, Ax3_slice, Ax4_slice, Foldings ):
    try:    ## for Utsusemi 0.3.7
        import vis.M2Plot as mp
        p=mp.M2Plot(sliced_eca)
    except: ## for Utsusemi 4.0
        import uGao.M2PlotPlusCui as mp
        p=mp.M2PlotPlusCui(sliced_eca)

UtsusemiD4Matrix2リファレンス

以下に UtsusemiD4Matrix2 で使用できるコマンド(メソッド)のうち、主要なものを示す。

class UtsusemiD4Matrix2

連続回転測定データの処理や、StepByStepデータの処理を、全データをメモリ上に保管することにより、高速に、かつ処理の柔軟性を高めたものである。

UtsusemiD4Matrix2.SetD4MatSampleInfo(LatticeConst, Uvector, Vvector, RotateSteps)

試料情報(格子定数、方位情報など)を与える。

Parameters
  • LatticeConsts (list(float)) – 格子定数の指定 [ a, b, c,α,β,γ]

  • Uvec (list(float)) – U-vector

  • Vvec (list(float)) – V-vector

  • Rvec (list(float)) – U-V-vectorの回転を指定

Returns

結果 True 成功, False 失敗

Return type

bool

UtsusemiD4Matrix2.ImportEcmStepByStep(DAT, PhiValue, title)

StepByStep測定の非弾性散乱処理済みのデータ(ElementContainerMatrix)を角度情報とともに取り込む。この時点では射影計算はなされない。

Parameters
  • ecm (ElementContainerMatrix) – データ処理済みヒストグラム

  • PhiValue (float) – U-vectorと平行な方位を0度とした時の角度

  • title (string) – このデータに対するタイトル

Returns

結果 True 成功, False 失敗

Return type

bool

UtsusemiD4Matrix2.Projection(ProjAxes)

StepByStep測定及び連続回転測定の取り込み済みのデータに対し、射影処理を行う。

Parameters

ProjAxes (list(float)) – 射影軸の指定

Returns

結果 True 成功, False 失敗

Return type

bool

UtsusemiD4Matrix2.Slice2d(sliced_eca, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold)

射影処理終了後のデータに対し2Dスライスを行う。

Parameters
  • sliced_eca (ElementContainerArray) – スライスされたデータを収めるコンテナ

  • sl_ax1 (list(float)) – 射影軸1のスライス情報

  • sl_ax2 (list(float)) – 射影軸2のスライス情報

  • sl_ax3 (list(float)) – 射影軸3のスライス情報

  • sl_ax4 (list(float)) – 射影軸4のスライス情報

  • sl_dFold (list) – 畳み込み情報

Returns

結果 True 成功, False 失敗

Return type

bool

射影軸ごとにlist(float)でスライス情報を与えるが、そのフォーマットは以下のとおり。

[ “A”, min, max, (width) (,folding) ]

要素

タイプ

説明

“A”

str

軸の役割, X軸なら”X”、Y軸なら”Y”、Z軸なら”Z”、 Thickness軸なら”T”

min

float

範囲の最小値

max

float

範囲の最大値

width

float

bin幅、ただしAが”X”か”Y”,”Z”の時のみ有効

folding

float

その軸の畳み込みを行うQ値 (下表参照)

Folding

-1

(負の値)使用しない

0.0

その軸=0で折りたたむ

x

その軸=xで折りたたむ

例:

X,Y,Z軸方向は長さ4のリスト

[ “X”, -1.8, 2.6, 0.02 ]

T軸方向は長さ3のリスト.

[ “T”, -0.1, 0.1 ]

対角線での畳み込みを行う方法は未実装(2019.12.20時点)

なお、2Dスライスの時は、”X”,”Y”が一つずつ、”T”が二つ、3Dスライスなら”X”,”Y”,”Z”,”T”が一つずつ指定する。

UtsusemiD4Matrix2.Slice3d(sliced_ecm, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold)

射影処理終了後のデータに対し3Dスライスを行う。

Parameters
  • sliced_ecm (ElementContainerMatrix) – スライスされたデータを収めるコンテナ

  • sl_ax1 (list(float)) – 射影軸1のスライス情報

  • sl_ax2 (list(float)) – 射影軸2のスライス情報

  • sl_ax3 (list(float)) – 射影軸3のスライス情報

  • sl_ax4 (list(float)) – 射影軸4のスライス情報

  • sl_dFold (list) – 畳み込み情報

Returns

結果 True 成功, False 失敗

Return type

bool

射影軸のスライス情報は、 Slice2dを参照のこと。

UtsusemiD4Matrix2.AllocateD4MatOnDisk(a1range, a2range, a3range, a4range, titles, data_dir, string paramfile)

StepByStep測定の入力済みデータから、D4MatSlicer用のデータ(D4Matデータ)を出力するコマンドである。

Parameters
  • a1range (list(float)) – 射影軸1の範囲とbin幅

  • a2range (list(float)) – 射影軸2の範囲とbin幅

  • a3range (list(float)) – 射影軸3の範囲とbin幅

  • a4range (list(float)) – 射影軸4の範囲とbin幅

  • titles (list(string)) – 射影軸のタイトル

  • data_dir (string) – 出力先のフォルダへのパス指定

  • paramfile (string) – 出力先のパラメータファイル名

Returns

結果 True 成功, False 失敗

Return type

bool

射影軸の範囲とbin幅は、[ min, max, bin ] のフォーマットである。

UtsusemiD4Matrix2.ExportEcmFromStepByStep(ecm, index)

StepByStep測定の入力済みデータから、特定の角度のデータを取り出す。最低角度のデータをindex=0とする。

Parameters
  • ecm (ElementContainerMatrix) – 取り出すデータのコンテナ

  • index (int) – 角度のインデックス

Returns

結果 True 成功, False 失敗

Return type

bool

例: .. code-block:: python

ecm = ElementContainerMatrix() UD.ExportEcmFromStepByStep( ecm, 10 )

UtsusemiD4Matrix2.ClearAll()

取り込んだデータを全てクリアする。

Returns

None

Return type

None

UtsusemiD4Matrix2.PutQRange()

取り込んだデータから、Q領域及びhw領域のそれぞれの最小値と最大値を返す。

Returns

Q1, Q2, Q3, hwのそれぞれの最小値、最大値のリスト

Return type

list(float)

戻り値は、[ Q1_min, Q1_max, Q2_min, … , hw_max ]のサイズ8のリストである。