.. _CUI_UtsusemiD4Matrix2: D4MatSlicer2(Step By Step測定及び連続回転測定)用コマンド ============================================================ .. contents:: 目次 :depth: 2 多次元系単結晶試料に対する非弾性散乱測定において、広い運動量空間をカバーするためには、試料に対する入射中性子の方位の異なる測定を複数回行い一つの運動量エネルギー空間にあるものとみなしてデータを扱う必要がある。 その測定手法には2種類、 *Step By Step測定* と *連続回転測定* とがある。これらの測定データを処理するソフトウェアとして、 **D4matSlicer2** ( 参照: :ref:`「D4matSlicer2マニュアル」` があるが、本章ではそのコマンドラインインターフェースを紹介する。 使用される関数(クラス)は、 **UtsusemiD4Matrix2** である。 ------------------------------------- サンプルコード(Step By Step測定用) ------------------------------------- Step By Step測定のデータを利用する場合に使用できるものを紹介する。 :ref:`多次元系単結晶試料非弾性散乱測定(回転測定)のデータ処理(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. スクリプトに記述した試料情報を利用し、射影処理を行う を行うコードを示す。 .. code-block:: python :caption: D4MatSlicer command script :name: A-1.py #! /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のスライス+プロットを行うことができる。 すなわち前述の 4. 2Dや3Dのスライス及び可視化を行う を行うためのスクリプトである。 スライスに必要な各軸のパラメータの与え方は :ref:`運動量エネルギー空間への射影に関連するコマンド` と同等である。 .. code-block:: python ### 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データへの書き出しが行える。 5. D4MatSlicerで可視化できるD4Matデータを出力する。 .. code-block:: python ### 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)) を行うものである。 .. code-block:: python :caption: D4Mat2 commands scripts for the continuous rotation method :name: Sample-A-2.py #!/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" ) サンプルコード(続き) ---------------------- 3. 射影データを2Dスライスする .. code-block:: python #### 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) サンプルコード(続き) ----------------------- 4. 射影データを3Dスライスしてテキストファイルに保存する .. code-block:: python ##### 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** で使用できるコマンド(メソッド)のうち、主要なものを示す。 .. py:class:: UtsusemiD4Matrix2 連続回転測定データの処理や、StepByStepデータの処理を、全データをメモリ上に保管することにより、高速に、かつ処理の柔軟性を高めたものである。 .. py:method:: UtsusemiD4Matrix2.SetD4MatSampleInfo( LatticeConst, Uvector, Vvector, RotateSteps ) 試料情報(格子定数、方位情報など)を与える。 :param list(float) LatticeConsts: 格子定数の指定 [ a, b, c,α,β,γ] :param list(float) Uvec: U-vector :param list(float) Vvec: V-vector :param list(float) Rvec: U-V-vectorの回転を指定 :return: 結果 True 成功, False 失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix2.ImportEcmStepByStep( DAT, PhiValue, title ) StepByStep測定の非弾性散乱処理済みのデータ(ElementContainerMatrix)を角度情報とともに取り込む。この時点では射影計算はなされない。 :param ElementContainerMatrix ecm: データ処理済みヒストグラム :param float PhiValue: U-vectorと平行な方位を0度とした時の角度 :param string title: このデータに対するタイトル :return: 結果 True 成功, False 失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix2.ProjectionStepByStep( ProjAxes ) StepByStep測定の取り込み済みのデータに対し、射影処理を行う。 :param list(float) ProjAxes: 射影軸の指定 :return: 結果 True 成功, False 失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix2.Slice2d( sliced_eca, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold ) 射影処理終了後のデータに対し2Dスライスを行う。 :param ElementContainerArray sliced_eca: スライスされたデータを収めるコンテナ :param list(float) sl_ax1: 射影軸1のスライス情報 :param list(float) sl_ax2: 射影軸2のスライス情報 :param list(float) sl_ax3: 射影軸3のスライス情報 :param list(float) sl_ax4: 射影軸4のスライス情報 :param list sl_dFold: 畳み込み情報 :return: 結果 True 成功, False 失敗 :rtype: 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"が一つずつ指定する。 .. py:method:: UtsusemiD4Matrix2.Slice3d( sliced_ecm, sl_ax1, sl_ax2, sl_ax3, sl_ax4, sl_dFold ) 射影処理終了後のデータに対し3Dスライスを行う。 :param ElementContainerMatrix sliced_ecm: スライスされたデータを収めるコンテナ :param list(float) sl_ax1: 射影軸1のスライス情報 :param list(float) sl_ax2: 射影軸2のスライス情報 :param list(float) sl_ax3: 射影軸3のスライス情報 :param list(float) sl_ax4: 射影軸4のスライス情報 :param list sl_dFold: 畳み込み情報 :return: 結果 True 成功, False 失敗 :rtype: bool 射影軸のスライス情報は、 Slice2dを参照のこと。 .. py:method:: UtsusemiD4Matrix2.AllocateD4MatOnDisk(a1range, a2range, a3range, a4range, titles, data_dir, string paramfile ) StepByStep測定の入力済みデータから、D4MatSlicer用のデータ(D4Matデータ)を出力するコマンドである。 :param list(float) a1range: 射影軸1の範囲とbin幅 :param list(float) a2range: 射影軸2の範囲とbin幅 :param list(float) a3range: 射影軸3の範囲とbin幅 :param list(float) a4range: 射影軸4の範囲とbin幅 :param list(string) titles: 射影軸のタイトル :param string data_dir: 出力先のフォルダへのパス指定 :param string paramfile: 出力先のパラメータファイル名 :return: 結果 True 成功, False 失敗 :rtype: bool 射影軸の範囲とbin幅は、[ min, max, bin ] のフォーマットである。 .. py:method:: UtsusemiD4Matrix2.ExportEcmFromStepByStep( ecm, index) StepByStep測定の入力済みデータから、特定の角度のデータを取り出す。最低角度のデータをindex=0とする。 :param ElementContainerMatrix ecm: 取り出すデータのコンテナ :param int index: 角度のインデックス :return: 結果 True 成功, False 失敗 :rtype: bool 例: .. code-block:: python ecm = ElementContainerMatrix() UD.ExportEcmFromStepByStep( ecm, 10 ) .. py:method:: UtsusemiD4Matrix2.ClearAll() 取り込んだデータを全てクリアする。 :return: None :rtype: None .. py:method:: UtsusemiD4Matrix2.PutQRange() 取り込んだデータから、Q領域及びhw領域のそれぞれの最小値と最大値を返す。 :return: Q1, Q2, Q3, hwのそれぞれの最小値、最大値のリスト :rtype: list(float) 戻り値は、[ Q1_min, Q1_max, Q2_min, ... , hw_max ]のサイズ8のリストである。