# Finds straight segments at a given scale and maps them to other scales.
# Last edited on 2008-02-04 13:01:21 by stolfi

INIBAND := 016

BANDS := 001 008 064 
NONBANDS := 002 004 016 032 128 256

# SHOWHIS := FALSE
SHOWHIS := TRUE

.PHONY: all clean hist ini-str map-str \
        draw-ini-str draw-mapped-str \
	all-bands \
	  single-clean \
          single-hist \
          single-get-str \
          single-map-str \
	  single-draw-mapped-str

# Top-level make starts here:
all: hist
# all: ini-str draw-ini-str
# all: draw-ini-str
# all: map-str
# all: draw-mapped-str
# all: refine
# all: clean

hist:
	${MAKE} TARGET=single-hist all-bands

ini-str: 
	${MAKE} BAND=${INIBAND} single-get-str

map-str:
	${MAKE} TARGET=single-map-str all-bands

draw-mapped-str:
	${MAKE} TARGET=single-draw-mapped-str all-bands

clean:
	${MAKE} TARGET=single-clean all-bands

# ======================================================================
# First-level recursive make - iteration over all scales
# Caller must define ${TARGET}

TARGET := TARGET.IS.UNDEFINED
ifneq "${TARGET}" "TARGET.IS.UNDEFINED"

all-bands:
	for band in ${BANDS}; do \
          ${MAKE} BAND=$$band ${TARGET}; \
        done

endif
# End of TARGET section
# ======================================================================

# Program path:
PROGDIR := ${STOLFIHOME}/programs/pm3-1.1.15/THESES/hcgl/1/bin/${PLATFORM}
SCRIPTDIR := ../../scripts
SETPATH := PATH=".:${PROGDIR}:${SCRIPTDIR}:$$PATH"; export PATH

# Directory for curve data:
CURVEDIR := ../../data/multiscale
NCURVES := 403
FIRSTCURVE := 0000
LASTCURVE  := 0402
ABIGCURVE  := 0002

# ======================================================================
# Second-level recursion - single BAND .
# Caller must define ${BAND}

BAND := BAND.IS.UNDEFINED
ifneq "${BAND}" "BAND.IS.UNDEFINED"

# Rule for converting parameter file from "csh" to "sh/bash" format
f${BAND}.shparms: f${BAND}.parms ${SCRIPTDIR}/convert-parms-to-sh
	${SCRIPTDIR}/convert-parms-to-sh < f${BAND}.parms > f${BAND}.shparms

# ----------------------------------------------------------------------
# Generate a full-curve segment file for a bunch of curves 

# Prefix for full-curve segment sample files
FULSEGPREFIX := f${BAND}-fulseg

NFULSEGS := 50

${FULSEGPREFIX}.seg: ${CURVEDIR}/${ABIGCURVE}/f${BAND}.fcv \
          ${SCRIPTDIR}/create-full-seg-file
	@echo "${CURVEDIR}/????/f${BAND}.fcv -> ${FULSEGPREFIX}.seg"
	${SETPATH}; \
          ${SCRIPTDIR}/create-full-seg-file \
            -v chainDir=${CURVEDIR} \
            -v iniCurve=${FIRSTCURVE} -v finCurve=${LASTCURVE} \
            -v band=${BAND} \
          > ${FULSEGPREFIX}.seg

# ----------------------------------------------------------------------
# Generate the curvature histogram for the full curves

# Prefix for curvature histogram files
FULHISPREFIX := f${BAND}-fulcvh

FULHISPLTFILES := ${FULHISPREFIX}-plain.plt ${FULHISPREFIX}-squeezed.plt 
FULHISEPSFILES := ${FULHISPREFIX}-plain.eps ${FULHISPREFIX}-squeezed.eps 

single-hist: ${FULHISEPSFILES}

FRACTALDIM := 1.00
SIGMACURV := 0.175
ALPHACRIT := 0.858
MAXCURV := ${shell echo `gawk -v band=${BAND} -v dim=${FRACTALDIM} -v alpha=${ALPHACRIT} 'BEGIN{printf "%8.6f", 1.2*alpha/exp(dim*log(band));}'`}

MAXFULHISSEGS := ${shell echo `gawk -v band=${BAND} 'BEGIN{printf "%d", 5*(band+1);}'`}

${FULHISPLTFILES}: ${FULSEGPREFIX}.seg \
          ${CURVEDIR}/${ABIGCURVE}/f${BAND}.fcv f${BAND}.shparms \
          ${PROGDIR}/PZCurvHistogram
	@echo "${CURVEDIR}/????/f${BAND}.seg -> ${FULHISPREFIX}-{plain,squeezed}.plt"
	-/bin/rm -f ${FULHISPREFIX}.plt
	${SETPATH}; \
          source f${BAND}.shparms; \
          nice -n 19 PZCurvHistogram @M3stackdump \
            -input ${FULSEGPREFIX} \
            -maxSegs ${MAXFULHISSEGS} \
            -chainDir ${CURVEDIR} -chainPrefix f \
            -band ${BAND} -extension ".fcv" \
            -maxCurv ${MAXCURV} \
            -sigmaCurv ${SIGMACURV} -fractalDim ${FRACTALDIM} \
            -output ${FULHISPREFIX}
      
${FULHISPREFIX}-plain.eps: ${FULHISPREFIX}-plain.plt
	${SCRIPTDIR}/draw-curvature-histogram \
          ${MAXCURV} \
          ${FULHISPREFIX}-plain.plt \
          ${FULHISPREFIX}-plain.eps \
          "lambda = ${BAND} plain"
ifeq "${SHOWHIS}" "TRUE"
	ghostview ${FULHISPREFIX}-plain.eps
endif
      
${FULHISPREFIX}-squeezed.eps: ${FULHISPREFIX}-squeezed.plt
	${SCRIPTDIR}/draw-curvature-histogram \
          1.2 \
          ${FULHISPREFIX}-squeezed.plt \
          ${FULHISPREFIX}-squeezed.eps \
          "lambda = ${BAND} squeezed"
ifeq "${SHOWHIS}" "TRUE"
	ghostview ${FULHISPREFIX}-squeezed.eps
endif

# ----------------------------------------------------------------------
# Get "straight" (low curvature) outline segments at appropriate scale

# Prefix for straight-segment files
INISTRPREFIX := f${BAND}-str

${INISTRPREFIX}.seg: \
          ${CURVEDIR}/${ABIGCURVE}/f${BAND}.flc f${BAND}.shparms \
          ${PROGDIR}/PZGetStraightSegs
	@echo "${CURVEDIR}/????/f${BAND}.fcv -> ${INISTRPREFIX}.seg"
	-/bin/rm -f ${INISTRPREFIX}.seg
	${SETPATH}; \
          source f${BAND}.shparms; \
          nice PZGetStraightSegs @M3stackdump \
	    -chainDir ${CURVEDIR} -chainPrefix f \
	    -nCurves ${NCURVES} \
            -band ${BAND} -step $$step \
	    -output ${INISTRPREFIX} \
	    -minLength 10 \
	    -blurFactor ${BLURFACTOR} \
	    -minCurvature $$minCurvature \
	    -printSegs 100

endif
# ......................................................................