「参照付投影角度決定」の版間の差分

提供: Eospedia
移動: 案内検索
(投影画像セットの作成:.3dinfo.3dlst)
 
(2人の利用者による、間の4版が非表示)
行14: 行14:
 
 最も利用されるのは、[[相関関数]]を用いた方法です。この相関関数の前処理等を行い、ノイズによる影響を抑えることで、よりよい相関を得るように工夫が必要です。[[Eos]]では、[[mrcImageAutoRotationCorrelation]]を使います。このプログラムでは、面内回転を考慮し、相関関数(通常のもの、位相相関、強度重み付き位相相関)により、もっともらしい角度を推定します。
 
 最も利用されるのは、[[相関関数]]を用いた方法です。この相関関数の前処理等を行い、ノイズによる影響を抑えることで、よりよい相関を得るように工夫が必要です。[[Eos]]では、[[mrcImageAutoRotationCorrelation]]を使います。このプログラムでは、面内回転を考慮し、相関関数(通常のもの、位相相関、強度重み付き位相相関)により、もっともらしい角度を推定します。
  
 この[[mrcImageAutoRotationCorrelation]]は、ノイズがない場合で、適切な参照像であれば、当然、ほとんど成功します。そこで、適切な前処理が必要です。例えば、[[mrcImageSmoothing]]や[[mrcIageLowPassFilter]]などを使って、ノイズをとります。
+
 この[[mrcImageAutoRotationCorrelation]]は、ノイズがない場合で、適切な参照像であれば、当然、ほとんど成功します。そこで、適切な前処理が必要です。例えば、[[mrcImageSmoothing]]や[[mrcImageLowPassFilter]]などを使って、ノイズをとります。
  
 
 また、相関関数そのものも検討が必要です。今回の場合は、重み付き位相相関(強度のルートの重みをかけた位相相関法)を使っています。
 
 また、相関関数そのものも検討が必要です。今回の場合は、重み付き位相相関(強度のルートの重みをかけた位相相関法)を使っています。
行68: 行68:
  
 
=== 参照像の準備 ===
 
=== 参照像の準備 ===
 参照像を準備します。ここでは、PDFファイルから作った3次元像を準備しています。下記の手順で実行できます。
+
 参照像を準備します。ここでは、PDBファイルから作った3次元像を準備しています。下記の手順で実行できます。
  
 
  $ make Initial
 
  $ make Initial
  
参照像となるPDFファイルを変更する場合には、Makefile中の下記の部分を変更します。
+
参照像となるPDBファイルを変更する場合には、Makefile中の下記の部分を変更します。
 
<pre>
 
<pre>
 
REFSOURCE=121p-shift
 
REFSOURCE=121p-shift
行81: 行81:
 
</pre>
 
</pre>
  
REFSOURCEは、参照するPDBファイルの名前です。このMakefileの場合には、原点が分子の中心付近となることが期待されています。[[pdbInfo]]により、PDFファイルの情報を取得できますので、重心が原点となるように[[pdbMove]]を使って移動させることができます。121p-shift.pdbは、121p.pdbというH-rasの原子モデルを上記の手順で移動させたものです。
+
REFSOURCEは、参照するPDBファイルの名前です。このMakefileの場合には、原点が分子の中心付近となることが期待されています。[[pdbInfo]]により、PDBファイルの情報を取得できますので、重心が原点となるように[[pdbMove]]を使って移動させることができます。121p-shift.pdbは、121p.pdbというH-rasの原子モデルを上記の手順で移動させたものです。
  
 
DELTAは画像の刻み幅です。利用するROI画像の刻み幅にあわせて、作成する必要があります。後に変更することも可能ですが、ここで合わせておくのが簡単です。
 
DELTAは画像の刻み幅です。利用するROI画像の刻み幅にあわせて、作成する必要があります。後に変更することも可能ですが、ここで合わせておくのが簡単です。
行87: 行87:
 
