「PIONEチュートリアル-package」の版間の差分

提供: Eospedia
移動: 案内検索
(作成例5(継承))
(作成例5(継承))
行346: 行346:
 
<br>
 
<br>
  
InitialがParentとChildの両方で定義していましたが、どちらが適応されているかを確認します。<br>
+
Initialのルールを親(Parent)と子(Child)の両方で定義していましたが、どちらが適応されているかを確認します。<br>
<br>
+
今回の出力ファイル<br>
 
+
<table>
このようにParentを利用すると、元々のルールを上書きして新しいジョブを実現することができます。<br>
+
<tr>
 +
<td>1VOM.roi</td>
 +
<td></td>
 +
<td>1VOM-N.roi</td>
 +
<td></td>
 +
</tr>
 +
<tr>
 +
<td>[[画像:Outdata-PIONE-Package5-1.png]]</td>
 +
<td>[[画像:Outdata1-PIONE-Package5-1.png]]</td>
 +
<td>[[画像:Outdata-PIONE-Package5-2.png]]</td>
 +
<td>[[画像:Outdata1-PIONE-Package5-2.png]]</td>
 +
</tr>
 +
<tr>
 +
<td>xy平面</td>
 +
<td>yz平面</td>
 +
<td>xy平面</td>
 +
<td>yz平面</td>
 +
</tr>
 +
</table>
 +
子(Child)のルールが適応されています。先に親のルールを定義してから子のルールで上書きする構造になっています。<br>
 +
このようにParentを利用すると、元々のルールを上書きすることで新しいジョブを実現することができます。<br>
 
<br>
 
<br>

2014年11月21日 (金) 08:00時点における版

 ここでは、PIONEのパッケージ作成について示します。これにより複数のpione定義書を1つにまとめることができ、PIONE-WebClientで使用するときに1つのファイルを選ぶだけで済むので、ユーザが内部の処理の組み合わせを考えることなく複雑な処理を行うことができます。

作成例1(基本)

 まずは最も単純な例でパッケージを作成してみましょう。PIONEチュートリアル#基本1(特定のファイルを出力する)のHelloプログラムをパッケージ化してみます。まずpione定義書にパッケージ化のための情報を書き込みます。

.@ PackageName	:: "HelloWorld"

Rule Main
	output 'message.txt'

Action
	echo "Hello PIONE world !" > message.txt
End

このファイルはこちらからダウンロードできます。ここでPackageNameはパッケージ化したときの名前を指します。

次に下記のコマンドを入力するとパッケージが作成されます。

$ pione package build Package1
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package1/pione-package.json
info: Package local:/Eos/tutorial/SampleCode/PIONE/HelloWorld.ppg has been built successfully.

これによりHelloWorld.ppgというパッケージファイルができます。なおPackage1はHelloプログラムを格納しているディレクトリ名です。
主にpione定義書へのパッケージ情報(アノテーション)の追記とパッケージ化のコマンドでパッケージが作成される仕組みになっています。

作成例2(アノテーションの追加)

 次はアノテーションを追加してパッケージを作成してみましょう。#作成例1(基本)に追加してみます。

.@ PackageName	:: "HelloWorld"
.@ Editor		:: "Kinoshita"
.@ Tag			:: "v0.0.1"

Rule Main
	output 'message.txt'

Action
	echo "Hello PIONE world !" > message.txt
End

このファイルはこちらからダウンロードできます。ここでEditorは作者名、タグはバージョンNo. などを付けます。使用する(した)パッケージの区別がつきやすくするために書くようにしましょう。では、同様にパッケージを作成してみます。

/PIONE$ pione package build Package2/
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package2/pione-package.json
info: Package local:/Eos/tutorial/SampleCode/PIONE/HelloWorld(Kinoshita)+v0.0.1.ppg has been built successfully.

今回はHelloWorld(Kinoshita)+v0.0.1.ppgといったファイルができています。実行例についてはPIONE Webclientチュートリアル#パッケージ(.ppg)ファイルで実行をご覧下さい。

作成例3(ファイルをまとめる)

 パッケージの主な目的は複数のpione定義書を一つにまとめることなので試してみましょう。今回はPIONEチュートリアル#応用1(フローの制御)にてルール毎にファイルを単純に分割したファイルにアノテーションを記述したファイルを追加し、パッケージとしてひとつにまとめます。

