#
#	This is makefile of Sample for 3D-Reconstrucion.
#

#### Root Makefile ####
MAKE_ROOT=3DReconstruction4

#### Input extention ####
# These extensions must all be different.
IN_PDB_EXT=pdb
IN_3D_EXT=ini3d
IN_2D_EXT=ini2d
IN_ROI_EXT=roibase
IN_PAD_EXT=roi
IN_CORR_EXT=pad
REF_3D_EXT=ref3d
REF_2D_EXT=ref2d
OUT_CORR_EXT=corinfo
NOR_CMAP_EXT=cornor1
NOR_CORR_EXT=norinfo
3D_INFO_EXT=3dinfo
3D_LIST_EXT=3dlst
3D_DIV_EXT=3ddivlst
OUT_FIT_EXT=norfit
OUT_3D_EXT=3d
IN_TIFF_EXT=mrc


#### Suffixes rule ####
.SUFFIXES: .$(IN_PDB_EXT) .$(IN_3D_EXT) .$(IN_ROI_EXT) .$(IN_2D_EXT) .$(REF_3D_EXT) .$(REF_2D_EXT) .$(IN_PAD_EXT) .$(IN_CORR_EXT) .$(OUT_CORR_EXT) .$(NOR_CORR_EXT) .cordst .cornor1 .cornor2 .cornor3 .cornor4 .$(3D_INFO_EXT) .$(OUT_FIT_EXT) .$(3D_LIST_EXT) $(3D_DIV_EXT) .$(OUT_3D_EXT) .$(IN_TIFF_EXT) .tiff .txt


#### INCLUDE ####
SHELL=/bin/bash

-include ${EOS_HOME}/tutorial/TIPS/Help/Makefile/Makefile-lib
-include IN_ROI_LIST
-include IN_PAD_LIST
-include IN_CORR_LIST
-include OUT_CORR_LIST
-include 3D_INFO_LIST
-include NOR_CORR_LIST
-include OUT_3D_LIST
-include IN_TIFF_LIST
-include 3D_LIST_LIST


#### Definition ####
# Target structure name 
TARGET=Target

# Interpolation mode(CommonSetting: Input, Ref, Output)
IN_MODE=2

###For Input Data
## For mrc3Dto2D(Input)
# RotMode
IN_ROTMODE=XEYS
# Rot1
IN_ROT1MIN=0
IN_ROT1MAX=180
IN_ROT1D=15
IN_ROT1N=`expr \( $(IN_ROT1MAX) - $(IN_ROT1MIN) \) / $(IN_ROT1D) + 1`
# Rot2
IN_ROT2MIN=0
IN_ROT2MAX=345
IN_ROT2D=15
IN_ROT2N=`expr \( $(IN_ROT2MAX) - $(IN_ROT2MIN) \) / $(IN_ROT2D) + 1`
# Rot3
IN_ROT3MIN=0
IN_ROT3MAX=0
IN_ROT3D=10
IN_ROT3N=`expr \( $(IN_ROT3MAX) - $(IN_ROT3MIN) \) / $(IN_ROT3D) + 1`
# 0:Mercator 1:Mollweide
IN_EX_MODE=1
# Noise/Signal-Ratio(if you wish no-noise, set 0)
NSRATIO=0

## Pre-processing(Pad)
# InputPadSize
PAD_W=64
PAD_H=64


###For Ref Data
## For Ref Volume
# Molecule Number
MOLNUM=43000

## mrc3Dto2D(Ref)
# RotMode
ROTMODE=$(IN_ROTMODE)
# Rot1
ROT1MIN=$(IN_ROT1MIN)
ROT1MAX=$(IN_ROT1MAX)
ROT1D=$(IN_ROT1D)
ROT1N=`expr \( $(ROT1MAX) - $(ROT1MIN) \) / $(ROT1D) + 1`
# Rot2
ROT2MIN=$(IN_ROT2MIN)
ROT2MAX=$(IN_ROT2MAX)
ROT2D=$(IN_ROT2D)
ROT2N=`expr \( $(ROT2MAX) - $(ROT2MIN) \) / $(ROT2D) + 1`
# Rot3
ROT3MIN=$(IN_ROT3MIN)
ROT3MAX=$(IN_ROT3MAX)
ROT3D=$(IN_ROT3D)
ROT3N=`expr \( $(ROT3MAX) - $(ROT3MIN) \) / $(ROT3D) + 1`
# Expansion mode
# 0:Mercator 1:Mollweide
EX_MODE=$(IN_EX_MODE)

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

# mode
COR_MODE=18

# For Reduce List(range :0 <= p < 100)(if you wish no-reduce, set 0.)
REDUCE_P=0

# For Divide List(range: 0 <= p < 100)(if you wish no-divide, set 0.)
DEVIDE_P=0

# For Fourier Shell Correlation
THRES_FSC=0.5

#### For Works ####
JOP_NUM=-j 3


