#
#	This is a sample Makefile(ver.2) for electron tomography.
#

#### Root Makefile ####
MAKE_ROOT=ElectronTomography6

# These extensions must all be different.
INI_PDB_EXT=pdb
INI_3D1_EXT=ini3d1
INI_3DB_EXT=ini3db
INI_3D_EXT=ini3d
INI_2D_EXT=ini2d
IN_ROI_EXT=roi
OUT_PAD_EXT=pad
3D_LIST_EXT=3dlst
DIV_3D_EXT=mrc3d
FIT_3D_EXT=3dfit
AVE_3D_EXT=3dave


SHELL=/bin/bash


#### Suffixes rule ####
.SUFFIXES: \
	.tif .dat .tiff2mrc .prectf .fft .ctf .ctfinfoauto .ctfinfo .mrc \
	.prectf-f32 .ctfwnd .fft-ctfwnd \
	.box .roi .gif\
	.roiinfo-coarse .roiall-coarse .roiinforef-coarse .roiallref-coarse  .roiinfoprev-coarse .lst \
	.roiinfo        .roiall        .roiinforef        .roiallref         .roiinfoprev \
	.box2roiinfo .roiinfo2box .corinfo .divideroiinfo \
	.roilst0 .roilst .mrc3d .ds6 .mrc3dcentremed .mrc3dcentre .mrc3dcentremedpad .orimrccentre .orimrccentrewnd .oricorinfo .coarroi .coarroiinfo .roi2 .pad .mul \
	.$(INI_PDB_EXT) .$(INI_3D1_EXT) .$(INI_3DB_EXT) .$(INI_3D_EXT) .$(INI_2D_EXT) .$(INI_2D_EXT)1 .$(IN_ROI_EXT) .$(OUT_PAD_EXT) .$(3D_LIST_EXT) .$(DIV_3D_EXT) .$(FIT_3D_EXT)


#### INCLUDE ####
-include ${EOS_HOME}/tutorial/TIPS/Help/Makefile/Makefile-lib
-include IN_ROI_LIST
-include DIV_3D_LIST


#### Definition ####
TILTAXISNUMBER=2	# Single: 1 Double: 2 
ORIFILE1=DataA
TILTAXISANGLE1=90
ORIFILE2=DataB
ROTATIONANGLE=-90
#STEPTILTNUM=1
STEPTILTNUM=1

RESOLUTION=6.1

# printf ORIFILE1/2, FILENUMBER
NAMEFORMAT="%s_%03d"
# generated by "Recorder" (JEOL)
NAMEFORMAT_IMOD="%s.%03d"
# generated by IMOD "mrc2tif"
EULARANGLE=ZEYS
#ZEROTILTNUM=46
ZEROTILTNUM=06
# use only double-digit
ORIBASE=$(ORIFILE1)_0$(ZEROTILTNUM)
#MINTILTNUM=0
#MAXTILTNUM=95
MINTILTNUM=0
MAXTILTNUM=12

### top data number of the tilt angle list
TILTANGLELISTSTARTNO=0		# generated by IMOD "mrc2tif"
#TILTANGLELISTSTARTNO=1		# generated by "Recorder" (JEOL)

### get tilt angles from the *.rawtlt file (generated by FEI's software)
TILTANGLELIST=`cat $${orifile}.rawtlt`

### get tilt angles from the *_RecParam.txt file (generated by JEOL's "Recorder")
##TILTANGLELIST=`sed -ne '/^TiltXSerise:/{s/^[^-0-9.]*//;s/[^-0-9.]*$$//;p}' $${orifile}_RecParam.txt`
#TILTANGLELIST=`sed -e 's/^TiltXSerise:\([-0-9. ]*\).*$/\1/;t;d' $${orifile}_RecParam.txt`

### generate tilt angles by 'MIN + STEP * tilt-No'
### parameters for tilt angle data
MINTILTANGLE=-67.66
STEPTILTANGLE= 2.0
#TILTANGLELIST=$$( awk 'BEGIN{ \
			for (i=$(TILTANGLELISTSTARTNO); i<=$(MAXTILTNUM); i++) \
			printf("%.2f\n", $(MINTILTANGLE) + $(STEPTILTANGLE) / $(STEPTILTNUM) * (i - $(MINTILTNUM))); \
		}' )


TIFMODE=0   # for CCD
#TIFMODE=1  # for Film

SMOOTHr=1
SMOOTHm=1
SMOOTHM=1
#CENTERNX=225	#BOXSIZE / 2
#CENTERNY=225	#BOXSIZE / 2
#CENTERNZ=225	#BOXSIZE / 2
CENTERNX=32		#BOXSIZE / 2
CENTERNY=32		#BOXSIZE / 2
CENTERNZ=32		#BOXSIZE / 2

#Default.ctfinfo
DEFCTFINFO="default.ctfinfo"
PREVCTFINFO="previous.ctfinfo"

# Coarse Alignment
#ORINX=800       #ORISIZE / 2
#ORINY=800 	#ORISIZE / 2
ORINX=32       #ORISIZE / 2
ORINY=32 	#ORISIZE / 2
WINMIN=0.350       
WINMAX=0.300      
#WINMIN=0.200       
#WINMAX=0.200      
ORINZ=1
CORMODE=18

#
#
#
#ORISIZEX=1024	#original file size X
#ORISIZEY=1024	#original file size Y
#ORISIZEX=2048	#original file size X
#ORISIZEY=2048	#original file size Y
#ROISIZEX=256	#ORISIZEX / 4
#ROISIZEY=256	#ORISIZEY / 4
#PADSIZEX=512	#ROISIZEX X 2
#PADSIZEY=512	#ROISIZEY X 2
ORISIZEX=64	#original file size X
ORISIZEY=64	#original file size Y
ROISIZEX=16		#ORISIZEX / 4
ROISIZEY=16		#ORISIZEY / 4
PADSIZEX=32		#ROISIZEX X 2
PADSIZEY=32		#ROISIZEY X 2

# 
#PADSIZEX3D=900
#PADSIZEY3D=900
PADSIZEX3D=32
PADSIZEY3D=32
TILTAXISANGLE=0
#IMAGEPADm=15
#IMAGEPADm=5
IMAGEPADm=0
IMAGEPADV=0
#For Negative Staining
#IMAGEMULTIPLYINGv=-1
#For Cryo
IMAGEMULTIPLYINGv=1
IMAGESHRINK=4
MRC2MAPmul=100
SMOOTH2Dr=3

# Directories for CTF Correction
#   Subdivision images  
#
DIVIDE=N
DIVIDEFILEDIR=./divide

