#
#	This is a sample Makefile for electron tomography.
#

#### Input extention and listname ####
# For mrcImageCorrelation
IN_CORR_EXT=mask

# For mrc2tiff
IN_TIFF_EXT=fit

# For mrcImageNoiseAdd
IN_NOISE_EXT=roi

# For mrcImageWindowing
IN_MASK_EXT=nroi

# For mrcImageTiltAxisSearch
IN_TILT_EXT=fit

# For Reconstruction
#IN_3D_EXT=fit
IN_3D_EXT=fit

#### INCLUDE ####
.SUFFIXES: .roi .nroi .mask .tiff .3dlst .3d .fit .tiltinfo .sino .3dradonlst .3dradon .$(IN_TIFF_EXT) .$(IN_CORR_EXT) .$(IN_NOISE_EXT) .$(IN_MASK_EXT) .$(IN_TILT_EXT) .$(IN_TILT_EXT)tmp .$(IN_3D_EXT)

SHELL=/bin/bash

-include IN_NOISE_LIST
-include IN_MASK_LIST
-include IN_CORR_LIST_plus
-include IN_CORR_LIST_minus
-include IN_3D_LIST
-include IN_TIFF_LIST

#### Definition ####

# Initial Reference Model 
#INITIAL=Initial
INITIAL=1WDC-shift1
#INITIAL=1WDC-9Set
# Target structure name 
TARGET=Input

### For mrc3Dto2D
# RotMode
#ROTMODE=YOYR
ROTMODE=ZOYS
# Rot1
ROT1MIN=10
ROT1MAX=10
ROT1D=10
ROT1N=`expr \( $(ROT1MAX) - $(ROT1MIN) \) / $(ROT1D) + 1`
# Rot2
ROT2MIN=-60
ROT2MAX=60
ROT2D=2
ROT2N=`expr \( $(ROT2MAX) - $(ROT2MIN) \) / $(ROT2D) + 1`
# Rot3
ROT3MIN=0
ROT3MAX=0
ROT3D=30
ROT3N=`expr \( $(ROT3MAX) - $(ROT3MIN) \) / $(ROT3D) + 1`
# Expansion mode
# 0:Mercator 1:Mollweide
EX_MODE=1
# Interpolation mode : Common with mrc2Dto3D
IN_MODE=2

### For mrcImageMove
SHIFT2MAX=10
SHIFT3MAX=0

### For mrcImageNoiseAdd
SNRATIO=3

# For mrcImageWindowing
MASK_X=0.2
MASK_X_MAX=0.2
MASK_Y=0.1
MASK_Y_MAX=0.1
MASK_MODE=18

### For mrcImageCorrelation
# mode
COR_MODE=18
# Reference angle: Rot2, 3 is Usually 0
ROT1REF=$(ROT1MIN)
ROT2REF=0
ROT3REF=0

### For mrcImageTiltAxisSearch
TILTMIN=0
TILTMAX=20
TILTN=10
TILTITER=1
TILTSCALE=5

### For mrc2Dto3D
# mode
# 0:Simple Back Projection 1:Filter Back Projection
PRJ_MODE=1
# single (Tilt Axis)
# 0:X-axis 1:Y-axis
AXIS1=1

### RadonTransform
PD=2.5
PHID=10
THETAD=10
RBP_MODE=1

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

nroi:$(IN_NOISE_LIST:.$(IN_NOISE_EXT)=.nroi)
mask:$(IN_MASK_LIST:.$(IN_MASK_EXT)=.mask)
fit_plus:$(IN_CORR_LIST_plus:.$(IN_CORR_EXT)=.fit)
fit_minus:$(IN_CORR_LIST_minus:.$(IN_CORR_EXT)=.fit)
sino:$(IN_3D_LIST:.$(IN_3D_EXT)=.sino)
tiff:$(IN_TIFF_LIST:.$(IN_TIFF_EXT)=.tiff)
	
IN_NOISE_LIST::
	touch IN_NOISE_LIST
	echo "IN_NOISE_LIST=\\" > IN_NOISE_LIST
	ls -1 *.$(IN_NOISE_EXT) |  sed s/$(IN_NOISE_EXT)/$(IN_NOISE_EXT)\\\\/ >> IN_NOISE_LIST
	echo "" >> IN_NOISE_LIST
	
