Index: /trunk/ippScripts/scripts/camera_exp.pl
===================================================================
--- /trunk/ippScripts/scripts/camera_exp.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/camera_exp.pl	(revision 14115)
@@ -16,6 +16,7 @@
 use IPC::Cmd 0.36 qw( can_run run );
 use PS::IPP::Metadata::Config;
+use PS::IPP::Metadata::Stats;
 use PS::IPP::Metadata::List qw( parse_md_list );
-use Statistics::Descriptive;
+
 use File::Temp qw( tempfile );
 
@@ -34,7 +35,7 @@
 use Pod::Usage qw( pod2usage );
 
-my ($exp_id, $cam_id, $recipe, $camera, $dbname, $workdir, $dvodb, $no_update, $no_op);
+my ($exp_tag, $cam_id, $recipe, $camera, $dbname, $workdir, $reduction, $dvodb, $no_update, $no_op);
 GetOptions(
-	   'exp_id=s'          => \$exp_id, # Exposure identifier
+	   'exp_tag=s'          => \$exp_tag, # Exposure identifier
 	   'cam_id=s'          => \$cam_id, # Camtool identifier
 	   'recipe=s'          => \$recipe, # Recipe to use
@@ -42,4 +43,5 @@
 	   'dbname|d=s'        => \$dbname, # Database name
 	   'workdir|w=s'       => \$workdir, # Working directory
+	   'reduction=s'       => \$reduction, # Reduction class		       
 	   'dvodb|w=s'         => \$dvodb,  # output DVO database
 	   'no-update'         => \$no_update, # Update the database?
@@ -49,7 +51,7 @@
 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
 pod2usage(
-    -msg => "Required options: --exp_id --cam_id --camera",
+    -msg => "Required options: --exp_tag --cam_id --camera",
     -exitval => 3,
-) unless defined $exp_id
+) unless defined $exp_tag
     and defined $cam_id
     and defined $camera;
@@ -57,7 +59,37 @@
 $ipprc->define_camera($camera);
 
-use constant RECIPE1 => 'PPIMAGE_J1'; # Recipe to use for ppImage to make JPEGs
-use constant RECIPE2 => 'PPIMAGE_J2'; # Recipe to use for ppImage to make JPEGs
-
+# Recipes to use based on reduction class
+$reduction = 'DEFAULT' unless defined $reduction;
+
+my $recipe1 = $ipprc->reduction($reduction, 'JPEG_BIN1'); # Recipe to use
+&my_die("Unrecognised JPEG recipe", $cam_id, $PS_EXIT_PROG_ERROR) unless defined $recipe1;
+
+my $recipe2 = $ipprc->reduction($reduction, 'JPEG_BIN2'); # Recipe to use
+&my_die("Unrecognised JPEG recipe", $cam_id, $PS_EXIT_PROG_ERROR) unless defined $recipe2;
+
+# values to extract from output metadata and the stats to calculate
+my $CHIPSTATS = 
+   [   
+       #          PPSTATS 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" },  
+
+# these should be coming from the psastro results for Nimfile > 1, 
+	{ name => "sigma_ra",       type => "rms",   flag => "-sigma_ra",      	dtype => "float" },  
+	{ name => "sigma_dec",      type => "rms",   flag => "-sigma_dec",     	dtype => "float" },  
+	{ name => "n_stars",        type => "sum",   flag => "-n_stars",       	dtype => "int"   },  
+	{ name => "n_astrom",       type => "sum",   flag => "-n_astrom",      	dtype => "int"   },  
+
+	{ name => "fwhm",           type => "mean",  flag => "-fwhm",          	dtype => "float" },  
+
+# these are not defined for the database table camProcessedExp
+#	{ name => "ap_resid",       type => "mean",  flag => "-ap_resid",      	dtype => "float" },  
+#	{ name => "ap_resid_stdev", type => "rms",   flag => "-ap_resid_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_0",       type => "stdev", flag => "-fringe_2",      	dtype => "float" },  
+   ];
+my $chipStats = PS::IPP::Metadata::Stats->new($CHIPSTATS); # Stats parser
 
 # Look for programs we need
@@ -90,47 +122,19 @@
     my $metadata = $mdcParser->parse(join "", @$stdout_buf) or
 	&my_die("Unable to parse metadata config doc", $cam_id, $PS_EXIT_PROG_ERROR);
+
+    # extract the metadata for the files into a hash list
     $files = parse_md_list($metadata) or
 	&my_die("Unable to parse metadata list", $cam_id, $PS_EXIT_PROG_ERROR);
