BD = run
RD = res
SD = src
CD = test
DD = data
CF = conf
LD = log
BASE = baserun
case := $(shell ls $(CD)) 
casedirs := $(foreach dir,$(case),$(CD)/$(dir)/run)
caseresfiles := $(foreach dir,$(case),$(CD)/$(dir)/res/*)
casexfiles := $(foreach dir,$(case),$(CD)/$(dir)/log/*)
casexfiles2 := $(foreach dir,$(case),$(CD)/$(dir)/data/*.png)
casefiles := $(foreach dir,$(casedirs),$(dir)/sam.std)
checkfiles := $(foreach dir,$(casedirs),$(dir)/../check/sam.std)
checks := $(foreach dir,$(casedirs),$(dir)/../check/compare)
datafiles := $(wildcard $(DD)/*)
sourcefiles := $(wildcard $(SD)/*)
dataplotfiles := $(DD)/linreg.png 
conffiles := 
runfiles := $(RD)/* $(BD)/sam.par $(BD)/sam.std $(BD)/sam.cor $(BD)/program.log $(BD)/*.RData
logfiles := $(LD)/model.out $(LD)/conf.out $(LD)/plot.out $(LD)/data.out $(LD)/compile.out $(LD)/model.err $(LD)/conf.err $(LD)/plot.err $(LD)/data.err $(LD)/compile.err $(LD)/source.out $(LD)/source.err $(LD)/checkdata.tab $(LD)/checksource.tab
keeprunfiles := ".*/\(sam\|sam.std\|sam.par\|sam.cor\|sam.dat\|program.log\|fit.out\|sam.rep\|model.cfg\|sam.pin\|retro.cfg\|leaveout.cfg\|running.tok\|RETRO.RData\|LO.RData\|ca.out\|n.out\|f.out\)"

.SILENT: $(checks) status

.PHONY = clean compile updatetest test runtest data run plot status

clean:
	rm -rf $(runfiles)
	rm -f $(BD)/*
	rm -f $(LD)/*
	touch $(logfiles)
	find . -name '*~' -delete
	rm -rf _tmp 
	rm -f $(checks)
	rm -rf $(casedirs)
	rm -f $(caseresfiles)
	rm -f $(casexfiles) $(casexfiles2) 

compile: $(BD)/sam
$(BD)/sam: $(SD)/sam.tpl $(SD)/nLogNormal.h 
	rm -rf _tmp
	mkdir _tmp
	cp $^ _tmp
	cd _tmp; admb -s $(@F) 1> ../$(LD)/compile.out 2> ../$(LD)/compile.err
	cp _tmp/$(@F) $(BD)
	rm -rf _tmp

runtest: $(casefiles)
$(casefiles): $(BD)/sam
	mkdir $(@D)
	cd $(@D)/..; make runit

updatetest: $(checkfiles)
$(checkfiles): $(casefiles)
	cd $(@D); cp ../run/sam.std .

test: $(checks)
$(checks): $(casefiles)
	echo 'f1<-readLines("$(@D)/sam.std"); f2<-readLines("$(@D)/../run/sam.std"); ok<-identical(f1,f2); cat(sub("run.*","","$(@D) "),ok,"\n")' | R --slave --vanilla

$(datafiles):

checkalldata: $(LD)/checkdata.tab
$(LD)/checkdata.tab: $(datafiles) $(SD)/datavalidator.R 
	#echo 'source("$(SD)/datavalidator.R"); write.table(check.all("$(DD)"),sep="|",file="$(LD)/checkdata.tab")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err

$(LD)/checkallsource: $(LD)/checksource.tab
$(LD)/checksource.tab: $(sourcefiles) $(SD)/sourcevalidator.R 
	echo 'source("$(SD)/sourcevalidator.R"); write.table(check.all.source("$(SD)"),sep="|",file="$(LD)/checksource.tab")' | R --slave --vanilla 1> $(LD)/source.out 2> $(LD)/source.err

data: $(BD)/sam.dat 
$(BD)/sam.dat: $(datafiles) $(BD)/sam $(SD)/datascript.R 
	echo 'source("$(SD)/datascript.R")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err 

dataplot: $(dataplotfiles)
$(dataplotfiles): $(datafiles) $(SD)/dataplot.R $(SD)/datavalidator.R
	echo 'source("$(SD)/dataplot.R")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err 

defcon: $(conffiles)
$(conffiles): 

checkconf: 

run: $(BD)/sam.std

$(BD)/sam.std: $(BD)/sam $(BD)/sam.dat 
	rm -rf $(runfiles) 
	-cd $(BD); nice -n 15 ./sam -iprint 1 1> ../$(LD)/model.out 2> ../$(LD)/model.err
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete 

updatebase: $(BASE)/sam.std

$(BASE)/sam.std: $(BD)/sam.std
	rm -f $(BASE)/*
	cp $(BD)/sam.par $(BD)/sam.rep $(BD)/sam.res $(BD)/sam.std $(BD)/sam.cor $(BASE)
	echo 'source("src/plotscript.R");' | R --slave --vanilla 1> $(LD)/plot.out 2> $(LD)/plot.err 

plot: $(RD)/footprint

$(RD)/footprint: $(BD)/sam.std $(SD)/plotscript.R
	echo 'source("src/plotscript.R");' | R --slave --vanilla 1> $(LD)/plot.out 2> $(LD)/plot.err 

status: 
	if ${MAKE} -q compile; then echo compile 1; else echo compile 0; fi
	if ${MAKE} -q data; then echo data 1; else echo data 0; fi
	if ${MAKE} -q run; then echo run 1; else echo run 0; fi
	if [ -s "$(LD)/model.err" ] ; then echo runerrors 1; else echo runerrors 0; fi
    
sim: $(BD)/SIM.RData

$(BD)/SIM.RData: $(DD)/mtable.dat $(BD)/sam.std
	echo 'source("src/sim.R");' | R --slave --vanilla 1>> $(LD)/sim.out 2>> $(LD)/sim.err 
	touch $(SD)/plotscript.R
	${MAKE} plot
