.. _CUI_D4Mat: D4MatSlicer(Step By Step回転測定)用コマンド ================================================ .. contents:: 目次 :depth: 2 Step By Stepの回転測定のデータを可視化するためには、まずそれぞれの角度のRunのデータ処理を行い、融合したD4Matデータを作成するというステップが存在する。( :ref:`「多次元系単結晶試料非弾性散乱測定(回転測定)のデータ処理(Step-by-Step法)」` を参照) それぞれの角度のRunの処理済みデータはD4Mat変換用ファイルとよんでいるが、そのデータを作成してしまえば、融合したり可視化するのはD4MatSlicer というソフトウェアを利用することで実現できる( :ref:`「ソフトウェアマニュアルのD4MatSlicer」` )。 本節では、このD4MatSlicerの機能をコマンドラインから制御する方法を示す。 この機能に必要なコマンド(クラス)は、 **UtsusemiD4Matrix** である。 ---------------- サンプルコード ---------------- ここでは、 **UtsusemiD4Matrix** クラスをPythonから使用するサンプルコードを示す。 なお、本節では *work* フォルダ内で作業を行い、そこには *data* フォルダには、Step By Step測定のそれぞれの角度の処理済みデータであるD4Mat変換用ファイル(vbinファイル)が存在しているとする。 .. code-block:: shell $ pwd /home/hogehoge/work $ ls -F data/ $ ls -F data/ S1214.vbin S1218.vbin S1222.vbin S1226.vbin S1230.vbin S1234.vbin S1238.vbin S1243.vbin S1247.vbin S1215.vbin S1219.vbin S1223.vbin S1227.vbin S1231.vbin S1235.vbin S1240.vbin S1244.vbin S1248.vbin S1216.vbin S1220.vbin S1224.vbin S1228.vbin S1232.vbin S1236.vbin S1241.vbin S1245.vbin S1249.vbin S1217.vbin S1221.vbin S1225.vbin S1229.vbin S1233.vbin S1237.vbin S1242.vbin S1246.vbin 作業の前に、さらにD4Matデータファイル一式を納めるフォルダを作成しておく。 .. code-block:: shell $ mkdir D4Mat $ ls -F D4Mat/ data/ またスクリプト内のコマンド(メソッド)のリファレンスは、次節に記している。 サンプルコード 1 ------------------- まず、D4Matデータファイルを作成し、そこへ上記の *vbin* ファイルのデータを流し込む作業を行う。 .. code-block:: python import Manyo.Utsusemi as mu DM=mu.UtsusemiD4Matrix() ax1 = [-1.0,1.0,0.5] # 射影の情報を指定 ax2 = [-5.0,5.5,0.02] ax3 = [-1.4,2.0,0.02] hwr = [0.0,42.0,0.2] titles = ["Qa","Qb","Qc","hw"] # 射影の軸のタイトル指定 data_dir = "./D4Mat" # D4Matデータの保存先 pFile = "D4Mat.xml" # D4Matデータのパラメータファイル名 DM.AllocateNewMat( ax1, ax2, ax3, hwr, titles, data_dir, pFile) # D4Matデータの作成 DM.AddToMatFromBinFolder( "./data" ) # "./data"内にある vbin ファイルの読み込み サンプルコード 2 ------------------- 次に、サンプルコード 1で作成したD4Matデータを開き、2次元スライスを実行する。本スクリプトではさらにM2Plotを用いて可視化している。 .. code-block:: python import Manyo import Manyo.Utsusemi as mu DM=mu.UtsusemiD4Matrix() if DM.OpenMat( "./D4Mat_CUI", "D4Mat.xml"): # D4Matデータを無事に開けたら sax1 = [-0.1,0.1] # スライスの範囲をそれぞれの軸で指定 sax2 = [-5.0,5.0] sax3 = [-1.4,2.0] shw = [0.0,42.0] def_ax = ["T","T","X","Y"] # スライス軸の指定 fold = [] # 畳み込みの指定 eca = Manyo.ElementContainerArray(). # 空っぽのElementContainerArray作成し # スライスの実行 if DM.Slice2d( eca, sax1, sax2, sax3, shw, def_ax, fold ): import vis.M2Plot as mp # スライス成功なら2Dプロットで表示 p=mp.M2Plot(eca) else: print "#### ERROR at Slicing #####" else: print "#### ERROR at Opening #####" サンプルコード 3 ------------------- サンプルコード 1で作成したD4Matデータを開き、3次元スライスを実行する。本スクリプトではさらにSliceViewer3Dを用いて可視化している。 .. code-block:: python import Manyo.Utsusemi as mu import Manyo DM=mu.UtsusemiD4Matrix() if DM.OpenMat( "./D4Mat_CUI", "D4Mat.xml" ): # D4Matデータを無事に開けたら sax1 = [-1.0,1.0] # スライスの範囲をそれぞれの軸で指定 sax2 = [-5.0,5.5] sax3 = [-1.4,2.0] shw = [0.0,42.0] def_ax = ["T","X","Y","Z"] # スライス軸の指定 fold=[] # 畳み込みの指定 keys = ["Vx","Vy","Vz"] # スライスされたデータの軸名(出力データ用) dat = Manyo.ElementContainerMatrix() # 出力データを納めるコンテナを準備 # スライスの実行 if DM.Slice3d( dat, sax1, sax2, sax3, shw, def_ax, fold, keys ): # スライスの実行がうまくいった場合 import uGao.SliceViewer3D as mp. # ここでは3Dプロッタへ流す。 p=mp.SliceViewer() p.setData(dat,"Sliced Data of D4Mat") else: print "#### ERROR at Slicing #####" else: print "#### ERROR at Opening #####" サンプルコード 4 ------------------- ここでは *D4MatSlicer* の仮想データを作成し、スライスするところまでをスクリプト化した。 .. code-block:: python import sys import Manyo.Utsusemi as mu DM=mu.UtsusemiD4Matrix() # Sample Info LC = [4.81,8.47,2.941,90.0,90.0,90.0] # 格子定数 UV = [0,1,0] # U-vector VV = [0,0,1] # V-vector RV = [DM.ROTATE_AXIS_Y,-45] # U-V vectorの回転指定 #RV = [] # Projection Info VA = [ 1,0,0,0, # 射影情報 0,1,0,0, 0,0,1,0, 0,0,0,1 ] # Data Reduction Info Ei = 45.6 dhw = 0.2 hw_min = -4.0 hw_max = 42.0 hw_info = [Ei, dhw, hw_min, hw_max] # 非弾性処理用情報 phiSteps = [-82.5+(float(i)*2.5) for i in range(34)] # 回転測定の全角度情報 if DM.SetRunNoForVirtualMatrix( 999999, hw_info ): # 測定情報はRunNoで与える pass else: print "##### ERROR" sys.exit(-1) v=DM.EstimateRangeOfVirtualMat( LC,UV,VV,RV,VA,phiSteps ) # 上記の測定条件でのQの範囲を計算 if len(v)==0: # 戻り値のリストのサイズが0なら失敗 print "##### ERROR : Estimate Range" sys.exit(-1) print "Estimated range v.size()=",v.size() for i in range(4): print "ax%d = %g - %g"%( i,v[i*2],v[i*2+1] ) ax1 = [v[0],v[1],0.5] # D4Matデータの範囲とbin幅を指定 ax2 = [v[2],v[3],0.02] # ここでは計算されたQ範囲を使用 ax3 = [v[4],v[5],0.02] ax4 = [v[6],v[7],dhw] titles = ["Qa","Qb","Qc","hw"] # 軸のタイトル指定 # Make Virtual D4Mat data isOk = DM.AllocateVirtualMat( LC,UV,VV,RV,VA,phiSteps,ax1,ax2,ax3,ax4,titles ) # 仮想D4Mat作成 if isOk: # 成功すれば、通常と同じスライスが可能 sax1 = [-0.1,0.1] sax2 = [v[2],v[3]] sax3 = [v[4],v[5]] shw = [-1.0,1.0] def_ax = ["T","X","Y","T"] #fold = [-1,-1,-1,-1] fold=[] eca = Manyo.ElementContainerArray() isOk = DM.Slice2d( eca, sax1, sax2, sax3, shw, def_ax, fold ) if isOk: import vis.M2Plot as mp p=mp.M2Plot(eca) p.SetXLabel( "Qb" ) p.SetYLabel( "Qc" ) else: print "#### ERROR at Slicing #####" else: print "#### ERROR at Making Virtual D4Mat #####" ---- ----------------------------- UtsusemiD4Matrixリファレンス ----------------------------- 以下に **UtsusemiD4Matrix** で使用できるコマンド(メソッド)のうち、主要なものを示す。 .. py:class:: UtsusemiD4Matrix D4Matデータの作成、スライスを行う。 各コマンドは戻り値がboolのものは実行の成否が、boolでないものは isStatusOK() コマンドを利用できる。 .. py:method:: UtsusemiD4Matrix.AllocateNewMat( a1range, a2range, a3range, a4range, titles, data_dir, paramfile ) 新しい(空っぽの)D4Matデータを作成する。 :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1,delta_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2,delta_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3,delta_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4,delta_Ax4] :type a4range: list(float) :param titles: 上の4軸のタイトル, Size=4 :type titles: list(str) :param str data_dir: D4Matデータを作成する場所(フォルダ) :param str paramfile: D4Matデータの名前(ファイル名, 拡張子は不要) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.OpenMat( datapath, paramfile ) 作成済みのD4Matデータを開く。 :param str data_dir: D4Matデータを作成する場所(フォルダ) :param str paramfile: D4Matデータの名前(ファイル名, 拡張子は不要) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.CloseMat( datapath, paramfile ) 開いているD4Matデータを閉じる。 :return: None :rtype: None .. py:method:: UtsusemiD4Matrix.isMatOpened() D4Matデータが開かれているかどうかを返す。 :return: Trueなら開いている。 :rtype: bool .. py:method:: UtsusemiD4Matrix.isStatusOK() 直前のコマンドが正しく終了したかを確認する :return: Trueなら正しく終了した :rtype: bool .. py:method:: UtsusemiD4Matrix.AddToMatFromBin( filename ) 開いているD4Matデータに、 与えられたファイル名の *vbin* ファイルデータを一つだけ読み込ませる。 :param str filename: ファイルパス :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.AddToMatFromBinFolder( folderpath, _ext=".vbin" ) 開いているD4Matデータに、与えられたフォルダの中に入っている全ての *vbin* ファイルデータを読み込ませる。 :param str folderpath: フォルダのパス :param str _ext: *vbin* ファイルの拡張子(デフォルトは .vbin) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.Slice2d( eca, a1range, a2range, a3range, a4range, def_axes, foldings ) 引数で与えられた条件でD4Matデータを2次元でスライスする。それぞれの軸は最小値と最大値の範囲を与える。 :param ElementContainerArray eca: スライス結果を収める空のコンテナ :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4] :type a4range: list(float) :param def_axes: 4つの軸のうち、スライス軸、積分軸を指定する。スライス軸は "X", "Y"、積分軸は "T"で示す。 :type def_axes: list(str) :param foldings: 畳み込み指定。不要ならば、空のリスト[]、もしくは[-1,-1,-1,-1]を与える。 :type foldings: list(float) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.SetAxTitles( titles, isSaved ) 4つの軸のタイトルを指定する。 :param title: タイトルのリスト :type title: list(str) :param bool isSaved: すぐにD4Matファイルにこの変更を保存するかどうか :return: None :rtype: None .. py:method:: UtsusemiD4Matrix.Slice3d( ecm, a1range, a2range, a3range, a4range, def_axes, foldings, key_axes ) 引数で与えられた条件でD4Matデータを3Dスライスする。それぞれの軸は最小値と最大値の範囲を与える。 :param ElementContainerMatrix ecm: スライス結果を保管するデータコンテナ :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4] :type a4range: list(float) :param def_axes: 4つの軸のうち、スライス軸、積分軸を指定する。スライス軸は "X", "Y", "Z"、積分軸は "T"で示す。 :type def_axes: list(str) :param foldings: 畳み込み指定。不要ならば、空のリスト[]、もしくは[-1,-1,-1,-1]を与える。 :type foldings: list(float) :param key_axes: スライスデータの3軸のキー(変数名)を指定する。わからなければ["Vx","Vy","Vz"]で良い。 :type key_axes: list(str) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.OutputText3D(a1range, a2range, a3range, a4range, def_axes, foldings, filename, isIgnoreMaskVal, maskValStr ) 引数で与えられた条件でD4Matデータを3Dスライスし、テキストに書き出す。それぞれの軸は最小値と最大値の範囲を与える。 :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4] :type a4range: list(float) :param def_axes: 4つの軸のうち、スライス軸、積分軸を指定する。スライス軸は "X", "Y", "Z"、積分軸は "T"で示す。 :type def_axes: list(str) :param foldings: 畳み込み指定。不要ならば、空のリスト[]、もしくは[-1,-1,-1,-1]を与える。 :type foldings: list(float) :param str filename: 出力するファイル名 :param bool isIgnoreMaskVal: データ内にマスク値があった時、それを書き出すかどうか :param str maskValStr: マスク値を書き出す際に指定しないと"nan"になるが、それを別の文字列に置き換える場合に指定する :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.DumpD4MatToFile( a1range, a2range, a3range, a4range, def_axes, foldings, filename, isText ) 引数で与えられた範囲で、D4Matデータをファイルに出力する(4次元データ)。それぞれの軸は最小値と最大値の範囲を与える。出力フォーマットはテキストかバイナリかを選べる。 :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4] :type a4range: list(float) :param def_axes: 4つの軸のうち、スライス軸、積分軸を指定する。スライス軸は "X", "Y", "Z"、積分軸は "T"で示す。 :type def_axes: list(str) :param foldings: 畳み込み指定。不要ならば、空のリスト[]、もしくは[-1,-1,-1,-1]を与える。 :type foldings: list(float) :param str filename: 出力するファイル名 :param bool isText: 出力フォーマットの指定。Trueならテキスト、Falseならバイナリ。 :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.SetRunNoForVirtualMatrix( runNo, hwInfo ) 仮想D4Matデータを作成する場合に装置情報とデータ処理条件(入射エネルギーなど)が必要である。装置情報はRunNoを与えるとそのRunNoの測定時の装置情報が利用される。最新の場合は999999など大きなRunNoを与えておけば良い。hwInfoは下記の通り +-----+--+------+------+------+ |index|0 |1 |2 |3 | +-----+--+------+------+------+ |値 |Ei|hw_bin|hw_min|hw_max| +-----+--+------+------+------+ :param int runNo: RunNo :param hwInfo: データ処理条件 :type hwInfo: list(float) :return: Trueなら成功, Falseなら失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.AllocateVirtualMat( latticeConst, Uvec, Vvec, rotateSteps, viewAxes, phiSteps, a1range, a2range, a3range, a4range, titles ) 引数で与えられた条件で仮想的なD4Matデータをメモリ上で作成する。このコマンドの前に *SetRunNoForVirtualMatrix* を実行する必要がある。 :param latticeConst: 格子定数の指定 [ a, b, c,α,β,γ] :type latticeConst: list(float) :param Uvec: U-vector :type Uvec: list(float) :param Vvec: V-vector :type Vvec: list(float) :param rotateSteps: U-V-vectorの回転を指定する。Y方向に-5度回転なら [ D4Matrix::ROTATE_AXIS_Y, -5.0 ] 指定方法はサンプルスクリプト4を参照のこと。 :type rotateSteps: list(float) :param viewAxes: 射影情報を与える。指定方法はサンプルスクリプト4を参照のこと :type viewAxes: list(float) :param phiSteps: 回転測定のそれぞれの角度のリスト :type phiSteps: list(float) :param a1range: Ax1軸の情報 [min_Ax1, max_Ax1] :type a1range: list(float) :param a2range: Ax2軸の情報 [min_Ax2, max_Ax2] :type a2range: list(float) :param a3range: Ax3軸の情報 [min_Ax3, max_Ax3] :type a3range: list(float) :param a4range: Ax4軸の情報 [min_Ax4, max_Ax4] :type a4range: list(float) :param title: タイトルのリスト :type title: list(str) :return: 結果 True 成功, False 失敗 :rtype: bool .. py:method:: UtsusemiD4Matrix.EstimateRangeOfVirtualMat( latticeConst, Uvec, Vvec, rotateSteps, viewAxes, phiSteps ) 引数で与えられた条件でD4Matデータを作成した場合におけるそれぞれの軸の範囲を見積もる。このコマンドの前に *SetRunNoForVirtualMatrix* を実行する必要がある。 :param latticeConst: 格子定数の指定 [ a, b, c,α,β,γ] :type latticeConst: list(float) :param Uvec: U-vector :type Uvec: list(float) :param Vvec: V-vector :type Vvec: list(float) :param rotateSteps: U-V-vectorの回転を指定する。Y方向に-5度回転なら [ D4Matrix::ROTATE_AXIS_Y, -5.0 ] 指定方法はサンプルスクリプト4を参照のこと。 :type rotateSteps: list(float) :param viewAxes: 射影情報を与える。指定方法はサンプルスクリプト4を参照のこと :type viewAxes: list(float) :param phiSteps: 回転測定のそれぞれの角度のリスト :type phiSteps: list(float) :return: 各軸の範囲。サイズは8のリストで、[ Ax1_min, Ax1_max, Ax2_min, ..., Ax4_max ] と与えられる。 :rtype: int