-}
-
-# Gather the statistics
-my ($bg, $bg_stdev, $bg_mean_stdev); # The statistics triplet
-{
-    my @backgrounds;		# Array of backgrounds in each component
-    my @variances;		# Array of variances for each component
-#    my @ra;			# Array of ra errors
-#    my @dec;			# Array of dec errors
-#    my @zp;			# Array of photometric zero points
-    foreach my $file (@$files) {
-	&my_die("Unable to find class id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{class_id};
-	my $class_id = $file->{class_id};
-	&my_die("Unable to find bg for class_id=$class_id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{bg};
-	&my_die("Unable to find bg_mean_stdev for class_id=$class_id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{bg_mean_stdev};
-#	&my_die("Unable to find sigma_ra for class_id=$class_id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{sigma_ra};
-#	&my_die("Unable to find sigma_dec for class_id=$class_id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{sigma_dec};
-#	&my_die("Unable to find zp for class_id=$class_id", $cam_id, $PS_EXIT_SYS_ERROR) unless defined $file->{zp};
-	push @backgrounds, $file->{bg};
-	push @variances, $file->{bg_stdev}**2;
-    }
-
-    {
-	my $stats = Statistics::Descriptive::Sparse->new; # Statistics calculator
-	$stats->add_data(@backgrounds);
-	$bg = ($stats->mean() or 'NAN');
-	$bg_mean_stdev = ($stats->standard_deviation() or 'NAN');
-    }
-    {
-	my $stats = Statistics::Descriptive::Sparse->new; # Statistics calculator
-	$stats->add_data(@variances);
-	$bg_stdev = (sqrt( $stats->mean() ) or 'NAN');
-    }
-}
-
-my ($list1File, $list1Name) = tempfile( "$exp_id.cam$cam_id.b1.list.XXXX", UNLINK => 1 ); # For binning 1
-my ($list2File, $list2Name) = tempfile( "$exp_id.cam$cam_id.b2.list.XXXX", UNLINK => 1 ); # For binning 2
-my ($list3File, $list3Name) = tempfile( "$exp_id.cam$cam_id.b3.list.XXXX", UNLINK => 1 ); # For astrometry
-
-my @means;			# Array of means
-my @stdevs;			# Array of stdevs
+
+    # extract the stats from the metadata
+    unless ($chipStats->parse($metadata)) {
+	&my_die("Unable to find all values in statistics output.\n", $cam_id, $PS_EXIT_PROG_ERROR);
+    }
+}
+
+my ($list1File, $list1Name) = tempfile( "$exp_tag.cm.$cam_id.b1.list.XXXX", UNLINK => 1 ); # For binning 1
+my ($list2File, $list2Name) = tempfile( "$exp_tag.cm.$cam_id.b2.list.XXXX", UNLINK => 1 ); # For binning 2
+my ($list3File, $list3Name) = tempfile( "$exp_tag.cm.$cam_id.b3.list.XXXX", UNLINK => 1 ); # For astrometry
+
 my $chipObjects; 
 foreach my $file (@$files) {
@@ -143,6 +147,4 @@
     print $list2File ($ipprc->filename("PPIMAGE.BIN2", $file->{path_base}, $class_id) . "\n");
     print $list3File ($chipObjects . "\n");
-    push @means, $file->{bg};
-    push @stdevs, $file->{bg_stdev};
 }
 close $list1File;
@@ -151,8 +153,9 @@
 
 # Output products
-$workdir = caturi( $workdir, $exp_id ) if defined $workdir;
-my $outputRoot = $ipprc->file_prepare( "$exp_id.cam$cam_id", $workdir, ${$files}[0]->{path_base} );
-my $jpeg1 = $ipprc->filename("PPIMAGE.JPEG1", $outputRoot); # Binned JPEG #1
-my $jpeg2 = $ipprc->filename("PPIMAGE.JPEG2", $outputRoot); # Binned JPEG #2
+$workdir = caturi( $workdir, $exp_tag ) if defined $workdir;
+my $outputRoot = $ipprc->file_prepare( "$exp_tag.cm.$cam_id", $workdir, ${$files}[0]->{path_base} );
+
+my $jpeg1      = $ipprc->filename("PPIMAGE.JPEG1", $outputRoot); # Binned JPEG #1
+my $jpeg2      = $ipprc->filename("PPIMAGE.JPEG2", $outputRoot); # Binned JPEG #2
 my $fpaObjects = $ipprc->filename("PSASTRO.OUTPUT.MEF", $outputRoot); # MEF psastro output
 
@@ -167,4 +170,5 @@
     # run psastro +mosastro on the set of chips
     # XXX note that this is wrong if imfiles are cells
+    # XXX add a ppStats call which will collect the astrometry stats
     if (scalar @$files > 1) {
 	my $command = "$psastro -list $list3Name $outputRoot +mosastro -chipastro " . 
@@ -202,5 +206,5 @@
     # Make the jpeg for binning 1
     {
-	my $command = "$ppImage -list $list1Name $outputRoot -recipe PPIMAGE " . RECIPE1; # Command to run
+	my $command = "$ppImage -list $list1Name $outputRoot -recipe PPIMAGE $recipe1"; # Command to run
 	my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
 	    run(command => $command, verbose => 1);
@@ -214,5 +218,5 @@
     # Make the jpeg for binning 2
     {
-	my $command = "$ppImage -list $list2Name $outputRoot -recipe PPIMAGE " . RECIPE2; # Command to run
+	my $command = "$ppImage -list $list2Name $outputRoot -recipe PPIMAGE $recipe2"; # Command to run
 	my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
 	    run(command => $command, verbose => 1);
@@ -224,19 +228,16 @@
     }
 }
+
+my $fpaCommand = "$camtool -addprocessedexp";
+$fpaCommand .= " -cam_id $cam_id";
+$fpaCommand .= " -uri UNKNOWN";
+$fpaCommand .= " -path_base $outputRoot";
+$fpaCommand .= " -dbname $dbname" if defined $dbname;
+$fpaCommand .= $chipStats->cmdflags();
 
 # Add the result into the database
 unless ($no_update) {
-
-    my $command = "$camtool -addprocessedexp";
-    $command .= " -cam_id $cam_id -uri UNKNOWN -path_base $outputRoot";
-    $command .= " -bg $bg -bg_stdev $bg_stdev -bg_mean_stdev $bg_mean_stdev";
-    $command .= " -sigma_ra 0.0 -sigma_dec 0.0";
-    $command .= " -zp_mean 0.0 -zp_stdev 0.0";
-    $command .= " -fwhm 0.0 -fwhm_range 0.0";
-    $command .= " -n_stars 0 -n_extended 0 -n_cr 0 -n_astrom 0";
-    $command .= " -dbname $dbname" if defined $dbname;
-
     my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
-	run(command => $command, verbose => 1);
+	run(command => $fpaCommand, verbose => 1);
     unless ($success) {
 	$error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
@@ -244,4 +245,6 @@
 	exit($error_code);
     }
+} else {
+    print "skipping command: $fpaCommand\n";
 }
 
Index: /trunk/ippScripts/scripts/chip_imfile.pl
===================================================================
--- /trunk/ippScripts/scripts/chip_imfile.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/chip_imfile.pl	(revision 14115)
@@ -68,19 +68,20 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg" },
-       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev" },
-       { name => "FRINGE_0",       type => "rms",   flag => "-fringe_0" },
-       { name => "FRINGE_RESID_0", type => "rms",   flag => "-fringe_1" },
-       { name => "FRINGE_ERR_0",   type => "rms",   flag => "-fringe_2" },
-       { name => "OVER_VAL",       type => "mean",  flag => "-bias" },
-       { name => "FWHM",           type => "mean",  flag => "-fwhm" },
-       { name => "APMIFIT",        type => "mean",  flag => "-ap_resid" },
-       { name => "DAPMIFIT",       type => "rms",   flag => "-ap_resid_stdev" },
-       { name => "CERROR",         type => "rms",   flag => "-sigma_ra" },
-       { name => "CERROR",         type => "rms",   flag => "-sigma_dec" },
-       { name => "NSTARS",         type => "sum",   flag => "-n_stars" },
-       { name => "NASTRO",         type => "sum",   flag => "-n_astrom" },
+       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg",             dtype => "float" },
+       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev",  dtype => "float" },
+       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev",       dtype => "float" },
+       { name => "FRINGE_0",       type => "rms",   flag => "-fringe_0",       dtype => "float" },
+       { name => "FRINGE_RESID_0", type => "rms",   flag => "-fringe_1",       dtype => "float" },
+       { name => "FRINGE_ERR_0",   type => "rms",   flag => "-fringe_2",       dtype => "float" },
+       { name => "OVER_VAL",       type => "mean",  flag => "-bias", 	       dtype => "float" },
+       { name => "FWHM",           type => "mean",  flag => "-fwhm", 	       dtype => "float" },
+       { name => "APMIFIT",        type => "mean",  flag => "-ap_resid",       dtype => "float" },
+       { name => "DAPMIFIT",       type => "rms",   flag => "-ap_resid_stdev", dtype => "float" },
+       { name => "CERROR",         type => "rms",   flag => "-sigma_ra",       dtype => "float" },
+       { name => "CERROR",         type => "rms",   flag => "-sigma_dec",      dtype => "float" },
+       { name => "NSTARS",         type => "sum",   flag => "-n_stars",        dtype => "int"   },
+       { name => "NASTRO",         type => "sum",   flag => "-n_astrom",       dtype => "int"   },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -140,5 +141,4 @@
 
     # extract the stats from the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
 	&my_die("Unable to find all values in statistics output.\n", $chip_id, $class_id, $PS_EXIT_PROG_ERROR);
@@ -154,11 +154,5 @@
 $command .= " -path_base $outputRoot";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_norm_apply.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_norm_apply.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_norm_apply.pl	(revision 14115)
@@ -68,8 +68,9 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg" },
-       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev" },
+       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg",            dtype => "float" },
+       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
+       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev",      dtype => "float" },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -127,5 +128,4 @@
 
     # extract the stats from the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
 	&my_die("Unable to find all values in statistics output.", $det_id, $iter, $class_id, $PS_EXIT_PROG_ERROR);
@@ -141,11 +141,5 @@
 $command .= " -path_base $outputRoot";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_norm_exp.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_norm_exp.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_norm_exp.pl	(revision 14115)
@@ -74,9 +74,10 @@
     [   
 	#          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-	{ name => "bg",             type => "mean",  flag => "-bg" },
-	{ name => "bg",             type => "stdev", flag => "-bg_mean_stdev" },
-	{ name => "bg_stdev",       type => "rms",   flag => "-bg_stdev" },
+	{ name => "bg",             type => "mean",  flag => "-bg",            dtype => "float" },
+	{ name => "bg",             type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
+	{ name => "bg_stdev",       type => "rms",   flag => "-bg_stdev",      dtype => "float" },
 	# { name => "bg_mean_stdev",  type => "rms",   flag => "-bg_mean_stdev" },
 	];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -111,5 +112,4 @@
 
     # parse the stats in the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
 	&my_die("Unable to find all values in statistics output.\n", $det_id, $iter, $PS_EXIT_PROG_ERROR);
@@ -154,11 +154,5 @@
 $command .= " -path_base $outputRoot ";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_process_exp.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_process_exp.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_process_exp.pl	(revision 14115)
@@ -76,9 +76,10 @@
    [   
        #          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-       { name => "bg",             type => "mean",  flag => "-bg" },
-       { name => "bg",             type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev" },
+       { name => "bg",             type => "mean",  flag => "-bg",            dtype => "float" },
+       { name => "bg",             type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
+       { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev",      dtype => "float" },
        # { name => "bg_mean_stdev",  type => "rms",   flag => "-bg_mean_stdev" },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -113,5 +114,4 @@
 
     # parse the stats in the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
 	&my_die("Unable to find all values in statistics output.\n", $det_id, $exp_id, $PS_EXIT_PROG_ERROR);
@@ -163,11 +163,5 @@
 $command .= " -recip $recipe1,$recipe2 -path_base $outputRoot";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_process_imfile.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_process_imfile.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_process_imfile.pl	(revision 14115)
@@ -70,8 +70,9 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg" },
-       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev" },
+       { name => "ROBUST_MEDIAN",  type => "mean",  flag => "-bg",            dtype => "float" },
+       { name => "ROBUST_MEDIAN",  type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
+       { name => "ROBUST_STDEV",   type => "rms",   flag => "-bg_stdev",      dtype => "float" },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -127,5 +128,4 @@
 
     # extract the stats from the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     $stats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
 }
@@ -139,11 +139,5 @@
 $command .= " -uri $outputImage -path_base $outputRoot";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_reject_exp.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_reject_exp.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_reject_exp.pl	(revision 14115)
@@ -63,19 +63,23 @@
    [   
        #          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-       { name => "bg",             type => "mean",  flag => "-bg" },
-       { name => "bg_mean_stdev",  type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev" },
+       { 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" },
    ];
-
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
+
+# these stats are used it the rejections but not passed to the database
+# there is some duplication with the above, but the calculation time is minimal
 my $REJSTATS = 
    [   
        #          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-       { name => "bg",             type => "mean",   flag => "ensMeanMean" },
-       { name => "bg",             type => "stdev",  flag => "ensMeanStdev" },
-       { name => "bg_mean_stdev",  type => "mean",   flag => "ensMeanStdevMean" },
-       { name => "bg_mean_stdev",  type => "stdev",  flag => "ensMeanStdevStdev" },
-       { name => "bg_stdev",       type => "mean",   flag => "ensStdevMean" },
-       { name => "bg_stdev",       type => "stdev",  flag => "ensStdevStdev" },
+       { name => "bg",             type => "mean",  flag => "ensMeanMean",       dtype => "float" },
+       { name => "bg",             type => "stdev", flag => "ensMeanStdev",      dtype => "float" },
+       { name => "bg_mean_stdev",  type => "mean",  flag => "ensMeanStdevMean",  dtype => "float" },
+       { name => "bg_mean_stdev",  type => "stdev", flag => "ensMeanStdevStdev", dtype => "float" },
+       { name => "bg_stdev",       type => "mean",  flag => "ensStdevMean",      dtype => "float" },
+       { name => "bg_stdev",       type => "stdev", flag => "ensStdevStdev",     dtype => "float" },
    ];
+my $rejstats = PS::IPP::Metadata::Stats->new($REJSTATS); # Stats parser
 
 # Look for programs we need
@@ -112,19 +116,17 @@
 
     # Parse the statistics on the residual image
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     $stats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $PS_EXIT_PROG_ERROR);
 
     # Parse the statistics for rejections
-    my $rejstats = PS::IPP::Metadata::Stats->new($REJSTATS); # Stats parser
     $rejstats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $PS_EXIT_PROG_ERROR);
 }
 
 # we use the statistics of the ensemble to accept/reject exposurs
-my $ensMeanMean       = &STATS_value_for_flag ($REJSTATS, "ensMeanMean");      
-my $ensMeanStdev      = &STATS_value_for_flag ($REJSTATS, "ensMeanStdev");     
-my $ensMeanStdevMean  = &STATS_value_for_flag ($REJSTATS, "ensMeanStdevMean"); 
-my $ensMeanStdevStdev = &STATS_value_for_flag ($REJSTATS, "ensMeanStdevStdev");
-my $ensStdevMean      = &STATS_value_for_flag ($REJSTATS, "ensStdevMean");     
-my $ensStdevStdev     = &STATS_value_for_flag ($REJSTATS, "ensStdevStdev");    
+my $ensMeanMean       = $rejstats->value_for_flag ("ensMeanMean");      
+my $ensMeanStdev      = $rejstats->value_for_flag ("ensMeanStdev");     
+my $ensMeanStdevMean  = $rejstats->value_for_flag ("ensMeanStdevMean"); 
+my $ensMeanStdevStdev = $rejstats->value_for_flag ("ensMeanStdevStdev");
+my $ensStdevMean      = $rejstats->value_for_flag ("ensStdevMean");     
+my $ensStdevStdev     = $rejstats->value_for_flag ("ensStdevStdev");    
 
 $ipprc->define_camera($camera);
@@ -283,11 +285,5 @@
 $command .= " -dbname $dbname" if defined $dbname;
 $command .= " -again" unless $stop; 
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Put results into the database
@@ -347,16 +343,3 @@
 }
 
-sub STATS_value_for_flag 
-{
-    my $STATS = shift;
-    my $flag  = shift;
-
-    foreach my $entry (@$STATS) {
-	if ($flag eq $entry->{flag}) {
-	    return $entry->{value};
-	}
-    }
-    return 'NAN';
-}
-
 __END__
Index: /trunk/ippScripts/scripts/detrend_reject_imfile.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_reject_imfile.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_reject_imfile.pl	(revision 14115)
@@ -89,15 +89,16 @@
     [   
 	#          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-	{ name => "bg",             type => "mean",  flag => "-bg" },
-	{ name => "bg_mean_stdev",  type => "stdev", flag => "-bg_mean_stdev" },
-	{ name => "bg_stdev",       type => "rms",   flag => "-bg_stdev" },
-	{ name => "bin_stdev",      type => "rms",   flag => "-bin_stdev" },
-	{ name => "fringe_0",       type => "mean",  flag => "-fringe_0" },
-	{ name => "fringe_1",       type => "rms",   flag => "-fringe_1" },
-	{ name => "fringe_0",       type => "stdev", flag => "-fringe_2" },
-	{ name => "user_1",         type => "mean",  flag => "-user_1" }, # fringe residual
-	{ name => "user_2",         type => "rms",   flag => "-user_2" }, # fringe residual
-	{ name => "user_3",         type => "stdev", flag => "-user_1" }, # fringe residual
+	{ 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 => "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_0",       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
@@ -138,5 +139,4 @@
 
     # Parse the statistics on the residual image
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     $stats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $exp_id, $PS_EXIT_PROG_ERROR);
 }
@@ -338,14 +338,14 @@
 
 # basic ensemble stats
-my $mean      	       = &STATS_value_for_flag ($STATS, "-bg");
-my $meanStdev 	       = &STATS_value_for_flag ($STATS, "-bg_mean_stdev");
-my $stdev     	       = &STATS_value_for_flag ($STATS, "-bg_stdev");
-my $binStdev  	       = &STATS_value_for_flag ($STATS, "-bin_stdev");
-my $fringe_mean        = &STATS_value_for_flag ($STATS, "-fringe_0");
-my $fringe_err         = &STATS_value_for_flag ($STATS, "-fringe_1");
-my $fringe_mean_stdev  = &STATS_value_for_flag ($STATS, "-fringe_2");
-my $dfringe_mean       = &STATS_value_for_flag ($STATS, "-user_1");
-my $dfringe_err        = &STATS_value_for_flag ($STATS, "-user_2");
-my $dfringe_mean_stdev = &STATS_value_for_flag ($STATS, "-user_3");
+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 ("-user_1");
+my $dfringe_err        = $stats->value_for_flag ("-user_2");
+my $dfringe_mean_stdev = $stats->value_for_flag ("-user_3");
 
 # other stats (flux depends on bg and exp_time)
@@ -469,11 +469,5 @@
 $command .= ' -reject' if $reject;
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 unless ($no_update) {
@@ -532,17 +526,4 @@
 
     return $value;
-}
-
-sub STATS_value_for_flag 
-{
-    my $STATS = shift;
-    my $flag  = shift;
-
-    foreach my $entry (@$STATS) {
-	if ($flag eq $entry->{flag}) {
-	    return $entry->{value};
-	}
-    }
-    return 'NAN';
 }
 
Index: /trunk/ippScripts/scripts/detrend_resid.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_resid.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_resid.pl	(revision 14115)
@@ -83,18 +83,21 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "ROBUST_MEDIAN",      type => "mean",  flag => "-bg" },
-       { name => "ROBUST_MEDIAN",      type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "ROBUST_STDEV",       type => "rms",   flag => "-bg_stdev" },
-       { name => "FRINGE_0",           type => "mean",  flag => "-fringe_0" },
-       { name => "FRINGE_ERR_0",       type => "rms",   flag => "-fringe_1" },
-       { name => "FRINGE_0",           type => "stdev", flag => "-fringe_2" },
-       { name => "FRINGE_RESID_0",     type => "mean",  flag => "-user_1" },
-       { name => "FRINGE_RESID_ERR_0", type => "rms",   flag => "-user_2" },
-       { name => "FRINGE_RESID_0",     type => "stdev", flag => "-user_3" },
+       { name => "ROBUST_MEDIAN",      type => "mean",  flag => "-bg",            dtype => "float" },
+       { name => "ROBUST_MEDIAN",      type => "stdev", flag => "-bg_mean_stdev", dtype => "float" },
+       { name => "ROBUST_STDEV",       type => "rms",   flag => "-bg_stdev",	  dtype => "float" },
+       { name => "FRINGE_0",           type => "mean",  flag => "-fringe_0",	  dtype => "float" },
+       { name => "FRINGE_ERR_0",       type => "rms",   flag => "-fringe_1",	  dtype => "float" },
+       { name => "FRINGE_0",           type => "stdev", flag => "-fringe_2",	  dtype => "float" },
+       { name => "FRINGE_RESID_0",     type => "mean",  flag => "-user_1",  	  dtype => "float" },
+       { name => "FRINGE_RESID_ERR_0", type => "rms",   flag => "-user_2",  	  dtype => "float" },
+       { name => "FRINGE_RESID_0",     type => "stdev", flag => "-user_3",  	  dtype => "float" },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
+
 my $BINNED_STATS = 
    [   
        { name => "ROBUST_STDEV",   type => "rms",   flag => "-bin_stdev" },
    ];
+my $binnedStats = PS::IPP::Metadata::Stats->new($BINNED_STATS); # Stats parser
 
 # Flags to specify the particular detrend to use
@@ -167,5 +170,4 @@
 
     # Parse the statistics on the residual image
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     $stats->parse($metadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
 
@@ -179,8 +181,8 @@
     }
 
+    # Parse the output contents into a metadata
+    my $binnedMetadata = $mdcParser->parse(join "", @$stdout_buf) or &my_die("Unable to parse metadata output", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
+
     # parse the binned image statistics
-    my $binnedMetadata = $mdcParser->parse(join "", @$stdout_buf) or &my_die("Unable to parse metadata output", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
-
-    my $binnedStats = PS::IPP::Metadata::Stats->new($BINNED_STATS); # Stats parser
     $binnedStats->parse($binnedMetadata) or &my_die("Unable to find all values in statistics output.", $det_id, $iter, $exp_id, $class_id, $PS_EXIT_PROG_ERROR);
 }
@@ -196,11 +198,6 @@
 $command .= " -path_base $outputRoot";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS, @$BINNED_STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
+$command .= $binnedStats->cmdflags();
 
 # Add the processed file to the database
Index: /trunk/ippScripts/scripts/detrend_stack.pl
===================================================================
--- /trunk/ippScripts/scripts/detrend_stack.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/detrend_stack.pl	(revision 14115)
@@ -73,9 +73,10 @@
    [   
        #          KEYWORD                 STATISTIC          CHIPTOOL FLAG
-       { name => "bg",             type => "mean",  flag => "-bg" },
-       { name => "bg",             type => "stdev", flag => "-bg_mean_stdev" },
-       { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev" },
+       { name => "bg",             type => "mean",  flag => "-bg",             dtype => "float" },
+       { name => "bg",             type => "stdev", flag => "-bg_mean_stdev",  dtype => "float" },
+       { name => "bg_stdev",       type => "rms",   flag => "-bg_stdev",       dtype => "float" },
        # { name => "bg_mean_stdev",  type => "rms",   flag => "-bg_mean_stdev" },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -147,5 +148,4 @@
 	&my_die("Unable to parse metadata config doc", $det_id, $iter, $class_id, $PS_EXIT_SYS_ERROR);
 
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     $stats->parse($metadata)  or
 	&my_die("Unable to find all values in statistics output.", $det_id, $iter, $class_id, $PS_EXIT_SYS_ERROR);
@@ -159,11 +159,5 @@
 $command .= " -recip $recipe";
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag $value";
-}
+$command .= $stats->cmdflags();
 
 # Add the resultant into the database
Index: /trunk/ippScripts/scripts/register_exp.pl
===================================================================
--- /trunk/ippScripts/scripts/register_exp.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/register_exp.pl	(revision 14115)
@@ -59,25 +59,26 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "exp_name",       type => "constant",   flag => "-exp_name" }, # File level
-       { name => "telescope",      type => "constant",   flag => "-telescope" }, # File level
-       { name => "camera",         type => "constant",   flag => "-inst" }, # File level
-       { name => "filelevel",      type => "constant",   flag => "-filelevel" }, # File level
-       { name => "object",         type => "constant",   flag => "-object" },
-       { name => "exp_type",       type => "constant",   flag => "-exp_type" }, # File level
-       { name => "filter",         type => "constant",   flag => "-filter" }, # File level
-       { name => "dateobs",        type => "constant",   flag => "-dateobs" }, # File level
-       { name => "ccd_temp",	   type => "mean", 	 flag => "-ccd_temp" }, # CCD temperature
-       { name => "exp_time",	   type => "mean", 	 flag => "-exp_time" }, # Exposure time
-       { name => "sat_pixel_frac", type => "mean", 	 flag => "-sat_pixel_frac" }, # Fraction of saturated pixels
-       { name => "airmass",	   type => "mean", 	 flag => "-airmass" }, # Airmass
-       { name => "ra",		   type => "mean", 	 flag => "-ra" }, # Right ascension
-       { name => "decl",	   type => "mean", 	 flag => "-decl" }, # Declination
-       { name => "posang",	   type => "mean", 	 flag => "-posang" }, # Position angle
-       { name => "alt",		   type => "mean", 	 flag => "-alt" }, # Altitude
-       { name => "az",		   type => "mean", 	 flag => "-az" }, # Azimuth
-       { name => "bg",		   type => "mean", 	 flag => "-bg" }, # Azimuth
-       { name => "bg",		   type => "stdev", 	 flag => "-bg_mean_stdev" }, # Azimuth
-       { name => "bg_stdev",	   type => "rms", 	 flag => "-bg_stdev" }, # Azimuth
+       { name => "exp_name",       type => "constant",   flag => "-exp_name",       dtype => "string" }, # File level
+       { name => "telescope",      type => "constant",   flag => "-telescope",      dtype => "string" }, # File level
+       { name => "camera",         type => "constant",   flag => "-inst",           dtype => "string" }, # File level
+       { name => "filelevel",      type => "constant",   flag => "-filelevel",      dtype => "string" }, # File level
+       { name => "object",         type => "constant",   flag => "-object",         dtype => "string" },
+       { name => "exp_type",       type => "constant",   flag => "-exp_type",       dtype => "string" }, # File level
+       { name => "filter",         type => "constant",   flag => "-filter",         dtype => "string" }, # File level
+       { name => "dateobs",        type => "constant",   flag => "-dateobs",        dtype => "string" }, # File level
+       { name => "ccd_temp",       type => "mean",       flag => "-ccd_temp",       dtype => "float"  }, # CCD temperature
+       { name => "exp_time",       type => "mean",       flag => "-exp_time",       dtype => "float"  }, # Exposure time
+       { name => "sat_pixel_frac", type => "mean",       flag => "-sat_pixel_frac", dtype => "float"  }, # Fraction of saturated pixels
+       { name => "airmass",        type => "mean",       flag => "-airmass",        dtype => "float"  }, # Airmass
+       { name => "ra",             type => "mean",       flag => "-ra",             dtype => "float"  }, # Right ascension
+       { name => "decl",           type => "mean",       flag => "-decl",           dtype => "float"  }, # Declination
+       { name => "posang",         type => "mean",       flag => "-posang",         dtype => "float"  }, # Position angle
+       { name => "alt",            type => "mean",       flag => "-alt",            dtype => "float"  }, # Altitude
+       { name => "az",             type => "mean",       flag => "-az",             dtype => "float"  }, # Azimuth
+       { name => "bg",             type => "mean",       flag => "-bg",             dtype => "float"  }, # background
+       { name => "bg",             type => "stdev",      flag => "-bg_mean_stdev",  dtype => "float"  }, # Azimuth
+       { name => "bg_stdev",       type => "rms",        flag => "-bg_stdev",       dtype => "float"  }, # Azimuth
        ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for commands we need
@@ -117,5 +118,4 @@
 
     # extract the stats from the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
         &my_die ("Unable to find all values", $exp_id, $PS_EXIT_CONFIG_ERROR);
@@ -124,9 +124,9 @@
 
 # we require at a minimum: -telescope, -inst, -filelevel, -class_id, -exp_type
-if (uc(&STATS_value_for_flag ($STATS, "-telescope")) eq "NAN") { &my_die ("telescope not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-inst"))      eq "NAN") { &my_die ("inst      not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-filelevel")) eq "NAN") { &my_die ("filelevel not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-exp_type"))  eq "NAN") { &my_die ("exp_type  not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-exp_name"))  eq "NAN") { &my_die ("exp_name  not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-telescope")) eq "NULL") { &my_die ("telescope not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-inst"))      eq "NULL") { &my_die ("inst      not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-filelevel")) eq "NULL") { &my_die ("filelevel not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-exp_type"))  eq "NULL") { &my_die ("exp_type  not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-exp_name"))  eq "NULL") { &my_die ("exp_name  not found", $exp_id, $PS_EXIT_CONFIG_ERROR); }
 
 my $command = "$regtool -addprocessedexp";
