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

#### Root Makefile ####
MAKE_ROOT=ElectronTomography0

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

# For mrc2tiff
IN_TIFF_EXT=fit
IN_TIFF_LIST=FITs

# For mrcImageNoiseAdd
IN_NOISE_EXT=roi
IN_NOISE_LIST=ROIs

# For mrcImageWindowing
IN_MASK_EXT=nroi
IN_MASK_LIST=NROIs

#### INCLUDE ####
.SUFFIXES: .roi .nroi .mask .tiff .3dlst .3d .fit .$(IN_TIFF_EXT) .$(IN_CORR_EXT) .$(IN_NOISE_EXT) .$(IN_MASK_EXT)

SHELL=/bin/bash

-include ${EOS_HOME}/tutorial/TIPS/Help/Makefile/Makefile-lib
-include $(IN_TIFF_LIST)
-include $(IN_CORR_LIST)_plus
-include $(IN_CORR_LIST)_minus
-include $(IN_NOISE_LIST)
-include $(IN_MASK_LIST)

#### Definition ####

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

### For mrc3Dto2D
# RotMode
ROTMODE=YOYS
# Rot1
ROT1MIN=-60
ROT1MAX=60
ROT1D=2
ROT1N=`expr \( $(ROT1MAX) - $(ROT1MIN) \) / $(ROT1D) + 1`
# Rot2
ROT2MIN=0
ROT2MAX=0
ROT2D=10
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 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: Usually 0
ROT1REF=0
ROT2REF=0
ROT3REF=0

### For mrcImageNoiseAdd
SNRATIO=3

### For mrc2Dto3D
# mode
# 0:Simple Back Projection 1:Filter Back Projection
PRJ_MODE=1

### For mrcImageMove
SHIFT1MAX=10
SHIFT2MAX=0
SHIFT3MAX=0

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

mask:$($(IN_MASK_LIST):.$(IN_MASK_EXT)=.mask)
tiff:$($(IN_TIFF_LIST):.$(IN_TIFF_EXT)=.tiff)
fit_plus:$($(IN_CORR_LIST)_plus:.$(IN_CORR_EXT)=.fit)
fit_minus:$($(IN_CORR_LIST)_minus:.$(IN_CORR_EXT)=.fit)
nroi:$($(IN_NOISE_LIST):.$(IN_NOISE_EXT)=.nroi)
	
$(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)
	
$(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)

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

All::
	make Windowing;
	make CorFit1
	make 3DList
	make $(TARGET).3d;

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

TestData::
	@for (( rot1 = $(ROT1MIN), shift1 = -$(SHIFT1MAX); rot1 <= $(ROT1MAX); rot1 += $(ROT1D), shift1 = ( ( $$rot1 + $(ROT1D) ) * $(SHIFT1MAX) ) / ( $(ROT1MAX) + 1 ) )) \
	do \
	for (( rot2 = $(ROT2MIN), shift2 = -$(SHIFT2MAX); rot2 <= $(ROT2MAX); rot2 += $(ROT2D), shift2 = ( ( $$rot2 + $(ROT1D) ) * $(SHIFT2MAX) ) / ( $(ROT2MAX) + 1 ) )) \
	do \
	for (( rot3 = $(ROT3MIN), shift3 = -$(SHIFT3MAX); rot3 <= $(ROT3MAX); rot3 += $(ROT3D), shift3 = ( ( $$rot3 + $(ROT1D) ) * $(SHIFT3MAX) ) / ( $(ROT3MAX) + 1 ) )) \
	do \
		echo $$rot1, $$rot2, $$rot3, $$shift1, $$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 $$shift1 \
						-y $$shift2 \
						-z $$shift3; \
		rm $(TARGET)-$$rot1-$$rot2-$$rot3.roitmp; \
	done \
	done \
	done
	
$(IN_CORR_LIST)::
	make $(IN_CORR_LIST)_plus;
	make $(IN_CORR_LIST)_minus;
	
$(IN_CORR_LIST)_plus::
	touch $(IN_CORR_LIST)_plus;
	echo "$(IN_CORR_LIST)_plus=\\" > $(IN_CORR_LIST)_plus;
	@for (( rot1 = $(ROT1REF) + $(ROT1D) ; 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_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> $(IN_CORR_LIST)_plus; \
	done \
	done \
	done
	echo "" >> $(IN_CORR_LIST)_plus
	
$(IN_CORR_LIST)_minus::
	touch $(IN_CORR_LIST)_minus;
	echo "$(IN_CORR_LIST)_minus=\\" > $(IN_CORR_LIST)_minus;
	@for (( rot1 = $(ROT1REF) - $(ROT1D) ; rot1 >= $(ROT1MIN); 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_CORR_EXT) | sed s/$(IN_CORR_EXT)/$(IN_CORR_EXT)\\\\/ >> $(IN_CORR_LIST)_minus; \
	done \
	done \
	done
	echo "" >> $(IN_CORR_LIST)_minus
	
3DList::
	@for (( rot1 = $(ROT1MIN), shift1 = -$(SHIFT1MAX); rot1 <= $(ROT1MAX); rot1 += $(ROT1D), shift1 = ( ( $$rot1 + $(ROT1D) ) * $(SHIFT1MAX) ) / ( $(ROT1MAX) + 1 ) )) \
	do \
	for (( rot2 = $(ROT2MIN), shift2 = -$(SHIFT2MAX); rot2 <= $(ROT2MAX); rot2 += $(ROT2D), shift2 = ( ( $$rot2 + $(ROT1D) ) * $(SHIFT2MAX) ) / ( $(ROT2MAX) + 1 ) )) \
	do \
	for (( rot3 = $(ROT3MIN), shift3 = -$(SHIFT3MAX); rot3 <= $(ROT3MAX); rot3 += $(ROT3D), shift3 = ( ( $$rot3 + $(ROT1D) ) * $(SHIFT3MAX) ) / ( $(ROT3MAX) + 1 ) )) \
	do \
		echo $(TARGET)-$$rot1-$$rot2-$$rot3.fit $(ROTMODE) $$rot1 $$rot2 $$rot3 >> $(TARGET).3dlst; \
	done \
	done \
	done
	
NoiseAdd::
	make $(IN_NOISE_LIST);
	make $(JOP_NUM) nroi;
	
Tiff::
	make $(IN_TIFF_LIST);
	make $(JOP_NUM) tiff;

3DTiff::
	make $(TARGET).tiff

Test::
	@echo $(ROT3N)	\
	$(ROT1N);

##### Commands(Input to Output) #####
.$(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_TIFF_EXT).tiff:
	mrc2tiff -i $*.$(IN_TIFF_EXT) -o $*.tiff 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_NOISE_EXT).nroi:
	mrcImageNoiseAdd -i $*.$(IN_NOISE_EXT) -o $*.nroi -SN $(SNRATIO);

.3dlst.3d:
	mrc2Dto3D -I $*.3dlst -o $*.3d -InterpolationMode $(IN_MODE) -m $(PRJ_MODE);

.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;