SIZE_X|Y|Zは画像のサイズを規定しています。これも、利用するROI画像のサイズと関連しています。後に述べる[[mrcImagePad]]によりPADしたファイルと対応する必要があります。
 
SIZE_X|Y|Zは画像のサイズを規定しています。これも、利用するROI画像のサイズと関連しています。後に述べる[[mrcImagePad]]によりPADしたファイルと対応する必要があります。
  
形を定義せず、球や楕円体で計算をスタートすることも最近は多くなりました。これは、参照像の影響を最小限に抑えるためです。球で始める場合には、[[mrcImageSphere]]を利用することで参照像を造ることができます。[[mrcImageGaussianSphere]]を使うと、楕円体のガウス球を設定することができます。[[mrcImageGaussianDisc]]では、楕円体のガウス球の強度を一定にすることができます。
+
形を定義せず、球や楕円体で計算をスタートすることも最近は多くなりました。これは、参照像の影響を最小限に抑えるためです。球で始める場合には、[[mrcImageSphere]]を利用することで参照像を造ることができます。[[mrcImageGaussSphere]]を使うと、楕円体のガウス球を設定することができます。[[mrcImageGaussDisc]]では、楕円体のガウス球の強度を一定にすることができます。
  
  
行206: 行206:
 
<pre>
 
<pre>
 
.corinfo.3dinfo:
 
.corinfo.3dinfo:
awk '/Cor/ { printf("%15.6f %s %s %s %s %s %s %s %s¥n", $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/.pad/.fit/ > $*.3dinfolst
+
awk '/Cor/ { printf("%15.6f %s %s %s %s %s %s %s %s\n", $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12)}' $*.corinfo | sort -r | sed -e s/.pad/.fit/ > $*.3dinfolst
 
head -n 1 $*.3dinfolst | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' > $*.3dinfo
 
head -n 1 $*.3dinfolst | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' > $*.3dinfo
 
##  ##18 -> ##7  ##
 
##  ##18 -> ##7  ##
行245: 行245:
  
 
このようにしてできあがった、$(TARGET).3dlstselectを $(TARGET).3dlstと入れ替えれば、三次元再構成が可能となります。
 
このようにしてできあがった、$(TARGET).3dlstselectを $(TARGET).3dlstと入れ替えれば、三次元再構成が可能となります。
 
==== 三次元再構成像の作成: .3dlst.3d ====
 
 
  
 
== 演習に利用したMakefile ==
 
== 演習に利用したMakefile ==

2014年4月4日 (金) 01:35時点における最新版

 3次元再構成を行う中で、参照像が有る場合には、その参照像から投影像を予測し、それと向きを決定して三次元像を決定することができます。参照付投影角度の決定のためには、参照像が必要です。

概要

手順を下記に述べます。

1.参照像(3次元)を準備する

2.参照像(2次元)を3次元像から参照投影像として作成する。それぞれの参照投影像は角度が決定されています。

3.切り出した2次元投影画像と2で作成した参照投影像とを比較して、一番似ている参照投影像を選択し、それぞれの2次元画像の投影角として推定します。その際、参照画像に一番適合した位置、回転方向に投影像を回転及び移動し、3次元再構成のための投影像のセットを手に入れいます。

4.推定した投影角を用いて、3次元再構成のための投影像のセットから3次元再構成を行います。

似ている画像の決定方法

 最も利用されるのは、相関関数を用いた方法です。この相関関数の前処理等を行い、ノイズによる影響を抑えることで、よりよい相関を得るように工夫が必要です。Eosでは、mrcImageAutoRotationCorrelationを使います。このプログラムでは、面内回転を考慮し、相関関数(通常のもの、位相相関、強度重み付き位相相関)により、もっともらしい角度を推定します。

 このmrcImageAutoRotationCorrelationは、ノイズがない場合で、適切な参照像であれば、当然、ほとんど成功します。そこで、適切な前処理が必要です。例えば、mrcImageSmoothingmrcImageLowPassFilterなどを使って、ノイズをとります。

 また、相関関数そのものも検討が必要です。今回の場合は、重み付き位相相関(強度のルートの重みをかけた位相相関法)を使っています。

