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

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

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

使用される関数(クラス)は、 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データを出力する。

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

上記のステップのうち

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

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

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

を行うコードを示す。

D4MatSlicer command script
#! /usr/bin/env python
import os
import sys
import DR
import Cmm

#####################
# modify here
####################
Ei=50.048
delta_hw = 0.5
hw_min = 0.0
hw_max = 40.0
maskfile = "mask.txt"
normFactor = 1000000.0
gonioValueAtZero =-22.440

# 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)=",len(argv))

listFileName=""
if len(argv)==2:
    if os.path.exists(argv[1]):
        listFileName=argv[1]
        print("AngleList=%s"%(listFileName))
else:
    print("Usage::")
    print("  ./Extract_runlist.py [filename of runlist]")
    sys.exit(0)


conds = []

if listFileName!="":
    fo = open( listFileName,"r" )
    ss=fo.readline()
    while(True):
        ss=fo.readline()
        if ss=="":
            break
        if ss[0]=="#":
            print("Skip::",ss)
            continue
        ss_s = ss.split()
        if len(ss_s)==9:
            runNo = int(ss_s[0])
            if normFactor==0.0:
                norm = 0.0
            else:
                norm = float(ss_s[5])/normFactor*(-1.0)
            angle = float(ss_s[8])-gonioValueAtZero
            conds.append( (runNo,angle,norm ) )
    fo.close()

#print conds

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

UD = mu.UtsusemiD4Matrix2()               # D4matSlicer2のコマンドを実行するための用意
UD.ClearAll()                             # データのクリア(念のため)
for (ScanNo,PhiValue,Norm) in conds:
    print("==============[ %06d,%8.3f,%10.5f ]" % (ScanNo,PhiValue,Norm))
    DAT = DR.GetDataOfMonochroEi2(ScanNo, Ei, delta_hw, hw_min, hw_max, maskfile, Norm)
    UD.ImportEcmStepByStep( DAT, PhiValue, str(PhiValue) ) # 非弾性処理済みデータを回転角度とともに入力
    del DAT                               # 入力済みのデータは削除して良い(推奨)

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

サンプルコード2(続き)

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

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

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

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

### Slice 2D
sl_ax1 = ["X",-1.8,4.2,0.02 ]
sl_ax2 = ["Y",-2.2,3.0,0.02 ]
sl_ax3 = ["T",-0.1,0.1 ]
sl_ax4 = ["T",0,1.0]
sl_dFold = []

sliced_eca = Manyo.ElementContainerArray()
if UD.Slice2D( sliced_eca, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold ):
    print("## Slice succeeded.")
    import vis.M2Plot as mp
    p=mp.M2Plot(sliced_eca)
    p.SetXLabel("Qa [url]")
    p.SetYLabel("Qb [url]")
else:
    print("## Slice failed.")

### Slice 3D
sl_ax1 = ["X",-1.8,4.2,0.02 ]
sl_ax2 = ["Y",-2.2,3.0,0.02 ]
sl_ax3 = ["T",-0.1,0.1 ]
sl_ax4 = ["Z",0,20.0,0.5]
sl_dFold = []

sliced_ecm = Manyo.ElementContainerMatrix()
if UD.Slice3D( sliced_ecm, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold ):
    print("## Slice3D succeeded.")
    import vis.SliceViewer3D as SV
    p=SV.SliceViewer()
    p.setData(0, sliced_ecm, "Slice 3D" )
else:
    print("## Slice failed.")

サンプルコード(続き)5. D4Matデータ書き出し

前述の射影まで処理スクリプトに以下のコードを加えると、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スライスしてテキストファイルに保存する

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

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

  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" )

サンプルコード(続き)

  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)

サンプルコード(続き)

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

##### 3D Slice Test (Save as text file)
### Make parameters for slicing
Ax1_slice = [ "X", limRange[0], limRange[1], 0.02 ]
Ax2_slice = [ "Y", limRange[2], limRange[3], 0.02 ]
Ax3_slice = [ "Z", limRange[4], limRange[5], 0.02 ]
Foldings = []

