RELION の classification で、クラスの割合を抽出する

RELION の 2D / 3D classification で、iteration ごとに各クラスの割合がどう変化したかをプロットしたいと言われたので、スクリプトを作った。

for i in `seq 0 20`; do 
 j=`printf %03d $i`;
 echo -n $j" ";
 relion_star_printtable run_it${j}_model.star data_model_classes _rlnClassDistribution | tr '\n' ' ';
 echo;
done > dist.dat

relion_star_printtable がクラスごとに改行してしまうので、tr を使って置換するなど、ちょっとダサいことになっている。

こうすると、run_it_0NN_model.star (NN = 00 .. 20) から、割合を切り出して行に並べたデータファイル dist.dat

000 0.200000 0.200000 0.200000 0.200000 0.200000
001 0.200000 0.200000 0.200000 0.200000 0.200000
002 0.199695 0.201143 0.198778 0.200882 0.199502
003 0.214579 0.171917 0.207016 0.180553 0.225935
004 0.228429 0.149543 0.176681 0.134442 0.310905
005 0.105184 0.321839 0.107021 0.308757 0.157199 
(後略)

ができるので、gnuplot

plot for [i=2:6] 'dist.dat' using 1:i with line title "Class ".(i-1)

などとしてプロットする。for を使うには、比較的新しいバージョンが必要。
4.6 ではできたが、4.2 ではダメだった。

なお、ファイル数 (20) やクラス数 (5) を指定しなくて済むようにするのを、読者の練習課題とする。