@@ -134,13 +134,7 @@
 $command .= " -exp_tag $exp_tag";
 $command .= " -dbname $dbname" if defined $dbname;
+$command .= $stats->cmdflags();
 
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag '$value'";
-}
-
-my $exp_type = &STATS_value_for_flag ($STATS, "-exp_type");
+my $exp_type = $stats->value_for_flag ("-exp_type");
 
 # Add the detrend flag, if needed
@@ -196,17 +190,4 @@
 }
 
-sub STATS_value_for_flag 
-{
-    my $STATS = shift;
-    my $flag  = shift;
-
-    foreach my $entry (@$STATS) {
-	if ($flag eq $entry->{flag}) {
-	    return $entry->{value};
-	}
-    }
-    return 'NAN';
-}
-
 END {
     my $exit = $?;
Index: /trunk/ippScripts/scripts/register_imfile.pl
===================================================================
--- /trunk/ippScripts/scripts/register_imfile.pl	(revision 14114)
+++ /trunk/ippScripts/scripts/register_imfile.pl	(revision 14115)
@@ -52,5 +52,5 @@
 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV;
 pod2usage( -msg => "Required options: --exp_id --tmp_class_id --tmp_exp_name --uri",
-	   -exitval => 3) unless
+           -exitval => 3) unless
     defined $exp_id and
     defined $tmp_class_id and
