# Makefile (CPU) - Linux/GCC version
# Usage: make all
# Individual targets: make tif_blf tif_gsf tif_mdf etc.

CC      = gcc
CFLAGS  = -O2 -D_USE_MATH_DEFINES
OMPF    = -fopenmp
AVXF    = -mavx2
LIBS    = -lm
TIFFLIB = -ltiff
CBP     = cbp_thread_int.c
CBPd    = cbp_thread_nai.c
SIF_F   = sif_f_fast.c

EXE_DIR = ../bin

.PHONY: all clean ct_rec tf_rec hp_tg tf_tg ofct_srec otf_rec oftf_srec \
        p_rec sf_rec misc si_tools filters

all: ct_rec tf_rec hp_tg tf_tg ofct_srec otf_rec oftf_srec \
     p_rec sf_rec misc si_tools filters

# ---------------------------------------------------------------
# Normal CT reconstruction
# ---------------------------------------------------------------
ct_rec: ct_rec_t_r ct_rec_t_s ct_rec_t_c
ct_rec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/ct_rec_t_r ct_rec.c error.c sort_filter_omp.c $(SIF_F) $(CBP) -DFilter=Ramachandran $(LIBS)
ct_rec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/ct_rec_t_s ct_rec.c error.c sort_filter_omp.c $(SIF_F) $(CBP) -DFilter=Shepp $(LIBS)
ct_rec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/ct_rec_t_c ct_rec.c error.c sort_filter_omp.c $(SIF_F) $(CBP) -DFilter=Chesler $(LIBS)

tf_rec: tf_rec_t_r tf_rec_t_s tf_rec_t_c
tf_rec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tf_rec_t_r tf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Ramachandran $(LIBS)
tf_rec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tf_rec_t_s tf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Shepp $(LIBS)
tf_rec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tf_rec_t_c tf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Chesler $(LIBS)

hp_tg: hp_tg_t_r hp_tg_t_s hp_tg_t_c
hp_tg_t_r:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/hp_tg_t_r hp_tg_ku.c error.c rhp.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Ramachandran $(LIBS)
hp_tg_t_s:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/hp_tg_t_s hp_tg_ku.c error.c rhp.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Shepp $(LIBS)
hp_tg_t_c:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/hp_tg_t_c hp_tg_ku.c error.c rhp.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Chesler $(LIBS)

tf_tg: tf_tg_t_r tf_tg_t_s tf_tg_t_c
tf_tg_t_r:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/tf_tg_t_r hp_tg_ku.c error.c rtf.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Ramachandran $(LIBS)
tf_tg_t_s:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/tf_tg_t_s hp_tg_ku.c error.c rtf.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Shepp $(LIBS)
tf_tg_t_c:
	$(CC) $(CFLAGS) $(OMPF) -DONLY_CT_VIEWS -DFOM=float -DFloat=float -o $(EXE_DIR)/tf_tg_t_c hp_tg_ku.c error.c rtf.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFilter=Chesler $(LIBS)

# ---------------------------------------------------------------
# Offset CT reconstruction
# ---------------------------------------------------------------
ofct_srec: ofct_srec_t_r ofct_srec_t_s ofct_srec_t_c
ofct_srec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/ofct_srec_t_r ofct_srec.c error.c rhp.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Ramachandran $(LIBS)
ofct_srec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/ofct_srec_t_s ofct_srec.c error.c rhp.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Shepp $(LIBS)
ofct_srec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/ofct_srec_t_c ofct_srec.c error.c rhp.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Chesler $(LIBS)

otf_rec: otf_rec_t_r otf_rec_t_s otf_rec_t_c
otf_rec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/otf_rec_t_r otf_rec.c error.c $(TIFFLIB) sort_filter_omp.c $(CBP) -DFilter=Ramachandran $(LIBS)
otf_rec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/otf_rec_t_s otf_rec.c error.c $(TIFFLIB) sort_filter_omp.c $(CBP) -DFilter=Shepp $(LIBS)
otf_rec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/otf_rec_t_c otf_rec.c error.c $(TIFFLIB) sort_filter_omp.c $(CBP) -DFilter=Chesler $(LIBS)

oftf_srec: oftf_srec_t_r oftf_srec_t_s oftf_srec_t_c
oftf_srec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/oftf_srec_t_r ofct_srec.c error.c rtf.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Ramachandran $(LIBS)
oftf_srec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/oftf_srec_t_s ofct_srec.c error.c rtf.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Shepp $(LIBS)
oftf_srec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -DFloat=float -DONLY_CT_VIEWS -o $(EXE_DIR)/oftf_srec_t_c ofct_srec.c error.c rtf.c sort_filter_omp.c rl.c $(CBP) $(TIFFLIB) -DFilter=Chesler $(LIBS)

# ---------------------------------------------------------------
# Guess rotation center for offset CT
# ---------------------------------------------------------------
ofct_xy:
	$(CC) $(CFLAGS) -DONLY_CT_VIEWS -o $(EXE_DIR)/ofct_xy error.c rhp.c msd.c $(SIF_F) oct_xy.c $(LIBS)