IN_MASK_LIST::
	touch IN_MASK_LIST
	echo "IN_MASK_LIST=\\" > IN_MASK_LIST
	ls -1 *.$(IN_MASK_EXT) |  sed s/$(IN_MASK_EXT)/$(IN_MASK_EXT)\\\\/ >> IN_MASK_LIST
	echo "" >> IN_MASK_LIST
	
IN_TILT_LIST::
	touch IN_TILT_LIST
	rm IN_TILT_LIST
	ls -1 *.$(IN_TILT_EXT) >> IN_TILT_LIST
	
IN_3D_LIST::
	touch IN_3D_LIST
	echo "IN_3D_LIST=\\" > IN_3D_LIST
	ls -1 *.$(IN_3D_EXT) |  sed s/$(IN_3D_EXT)/$(IN_3D_EXT)\\\\/ >> IN_3D_LIST
	echo "" >> IN_3D_LIST
	
IN_TIFF_LIST::
	touch IN_TIFF_LIST
	echo "IN_TIFF_LIST=\\" > IN_TIFF_LIST
	ls -1 *.$(IN_TIFF_EXT) |  sed s/$(IN_TIFF_EXT)/$(IN_TIFF_EXT)\\\\/ >> IN_TIFF_LIST
	echo "" >> IN_TIFF_LIST

#### Commands ####
Help::
	@echo "This is a sample Makefile for electron tomography."

TestData::
	@for (( rot1 = $(ROT1MIN); rot1 <= $(ROT1MAX); rot1 += $(ROT1D) )) \
	do \
	for (( rot2 = $(ROT2MIN), shift2 = -$(SHIFT2MAX); rot2 <= $(ROT2MAX); rot2 += $(ROT2D), shift2 = ( ( $$rot2 + $(ROT2D) ) * $(SHIFT2MAX) ) / ( $(ROT2MAX) + 1 ) )) \
	do \
	for (( rot3 = $(ROT3MIN), shift3 = -$(SHIFT3MAX); rot3 <= $(ROT3MAX); rot3 += $(ROT3D), shift3 = ( ( $$rot3 + $(ROT3D) ) * $(SHIFT3MAX) ) / ( $(ROT3MAX) + 1 ) )) \
	do \
		echo $$rot1, $$rot2, $$rot3, $$shift2, $$shift3; \
		mrc3Dto2D -i $(INITIAL).3d -o $(TARGET)-$$rot1-$$rot2-$$rot3.roitmp \
				  -InterpolationMode $(IN_MODE) -EulerMode $(ROTMODE) \
				  -Rot1 $$rot1 $$rot1 1 \
				  -Rot2 $$rot2 $$rot2 1 \
				  -Rot3 $$rot3 $$rot3 1 ; \
		mrcImageMove	-i $(TARGET)-$$rot1-$$rot2-$$rot3.roitmp -o  $(TARGET)-$$rot1-$$rot2-$$rot3.roi \
						-x $$shift2 \
						-y $$shift3; \
		rm $(TARGET)-$$rot1-$$rot2-$$rot3.roitmp; \
	done \
	done \
	done
	
NoiseAdd::
	make IN_NOISE_LIST;
	make $(JOP_NUM) nroi;

All::
	make Windowing;
	make CorFit1;
	make CorFit2;
#	make TiltFit;
	make 3D;
	make Radon3D;

Windowing::
	make IN_MASK_LIST;
	make $(JOP_NUM) mask;
	
CorFit1::
	cp $(TARGET)-$(ROT1REF)-$(ROT2REF)-$(ROT3REF).$(IN_CORR_EXT) $(TARGET)-$(ROT1REF)-$(ROT2REF)-$(ROT3REF).fit
	cp $(TARGET)-$(ROT1REF)-$(ROT2REF)-$(ROT3REF).$(IN_CORR_EXT) $(TARGET).tmp;
	make IN_CORR_LIST1;
	make fit_plus;
	make fit_minus;
	rm $(TARGET).tmp;

