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

提供: Eospedia
移動: 案内検索
(作成例6(継承2))
 
(同じ利用者による、間の25版が非表示)
行1: 行1:
 ここでは、[[PIONE]]のパッケージ作成について示します。これにより複数の[[pione定義書]]を1つにまとめることができ、[[PIONE-WebClient]]で使用するときに1つのファイルを選ぶだけで済むので、[[ユーザ]]が内部の処理の組み合わせを考えることなく複雑な処理を行うことができます。<br>
+
 ここでは、[[PIONE]][[パッケージ作成]]について示します。これにより複数の[[PIONE定義書]]を1つにまとめることができます。[[パッケージ]]も[[PIONE定義書]]と同様に[[pione-client]]から実行することができます。また、[[ユーザ]]が[[PIONE Webclient]]で使用するときに1つのファイルを選ぶだけで済むので、内部の処理の組み合わせを考えることなく複雑な処理を行うことができます。<br>
 
<br>
 
<br>
  
 
=== 作成例1(基本) ===
 
=== 作成例1(基本) ===
 まずは最も単純な例でパッケージを作成してみましょう。[[PIONEチュートリアル#基本1(特定のファイルを出力する)]]のHelloプログラムをパッケージ化してみます。まず[[pione定義書]]にパッケージ化のための情報を書き込みます。<br>
+
 まずは最も単純な例でパッケージを作成してみましょう。[[PIONEチュートリアル#基本1(特定のファイルを出力する)]]のHelloプログラムをパッケージ化してみます。まず[[PIONE定義書]]にパッケージ化のための情報を書き込みます。<br>
 
<br>
 
<br>
  
行18: 行18:
 
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Package1 こちら]からダウンロードできます。ここでPackageNameはパッケージ化したときの名前を指します。<br>
 
このファイルは[https://sourceforge.jp/projects/eos/scm/git/tutorial/archive/master/SampleCode/PIONE/Package1 こちら]からダウンロードできます。ここでPackageNameはパッケージ化したときの名前を指します。<br>
 
<br>
 
<br>
次に下記のコマンドを入力するとパッケージが作成されます。<br>
+
次に[[pione package build]]を入力するとパッケージが作成されます。<br>
 
<pre>
 
<pre>
 
$ pione package build Package1
 
$ pione package build Package1
行25: 行25:
 
</pre>
 
</pre>
 
これによりHelloWorld.ppgというパッケージファイルができます。なおPackage1はHelloプログラムを格納しているディレクトリ名です。<br>
 
これによりHelloWorld.ppgというパッケージファイルができます。なおPackage1はHelloプログラムを格納しているディレクトリ名です。<br>
主に[[pione定義書]]へのパッケージ情報(アノテーション)の追記とパッケージ化のコマンドでパッケージが作成される仕組みになっています。<br>
+
主に[[PIONE定義書]]へのパッケージ情報(アノテーション)の追記とパッケージ化のコマンドでパッケージが作成される仕組みになっています。<br>
 
<br>
 
<br>
  
行56: 行56:
  
 
=== 作成例3(ファイルをまとめる) ===
 
=== 作成例3(ファイルをまとめる) ===
 パッケージの主な目的は複数の[[pione定義書]]を一つにまとめることなので試してみましょう。今回は[[PIONEチュートリアル#応用1(フローの制御)]]にてルール毎にファイルを単純に分割したファイルにアノテーションを記述したファイルを追加し、パッケージとしてひとつにまとめます。<br>
+
 パッケージの主な目的は複数の[[PIONE定義書]]を一つにまとめることなので試してみましょう。今回は[[PIONEチュートリアル#応用1(フローの制御)]]にてルール毎にファイルを単純に分割したファイルにアノテーションを記述したファイルを追加し、パッケージとしてひとつにまとめます。<br>
 
<br>
 
<br>
  
行164: 行164:
 
今回はCenterGet(Kinoshita)+v0.0.4.ppgといったファイルができています。実行例については[[PIONE Webclientチュートリアル#パッケージ(.ppg)ファイルで実行(Eosのコマンド)]]をご覧下さい。<br>
 
今回はCenterGet(Kinoshita)+v0.0.4.ppgといったファイルができています。実行例については[[PIONE Webclientチュートリアル#パッケージ(.ppg)ファイルで実行(Eosのコマンド)]]をご覧下さい。<br>
 
<br>
 
<br>
今回は元々一つだった[[pione定義書]]を分割して、また一つにしてパッケージ化しているので一見有用性がないように見えます。しかし、分割したファイルの内の一つを別の処理に差し替えたい場合、共通の処理として再利用したい場合などには非常に有効な手段といえます。<br>
+
今回は元々一つだった[[PIONE定義書]]を分割して、また一つにしてパッケージ化しているのであまり実感が沸かないかもしれません。しかし、分割されているファイルの内の一つを別の処理に差し替えたい場合、共通の処理として再利用したい場合などには非常に有効な手段といえます。また分割することにより各ファイルが短くなって見やすくなりメンテナンス性も向上します。<br>
 
<br>
 
<br>
  
行213: 行213:
 
<table>
 
<table>
 
<tr>
 
<tr>
<td>1VOM.mrc</td>
+
<td>[[:Media:1VOM.mrc|1VOM.mrc]]</td>
 
<td></td>
 
<td></td>
<td>1VOM-N.mrc</td>
+
<td>[[:Media:Input-1VOM-N.mrc|1VOM-N.mrc]]</td>
 
<td></td>
 
<td></td>
 
</tr>
 
</tr>
行282: 行282:
  
 
=== 作成例5(継承) ===
 
=== 作成例5(継承) ===
 ここまでではbuildを使って1つのパッケージを作る例を示しました。次はaddを使ったパッケージの継承を行ってみましょう。今回はまた[[#作成例4(一部処理だけ差し替える)]]と同様の機能を[[#作成例3(ファイルをまとめる)]]を継承元(Parent)として作ってみます。<br>
+
 ここまででは[[pione package build]]を使って1つのパッケージを作る例を示しました。次はaddを使ったパッケージの継承を行ってみましょう。今回はまた[[#作成例4(一部処理だけ差し替える)]]と同様の機能を[[#作成例3(ファイルをまとめる)]]を継承元(Parent)として作ってみます。<br>
 
<br>
 
<br>
  
 
==== Parentの登録 ====
 
==== Parentの登録 ====
 
まず、[[#作成例3(ファイルをまとめる)]]を継承元(Parent)として下記のコマンドにて登録します。<br>
 
まず、[[#作成例3(ファイルをまとめる)]]を継承元(Parent)として下記のコマンドにて登録します。<br>
.jsonファイルがない場合は予めbuildで作成します。<br>
+
.jsonファイルがない場合は予め[[pione package build]]で作成します。<br>
 
<pre>
 
<pre>
 
/PIONE$ pione package build Package3/
 
/PIONE$ pione package build Package3/
行295: 行295:
 
<br>
 
<br>
  
.jsonファイルがあることを確認して次にaddでParent登録します。<br>
+
.jsonファイルがあることを確認して次に[[pione package add]]でParent登録します。<br>
 
<pre>
 
<pre>
 
/PIONE$ pione package add Package3/
 
/PIONE$ pione package add Package3/
行319: 行319:
 
今回はInitial2.pioneを[[#作成例4(一部処理だけ差し替える)]]で作っているので、コピーまたはリンクで用意できます。<br>
 
今回はInitial2.pioneを[[#作成例4(一部処理だけ差し替える)]]で作っているので、コピーまたはリンクで用意できます。<br>
 
<pre>
 
<pre>
/PIONE$ cd Package5/
+
/PIONE$ cp Package4/Initial2.pione Package5/
/Package5$ ln -s ../Package4/Initial2.pione .
+
 
</pre>
 
</pre>
 
<br>
 
<br>
行372: 行371:
  
 
==== Parentの登録破棄 ====
 
==== Parentの登録破棄 ====
Parentの登録を破棄するときは下記のコマンドを入力します。<br>
+
Parentの登録を破棄するときは[[pione package remove]]を使用します。<br>
 
<pre>
 
<pre>
 
$ pione package remove "CenterGet" --editor "Kinoshita" --tag "v0.0.4"
 
$ pione package remove "CenterGet" --editor "Kinoshita" --tag "v0.0.4"
行380: 行379:
  
 
==== 不要キャッシュの削除 ====
 
==== 不要キャッシュの削除 ====
下記のコマンドで[[PIONE]]を実行させる際に蓄積されている不要なキャッシュデータを削除します。<br>
+
[[pione clean]]で[[PIONE]]を実行させる際に蓄積されている不要なキャッシュデータを削除します。<br>
 
<pre>
 
<pre>
 
$ pione clean
 
$ pione clean
行397: 行396:
 
info: Package "CenterGet"(editor: Kinoshita, tag: v0.2.0) has been added to package database.
 
info: Package "CenterGet"(editor: Kinoshita, tag: v0.2.0) has been added to package database.
 
</pre>
 
</pre>
なお、[[#作成例3(ファイルをまとめる)]]も登録されている必要がありますが、[[作成例5(継承)]]で登録済みです。<br>
+
なお、[[#作成例3(ファイルをまとめる)]]も登録されている必要がありますが、[[#作成例5(継承)]]で登録済みです。<br>
 
<br>
 
<br>
  
行403: 行402:
 
継承側(Child)の追加分のみを記述します。<br>
 
継承側(Child)の追加分のみを記述します。<br>
  
Annotation3.0.pione<br>
+
Annotation3.pione<br>
 
<pre>
 
<pre>
 
.@ PackageName :: "CenterGet"
 
.@ PackageName :: "CenterGet"
 
.@ Editor :: "Kinoshita"
 
.@ Editor :: "Kinoshita"
.@ Tag :: "v0.3.0"
+
.@ Tag :: "v0.3.1"
 
.@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.2.0")
 
.@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.2.0")
  
 
</pre>
 
</pre>
  
今回はFinalのルールを3方向の平面の画像を出力するように変更してみます。<br>
+
今回はFinalのルールを投影画像が設定した方向(デフォルトでは3方向)分出力されるように変更してみます。<br>
 +
Param.pione<br>
 +
<pre>
 +
Basic Param
 +
$Mode := 3
 +
End
 +
</pre>
 +
<br>
 +
 
 
Final3.pione<br>
 
Final3.pione<br>
 
<pre>
 
<pre>
行420: 行427:
 
output '*.tiff'.all
 
output '*.tiff'.all
 
Action
 
Action
for (( num = 0; num <= 2; num++ )) ; \
+
for (( num = 0; num < {$Mode}; num++ )) ;
 
do \
 
do \
 
mrcImageProjection -i {$I[1]} -o {$I[1]}.2d -m ${num}; \
 
mrcImageProjection -i {$I[1]} -o {$I[1]}.2d -m ${num}; \
行429: 行436:
 
End
 
End
 
</pre>
 
</pre>
機能を満たすためにモードが多くなったので、for文にしています。<br>
+
機能を満たすための処理が多くなったので、for文にしています。<br>
 
<br>
 
<br>
  
 
==== 実行結果 ====
 
==== 実行結果 ====
では、実行してみます。<br>
+
では、実行してみます。(パラメータはデフォルトを使用)<br>
 
<pre>
 
<pre>
 
/PIONE$ pione package build Package6/
 
/PIONE$ pione package build Package6/
info: update the package info file: local:/Users/teppeikinoshita/Eos/tutorial/SampleCode/PIONE/Package6/pione-package.json
+
info: update the package info file: local:/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.
+
info: Package local:/Eos/tutorial/SampleCode/PIONE/CenterGet(Kinoshita)+v0.3.1.ppg has been built successfully.
/PIONE$ pione-client CenterGet\(Kinoshita\)+v0.3.0.ppg -i ../../SampleData/ -b CenterGet
+
/PIONE$ pione-client CenterGet\(Kinoshita\)+v0.3.1.ppg -i ../../SampleData/ -b CenterGet
   ==> &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
+
   ==> &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
     --> Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
+
     --> Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
       --> Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
+
       --> Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
  
 
-中略-
 
-中略-
行448: 行455:
 
       <-- Distribution: &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{})
 
       <-- Distribution: &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{})
 
     <-- Rule Application: &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,...],{})
+
       <-- Distribution: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
 
   <== &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{})
 
   <== &CenterGet-2:Main([1VOM-N.mrc,1VOM.mrc],{})
     <-- Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
+
     <-- Rule Application: &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
   <== &CenterGet-2:Root([.DS_Store,1VOM-N.FNC,1VOM-N.mrc,...],{})
+
   <== &CenterGet-2:Root([.DS_Store,1VOM-N.2d,1VOM-N.FNC,...],{})
 
/PIONE$  
 
/PIONE$  
 
</pre>
 
</pre>
 
<br>
 
<br>
 +
 +
今回の入力ファイル<br>
 +
<table>
 +
<tr>
 +
<td>[[:Media:1VOM.mrc|1VOM.mrc]]</td>
 +
<td></td>
 +
<td></td>
 +
<td>[[:Media:Input-1VOM-N.mrc|1VOM-N.mrc]]</td>
 +
<td></td>
 +
<td></td>
 +
</tr>
 +
<tr>
 +
<td>[[画像:Input-PIONE-Package6-1.png]]</td>
 +
<td>[[画像:Input1-PIONE-Package6-1.png]]</td>
 +
<td>[[画像:Input2-PIONE-Package6-1.png]]</td>
 +
<td>[[画像:Input-PIONE-Package6-2.png]]</td>
 +
<td>[[画像:Input1-PIONE-Package6-2.png]]</td>
 +
<td>[[画像:Input2-PIONE-Package6-2.png]]</td>
 +
</tr>
 +
<tr>
 +
<td>xy平面</td>
 +
<td>yz平面</td>
 +
<td>zx平面</td>
 +
<td>xy平面</td>
 +
<td>yz平面</td>
 +
<td>zx平面</td>
 +
</tr>
 +
</table>
  
 
今回の出力ファイル<br>
 
今回の出力ファイル<br>
行483: 行518:
 
</tr>
 
</tr>
 
</table>
 
</table>
 +
<br>
 +
入力ファイル(.mrc)と出力ファイル(.roi)の投影画像が3方向分出力され、[[#作成例5(継承)]]をさらに継承することができました。<br>
 +
<br>
 +
 +
=== 作成例7(シナリオ) ===
 +
[[PIONE]]にはシナリオという機能があります。これは[[PIONE定義書]]や[[パッケージ]]に対して、使用する入力ファイルやパラメータを決めて常にその内容で実行することができるデモ機能です。また、出力ファイルを設定することにより、作成されたファイルが正しいかをチェックすることもできます。<br>
 +
<br>
 +
 +
今回は[[#作成例6(継承2)]]についてのシナリオを作成してみます。シナリオを含めたパッケージも同様にビルドを行うだけで作成できるので、継承は必須ではありません。しかし、今回は手間を省くために[[#作成例6(継承2)]]のパッケージを再利用して、必要な分だけ追加して継承を行います。予め[[pione package add]]で登録しておきます。<br>
 +
<pre>
 +
/PIONE$ pione package add Package6/
 +
info: Package "CenterGet"(editor: Kinoshita, tag: v0.3.1) has been added to package database.
 +
</pre>
 +
<br>
 +
 +
==== [[シナリオ]]作成 ====
 +
[[シナリオ]]を作成するためには[[シナリオ]]用のディレクトリを作成し、その中に'''Scenario.pione'''ファイルを作成し、これと'''同じディレクトリ内'''に'''input'''ディレクトリ、'''output'''ディレクトリを作成します。この通りの名前でなければ[[シナリオ]]と判断されませんので、注意して下さい。<br>
 +
<br>
 +
 +
では、[[シナリオ]]を作成してみましょう。今回はディレクトリ"1VOM-m1"内に作成します。<br>
 +
<pre>
 +
/PIONE$ mkdir Package7/1VOM-m1/
 +
</pre>
 +
<br>
 +
 +
まずはScenario.pioneにシナリオ名とパラメータの設定を記載します。<br>
 +
<pre>
 +
.@ ScenarioName :: "i:1VOM m:1"
 +
.@ ParamSet :: "{Mode:1}"
 +
</pre>
 +
<br>
 +
 +
次にinputディレクトリにこのシナリオで使用する入力ファイルを必要な分用意します。今回は下記のデータを使用します。<br>
 +
<br>
 +
 +
今回の入力ファイル<br>
 +
<table>
 +
<tr>
 +
<td>[[:Media:1VOM.mrc|1VOM.mrc]]</td>
 +
</tr>
 +
<tr>
 +
<td>[[画像:Input-PIONE-Package6-1.png]]</td>
 +
</tr>
 +
<tr>
 +
<td>xy平面</td>
 +
</tr>
 +
</table>
 +
 +
そしてoutputディレクトリにはこのシナリオでの作成されると想定の出力ファイルを用意します。出力ファイルのチェックが必要ない場合はこの手順は不要です。今回は下記のデータを想定して格納しておきます。<br>
 +
<table>
 +
<tr>
 +
<td>[[:Media:Outdata-PIONE-Package7.roi|1VOM.roi]]</td>
 +
</tr>
 +
<tr>
 +
<td>[[画像:Outdata-PIONE-Package7.png]]</td>
 +
</tr>
 +
<tr>
 +
<td>xy平面</td>
 +
</tr>
 +
</table>
 +
<br>
 +
 +
アノテーションは下記のようにしています。(/Package7/Annotation4.pione)<br>
 +
<pre>
 +
.@ PackageName :: "CenterGet"
 +
.@ Editor :: "Kinoshita"
 +
.@ Tag :: "v0.4.0"
 +
.@ Parent :: &CenterGet.editor("Kinoshita").tag("v0.3.1")
 +
</pre>
 +
<br>
 +
 +
==== [[シナリオ]]実行 ====
 +
まずはビルドします。<br>
 +
<pre>
 +
/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.
 +
</pre>
 +
[[JSON]]ファイルがpione-package.json以外に、シナリオ毎にpione-scenario.jsonとして作成されます。<br>
 +
<br>
 +
 +
実行してみます。[[pione-client]]にオプション--rehearseでシナリオ名を指定して実行します。<br>
 +
<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>
 +
出力ファイルが一致した場合は最後にRehearsal Result: Succeededと出力されます。<br>
 +
*出力ファイルに差異がある場合: - 1VOM.roi is different from expected result.
 +
*出力ファイルが作成されなかった場合: - 1VOM.roi doesn't exist.
 +
<br>

2015年1月16日 (金) 01:36時点における最新版

 ここでは、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
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(継承)

 ここまででは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
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を利用すると、変更したい箇所のみのルールを記述するだけで元々のルールを上書きし、新しいジョブを実現することができます。

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 cleanPIONEを実行させる際に蓄積されている不要なキャッシュデータを削除します。

$ 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
Input-PIONE-Package6-1.png Input1-PIONE-Package6-1.png Input2-PIONE-Package6-1.png Input-PIONE-Package6-2.png Input1-PIONE-Package6-2.png Input2-PIONE-Package6-2.png
xy平面 yz平面 zx平面 xy平面 yz平面 zx平面

今回の出力ファイル

1VOM.roi 1VOM-N.roi
Outdata-PIONE-Package6-1.png Outdata1-PIONE-Package6-1.png Outdata2-PIONE-Package6-1.png Outdata-PIONE-Package6-2.png Outdata1-PIONE-Package6-2.png Outdata2-PIONE-Package6-2.png
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
Input-PIONE-Package6-1.png
xy平面

そしてoutputディレクトリにはこのシナリオでの作成されると想定の出力ファイルを用意します。出力ファイルのチェックが必要ない場合はこの手順は不要です。今回は下記のデータを想定して格納しておきます。

1VOM.roi
Outdata-PIONE-Package7.png
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.

JSONファイルがpione-package.json以外に、シナリオ毎にpione-scenario.jsonとして作成されます。

実行してみます。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.