Index: trunk/Ohana/src/perl/src/dads.detrend
===================================================================
--- trunk/Ohana/src/perl/src/dads.detrend	(revision 59)
+++ trunk/Ohana/src/perl/src/dads.detrend	(revision 60)
@@ -2,29 +2,15 @@
 # calls flatten.flips & defringe, but no flips components directly
 
-$CLEANUP = 1;
+$CLEANUP     = 1;
 $DO_DEFRINGE = 0;
 $DO_DEMODE   = 0;
 
-sub vsystem {
-    print STDERR "@_\n";
-    $status = system ("@_");
-    $status;
-}
-
-sub goodbye {
-    die "@_\n";
-}
-
 if (@ARGV != 3) { die "USAGE: dads.detrend (input) (outbase) (level)\n" }
 
-$input  = $ARGV[0];
-$outdir = $ARGV[1];
-$level =  $ARGV[2];
-
-# input : /path/path/654321o.fits 
-# output: /path/path/654321p
-# use last leaf of dir path as file rootname
-
-# level may be: 'perfect', 'best', 'raw'
+$input  = $ARGV[0];   # input : /path/path/654321o.fits 
+$outdir = $ARGV[1];   # output: /path/path/654321p
+$level =  $ARGV[2];   # level : perfect, best, raw
+
+# validate level
 $level = "\U$level\E";
 if (($level ne "PERFECT") && ($level ne "BEST") && ($level ne "RAW")) {
@@ -34,62 +20,6 @@
 if ($level eq "BEST") { $close = "-close"; }
 
-# force output directory to exist
-if (! -d $outdir) { 
-    system ("mkdir -p $outdir"); 
-    if ($?) { die "ERROR: can't create output directory\n"; }
-}
-
 # check for input file (must be MEF)
 if (! -e $input) { die "ERROR: input file not found\n"; }
-
-# get image size:
-@words = stat ($input);
-$Nbyte = $words[7];
-
-# check space on /tmp:
-@answer = `df -k /tmp`;
-@words = split (" ", $answer[1]);
-$Nfree = $words[3]*1024;
-
-# choose a work directory (/tmp vs $outdir):
-$workdir = $outdir;
-if ($Nfree > 3*$Nbyte) {
-    $workdir = "/tmp";
-}
-
-# extract image rootname from $outdir:
-$base = &basename ($outdir);
-
-# output files are $workdir/$basename$ccdn.ext
-@ccdn   = split (" ", `cameraconfig -ccdn`); if ($?) { die "ERROR in cameraconfig\n"; }
-@ccds   = split (" ", `cameraconfig -ccds`); if ($?) { die "ERROR in cameraconfig\n"; }
-
-# NEED to check Nccd = NEXTEND, check that list of input ccds matches
-
-# create output lists:
-@fitlist = ();
-@detlist = ();
-@demlist = ();
-foreach $ccd (@ccdn) {
-
-    # create output name
-    $name = "$outdir/$base$ccd.fits";
-    @fitlist = (@fitlist, $name);
-
-    # create tmp detrended name
-    $name = "$workdir/$base$ccd.det";
-    # $name = $workdir . $middle . "det";
-    @detlist = (@detlist, $name);
-
-    # create tmp demoded name
-    $name = "$workdir/$base$ccd.dem";
-    # $name = $workdir . $middle . "dem";
-    @demlist = (@demlist, $name);
-
-    # create tmp defringed name
-    $name = "$workdir/$base$ccd.def";
-    # $name = $workdir . $middle . "def";
-    @deflist = (@deflist, $name);
-}
 
 # for raw distribution, simply use fhtool to split the files:
@@ -103,5 +33,15 @@
 }
 
-# load abstracted keywords  (NEED error checking!!)
+# force output directory to exist
+if (! -d $outdir) { 
+    system ("mkdir -p $outdir"); 
+    if ($?) { die "ERROR: can't create output directory\n"; }
+}
+
+# load ccd config information
+@ccdn   = split (" ", `cameraconfig -ccdn`); if ($?) { die "ERROR in cameraconfig\n"; }
+@ccds   = split (" ", `cameraconfig -ccds`); if ($?) { die "ERROR in cameraconfig\n"; }
+
+# load abstracted keywords
 ($typekwd, $filtkwd, $exptkwd) = split (" ", `gconfig IMAGETYPE-KEYWORD FILTER-KEYWORD EXPTIME-KEYWORD`);
 if ($?) { die "ERROR: config system missing keyword abstractions\n"; }
@@ -111,9 +51,10 @@
 if ($?) { die "ERROR: failure reading header keywords (1)\n"; }
 
