Index: /trunk/PS-IPP-Config/lib/PS/IPP/Metadata/Stats.pm
===================================================================
--- /trunk/PS-IPP-Config/lib/PS/IPP/Metadata/Stats.pm	(revision 13971)
+++ /trunk/PS-IPP-Config/lib/PS/IPP/Metadata/Stats.pm	(revision 13972)
@@ -1,5 +1,5 @@
 # Copyright (c) 2006  Paul Price, Joshua Hoblitt
 #
-# $Id: Stats.pm,v 1.15 2007-06-25 01:24:20 eugene Exp $
+# $Id: Stats.pm,v 1.16 2007-06-26 00:28:28 eugene Exp $
 
 package PS::IPP::Metadata::Stats;
@@ -24,5 +24,7 @@
 
 use base qw( Class::Accessor::Fast );
-__PACKAGE__->mk_accessors( qw( bg_mean bg_stdev bg_mean_stdev fringe_mean fringe_mean_stdev fringe_err
+__PACKAGE__->mk_accessors( qw( bg_mean bg_stdev bg_mean_stdev 
+			       fringe_mean fringe_mean_stdev fringe_err 
+			       dfringe_mean dfringe_mean_stdev dfringe_err
 			       constants variables bg_data bg_stdev_data ) );
 
@@ -41,5 +43,8 @@
 		 fringe_mean => [], 	  # Fringe amplitudes
 		 fringe_err => [], 	  # Fringe amplitude errors
-		 fringe_mean_stdev => [], # Fringe amplitude errors
+		 fringe_mean_stdev => [], # Fringe amplitude stdev
+		 dfringe_mean => [], 	  # Fringe residual amplitudes
+		 dfringe_err => [], 	  # Fringe residual amplitude errors
+		 dfringe_mean_stdev => [], # Fringe residual amplitude stdev
                  constants => $constants, # Array of values that should be constant through the FPA
                  variables => $variables, # Array of values that may be variable through the FPA
@@ -48,4 +53,6 @@
 		 fringe_data => [],       # Fringe amplitudes each component
 		 fringe_err_data => [],	  # Fringe errors for each component
+		 dfringe_data => [],      # Fringe residual amplitudes each component
+		 dfringe_err_data => [],  # Fringe residual errors for each component
                  data => {}               # The data
 	     };
@@ -118,9 +125,11 @@
         $self->bg_mean($stats->mean());
         $self->bg_mean_stdev($stats->standard_deviation() || 0);
-        # the stdev of a set of 1 is the undefined however that
-        # doesn't do us much good so I'm changing undef to 0
-    } else {
-        $self->bg_mean(undef);
-        $self->bg_mean_stdev(undef);
+	print STDERR "mean_stdev: " . $self->bg_mean_stdev() . "\n";
+	# the stdev of a set of 1 is undefined.  that doesn't do
+	# us much good so I'm changing undef to 0
+    } else {
+	# if we have no data to measure the value, return NAN
+        $self->bg_mean('NAN');
+        $self->bg_mean_stdev('NAN');
     }
     if (scalar @{$self->{bg_stdev_data}} > 0) {
@@ -133,5 +142,5 @@
         $self->bg_stdev( sqrt( $stats->mean() ) );
     } else {
-        $self->bg_stdev(undef);
+        $self->bg_stdev('NAN');
     }
 
@@ -143,7 +152,11 @@
 	    push @{$self->{fringe_mean}}, $stats->mean();
 	    push @{$self->{fringe_mean_stdev}}, ($stats->standard_deviation() || 0);
-	    # the stdev of a set of 1 is the undefined however that
-	    # doesn't do us much good so I'm changing undef to 0
-	}
+	    # the stdev of a set of 1 is undefined.  that doesn't do
+	    # us much good so I'm changing undef to 0
+	}
+    } else {
+	# create a single NAN entry
+	push @{$self->{fringe_mean}}, 'NAN';
+	push @{$self->{fringe_mean_stdev}}, 'NAN';
     }
     if (scalar @{$self->{fringe_err_data}} > 0) {
@@ -157,4 +170,35 @@
 	    push @{$self->{fringe_err}}, sqrt($stats->mean());
 	}
+    } else {
+	push @{$self->{fringe_err}}, 'NAN';
+    }
+
+    # Get fringe residual measurements
+    if (scalar @{$self->{dfringe_data}} > 0) {
+	foreach my $array (@{$self->{dfringe_data}}) {
+	    my $stats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
+	    $stats->add_data(@$array);
+	    push @{$self->{dfringe_mean}}, $stats->mean();
+	    push @{$self->{dfringe_mean_stdev}}, ($stats->standard_deviation() || 0);
+	    # the stdev of a set of 1 is undefined.  that doesn't do
+	    # us much good so I'm changing undef to 0
+	}
+    } else {
+	# create a single NAN entry
+	push @{$self->{dfringe_mean}}, 'NAN';
+	push @{$self->{dfringe_mean_stdev}}, 'NAN';
+    }
+    if (scalar @{$self->{dfringe_err_data}} > 0) {
+	foreach my $array (@{$self->{dfringe_err_data}}) {
+	    my @variances;
+	    foreach my $value (@$array) {
+		push @variances, $value**2;
+	    }
+	    my $stats = Statistics::Descriptive::Sparse->new(); # Statistics calculator
+	    $stats->add_data(@variances);
+	    push @{$self->{dfringe_err}}, sqrt($stats->mean());
+	}
+    } else {
+	push @{$self->{dfringe_err}}, 'NAN';
     }
 
@@ -236,5 +280,28 @@
                 push @{$self->{bg_data}}, $entry->{value};
             }
-	} elsif ($entry->{name} =~ /^FRINGE/) {
+	    next;
+	} 
+	if ($entry->{name} =~ /^FRINGE_RESID/) {
+	    my ($num) = $entry->{name} =~ /_(\d+)$/; # Component number
+	    if ($entry->{name} =~ /_ERR_/) {
+		my $arrayRef = ${$self->{dfringe_err_data}}[$num];
+		unless (defined $arrayRef) {
+		    my @array;
+		    $arrayRef = \@array;
+		    ${$self->{dfringe_err_data}}[$num] = $arrayRef;
+		}
+		push @$arrayRef, $entry->{value};
+	    } else {
+		my $arrayRef = ${$self->{dfringe_data}}[$num];
+		unless (defined $arrayRef) {
+		    my @array;
+		    $arrayRef = \@array;
+		    ${$self->{dfringe_data}}[$num] = $arrayRef;
+		}
+		push @$arrayRef, $entry->{value};
+	    }
+	    next;
+        } 
+	if ($entry->{name} =~ /^FRINGE/) {
 	    my ($num) = $entry->{name} =~ /_(\d+)$/; # Component number
 	    if ($entry->{name} =~ /_ERR_/) {
@@ -255,7 +322,7 @@
 		push @$arrayRef, $entry->{value};
 	    }
-        } else {
-            $self->_check_values($entry);
-        }
+	    next;
+        } 
+	$self->_check_values($entry);
     }
 
