useR = /usr/share/R-3.1.2/bin/R --slave --vanilla
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)/*.dat)
sourcefiles := $(wildcard $(SD)/*)
dataplotfiles := $(DD)/cn.png $(DD)/survey.png $(DD)/nm.png $(DD)/mo.png $(DD)/sw.png $(DD)/cw.png $(DD)/lw.png $(DD)/dw.png $(DD)/lf.png $(DD)/pf.png $(DD)/pm.png
conffiles := $(CF)/model.cfg $(CF)/sam.pin $(CF)/retro.cfg $(CF)/leaveout.cfg $(CF)/turbotmb 
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\|confclone.log\|sam.res\|sam.rep\|model.cfg\|sam.pin\|retro.cfg\|leaveout.cfg\|running.tok\|RETRO.RData\|LO.RData\|FORECAST.RData\|samtmb.so\|samtmb.RData\)"

runtype := $(shell echo 'cat(ifelse(scan("conf/turbotmb",quiet=TRUE)==1,"run/samtmb.RData","run/sam.std"))' | $(useR) )

.SILENT: $(checks) status

.PHONY = clean compile updatetest test runtest data run runtmb runadmb plot status forecast sim

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) 

getR:
	@echo $(useR)

compile: $(BD)/sam
$(BD)/sam: $(SD)/sam.tpl $(SD)/nLogNormal.h 
	rm -rf _tmp
	mkdir _tmp
	cp $^ _tmp
	cd _tmp; admb -r -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")' | $(useR)

$(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")' | $(useR) 1> $(LD)/data.out 2> $(LD)/data.err

checkalldatanofile:
	echo 'source("$(SD)/datavalidator.R"); write.table(check.all("$(DD)"),sep="|")' | $(useR) 

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")' | $(useR) 1> $(LD)/source.out 2> $(LD)/source.err

data: $(BD)/sam.dat 
$(BD)/sam.dat: $(datafiles) $(SD)/datascript.R $(SD)/datavalidator.R 
	rm -rf $(runfiles) 
	echo 'source("$(SD)/datascript.R")' | $(useR) 1> $(LD)/data.out 2> $(LD)/data.err
	echo 'source("$(SD)/datavalidator.R")' | $(useR) 1>> $(LD)/data.out 2>> $(LD)/data.err	 
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete 
dataplot: $(dataplotfiles)
$(dataplotfiles): $(datafiles) $(SD)/dataplot.R $(SD)/datavalidator.R
	echo 'source("$(SD)/dataplot.R")' | $(useR) 1> $(LD)/data.out 2> $(LD)/data.err 

defcon: $(conffiles)
$(conffiles): $(BD)/sam.dat $(SD)/datavalidator.R $(SD)/defaultconf.R $(BD)/sam
	echo 'source("src/defaultconf.R"); gen.conf()' | $(useR) 1> $(LD)/conf.out 2> $(LD)/conf.err;
	cp -f $(CF)/model.cfg $(CF)/retro.cfg $(CF)/leaveout.cfg $(BD)
	if [ ! -f $(CF)/sam.pin ]; then rm -f $(BD)/sam.pin; cd $(BD); ./sam -genpin 1>> ../$(LD)/conf.out 2>> ../$(LD)/conf.err; cd ..; cp $(BD)/sam.pin $(CF)/sam.pin; fi;
	touch $(conffiles)
	echo 'source("$(SD)/datavalidator.R");' | $(useR) 1>> $(LD)/conf.out 2>> $(LD)/conf.err; cd ..
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete

forcepin: 
	rm -f $(BD)/sam.pin; 
	cd $(BD); ./sam -genpin 1>> ../$(LD)/conf.out 2>> ../$(LD)/conf.err; cd ..; 
	cp $(BD)/sam.pin $(CF)/sam.pin;

checkconf: $(LD)/conf.err
$(LD)/conf.err: $(wildcard $(CF)/*) $(SD)/datavalidator.R
	cd $(CF); echo 'if(!all(file.exists(c("model.cfg","sam.pin","retro.cfg",".cfg")))){stop("Not all conffiles are present")}' | $(useR) 1> ../$(LD)/conf.out 2> ../$(LD)/conf.err; cd ..
	cp -f $(conffiles) $(BD)
	cd $(BD); ./sam -dataconftestonly 1> ../$(LD)/conf.out 2> ../$(LD)/conf.err; cd ..
	echo 'source("$(SD)/datavalidator.R"); compareclone("$(BD)/model.cfg","$(BD)/confclone.log", filetag="Conffile")' | $(useR) 1>> $(LD)/conf.out 2>> $(LD)/conf.err; cd ..
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete

run: $(runtype)

$(BD)/sam.std: $(BD)/sam $(BD)/sam.dat $(conffiles)
	rm -rf $(runfiles) 
	cp -f $(conffiles) $(BD)
	-cd $(BD); (ulimit -t 1800; nice -n 15 ./sam -nr 2 -noinit -iprint 1 1> ../$(LD)/model.out 2> ../$(LD)/model.err)
	-grep "Hessian does not appear to be positive definite" $(LD)/model.out >> $(LD)/model.err
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete 
	rm -rf SIM
	mkdir SIM

$(BD)/samtmb.RData: $(SD)/samtmb.R $(BD)/samtmb.so $(CF)/model.cfg $(CF)/turbotmb $(datafiles)
	rm -f $(BD)/*.RData 
	echo 'source("src/samtmb.R");' | $(useR) 1> $(LD)/model.out 2> $(LD)/model.err 
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete 
	rm -rf SIM
	mkdir SIM

$(BD)/samtmb.so: $(SD)/samtmb.cpp
	echo 'library(TMB, quiet=TRUE); compile("src/samtmb.cpp");' | $(useR) 1> $(LD)/compile.out 2> $(LD)/compile.err 
	rm -f $(SD)/samtmb.o
	mv $(SD)/samtmb.so $(BD)/samtmb.so

updatebase: $(BASE)/samtmb.RData

$(BASE)/samtmb.RData: $(BD)/samtmb.RData
	rm -f $(BASE)/*
	cp $(BD)/samtmb.RData $(BASE)
	echo 'source("src/plotscript.R");' | $(useR) 1> $(LD)/plot.out 2> $(LD)/plot.err 

plot: $(RD)/footprint

$(RD)/footprint: $(runtype) $(SD)/plotscript.R $(SD)/common.R
	echo 'source("src/plotscript.R");' | $(useR) 1> $(LD)/plot.out 2> $(LD)/plot.err 

forecast: $(BD)/FORECAST.RData
$(BD)/FORECAST.RData: $(BD)/samtmb.RData $(SD)/forecast.R $(CF)/forecast.cfg
	echo 'source("src/forecast.R");' | $(useR) 1> $(LD)/forecast.out 2> $(LD)/forecast.err 
	touch $(SD)/plotscript.R 
	${MAKE} plot

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



##### RETRO STUFF

retro: $(BD)/RETRO.RData

$(BD)/RETRO.RData: 
	echo 'source("src/retro.R")' | $(useR) 1> $(LD)/retro.out 2> $(LD)/retro.err 
	echo 'source("src/plotscript.R")' | $(useR) 1> $(LD)/plot.out 2> $(LD)/plot.err 

##### LEAVE OUT STUFF

leaveout: $(BD)/LO.RData

$(BD)/LO.RData: 
	echo 'source("src/leaveout.R")' | $(useR) 1> $(LD)/leaveout.out 2> $(LD)/leaveout.err 
	echo 'source("src/plotscript.R")' | $(useR) 1> $(LD)/plot.out 2> $(LD)/plot.err 


##### SIMSTUFF

sim: $(BD)/SIM.RData

$(BD)/SIM.RData: SIM/dirsok 
	${MAKE} $(simfiles) -j 10       
	cd SIM; echo 'source("../$(SD)/common.R"); 							     			#\
			dirlist<-dir(pattern="[[:digit:]]$$");									#\
			SIM<-list();									     			#\
			for(i in 1:length(dirlist)){										#\
			SIM[[i]]<-read.fit(paste(dirlist[i],"run/sam",sep="/"), reduced=TRUE);					#\
			};													#\
			save(SIM,file="../$(BD)/SIM.RData")' | $(useR) 1>> ../$(LD)/sim.out 2>> ../$(LD)/sim.err 
	cd SIM; rm -rf $(simdirs); cd .. 
	touch $(SD)/plotscript.R
	${MAKE} plot

SIM/dirsok: $(BD)/sam.std $(SD)/sim.R
	echo 'source("src/sim.R")'| $(useR) 1> $(LD)/sim.out 2> $(LD)/sim.err 

simdirs = $(shell ls SIM | grep "[0-9]$$")
simfiles = $(foreach dir,$(simdirs),SIM/$(dir)/run/sam.std)

$(simfiles): SIM/dirsok 
	-cd $(@D); (ulimit -t 1800; nice -n 19 ./sam -nr 2 -noinit -iprint 1 1> $(shell echo ../../../$(@D) | sed s/[/]run/model.out/) 2> model.err)