具体的な演習作業

 演習では、Eosをつかった3次元再構成法を示しています。まず、ファイル:WorkshopData2.tar.gz 演習用データをダウンロードして、解凍して下さい。解凍のしかたは次の通りです。

$ tar xvzf WorkshopData2.tar.gz

これを実行すると、EosForData2というディレクトリができあがります。いくつかのMakefileが入っています。

$ cd EosForData2/SingleParticlesWithRef

として、ディレクトリを移動します。このディレクトリで以下の順序で実行していきます。

$ make 

とうつと、

----- Makefile for Single Particle with Reference
1. Prepare files from EM images, which has a suffix of roi 
2. Prepare an initial model as initial.3d 
3. make First
4. make All
If you want to repeat refinement again, 
  1. make Again
  2. make All

--- If you want to create an initail model from PDB ---
 make InitialModel

--- If you want to create an test from the initial model ---
 make TestData

として実行方法が出力されます。これによれば、

$ make First
$ make All

として、1回目のターンを計算できます。

$ make Again
$ make All

として、複数回のターンを計算することになります。

$ for i in `seq 1 5`; do make Again; make All; done

として複数回の計算を行います。以下にその詳細を示します。

参照像の準備

 参照像を準備します。ここでは、PDBファイルから作った3次元像を準備しています。下記の手順で実行できます。

$ make Initial

参照像となるPDBファイルを変更する場合には、Makefile中の下記の部分を変更します。

REFSOURCE=121p-shift
DELTA=2.5
SIZE_X=64
SIZE_Y=64
SIZE_Z=64

REFSOURCEは、参照するPDBファイルの名前です。このMakefileの場合には、原点が分子の中心付近となることが期待されています。pdbInfoにより、PDBファイルの情報を取得できますので、重心が原点となるようにpdbMoveを使って移動させることができます。121p-shift.pdbは、121p.pdbというH-rasの原子モデルを上記の手順で移動させたものです。

DELTAは画像の刻み幅です。利用するROI画像の刻み幅にあわせて、作成する必要があります。後に変更することも可能ですが、ここで合わせておくのが簡単です。

SIZE_X|Y|Zは画像のサイズを規定しています。これも、利用するROI画像のサイズと関連しています。後に述べるmrcImagePadによりPADしたファイルと対応する必要があります。

形を定義せず、球や楕円体で計算をスタートすることも最近は多くなりました。これは、参照像の影響を最小限に抑えるためです。球で始める場合には、mrcImageSphereを利用することで参照像を造ることができます。mrcImageGaussSphereを使うと、楕円体のガウス球を設定することができます。mrcImageGaussDiscでは、楕円体のガウス球の強度を一定にすることができます。


ROIファイルの準備

 画像からROIファイルを切り出し、準備します。Display2を利用して下さい。

 今回は、うまく動いているかどうかを確認するために使っているテストデータを利用します。

$ make TestData

として新たに作り出すことができます。今回はそれを利用します。

$ make TestDataNoise

としてノイズを加えたものを作ることができます。

SNRATIO=3

の行の値を変更するとノイズのレベルを変更することができます。これはテストの時によく用います。 ノイズレベルを変更し、どのくらいのノイズまで耐えられるアルゴリズムかをテストしています。

提供したデータは上記の両者を併せたもので、ノイズをいれたものと入れていないものを混ぜられています。

三次元再構成の流れ(make Allで行われること)

下記に、基本的な単粒子解析の流れを示します。

参照投影2次元の作成:.ref3d -> .ref2d

参照画像の設定が計算速度と再構成の精度を決めます。 現時点では、オイラー角がYOYSですので、Y-X-Zの順に3次元画像を回転させることになります。 0−359までの30度刻みになっています。