IN_CORR_LIST1::
	touch IN_CORR_LIST_plus;
	rm IN_CORR_LIST_plus;
	echo "IN_CORR_LIST_plus=\\" > IN_CORR_LIST_plus;
	@for (( rot2 = $(ROT2REF) + $(ROT2D) ; rot2 <= $(ROT2MAX); rot2 += $(ROT2D) )) \
	do \
		echo $(TARGET)-$(ROT1REF)-$$rot2-$(ROT3REF).$(IN_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST_plus; \
	done
	echo "" >> IN_CORR_LIST_plus;

	touch IN_CORR_LIST_minus;
	rm IN_CORR_LIST_minus;
	echo "IN_CORR_LIST_minus=\\" > IN_CORR_LIST_minus;
	@for (( rot2 = $(ROT2REF) - $(ROT2D) ; rot2 >= $(ROT2MIN); rot2 -= $(ROT2D) )) \
	do \
		echo $(TARGET)-$(ROT1REF)-$$rot2-$(ROT3REF).$(IN_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST_minus; \
	done
	echo "" >> IN_CORR_LIST_minus;

CorFit2::
	@for (( rot2 = $(ROT2MIN) ; rot2 <= $(ROT2MAX); rot2 += $(ROT2D) )) \
	do \
		export rot2; \
		make IN_CORR_LIST2; \
		cp $(TARGET)-$(ROT1REF)-$$rot2-$(ROT3REF).fit $(TARGET).tmp; \
		make fit_plus; \
		make fit_minus; \
	done
	rm $(TARGET).tmp;
	
IN_CORR_LIST2::
	touch IN_CORR_LIST_plus;
	rm IN_CORR_LIST_plus;
	echo "IN_CORR_LIST_plus=\\" > IN_CORR_LIST_plus;
	@for (( rot3 = $(ROT3REF) + $(ROT3D) ; rot3 <= $(ROT3MAX); rot3 += $(ROT3D) )) \
	do \
		echo $(TARGET)-$(ROT1REF)-$(rot2)-$$rot3.$(IN_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST_plus; \
	done
	echo "" >> IN_CORR_LIST_plus
	
	touch IN_CORR_LIST_minus;
	rm IN_CORR_LIST_minus;
	echo "IN_CORR_LIST_minus=\\" > IN_CORR_LIST_minus;
	@for (( rot3 = $(ROT3REF) - $(ROT3D) ; rot3 >= $(ROT3MIN); rot3 -= $(ROT3D) )) \
	do \
		echo $(TARGET)-$(ROT1REF)-$(rot2)-$$rot3.$(IN_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> IN_CORR_LIST_minus; \
	done
	echo "" >> IN_CORR_LIST_minus;

TiltFit::
	make IN_TILT_LIST;
	@cp $(TARGET)-$(ROT1REF)-$(ROT2REF)-$(ROT3REF).$(IN_TILT_EXT) $(TARGET).$(IN_TILT_EXT)tmp;
	make $(TARGET).tiltinfo;

3D::
	make 3DList;
	make $(TARGET).3d;

3DList::
	touch $(TARGET).3dlst;
	touch $(TARGET).tiltinfo;
	rm $(TARGET).3dlst;
	@for (( rot1 = $(ROT1MIN); rot1 <= $(ROT1MAX); rot1 += $(ROT1D) )) \
	do \
	for (( rot2 = $(ROT2MIN); rot2 <= $(ROT2MAX); rot2 += $(ROT2D) )) \
	do \
	for (( rot3 = $(ROT3MIN); rot3 <= $(ROT3MAX); rot3 += $(ROT3D) )) \
	do \
		echo $(TARGET)-$$rot1-$$rot2-$$rot3.$(IN_3D_EXT) $(ROTMODE) `cat $(TARGET).tiltinfo`0 $$rot2 $$rot3 >> $(TARGET).3dlst; \
	done \
	done \
	done
	
Radon3D::
	make IN_3D_LIST;
	make $(JOP_NUM) sino;
	make 3DRadonList;
	make $(TARGET).3dradon;
	make $(TARGET).3d;
	
3DRadonList::
	touch $(TARGET).3dradonlst;
	touch $(TARGET).tiltinfo;
	rm $(TARGET).3dradonlst;
	@for (( rot1 = $(ROT1MIN); rot1 <= $(ROT1MAX); rot1 += $(ROT1D) )) \
	do \
	for (( rot2 = $(ROT2MIN); rot2 <= $(ROT2MAX); rot2 += $(ROT2D) )) \
	do \
	for (( rot3 = $(ROT3MIN); rot3 <= $(ROT3MAX); rot3 += $(ROT3D) )) \
	do \
		echo $(TARGET)-$$rot1-$$rot2-$$rot3.sino $(ROTMODE) `cat $(TARGET).tiltinfo`0 $$rot2 $$rot3 >> $(TARGET).3dradonlst; \
	done \
	done \
	done
	
Tiff::
	make IN_TIFF_LIST;
	make $(JOP_NUM) tiff;

3DTiff::
	make $(TARGET).tiff

Test::
	@tiltmax=`expr "scale=$(TILTSCALE); $(TILTMAX)" | bc -l`; \
	tiltmin=`expr "scale=$(TILTSCALE); $(TILTMIN)" | bc -l`; \
	tiltw=`expr "scale=$(TILTSCALE); $$tiltmax - $$tiltmin" | bc -l`; \
	for (( iter = 1; iter <= $(TILTITER); iter += 1 )) \
	do \
		tiltd=`expr "scale=$(TILTSCALE); $$tiltw / $(TILTN)" | bc -l`; \
		echo $$tiltmin $$tiltmax $$tiltd; \
		tmp_p=`cat $(TARGET).tiltinfo`; \
		echo $$tmp_p; \
		tiltw=`expr "scale=$(TILTSCALE); $$tiltw / 2" | bc -l`; \
		tiltmin=`expr "scale=$(TILTSCALE); $$tmp_p - ( $$tiltw / 2 )" | bc -l`; \
		tiltmax=`expr "scale=$(TILTSCALE); $$tmp_p + ( $$tiltw / 2 )" | bc -l`; \
	done;
	

##### Commands(Input to Output) #####
.$(IN_NOISE_EXT).nroi:
	mrcImageNoiseAdd -i $*.$(IN_NOISE_EXT) -o $*.nroi -SN $(SNRATIO);
	
.$(IN_MASK_EXT).mask:
	mrcImageWindowing -i $*.$(IN_MASK_EXT) -o $*.mask -m $(MASK_MODE) -W $(MASK_X) $(MASK_X_MAX) $(MASK_Y) $(MASK_Y_MAX) 2> /dev/null;

.$(IN_CORR_EXT).fit:
	mrcImageCorrelation	-i $*.$(IN_CORR_EXT) -r $(TARGET).tmp -s $*.fit 2> /dev/null;
	cp $*.fit $(TARGET).tmp
	
.$(IN_TILT_EXT)tmp.tiltinfo:
	@tiltmax=`expr "scale=$(TILTSCALE); $(TILTMAX)" | bc -l`; \
	tiltmin=`expr "scale=$(TILTSCALE); $(TILTMIN)" | bc -l`; \
	tiltw=`expr "scale=$(TILTSCALE); $$tiltmax - $$tiltmin" | bc -l`; \
	for (( iter = 1; iter <= $(TILTITER); iter += 1 )) \
	do \
		tiltd=`expr "scale=$(TILTSCALE); $$tiltw / $(TILTN)" | bc -l`; \
		mrcImageTiltAxisSearch -I IN_TILT_LIST -r $(TARGET).$(IN_TILT_EXT)tmp -o $(TARGET).tilt -O $(TARGET).tiltinfo -range $$tiltmin $$tiltmax $$tiltd 2> /dev/null; \
		tmp_p=`cat $(TARGET).tiltinfo`; \
		echo $$tmp_p; \
		tiltmin=`expr "scale=$(TILTSCALE); $$tmp_p - ( $$tiltw / 2 )" | bc -l`; \
		tiltmax=`expr "scale=$(TILTSCALE); $$tmp_p + ( $$tiltw / 2 )" | bc -l`; \
	done;

.3dlst.3d:
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode $(IN_MODE) -m $(PRJ_MODE) -single $(AXIS1);
#	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode $(IN_MODE) -m $(PRJ_MODE) -Double;
	
.$(IN_3D_EXT).sino:
	mrcImageSinogramCreate -i $*.$(IN_3D_EXT) -o $*.sino -dphi $(PHID);
	
.3dradonlst.3dradon:
	mrcRadon2Dto3D -I $*.3dradonlst -o $*.3dradon -ow $*.3dradonw -dp $(PD) -dtheta $(THETAD) -dphi $(PHID) -InterpolationMode $(IN_MODE);

.3dradon.3d:
	mrcImageInverseRadonTransform -i $*.3dradon -o $*.3d -bpm $(RBP_MODE);

.$(IN_TIFF_EXT).tiff:
	mrc2tiff -i $*.$(IN_TIFF_EXT) -o $*.tiff 2> /dev/null;

.3d.tiff:
	@for (( loop_num = 0; loop_num <= 2; loop_num += 1 ))	\
	do \
		mrcImageProjection -i $(TARGET).3d -o $(TARGET).tmp -m $$loop_num;	\
		mrc2tiff -i $(TARGET).tmp -o $(TARGET)$$loop_num.tiff;	\
	done;
	rm $(TARGET).tmp;