otf_xy:
	$(CC) $(CFLAGS) -DONLY_CT_VIEWS -o $(EXE_DIR)/otf_xy error.c rtf.c msd.c $(SIF_F) $(TIFFLIB) otf_xy.c $(LIBS)

# ---------------------------------------------------------------
# p image CT reconstruction
# ---------------------------------------------------------------
p_rec: p_rec_t_r p_rec_t_s p_rec_t_c
p_rec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/p_rec_t_r p_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFloat=float -DFilter=Ramachandran $(LIBS)
p_rec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/p_rec_t_s p_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFloat=float -DFilter=Shepp $(LIBS)
p_rec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/p_rec_t_c p_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBP) -DFloat=float -DFilter=Chesler $(LIBS)

# ---------------------------------------------------------------
# CT reconstruction from tiff 32bit sinogram
# ---------------------------------------------------------------
sf_rec: sf_rec_t_r sf_rec_t_s sf_rec_t_c
sf_rec_t_r:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/sf_rec_t_r sf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBPd) -DFloat=double -DFilter=Ramachandran $(LIBS)
sf_rec_t_s:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/sf_rec_t_s sf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBPd) -DFloat=double -DFilter=Shepp $(LIBS)
sf_rec_t_c:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/sf_rec_t_c sf_rec.c error.c sort_filter_omp.c $(TIFFLIB) $(CBPd) -DFloat=double -DFilter=Chesler $(LIBS)

# ---------------------------------------------------------------
# Miscellaneous tools
# ---------------------------------------------------------------
misc: tif_f2i rec_crop sinog of_sinog pid stop_watch img_ave \
      spl his_spl_K his_spl_E his_spl_tif rec_stk chk-rc set-rc \
      his2img ct_prj_f ct_sub_f ict_prj_fc ct_prj_fc tf_prj_f \
      tif2hst rec_gf hp2DO tif_ave tif_mgf his_ave \
      q3_ave q4_ave act_spl act_spl2 gf_sd gf_fd his2tif6 ofsfa

tif_f2i:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/tif_f2i tif_f2i.c rif_f.c $(TIFFLIB) $(LIBS)
rec_crop:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/rec_crop rec_crop.c rif_f.c $(TIFFLIB) $(LIBS)
sinog:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/sinog sinog.c $(SIF_F) $(LIBS)
of_sinog:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/of_sinog of_sinog.c $(SIF_F) $(LIBS)
pid:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/pid pid.c $(LIBS)
stop_watch:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/stop_watch stop_watch.c $(LIBS)
img_ave:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/img_ave img_ave.c $(LIBS)
spl:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/spl spl.c $(LIBS)
his_spl_K:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his_spl_K his_spl_K.c $(LIBS)
his_spl_E:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his_spl_E his_spl_E.c $(LIBS)
his_spl_tif:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his_spl_tif his_spl_tif.c $(TIFFLIB) $(LIBS)
rec_stk:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/rec_stk rec_stk.c $(LIBS)
chk-rc:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/chk-rc chk-rc.c $(LIBS)
set-rc:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/set-rc set-rc.c $(LIBS)
his2img:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his2img his2img.c $(LIBS)
ct_prj_f:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/ct_prj_f ct_prj_f.c $(TIFFLIB) $(LIBS)
ct_sub_f:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/ct_sub_f ct_sub_f.c $(TIFFLIB) $(LIBS)
ict_prj_fc:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/ict_prj_fc ict_prj_fc.c $(TIFFLIB) $(LIBS)
ct_prj_fc:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/ct_prj_fc ct_prj_fc.c $(TIFFLIB) $(LIBS)
tf_prj_f:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/tf_prj_f rif_fast.c tf_prj_f.c $(TIFFLIB) $(LIBS)
tif2hst:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/tif2hst tif2hst.c $(TIFFLIB) $(LIBS)
rec_gf:
	$(CC) -Ox $(CFLAGS) -o $(EXE_DIR)/rec_gf fft.c rec_gf.c rif_f.c $(TIFFLIB) $(LIBS)
hp2DO:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/hp2DO hp2DO.c $(TIFFLIB) $(LIBS)
tif_ave:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/tif_ave tif_ave.c rif_fast.c $(TIFFLIB) $(LIBS)
tif_mgf:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tif_mgf tif_mgf.c $(TIFFLIB) $(LIBS)
his_ave:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his_ave his_ave.c sif.c $(LIBS)
q3_ave:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/q3_ave q3_ave.c $(LIBS)
q4_ave:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/q4_ave q4_ave.c $(LIBS)
act_spl:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/act_spl act_spl.c $(LIBS)
act_spl2:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/act_spl2 act_spl2.c $(LIBS)
gf_sd:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/gf_sd error.c rif_fast.c sif_fast.c gf_sd.c $(LIBS)
gf_fd:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/gf_fd error.c fft.c rif_fast.c sif_fast.c gf_fd.c $(LIBS)
his2tif6:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/his2tif6 his2tif6.c $(TIFFLIB) $(LIBS)
ofsfa:
	$(CC) $(CFLAGS) -o $(EXE_DIR)/ofsfa ofsfa.c $(LIBS)

