Index: /trunk/Ohana/src/perl/src/dads.detrend
===================================================================
--- /trunk/Ohana/src/perl/src/dads.detrend	(revision 43)
+++ /trunk/Ohana/src/perl/src/dads.detrend	(revision 44)
@@ -16,8 +16,16 @@
 }
 
-if (@ARGV != 3) { die "USAGE: dads.detrend (inbase) (outbase) (level)\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'
-$level = "\U$ARGV[2]\E";
+$level = "\U$level\E";
 if (($level ne "PERFECT") && ($level ne "BEST") && ($level ne "RAW")) {
     die "ERROR: invalid entry for (level)\n";
@@ -26,16 +34,16 @@
 if ($level eq "BEST") { $close = "-close"; }
 
-if (! -d $ARGV[1]) { mkdir ($ARGV[1], 0777); }
-
-# get input list:
-@rawlist = <$ARGV[0]/*.raw>;
-if (@rawlist == 0) { die "ERROR: no files found\n"; }
-
-# get total image size:
-$Nbyte = 0;
-foreach $file (@rawlist) {
-    @words = stat ($file);
-    $Nbyte += $words[7];
-}
+# 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:
@@ -44,9 +52,18 @@
 $Nfree = $words[3]*1024;
 
-# choose a work directory (/tmp vs $ARGV[1]):
-$workdir = $ARGV[1];
+# 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:
@@ -54,109 +71,85 @@
 @detlist = ();
 @demlist = ();
-foreach $in (@rawlist) {
-    ($middle) = $in =~ /$ARGV[0](\S+)raw$/;
+foreach $ccd (@ccdn) {
 
     # create output name
-    $name = $ARGV[1] . $middle . "fits";
+    $name = "$outdir/$base$ccd.fits";
     @fitlist = (@fitlist, $name);
 
     # create tmp detrended name
-    $name = $workdir . $middle . "det";
+    $name = "$workdir/$base$ccd.det";
+    # $name = $workdir . $middle . "det";
     @detlist = (@detlist, $name);
 
     # create tmp demoded name
-    $name = $workdir . $middle . "dem";
+    $name = "$workdir/$base$ccd.dem";
+    # $name = $workdir . $middle . "dem";
     @demlist = (@demlist, $name);
 
     # create tmp defringed name
-    $name = $workdir . $middle . "def";
-    @deflist = (@delist, $name);
-}
-
-# for raw distribution, we don't check image charatersitics
+    $name = "$workdir/$base$ccd.def";
+    # $name = $workdir . $middle . "def";
+    @deflist = (@deflist, $name);
+}
+
+# for raw distribution, simply use fhtool to split the files:
 if ($level eq "RAW") {
-    for ($i = 0; $i < @rawlist; $i++) {
-	$status = system ("mv $rawlist[$i] $fitlist[$i]");
-	if ($status) { die "ERROR: failed to remame raw file $rawlist[$i]\n"; }
-    }
+    system ("rmdir $outdir");
+    if ($?) { die "ERROR: can't remove target directory for fhtool\n"; }
+    system ("fhtool $input $outdir");
+    if ($?) { die "ERROR: failure in fhtool\n"; }
     print STDOUT "SUCCESS: finished with dads.detrend\n";
     exit 0;
 }
 
-# use first image to test image characteristics
-$name = $rawlist[0];
-
-$typekwd = `gconfig IMAGETYPE-KEYWORD`; chop $typekwd;
-$filtkwd = `gconfig FILTER-KEYWORD`;    chop $filtkwd;
-$exptkwd = `gconfig EXPTIME-KEYWORD`;   chop $exptkwd;
-$answer  = `cameraconfig -ccds`;
-@ccds = split (" ", $answer); 
-
-# check the IMAGETYP:
-$answer = `echo $name | fields $typekwd`;
-($tmp, $type) = split (" ", $answer);
-if ($type ne "OBJECT") { die "ERROR: $name: wrong image type\n"; }
-
-# this should be abstracted to the filter or recipe file...
-# check the FILTER and EXPTIME, include fringe correction?:
-$answer = `echo $name | fields $exptkwd $filtkwd`;
-($junk, $exptime, $filtvalue) = split (" ", $answer);
-$filtvalue = "\U$filtvalue\E";
+# load abstracted keywords  (NEED error checking!!)
+($typekwd, $filtkwd, $exptkwd) = split (" ", `gconfig IMAGETYPE-KEYWORD FILTER-KEYWORD EXPTIME-KEYWORD`);
+if ($?) { die "ERROR: config system missing keyword abstractions\n"; }
+
+# extract keyword values:
+($junk, $type, $exptime, $filtvalue) = split (" ", `echo $input | fields $typekwd $exptkwd $filtkwd`);
+if ($?) { die "ERROR: failure reading header keywords (1)\n"; }
+
+if ($type ne "OBJECT") { die "ERROR: $input: wrong image type\n"; }
 $filter = `filtnames $filtvalue`; chop $filter;
-# check valid answer here
-
-# set defringe and/or demode based on filter & exptime
-if ($filter eq "R") {
-    $DO_DEMODE   = ($exptime > 60);
-}
-if ($filter eq "I") {
-    $DO_DEFRINGE = ($exptime > 60);
-    $DO_DEMODE   = ($exptime > 60);
-}
-if ($filter eq "Z") {
-    $DO_DEFRINGE = ($exptime > 60);
-    $DO_DEMODE   = ($exptime > 60);
-}
-if ($filter eq "NB920") {
-    $DO_DEFRINGE = ($exptime > 60);
-    $DO_DEMODE   = ($exptime > 60);
+if ($?) { die "ERROR: filter not found\n"; }
+
+# recipe file defines detrend types & cutoff exptime values
+$recipefile = `gconfig DETREND_RECIPES`; chop $recipefile;
+($detypes, $cutoffs) = split (" ", `gconfig -c $recipefile $filter`);
+if ($?) { die "ERROR: failure to get detrend recipes\n"; }
+@detypes = split (",", $detypes);
+@cutoffs = split (",", $cutoffs);
+
+# check for DEFRINGE, DEMODE 
+$DO_DEFRINGE = 0;
+for ($i = 0; $i < @detypes; $i++) {
+    if ($detypes[$i] eq "fringe") {
+	if ($exptime >= $cutoffs[$i]) { $DO_DEFRINGE = 1; }
+	last;
+    }
+}
+$DO_DEMODE = 0;
+for ($i = 0; $i < @detypes; $i++) {
+    if ($detypes[$i] eq "modes") {
+	if ($exptime >= $cutoffs[$i]) { $DO_DEMODE = 1; }
+	last;
+    }
 }
 
 # check the GEOMETRY:
-$answer = `echo $name | fields CCDBIN1 CCDBIN2 RASTER`;
-@words = split (" ", $answer);
-if (($words[1] != 1) || ($words[2] != 1)) { die "ERROR: $name: binned image\n"; }
-if ($words[3] ne "FULL") { die "ERROR: $name: sub-rastered image\n"; } 
-
-# check for valid detrend frames of needed types (this needs to be implemented with the -recipe function)
-
-# check for mode frame:
-if ($DO_DEMODE) {
-    $name = $rawlist[0];
-    $status = system ("detsearch -quiet -image $name $ccds[0] split -type modes $close");
-    if ($status) { die "ERROR: can't get valid mode file\n"; }
-}
-
-# check for fringe frame:
-if ($DO_DEFRINGE) {
-    foreach $name (@rawlist) {
-	$status = system ("detsearch -quiet -image $name $ccds[0] split -type fringe $close");
-	if ($status) { die "ERROR: can't get valid fringe frame for this image\n"; }
-    }
-}
-
-# check for detrend frame:
-foreach $name (@rawlist) {
-    $status = system ("detsearch -quiet -image $name $ccds[0] split -type bias $close");
-    $status = system ("detsearch -quiet -image $name $ccds[0] split -type dark $close");
-    $status = system ("detsearch -quiet -image $name $ccds[0] split -type mask $close");
-    $status = system ("detsearch -quiet -image $name $ccds[0] split -type flat $close");
-    if ($status) { die "ERROR: can't get valid fringe frame for this image\n"; }
-}
-
-# final output is @fitlist
-# detrend  @rawlist @detlist
-# demode   @detlist @demlist
-# defringe @demlist @deflist
+($tmp, $bin1, $bin2, $raster) = split (" ", `echo $input | fields CCDBIN1 CCDBIN2 RASTER`);
+if ($?) { die "ERROR: failure reading header keywords (2)\n"; }
+
+if ($bin1 != 1) { die "ERROR: $input: binned image\n"; }
+if ($bin2 != 1) { die "ERROR: $input: binned image\n"; }
+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
+# detrend  $input[ccd] @detlist
+# demode   @detlist    @demlist
+# defringe @demlist    @deflist
 # if we skip a step, re-assign list as needed:
 if ( $DO_DEFRINGE &&  $DO_DEMODE) { @deflist = @fitlist; }
@@ -166,13 +159,12 @@
 
 # run the detrend system
-for ($i = 0; $i < @rawlist; $i++) {
-
-    $status = vsystem ("flatten.flips $close -quiet $rawlist[$i] $detlist[$i] $ccds[$i] split");
-    if ($status) { &escape ("ERROR: problem running flatten on $rawlist[$i]"); }
+for ($i = 0; $i < @ccds; $i++) {
+    $status = vsystem ("flatten.flips $close -quiet $input $detlist[$i] $ccds[$i] mef");
+    if ($status) { &escape ("ERROR: problem running flatten on $input, $ccds[$i]"); }
 }
 
 # we need files containing detlist, demlist, deflist:
 if ($DO_DEMODE || $DO_DEFRINGE) {
-    $detlist = "$ARGV[1].detlist";
+    $detlist = "$outdir.detlist";
     open (FILE, ">$detlist");
     foreach $name (@detlist) {
@@ -182,5 +174,5 @@
 }
 if ($DO_DEMODE) {
-    $demlist = "$ARGV[1].demlist";
+    $demlist = "$outdir.demlist";
     open (FILE, ">$demlist");
     foreach $name (@demlist) {
@@ -190,5 +182,5 @@
 }
 if ($DO_DEFRINGE) {
-    $deflist = "$ARGV[1].deflist";
+    $deflist = "$outdir.deflist";
     open (FILE, ">$deflist");
     foreach $name (@deflist) {
@@ -200,10 +192,10 @@
 if ($DO_DEMODE) {
     $status = vsystem ("demodemap $detlist $demlist $close");
-    if ($status) { &escape ("ERROR: problem running demodemap on $ARGV[1]"); }
+    if ($status) { &escape ("ERROR: problem running demodemap on $outdir"); }
 }
 
 if ($DO_DEFRINGE) {
     $status = vsystem ("defringe $demlist $deflist $close");
-    if ($status) { &escape ("ERROR: problem running defringe on $ARGV[1]"); }
+    if ($status) { &escape ("ERROR: problem running defringe on $outdir"); }
 }
 
@@ -241,2 +233,13 @@
     return;
 }
+
+sub basename {
+
+    my ($file) = $_[0];
+    my ($base, @words);
+
+    @words = split ("/", $file);
+    $base = $words[-1];
+    return $base;
+}
+
Index: /trunk/Ohana/src/perl/src/elixir.postrun
===================================================================
--- /trunk/Ohana/src/perl/src/elixir.postrun	(revision 43)
+++ /trunk/Ohana/src/perl/src/elixir.postrun	(revision 44)
@@ -147,5 +147,7 @@
 
 	if (! -d "$datdir/$runid") { mkdir ("$datdir/$runid", 0777); }
-	vsystem ("mk.ptlist -run $runid > $ptlist");
+	($tmp, $start, $stop) = split (" ", `mkrun run $runid`);
+	if ($?) { &escape ("error in RUNID $runid"); }
+	vsystem ("imsearch -type object -trange $start $stop -pt > $ptlist");
  	vsystem ("elixir -D mode sexcomplete $ptlist >& $ptlog &");
 
Index: /trunk/Ohana/src/perl/src/fr.frstats
===================================================================
--- /trunk/Ohana/src/perl/src/fr.frstats	(revision 43)
+++ /trunk/Ohana/src/perl/src/fr.frstats	(revision 44)
@@ -30,4 +30,25 @@
     close (MANA);
     if ($?) { &escape ("problem with fr.frstats -fitpars"); }
+
+    &goodbye;
+}
+
+# apply fit parameters for given chip
+if ($ARGV[0] eq "-applyfit") {
+    
+    if (@ARGV != 4) { die "USAGE: fr.frstats -applyfit (imlist) (fitpars) (output)\n"; }
+    $list = $ARGV[1];
+    $pars = $ARGV[2];
+    $output = $ARGV[3];
+
+    if (-e $output) { unlink $output; }
+
+    # run mana script:
+    open (MANA, "|mana --norc");
+    print MANA "input $script\n";
+    print MANA "applyfitstats $list $pars $output\n";
+    print MANA "exit 1\n";
+    close (MANA);
+    if ($?) { &escape ("problem with fr.frstats -applyfit"); }
 
     &goodbye;
@@ -135,5 +156,5 @@
 
 sub goodbye {
-  print STDOUT "SUCCESS: finished with fr.stats\n";
+  print STDOUT "finished with fr.stats\n";
   exit 0;
 }
Index: /trunk/Ohana/src/perl/src/fr.mklists
===================================================================
--- /trunk/Ohana/src/perl/src/fr.mklists	(revision 43)
+++ /trunk/Ohana/src/perl/src/fr.mklists	(revision 44)
@@ -20,6 +20,6 @@
 }
 
-$answer = `cameraconfig $elixir -ccds`;
-@ccds = split (" ", $answer); 
+@ccds = split (" ", `cameraconfig -ccdn`);
+if ($?) { die "error in config\n"; }
 
 $STAT_XCLD = 0;
@@ -122,7 +122,7 @@
 
     open (FILE, ">$ARGV[2]");
-    for ($i = 0; $i < @ccds; $i++) {
+    foreach $ccd (@ccds) {
 	$name = $ARGV[1];
-	$name =~ s/CCDNUM/$ccds[$i]/;
+	$name =~ s/CCDNUM/$ccd/;
 	print FILE "$name\n";
     }
@@ -285,17 +285,11 @@
 
     $master   = $ARGV[1];
-    $imstats  = $ARGV[2];
-    $statlist = $ARGV[3];
-    $ccdid    = $ARGV[4];
+    $imstats  = $ARGV[2]; # list of basic image stats
+    $statlist = $ARGV[3]; # list of image stat files (1 line per frame)
+    $ccd      = $ARGV[4];
     $output   = $ARGV[5];
 
-    $ccd = -1;
-    for ($i = 0; $i < @ccds; $i++) {
-	if ($ccdid eq $ccds[$i]) {
-	    $ccd = $i;
-	    last;
-	}
-    }
-    if ($ccd == -1) { &escape ("error in CCD ID"); }
+    # $ccd = `cameraconfig -N $ccdid`;
+    # if ($ccd eq "") { &escape ("error in CCD ID"); }
 
     open (FILE, $master);
@@ -313,6 +307,19 @@
     if (@master != @statlist) { &escape ("mismatch in master & statlist file lengths"); }
 
+    # find image with strongest fringe amplitude
+    $fringemax = "";
+    for ($i = 0; $i < @imstats; $i++) {
+	$line = $master[$i]; chop $line;
+	($path, $root, $mode, $status) = split (" ", $line);
+	if ($status != $STAT_KEEP) { next; }
+	
+	$line = $imstats[$i]; chop $line;
+	($SKY, $fringe, $dfringe) = split (" ", $line);
+	if ($fringemax eq "") { $fringemax = $fringe; }
+	if ($fringemax < $fringe) { $fringemax = $fringe; }
+    }
+    print "fringemax: $fringemax\n";
+
     open (FILE, ">$output");
-
     for ($i = 0; $i < @master; $i++) {
 	$line = $master[$i]; chop $line;
@@ -322,5 +329,8 @@
 	$line = $imstats[$i]; chop $line;
 	($SKY, $fringe, $dfringe) = split (" ", $line);
-
+	$frnorm = $fringe / $fringemax;
+	# imcombred is not renormalizing: this will force fringe amplitude to a useful level
+
+	# file is list of fringe stats (1 line per chip)
 	$file = $statlist[$i]; chop $file;
 	open (STAT, "$file");
@@ -333,6 +343,5 @@
 	# compare $sky with average sky $SKY?
 	$dsky = $sky - $SKY;
-	print "$i: $dsky\n";
-	print FILE "$name $sky $fringe 0.0 0.0\n";
+	print FILE "$name $sky $frnorm\n";
     }
     close (FILE);
