「PIONEチュートリアル-package」の版間の差分
(→作成例7(シナリオ)) |
(→作成例7(シナリオ)) |
||
行601: | 行601: | ||
実行してみます。[[pione-client]]にオプション--rehearseでシナリオ名を指定して実行します。<br> | 実行してみます。[[pione-client]]にオプション--rehearseでシナリオ名を指定して実行します。<br> | ||
<pre> | <pre> | ||
+ | /PIONE$ pione-client CenterGet\(Kinoshita\)+v0.4.0.ppg -b CenterGet --rehearse "i:1VOM m:1" | ||
+ | ==> &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | --> Rule Application: &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | --> Distribution: &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | >>> &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | ==> &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | --> Rule Application: &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | --> Distribution: &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | >>> &CenterGet-3:Initial([1VOM.mrc],{}) | ||
+ | >>> &CenterGet-3:First([1VOM.mrc],{}) | ||
+ | ==> &CenterGet-3:Initial([1VOM.mrc],{}) | ||
+ | -中略- | ||
+ | |||
+ | <== &CenterGet-3:Final([1VOM.mrc,1VOM.roi],{}) | ||
+ | <-- Distribution: &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | <-- Rule Application: &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | <-- Distribution: &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | <== &CenterGet-3:Main([1VOM.mrc],{}) | ||
+ | <-- Rule Application: &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | <== &CenterGet-3:Root([1VOM.mrc],{}) | ||
+ | info: Rehearsal Result: Succeeded | ||
</pre> | </pre> | ||
+ | 出力ファイルが一致した場合は最後にRehearsal Result: Succeededと出力されます。<br> | ||
+ | *出力ファイルに差異がある場合: - 1VOM.roi is different from expected result. | ||
+ | *出力ファイルが作成されなかった場合: - 1VOM.roi doesn't exist. | ||
<br> | <br> |
2014年12月19日 (金) 04:34時点における版
ここでは、PIONEのパッケージ作成について示します。これにより複数のPIONE定義書を1つにまとめることができます。パッケージもPIONE定義書と同様にpione-clientから実行することができます。また、ユーザが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を入力するとパッケージが作成されます。
$ 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 | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
作成例3の出力ファイル
1VOM.roi | 1VOM-N.roi | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
今回の出力ファイル
1VOM.roi | 1VOM-N.roi | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
サイズの変更をすることができました。このように元の処理を少しだけ変えた処理も簡単に作ることができました。
作成例5(継承)
ここまでではpione package buildを使って1つのパッケージを作る例を示しました。次はaddを使ったパッケージの継承を行ってみましょう。今回はまた#作成例4(一部処理だけ差し替える)と同様の機能を#作成例3(ファイルをまとめる)を継承元(Parent)として作ってみます。
Parentの登録
まず、#作成例3(ファイルをまとめる)を継承元(Parent)として下記のコマンドにて登録します。
.jsonファイルがない場合は予めpione package buildで作成します。
/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.
.jsonファイルがあることを確認して次にpione package 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$ cp Package4/Initial2.pione Package5/
実行結果
では、実行してみます。
/PIONE$ pione package build Package5/ info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package5/pione-package.json info: Package local:/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 | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
子(Child)のルールが適応されています。先に親のルールを定義してから子のルールで上書きする構造になっています。
このようにParentを利用すると、変更したい箇所のみのルールを記述するだけで元々のルールを上書きし、新しいジョブを実現することができます。
Parentの登録破棄
Parentの登録を破棄するときはpione package removeを使用します。
$ pione package remove "CenterGet" --editor "Kinoshita" --tag "v0.0.4" info: Package "CenterGet"(editor: Kinoshita, tag: v0.0.4) has been removed from package database.
不要キャッシュの削除
pione cleanでPIONEを実行させる際に蓄積されている不要なキャッシュデータを削除します。
$ pione clean
作成例6(継承2)
次は#作成例5(継承)をさらに継承したパッケージの多重継承の例を実施してみましょう。
Parentの登録
まず、#作成例5(継承)を継承元(Parent)として登録します。.jsonファイルがない場合は予めbuildしておいて下さい。
/PIONE$ pione package add Package5/ info: Package "CenterGet"(editor: Kinoshita, tag: v0.2.0) has been added to package database.
なお、#作成例3(ファイルをまとめる)も登録されている必要がありますが、#作成例5(継承)で登録済みです。
Parentの利用
継承側(Child)の追加分のみを記述します。
Annotation3.pione
.@ PackageName :: "CenterGet" .@ Editor :: "Kinoshita" .@ Tag :: "v0.3.1" .@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.2.0")
今回はFinalのルールを投影画像が設定した方向(デフォルトでは3方向)分出力されるように変更してみます。
Param.pione
Basic Param $Mode := 3 End
Final3.pione
Rule Final input '*.mrc' input '{$I[1][1]}.roi' output '*.tiff'.all Action for (( num = 0; num < {$Mode}; num++ )) ; do \ mrcImageProjection -i {$I[1]} -o {$I[1]}.2d -m ${num}; \ mrc2tiff -i {$I[1]}.2d -o {$I[1]}-${num}.tiff; \ mrcImageProjection -i {$I[2]} -o {$I[2]}.2d -m ${num}; \ mrc2tiff -i {$I[2]}.2d -o {$I[2]}-${num}.tiff; \ done; End
機能を満たすための処理が多くなったので、for文にしています。
実行結果
では、実行してみます。(パラメータはデフォルトを使用)
/PIONE$ pione package build Package6/ info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package6/pione-package.json info: Package local:/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.3.1.ppg has been built successfully. /PIONE$ pione-client CenterGet\(Kinoshita\)+v0.3.1.ppg -i ../../SampleData/ -b CenterGet ==> &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) --> Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) --> Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) -中略- <== &CenterGet-2:Final([1VOM.mrc,1VOM.roi],{}) <-- Distribution: &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{}) <-- Rule Application: &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{}) <-- Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) <== &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{}) <-- Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) <== &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{}) /PIONE$
今回の入力ファイル
1VOM.mrc | 1VOM-N.mrc | ||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | zx平面 | xy平面 | yz平面 | zx平面 |
今回の出力ファイル
1VOM.roi | 1VOM-N.roi | ||||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | zx平面 | xy平面 | yz平面 | zx平面 |
入力ファイル(.mrc)と出力ファイル(.roi)の投影画像が3方向分出力され、#作成例5(継承)をさらに継承することができました。
作成例7(シナリオ)
PIONEにはシナリオという機能があります。これはPIONE定義書やパッケージに対して、使用する入力ファイルやパラメータを決めて常にその内容で実行することができるデモ機能です。また、出力ファイルを設定することにより、作成されたファイルが正しいかをチェックすることもできます。
今回は#作成例6(継承2)についてのシナリオを作成してみます。シナリオを含めたパッケージも同様にビルドを行うだけで作成できるので、継承は必須ではありません。しかし、今回は手間を省くために#作成例6(継承2)のパッケージを再利用して、必要な分だけ追加して継承を行います。予めpione package addで登録しておきます。
/PIONE$ pione package add Package6/ info: Package "CenterGet"(editor: Kinoshita, tag: v0.3.1) has been added to package database.
シナリオ作成
シナリオを作成するためにはシナリオ用のディレクトリを作成し、その中にScenario.pioneファイルを作成し、これと同じディレクトリ内にinputディレクトリ、outputディレクトリを作成します。この通りの名前でなければシナリオと判断されませんので、注意して下さい。
では、シナリオを作成してみましょう。今回はディレクトリ"1VOM-m1"内に作成します。
/PIONE$ mkdir Package7/1VOM-m1/
まずはScenario.pioneにシナリオ名とパラメータの設定を記載します。
.@ ScenarioName :: "i:1VOM m:1" .@ ParamSet :: "{Mode:1}"
次にinputディレクトリにこのシナリオで使用する入力ファイルを必要な分用意します。今回は下記のデータを使用します。
今回の入力ファイル
1VOM.mrc |
![]() |
xy平面 |
そしてoutputディレクトリにこのシナリオでの作成されると想定の出力ファイルを用意します。出力ファイルのチェックが必要ない場合はこの手順は不要です。今回は下記のデータを想定して格納しておきます。
1VOM.roi |
![]() |
xy平面 |
また、アノテーションも更新しておきます。(/Package7/Annotation4.pione)
.@ PackageName :: "CenterGet" .@ Editor :: "Kinoshita" .@ Tag :: "v0.4.0" .@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.3.1")
シナリオ実行
まずはビルドします。
/PIONE$ pione package build Package7/ info: update the package info file: local:/Eos/tutorial/SampleCode/PIONE/Package7/pione-package.json info: update the scenario info file: local:/Eos/tutorial/SampleCode/PIONE/Package7/1VOM-m1/pione-scenario.json info: Package local:/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.4.0.ppg has been built successfully.
実行してみます。pione-clientにオプション--rehearseでシナリオ名を指定して実行します。
/PIONE$ pione-client CenterGet\(Kinoshita\)+v0.4.0.ppg -b CenterGet --rehearse "i:1VOM m:1" ==> &CenterGet-3:Root([1VOM.mrc],{}) --> Rule Application: &CenterGet-3:Root([1VOM.mrc],{}) --> Distribution: &CenterGet-3:Root([1VOM.mrc],{}) >>> &CenterGet-3:Main([1VOM.mrc],{}) ==> &CenterGet-3:Main([1VOM.mrc],{}) --> Rule Application: &CenterGet-3:Main([1VOM.mrc],{}) --> Distribution: &CenterGet-3:Main([1VOM.mrc],{}) >>> &CenterGet-3:Initial([1VOM.mrc],{}) >>> &CenterGet-3:First([1VOM.mrc],{}) ==> &CenterGet-3:Initial([1VOM.mrc],{}) -中略- <== &CenterGet-3:Final([1VOM.mrc,1VOM.roi],{}) <-- Distribution: &CenterGet-3:Main([1VOM.mrc],{}) <-- Rule Application: &CenterGet-3:Main([1VOM.mrc],{}) <-- Distribution: &CenterGet-3:Root([1VOM.mrc],{}) <== &CenterGet-3:Main([1VOM.mrc],{}) <-- Rule Application: &CenterGet-3:Root([1VOM.mrc],{}) <== &CenterGet-3:Root([1VOM.mrc],{}) info: Rehearsal Result: Succeeded
出力ファイルが一致した場合は最後にRehearsal Result: Succeededと出力されます。
- 出力ファイルに差異がある場合: - 1VOM.roi is different from expected result.
- 出力ファイルが作成されなかった場合: - 1VOM.roi doesn't exist.