# ---------------------------------------------------------------
# 3D tools (si_rar, si_sir, si_gf)
# ---------------------------------------------------------------
si_tools: si_rar si_sir_a si_sir_s si_sir si_gf

si_rar:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/si_rar error.c rif_fast.c csi.c rsi.c sif_fast.c si_rar.c $(LIBS)
si_sir_a:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/si_sir_a error.c rif_fast.c csi.c rsi.c si_sir_a.c $(TIFFLIB) $(LIBS)
si_sir_s:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/si_sir_s error.c rif_fast.c csi.c rsi.c si_sir_s.c $(TIFFLIB) $(LIBS)
si_sir:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/si_sir error.c rif_fast.c csi.c rsi.c sif_fast.c si_sir_pipe.c $(LIBS)
si_gf:
	$(CC) $(CFLAGS) $(OMPF) $(AVXF) -o $(EXE_DIR)/si_gf error.c fft.c csi.c rif_fast.c sif_fast.c si_gf.c $(LIBS)

# ---------------------------------------------------------------
# Filters made by ClaudeAI
# ---------------------------------------------------------------
filters: tif_blf tif_gsf tif_mdf

tif_blf:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tif_blf tif_blf.c $(TIFFLIB) $(LIBS)

tif_gsf:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tif_gsf tif_gsf.c $(TIFFLIB) $(LIBS)

tif_mdf:
	$(CC) $(CFLAGS) $(OMPF) -o $(EXE_DIR)/tif_mdf tif_mdf.c $(TIFFLIB) $(LIBS)

# ---------------------------------------------------------------
# Clean
# ---------------------------------------------------------------
clean:
	rm -f *.o $(EXE_DIR)/ct_rec_t_r $(EXE_DIR)/ct_rec_t_s $(EXE_DIR)/ct_rec_t_c \
	$(EXE_DIR)/tf_rec_t_r $(EXE_DIR)/tf_rec_t_s $(EXE_DIR)/tf_rec_t_c \
	$(EXE_DIR)/hp_tg_t_r $(EXE_DIR)/hp_tg_t_s $(EXE_DIR)/hp_tg_t_c \
	$(EXE_DIR)/tf_tg_t_r $(EXE_DIR)/tf_tg_t_s $(EXE_DIR)/tf_tg_t_c \
	$(EXE_DIR)/ofct_srec_t_r $(EXE_DIR)/ofct_srec_t_s $(EXE_DIR)/ofct_srec_t_c \
	$(EXE_DIR)/otf_rec_t_r $(EXE_DIR)/otf_rec_t_s $(EXE_DIR)/otf_rec_t_c \
	$(EXE_DIR)/oftf_srec_t_r $(EXE_DIR)/oftf_srec_t_s $(EXE_DIR)/oftf_srec_t_c \
	$(EXE_DIR)/ofct_xy $(EXE_DIR)/otf_xy \
	$(EXE_DIR)/p_rec_t_r $(EXE_DIR)/p_rec_t_s $(EXE_DIR)/p_rec_t_c \
	$(EXE_DIR)/sf_rec_t_r $(EXE_DIR)/sf_rec_t_s $(EXE_DIR)/sf_rec_t_c \
	$(EXE_DIR)/tif_f2i $(EXE_DIR)/rec_crop $(EXE_DIR)/sinog $(EXE_DIR)/of_sinog \
	$(EXE_DIR)/pid $(EXE_DIR)/stop_watch $(EXE_DIR)/img_ave \
	$(EXE_DIR)/spl $(EXE_DIR)/his_spl_K $(EXE_DIR)/his_spl_E $(EXE_DIR)/his_spl_tif \
	$(EXE_DIR)/rec_stk $(EXE_DIR)/chk-rc $(EXE_DIR)/set-rc $(EXE_DIR)/his2img \
	$(EXE_DIR)/ct_prj_f $(EXE_DIR)/ct_sub_f $(EXE_DIR)/ict_prj_fc $(EXE_DIR)/ct_prj_fc \
	$(EXE_DIR)/tf_prj_f $(EXE_DIR)/tif2hst $(EXE_DIR)/rec_gf \
	$(EXE_DIR)/hp2DO $(EXE_DIR)/tif_ave $(EXE_DIR)/tif_mgf \
	$(EXE_DIR)/his_ave $(EXE_DIR)/q3_ave $(EXE_DIR)/q4_ave \
	$(EXE_DIR)/act_spl $(EXE_DIR)/act_spl2 $(EXE_DIR)/gf_sd $(EXE_DIR)/gf_fd \
	$(EXE_DIR)/his2tif6 $(EXE_DIR)/ofsfa \
	$(EXE_DIR)/si_rar $(EXE_DIR)/si_sir_a $(EXE_DIR)/si_sir_s \
	$(EXE_DIR)/si_sir $(EXE_DIR)/si_gf \
	$(EXE_DIR)/tif_blf \
	$(EXE_DIR)/tif_gsf \
	$(EXE_DIR)/tif_mdf