#
# Search Area for 3D
#
ROTMODE=YOYS
# Rot1: Y軸周りの回転を設定します。
ROT1MIN=0
ROT1MAX=359
ROT1D=30
nRot1=12
# Rot2: X軸周りの回転を設定します。
ROT2MIN=0
ROT2MAX=359
ROT2D=30
nRot2=12
# Rot3: Z軸周りの回転を設定します。
#        この回転は、AutoRotationCorrelationでも可能です。
#        メモリがどのくらいあるかで決めることになります。
ROT3MIN=0
ROT3MAX=0
ROT3D=30
nRot3=1

投影画像の前処理:.roi -> .pad

 切り出した*.roiファイルから、前処理をして、*.padファイルへと変換します。今回のものは、WindowingPaddingを実施しています。これ以外に、平滑化周波数フィルタを処理する場合もあります。マスキングを実施する場合もあります。

 また、参照像との大きさを合わせることもこの部分で処理します。今回の場合には、PDBファイルを参照像とするため

PAD_W=64
PAD_H=64

の値と、

SIZE_X=64
SIZE_Y=64

が同じになるようにして下さい。

 クラスター解析を行った後の平均像から三次元再構成を行う場合もよくあります。その場合に、このMakefileを利用する場合は、 .roi -> .padではなく、.avg -> .padとして準備することもできます。

投影画像の参照投影2次元画像との比較:.pad.corinfo

 参照像から投影した2次元画像と投影電子顕微鏡画像を比較し、その相関値、位置合わせした投影電子顕微鏡画像などを出力します。用いるコマンドは、mrcImageAutoRotationCorrelationです。

設定するべき値は以下のものになります。


# For 2D 
STEP=12
ROTMIN=0
ROTMAX=359
nROT=`echo "" | awk 'BEGIN {printf 360 / $(STEP)}'`

となっています。

面内回転として、指定する角度です。

STEP=12

この場合には、12度毎に回転させます。

また、探索範囲を指定するのは、

ROTMIN=0
ROTMAX=359

です。切り出しの際に向きがある程度決定しているときには範囲を絞ることができます。

投影画像の投影角の推定:.corinfo.3dinfo

画像の類似度が、*.corinfoの中にリストされていますので、その中から最適値と考える値を*.3dinfoとして取り出してきます。また、この中で、投影角等を決定し、三次元再構成で必要となるファイルとして切り出してきます。

.corinfo.3dinfo:
	awk '/Cor/ { print $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/.pad/.fit/ > $*.3dinfolst
	head -n 1 $*.3dinfolst | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' > $*.3dinfo
##   ##18 -> ##7  ##

この部分少しバグがあるバージョンをお渡ししてしまいました。sortコマンドで、相関値の桁が違っている場合の取り扱いで問題が生じます。

.corinfo.3dinfo:
	awk '/Cor/ { printf("%15.6f %s %s %s %s %s %s %s %s\n", $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12)}' $*.corinfo | sort -r | sed -e s/.pad/.fit/ > $*.3dinfolst
	head -n 1 $*.3dinfolst | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' > $*.3dinfo
##   ##18 -> ##7  ##

と変更してして下さい。指定した相関値に合わせて、一番よい相関値を出している参照像の投影角を推定投影角と推定するようにしています。このcorinfoのファイルを使って、もう少し精度のよい投影角の推定を行うこともできます。相関値の高い付近の値を使って、ガウス関数で近似すれば、探索した角度刻みより細かく推定することもできます。

投影画像セットの作成:.3dinfo.3dlst

ここからは、全ての3dinfoから3dlstを作ります。

一番シンプルなのは下記にある方法です。

.3dinfo.3dlst:
	cat $*.3dinfo >> $(TARGET).3dlst	