+# check for valid imagetype & filter
 if ($type ne "OBJECT") { die "ERROR: $input: wrong image type\n"; }
 $filter = `filtnames $filtvalue`; chop $filter;
 if ($?) { die "ERROR: filter not found\n"; }
 
-# recipe file defines detrend types & cutoff exptime values
+# check recipe file for detrend types & cutoff exptime values
 $recipefile = `gconfig DETREND_RECIPES`; chop $recipefile;
 ($detypes, $cutoffs) = split (" ", `gconfig -c $recipefile $filter`);
@@ -146,11 +87,65 @@
 if ($raster ne "FULL") { die "ERROR: $input: sub-rastered image\n"; } 
 
-# (skip check availablility of detrend frames; flatten.flips, detrend, demode all do this!)
-
-# final output   is @fitlist
+# print a summary of the processing
+print STDOUT "\n";
+print STDOUT "image: $input, filter: $filter, exptime: $exptime\n";
+print STDOUT "detrend processing: defringe: $DO_DEFRINGE, demode: $DO_DEMODE, level: $level\n\n";
+
+# get image size:
+@words = stat ($input);
+$Nbyte = $words[7];
+
+# check space on /tmp:
+@answer = `df -k /tmp`;
+@words = split (" ", $answer[1]);
+$Nfree = $words[3]*1024;
+
+# need space in workdir for one image for each of DEMODE & DEFRINGE:
+$Need  = 0;
+if ($DO_DEMODE)   { $Need ++; }
+if ($DO_DEFRINGE) { $Need ++; }
+$Nneed = $Need*$Nbyte*1.01;
+
+# choose a work directory (/tmp vs $outdir):
+$workdir = $outdir;
+if ($Nfree > $Nneed) {
+    $workdir = "/tmp";
+}
+
+print STDERR "Need workspace for $Need images: $Nfree vs $Nneed\n";
+
+# extract image rootname from $outdir:
+$base = &basename ($outdir);
+
+# create output lists:
+@fitlist = ();
+@detlist = ();
+@demlist = ();
+foreach $ccd (@ccdn) {
+
+    # create output name
+    $name = "$outdir/$base$ccd.fits";
+    @fitlist = (@fitlist, $name);
+
+    # create tmp detrended name
+    $name = "$workdir/$base$ccd.det";
+    @detlist = (@detlist, $name);
+
+    # create tmp demoded name
+    $name = "$workdir/$base$ccd.dem";
+    @demlist = (@demlist, $name);
+
+    # create tmp defringed name
+    $name = "$workdir/$base$ccd.def";
+    @deflist = (@deflist, $name);
+}
+
+# final output   is    @fitlist
 # detrend  $input[ccd] @detlist
 # demode   @detlist    @demlist
 # defringe @demlist    @deflist
 # if we skip a step, re-assign list as needed:
+
+# assign input / output lists
 if ( $DO_DEFRINGE &&  $DO_DEMODE) { @deflist = @fitlist; }
 if ( $DO_DEFRINGE && !$DO_DEMODE) { @deflist = @fitlist; @demlist = @detlist; }
@@ -160,5 +155,5 @@
 # run the detrend system
 for ($i = 0; $i < @ccds; $i++) {
-    $status = vsystem ("flatten.flips $close -quiet $input $detlist[$i] $ccds[$i] mef");
+    $status = &vsystem ("flatten.flips $close -quiet $input $detlist[$i] $ccds[$i] mef");
     if ($status) { &escape ("ERROR: problem running flatten on $input, $ccds[$i]"); }
 }
@@ -191,10 +186,10 @@
 
 if ($DO_DEMODE) {
-    $status = vsystem ("demodemap $detlist $demlist $close");
+    $status = &vsystem ("demodemap $detlist $demlist $close");
     if ($status) { &escape ("ERROR: problem running demodemap on $outdir"); }
 }
 
 if ($DO_DEFRINGE) {
-    $status = vsystem ("defringe $demlist $deflist $close");
+    $status = &vsystem ("defringe $demlist $deflist $close");
     if ($status) { &escape ("ERROR: problem running defringe on $outdir"); }
 }
@@ -228,6 +223,6 @@
     
     if (-e $detlist) { unlink ($detlist); }
-    if (-e $demlist) { unlink ($detlist); }
-    if (-e $deflist) { unlink ($detlist); }
+    if (-e $demlist) { unlink ($demlist); }
+    if (-e $deflist) { unlink ($deflist); }
     
     return;
@@ -244,2 +239,12 @@
 }
 
+sub vsystem {
+    print STDERR "@_\n";
+    $status = system ("@_");
+    $status;
+}
+
+sub goodbye {
+    die "@_\n";
+}
+
