Index: trunk/ippScripts/scripts/detrend_resid_exp.pl
===================================================================
--- trunk/ippScripts/scripts/detrend_resid_exp.pl	(revision 19332)
+++ trunk/ippScripts/scripts/detrend_resid_exp.pl	(revision 19627)
@@ -21,6 +21,11 @@
 
 use IPC::Cmd 0.36 qw( can_run run );             # tools to run UNIX programs with control over I/O
+# use IPC::Run qw ( start finish timeout );
+use IPC::Run;
+
 use PS::IPP::Metadata::Config;                   # tools to parse the psMetadataConfig files
-use PS::IPP::Metadata::Stats;
+
+# XXX drop: moved to ppStatsFromMetadata
+# use PS::IPP::Metadata::Stats;
 
 use PS::IPP::Metadata::List qw( parse_md_list ); # tools to parse a metadata into a hash list
@@ -69,9 +74,8 @@
 # load IPP config information for the specified camera
 $ipprc->define_camera($camera);
-if ($redirect) {
-    my $logDest = $ipprc->filename("LOG.EXP", $outroot)
-       or &my_die("Missing entry from camera config", $det_id, $iter, $exp_id, $PS_EXIT_CONFIG_ERROR);
-    $ipprc->redirect_output($logDest);
-}
+
+my $logDest = $ipprc->filename("LOG.EXP", $outroot) or &my_die("Missing entry from camera config", $det_id, $iter, $exp_id, $PS_EXIT_CONFIG_ERROR);
+
+$ipprc->redirect_output($logDest) if $redirect;
 
 # Recipes to use based on reduction class
@@ -83,26 +87,4 @@
 my $recipe2 = $ipprc->reduction($reduction, 'JPEG_BIN2_RESID_' . uc($det_type)); # Recipe to use
 &my_die("Unrecognised detrend type: $det_type", $det_id, $iter, $PS_EXIT_PROG_ERROR) unless defined $recipe2;