この場合には、全てを利用します。実際には、相関値の良いものだけを選択したり、移動距離の制限をかけたりします。また、三次元再構成に利用する像をroiを移動したものとするか、fitを移動したものとするかを変更したり、選択したりすることもできます。

下記はそのようにして、選択した画像のリストをつくった例です。

#####Select Particles#####

.corinfo.corinfo2:
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e 's/.roi/.fit/' > $*.corinfolst
	head -n 1 $*.corinfolst | awk '{if($(PAD_W)-$$8>=$$8&&$(PAD_H)-$$9>=$$9) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,0+$$8,0+$$9;else if($(PAD_W)-$$8>=$$8) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,0+$$8,$(PAD_H)-$$9;else if($(PAD_H)-$$9>=$$9) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$(PAD_W)-$$8,0+$$9;else print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$(PAD_W)-$$8,$(PAD_H)-$$9}' > $*.corinfo2

.corinfo2.parcorinfolst:
	cat $*.corinfo2 >> $(TARGET).parcorinfolst

CorinfoSort::
	awk '{ print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9}' $(TARGET).parcorinfolst | sort -r > $(TARGET).parcorinfolstsort

SelectParticle::
	awk '$$1 >= $(COR_THRESHOLD) || $$9 <= $(Y_SHIFT_THRESHOLD){print $$2,$$3,$$4,$$5,$$6,$$1}' $(TARGET).parcorinfolstsort > $(TARGET).3dlstselect

このようにしてできあがった、$(TARGET).3dlstselectを $(TARGET).3dlstと入れ替えれば、三次元再構成が可能となります。

演習に利用したMakefile

下記に利用したMakefileを示します。

#
# Eos for 3D reconstrucion from 2D rois using 3D initail reference 
#

.SUFFIXES: .3d .ref3d .ref2d .pad .padtmp .mask .maskfit .fit .fitmask .roi .corinfo .3dinfo .3dlst .3d .3dsm .3dsmCenter .ds6 .3dsmds6 .corinfo2 .corinfolst .cormap .parcorinfolst .parcorinfolstsort .gnuplotcorinfolst .3dlstselect .monlst .mon

SHELL=/bin/bash

-include ROIs
-include CORINFOs
-include PADs
-include 3DINFOs
-include 3DLIST
-include CORINFO2s

#
# Initial Reference Model 
INITIAL=initial
# Target structure name 
TARGET=all

# Simultaneous Jobs for AutoRotaionCorrelation
JOP_NUM=-j 3

#
# Search Area for 3D
#
ROTMODE=YOYS
# Rot1
ROT1MIN=0
ROT1MAX=359
ROT1D=30
nRot1=12
#
ROT2MIN=0
ROT2MAX=359
ROT2D=30
nRot2=12
# Rot3
ROT3MIN=0
ROT3MAX=0
ROT3D=30
nRot3=1
# For 2D 
STEP=12
ROTMIN=0
ROTMAX=359
nROT=`echo "" | awk 'BEGIN {printf 360 / $(STEP)}'`

# Seletion Step 
COR_THRESHOLD=0.4
Y_SHIFT_THRESHOLD=20

# Pad size for 2D 
PAD_W=64
PAD_H=64

###
### Initial model from PDB
###
REFSOURCE=121p-shift
DELTA=2.5
SIZE_X=64
SIZE_Y=64
SIZE_Z=64
START_X=`awk 'BEGIN { print -1*$(DELTA)*$(SIZE_X)/2}'`
START_Y=`awk 'BEGIN { print -1*$(DELTA)*$(SIZE_Y)/2}'`
START_Z=`awk 'BEGIN { print -1*$(DELTA)*$(SIZE_Z)/2}'`
SNRATIO=3
###############################