@@ -64,25 +64,26 @@
    [   
        #          PPSTATS KEYWORD         STATISTIC          CHIPTOOL FLAG
-       { name => "FILE.LEVEL",     type => "constant", flag => "-filelevel" }, # File level
-       { name => "CLASS.ID",       type => "constant", flag => "-class_id" },  # Real Class ID
-       { name => "FPA.OBJECT",     type => "constant", flag => "-object" },    # Object
-       { name => "FPA.OBSTYPE",    type => "constant", flag => "-exp_type" },  # Exposure type
-       { name => "FPA.FILTER",     type => "constant", flag => "-filter" },    # Filter used
-       { name => "FPA.AIRMASS",    type => "constant", flag => "-airmass" },   # Airmass
-       { name => "FPA.RA",         type => "constant", flag => "-ra" },        # Right ascension
-       { name => "FPA.DEC",        type => "constant", flag => "-decl" },      # Declination
-       { name => "FPA.ALT",        type => "constant", flag => "-alt" },       # Altitude
-       { name => "FPA.AZ",         type => "constant", flag => "-az" },        # Azimuth
-       { name => "FPA.POSANGLE",   type => "constant", flag => "-posang" },    # Position angle
-       { name => "FPA.TIME",       type => "constant", flag => "-dateobs" },   # Date of observation (UTC)
-       { name => "FPA.TELESCOPE",  type => "constant", flag => "-telescope" }, # Telescope
-       { name => "FPA.INSTRUMENT", type => "constant", flag => "-inst" },      # Instrument 
-       { name => "CHIP.TEMP",      type => "mean",     flag => "-ccd_temp" }, # CCD temperature
-       { name => "CELL.EXPOSURE",  type => "mean",     flag => "-exp_time" }, # Exposure time
-       { name => "SAT_PIXEL_FRAC", type => "mean",     flag => "-sat_pixel_frac" }, # fraction of saturated pixels
-       { name => "ROBUST_MEDIAN",  type => "mean",     flag => "-bg" },
-       { name => "ROBUST_MEDIAN",  type => "stdev",    flag => "-bg_mean_stdev" },
-       { name => "ROBUST_STDEV",   type => "rms",      flag => "-bg_stdev" },
+       { name => "FILE.LEVEL",     type => "constant", flag => "-filelevel",      dtype => "string" }, # File level
+       { name => "CLASS.ID",       type => "constant", flag => "-class_id",       dtype => "string" }, # Real Class ID
+       { name => "FPA.OBJECT",     type => "constant", flag => "-object",         dtype => "string" }, # Object
+       { name => "FPA.OBSTYPE",    type => "constant", flag => "-exp_type",       dtype => "string" }, # Exposure type
+       { name => "FPA.FILTER",     type => "constant", flag => "-filter",         dtype => "string" }, # Filter used
+       { name => "FPA.AIRMASS",    type => "constant", flag => "-airmass",        dtype => "float"  }, # Airmass
+       { name => "FPA.RA",         type => "constant", flag => "-ra",             dtype => "float"  }, # Right ascension
+       { name => "FPA.DEC",        type => "constant", flag => "-decl",           dtype => "float"  }, # Declination
+       { name => "FPA.ALT",        type => "constant", flag => "-alt",            dtype => "float"  }, # Altitude
+       { name => "FPA.AZ",         type => "constant", flag => "-az",             dtype => "float"  }, # Azimuth
+       { name => "FPA.POSANGLE",   type => "constant", flag => "-posang",         dtype => "float"  }, # Position angle
+       { name => "FPA.TIME",       type => "constant", flag => "-dateobs",        dtype => "string" }, # Date of observation (UTC)
+       { name => "FPA.TELESCOPE",  type => "constant", flag => "-telescope",      dtype => "string" }, # Telescope
+       { name => "FPA.INSTRUMENT", type => "constant", flag => "-inst",           dtype => "string" }, # Instrument 
+       { name => "CHIP.TEMP",      type => "mean",     flag => "-ccd_temp",       dtype => "float"  }, # CCD temperature
+       { name => "CELL.EXPOSURE",  type => "mean",     flag => "-exp_time",       dtype => "float"  }, # Exposure time
+       { name => "SAT_PIXEL_FRAC", type => "mean",     flag => "-sat_pixel_frac", dtype => "float"  }, # fraction of saturated pixels
+       { name => "ROBUST_MEDIAN",  type => "mean",     flag => "-bg",             dtype => "float"  },
+       { name => "ROBUST_MEDIAN",  type => "stdev",    flag => "-bg_mean_stdev",  dtype => "float"  },
+       { name => "ROBUST_STDEV",   type => "rms",      flag => "-bg_stdev",       dtype => "float"  },
    ];