Annotation.pione

.@ PackageName	:: "CenterGet"
.@ Editor		:: "Kinoshita"
.@ Tag			:: "v0.0.4"


Main.pione

Rule Main
	input '*.mrc'.all
	output '*.roi'
	output '*.tiff'
Flow
	rule Initial
	rule First
	rule Second
	rule Final
End


Initial.pione

Rule Initial
	input '*.mrc'
	output '{$I[1][1]}.parameters'
Action
	echo "40 40 50" > {$O[1]}
End


First.pione

Rule First
	input '*.mrc'
	output '{$I[1]}.info'
Action
	mrcImageInfo -I -i {$I[1]} \
	| head -2 | tail -1 \
	| awk '{printf("%s %s %s", $3, $4, $5)}' \
	| tr -c '[0-9]' ' ' \
	> {$O[1]}
End


Second.pione

Rule Second
	input '*.mrc'
	input '{$I[1]}.info'
	input '{$I[1][1]}.parameters'
	output '{$I[1][1]}.roi'
Action
	Center_x=$(awk '{printf("%s\n", $1)}' {$I[2]})
	Center_y=$(awk '{printf("%s\n", $2)}' {$I[2]})
	Center_z=$(awk '{printf("%s\n", $3)}' {$I[2]})
	N_x=$(awk '{printf("%s\n", $1)}' {$I[3]})
	N_y=$(awk '{printf("%s\n", $2)}' {$I[3]})
	N_z=$(awk '{printf("%s\n", $3)}' {$I[3]})
	mrcImageCenterGet -i {$I[1]} -o {$O[1]} \
		-Cx $Center_x -Cy $Center_y -Cz $Center_z \
		-Nx $N_x -Ny $N_y -Nz $N_z
End


Final.pione

Rule Final
	input '*.mrc'
	input '{$I[1][1]}.roi'
	output '{$I[1]}-1.tiff'
	output '{$I[2]}-1.tiff'
	output '{$I[1]}-2.tiff'
	output '{$I[2]}-2.tiff'
Action
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d
	mrc2tiff -i {$I[1]}.2d -o {$O[1]}
	mrcImageProjection -i {$I[1]} -o {$I[1]}.2d1 -m 1
	mrc2tiff -i {$I[1]}.2d1 -o {$O[3]}
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d
	mrc2tiff -i {$I[2]}.2d -o {$O[2]}
	mrcImageProjection -i {$I[2]} -o {$I[2]}.2d1 -m 1
	mrc2tiff -i {$I[2]}.2d1 -o {$O[4]}
End


これらからパッケージを作成します。

/PIONE$ pione package build Package3/
info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package3/pione-package.json
info: Package local:/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.0.4.ppg has been built successfully.

今回はCenterGet(Kinoshita)+v0.0.4.ppgといったファイルができています。実行例についてはPIONE Webclientチュートリアル#パッケージ(.ppg)ファイルで実行(Eosのコマンド)をご覧下さい。

今回は元々一つだったpione定義書を分割して、また一つにしてパッケージ化しているので一見有用性がないように見えます。しかし、分割したファイルの内の一つを別の処理に差し替えたい場合、共通の処理として再利用したい場合などには非常に有効な手段といえます。

作成例4(一部処理だけ差し替える)

 #作成例3(ファイルをまとめる)の一部を再利用して別の処理を作成してみましょう。前回はInitialにてROIファイルのサイズを(40, 40, 50)固定で設定していました。これを元の.mrcファイルサイズの80%に設定したもので差し替えてパッケージ化してみます。

Initial2.pione

Rule Initial
	input '*.mrc'
	output '{$I[1][1]}.parameters'
Action
	mrcInfo -i {$I[1]} \
	| head -1 \
	| awk '{printf("%s %s %s", $4, $5, $6)}' \
	| tr -c '[0-9]' ' ' \
	> TMP
	awk '{printf("%d %d %d", $1*4/5, $2*4/5, $3*4/5)}' TMP \
	> {$O[1]}
End


さらにバージョンも変更してみます。
Annotation1.0.pione

.@ PackageName	:: "CenterGet"
.@ Editor		:: "Kinoshita"
.@ Tag			:: "v0.1.0"


他のファイルはコピーまたはリンクを作ってパッケージします。

