Added doxygen generation
authorAnders Henja <anders@baltrad.eu>
Tue, 30 Aug 2011 08:37:58 +0000 (10:37 +0200)
committerAnders Henja <anders@baltrad.eu>
Tue, 30 Aug 2011 08:37:58 +0000 (10:37 +0200)
31 files changed:
Makefile
demo/200508091700_fmi.radar.raw_SITE=IKA_ELEV=01_DATA=Z.pgm.gz [new file with mode: 0644]
demo/200508091700_fmi.radar.raw_SITE=KOR_ELEV=01_DATA=Z.pgm.gz [new file with mode: 0644]
demo/200508091700_fmi.radar.raw_SITE=VAN_ELEV=01_DATA=Z.pgm.gz [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_seang_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_searl_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sease_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sehud_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sekir_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sekkr_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_selek_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_selul_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_seosu_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_seovi_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sevar_000000.h5 [new file with mode: 0644]
demo/Z_SCAN_C_ESWI_20100706110000_sevil_000000.h5 [new file with mode: 0644]
demo/composite-example.sh [new file with mode: 0755]
demo/dbz-16.png [new file with mode: 0644]
demo/iris-dbz-16.png [new file with mode: 0644]
demo/living-composite.sh [new file with mode: 0755]
demo/make-examples.sh [new file with mode: 0755]
demo/make-tests.sh [new file with mode: 0755]
doxygen/Makefile [new file with mode: 0644]
doxygen/drain_doxyfile.ini [new file with mode: 0755]
doxygen/rack_doxyfile.ini [new file with mode: 0644]
drain/drain.dox [new file with mode: 0755]
images/drain/radar-coordinates-fig.pdf [new file with mode: 0755]
images/drain/radar-coordinates-fig.png [new file with mode: 0755]
images/drain/radar-geometry-fig.pdf [new file with mode: 0755]
images/drain/radar-geometry-fig.png [new file with mode: 0755]
rack/rack.dox [new file with mode: 0644]

index 4dfdbb0..1dac170 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -49,15 +49,21 @@ install: def.mk
        @echo "LD_LIBRARY_PATH="`cat def.mk | grep LD_PRINTOUT | sed -e"s/LD_PRINTOUT=//"`
        @echo "################################################################"
 
+.PHONY:doc
+doc:
+       $(MAKE) -C doxygen doc
+
 .PHONY:clean
 clean:
        $(MAKE) -C drain clean
        $(MAKE) -C rack clean
        $(MAKE) -C pyrack clean
+       $(MAKE) -C doxygen clean
 
 .PHONY:distclean
 distclean:
        $(MAKE) -C drain distclean
        $(MAKE) -C rack distclean
        $(MAKE) -C pyrack distclean
+       $(MAKE) -C doxygen distclean
        @\rm -f *~ config.log config.status def.mk
diff --git a/demo/200508091700_fmi.radar.raw_SITE=IKA_ELEV=01_DATA=Z.pgm.gz b/demo/200508091700_fmi.radar.raw_SITE=IKA_ELEV=01_DATA=Z.pgm.gz
new file mode 100644 (file)
index 0000000..2acc5a3
Binary files /dev/null and b/demo/200508091700_fmi.radar.raw_SITE=IKA_ELEV=01_DATA=Z.pgm.gz differ
diff --git a/demo/200508091700_fmi.radar.raw_SITE=KOR_ELEV=01_DATA=Z.pgm.gz b/demo/200508091700_fmi.radar.raw_SITE=KOR_ELEV=01_DATA=Z.pgm.gz
new file mode 100644 (file)
index 0000000..635af52
Binary files /dev/null and b/demo/200508091700_fmi.radar.raw_SITE=KOR_ELEV=01_DATA=Z.pgm.gz differ
diff --git a/demo/200508091700_fmi.radar.raw_SITE=VAN_ELEV=01_DATA=Z.pgm.gz b/demo/200508091700_fmi.radar.raw_SITE=VAN_ELEV=01_DATA=Z.pgm.gz
new file mode 100644 (file)
index 0000000..cf44955
Binary files /dev/null and b/demo/200508091700_fmi.radar.raw_SITE=VAN_ELEV=01_DATA=Z.pgm.gz differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_seang_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_seang_000000.h5
new file mode 100644 (file)
index 0000000..b5123e5
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_seang_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_searl_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_searl_000000.h5
new file mode 100644 (file)
index 0000000..609106b
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_searl_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sease_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sease_000000.h5
new file mode 100644 (file)
index 0000000..0e94598
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sease_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sehud_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sehud_000000.h5
new file mode 100644 (file)
index 0000000..291ab36
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sehud_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sekir_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sekir_000000.h5
new file mode 100644 (file)
index 0000000..6208e7a
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sekir_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sekkr_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sekkr_000000.h5
new file mode 100644 (file)
index 0000000..5f6fccd
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sekkr_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_selek_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_selek_000000.h5
new file mode 100644 (file)
index 0000000..faf9045
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_selek_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_selul_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_selul_000000.h5
new file mode 100644 (file)
index 0000000..e9e841b
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_selul_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_seosu_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_seosu_000000.h5
new file mode 100644 (file)
index 0000000..4f04783
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_seosu_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_seovi_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_seovi_000000.h5
new file mode 100644 (file)
index 0000000..9808724
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_seovi_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sevar_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sevar_000000.h5
new file mode 100644 (file)
index 0000000..bcfba7e
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sevar_000000.h5 differ
diff --git a/demo/Z_SCAN_C_ESWI_20100706110000_sevil_000000.h5 b/demo/Z_SCAN_C_ESWI_20100706110000_sevil_000000.h5
new file mode 100644 (file)
index 0000000..a073181
Binary files /dev/null and b/demo/Z_SCAN_C_ESWI_20100706110000_sevil_000000.h5 differ
diff --git a/demo/composite-example.sh b/demo/composite-example.sh
new file mode 100755 (executable)
index 0000000..2ed35a1
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+DEBUG=${DEBUG:-'3'}
+
+# This is a selector for selecting between basically two modes.
+# The modes are not direct concepts of rack, but control this script.
+#
+# Direct mode (default). Read all the raw files and create a composite
+# MODE=
+#
+# Create a tile for a single radar (and save it)
+# MODE=tile
+#
+# Composite from tiles
+# MODE=tiled
+
+# Geographical bounding box 
+# BBOX=${BBOX:-18,58,28,63}    # Finland
+# BBOX=${BBOX:-'8,53,32,70.5'} # Finland and Sweden
+BBOX=${BBOX:-'5,45,32,70'}     # Baltradish
+
+# FMI only: retrieve background map
+#MAPFILE=mapserver_BBOX=$BBOX}_SIZE=${SIZE}_BGCOLOR=0x506090_MODULATE=70,70_MEDIAN=3.png
+
+
+# Size of the image
+# For Doxygen documentation, this size is rather small.
+# Practically, images of over 1000x1000 can be expected.
+#
+# SIZE=${SIZE:-640,800}
+# SIZE=${SIZE:-960,1200}
+SIZE=${SIZE:-800,1000}
+#SIZE=${SIZE:-200,400}
+
+# Compositing principle
+METHOD=${METHOD:-WAVG,3,2}
+# METHOD=MAX
+# METHOD=MAXQ
+
+# Postprocessing of bins
+# INTERPOLATION=d,0   Auto
+# INTERPOLATION=d,5,3 Short, slightly horizontal
+# INTERPOLATION=d,10,20
+INTERPOLATION=${INTERPOLATION:-'d,0'}
+
+# Polar product to be composited. Leave empty if first sweep only (PPI).
+# cappi: altitude, beam width
+POLARPRODUCT=${POLARPRODUCT:-'cappi,500,0.8'}
+POLARPRODUCT=( $POLARPRODUCT ) #trim
+
+polarproduct=${POLARPRODUCT:+'--'${POLARPRODUCT/,/ 500,}}
+
+
+# Uncomment this if you want anomaly detection and removal
+ANDRE=${ANDRE:-'--aSpeckle 32,30 --aEmitter 3,6 --rShip 32,6 --rBiomet 16,4,500,50 --aPaste --aGapFill 3 '}
+
+
+# Overall weight. In this script, this is for demonstration only.
+# The value can be varied for each radar, depending on its overall signal
+# quality etc. If uncommented, a random value will be used for illustration.
+#
+# WEIGHT=1.0
+
+if [[ $# == 0 ]]; then
+    echo "Usage:"
+    echo "  $0 *.h5"
+    echo "  BBOX=$BBOX SIZE=$SIZE METHOD=$METHOD $0 *.h5"
+    exit
+fi
+
+
+# PART 1: Initial part 
+command="rack --debug $DEBUG  --cBBox $BBOX  --cSize $SIZE  --cMethod $METHOD  --cInterpolation $INTERPOLATION
+"
+
+# PART 2: Input the given radars
+for i in $*; do
+    W=${WEIGHT:-"0.$RANDOM"}
+    command="$command $i $ANDRE $polarproduct --cCreateTile dw  --cAddTile $W
+"
+#  -o ${i%.*}-tile.h5
+#  -o ${i%.*}-tile.png
+done
+
+# PART 3: Extract image products from the composite
+command="$command --cExtract=dwSC -o composite.h5 --view 0 -o composite-data.png  --view 1 -o composite-weight.png --view 2 -o composite-discrepancy.png  --view 3 --rescale 10 -o composite-count.png --view 0 --threshold 60 --palette dbz-16.png -o composite-color.png"
+
+
+echo $command
+echo
+eval $command
+echo
+echo $command
+
+
+
+# FMI ONLY
+
+if [[ "$MAPFILE" != '' ]]; then
+    wget --no-clobber --proxy=off http://radar.fmi.fi/products/query/mapserver/$MAPFILE
+fi
+
diff --git a/demo/dbz-16.png b/demo/dbz-16.png
new file mode 100644 (file)
index 0000000..26a577f
Binary files /dev/null and b/demo/dbz-16.png differ
diff --git a/demo/iris-dbz-16.png b/demo/iris-dbz-16.png
new file mode 100644 (file)
index 0000000..26a577f
Binary files /dev/null and b/demo/iris-dbz-16.png differ
diff --git a/demo/living-composite.sh b/demo/living-composite.sh
new file mode 100755 (executable)
index 0000000..8c38c6d
--- /dev/null
@@ -0,0 +1,167 @@
+#!/bin/bash
+
+# Given TIMESTAMP, retrieves data
+
+#TIMESTAMP=${TIMESTAMP:-'201006281211'}
+TIMESTAMP=${TIMESTAMP:-'201006120000'}
+#TIMESTAMP=${TIMESTAMP:-`date --utc +'%Y%m%d%H%M'`}
+YEAR=${YEAR:-${TIMESTAMP:0:4}}
+MONTH=${MONTH:-${TIMESTAMP:4:2}}
+DAY=${DAY:-${TIMESTAMP:6:2}}
+HOUR=${HOUR:-${TIMESTAMP:8:2}}
+MINUTE=${MINUTE:-${TIMESTAMP:10:2}}
+MINUTE=$(( 10#$MINUTE ))
+MINUTE5=`printf '%02d' $(( 10#$MINUTE-10#$MINUTE%5 ))`
+TIMESTAMP="$YEAR$MONTH$DAY$HOUR$MINUTE5"
+TIMESTAMP_DIR=${TIMESTAMP_DIR:-"$YEAR/$MONTH/$DAY"}
+
+SITES='IKA VAN KOR ANJ'
+
+# Retrieve raw data
+
+function getData() {
+    mkdir -p tmp
+    for MINUTE in {0,1,2,3,4,5}{0,5}; do
+    #for MINUTE in {0,1}{0,5}; do
+       for SITE in $SITES; do
+           wget --proxy=off --no-clobber  http://radar.fmi.fi/products/query/$YEAR/$MONTH/$DAY/fi/fmi/radar/raw/$YEAR$MONTH$DAY$HOUR${MINUTE}_fi.fmi.radar.raw_SITE=${SITE}_VOL=00_DATA=Z.png -O tmp/$YEAR$MONTH$DAY$HOUR${MINUTE}-$SITE.png
+#          sleep 2
+       done
+    done
+}
+
+getData; 
+
+
+
+
+
+
+# Geographical bounding box (~Finland)
+#BBOX=18,58,28,63  # SOUTH
+#BBOX=17,58,30,67
+#BBOX=19,58,27,62  # tight
+BBOX=19,58,29,64  # tight
+#BBOX=17,57,31,68  # loose
+
+# Size of the image
+SIZE=480,600
+
+# Compositing principle
+  METHOD=WAVG,1,5
+# METHOD=MAX
+
+# Postprocessing of bins
+# d,0 = Auto
+# d,5,3 = Short, slightly horizontal
+#INTERPOLATION=d,2.0,3.0
+INTERPOLATION='d,0'
+
+# Polar product to be composited. Leave empty if first sweep only (PPI).
+POLARPRODUCT='--cappi 500,500,0.3'
+
+#FADE=0.8,2,-2
+FADE=0.8,0,0
+
+command_prefix="rack --cBBox $BBOX  --cSize $SIZE  --cMethod $METHOD  --cInterpolation $INTERPOLATION"
+
+# -cFade 0.7 --cRead
+
+# radar-KOR-00-Z.png $POLARPRODUCT --SITE KOR --cCreateTile dw --cAddTile 1.0 -o composite-tile-KOR.png \
+
+
+MAP=map-$BBOX-$SIZE.png
+
+wget --proxy=off  --no-clobber -O $MAP     http://radar.fmi.fi/products/query/mapserver_BBOX=${BBOX}_SIZE=${SIZE}_BGCOLOR=0x506090_MODULATE=70,70.png 
+
+
+
+
+
+#rm -v tmp/*tile*
+
+
+mkdir -p ./log
+rm -f log/* sites.log
+
+i=0
+TIMESTAMP_PREV=''
+
+#while (( i < 20 )); do
+while (( i < 10 )); do
+    # echo $i
+    MINUTE=`printf '%02d' $(( 10#$i ))`
+    MINUTE05=`printf '%02d' $(( 10#$i - 10#$i%5 ))`
+    #echo $MINUTE05 $MINUTE $RANDOM
+    # collect "received" data 
+    #SITES_NOW=''
+    SITES="`fgrep -v '#' living-composite-sites.txt | fgrep $MINUTE |cut -s -d' ' -f2-`"
+    echo $SITES     
+    echo $MINUTE $SITES >> sites.log
+    #echo ${SITES[*]}
+    # sleep 1
+    WEIGHT='1.0'
+    TIMESTAMP=$YEAR$MONTH$DAY$HOUR$MINUTE
+    TIMESTAMP05=$YEAR$MONTH$DAY$HOUR$MINUTE05
+    CMD_BODY=''
+    LOGFILE=log/$MINUTE05.log
+    echo "#$MINUTE" >> $LOGFILE 
+    for SITE in $SITES; do
+       P=`echo $POLARPRODUCT | tr -d -- '- '`
+       TILE=tmp/$TIMESTAMP05-tile-$SITE-$P.png
+       echo "# Generating $SITE (if missing)" >> $LOGFILE 
+              # Create tile, if missing
+              if [ ! -f $TILE ]; then
+                   input=tmp/$TIMESTAMP05-$SITE.png
+                   command="$command_prefix $input --threshold 64 $POLARPRODUCT --SITE $SITE --cCreateTile dw -o $TILE"
+                   echo $command >> $LOGFILE
+                   eval $command
+              fi
+        CMD_BODY="$CMD_BODY --cLoadTile $TILE --cAddTile $WEIGHT"
+    done;
+    echo $i 
+
+
+    # Use previous as backround, if exists.
+    TILED="tmp/$TIMESTAMP_PREV-tiled.png"
+    if [ -f $TILED ]; then
+       TILED="--cFade $FADE  --cLoad tmp/$TIMESTAMP_PREV-tiled.png"
+    else
+       TILED=''
+    fi
+
+    NICK=eradFade-$HOUR$MINUTE
+
+    command="$command_prefix  $TILED  $CMD_BODY --cExtract=dw  -o tmp/$TIMESTAMP-tiled.png --view 0 -o $NICK-d.png --view 1 --average 5  -o $NICK-w.png"
+    command="$command --copy 0,a --view a --rescale 2 --view f --palette dbz-16.png -o $NICK-c.png"
+
+
+    echo "# Generatimg composite $HOUR:$MINUTE" >> $LOGFILE
+    echo $command >> $LOGFILE
+    echo  >> $LOGFILE
+    eval $command
+
+    command="composite -compose over $NICK-c.png $MAP $NICK-m.png;"
+    echo $command >> $LOGFILE
+    eval $command
+    command="convert -append $NICK-m.png $NICK-w.png -resize '50%' $NICK-M.png" 
+    echo $command >> $LOGFILE
+    eval $command
+    echo  >> $LOGFILE
+
+# --view 0 -o composite-data.png  --view 1 -o composite-weight.png  
+# --view 0 --palette iris-dbz-16.png -o composite-color.png
+# $SITES_NOW
+    TIMESTAMP_PREV=$TIMESTAMP
+    i=$(( i + 1 ))
+#    sleep $SLEEP
+done
+
+convert +append erad-000?-M.png erad-$FADE-M.png
+
+cat `ls -1tr log/*` > log.txt
+cat log.txt
+
+echo 'cat `ls -1tr log/*`'
+echo "xv erad*-m.png erad*-M.png  erad*-d.png erad*-w.png"
+echo "rm -v tmp/*tile* erad*-?.png [0-9]?-???.png"
diff --git a/demo/make-examples.sh b/demo/make-examples.sh
new file mode 100755 (executable)
index 0000000..9edda2a
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+BATCH_FILE=examples.lst
+
+# Picks examples which can be executed "literally" ie. do not contain
+# variable markers like <value>
+
+grep ' *FILES\?=' ../main/*.dox > $BATCH_FILE
+grep '^[ ]*rack [^<]*' ../main/*.dox | fgrep -v '<'  >> $BATCH_FILE
+grep '^[ ]*convert [^<]*' ../main/*.dox | fgrep -v '<'  >> $BATCH_FILE
+
+#source
diff --git a/demo/make-tests.sh b/demo/make-tests.sh
new file mode 100755 (executable)
index 0000000..cc65670
--- /dev/null
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# Copyright Markus Peura 2010
+# This script tests rack by running examples mentioned in the manual.
+# Arguments:
+# 1 - FILE (=filename.h5)
+# 2 - starting test number (1=first)
+# 3 - STOP_ON_ERROR (1=yes)
+
+# Example commands will are collected from this file(s)
+# Only considers examples which can be executed as such, including
+# those with variables like $FILE but not those with <FILE>
+# This was just a trick to exclude the latter from this test.
+DOC_FILE="../main/*.dox" 
+
+# Example commands collected from rack.dox
+TEST_CMD_FILE=examples.lst
+
+
+# The input file which will be used in the tests.
+# You may overide this with the first argument (TEST_DATA) to this script.
+DEFAULT_TEST_DATA=( `cat $DOC_FILE | grep ' *FILE=' | cut -d= -f2` )
+FILE=$1
+export FILE=${FILE:-$DEFAULT_TEST_DATA}
+#echo $FILE
+#echo FILE=$FILE
+#exit
+IMAGE=( `cat $DOC_FILE | grep ' *IMAGE=' | cut -d= -f2` )
+
+
+# Output format for files that can be stored as H5 or images (png, jpg, etc.).
+# Not applied yet!
+FORMAT=${FORMAT:-'h5'}
+
+
+#echo > $TEST_CMD_FILE
+#grep ' *FILES\?=' ../main/*.dox 
+grep '^[ ]*rack [^<]*'    $DOC_FILE | fgrep -v '<'  >  $TEST_CMD_FILE
+grep '^[ ]*convert [^<]*' $DOC_FILE | fgrep -v '<'  >> $TEST_CMD_FILE
+
+
+echo './composite-example.sh Z_SCAN_C_ESWI_20100706110000_*.h5 201007061100_fi.fmi.radar.raw_*_VOL=00_DATA=Z.pgm.gz'   >> $TEST_CMD_FILE
+
+
+N=( `wc -l $TEST_CMD_FILE` )
+
+#N=$#
+
+echo "Number of test examples: $N"
+echo "Test data: FILE=$FILE";
+echo "Test data: IMAGE=$IMAGE";
+echo
+
+rm -f test-*.log
+
+STOP_AT_ERROR=${4:-'1'}
+FAILS=0
+#N=8
+#i=1
+i=${2:-'1'}
+while (( i <= N )); do
+    echo "Test $i:"
+    cmd="`cat -n $TEST_CMD_FILE | grep \" $i[^0-9]*rack\" | cut -c8-`"
+    #cmd="`cat -n $TEST_CMD_FILE | grep \" $i[^0-9]*convert\" | cut -c8-`"
+    echo "  $cmd"
+    eval $cmd > test-$i-cout.log
+    FAIL=$(( $? != 0 ))
+    FAILS=$(( FAILS + FAIL ))
+    echo "  $cmd"
+    if (( FAIL )); then
+       echo FAILED
+       if (( STOP_AT_ERROR )); then
+           eval "echo $cmd" 
+           if (( i == 1 )); then
+               echo "check: LD_LIBRARY_PATH (=$LD_LIBRARY_PATH)"
+           fi
+           break
+       fi
+    else
+       echo PASSED
+    fi
+    i=$(( i + 1 ))
+    echo 
+done
+
+
+
+#for i in $*; do 
+#    ls $i
+#    FAIL=$(( $? != 0 ))
+#    FAILS=$(( FAILS + FAIL ))
+#done
+
+echo FILE=$FILE
+echo
+echo "Result of $i (out of $N) tests:"
+echo " PASSED: " $(( i - FAILS )) #' (' $(( N - FAILS )) ')'
+echo " FAILED: " $FAILS
diff --git a/doxygen/Makefile b/doxygen/Makefile
new file mode 100644 (file)
index 0000000..c67b178
--- /dev/null
@@ -0,0 +1,46 @@
+###########################################################################
+# Copyright (C) 2011 Swedish Meteorological and Hydrological Institute, SMHI,
+#
+# This file is part of bRack.
+#
+# bRack is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# bRack is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public License
+# along with RAVE.  If not, see <http://www.gnu.org/licenses/>.
+# ------------------------------------------------------------------------
+# 
+# Doxygen make file
+# @file
+# @author Anders Henja (Swedish Meteorological and Hydrological Institute, SMHI)
+# @date 2011-08-30
+###########################################################################
+-include ../def.mk
+
+all:
+
+.PHONY: doc
+doc:
+       @mkdir --parent doxygen/html/drain
+       @mkdir --parent doxygen/html/rack
+       @doxygen drain_doxyfile.ini
+       @doxygen rack_doxyfile.ini
+
+.PHONY: clean
+clean:
+       @\rm -f *.o
+       @\rm -f *~ core
+
+.PHONY: distclean
+distclean: clean
+       @\rm -fr doxygen
+
+.PHONY: install
+install:
\ No newline at end of file
diff --git a/doxygen/drain_doxyfile.ini b/doxygen/drain_doxyfile.ini
new file mode 100755 (executable)
index 0000000..f94d97c
--- /dev/null
@@ -0,0 +1,22 @@
+# This is a base file for generating doxyfiles.
+
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "DRAIN"
+OUTPUT_DIRECTORY       = ./doxygen
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+
+INPUT                  = ../drain ../drain/drain.dox
+
+HTML_OUTPUT = html/drain
+IMAGE_PATH       = ../images/drain
+EXAMPLE_PATH     = ..
+RECURSIVE        = YES
+USE_PDFLATEX     = YES
+HAVE_DOT         = YES
+HIDE_SCOPE_NAMES = YES
+SOURCE_BROWSER   = YES
+
+# If you want to add or override settings, put the below this comment.
+# Suggestion: dont hack this, hack your Makefile instead...
diff --git a/doxygen/rack_doxyfile.ini b/doxygen/rack_doxyfile.ini
new file mode 100644 (file)
index 0000000..4819282
--- /dev/null
@@ -0,0 +1,22 @@
+# This is a base file for generating doxyfiles.
+
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "RACK"
+OUTPUT_DIRECTORY       = ./doxygen
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+
+INPUT                  = ../rack ../rack/rack.dox
+
+HTML_OUTPUT = html/rack
+IMAGE_PATH       = ../demo
+EXAMPLE_PATH     = ..
+RECURSIVE        = YES
+USE_PDFLATEX     = YES
+HAVE_DOT         = YES
+HIDE_SCOPE_NAMES = YES
+SOURCE_BROWSER   = YES
+
+# If you want to add or override settings, put the below this comment.
+# Suggestion: dont hack this, hack your Makefile instead...
diff --git a/drain/drain.dox b/drain/drain.dox
new file mode 100755 (executable)
index 0000000..a809a72
--- /dev/null
@@ -0,0 +1,33 @@
+/*!
+\author Markus Peura (at) fmi fi 2003-2010
+
+\mainpage
+
+\brief Drain is a cpp library containing general utilities, image processing functions and weather radar data processing functions.
+
+\section intro Introduction
+
+
+
+There are functions of three kinds:
+-# General purpose functions (directory drain/util, namespace drain) 
+-# Image classes and processing functions (directory drain/image, namespace drain::image) 
+-# Weather radar data classes and processing functions (directory drain/radar, namespace drain::radar) 
+
+Drain is a common building block of 
+- \b drainage - a general purpose image processing program
+- \b rack - a weather radar data processing program
+
+Some central classes:
+-# drain::util::  Data
+-# drain::util::  Options
+-# drain::image:: Image<T> - an image class based on std::vector<T>
+
+\section install Installation
+
+The following text is copied here from the file "INSTALL".
+
+\include INSTALL 
+
+*/
+
diff --git a/images/drain/radar-coordinates-fig.pdf b/images/drain/radar-coordinates-fig.pdf
new file mode 100755 (executable)
index 0000000..bd5ebe1
Binary files /dev/null and b/images/drain/radar-coordinates-fig.pdf differ
diff --git a/images/drain/radar-coordinates-fig.png b/images/drain/radar-coordinates-fig.png
new file mode 100755 (executable)
index 0000000..cde9283
Binary files /dev/null and b/images/drain/radar-coordinates-fig.png differ
diff --git a/images/drain/radar-geometry-fig.pdf b/images/drain/radar-geometry-fig.pdf
new file mode 100755 (executable)
index 0000000..885d839
Binary files /dev/null and b/images/drain/radar-geometry-fig.pdf differ
diff --git a/images/drain/radar-geometry-fig.png b/images/drain/radar-geometry-fig.png
new file mode 100755 (executable)
index 0000000..e069023
Binary files /dev/null and b/images/drain/radar-geometry-fig.png differ
diff --git a/rack/rack.dox b/rack/rack.dox
new file mode 100644 (file)
index 0000000..97f00a3
--- /dev/null
@@ -0,0 +1,778 @@
+// Notice! This text file contains examples which are automatically collected
+// and tested in demo/demo.sh
+//
+/*!
+ \mainpage Rack – a radar data processing program
+
+
+ \section Introduction
+ \b Rack is a command-line program for processing weather radar data.
+ It uses raw measurement data as input and 
+ generates \b single-radar \b products as well as \b composite \b image \b products. 
+ \b Rack also provides general image processing functions such as applying colors and transparency.
+ Future versions will increasingly support using quality data.
+ In \b Rack, an elementary operation is to compute a single-radar product
+ which is, like input data, in \b polar \b coordinates. In the following,
+ the term \b polar \b product will refer to that.
+ The results can be further mapped to Cartesian images and radar
+ image composites.  Currently, Cartesian single-radar images can be
+ generated in \i azimuthal equidistant (AEQD) projection or directly
+ in LAT-LON array. Composites can be currently generated only in
+ LAT-LON array.  In future, all the projections supported by Proj4
+ library will be included (http://trac.osgeo.org/proj/).
+  
+ The data flow is illustrated below. For details, see Appendix. 
+  
+ \dot
+  digraph example {
+         rankdir=LR;
+      node [shape=record, fontsize=10];
+      edge [color=black, fontsize=10];
+
+       volume [ label="Input volume\n(HDF5)" URL="\ref volume"];
+       image [ label="Input image" URL="\ref volume"];
+    polar [ label="Polar product" URL="\ref polar"];
+    cartesian [ label="Cartesian product\n(Single-radar or composite)" URL="\ref B"];
+    /* colour [ label="Colour product" URL="\ref B"]; */
+
+       volume -> image [label = "conversion"];
+       image -> image  [label = "anomaly detection"];
+       image -> polar -> cartesian; /* -> colour; */
+            
+  }
+  \enddot
+  
+  
+ Originally, \b Rack was based on handling standard image data formats
+ as input and output for both raw data and image products.  Current
+ versions support reading HDF5 file format, under the information
+ model ODIM agreed by OPERA. Current version partially supports writing
+ HDF5-ODIM files.
+
+ \section file_geometry Geometry
+ Primarily, \b Rack handles azimuthal volume scans stored in \em polar
+ coordinate system. In the current version, only one orientation is
+ supported: the radar is at left, first row contains the bins of the
+ beam pointing to north, followed by the other beams, line by line,
+ clockwise around the full circle.
+ \image latex radar-VAN-00-sweep0-Z.png "" width=0.5\textwidth
+
+ \image html radar-VAN-00-sweep0-Z.png "" width=0.5\textwidth
+ \section commands Usage
+
+ \subsection command_line_format Command line arguments
+ \b Rack accepts three kinds of command line arguments:
+ -# plain arguments, which are handled as input files to the program
+ -# options requiring arguments,  like \c --output-file \em file
+ -# options without arguments, like \c --help 
+ The command line options start with "--". Some options have also a single-letter
+ shorthand, starting with "-".
+ There are two features in which the argument syntax differs from POSIX and GNU conventions:
+ - options cannot be grouped, e.g.  \c -x \c -y cannot be abbreviated \c -xy.
+ - all the arguments are handled in order; they can be thought as commands to be executed sequentially   
+
+ A typical invocation of \b Rack is:
+ \code
+ rack <input-files>  <command1> --o <file1>   <command2> --o <file2>  ...
+ \endcode
+
+ Usage info and a list of commands is dumped if \c --help or \c -h or no arguments are supplied:
+ \code
+ rack --help
+ \endcode
+ Help is also available for invidual commands:
+ \code
+ rack --man <command>
+ \endcode
+ The version of the program is displayed with 
+ \code
+ rack --version
+ \endcode
+ Another useful commands are \c --debug \c <level>  and \c --status, which give debugging information of 
+ data flow and image memory. 
+
+  
+ \subsection file_read Reading files
+
+\b Rack supports reading volumes in both HDF5 ODIM and standard image formats. 
+ The data must be ordered as sweeps, each ray as a line,
+ in clockwise polar coordinates, starting from the North.
+
+ Input files are given as plain arguments, that is, 
+ without a leading "--" switch. A single
+ sweep or volume can be read simply as 
+
+\code
+ rack  $FILE
+ \endcode
+
+ By default, \b Rack reads dBZ fields only, that is, data arrays with
+ path pattern ending with \c '1/data' (ODIM convention).
+  The pattern can be changed with \c --h5Data.
+
+Current version of \b Rack internally converts an HDF5 object to a multi-channel image.
+(This may change in future versions.) The central ODIM attributes under \c /what and \c /where
+ groups will stored as string valued \c KEY=VALUE mappings in two ways:
+ -# with original paths as KEYs, for example 
+    \c /dataset1/data1/where/rscale=1000
+ -# with two trailing path components as KEYs preceeded with \c '@' and concatenating values to VALUE, for example 
+    \c \@where/rscale=1000,1000,2000,2000
+
+ In memory, the image area is however continuous, consisting of input images appended 
+ vertically, as shown in the image below. Hint: use option \c --view \c F  to also handle the image this way.
+ There is currently no support for volumes containing sweeps with different azimuthal resolutions. 
+  
+ \image html  volume-catenated2.png "Example of concatenating images to a volume file." width=0.9\textwidth
+ \image latex volume-catenated2.png "Example of concatenating images to a volume file." width=0.9\textwidth
+
+  In the examples of this manual, shell variables \c $FILE and \c $FILES will refer to
+  a single file or multiple files, for example:
+ \code
+  FILE=Z_SCAN_C_ESWI_20100706110000_seang_000000.h5
+  FILE=201011120600_IKA.PPI1_A.h5
+  FILES="radar-VAN-*-Z.png"
+  IMAGE=radar-volume.png
+  \endcode
+
+ One of the simplest functions one can do with rack is to convert an HDF5 file to an image:
+  
+  \code
+  rack $FILE -o $IMAGE
+  \endcode
+
+In the example code in the rest of this manual, there are typically separate examples for outputs in
+HDF5 and image format. 
+    
+
+\section quality Support for quality data
+
+In this context, \em data \em quality refers to numerical information
+associated with data in order to describe their accuracy or
+uncertainty, hence usability. The geometry of quality data can be the
+same with the actual (measurement) data, or be sector-wise,
+range-wise, or global. The next chapter explains how \b Rack 
+creates and applies quality information in detecting anomalies.
+However, users more interested in basic products can skip this section.  
+
+\subsection andre Anomaly detection and removal
+
+A radar measurement consists of echoes originating not only from precipitation but also from
+insects, birds, aircraft, ships, ground and sea clutter as well as from electromagnetic emitters.
+   
+\b Rack is designed to support detection of several types of anomalies.  
+ Part of the detectors have been embedded as such from older software ("Ropo").
+ Newer development, called \b AnDRe is implemented using \b Drain library and 
+ routines of \b Rack. The current support includes detection of:  
+
+-# speckle noise (AnDRe, RoPo)
+-# ships (Ropo)
+-# emitter lines (AnDRe, RoPo)
+-# birds and insects (RoPo)
+
+Anomaly detection commands of \b AnDRe and \b RoPo start with \c '--a' and \c '--r' , respectively.   
+The commands can be listed with 
+
+\code
+rack --man andre 
+rack --man ropo
+\endcode 
+
+The prococessing is divided into two stages: \b detecting anomalies and 
+\b removing the anomalous echoes from input data. The removal part does not consist of simpy erasing data, but replacing values with neighboring, more reliable ones.
+
+\subsubsection aSpeckle Detecting speckle noise
+
+Speckle detection needs two parameters: the threshold (currently in byte values) and
+speck size tolerance (in pixel area). This detector focuses on distinct, small specks,
+giving maximum value 255 to single-pixel segments, and progressively smaller values
+for larger segments.
+
+\code
+ rack $FILE --aSpeckle "16,8" -o andre-speckle.h5    --view F -o andre-speckle.png
+ convert  +append $IMAGE  andre-speckle.png speckle-all.png
+\endcode
+
+       \image html  speckle-all.png "" width=0.5\textwidth
+       \image latex speckle-all.png "" width=0.5\textwidth
+
+The respective RoPo speckle detector takes minimum (byte) intensity as a parameter:
+\code
+ ack $FILE --rSpeckle 32 -o  ropo-speckle.h5    --view F -o ropo-speckle.png      
+\endcode
+
+
+\subsubsection aEmitter Detecting emitters (electromagnetic interefence)
+
+AnDRe emitter detection needs two parameters: the maximal thickness of line segments and minimum length.
+
+\code
+ rack $FILE --aEmitter "2,6" -o andre-emitter.h5    --view F -o andre-emitter.png  
+ convert +append $IMAGE andre-emitter.png emitter-all.png
+\endcode
+
+ \image html  emitter-all.png "" width=0.5\textwidth
+ \image latex emitter-all.png "" width=0.5\textwidth
+The respective RoPo emitter takes minimum (byte) intensity and minimum segment length as parameters:
+
+\code
+ rack $FILE --rEmitter "32,6" -o ropo-emitter.h5    --view F -o ropo-emitter.png  
+\endcode
+
+\subsubsection aShip  Detecting ships
+
+The RoPo ship detector takes minimum (byte) intensity and minimum segment area as parameters:
+
+\code
+ rack $FILE --rShip "32,6" -o ropo-ship.h5    --view F -o ropo-ship.png  
+\endcode
+
+
+\subsubsection aBiomet  Detecting birds and insects
+
+The RoPo bird and insect detector ("biometeor" detector) is a very simple one, detecting 
+intensities lower than a threshold and altitudes lower than another threshold. The thresholds are fuzzy, 
+having an associated steepness parameters.
+Hence, there are four parameters: max intensity, intensity steepness, maximum altitude, and altitude steepness.
+
+\code
+ rack $FILE --rBiomet "16,4,500,50" -o ropo-biomet.h5    --view F -o ropo-biomet.png  
+\endcode
+
+\subsubsection andreCumulation  Cumulating detections
+
+ Typically, user wants to detect several different types of anomalies.
+Internally, \b Rack maintains two images for storing detection result:
+-# A probabilistic result of the latest detection operator
+-# A cumulative result of all the detection operators executed   
+
+Finally, the cumulated result can be attached to the original image (radar volume) with command
+\code
+ --aPaste
+\endcode 
+In the operation, the field is inverted, reflecting probability of \i meteorological echoes, ie.
+quality of the data.
+
+\subsubsection andredetection  Removal phase
+
+
+Then, the volume can be supplied to another software that further analyses the data and modifies
+quality field. 
+
+\b Rack also contains a method to enhance the data by replacing values of low quality with values
+of nearby locations having better quality. This is done with \c aGapFill command that has
+having horz and span as parameters, ie. bin count and azimuthal span. 
+
+The following code illustrates the overall process with two detectors.
+
+\code
+  rack $FILE  --aSpeckle 32,30 --aEmitter 3,6 --rShip 32,6 --rBiomet 16,4,500,50 --aPaste --aGapFill 3,3 --o andre-corrected.h5
+  rack $FILE  --aSpeckle 32,30 --aEmitter 3,6 --rShip 32,6 --rBiomet 16,4,500,50 --aCumulated --view F -o andre-cumulated.png --aPaste --aGapFill 3,3 --view 0  --o andre-corrected.png   
+  convert +append $IMAGE andre-corrected.png andre-cumulated.png andre-result.png
+\endcode   
+
+       \image html  andre-result.png "" width=0.5\textwidth
+       \image latex andre-result.png "" width=0.5\textwidth
+
+
+
+
+ \section products Product generation
+
+ Primarily, \b Rack computes meteorological products in polar
+ coordinate system.  The resulting product is also in polar
+ coordinates, hence called a \b polar \b product.  It can be also
+ called as an intermediate product because such a product is often processed
+ further on, for example added to a composite or transformed to a
+ Cartesian single-radar image.  This design feature adds speed to
+ production since many final products can be computed from the same
+ polar product.  This also facilitates developing the software, as a
+ new meteorological algorithm needs to be programmed in a single
+ module only.
+ Typically, many end users
+ want to view products in Cartesian coordinate system.
+ The simplest polar "product" is the volume itself. 
+ A lowest-sweep Cartesian PPI image can be created
+ and saved as follows:
+   
+ \code
+ rack $FILE --cartesian 600  -o ppi-cartesian.h5    --view 0 -o ppi-cartesian.png
+ \endcode
+ where '600' is the width and height of the resulting image and '0' is the index of the lowest sweep.
+ The result is in \e azimuthal \e equidistant
+  (AEQD) projection.  
+ For image products, colours can be added with \c --palette command:
+ \code
+ rack $FILE --cartesian 600,0 -o ppi-cartesian-gray.png --palette dbz-16.png -o ppi-cartesian-color.png
+ \endcode
+ \subsubsection maxEcho MaxEcho - maximum dBZ above surface point
+ In generating some of the available products, alpha channels 
+ can be used for providing quality information.
+ The usage is explained in the context of applicable products. 
+
+ \subsubsection maxEcho MaxEcho - maximum dBZ above surface point
+
+
+\code
+ rack $FILE --maxEcho 500 -o maxEcho.h5
+ rack $FILE --maxEcho 500  --cartesian 500 --view a -o maxEchoQ.png \
+   --view 0 --palette dbz-16.png -o maxEcho.png
+\endcode
+
+ \image html ppi-maxEcho.png "ppi maxEcho" width=0.5\textwidth
+
+
+ \subsubsection cappi PseudoCAPPI - constant-altitude planar position indicator
+
+
+ The famous horizontal intersection of the radar sweeps, PseudoCAPPI, 
+ is obtained as follows:
+
+\code
+ rack $FILE --cappi 500,1500 -o pseudoCAPPI.h5
+ rack $FILE --cappi 500,1500 --cartesian 500 --view a -o cappiQ.png --view 0 --palette dbz-16.png -o cappi.png 
+\endcode
+
+ The first argument is the width of the polar image product; the
+ height is that of the input sweeps. The second argument (1500) is the
+ altitude in metres, zero by default.  Between beams, the value is
+ interpolated \em radially (not vertically or horizontally) from the
+ upper and lower beams. The upper and lower reflectances are weighted
+ using a pseudo Gaussian beam power curve. The result has two
+ channels; the interpolated dBZ values and quality field displaying
+ high values near the beam intersections. The width of the modelled
+ beam power may be changed by giving it as the third argument.
+
+ \image html  cappi-twin.png "Cappi" width=0.5\textwidth
+
+ In further products, like in composites, the quality field can be
+ used in weighting data from different radars. For example,
+ nearest-radar composite is obtained creating first 0m CAPPIs and
+ combining data from radars with maximum-quality principle.
+
+ \subsubsection echoTop Echo top or bottom altitude
+
+As with the polar products above, the first argument is the width.
+Selection of echo top or bottom is done in the second parameter, 
+\c max or \c min .
+
+\code
+ rack $FILE --echoTop 500,max  -o echoTop.h5
+ rack $FILE --echoTop 500,max  --cartesian 500  --view a -o echoTopQ.png --view 0  --palette dbz-16.png  -o echoTop.png  
+\endcode
+
+ \image html  echoTop-twin.png "" width=0.5\textwidth
+
+\code
+ rack <$FILE> --echoTop 500,min  --cartesian 500  --view a -o echoBottomQ.png --view 0  --palette dbz-16.png  -o echoBottom.png 
+\endcode
+
+ \image html  echoBottom-twin.png "Echo top." width=0.5\textwidth
+ \image latex echoBottom-twin.png "Echo top." width=0.5\textwidth
+
+ \image html ppi-cappi-maxEcho-echoTop.png "Echo top." width=0.5\textwidth
+
+
+
+\subsection imageprocessing General image processing
+\b Rack program contains several general image processing functions. These have been directly imported
+from the \b Drain image processing library from the developer of \b Rack.
+A couple of functions are listed below. For currently available functions, type:
+\code
+ rack --man drain
+\endcode
+ See appendix for details.
+ \subsubsection palette Applying palette
+ Color palettes can be applied easily. \b Drain creates a palette of 256 colors from a colour 
+ image supplied by the user. 
+ The colors are collected from the diagonal passing from upper-left to lower-right corner of the supplied image.
+  
+ \code
+ rack $FILE --cartesian 500,0 --palette dbz-16.png -o radar-ppi-cart-rgb.png
+ \endcode
+ \subsubsection transparency Adding transparency
+ For various purposes, an image can be added a transparent channel, so called alpha channel.
+ In radar images, a natural choice is to leave undetected areas transparent.
+ Examples:
+ \code
+ rack $FILE --cartesian 500,0 --copy 0,a --rescale 1.5 -o radar-ppi-cart-a.png
+
+ rack $FILE --cartesian 500,0 --copy 0,a --rescale 1.5 --palette dbz-16.png -o radar-ppi-cart-rgba.png
+
+ rack $FILE --cartesian 500,0 --copy 0,a --view a --rescale 1.5 --view f --palette dbz-16.png -o radar-ppi-cart-rgba.png
+ \endcode
+  
+ The results are shown below:
+
+ \image html  radar-ppi-cart-set.png "Examples of applying palette and transparency."
+ \image latex radar-ppi-cart-set.png "Examples of applying palette and transparency." width=0.9\textwidth
+
+
+
+ \section compositing  Compositing
+
+\b Rack can also create radar image composites, sometimes called mosaics. 
+Compositing can be carried out in two different ways:
+
+- \b Direct \b mode: radars are projected sequentially on the array
+- \b Distributed \b mode: each radar is projected to a separate file; these subimages or "tiles" are later re-read and pasted to the composite by a separate, asynchronous process  
+
+\subsection cDirect Direct mode
+
+Creating composites in a direct mode involves the following steps:
+
+-# Initialising a compositing array to given size and geometrical scope
+-# For each radar, reading volume data and projecting them on the array 
+-# Extracting the final product from the array 
+
+In the following, these steps are explained though example code. 
+
+A blank compositing image of size 800x1000 pixels, ranging over Fennoscandia, is initialized with the following 
+commands: 
+\code 
+--cBBox 8,53,32,70.5   # Geographical extent;  lon,lat of lower left and upper right corner 
+--cSize 800,1000        # Resolution of the cumulation array 
+--cMethod WAVG,3,2      # Compositing principle (AVG | MAX | MAXW | WAVG,p,r )
+--cInterpolation d,0   # Interpolation method (smoothing polar-to-Cartesian injection)
+\endcode
+
+Alternatively, one may start by reading an existing base image:
+\code
+  --cLoad composite.h5   # Read an existing (previous) composite image to the array 
+  --cFade 0.95           # Optional: multiply the quality channel by a coefficient smaller than 1.0. 
+\endcode
+ The size and geometrical scope are set to those found in metadata of the composite-file. Fading is motivated by 
+ substituting missing radars with older measurements with however lower confidence, ie. lower quality weights.  
+
+The compositing method can be one of the following:
+- \b AVG - average dbz (done in db scale)
+- \b MAX - maximum dbz
+- \b MAXW - maximum-quality (using quality provided by anomaly detection and/or polar product generation)
+- \b WAVG,\i p,\i r - weighted average with data and quality enhancement coefficients \i p  and  \i r .
+
+Interpolation is needed, because compositing is based on \i injective projection, ie. forward mapping
+from polar product (or sweep) to a cartesian image. Currently \c d is the only method 
+(distance transformation based). The second parameter gives the spread radius in pixels (0 = automatic).
+
+Next, each radar is read and added to the compositing array. Between reading and projecting data, one may apply
+anomaly detection. The following commands are repeated for each radar:
+
+\code
+  $FILE             # Read a radar volume
+    <aCommands>     # Optional: anomaly detection; see separate section 
+  --cappi  500,0.8  # Polar product, or lowest PPI if not given
+  --cCreateTile dw  # Create subcomposite
+  --cAddTile 0.95   # Copy subcomposite to the actual compositing array
+\endcode
+
+Anomaly detection part consists of anomaly detection commands followed by \c --aPaste and \c --aGapFill commands.
+Notice that in the above example one may save the result at any stage with \c --output_file command.
+
+
+ \image html  composite-color.png "" width=0.5\textwidth
+ \image latex composite-color.png "" width=0.5\textwidth
+
+ \image html  composite-weight.png "" width=0.5\textwidth
+ \image latex composite-weight.png "" width=0.5\textwidth
+ The commands added to the abovementioned involve reading the volume, creating a tile and adding it immediately
+ to the compositing array:
+ \code
+  ... <file>  --cCreateTile dw --cAddTile <weight> 
+ \endcode
+ where \c weight is between 0.0 (valueless data) and 1.0 (data with maximum quality).
+\subsubsection tiled Distributed compositing
+
+(Documentation under construction.)
+
+
+Distributed compositing mode involves storing each tile as a file once created. The commands added to
+the abovementioned general ones are 
+ \code
+   $FILE --cCreateTile dw -o $TILE_FILE 
+\endcode
+ \image html  composite-tile-KOR.png "" width=0.5\textwidth
+ \image latex composite-tile-KOR.png "" width=0.5\textwidth
+
+ \image html  composite-tile-IKA.png "" width=0.5\textwidth
+ \image latex composite-tile-IKA.png "" width=0.5\textwidth
+
+ \image html  composite-tile-VAN.png "" width=0.5\textwidth
+ \image latex composite-tile-VAN.png "" width=0.5\textwidth
+
+Upon constructing the composite from tiles stored as files, one may start by initiating the
+compositing array with general initiation commands, or 
+
+
+
+  
+ \subsubsection helpcomposite Compositing commands
+
+ As compositing is a complicated task of its own kind, the related commands 
+ are distinguished with a prefix \c --c . 
+ // When using \b Rack, check the available set of compositing 
+ // commands with \c --man \c composite .
+ // \include help-composite.txt 
+
+
+
+
+ \section appendix Appendix
+
+ \subsection installation Installation
+
+  Instructions for installation are not maintained separately in this
+ manual, but in \c INSTALL file, which is embedded below.
+
+ \include INSTALL
+
+
+ \section imageFiles Reading standard image files
+
+
+ Standard grayscale images containing raw measurement data can be read directly: 
+ \code
+ rack radar-VAN-00-Z.png
+ \endcode
+
+ In order to handle data properly, \b Rack needs some metadata. 
+ If the image contains only one sweep in clockwise polar coordinates,
+ some simple products can be computed without metadata.
+ Metadata can be encoded as comments of type \c KEY=VALUE inside 
+ the file or given on command line like \c --KEY=VALUE. 
+
+
+ \b Rack tries to conform to ODIM as far as possible.
+
+ Some of the essential variables with example values are the following:
+ \code
+  @what/elangle=0.3,1.0,1.5
+  @what/nbins=500,500,460
+ \endcode
+
+ In addition, there are less critical metadata variables which are
+ not expected to be stored in file headers but which can be changed by
+ user.
+ The current variable names originate from traditional FMI variable names. 
+ Renaming them, for better compliance with HDF5-ODIM, is currently under work.
+ Multi-elevation images are also supported. 
+ Such image consists of elevation sweeps concatenated vertically. 
+ The metadata may be encoded in the header as above, or given in command line, for example:
+ \code
+ rack  <file1> <file2> <file3> --@what/elangle 0.5,1.0,1.5  --@what/nbins 500,500,460    
+ \endcode
+ Supplying the number of bins is optional, if all the bin counts equal the image width. 
+ Also a single input file may contain an image catenated from several elevations. 
+ If metadata is found in headers, it will be automatically concatenated.
+ Internally, \b Rack constructs an image in which each channel presents a sweep. 
+ For example, lowest sweep (channel #0) can be
+ extracted with \c --view command:
+ \code
+ rack $FILE --view 0 -o radar-00-sweep0-Z.png
+ \endcode
+   
+
+
+ \section cExample Compositing example 
+ An example script for compositing. Radar volume files are given as arguments.
+
+
+\include composite-example.sh
+
+ \subsection understanding Understanding Rack
+
+ \subsubsection odim Handling the ODIM variables
+
+
+\code
+
+\endcode
+
+
+ \subsubsection memory Understanding \b Rack 
+ Internally, \b Rack keeps five images in memory:
+ - \c inputImage   - the image in which volume data is loaded
+ - \c polarProduct - the image resulting from a radar algorithm, eg. PseudoCAPPI
+ - \c compositeImage - the intermediate image in creating a composite; floating-point valued; not accessible to user
+ - \c cartesianProduct - the result of mapping polarProduct or compositeImage to a final format
+ - \c colourProduct - the result of mapping any of the previous ones to an RGB or RGBA image.
+
+In addition, there are three dynamic images which have been implemented as pointers,
+hence they involve no memory allocation or copying:
+ - \c polarInput - the latest volume or polar product, if computed; applied by commands generating
+      Cartesian products
+ - \c grayInput -  the latest product computed (or the volume), applied by \c --palette command  
+ - \c currentImage - the latest product computed (or the volume), applied by \c --palette command
+
+
+
+  \dot
+  digraph example {
+      size="8,6"
+         rankdir=BT;
+      node [shape=record, fontname=Helvetica, fontsize=10];
+      edge [color=black, fontsize=8];
+
+      volume [ label="inputImage" URL="\ref volume"];
+      polar [ label="polarProduct" URL="\ref polar"];
+      cartesian [ label="cartesianProduct" URL="\ref B"];
+      colour [ label="colourProduct" URL="\ref B"];
+
+      composite [ label="compositeImage", color="lightgray" ];
+
+         polarptr [ label="*polarInput", shape=diamond ];
+         polarptr -> polar [style="dashed"];
+         polarptr -> volume [style="dashed"];
+
+         grayptr [ label="*grayInput", shape=diamond ];
+         grayptr -> volume [style="dashed"];
+         grayptr -> polar [style="dashed"];
+         grayptr -> cartesian [style="dashed"];
+         colour -> grayptr;
+         
+      output [ label="*currentImage", shape=diamond ];
+         output -> colour [ style="dashed"  ];
+      output -> cartesian [ style="dashed"  ];
+      output -> polar [ style="dashed"  ];
+      output -> volume [ style="dashed"  ];
+      
+      view [ label="currentView", shape=diamond ];
+      
+      polar -> volume [ label="CAPPI,MAX,ECHOTOP"];
+      cartesian -> polarptr [ label="CAPPI,PPI,RHI" ];
+      cartesian -> composite [ color="lightgray"  ];
+      composite -> polarptr [ label="CAPPI, MAX composite..." color="lightgray"  ];
+         view ->  output;     
+         
+      
+  }
+  \enddot
+
+  
+\subsubsection helpcommon Basic commands
+
+ \include help.txt 
+
+\subsubsection helpandre Anomaly detection commands
+
+ \include help-andre.txt
+
+
+\subsubsection helpdrain General image processing commands
+
+ These commands are ported directly from drain::image::Drain image handler.
+
+ \include help-drain.txt
+
+
+ \subsection misc Miscellaneous commands
+
+ \subsubsection kml Creating geographical configuration files (like KML)
+
+ There is often need to produce text files - typically configuration files - 
+ for other applications. \b Rack uses drain::StringMapper class to expand 
+ application variables (SITE, ELEVATIONS) to a text layout given by user 
+ with \c --formatFile command. For example, assume that file \c template.kml 
+ has the following contents:
+   
+  \include template.kml  
+
+Then, 
+ \code
+ racK --SITE VAN --RANGE 250000 --detectBBox --formatFile template.kml -formatOut out.kml
+ \endcode
+produces code which can be used in Google Earth application. Note that 
+\c --SITE always
+(Note: this example produces an excerpt for one radar only.)
+
+ \subsection utils External utilities
+  
+ \subsubsection magick ImageMagick
+The ImageMagick package contains utilities like \c convert and \c composite which may be applied in further 
+processing of image products.
+ \code
+ composite  -compose Dst_Over -tile pattern:checkerboard radar-ppi-cart-a{,-ch}.png
+ composite  -compose Dst_Over -tile pattern:checkerboard radar-ppi-cart-rgba{,-ch}.png
+ convert -frame 2x2 +append radar-ppi-cart{,-a-ch,-rgb,-rgba-ch}.png -resize 640x160 radar-ppi-cart-set.png
+ convert -frame 2x2  +append ppi.png maxEcho.png -resize 250x250 ppi-maxEcho.png
+ for i in cappi echoTop echoBottom; do convert  -frame 2x2 +append $i.png ${i}Q.png -resize 250x250 $i-twin.png; done
+ \endcode
+
+
+ \subsubsection proj Projections
+ A user may apply separate programs like GDAL to map LAT-LON images to any desired projection.
+  
+
+   \author Markus Peura, Seppo Pulkkinen (HDF5 support) 
+   \version 1.9
+   \date    2003-2011
+   
+
+
+
+
+
+
+*/
+  
+  
+