cnt = 0
while(True):
    ##Ax4 (EnergyTransfer)
    hw_min = HW_min+float(cnt)*HW_bin
    hw_max = hw_min + HW_bin
    Ax4_slice = [ "T", hw_min, hw_max ]

    ### Do Slice and Save as text
    sliced_ecm = Manyo.ElementContainerMatrix()
    if D4M.Slice3d( sliced_ecm, Ax1_slice, Ax2_slice, Ax3_slice, Ax4_slice, Foldings ): # if slicing succeeds

        ## Save sliced data (ECM) as text file
        Header = "## RunNo=%d\n"%runNo
        Header+= "## Ei=%g, HW_bin=%g, HW_max=%g, HW_bin=%g\n"%(Ei,HW_min,HW_max,HW_bin)
        Header+= "## AngleRange=%g:%g AngleStep=%g\n"%(st_deg,ed_deg,w_deg)
        Header+= "## TimeRange=%d:%d\n"%(t_start,t_end)
        Header+= "## Ax1=[ %s, %g, %g, %g ]\n"%(Ax1_slice[0],Ax1_slice[1],Ax1_slice[2],Ax1_slice[3])
        Header+= "## Ax2=[ %s, %g, %g, %g ]\n"%(Ax2_slice[0],Ax2_slice[1],Ax2_slice[2],Ax2_slice[3])
        Header+= "## Ax3=[ %s, %g, %g, %g ]\n"%(Ax3_slice[0],Ax3_slice[1],Ax3_slice[2],Ax3_slice[3])
        Header+= "## Ax4=[ %s, %g, %g ]\n\n"%(Ax4_slice[0],Ax4_slice[1],Ax4_slice[2])

        fo=open( "out_hw_%g_%g.txt"%(hw_min,hw_max), "w" )
        fo.write(Header)

        for i in range(sliced_ecm.PutSize()):
            for j in range(sliced_ecm(i).PutSize()):
                EC = sliced_ecm(i,j)
                vi = EC.PutY()
                ve = EC.PutE()
                vx = EC.Put( mu.UTSUSEMI_KEY_VIEWX );
                vy = EC.Put( mu.UTSUSEMI_KEY_VIEWY );
                vz = EC.Put( mu.UTSUSEMI_KEY_VIEWZ );
                current_hw = (hw_min+hw_max)/2.0

                for k in range( vi.size() ):
                    a_line = "%g\t%g\t%g\t%g\t%g\t%g\n"%( vx[k], vy[k], vz[k], current_hw, vi[k], ve[k] )
                    fo.write(a_line)

        fo.close()
        del sliced_ecm

        cnt += 1

        if (HW_min + float(cnt)*HW_bin)>HW_max:
            break

del D4M

UtsusemiD4Matrix2リファレンス

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

class UtsusemiD4Matrix2

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

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

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

パラメータ
  • LatticeConsts (list(float)) -- 格子定数の指定 [ a, b, c,α,β,γ]

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

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

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

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

UtsusemiD4Matrix2.ImportEcmStepByStep(DAT, PhiValue, title)

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

パラメータ
  • ecm (ElementContainerMatrix) -- データ処理済みヒストグラム

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

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

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

UtsusemiD4Matrix2.ProjectionStepByStep(ProjAxes)

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

パラメータ

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

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

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

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

パラメータ
  • 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) -- 畳み込み情報

戻り値

結果 True 成功, False 失敗

戻り値の型

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スライスを行う。

パラメータ
  • 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) -- 畳み込み情報

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

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

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

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

パラメータ
  • 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) -- 出力先のパラメータファイル名

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

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

UtsusemiD4Matrix2.ExportEcmFromStepByStep(ecm, index)

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

パラメータ
  • ecm (ElementContainerMatrix) -- 取り出すデータのコンテナ

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

戻り値

結果 True 成功, False 失敗

戻り値の型

bool

例: .. code-block:: python

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

UtsusemiD4Matrix2.ClearAll()

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

戻り値

None

戻り値の型

None

UtsusemiD4Matrix2.PutQRange()

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

戻り値

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

戻り値の型

list(float)

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