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
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\)"



.SILENT: $(checks) status

.PHONY = clean compile updatetest test runtest data run 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) 

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")' | 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",eol="\r\n")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err

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",eol="\r\n")' | R --slave --vanilla 1> $(LD)/source.out 2> $(LD)/source.err

data: $(BD)/sam.dat 
$(BD)/sam.dat: $(datafiles) $(BD)/sam $(SD)/datascript.R $(SD)/datavalidator.R 
	rm -rf $(runfiles) 
	echo 'source("$(SD)/datascript.R")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err
	cd $(BD); ./sam -datatestonly 1>> ../$(LD)/data.out 2>> ../$(LD)/data.err; cd ..
	echo 'source("$(SD)/datavalidator.R"); compareclone("$(BD)/sam.dat","$(BD)/dataclone.log")' | R --slave --vanilla 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")' | R --slave --vanilla 1> $(LD)/data.out 2> $(LD)/data.err 

defcon: $(conffiles)
$(conffiles): $(BD)/sam.dat $(SD)/datavalidator.R $(SD)/defaultconf.R
	echo 'source("src/defaultconf.R"); gen.conf()' | R --slave --vanilla 1> $(LD)/conf.out 2> $(LD)/conf.err;
	cp -f $(CF)/model.cfg $(CF)/retro.cfg $(CF)/leaveout.cfg $(BD)
	cd $(BD); ./sam -dataconftestonly 1>> ../$(LD)/conf.out 2>> ../$(LD)/conf.err; cd ..
	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"); compareclone("$(BD)/model.cfg","$(BD)/confclone.log", filetag="Conffile")' | R --slave --vanilla 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")}' | R --slave --vanilla 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")' | R --slave --vanilla 1>> $(LD)/conf.out 2>> $(LD)/conf.err; cd ..
	cd $(BD); find . -maxdepth 1 -type f ! -regex $(keeprunfiles) -delete

run: $(BD)/sam.std

$(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

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 $(SD)/common.R
	echo 'source("src/plotscript.R");' | R --slave --vanilla 1> $(LD)/plot.out 2> $(LD)/plot.err 

forecast: $(BD)/FORECAST.RData
$(BD)/FORECAST.RData: $(BD)/sam.std $(SD)/forecast.R $(CF)/forecast.cfg
	echo 'source("src/forecast.R");' | R --slave --vanilla 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: RETRO/dirsok 
	${MAKE} $(retrofiles) -j 10       
	cd RETRO; echo 'source("../$(SD)/common.R"); 							     							#\
             dirlist<-dir(pattern="[[:digit:]]$$");									     					#\
			 RETRO<-list();									     											#\
			 for(i in 1:length(dirlist)){							     									#\
			   RETRO[[i]]<-read.fit(paste(dirlist[i],"sam",sep="/"), reduced=TRUE);		     				#\
			 };										     													#\
			 save(RETRO,file="../$(BD)/RETRO.RData")' | R --slave --vanilla 1>> ../$(LD)/retro.out 2>> ../$(LD)/retro.err 
	cd RETRO; rm -rf $(retrodirs); cd ..
	touch $(SD)/plotscript.R 
	${MAKE} plot

RETRO/dirsok: $(BD)/sam.std $(CF)/retro.cfg
	cd RETRO; echo 'filen<-textConnection(gsub("^[[:blank:]]#.*","",readLines("../$(CF)/retro.cfg")));   	#\
			ret<-read.table(filen,header=FALSE);						     								#\
            sapply(1:nrow(ret),function(i){			    						     						#\
                         dir <- formatC(i, flag="0", width=3);			     								#\
					     system(paste("mkdir",dir));				     									#\
					     system(paste("cp ../$(BD)/*",dir));			     								#\
					     system(paste("rm ", dir,"/sam.std", sep=""));		     							#\
					     cat(as.numeric(ret[i,]),file=paste(dir,"reduced.cfg",sep="/")); 					#\
					   }								     												#\
                               ) '| R --slave --vanilla 1> ../$(LD)/retro.out 2> ../$(LD)/retro.err 
	touch RETRO/dirsok

retrodirs = $(shell ls RETRO | grep "[0-9]$$")
retrofiles = $(foreach dir,$(retrodirs),RETRO/$(dir)/sam.std)

$(retrofiles): RETRO/dirsok
	cd $(@D); mv sam.par sam.pin; cd ..
	-cd $(@D); (ulimit -t 1800; nice -n 19 ./sam -nr 2 -noinit -iprint 1 1> ../../$(@D)model.out 2> model.err)


##### LEAVE OUT STUFF

leaveout: $(BD)/LO.RData

$(BD)/LO.RData: LO/dirsok 
	${MAKE} $(lofiles) -j 10       
	cd LO; echo 'source("../$(SD)/common.R"); 							     								#\
             dirlist<-dir(pattern="[[:digit:]]$$")									     					#\
			 LO<-list();									     											#\
			 for(i in 1:length(dirlist)){							     									#\
			   LO[[i]]<-read.fit(paste(dirlist[i],"sam",sep="/"), reduced=TRUE);						    #\
			 };										     													#\
			 save(LO,file="../$(BD)/LO.RData")' | R --slave --vanilla 1>> ../$(LD)/lo.out 2>> ../$(LD)/lo.err 
	cd LO; rm -rf $(lodirs); cd .. 
	touch $(SD)/plotscript.R
	${MAKE} plot

LO/dirsok: $(BD)/sam.std $(CF)/leaveout.cfg
	cd LO; echo 'filen<-textConnection(gsub("^[[:blank:]]#.*","",readLines("../$(CF)/leaveout.cfg")));   	#\
			lo<-read.table(filen,header=FALSE);						     									#\
                        sapply(1:nrow(lo),function(i){    						     						#\
                         dir <- formatC(i, flag="0", width=3);								     			#\
					     system(paste("mkdir",dir));				     									#\
					     system(paste("cp ../$(BD)/*",dir));			     								#\
					     system(paste("rm ", dir,"/sam.std", sep=""));		     							#\
					     cat(as.numeric(lo[i,]),file=paste(dir,"reduced.cfg",sep="/"));  					#\
					   }								     												#\
                               ) '| R --slave --vanilla 1> ../$(LD)/lo.out 2> ../$(LD)/lo.err 
	touch LO/dirsok

lodirs = $(shell ls LO | grep "[0-9]$$")
lofiles = $(foreach dir,$(lodirs),LO/$(dir)/sam.std)

$(lofiles): LO/dirsok
	cd $(@D); mv sam.par sam.pin; cd ..
	-cd $(@D); (ulimit -t 1800; nice -n 19 ./sam -nr 2 -noinit -iprint 1 1> ../../$(@D)model.out 2> model.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")' | R --slave --vanilla 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")'| R --slave --vanilla 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)