/PIONE$ cd Package4
/Package4$ ln -s ../Package3/Main.pione Main.pione
/Package4$ ln -s ../Package3/First.pione First.pione
/Package4$ ln -s ../Package3/Second.pione Second.pione
/Package4$ ln -s ../Package3/Final.pione Final.pione
/Package4$ cd ../
/PIONE$ pione package build Package4


今回の入力ファイル

1VOM.mrc 1VOM-N.mrc
Input-1VOM.png Input1-1VOM.png Input-1VOM-N.png Input1-1VOM-N.png
xy平面 yz平面 xy平面 yz平面


作成例3の出力ファイル

1VOM.roi 1VOM-N.roi
Outdata-PIONE-Advanced1-1.png Outdata1-PIONE-Advanced1-1.png Outdata-PIONE-Advanced1-2.png Outdata1-PIONE-Advanced1-2.png
xy平面 yz平面 xy平面 yz平面


今回の出力ファイル

1VOM.roi 1VOM-N.roi
Outdata-PIONE-Package4-1.png Outdata1-PIONE-Package4-1.png Outdata-PIONE-Package4-2.png Outdata1-PIONE-Package4-2.png
xy平面 yz平面 xy平面 yz平面


サイズの変更をすることができました。このように元の処理を少しだけ変えた処理も簡単に作ることができました。

作成例5(継承)

 ここまでではbuildを使って1つのパッケージを作る例を示しました。次はaddを使ったパッケージの継承を行ってみましょう。今回はまた#作成例4(一部処理だけ差し替える)と同様の機能を#作成例3(ファイルをまとめる)を継承元(Parent)として作ってみます。

Parentの登録

まず、#作成例3(ファイルをまとめる)を継承元(Parent)として下記のコマンドにて登録します。
.jsonファイルがない場合は予めbuildで作成します。

/PIONE$ pione package build Package3/
info: update the package info file: local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/Package3/pione-package.json
info: Package local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.0.4.ppg has been built successfully.


.jsonファイルがあることを確認して次にaddでParent登録します。

```
/PIONE$ pione package add Package3/
info: Package "CenterGet"(editor: Kinoshita, tag: v0.0.4) has been added to package database.

登録したParentはC言語でいうとライブラリのような役割で、呼び出す側のアノテーション(PackageName, Editor, Tag)にこの情報を書き込むと使用できるようになっています。

Parentの利用

利用するには継承側(Child)のアノテーションにParentを追加します。

Annotation2.0.pione

.@ PackageName	:: "CenterGet"
.@ Editor		:: "Kinoshita"
.@ Tag			:: "v0.2.0"
.@ Parent		:: &CenterGet.editor("Kinoshita").tag("v0.0.4")

.@ Parentという構文で始めて、&(パッケージ名).editor((作者名)).tag((タグ))のように記述すると継承できます。

今回はInitial2.pioneを#作成例4(一部処理だけ差し替える)で作っているので、コピーまたはリンクで用意できます。

/PIONE$ cd Package5/
/Package5$ ln -s ../Package4/Initial2.pione .


実行結果

では、実行してみます。

/PIONE$ pione package build Package5/
info: update the package info file: local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/Package5/pione-package.json
info: Package local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.2.0.ppg has been built successfully.
/PIONE$ pione-client CenterGet\(Kinoshita\)+v0.2.0.ppg -i ../../SampleData/ -b CenterGet
  ==> &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
    --> Rule Application: &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
      --> Distribution: &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})

-中略-

  <== &CenterGet-1:Main([1VOM-N.mrc,1VOM.mrc],{})
      <-- Distribution: &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
    <-- Rule Application: &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
  <== &CenterGet-1:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
/PIONE$ 


Initialのルールを親(Parent)と子(Child)の両方で定義していましたが、どちらが適応されているかを確認します。
今回の出力ファイル

1VOM.roi 1VOM-N.roi
Outdata-PIONE-Package5-1.png Outdata1-PIONE-Package5-1.png Outdata-PIONE-Package5-2.png Outdata1-PIONE-Package5-2.png
xy平面 yz平面 xy平面 yz平面

子(Child)のルールが適応されています。先に親のルールを定義してから子のルールで上書きする構造になっています。
このようにParentを利用すると、元々のルールを上書きすることで新しいジョブを実現することができます。