Help::
	@echo "----- Makefile for Single Particle with Reference"
	@echo "1. Prepare files from EM images, which has a suffix of roi "
	@echo "2. Prepare an initial model as $(INITIAL).3d "
	@echo "3. make First"
	@echo "4. make All"
	@echo "If you want to repeat refinement again, "
	@echo "  1. make Again"
	@echo "  2. make All"
	@echo ""
	@echo "--- If you want to create an initail model from PDB ---"
	@echo " make InitialModel"
	@echo ""
	@echo "--- If you want to create an test from the initial model ---"
	@echo " make TestData"

pad:$(ROIs:.roi=.pad)
corinfo:$(PADs:.pad=.corinfo)
3dinfo:$(CORINFOs:.corinfo=.3dinfo)
fit:$(ROIs:.roi=.fit)
3dlst:$(3DINFOs:.3dinfo=.3dlst)
3d:$(3DLIST:.3dlst=.3d)
corinfo2:$(CORINFOs:.corinfo=.corinfo2)
parcorinfolst:$(CORINFO2s:.corinfo2=.parcorinfolst)

#
#
#
InitialModel::
	pdb2mrc -i $(REFSOURCE).pdb -o $(INITIAL).3d -nx $(SIZE_X) -ny $(SIZE_Y) -nz $(SIZE_Z) -Sx $(START_X) -Sy $(START_Y) -Sz $(START_Z) -dx $(DELTA) -dy $(DELTA) -dz $(DELTA) -m 1

TestData::
	@for (( rot1 = $(ROT1MIN); rot1 <= $(ROT1MAX); rot1 += $(ROT1D)*2 )) \
	do \
	for (( rot2 = $(ROT2MIN); rot2 <= $(ROT2MAX); rot2 += $(ROT2D)*2 )) \
	do \
	for (( rot3 = $(ROT3MIN); rot3 <= $(ROT3MAX); rot3 += $(ROT3D)*2 )) \
	do \
		echo $$rot1, $$rot2, $$rot3; \
		mrc3Dto2D -i $(INITIAL).3d -o $(REFSOURCE)-$$rot1-$$rot2-$$rot3.roi \
				  -InterpolationMode 2 -EulerMode $(ROTMODE) \
				  -Rot1 $$rot1 $$rot1 1 \
				  -Rot2 $$rot2 $$rot2 1 \
				  -Rot3 $$rot3 $$rot3 1 ; \
	done \
	done \
	done

TestDataNoise::
	@for (( rot1 = $(ROT1MIN); rot1 <= $(ROT1MAX); rot1 += $(ROT1D)*2 )) \
	do \
	for (( rot2 = $(ROT2MIN); rot2 <= $(ROT2MAX); rot2 += $(ROT2D)*2 )) \
	do \
	for (( rot3 = $(ROT3MIN); rot3 <= $(ROT3MAX); rot3 += $(ROT3D)*2 )) \
	do \
		echo $$rot1, $$rot2, $$rot3; \
		name="$(REFSOURCE)-noise-$$rot1-$$rot2-$$rot3.roi"; \
		mrc3Dto2D -i $(INITIAL).3d -o $$name.noNoise \
				  -InterpolationMode 2 -EulerMode $(ROTMODE) \
				  -Rot1 $$rot1 $$rot1 1 \
				  -Rot2 $$rot2 $$rot2 1 \
				  -Rot3 $$rot3 $$rot3 1 ; \
		mrcImageNoiseAdd -i $$name.noNoise -o $$name -SN $(SNRATIO) ; \
		rm $$name.noNoise ; \
	done \
	done \
	done

##############
ROIs::
	touch ROIs
	echo "ROIs=\\" > ROIs
	#find -name "*.roi" -type f | sed s/..// | xargs ls -1 | sed s/roi/roi\\\\/ >> ROIs
	ls -1 *.roi |  sed s/roi/roi\\\\/ >> ROIs
	echo "" >> ROIs

CORINFOs::
	touch CORINFOs
	echo "CORINFOs=\\" > CORINFOs
	#find -name "*.corinfo" -type f | sed s/..// | xargs ls -1 | sed s/corinfo/corinfo\\\\/ >> CORINFOs
	ls -1 *.corinfo |  sed s/corinfo/corinfo\\\\/ >> CORINFOs
	echo "" >> CORINFOs