#### Rules of the list created ####
$(IN_PAD_EXT):$(IN_ROI_LIST:.$(IN_ROI_EXT)=.$(IN_PAD_EXT))
$(IN_CORR_EXT):$(IN_PAD_LIST:.$(IN_PAD_EXT)=.$(IN_CORR_EXT))
$(OUT_CORR_EXT):$(IN_CORR_LIST:.$(IN_CORR_EXT)=.$(OUT_CORR_EXT))
$(NOR_CORR_EXT):$(OUT_CORR_LIST:.$(OUT_CORR_EXT)=.$(NOR_CORR_EXT))
cordst:$(OUT_CORR_LIST:.$(OUT_CORR_EXT)=.cordst)
$(3D_INFO_EXT):$(NOR_CORR_LIST:.$(NOR_CORR_EXT)=.$(3D_INFO_EXT))
$(OUT_FIT_EXT):$(3D_INFO_LIST:.$(3D_INFO_EXT)=.$(OUT_FIT_EXT))
$(IN_TIFF_EXT):$(OUT_3D_LIST:.$(OUT_3D_EXT)=.$(IN_TIFF_EXT))
tiff:$(IN_TIFF_LIST:.$(IN_TIFF_EXT)=.tiff)
txt:$(3D_LIST_LIST:.$(3D_LIST_EXT)=.txt)

IN_ROI_LIST::
	touch IN_ROI_LIST
	echo "IN_ROI_LIST=\\" > IN_ROI_LIST