# Using defocus window, in which area the defocus is assumed to be vary not so much
#
USE_DEFOCUS_WINDOW=Y
DEFOCUSRANGE=800
DEFOCUSWINDOWSIZE=1.5

# Target structure name 
TARGET=Target

###For Input Data
## Size of Input Data
IN_SIZE_X=192
IN_SIZE_Y=192
IN_SIZE_Z=64
## Number of Target Data in Input Data
IN_DATA_NUM=16

## For mrc3Dto2D(Input)
# RotMode
IN_ROTMODE=$(EULARANGLE)
# Rot1
IN_ROT1MIN=0
IN_ROT1MAX=0
IN_ROT1D=10
IN_ROT1N=`expr \( $(IN_ROT1MAX) - $(IN_ROT1MIN) \) / $(IN_ROT1D) + 1`
# Rot2
IN_ROT2MIN=-60
IN_ROT2MAX=60
IN_ROT2D=10
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`
# Interpolation mode(CommonSetting: Input, Output)
IN_MODE=2
# 0:Mercator 1:Mollweide(set 0 usually)
IN_EX_MODE=0
# Noise/Signal-Ratio(if you wish no-noise, set 0)
NSRATIO=0

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

#### Rules of the list created ####
$(OUT_PAD_EXT):$(IN_ROI_LIST:.$(IN_ROI_EXT)=.$(OUT_PAD_EXT))
$(FIT_3D_EXT):$(DIV_3D_LIST:.$(DIV_3D_EXT)=.$(FIT_3D_EXT))

IN_ROI_LIST::
	touch IN_ROI_LIST
	echo "IN_ROI_LIST=\\" > 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
	
DIV_3D_LIST::
	touch DIV_3D_LIST
	echo "DIV_3D_LIST=\\" > DIV_3D_LIST
	ls -1 *.$(DIV_3D_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n |  sed s/$(DIV_3D_EXT)/$(DIV_3D_EXT)\\\\/ >> DIV_3D_LIST
	echo "" >> DIV_3D_LIST

FIT_3D_LIST::
	touch FIT_3D_LIST
	rm FIT_3D_LIST
	ls -1 *.$(FIT_3D_EXT) | sort -t - -k1,1 -k2,2 -k3,3 -k4 -n >> FIT_3D_LIST

#### Commands ####

help_ElectronTomography6::
	@echo "----- 3D Reconstruction using Eos ------------"
	@echo "#Prepare tif-series"
	@echo "make Init         ; # Prepare directories"
	@echo "make DataCreate   ; # Input .tif -> CTF Correction -> Output .mrc"
	@echo "make PreFilter    ; # Input .mrc -> Prefilter(Smoothing/Windowing) -> Output .mrcsmth "
	@echo "make CoarseAlign  ; # Input .mrcsmth -> CoarseAlingment -> Output .roi"
	@echo "make RoiSelection ; # ROI Area Selection"
	@echo "make BoxCreate    ; # Box Extraction from ROI using ROI Area Information"
	@echo "make Prefileter2  ; # Prefilter for Box"
	@echo "make roilstCreate ; # Create roilst for 3D"
	@echo "make 3D"
	@echo "--------"
	@echo "make CoarseAlignDisplay ; # using smolet(Eos)"
	@echo "make BoxCreateDisplay   ; # using smolet(Eos)"
	@echo "make roiDisplay         ; # using smolet(Eos)"
	@echo "make GIFAnim            ; # using convert"
	@echo "--------"
	@echo "make CleanDataCreate"
	@echo "make CleanCoarseAlign"
	@echo "make CleanRoiDisplay"
	@echo "make CleanBoxCreate"
	@echo "make Prefilter2"
	@echo "make Cleanroilst"
	@echo "make Clean3D"
	@echo "--------"
	@echo "RenameDataForIMOD"


#all: Init DataCreate PreFilter CoarseAlign RoiSelection BoxCreate PadAndMul roilstCreate 3D
all: PreFilter CoarseAlign RoiSelection BoxCreate roilstCreate 3D
Test::
#	make Initial
#	make $(TARGET).$(INI_3D1_EXT);
#	cp $(TARGET).$(INI_3D1_EXT) $(TARGET).$(INI_3D_EXT);
#	make $(TARGET).$(INI_2D_EXT)1;
	make TestData2DSetDouble;
	make PreFilter;
	make CoarseAlign;
	make RoiSelection
	make BoxCreate;
#	make PadAndMul;
#	make Prefilter2;
	make roilstCreate;
	make 3D;

# Initialization
Init::
	@if [ ! -d $(DIVIDEFILEDIR) ] ; \
	then \
		echo "DIVIDEFILEDIR Create"; \
		mkdir $(DIVIDEFILEDIR); \
	fi

TestRoutine::
	echo "for"
	for (( i=0; i<10; i++ )) ; do \
		echo $$i; \
	done	

# Rename data file name
RenameDataForIMOD::
	@echo "RenameDataForIMOD"
	for (( j=1; j <= $(TILTAXISNUMBER) ; j++ )) do \
		echo $$j ; \
		case "$$j" in \
			1) \
				echo "First Axis"; \
				orifile=$(ORIFILE1); \
				;; \
			2) \
				echo "Second Axis"; \
				orifile=$(ORIFILE2); \
				;; \
			*) \
				echo "Something wrong" ; \
		esac ; \
		for (( i=$(MINTILTNUM) ; i <= $(MAXTILTNUM) ; i=i+$(STEPTILTNUM) )) do \
			ori=`printf $(NAMEFORMAT) $$orifile $$i`; \
			ori_imod=`printf $(NAMEFORMAT_IMOD) $$orifile $$i`; \
			mv $$ori_imod.tif $$ori.tif ; \
		done ; \
	done

# Data Create 
DataCreate::
	@echo "DataCreate"
	for (( j=1; j <= $(TILTAXISNUMBER) ; j++ )) do \
		echo $$j ; \
		case "$$j" in \
			1) \
				echo "First Axis"; \
				orifile=$(ORIFILE1); \
				;; \
			2) \
				echo "Second Axis"; \
				orifile=$(ORIFILE2); \
				;; \
			*) \
				echo "Something wrong" ; \
		esac ; \
		tiltangles=( $(TILTANGLELIST) ) ; \
		for (( i=$(MINTILTNUM) ; i <= $(MAXTILTNUM) ; i=i+$(STEPTILTNUM) )) do \
			ori=`printf $(NAMEFORMAT) $$orifile $$i`; \
			echo $${tiltangles[i-$(TILTANGLELISTSTARTNO)]} > $$ori.tiltangle ; \
			make $$ori.tiff2mrc; \
			make $$ori.prectf; \
			make $$ori.divideroiinfo; \
			make $$ori.fft ; \
			if [ "$(USE_DEFOCUS_WINDOW)" = "Y" ] ; then \
				make $$ori.prectf-f32 ; \
				make $$ori.ctfwnd ; \
				make $$ori.fft-ctfwnd ; \
			fi ; \
			make $$ori.ctfinfo; \
			make $$ori.ctf; \
			make $$ori.mrc ; \
		done ; \
	done
#
# Subroutines for DataCreate
#
.dat.prectf:
	emData2mrc -i $*.dat -o $*.prectf

.tif.tiff2mrc:
	tiff2mrc -i $*.tif -o $*.tiff2mrc -m $(TIFMODE) -r $(RESOLUTION)

.tiff2mrc.prectf:
	#mrcImageAbnormalValueRemove -i $*.tiff2mrc -o $*.prectf -m 1 -v 6.0
	ln -sf $*.tiff2mrc $*.prectf

.prectf.prectf-f32:
	mrcImageModeChange -m 2 -i $*.prectf -o $*.prectf-f32

.prectf-f32.ctfwnd:
	mrcImageWindowing -m 18 -W `cat $*.tiltangle | awk '{ \
			m=0.005; \
			a=$$1*3.1415926/180; \
			if(a<0)a=-a; \
			tan_a=sin(a)/cos(a); \
			if(tan_a<1e-4) { \
				x=xw=-1; \
			} else { \
				w=$(DEFOCUSRANGE)/tan_a/$(RESOLUTION)/$(ORISIZEX)/2; \
				x=0.5-w; xw=0.5-w*$(DEFOCUSWINDOWSIZE); \
			} \
			if(x<m)x=m; if(xw<0)xw=0; \
			print x, xw, m, 0; \
		}'` -i $*.prectf-f32 -o $*.ctfwnd

.ctfwnd.fft-ctfwnd:
	mrcImageFFT -i $*.ctfwnd -o $*.fft-ctfwnd

# divide a image into subimages 
.prectf.divideroiinfo:
	if [ "$(DIVIDE)" = "Y" ] ; then \
		mrcImageDivideInfoForTomography -i $*.prectf -o $*.divideroiinfo.org -m 1 -d 4 ; \
		sed 's/roi/divideroi/' $*.divideroiinfo.org | awk -v DIR=$(DIVIDEFILEDIR) '{print DIR"/"$$0}'> $*.divideroiinfo ; \
		mrcImageROIs -i $*.prectf -o $*.mon -I $*.divideroiinfo -S 1 ;\
	else \
		touch $*.divideroiinfo; \
	fi

# FT of subimages
.divideroiinfo.fft:
	if [ "$(DIVIDE)" = "Y" ] ; then \
		awk '{ printf("%s\n", $$1); }' $*.divideroiinfo ; \
		for i in $$( awk '{ printf("%s\n", $$1); }' $*.divideroiinfo ) ; do \
			dividefilename=`basename $$i .divideroi`; \
			dividefiledir=`dirname $$i`; \
			dividefilename=$$dividefiledir/$$dividefilename ; \
			echo $$dividefilename; \
			mrcImageAbnormalValueRemove -i $$dividefilename.divideroi -o $$dividefilename.divideab -m 1 ; \
			mrcImagePad -i $$dividefilename.divideab -o $$dividefilename.dividepad -W $(PADSIZEX) -H $(PADSIZEY) -m 3 ; \
			mrcImageFFT -i $$dividefilename.dividepad -o $$dividefilename.fft ; \
		done ; \
		touch $*.fft; \
	else \
		mrcImageFFT -i $*.prectf -o $*.fft; \
	fi

# Estimate of sumimage CTFs
.fft.ctfinfo:
	if [ ! -f $*.ctfinfo ] ; then \
		if [ -f $(DEFCTFINFO) ]; then \
			cat $(DEFCTFINFO) > $*.ctfinfo ; \
		fi; \
		if [ -f $(PREVCTFINFO) ; ] then ; \
			for tterm in Imax Imin Inoise Isignal MTF defocus2D0 defocus2D1 defocus0axis; do \
				cmd="awk '/^$$tterm:/ {DD=¥$$2} END {print ¥"$$tterm: ¥", DD }' $(PREVCTFINFO) >> $*.ctfinfo"; \
				echo $$cmd; \
				eval $$cmd; \
			done; \
		fi ; \
	fi ; \
	if [ "$(USE_DEFOCUS_WINDOW)" = "Y" ] ; then \
		ctfDisplay -i $*.fft-ctfwnd ; \
	else \
		ctfDisplay -i $*.fft ; \
	fi
	cp $*.ctfinfo $(PREVCTFINFO) 


# CTF Correction
.ctfinfo.ctf:
	if [ "$(DIVIDE)" = "Y" ] ; then \
		for i in $$( awk '{ printf("%s\n", $$1); }' $*.divideroiinfo ) ; do \
			dividefilename=`basename $$i .divideroi`; \
			dividefiledir=`dirname $$i`; \
			dividefilename=$$dividefiledir/$$dividefilename ; \
			echo $$dividefilename; \
			mrcImageCTFCompensation -i $$dividefilename.fft -o $$dividefilename.ctf -info2 $$dividefilename.ctfinfo -m 1 2>  $$dividefilename.ctfinfo.error ; \
			mrcImageCenterGet -i $$dividefilename.ctf -o $$dividefilename.ctfcentre -Nx $(ROISIZEX) -Ny $(ROISIZEY) ; \
		done; \
		touch $*.ctf; \
	else \
		mrcImageCTFCompensation -i $*.fft -o $*.ctf -info2 $*.ctfinfo -m 1  ; \
	fi

# Merage sumimages into a single image.
.ctf.mrc:
	if [ "$(DIVIDE)" = "Y" ] ; then \
		cat $*.divideroiinfo | sed s/divideroi/ctfcentre/g > $*.divideroiinfo2 ; \
		mrcImageCTFCompensationForTiltImage -i $*.prectf -I $*.divideroiinfo2 -o $*.prerot ; \
		mrcImageRotation -i $*.prerot -o $*.mrc -a `awk 'BEGIN {print -1*$(TILTAXISANGLE1) }'` ; \
	else \
		mrcImageRotation -i $*.ctf -o $*.mrc -a `awk 'BEGIN {print -1*$(TILTAXISANGLE1) }'` ; \
	fi

#
#
# 
#
#
.SUFFIXES: .smth .wnd .mrcsmth

PreFilter::
	make Smoothing 
	make Windowing

Smoothing::
	for (( j=1 ; $$j <= $(TILTAXISNUMBER) ; j=$$(($$j + 1 )))) \
		do \
			if [ $$j -eq 1 ]; then \
				orifile=$(ORIFILE1); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
			for (( i=$(MINTILTNUM) ; $$i <= $(MAXTILTNUM) ; i=$$(($$i + $(STEPTILTNUM))))) \
				do \
					ori=`printf $(NAMEFORMAT) $$orifile $$i`; \
					echo $$ori; \
					make $$ori.smth; \
				done ; \
		done

.mrc.smth:
	mrcImageSmoothing -i $*.mrc -o $*.smth -sx $(SMOOTH2Dr) -sy $(SMOOTH2Dr) -m 1 

Windowing::
	for (( j=1 ; $$j <= $(TILTAXISNUMBER) ; j=$$(($$j + 1 )))) \
		do \
			if [ $$j -eq 1 ]; then \
				orifile=$(ORIFILE1); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
			for (( i=$(MINTILTNUM) ; $$i <= $(MAXTILTNUM) ; i=$$(($$i + $(STEPTILTNUM))))) \
				do \
					ori=`printf $(NAMEFORMAT) $$orifile $$i`; \
					echo $$ori; \
					make $$ori.wnd; \
					case "$$j" in \
						1) \
							cp $$ori.wnd $$ori.mrcsmth; \
							;; \
						2) \
							mrcImageRotation -i $$ori.wnd -o $$ori.mrcsmth -a $(ROTATIONANGLE) ; \
							;; \
					esac;  \
				done ; \
		done

.smth.wnd:
	mrcImageWindowing -i $*.smth -o $*.wnd -m 16

####
####

CoarseAlign::
	for (( j=1 ; j <= $(TILTAXISNUMBER) ; j++ )) \
		do \
			if [ $$j -eq 1 ]; then \
				orifile=$(ORIFILE1); \
				oribase=$(ORIFILE1)_0$(ZEROTILTNUM); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
			ORIZEROFILE=$$oribase.mrcsmth; \
			previous=$$oribase ; \
			echo "Create the zero-tilt Image ROI (same as mrcsmth, just copy)"; \
			make $$oribase.roiinfo-coarse; echo "$$oribase.roi will be created."; \
			make $$oribase.roiall-coarse ; echo "$$oribase.roi was created." ; \
			make $$oribase.orimrccentre  ; echo "The centre of $$oribase.roi was created." ; \
			make $$oribase.orimrccentrewnd  ; echo "The window of $$oribase.roi was created." ; \
			for delta in +$(STEPTILTNUM) -$(STEPTILTNUM) ; do \
			echo "$$delta"; \
			previous=$$oribase; \
			TOTALX=0 ; \
			TOTALY=0 ; \
			echo "Total: $$TOTALX $$TOTALY" > $$previous.oricorinfo; \
			for (( i=$$(($(ZEROTILTNUM) + $$delta )) ; (( $(MINTILTNUM) <= $$i && $$i <= $(MAXTILTNUM)  )) ; i=$$(($$i + $$delta)) )) \
				do \
					ori=`printf $(NAMEFORMAT) $$orifile $$i`; \
					echo $$i, $(MAXTILTNUM), $(MINTILTNUM); \
					echo $$previous > $$ori.prevname ; \
					ln -sf $$previous.roiinfo-coarse $$ori.roiinfoprev-coarse ; make $$ori.roiinforef-coarse ; \
					make $$ori.roiallref-coarse ; \
					make $$ori.orimrccentre ;     \
					make $$ori.orimrccentrewnd ;  \
					TOTALX=`awk '/Total:/ { print $$2 }' $$previous.oricorinfo`; \
					TOTALY=`awk '/Total:/ { print $$3 }' $$previous.oricorinfo`; \
					ln -sf $$previous.orimrccentrewnd $$ori.oriref ; make $$ori.oricorinfo ; \
					echo "TotalPrev: $$TOTALX $$TOTALY" >> $$ori.oricorinfo; \
					make $$ori.roiinfo-coarse; \
					make $$ori.roiall-coarse; \
					make $$ori.orimrccentre    ; \
					make $$ori.orimrccentrewnd ; sleep 1; \
					touch $$ori.oricorinfo   ; sleep 1; \
					touch $$ori.roiinfo-coarse; sleep 1; \
					touch $$ori.roiall-coarse; sleep 1; \
					previous=$$ori; \
				done ; \
			echo $$i; \
			done ; \
		done

CleanCoarseAlign::
	rm *.roicorinfo *.roiinfo-coarse *.roiall-coarse *.roiref-coarse *roiinfoprev-coarse *.roi *.roiallref-coarse *.orimrccentre *.orimrccentrewnd *.oricorinfo 

### Create roiinfo for ZEROTILT ROI(centre)
$(ORIFILE1)_0$(ZEROTILTNUM).roiinfo-coarse:
	printf "$(NAMEFORMAT).roi Rect2 %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f\n" $(ORIFILE1) $(ZEROTILTNUM) $$(($(ORISIZEX)/2)) $$(($(ORISIZEY)/2)) $(ORISIZEX) $(ORISIZEY) > $(ORIFILE1)_0$(ZEROTILTNUM).roiinfo-coarse 

$(ORIFILE2)_0$(ZEROTILTNUM).roiinfo-coarse:
	printf "$(NAMEFORMAT).roi Rect2 %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f\n" $(ORIFILE2) $(ZEROTILTNUM) $$(($(ORISIZEX)/2)) $$(($(ORISIZEY)/2)) $(ORISIZEX) $(ORISIZEY) > $(ORIFILE2)_0$(ZEROTILTNUM).roiinfo-coarse 

### Calculate Correlation between primrccentre and oriref
.orimrccentre.oricorinfo:
	echo "orimrccentre -> oricorinfo: SHIFT:= current.orimrccentre for prev.oirmrccentre"
	mrcImageCorrelation -i $*.orimrccentre -r $*.oriref -corInfo $*.oricorinfo -o $*.oricormap -m $(CORMODE) -s $*.orishift

### Create roiinfo for ROI(centre)
.oricorinfo.roiinfo-coarse:
	TOTALX=`awk '/TotalPrev:/ { print $$2 }' $*.oricorinfo`; \
	TOTALY=`awk '/TotalPrev:/ { print $$3 }' $*.oricorinfo`; \
	SHIFTX=`awk '/Shift:/ { print $$2 }' $*.oricorinfo`; \
	SHIFTY=`awk '/Shift:/ { print $$3 }' $*.oricorinfo`; \
	echo "$$TOTALX,$$TOTALY"; \
	echo "$$SHIFTX,$$SHIFTY"; \
	if [ $$(($(ORINX)/2)) -lt $$SHIFTX ]; then  \
		SHIFTX=$$(($$SHIFTX - $(ORINX))) ; \
	fi ; \
	if [ $$(($(ORINY)/2)) -lt $$SHIFTY ]; then  \
		SHIFTY=$$(($$SHIFTY - $(ORINY))) ; \
	fi ; \
	TOTALX=$$(($$TOTALX + $$SHIFTX)) ; \
	TOTALY=$$(($$TOTALY + $$SHIFTY)) ; \
	echo "Total: $$TOTALX $$TOTALY" >> $*.oricorinfo; \
	printf "%s.roi Rect2 %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f\n" $* $$(($(ORISIZEX)/2+$$TOTALX)) $$(($(ORISIZEY)/2+$$TOTALY)) $(ORISIZEX) $(ORISIZEY) $$TOTALX $$TOTALY > $*.roiinfo-coarse ;

### Create ROI for ROI
.roiinfo-coarse.roiall-coarse:
	make $*.mrcsmth
	mrcImageROIs -i $*.mrcsmth -I $*.roiinfo-coarse
	echo "ROI Created"
	touch $*.roiall-coarse 

### Create ROI for reference
.roiinfoprev-coarse.roiinforef-coarse:
	previous=`cat $*.prevname`; \
	sed -e s/$$previous/$*/ $*.roiinfoprev-coarse  > $*.roiinforef-coarse
#	sed -s s/$$previous/$*/ $*.roiinfoprev-coarse  > $*.roiinforef-coarse

.roiinforef-coarse.roiallref-coarse:
	mrcImageROIs -i $*.mrcsmth -I $*.roiinforef-coarse
	touch $*.roiallref-coarse

###
.roi.orimrccentre:
	echo "roi -> orimrccentre"
	mrcImageCenterGet -i $*.roi -o $*.orimrccentre -Nx $(ORINX) -Ny $(ORINY) -Nz $(ORINZ)

.orimrccentre.orimrccentrewnd:
	mrcImageWindowing -i $*.orimrccentre -o $*.orimrccentrewnd -m 18 \
		-W $(WINMIN) $(WINMAX) $(WINMIN) $(WINMAX)
	#mv $*.wnd $*.orimrccentre

### Check CoarseAlign by smolet
CoarseAlignDisplay:
	make CoarseAlign.lst
	smolet -i CoarseAlign
	
CoarseAlign.lst:
	rm -f CoarseAlign.lst
	for i in `ls -1 *.mrc`; do  \
		BASE=`basename $$i .mrc`; \
		make $$BASE.lst ; \
		echo $$BASE.roi.tif >> CoarseAlign.lst ; \
	done

.roi.lst:
	mrc2tiff -i $*.roi -o $*.roi.tif -I
	ln -sf $*.roi.tif $*.lst

GIFAnim:
	for i in `ls -1 *.roi`; do  \
		BASE=`basename $$i .roi`; \
		make $$BASE.gif ; \
	done
	convert -delay 10 -loop 0 *.gif COASE.GIF
	
.lst.gif:
	convert -geometry 50%x50% $*.roi.tif $*.gif
	
######################################################	
#
# ROI Selection 
#

RoiSelection:
	Display2 -i $(ORIBASE).mrcsmth 
	if [ -f $(ORIBASE).mrcsmth.roiinfo  ]  ; then \
		cp $(ORIBASE).mrcsmth.roiinfo $(ORIBASE).roiinfo; \
	fi
	mv  $(ORIBASE).roiinfo  $(ORIBASE).roiinfo.org
	sed -e s/.mrcsmth// $(ORIBASE).roiinfo.org > $(ORIBASE).roiinfo
	mrcImageROIs -i  $(ORIBASE).mrcsmth -I  $(ORIBASE).roiinfo
#	if [ $(TILTAXISNUMBER) -eq 2 ]; then \
#		Display2 -i $(ORIFILE2)_0$(ZEROTILTNUM).mrc ;\
#	fi; \
		

BoxCreate::
	for (( j=1 ; $$j <= $(TILTAXISNUMBER) ; j=$$(($$j + 1 )))) \
		do \
			if [ $$j -eq 1 ]; then \
				orifile=$(ORIFILE1); \
				oribase=$(ORIFILE1)_0$(ZEROTILTNUM); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
			BASE=$$oribase; \
			make $$BASE.roiall ; \
			for delta in +$(STEPTILTNUM) -$(STEPTILTNUM) ; \
				do \
					echo $$delta,$$BASE ;  \
					previous=$$BASE	; \
					for (( i=$$(($(ZEROTILTNUM)+$$delta)) ; (( $(MINTILTNUM) <= $$i && $$i <= $(MAXTILTNUM) )) ; i=$$(($$i + $$delta)) )) \
						do  \
							name=`printf "$(NAMEFORMAT)" $$orifile $$i`; \
							echo ">>>> $$name $$i start: $(ZEROTILTNUM) $$(($(ZEROTILTNUM)+$$delta))"; \
							echo $$previous > $$name.prevname; \
							ln -sf $$previous.roiinfo $$name.roiinfoprev ; sleep 1; \
							make $$name.roiinforef ; \
							make $$name.roiinfo ; \
							make $$name.roiall ; \
							previous=$$name ; \
						done  ; \
				done ; \
		done

CleanBoxCreate::
	rm *.roiall *.roiinfoprev *.roiinforef 

CleanDataCreate::
	rm *.ctf *.ctfinfo *.divideroiinfo *.fft *.mrc *.prectf

CleanRoiDisplay::
	rm *.roiall *.roiinfoprev *.roiinforef *.pad *.roi.tif *.lst *.roiinfo *.roilst

.roiinfo.roiall:
	make $*.roi
	mrcImageROIs -i $*.roi -I $*.roiinfo
	touch $*.roiall

.roiinforef.roiallref:
	mrcImageROIs -i $*.roi -I $*.roiinforef
	touch $*.roiallref

.roi.corinfo:
	mrcImageWindowing -i $*.ref -o $*.refwin -W 0.35 0.2 0.35 0.2 -m 18
	mrcImageCorrelation -i $*.roi -r $*.refwin -corInfo $*.corinfo  -m $(CORMODE)

.roiinforef.roiinfo:
	# Extract ROIs using roiinfo of previous image (roiinforef)
	previous=`cat $*.prevname`; \
	echo $$previous; \
	echo "start initial ROI"; \
	make $*.roiallref ; \
	ROINUM=`wc -l $*.roiinforef | awk '{print $$1}'` ; \
	echo $$ROINUM ; \
	rm -f $*.roiinfo ; \
	for (( j=0 ; $$j < $$ROINUM ; j=$$(($$j+1)))) \
	do  \
		input=`printf "%s-%04d" $*         $$j`; \
		refer=`printf "%s-%04d" $$previous $$j`; \
		echo $$input, $$refer ; \
		ln -sf $$refer.roi $$input.ref ; \
		echo "correlation"; ls -l $$input.ref $$input.roi ;  \
		make $$input.corinfo ; \
		SHIFTX=`awk '/Shift:/ { print $$2 }' $$input.corinfo`; \
		SHIFTY=`awk '/Shift:/ { print $$3 }' $$input.corinfo`; \
		echo "$$SHIFTX,$$SHIFTY,$$input"; \
		awk -v SHIFTXAWK0=$$SHIFTX -v SHIFTYAWK0=$$SHIFTY -v NAMEAWK=$$input -v BASEAWK=$* \
		 ' /'"$$input"'/ { \
			SizeX = int(sqrt(($$5-$$3)*($$5-$$3)+( $$6-$$4)*( $$6-$$4))+0.5)+1; \
			SizeY = int(sqrt(($$9-$$3)*($$9-$$3)+($$10-$$4)*($$10-$$4))+0.5)+1; \
		 	if(SizeX/2<SHIFTXAWK0) { \
				SHIFTXAWK0 -= SizeX ; \
			} \
			if(SizeY/2<SHIFTYAWK0) { \
				SHIFTYAWK0 -= SizeY ; \
			} \
			Angle = atan2($$6-$$4, $$5-$$3) ; \
			SHIFTXAWK = +1*( SHIFTXAWK0*cos(Angle) - SHIFTYAWK0*sin(Angle)); \
			SHIFTYAWK = +1*( SHIFTXAWK0*sin(Angle) + SHIFTYAWK0*cos(Angle)); \
			printf("%s-%04d.roi Rect %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f %15.6f\n", BASEAWK, FNR-1, $$3+SHIFTXAWK, $$4+SHIFTYAWK, $$5+SHIFTXAWK, $$6+SHIFTYAWK, $$7+SHIFTXAWK, $$8+SHIFTYAWK, $$9+SHIFTXAWK, $$10+SHIFTYAWK, SHIFTXAWK, SHIFTYAWK, Angle*180/3.141592653589793238, SizeX, SizeY);}' \
		 $*.roiinforef | tee -a $*.roiinfo ; \
	done ; 

.roiinfoprev.roiinforef:
	previous=`cat $*.prevname`; \
	sed -e s/$$previous/$*/ $*.roiinfoprev  > $*.roiinforef
#	sed -s s/$$previous/$*/ $*.roiinfoprev  > $*.roiinforef

### Check BoxCreate by smolet
BoxCreateDisplay:
	for i in `ls -1 *.mrc`;do \
		BASE=`basename $$i .mrc`; \
		echo "$$BASE";\
		make $$BASE.box ;\
	done
	smolet -i CoarseAlign
	
.roiinfo.box:
	awk '{ print $$3, $$4,	$$5-$$3, $$10-$$4 ,-3}' $*.roiinfo > $*.roi.box

###
Prefilter2::
	for (( k=1 ; $$k <= $(TILTAXISNUMBER) ; k=$$(($$k + 1 )))) do \
		if [ $$k -eq 1 ]; then \
			orifile=$(ORIFILE1); \
		else \
			orifile=$(ORIFILE2); \
		fi ; \
		oribase=`printf "$(NAMEFORMAT)" $$orifile $(ZEROTILTNUM)`; \
		roiNum=`wc -l  $$oribase.roiinfo | awk '{print $$1}' `; \
		for ((i=$(MINTILTNUM);i<=$(MAXTILTNUM);i=$$(($$i+$(STEPTILTNUM))) )) do \
			for((j=0;j<$$roiNum;j=$$(($$j+1)))) do \
				name=`printf "$(NAMEFORMAT)-%04d" $$orifile $$i $$j` ; \
				echo $$(($$i-$(ZEROTILTNUM))) > $$name.tilt ; \
				zangle=`head -n $$(($$j + 1)) $$oribase.roiinfo | tail -n 1 | awk '{ dy=$$6-$$4; dx=$$5-$$3; print -1.0*atan2(dy, dx)/3.141592653589793238*180.0; }' `; \
				ln -sf $$name.roi $$name.roi2 ; make ZANGLE=$$zangle $$name.pad ; \
				make $$name.mul ; \
			done ; \
		done ; \
	done

CleanPrefilter2::
	rm *.pad

.roi2.pad:
	tilt=`cat $*.tiltangle` ; \
	echo $$tilt ; \
	mrcImagePad -i $*.roi2 -o $*.pad -H $(PADSIZEX3D) -W $(PADSIZEY3D) -Tilt $(ZANGLE) $$tilt -m $(IMAGEPADm) -V $(IMAGEPADV) 

.pad.mul:
	mrcImageMultiplying -i $*.pad -o $*.mulreal -v $(IMAGEMULTIPLYINGv)
	mrcImageShrink -i $*.mulreal -o $*.mul -S $(IMAGESHRINK)

roilstCreate::
#			oribase=`printf "$(NAMEFORMAT)" $$orifile $(ZEROTILTNUM)`;
	for (( k=1 ; $$k <= $(TILTAXISNUMBER) ; k=$$(($$k + 1 )))) do \
			if [ $$k -eq 1 ]; then \
				orifile=$(ORIFILE1); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
			oribase=`printf "$(NAMEFORMAT)" $(ORIFILE1) $(ZEROTILTNUM)`; \
			roiNum=`wc -l  $$oribase.roiinfo | awk '{print $$1}' `; \
			echo "ROIAreaNumber: $$roiNum"; \
			for (( i=0 ; $$i < $$roiNum ; i=$$(($$i + 1)))) do \
					tiltnum=`printf "%s%04d" $$orifile $$i`; echo $$tiltnum; \
					zangle=`head -n $$(($$i + 1)) $$oribase.roiinfo | tail -n 1 | awk '{ dy=$$6-$$4; dx=$$5-$$3; print -1.0*atan2(dy, dx)/3.141592653589793238*180.0; }' `; \
					echo "$$i" > $$tiltnum.roilst0; \
					make ORIFILE=$$orifile ZANGLE=$$zangle $$tiltnum.roilst ; \
			done ; \
	done ; \
	roiNum=`wc -l  $$oribase.roiinfo | awk '{print $$1}' `; \
	echo $$roiNum; \
	for (( i=0 ; $$i < $$roiNum ; i=$$(($$i + 1)))) do \
			tiltnum=`printf "%04d" $$i`; \
			echo "$$i" > $$tiltnum.roilst0; \
			rm -f $$tiltnum-d.roist; \
			cat $(ORIFILE1)$$tiltnum.roilst >> $$tiltnum-d.roilst ; \
			cat $(ORIFILE2)$$tiltnum.roilst >> $$tiltnum-d.roilst ; \
	done

Cleanroilst::
	rm *.roilst

.roilst0.roilst:
#				printf "%s %s %f %f %f\n" $$orifiletilt-$$num.mul $(EULARANGLE) $(ZANGLE) $$angle 0 >> $*.roilst ; \
#				printf "%s %s %f %f %f\n" $$orifiletilt-$$num.mul $(EULARANGLE) $(ZANGLE) 0 $$angle >> $*.roilst ;
		i=`cat $*.roilst0`; \
		orifile=$(ORIFILE); \
		oribase=`printf "$(NAMEFORMAT)" $$orifile $(ZEROTILTNUM)`; \
		num=`printf "%04d" $$i`; \
		roiname=`printf "%s-%04d" $$oribase $$i`; \
		echo "$$roiname in $$oribase.roiinfo"; \
		if [ $$orifile = $(ORIFILE1) ]; then \
			echo "$*.roilst creating" ; \
			rm $*.roilst ; \
			for ((i=$(MINTILTNUM);i<=$(MAXTILTNUM);i=$$(($$i+$(STEPTILTNUM))) )) do \
				orifiletilt=`printf "$(NAMEFORMAT)" $$orifile $$i` ; \
				angle=`cat $$orifiletilt.tiltangle` ; \
				printf "%s %s %f %f %f\n" $$orifiletilt-$$num.roi $(EULARANGLE) $(ZANGLE) $$angle 0 >> $*.roilst ; \
			done ; \
		elif [ $$orifile = $(ORIFILE2) ]; then  \
			echo "$*.roilst creating" ; \
			rm $*.roilst ; \
			for ((i=$(MINTILTNUM);i<=$(MAXTILTNUM);i=$$(($$i+$(STEPTILTNUM))) )) do \
				if [ $$i -ne $(ZEROTILTNUM) ]; then \
					orifiletilt=`printf "$(NAMEFORMAT)" $$orifile $$i` ; \
					angle=`cat $$orifiletilt.tiltangle` ; \
					printf "%s %s %f %f %f\n" $$orifiletilt-$$num.roi $(EULARANGLE) $(ZANGLE) 0 $$angle >> $*.roilst ; \
				fi; \
			done ; \
		else \
			echo "Filename is strange!" ; \
			exit; \
		fi

roiDisplay:
	roiLst=`ls -1 *-d.roilst`;  \
	echo $$roiLst; \
	for i in $$roiLst; do \
		echo $$i; \
		BASE=`basename $$i .roilst`; \
		echo $$BASE; \
		awk '/mul/ { gsub(/mul/, "lst"); print $$1 }' $$i > $$BASE.lst ; \
		for j in `cat $$BASE.lst`; do \
			make $$j; \
		done ; \
		smolet -i $$BASE; \
	done

3D::
	roiNum=`ls -1 *-d.roilst | wc -l `; \
	echo $$roiNum; \
	for (( i=0 ; $$i < $$roiNum ; i=$$(($$i + 1)) )) \
	do \
		tiltnum=`printf "%04d-d" $$i`; \
		make $$tiltnum.mrc3d ; \
		make $$tiltnum.mrc3dcentre ; \
		make $$tiltnum.mrc3dcentremed ; \
		make $$tiltnum.mrc3dcentremedpad ; \
		make $$tiltnum.ds6 ; \
	done ;
#	for (( j=1 ; $$j <= $(TILTAXISNUMBER) ; j=$$(($$j + 1 )))) \
		do \
			if [ $$j -eq 1 ]; then \
				orifile=$(ORIFILE1); \
			else \
				orifile=$(ORIFILE2); \
			fi ; \
	roiNum=`ls -1 $$orifile*.roilst | wc -l `; \
	echo $$roiNum; \
	for (( i=0 ; $$i < $$roiNum ; i=$$(($$i + 1)) )) \
		do \
			tiltnum=`printf "%s%04d" $$orifile $$i`; \
			make $$tiltnum.mrc3d ; \
			make $$tiltnum.mrc3dcentre ; \
			make $$tiltnum.mrc3dcentremed ; \
			make $$tiltnum.mrc3dcentremedpad ; \
			make $$tiltnum.ds6 ; \
		done ; \
	done

Clean3D::
	rm *.mrc3d

.roilst.mrc3d:
	mrc2Dto3D -I $*.roilst -o $*.mrc3d -single 0 -InterpolationMode 2 -m 1 
	
.mrc3d.mrc3dcentre:
	mrcImageCenterGet -i $*.mrc3d -o $*.mrc3dcentre -Nx $(CENTERNX) -Ny $(CENTERNY) -Nz $(CENTERNZ)

.mrc3dcentre.mrc3dcentremed:
	mrcImageSmoothing -i $*.mrc3dcentre -o $*.mrc3dcentremed -r $(SMOOTHr) -m $(SMOOTHm) -M $(SMOOTHM)

.mrc3dcentremed.mrc3dcentremedpad:
	 mrcImage3DPad -i $*.mrc3dcentremed -o $*.mrc3dcentremedpad -r 90 -m 1 -M 1 -v 0

.mrc3dcentremedpad.ds6:
	mrc2map -i $*.mrc3d -o $*.ds6 -mul $(MRC2MAPmul)
	mrc2map -i $*.mrc3dcentre -o $*.centre.ds6 -mul $(MRC2MAPmul)
	mrc2map -i $*.mrc3dcentremed -o $*.centremed.ds6 -mul $(MRC2MAPmul)
	mrc2map -i $*.mrc3dcentremedpad -o $*.centremedpad.ds6 -mul $(MRC2MAPmul)

#### Commands(Add later) ####
Initial::
	make $(TARGET).$(INI_3D1_EXT);
#	make $(TARGET).$(INI_3DB_EXT);
#	make $(TARGET).$(INI_3D_EXT);
	cp $(TARGET).$(INI_3D1_EXT) $(TARGET).$(INI_3D_EXT);
#	make $(TARGET).$(INI_2D_EXT);
	make $(TARGET).$(INI_2D_EXT)1;
#	make TestData2DSet;
	make TestData2DSetDouble;

TestData2DSet::
	mrcInfo -i $(TARGET).$(INI_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).$(INI_2D_EXT) -o $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) -z $$LoopNum; \
		i=`expr $$LoopNum + 1`; \
		ori=`printf "%s_%03d" $(ORIFILE) $$i`; \
		ln -sf $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) $$ori.mrc; \
	done;
	
TestData2DSetDouble::
	mrcInfo -i $(TARGET).$(INI_2D_EXT)1 -o INFO;
	@orifile=$(ORIFILE1); \
	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).$(INI_2D_EXT)1 -o $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) -z $$LoopNum; \
		ori=`printf $(NAMEFORMAT) $$orifile $$LoopNum`; \
		echo $$rot2 > $$ori.tiltangle ; \
		ln -sf $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) $$ori.mrc; \
	done;
	mrcInfo -i $(TARGET).$(INI_2D_EXT)2 -o INFO;
	@orifile=$(ORIFILE2); \
	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).$(INI_2D_EXT)2 -o $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) -z $$LoopNum; \
		ori=`printf $(NAMEFORMAT) $$orifile $$LoopNum`; \
		echo $$rot2 > $$ori.tiltangle ; \
		ln -sf $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_ROI_EXT) $$ori.mrc; \
	done;

3DAverage::
	make DIV_3D_LIST;
	i=0; \
	tiltnum=`printf "%s-%04d" $(ORIFILE) $$i`; \
	cp $$tiltnum.$(DIV_3D_EXT) $(TARGET).$(DIV_3D_EXT)ref;
	make $(FIT_3D_EXT);
	make FIT_3D_LIST;
	mrcImageAverage -i FIT_3D_LIST -o $(TARGET).$(AVE_3D_EXT);

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

.$(INI_3D1_EXT).$(INI_3DB_EXT):
# Adjustment is required to move with the rotation of this loop.
	mrcInfo -i $*.$(INI_3D1_EXT) | head -5 > INFO;
	length=$$(tail -1 INFO | awk '{printf("%f", $$4)}'); \
	sizex=$$(head -1 INFO | awk '{printf("%d", $$4 * 0.6)}'); \
	sizey=$$(head -1 INFO | awk '{printf("%d", $$5 * 0.6)}'); \
	sizez=$$(head -1 INFO | awk '{printf("%d", $$6 * 0.6)}'); \
	mrcImageNullImageCreate -o $*.$(INI_3DB_EXT) -d $$length -Nx $(IN_SIZE_X) -Ny $(IN_SIZE_Y) -Nz $(IN_SIZE_Z); \
	for (( LoopNum = 0; LoopNum < $(IN_DATA_NUM); LoopNum++ )) \
	do \
		echo "Add: $$LoopNum / $(IN_DATA_NUM)"; \
		rot1=$$(echo "$$LoopNum * 23 % 360" | bc); \
		rot2=$$(echo "$$LoopNum * 37 % 360" | bc); \
		mrcImageRotation3D -i $*.$(INI_3D1_EXT) -o $*.tmp -EA XEYR $$LoopNum $$rot1 $$rot2 0; \
		mrcImage3DPad -i $*.tmp -o $*.tmp2 -Nx $(IN_SIZE_X) -Ny $(IN_SIZE_Y) -Nz $(IN_SIZE_Z) -M 1 -v 0; \
		shiftx=$$(echo "( $(IN_SIZE_X) - $$sizex ) / 2 - ( $$LoopNum * 37 ) % ( $(IN_SIZE_X) - $$sizex )" | bc); \
		shifty=$$(echo "( $(IN_SIZE_Y) - $$sizey ) / 2 - ( $$LoopNum * 10 ) % ( $(IN_SIZE_Y) - $$sizey )" | bc); \
		shiftz=$$(echo "( $(IN_SIZE_Z) - $$sizez ) / 2 - ( $$LoopNum * 17 ) % ( $(IN_SIZE_Z) - $$sizez )" | bc); \
		mrcImageShift -i $*.tmp2 -o $*.tmp3 -x $$shiftx -y $$shifty -z $$shiftz; \
		cp $*.$(INI_3DB_EXT) $*.$(INI_3DB_EXT)tmp; \
		mrcImageAdd -i1 $*.$(INI_3DB_EXT)tmp -i2 $*.tmp3 -o $*.$(INI_3DB_EXT); \
	done;
	rm $*.tmp;
	rm $*.tmp2;
	rm $*.tmp3;
	rm $*.$(INI_3DB_EXT)tmp;

.$(INI_3DB_EXT).$(INI_3D_EXT):
	mrcImageNoiseAdd -i $*.$(INI_3DB_EXT) -o $*.$(INI_3D_EXT) -NS $(NSRATIO);

.$(INI_3D_EXT).$(INI_2D_EXT):
	mrc3Dto2D -i $*.$(INI_3D_EXT) -o $*.$(INI_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);

.$(INI_3D_EXT).$(INI_2D_EXT)1:
	mrc3Dto2D -i $*.$(INI_3D_EXT) -o $*.$(INI_2D_EXT)1 -EulerMode $(IN_ROTMODE) \
				-Rot1 0 0 $(IN_ROT1D) \
				-Rot2 $(IN_ROT2MIN) $(IN_ROT2MAX) $(IN_ROT2D) \
				-Rot3 0 0 $(IN_ROT3D) \
				-m $(IN_EX_MODE) -InterpolationMode $(IN_MODE);
	mrc3Dto2D -i $*.$(INI_3D_EXT) -o $*.$(INI_2D_EXT)2 -EulerMode $(IN_ROTMODE) \
				-Rot1 90 90 $(IN_ROT1D) \
				-Rot2 $(IN_ROT2MIN) $(IN_ROT2MAX) $(IN_ROT2D) \
				-Rot3 0 0 $(IN_ROT3D) \
				-m $(IN_EX_MODE) -InterpolationMode $(IN_MODE);

.$(DIV_3D_EXT).$(FIT_3D_EXT):
	mrcImageAutoRotationCorrelation3D -i $*.$(DIV_3D_EXT) -r $(TARGET).$(DIV_3D_EXT)ref -fit $*.$(FIT_3D_EXT) -EA XEYR -Rot1 0 355 5 -Rot2 0 355 5 -Rot3 0 0 30 -M 18;
#	mrcImageAutoRotationCorrelation3D -i $*.$(DIV_3D_EXT) -r $(TARGET).$(DIV_3D_EXT)ref -fit $*.$(FIT_3D_EXT) -EA XEYR -Rot1 0 355 5 -Rot2 0 355 5 -Rot3 0 0 30 -Xrange 0 0 -Yrange 0 0 -Zrange 0 0 -M 18;