PADs::
	touch PADs
	echo "PADs=\\" > PADs
	#find -name "*.pad" -type f | sed s/..// | xargs ls -1 | sed s/pad/pad\\\\/ >> PADs
	ls -1 *.pad |  sed s/pad/pad\\\\/ >> PADs
	echo "" >> PADs

3DINFOs::
	touch 3DINFOs
	echo "3DINFOs=\\" > 3DINFOs
	#find -name "*.3dinfo" -type f | sed s/..// | xargs ls -1 | sed s/3dinfo/3dinfo\\\\/ >> 3DINFOs
	ls -1 *.3dinfo | sed s/3dinfo/3dinfo\\\\/ >> 3DINFOs
	echo "" >> 3DINFOs

3DLIST::
	touch 3DLIST
	echo "3DLIST=\\" > 3DLIST
	#find -name "*.3dlst" -type f | sed s/..// | xargs ls -1 | sed s/3dlst/3dlst\\\\/ >> 3DLIST
	ls -1 *.3dlst |  sed s/3dlst/3dlst\\\\/ >> 3DLIST
	echo "" >> 3DLIST

CORINFO2s::
	touch CORINFO2s
	echo "CORINFO2s=\\" > CORINFO2s
	#find -name "*.corinfo2" -type f | sed s/..// | xargs ls -1 | sed s/corinfo2/corinfo2\\\\/ >> CORINFO2s
	ls -1 *.corinfo2 | sed s/corinfo2/corinfo2\\\\/ >> CORINFO2s
	echo "" >> CORINFO2s

##############
First::
	cp $(INITIAL).3d $(TARGET).ref3d
	touch *.roi

All::
	make $(TARGET).ref2d;
	make ROIs;
	make $(JOP_NUM) pad;
	make PADs;
	make $(JOP_NUM) corinfo;
	make CORINFOs;
	make $(JOP_NUM) 3dinfo;
	make 3DINFOs;
	make $(JOP_NUM) 3dlst;
	make 3DLIST;
	make $(TARGET).3d;

Again::
	touch *.pad
	cp $(TARGET).3d $(TARGET).ref3d;
	TMPNAME=`date +%y%m%d%H%M%S`;	\
	mv $(TARGET).3dlst   $(TARGET).3dlst.$$TMPNAME;	\
	mv $(TARGET).3d      $(TARGET).3d.$$TMPNAME;	\
	mv $(TARGET).3dsm    $(TARGET).3dsm.$$TMPNAME;	\
	mv $(TARGET).ds6     $(TARGET).ds6.$$TMPNAME;	\
	mv $(TARGET).3dsmds6 $(TARGET).3dsmds6.$$TMPNAME;	
	

#### Prepare Reference ####

.ref3d.ref2d:
	mrc3Dto2D -i $(TARGET).ref3d -o $(TARGET).ref2d -EulerMode $(ROTMODE) -InterpolationMode 2 -Rot2 $(ROT2MIN) $(ROT2MAX) $(ROT2D) -Rot1 $(ROT1MIN) $(ROT1MAX) $(ROT1D) -Rot3 $(ROT3MIN) $(ROT3MAX) $(ROT3D) -m 0

.roi.pad:
	mrcImageWindowing -i $*.roi -o $*.mask -W 0.1 0.0 0.05 0.0 -m 18
	mrcImagePad -i $*.mask -o $*.padtmp -W $(PAD_W) -H $(PAD_H) -m 3
	mrcImageWindowing -i $*.padtmp -o $*.pad -W 0.1 0.0 0.1 0.0 -m 2 