#	ls -1 *.$(IN_ROI_EXT) >> IN_ROI_LIST
#	ls -1 *.$(IN_ROI_EXT) |  sed s/$(IN_ROI_EXT)/$(IN_ROI_EXT)\\\\/ >> IN_ROI_LIST
	ls -1 *.$(IN_ROI_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(IN_ROI_EXT)/$(IN_ROI_EXT)\\\\/ >> IN_ROI_LIST
	echo "" >> IN_ROI_LIST

IN_PAD_LIST::
	touch IN_PAD_LIST
	echo "IN_PAD_LIST=\\" > IN_PAD_LIST
#	ls -1 *.$(IN_PAD_EXT) >> IN_PAD_LIST
#	ls -1 *.$(IN_PAD_EXT) |  sed s/$(IN_PAD_EXT)/$(IN_PAD_EXT)\\\\/ >> IN_PAD_LIST
	ls -1 *.$(IN_PAD_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(IN_PAD_EXT)/$(IN_PAD_EXT)\\\\/ >> IN_PAD_LIST
	echo "" >> IN_PAD_LIST
	
IN_CORR_LIST::
	touch IN_CORR_LIST
	echo "IN_CORR_LIST=\\" > IN_CORR_LIST
#	ls -1 *.$(IN_CORR_EXT) >> IN_CORR_LIST
#	ls -1 *.$(IN_CORR_EXT) |  sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST
	ls -1 *.$(IN_CORR_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST
	echo "" >> IN_CORR_LIST
	
OUT_CORR_LIST::
	touch OUT_CORR_LIST
	echo "OUT_CORR_LIST=\\" > OUT_CORR_LIST
#	ls -1 *.$(OUT_CORR_EXT) >> OUT_CORR_LIST
#	ls -1 *.$(OUT_CORR_EXT) |  sed s/$(OUT_CORR_EXT)/$(OUT_CORR_EXT)\\\\/ >> OUT_CORR_LIST
	ls -1 *.$(OUT_CORR_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(OUT_CORR_EXT)/$(OUT_CORR_EXT)\\\\/ >> OUT_CORR_LIST
	echo "" >> OUT_CORR_LIST

3D_INFO_LIST::
	touch 3D_INFO_LIST
	echo "3D_INFO_LIST=\\" > 3D_INFO_LIST
#	ls -1 *.$(3D_INFO_EXT) >> 3D_INFO_LIST
#	ls -1 *.$(3D_INFO_EXT) |  sed s/$(3D_INFO_EXT)/$(3D_INFO_EXT)\\\\/ >> 3D_INFO_LIST
	ls -1 *.$(3D_INFO_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(3D_INFO_EXT)/$(3D_INFO_EXT)\\\\/ >> 3D_INFO_LIST
	echo "" >> 3D_INFO_LIST

NOR_CORR_LIST::
	touch NOR_CORR_LIST
	echo "NOR_CORR_LIST=\\" > NOR_CORR_LIST
#	ls -1 *.$(NOR_CORR_EXT) >> NOR_CORR_LIST
#	ls -1 *.$(NOR_CORR_EXT) |  sed s/$(NOR_CORR_EXT)/$(NOR_CORR_EXT)\\\\/ >> NOR_CORR_LIST
	ls -1 *.$(NOR_CORR_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(NOR_CORR_EXT)/$(NOR_CORR_EXT)\\\\/ >> NOR_CORR_LIST
	echo "" >> NOR_CORR_LIST
	
OUT_3D_LIST::
	touch OUT_3D_LIST
	echo "OUT_3D_LIST=\\" > OUT_3D_LIST
#	ls -1 *.$(OUT_3D_EXT) >> OUT_3D_LIST
#	ls -1 *.$(OUT_3D_EXT) |  sed s/$(OUT_3D_EXT)/$(OUT_3D_EXT)\\\\/ >> OUT_3D_LIST
	ls -1 *.$(OUT_3D_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(OUT_3D_EXT)/$(OUT_3D_EXT)\\\\/ >> OUT_3D_LIST
	echo "" >> OUT_3D_LIST
	
IN_TIFF_LIST::
	touch IN_TIFF_LIST
	echo "IN_TIFF_LIST=\\" > IN_TIFF_LIST
#	ls -1 *.$(IN_TIFF_EXT) >> IN_TIFF_LIST
#	ls -1 *.$(IN_TIFF_EXT) |  sed s/$(IN_TIFF_EXT)/$(IN_TIFF_EXT)\\\\/ >> IN_TIFF_LIST
	ls -1 *.$(IN_TIFF_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(IN_TIFF_EXT)/$(IN_TIFF_EXT)\\\\/ >> IN_TIFF_LIST
	echo "" >> IN_TIFF_LIST
	
IN_TIFF_LIST2::
	touch IN_TIFF_LIST2
	rm IN_TIFF_LIST2
#	ls -1 *.$(IN_TIFF_EXT) >> IN_TIFF_LIST2
	ls -1 *.$(IN_TIFF_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n >> IN_TIFF_LIST2
	echo "" >> IN_TIFF_LIST2

3D_LIST_LIST::
	touch 3D_LIST_LIST
	echo "3D_LIST_LIST=\\" > 3D_LIST_LIST
#	ls -1 *.$(3D_LIST_EXT) >> 3D_LIST_LIST
#	ls -1 *.$(3D_LIST_EXT) |  sed s/$(3D_LIST_EXT)/$(3D_LIST_EXT)\\\\/ >> 3D_LIST_LIST
	ls -1 *.$(3D_LIST_EXT) | sort -t . -k1,1 -k2 -n |  sed s/$(3D_LIST_EXT)/$(3D_LIST_EXT)\\\\/ >> 3D_LIST_LIST
	echo "" >> 3D_LIST_LIST

#### Commands ####
help_3DReconstruction4::
	@echo "This is makefile of Sample."
	
Initial::
	make $(TARGET).$(IN_3D_EXT);
	make $(TARGET).$(IN_2D_EXT);
	make TestData2DSet;
	make TestData;

First::
	make IN_PAD_LIST;
	make Ref3d_ellipse;
	cp $(TARGET).$(REF_3D_EXT)ini $(TARGET).$(REF_3D_EXT);
	make $(JOP_NUM) $(IN_CORR_EXT);

All::
	make IN_CORR_LIST;
	make $(TARGET).$(REF_2D_EXT);
	make $(JOP_NUM) $(OUT_CORR_EXT);
	make OUT_CORR_LIST;
	make ReduceLIST;
	make CorDistribution;
	make $(TARGET).$(NOR_CMAP_EXT);
	make CorNormalize;
	make NOR_CORR_LIST;
	touch $(TARGET).$(3D_LIST_EXT);
	rm $(TARGET).$(3D_LIST_EXT);
	make $(JOP_NUM) $(3D_INFO_EXT);
	make 3D_INFO_LIST;
	make $(JOP_NUM) $(OUT_FIT_EXT);
	make 3D;
	make RMSD;
	make $(TARGET).$(IN_TIFF_EXT);
	make IN_TIFF_LIST;
	make tiff;

Again::
	touch *.$(IN_CORR_EXT);
	cp $(TARGET).$(OUT_3D_EXT) $(TARGET).$(REF_3D_EXT);
	TMPNAME=`date +%y%m%d%H%M%S`;	\
	mv $(TARGET).$(3D_LIST_EXT)   $(TARGET).$$TMPNAME.$(3D_LIST_EXT);	\
	mv $(TARGET).$(OUT_3D_EXT)     $(TARGET).$$TMPNAME.$(OUT_3D_EXT);

TestData2DSet::
	mrcInfo -i $(TARGET).$(IN_2D_EXT) -o INFO;
	@loopmax=$$(cat INFO | awk '/Tailer/ {printf("%d\n", $$3)}'); \
	LineMax=`expr $$loopmax \* 4`; \
	for (( LoopNum = 0; LoopNum < $$loopmax; LoopNum++ )) \
	do \
		WorkNum=`expr $$LoopNum \* 4 + 4`; \
		rdata=$$(tail -$$LineMax INFO | head -$$WorkNum | tail -1); \
		rot1=$$(echo $$rdata | awk '{printf"%s", $$1}' ); \
		rot2=$$(echo $$rdata | awk '{printf"%s", $$2}' ); \
		rot3=$$(echo $$rdata | awk '{printf"%s", $$3}' ); \
		mrcImageSectionGet -i $(TARGET).$(IN_2D_EXT) -o $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) -z $$LoopNum; \
	done;

TestData::
	make IN_ROI_LIST;
	make $(JOP_NUM) $(IN_PAD_EXT);

Ref3d_ellipse::
	rfile=$$(head -2 IN_PAD_LIST | tail -1 | sed -e s/\\\\//); \
	mrcInfo -i $$rfile -o RINFO;
	pdbPCA -i $(TARGET).pdb -oPDB PDB -oU ARRAY;
	pdbInfo -i PDB -o PINFO;
	pData=$$(head -3 PINFO | tail -1); \
	rData=$$(head -5 RINFO | tail -1); \
	length=$$(echo $$rData | awk '{printf("%f", $$4)}'); \
	rx=$$(echo $$pData | awk -v v=$$length '{printf("%f", $$8)}'); \
	ry=$$(echo $$pData | awk -v v=$$length '{printf("%f", $$7)}'); \
	rz=$$(echo $$pData | awk -v v=$$length '{printf("%f", $$9)}'); \
	nx=$$(echo "$$rx * $$length" | bc); \
	ny=$$(echo "$$ry * $$length" | bc); \
	nz=$$(echo "$$rz * $$length" | bc); \
	mrcImageGaussSphere	-o $(TARGET).tmp  -m 2 \
						-sigmax $$rx -sigmay $$ry -sigmaz $$rz \
						-W $$nx -H $$ny -S $$nz \
						-size $$length; \
	mrcImageVolumeCalc -i $(TARGET).tmp -o RINFO -M $(MOLNUM) -D $$length -I 1; \
	volume=$$(cat RINFO | awk '/ContourLevel\(100\):/ {printf("%f\n", $$2)}'); \
	mrcImageBinalization -i $(TARGET).tmp -o $(TARGET).$(REF_3D_EXT)ini -t $$volume;
	rm RINFO;
	rm PDB;
	rm PINFO;
	rm ARRAY;
	rm $(TARGET).tmp;

CorDistribution::
	touch $(TARGET).cordst;
	rm $(TARGET).cordst;
	@rfile=$$(head -2 OUT_CORR_LIST | tail -1 | sed -e s/\\\\//); \
	lmax=`expr $$(cat $$rfile | tail -2 | head -1 | awk '{printf("%d\n", $$1)}') \* 2 + 2`; \
	fmax=$$(wc -w OUT_CORR_LIST | awk '{printf("%d\n", $$1)}'); \
	for (( LoopNum = 1; LoopNum <= lmax ; LoopNum += 2 )) \
	do \
		echo CorDistribution: $$LoopNum / $$lmax; \
		Data=""; \
		for (( LoopFile = 2; LoopFile <= fmax; LoopFile++ )) \
		do \
			rfile=$$(head -$$LoopFile OUT_CORR_LIST | tail -1 | sed -e s/\\\\//); \
			Data+="$$(head -$$LoopNum $$rfile | tail -1 | awk '{printf("%15.6f", $$7)}') "; \
		done; \
		echo $$Data >> $(TARGET).cordst; \
	done;
	
CorNormalize::
	@lmax=$$(wc -l $(TARGET).$(NOR_CMAP_EXT) | awk '{printf("%d\n", $$1)}'); \
	fmax=`expr $$(wc -w $(TARGET).$(NOR_CMAP_EXT) | awk '{printf("%d\n", $$1)}') / $$lmax`; \
	for (( LoopFile = 1; LoopFile <= fmax; LoopFile++ )) \
	do \
		echo CorNormalize: $$LoopFile / $$fmax; \
		WorkNum=`expr $$LoopFile + 1`; \
		rfile=$$(head -$$WorkNum OUT_CORR_LIST | tail -1 | sed -e s/\\\\//); \
		wfile=$$(echo $$rfile | sed -e s/$(OUT_CORR_EXT)/$(NOR_CORR_EXT)/); \
		touch $$wfile; \
		rm $$wfile; \
		for (( LoopNum = 1; LoopNum <= lmax ; LoopNum++ )) \
		do \
			NorData=$$(head -$$LoopNum $(TARGET).$(NOR_CMAP_EXT) | tail -1 | awk -v x=$$LoopFile '{printf("%15.6f", $$x)}'); \
			WorkNum=`expr $$LoopNum \* 2 - 1`; \
			Data=$$(head -$$WorkNum $$rfile | tail -1 | awk -v v="$$NorData" '{printf("%s %s %s %s %s %s ", $$1, $$2, $$3, $$4, $$5, $$6)}; {printf("%15.6f", v)}; {printf(" %s %s %s %s %s %s %s %s %s %s %s %s\n\n", $$8, $$9, $$10, $$11, $$12, $$13, $$14, $$15, $$16, $$17, $$18, $$19)}'); \
			echo $$Data >> $$wfile; \
		done; \
	done;

3D::
	@if [ $(DEVIDE_P) -eq 0 ]; then \
		make $(TARGET).$(OUT_3D_EXT); \
	else \
		make RefAngleList; \
		make DivideLIST; \
		make TMP3D; \
		make CompareRandom; \
	fi;

RMSD::
	mrcImageNormalizedSubtraction -i1 $(TARGET).$(OUT_3D_EXT) -i2 $(TARGET).$(IN_3D_EXT) -o $(TARGET).tmp > INFO;
	cat INFO | awk '/RMSD/ {printf("%s	"), $$0}' >> $(TARGET).rmsd;
	mrcImageNormalizedSubtraction -i1 $(TARGET).$(OUT_3D_EXT) -i2 $(TARGET).$(REF_3D_EXT) -o $(TARGET).tmp > INFO;
	cat INFO | awk '/RMSD/ {printf("%s\n"), $$0}' >> $(TARGET).rmsd;
	@rmsd=$$(cat INFO | awk '/RMSD/ {printf("%f"), $$2}'); \
	if [ $$(echo "$$rmsd <= 0" | bc ) -eq 1 ]; then \
		touch END; \
	fi;

3DCheck::
	make OUT_3D_LIST;
	make $(IN_TIFF_EXT);
	make ListTiff;

ListTiff::
	make IN_TIFF_LIST2;
	Number=`expr $$(wc -l IN_TIFF_LIST2 | awk '{printf("%d", $$1)}') / 3`; \
	mrcImageMake2DArrayImage -i IN_TIFF_LIST2 -o $(TARGET).tmp -N $$Number;
	mrc2tiff -i $(TARGET).tmp -o $(TARGET).tiff;
	
ReduceLIST::
	@line=`expr $$(wc -l OUT_CORR_LIST | awk '{printf("%d", $$1)}') - 2`; \
	endline=`expr $$line \* \( 100 - $(REDUCE_P) \) / 100 + 1`; \
	worknum=`expr $$line + 1`; \
	cp OUT_CORR_LIST TMP$$worknum; \
	cp OUT_CORR_LIST OUT_CORR_LIST_TMP; \
	for (( ; $$endline < $$line; line-- )) \
	do \
		worknum=`expr $$line + 1`; \
		random=`expr $$RANDOM % $$line + 2`; \
		sed -e "$$random , $$random d" TMP$$worknum > TMP$$line; \
		rm TMP$$worknum; \
		echo $$line / $$endline Delete L:$$random; \
	done; \
	cat TMP`expr $$line + 1` > OUT_CORR_LIST; \
	rm TMP`expr $$line + 1`;
	
DivideLIST::
	touch $(TARGET).$(3D_DIV_EXT);
	rm $(TARGET).$(3D_DIV_EXT);
	@line=$$(wc -l $(TARGET).$(3D_LIST_EXT) | awk '{printf("%d", $$1)}'); \
	endline=`expr $$line \* \( 100 - $(DEVIDE_P) \) / 100 + 1`; \
	worknum=`expr $$line + 1`; \
	cp $(TARGET).$(3D_LIST_EXT) TMP$$worknum; \
	cp $(TARGET).$(3D_LIST_EXT)  $(TARGET)_TMP.$(3D_LIST_EXT); \
	for (( ; $$endline < $$line; line-- )) \
	do \
		worknum=`expr $$line + 1`; \
		random=`expr $$RANDOM % $$line + 2`; \
		head -$$random TMP$$worknum | tail -1 >> $(TARGET).$(3D_DIV_EXT); \
		sed -e "$$random , $$random d" TMP$$worknum > TMP$$line; \
		rm TMP$$worknum; \
		echo $$line / $$endline Select L:$$random; \
	done; \
	cat TMP`expr $$line + 1` > $(TARGET).$(3D_LIST_EXT); \
	rm TMP`expr $$line + 1`;

TMP3D::
	mrc2Dto3D -I $(TARGET).$(3D_LIST_EXT) -o TMP.$(OUT_3D_EXT) -InterpolationMode $(IN_MODE) -Double -CounterThreshold 0.5 -m 1 -WeightMode 2 -DoubleCounter TMP.dc;

CompareRandom::
	touch TMP0.$(OUT_3D_EXT);
	rm TMP0.$(OUT_3D_EXT);
	@line=$$(wc -l $(TARGET).$(3D_DIV_EXT) | awk '{printf("%d", $$1)}'); \
	for (( LoopNum = 1; $$LoopNum <= $$line; LoopNum++ )) \
	do \
		echo "CompareRandom $$LoopNum / $$line"; \
		head -$$LoopNum $(TARGET).$(3D_DIV_EXT) | tail -1 > TMP1; \
		lmax=$$(wc -l $(TARGET).cordst | awk '{printf("%d\n", $$1)}'); \
		randomline=`expr $$RANDOM % $$lmax + 1`; \
		rData=$$(head -$$randomline REF_ANGLE_LIST | tail -1); \
		randomRot1=$$(echo $$rData | awk '{printf("%f", $$1)}'); \
		randomRot2=$$(echo $$rData | awk '{printf("%f", $$2)}'); \
		randomRot3=$$(echo $$rData | awk '{printf("%f", $$3)}'); \
		echo $$randomRot1 $$randomRot2 $$randomRot3; \
		cat TMP1 | awk -v v1=$$randomRot1 -v v2=$$randomRot2 -v v3=$$randomRot3 '{printf("%s %s %d %d %d\n", $$1, $$2, v1, v2, v3)}' > TMP2; \
		mrc2Dto3D -I TMP1 -o TMP1.$(OUT_3D_EXT) -InterpolationMode $(IN_MODE) -Double -CounterThreshold 0.5 -m 1 -WeightMode 2 -DoubleCounter TMP1.dc; \
		mrc2Dto3D -I TMP2 -o TMP2.$(OUT_3D_EXT) -InterpolationMode $(IN_MODE) -Double -CounterThreshold 0.5 -m 1 -WeightMode 2 -DoubleCounter TMP2.dc; \
		mrcImageFourierShellCorrelation -i1 TMP1.$(OUT_3D_EXT) -i2 TMP.$(OUT_3D_EXT) | awk '$(THRES_FSC) <= $$2 {print $$0} $(THRES_FSC) > $$2 {exit}' | tail -1 > TMP; \
		mrcImageFourierShellCorrelation -i1 TMP2.$(OUT_3D_EXT) -i2 TMP.$(OUT_3D_EXT) | awk '$(THRES_FSC) <= $$2 {print $$0} $(THRES_FSC) > $$2 {exit}' | tail -1 >> TMP; \
		rData=$$(cat TMP); \
		r1=$$(echo $$rData | awk '{print $$1}'); \
		c1=$$(echo $$rData | awk '{print $$2}'); \
		r2=$$(echo $$rData | awk '{print $$4}'); \
		c2=$$(echo $$rData | awk '{print $$5}'); \
		echo "TMP0.$(OUT_3D_EXT)" > AVR_LIST; \
		echo "TMP0.dc" > WGT_LIST; \
		if [ $$(echo "$$r1 > $$r2" | bc) -eq 1 ]; then \
			UseNum=1; \
		elif [ $$(echo "$$r1 < $$r2" | bc) -eq 1 ]; then \
			echo Change; \
			UseNum=2; \
		elif [ $$(echo "$$c1 >= $$c2" | bc) -eq 1 ]; then \
			UseNum=1; \
		else \
			echo Change; \
			UseNum=2; \
		fi; \
		if [ -e TMP0.$(OUT_3D_EXT) ]; then \
			echo "TMP$$UseNum.$(OUT_3D_EXT)" >> AVR_LIST; \
			echo "TMP$$UseNum.dc" >> WGT_LIST; \
			mrcImageAverage -i AVR_LIST -o TMPTMP.$(OUT_3D_EXT) -w WGT_LIST -oW TMPTMP.dc; \
			cp TMPTMP.$(OUT_3D_EXT) TMP0.$(OUT_3D_EXT); \
			cp TMP0.dc TMPTMP.dc; \
		else \
			cp TMP$$UseNum.$(OUT_3D_EXT) TMP0.$(OUT_3D_EXT); \
			cp TMP$$UseNum.dc TMP0.dc; \
		fi; \
	done;
	if [ -e TMP0.$(OUT_3D_EXT) ]; then \
		echo "TMP.$(OUT_3D_EXT)" > AVR_LIST; \
		echo "TMP.dc" > WGT_LIST; \
		echo "TMP0.$(OUT_3D_EXT)" >> AVR_LIST; \
		echo "TMP0.dc" >> WGT_LIST; \
		mrcImageAverage -i AVR_LIST -o $(TARGET).$(OUT_3D_EXT) -w WGT_LIST -oW $(TARGET).dc; \
	else \
		cp TMP.$(OUT_3D_EXT) $(TARGET).$(OUT_3D_EXT); \
		cp TMP.dc $(TARGET).dc; \
	fi;
	
RefAngleList::
	touch REF_ANGLE_LIST;
	rm REF_ANGLE_LIST;
	mrcInfo -i $(TARGET).$(REF_2D_EXT) -o INFO;
	@loopmax=$$(cat INFO | awk '/Tailer/ {printf("%d\n", $$3)}'); \
	LineMax=`expr $$loopmax \* 4`; \
	for (( LoopNum = 0; LoopNum < $$loopmax; LoopNum++ )) \
	do \
		WorkNum=`expr $$LoopNum \* 4 + 4`; \
		rdata=$$(tail -$$LineMax INFO | head -$$WorkNum | tail -1); \
		echo $$rdata | awk '{printf"%s %s %s\n", $$1, $$2, $$3}' >> REF_ANGLE_LIST; \
	done;

clean all::
	rm $(TARGET).$(IN_2D_EXT);
	rm $(IN_ROI_EXT);

Test::
	make REF_ANGLE_LIST;

##### Commands(Input to Output) #####
.$(IN_PDB_EXT).$(IN_3D_EXT):
	pdb2mrc -i $(TARGET).$(IN_PDB_EXT) -o $(TARGET).$(IN_3D_EXT) -m 1;

.$(IN_3D_EXT).$(IN_2D_EXT):
	mrc3Dto2D -i $(TARGET).$(IN_3D_EXT) -o $(TARGET).$(IN_2D_EXT) -EulerMode $(IN_ROTMODE) \
				-Rot1 $(IN_ROT1MIN) $(IN_ROT1MAX) $(IN_ROT1D) \
				-Rot2 $(IN_ROT2MIN) $(IN_ROT2MAX) $(IN_ROT2D) \
				-Rot3 $(IN_ROT3MIN) $(IN_ROT3MAX) $(IN_ROT3D) \
				-m $(IN_EX_MODE) -InterpolationMode $(IN_MODE);

.$(IN_ROI_EXT).$(IN_PAD_EXT):
	mrcImageNoiseAdd -i $*.$(IN_ROI_EXT) -o $*.$(IN_PAD_EXT) -NS $(NSRATIO);

.$(IN_PAD_EXT).$(IN_CORR_EXT):
	mrcImageWindowing -i $*.$(IN_PAD_EXT) -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 $*.$(IN_CORR_EXT) -W 0.1 0.0 0.1 0.0 -m 2;
	rm $*.mask;
	rm $*.padtmp;

.$(REF_3D_EXT).$(REF_2D_EXT):
	mrc3Dto2D -i $*.$(REF_3D_EXT) -o $*.tmp -EulerMode $(ROTMODE) -InterpolationMode $(IN_MODE) -Rot2 $(ROT2MIN) $(ROT2MAX) $(ROT2D) -Rot1 $(ROT1MIN) $(ROT1MAX) $(ROT1D) -Rot3 $(ROT3MIN) $(ROT3MAX) $(ROT3D) -m $(EX_MODE);
	rfile=$$(head -2 IN_CORR_LIST | tail -1 | sed -e s/\\\\//); \
	mrcInfo -i $$rfile -o INFO;
	Data=$$(head -1 INFO | tail -1); \
	xPad=$$(echo $$Data | awk '{printf("%d", $$4)}'); \
	yPad=$$(echo $$Data | awk '{printf("%d", $$5)}'); \
	mrcImage3DPad -i $*.tmp -o $*.$(REF_2D_EXT) -Nx $$xPad -Ny $$yPad -M 1 -v 0;
	rm $*.tmp;
	rm INFO;

.$(IN_CORR_EXT).$(OUT_CORR_EXT):
	mrcImageAutoRotationCorrelation -i $*.$(IN_CORR_EXT) -r $(TARGET).$(REF_2D_EXT) -cor $*.cor -O $*.$(OUT_CORR_EXT) -n $(nRot) -m $(COR_MODE) -range $(ROTMIN) $(ROTMAX) -nRot1 $(ROT1N) -nRot2 $(ROT2N) -nRot3 $(ROT3N) 2> /dev/null

.cordst.cornor1:
	touch $*.cornor1;
	rm $*.cornor1;
	@lmax=$$(wc -l $*.cordst | awk '{printf("%d\n", $$1)}'); \
	fmax=`expr $$(wc -w $*.cordst | awk '{printf("%d\n", $$1)}') / $$lmax`; \
	for (( LoopNum = 1; LoopNum <= $$lmax; LoopNum++ )) \
	do \
		echo CorNormalize1: $$LoopNum / $$lmax; \
		ave=0; \
		DataL="$$(head -$$LoopNum $*.cordst | tail -1) "; \
		for (( LoopFile = 1; LoopFile <= fmax; LoopFile++ )) \
		do \
			ave=$$(echo $$DataL | awk -v x=$$LoopFile -v v=$$ave '{v+=$$x} END{print v}'); \
		done; \
		ave=$$(echo $$ave | awk -v v=$$ave -v u=$$fmax '{v/=u} END{print v}'); \
		sigma=0; \
		for (( LoopFile = 1; LoopFile <= fmax; LoopFile++ )) \
		do \
			sigma=$$(echo $$DataL | awk -v x=$$LoopFile -v ave=$$ave -v v=$$sigma '{v+=($$x - ave)^2} END{print v}'); \
		done; \
		sigma=$$(echo $$sigma | awk -v v=$$sigma -v u=$$fmax '{v=sqrt(v/u)} END{print v}'); \
		Data=""; \
		for (( LoopFile = 1; LoopFile <= fmax; LoopFile++ )) \
		do \
			Data+="$$(echo $$DataL | awk -v x=$$LoopFile -v ave=$$ave -v sigma=$$sigma '{zvalue=($$x - ave) / sigma; print zvalue}') "; \
		done; \
		echo $$Data >> $*.cornor1; \
	done;

.cordst.cornor2:
	touch $*.cornor2;
	rm $*.cornor2;
	@lmax=$$(wc -l $*.cordst | awk '{printf("%d\n", $$1)}'); \
	fmax=`expr $$(wc -w $*.cordst | awk '{printf("%d\n", $$1)}') / $$lmax`; \
	for (( LoopFile = 1; LoopFile <= $$fmax ; LoopFile++ )) \
	do \
		avelist+="$$(cat $*.cordst | awk -v x=$$LoopFile '{v=v+$$x} END{v=v/NR; print v}') "; \
	done; \
	for (( LoopFile = 1; LoopFile <= $$fmax ; LoopFile++ )) \
	do \
		ave=$$(echo $$avelist | awk -v x=$$LoopFile '{print $$x}'); \
		sigmalist+="$$(cat $*.cordst | awk -v x=$$LoopFile -v ave=$$ave '{sigma+=($$x - ave)^2} END{sigma=sqrt(sigma/NR); print (sigma)}') "; \
	done; \
	for (( LoopNum =1; LoopNum <= $$lmax; LoopNum++ )) \
	do \
		echo CorNormalize2: $$LoopNum / $$lmax; \
		Data=""; \
		for (( LoopFile = 1; LoopFile <= $$fmax; LoopFile++ )) \
		do \
			ave=$$(echo $$avelist | awk -v x=$$LoopFile '{print $$x}'); \
			sigma=$$(echo $$sigmalist | awk -v x=$$LoopFile '{print $$x}'); \
			Data+="$$(head -$$LoopNum $*.cordst | tail -1 | awk -v x=$$LoopFile -v ave=$$ave -v sigma=$$sigma '{zvalue=($$x - ave) / sigma; print zvalue}') "; \
		done; \
		echo $$Data >> $*.cornor2; \
	done;
	
.cordst.cornor3:
	make $*.cornor1;
	mv $*.cornor1 $*.cornor1.cordst;
	make $*.cornor1.cornor2;
	mv $*.cornor1.cornor2 $*.cornor3;
	
.cordst.cornor4:
	make $*.cornor2;
	mv $*.cornor2 $*.cornor2.cordst;
	make $*.cornor2.cornor1;
	mv $*.cornor2.cornor1 $*.cornor4;

.$(NOR_CORR_EXT).$(3D_INFO_EXT):
	touch $*.$(3D_INFO_EXT);
	rm $*.$(3D_INFO_EXT);
	awk '/Cor/ { printf("%15.6f %s %s %s %s %s %s %s %s %s\n", $$7,$$16,$$2,$$3,$$4,$$5,$$9,$$11,$$12,$$1)}' $*.$(NOR_CORR_EXT) | sort -n -r | sed -e s/.$(IN_CORR_EXT)/.$(OUT_FIT_EXT)/ >> $*.$(3D_INFO_EXT)
	head -n 1 $*.$(3D_INFO_EXT) | awk '{print $$2,$$3,$$4,$$5,$$6,$$1}' >> $(TARGET).$(3D_LIST_EXT)

.$(3D_INFO_EXT).$(OUT_FIT_EXT):
	Data=$$(head -1 $*.$(3D_INFO_EXT) | tail -1); \
	Number=$$(echo $$Data | awk '{printf("%f\n", $$10)}'); \
	mrcImageSectionGet -i $(TARGET).$(REF_2D_EXT) -o $*.tmp -z $$Number;
	mrcImageAutoRotationCorrelation -i $*.$(IN_CORR_EXT) -r $*.tmp -fit $*.$(OUT_FIT_EXT) -cor $*.cor -n $(nRot) -m $(COR_MODE) -range $(ROTMIN) $(ROTMAX) -nRot1 $(ROT1N) -nRot2 $(ROT2N) -nRot3 $(ROT3N) 2> /dev/null
	
.$(3D_LIST_EXT).$(OUT_3D_EXT):
	mrc2Dto3D -I $(TARGET).$(3D_LIST_EXT) -o $(TARGET).$(OUT_3D_EXT) -InterpolationMode $(IN_MODE) -Double -CounterThreshold 0.5 -m 1 -WeightMode 2;

.$(OUT_3D_EXT).$(IN_TIFF_EXT):
	@for (( loop_num = 0; loop_num <= 2; loop_num++ ))	\
	do \
		mrcImageProjection -i $*.$(OUT_3D_EXT) -o $$loop_num-$*.$(IN_TIFF_EXT) -m $$loop_num;	\
	done;

.$(IN_TIFF_EXT).tiff:
	mrc2tiff -i $*.$(IN_TIFF_EXT) -o $*.tiff;

.$(3D_LIST_EXT).txt:
	sort -t - -k1,1 -k2,2 -k3,3 -k4 -n $*.$(3D_LIST_EXT) >> $*.txt;
