「PIONEチュートリアル-package」の版間の差分
(→作成例6(継承2)) |
(→不要キャッシュの削除) |
||
行379: | 行379: | ||
==== 不要キャッシュの削除 ==== | ==== 不要キャッシュの削除 ==== | ||
− | + | [[pione clean]]で[[PIONE]]を実行させる際に蓄積されている不要なキャッシュデータを削除します。<br> | |
<pre> | <pre> | ||
$ pione clean | $ pione clean |
2014年12月10日 (水) 02:38時点における版
ここでは、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 | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
作成例3の出力ファイル
1VOM.roi | 1VOM-N.roi | ||
![]() |
![]() |
![]() |
![]() |
xy平面 | yz平面 | xy平面 | yz平面 |
今回の出力ファイル
1VOM.roi | 1VOM-N.roi | ||
![]() |
![]() |
![]() |
![]() |
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:/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ファイルがあることを確認して次に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 "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.0.pione
.@ PackageName :: "CenterGet" .@ Editor :: "Kinoshita" .@ Tag :: "v0.3.0" .@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.2.0")
今回はFinalのルールを投影画像が3方向分出力されるように変更してみます。
Final3.pione
Rule Final input '*.mrc' input '{$I[1][1]}.roi' output '*.tiff'.all Action for (( num = 0; num <= 2; 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:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/Package6/pione-package.json info: Package local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.3.0.ppg has been built successfully. /PIONE$ pione-client CenterGet\(Kinoshita\)+v0.3.0.ppg -i ../../SampleData/ -b CenterGet ==> &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{}) --> Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{}) --> Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{}) -中略- <== &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.FNC,1VOM-N.mrc,...],{}) <== &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{}) <-- Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{}) <== &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{}) /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(継承)をさらに継承することができました。