-
-# values to extract from output metadata and the stats to calculate
-# XXX -bg_mean_stdev should take rms of bg_mean_stdev if bg_mean_stdev != 0 (A)
-# XXX -bg_mean_stdev should take stdev of bg_mean if bg_mean_stdev == 0     (B)
-# XXX  (A) if imfile.Ncomp > 1, (B) if imfile.Ncomp == 1
-my $STATS =
-    [
-        #          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-        { name => "bg",             type => "mean",  flag => "-bg",            dtype => "float" },
-        { name => "bg_mean_stdev",  type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
-        { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev",      dtype => "float" },
-        { name => "bg_skewness",    type => "mean",  flag => "-bg_skewness",   dtype => "float" },
-        { name => "bg_kurtosis",    type => "mean",  flag => "-bg_kurtosis",   dtype => "float" },
-        { name => "bin_stdev",      type => "rms",   flag => "-bin_stdev",     dtype => "float" },
-        { name => "fringe_0",       type => "mean",  flag => "-fringe_0",      dtype => "float" },
-        { name => "fringe_1",       type => "rms",   flag => "-fringe_1",      dtype => "float" },
-        { name => "fringe_2",       type => "stdev", flag => "-fringe_2",      dtype => "float" },
-        { name => "user_1",         type => "mean",  flag => "-user_1",        dtype => "float" }, # fringe residual
-        { name => "user_2",         type => "rms",   flag => "-user_2",        dtype => "float" }, # fringe residual
-        { name => "user_1",         type => "stdev", flag => "-user_3",        dtype => "float" }, # fringe residual
-        ];
-my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -110,4 +92,5 @@
 my $dettool = can_run('dettool') or (warn "Can't find dettool" and $missing_tools = 1);
 my $ppImage = can_run('ppImage') or (warn "Can't find ppImage" and $missing_tools = 1);
+my $ppStatsFromMetadata = can_run('ppStatsFromMetadata') or (warn "Can't find ppStatsFromMetadata" and $missing_tools = 1);
 if ($missing_tools) {
     warn("Can't find required tools.");
@@ -116,4 +99,5 @@
 
 # Get list of imfile files
+my $cmdflags;
 my ($files, $command, $success, $error_code, $full_buf, $stdout_buf, $stderr_buf);
 {
@@ -142,6 +126,24 @@
         &my_die("Unable to parse metadata list", $det_id, $iter, $exp_id, $PS_EXIT_PROG_ERROR);
 
-    # Parse the statistics on the residual image
-    $stats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $exp_id, $PS_EXIT_PROG_ERROR);
+    # since I can't figure out how to do input and output within PERL, I'm writing to a temp file
+    my ($statFile, $statName) = tempfile( "/tmp/$exp_tag.detresid.$det_id.$iter.stats.XXXX", UNLINK => !$save_temps );
+    foreach my $line (@$stdout_buf) {
+	print $statFile $line;
+    }
+    close $statFile;
+
+    $command = "$ppStatsFromMetadata $statName - DETREND_RESID_EXP";
+    ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
+        run(command => $command, verbose => $verbose);
+    unless ($success) {
+        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+        warn("Unable to perform ppSTatsFromMetadata: $error_code\n");
+        exit($error_code);
+    }
+
+    foreach my $line (@$stdout_buf) {
+	$cmdflags .= " $line";
+    }
+    print "cmdflags: $cmdflags\n";
 }
 
@@ -377,14 +379,14 @@
 
 # basic ensemble stats
-my $mean               = $stats->value_for_flag ("-bg");
-my $meanStdev          = $stats->value_for_flag ("-bg_mean_stdev");
-my $stdev              = $stats->value_for_flag ("-bg_stdev");
-my $binStdev           = $stats->value_for_flag ("-bin_stdev");
-my $fringe_mean        = $stats->value_for_flag ("-fringe_0");
-my $fringe_err         = $stats->value_for_flag ("-fringe_1");
-my $fringe_mean_stdev  = $stats->value_for_flag ("-fringe_2");
-my $dfringe_mean       = $stats->value_for_flag ("-fringe_resid_0");
-my $dfringe_err        = $stats->value_for_flag ("-fringe_resid_1");
-my $dfringe_mean_stdev = $stats->value_for_flag ("-fringe_resid_2");
+my $mean               = &value_for_flag ($cmdflags, "-bg");
+my $meanStdev          = &value_for_flag ($cmdflags, "-bg_mean_stdev");
+my $stdev              = &value_for_flag ($cmdflags, "-bg_stdev");
+my $binStdev           = &value_for_flag ($cmdflags, "-bin_stdev");
+my $fringe_mean        = &value_for_flag ($cmdflags, "-fringe_0");
+my $fringe_err         = &value_for_flag ($cmdflags, "-fringe_1");
+my $fringe_mean_stdev  = &value_for_flag ($cmdflags, "-fringe_2");
+my $dfringe_mean       = &value_for_flag ($cmdflags, "-fringe_resid_0");
+my $dfringe_err        = &value_for_flag ($cmdflags, "-fringe_resid_1");
+my $dfringe_mean_stdev = &value_for_flag ($cmdflags, "-fringe_resid_2");
 
 # other stats (flux depends on bg and exp_time)
@@ -506,5 +508,5 @@
 $command .= ' -reject' if $reject;
 $command .= " -dbname $dbname" if defined $dbname;
-$command .= $stats->cmdflags();
+$command .= $cmdflags;
 
 unless ($no_update) {
@@ -527,4 +529,16 @@
 }
 
+
+sub value_for_flag 
+{
+    my $cmdflags = shift;
+    my $flag = shift;
+
+    my $value = 0.0;
+    if ($cmdflags =~ m|$flag|) {
+	($value) = $cmdflags =~ m|$flag\s+(\S+)|;
+    }
+    $value;
+}
 
 sub my_die