+my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
 
 # Look for programs we need
@@ -112,5 +113,5 @@
         cache_run(command => $command, verbose => 1);
     unless ($success) { 
-	$error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
         &my_die ("Unable to perform ppStats on exposure id $exp_id: $error_code", $exp_id, $tmp_exp_name, $tmp_class_id, $error_code);
     }
@@ -124,5 +125,4 @@
 
     # extract the stats from the metadata
-    my $stats = PS::IPP::Metadata::Stats->new($STATS); # Stats parser
     unless ($stats->parse($metadata)) {
         &my_die ("Unable to find all values", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR);
@@ -131,9 +131,9 @@
 
 # we require at a minimum: -telescope, -inst, -filelevel, -class_id, -exp_type
-if (uc(&STATS_value_for_flag ($STATS, "-telescope")) eq "NAN") { &my_die ("telescope not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-inst"))      eq "NAN") { &my_die ("inst      not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-filelevel")) eq "NAN") { &my_die ("filelevel not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-class_id"))  eq "NAN") { &my_die ("class_id  not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
-if (uc(&STATS_value_for_flag ($STATS, "-exp_type"))  eq "NAN") { &my_die ("exp_type  not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-telescope")) eq "NULL") { &my_die ("telescope not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-inst"))      eq "NULL") { &my_die ("inst      not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-filelevel")) eq "NULL") { &my_die ("filelevel not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-class_id"))  eq "NULL") { &my_die ("class_id  not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
+if (uc($stats->value_for_flag ("-exp_type"))  eq "NULL") { &my_die ("exp_type  not found", $exp_id, $tmp_exp_name, $tmp_class_id, $PS_EXIT_CONFIG_ERROR); }
 
 my $command = "$regtool -addprocessedimfile";
@@ -142,11 +142,5 @@
 $command .= " -tmp_class_id $tmp_class_id"; # the original class_id supplied by the user, replace by ppStats CLASS.ID
 $command .= " -dbname $dbname" if defined $dbname;
-
-# add in the elements from the selected stats above
-foreach my $entry (@$STATS) {
-    my $value = $entry->{value};
-    my $flag = $entry->{flag};
-    $command .= " $flag '$value'";
-}
+$command .= $stats->cmdflags();
 
 # Push the results into the database
@@ -155,5 +149,5 @@
         run(command => $command, verbose => 1);
     unless ($success) {
-	$error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
+        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
         warn ("Unable to perform regtool -addprocessedimfile: $error_code");
         exit($error_code);
@@ -189,29 +183,16 @@
     carp($msg);
     if ($exp_id && $tmp_class_id and not $no_update) {
-	my $command = "$regtool -addprocessedimfile";
-	$command .= " -exp_id $exp_id";
-	$command .= " -exp_name $exp_name";
-	$command .= " -tmp_class_id $tmp_class_id";
-	$command .= " -telescope UNKNOWN";
-	$command .= " -inst UNKNOWN";
-	$command .= " -class_id $tmp_class_id";
-	$command .= " -code $exit_code";
-	$command .= " -dbname $dbname" if defined $dbname;
+        my $command = "$regtool -addprocessedimfile";
+        $command .= " -exp_id $exp_id";
+        $command .= " -exp_name $exp_name";
+        $command .= " -tmp_class_id $tmp_class_id";
+        $command .= " -telescope UNKNOWN";
+        $command .= " -inst UNKNOWN";
+        $command .= " -class_id $tmp_class_id";
+        $command .= " -code $exit_code";
+        $command .= " -dbname $dbname" if defined $dbname;
         system ($command);
     }
     exit $exit_code;
-}
-
-sub STATS_value_for_flag 
-{
-    my $STATS = shift;
-    my $flag  = shift;
-
-    foreach my $entry (@$STATS) {
-	if ($flag eq $entry->{flag}) {
-	    return $entry->{value};
-	}
-    }
-    return 'NAN';
 }
 