.pad.corinfo:
	mrcImageAutoRotationCorrelation -i $*.pad -r $(TARGET).ref2d -O $*.corinfo -fit $*.fit -cor $*.cormap -n $(nRot) -m 18 -range $(ROTMIN) $(ROTMAX) -Iter 2 -nRot2 $(nRot2) -nRot1 $(nRot1) -nRot3 $(nRot3) 2> /dev/null

##############################################################################


.corinfo.3dinfo:
	awk '/Cor/ { print $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e s/.pad/.fit/ > $*.3dinfolst
	head -n 1 $*.3dinfolst | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' > $*.3dinfo
##   ##18 -> ##7  ##

.3dinfo.3dlst:
	cat $*.3dinfo >> $(TARGET).3dlst		
	
.3dlst.3d:
	mrc2Dto3D -I $(TARGET).3dlst -o $(TARGET).3d -InterpolationMode 2 -Double -DoubleCounter $(TARGET).3dcounter -CounterThreshold 0.5 -m 1 -WeightMode 2

.3d.3dsm:
	mrcImageSmoothing -i $(TARGET).3d -o $(TARGET).3dsm -m 1 -M 1 -r 3

.3dsm.3dsmCenter:
	mrcImageCenterGet -i $(TARGET).3dsm -o $(TARGET).3dsmCenter -Nx 128 -Ny 128 -Nz 128

.3dsmCenter.ds6:
	mrc2map -i $(TARGET).3dsmCenter -o $(TARGET).ds6 -m 3

.3d.ds6:
	mrc2map -i $*.3d -o $*.ds6 -m 0 

#####Select Particles#####

.corinfo.corinfo2:
	awk '/Cor/ { print $$18,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12}' $*.corinfo | sort -r | sed -e 's/.roi/.fit/' > $*.corinfolst
	head -n 1 $*.corinfolst | awk '{if($(PAD_W)-$$8>=$$8&&$(PAD_H)-$$9>=$$9) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,0+$$8,0+$$9;else if($(PAD_W)-$$8>=$$8) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,0+$$8,$(PAD_H)-$$9;else if($(PAD_H)-$$9>=$$9) print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$(PAD_W)-$$8,0+$$9;else print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$(PAD_W)-$$8,$(PAD_H)-$$9}' > $*.corinfo2

.corinfo2.parcorinfolst:
	cat $*.corinfo2 >> $(TARGET).parcorinfolst

CorinfoSort::
	awk '{ print $$1,$$2,$$3,$$4,$$5,$$6,$$7,$$8,$$9}' $(TARGET).parcorinfolst | sort -r > $(TARGET).parcorinfolstsort

SelectParticle::
	awk '$$1 >= $(COR_THRESHOLD) || $$9 <= $(Y_SHIFT_THRESHOLD){print $$2,$$3,$$4,$$5,$$6,$$1}' $(TARGET).parcorinfolstsort > $(TARGET).3dlstselect


#####Check alignment#####

GnuplotCorinfo::
	awk '{ print $$1,$$9}' $(TARGET).parcorinfolst | sort -r > $(TARGET).gnuplotcorinfolst
####################################################
	##gnuplot 
	##set out "Corinfo.ps" 
	##plot "$(TARGET).gnuplotcorinfolst"
###################################################

GnuplotAngle::
	awk '{ print $$4,$$5}' $(TARGET).parcorinfolst > $(TARGET).gnuplotanglelst
######################################################
	##gnuplot
	##set out "Angle.ps"
	##plot "$(TARGET).gnuplotanglelst"
######################################################	

GnuplotShift::
	awk '{ print $$4,$$5}' $(TARGET).parcorinfolst > $(TARGET).gnuplotshiftlst
######################################################
	##gnuplot
	##set out "Shift.ps"
	##plot "$(TARGET).gnuplotshiftlst"
######################################################  

MontageList::
	awk '{ print $$1}' $(TARGET).3dlst > $(TARGET).monlst
	mrcImageMontageCreate -i $(TARGET).monlst -o $(TARGET).mon -nx 15 -ny 10