Index: /trunk/Ohana/src/perl/src/elixir.postrun
===================================================================
--- /trunk/Ohana/src/perl/src/elixir.postrun	(revision 108)
+++ /trunk/Ohana/src/perl/src/elixir.postrun	(revision 109)
@@ -11,4 +11,11 @@
 if ($ARGV[0] eq "state")  { &state; }
 if ($ARGV[0] eq "update") { &update; }
+
+&load_state;
+   
+if ($ARGV[0] eq "imstats")   { &imstats_state ("imstats");     &save_state; &goodbye; }
+if ($ARGV[0] eq "ptolemy")   { &ptolemy_state ("ptolemy");     &save_state; &goodbye; }
+if ($ARGV[0] eq "standards") { &standards_state ("standards"); &save_state; &goodbye; }
+if ($ARGV[0] eq "validate")  { &validate_state ("validate");   &save_state; &goodbye; }
 
 &escape ("unknown command $ARGV[0]");
@@ -115,4 +122,5 @@
     
     if ($entry eq "camera")    { &camera_state    ($entry); }
+    if ($entry eq "imstats")   { &imstats_state   ($entry); }
     if ($entry eq "mkdetrend") { &detrend_state   ($entry); }
     if ($entry eq "mkfringe")  { &detrend_state   ($entry); }
@@ -126,5 +134,4 @@
     
     my ($entry) = "ptolemy";
-    
     $current = $state{$entry};
     if (! $current) { &escape ("error: ptolemy state not set?"); }
@@ -135,28 +142,23 @@
     
     # if we can, run 'elixir complete'
-    if (($current eq "init") && ($state{"mkdetrend"} eq "done") && ($state{"mkfringe"} eq "done")) { 
+    if (($current eq "init") && ($state{"mkdetrend"} eq "done")) {
 	$state{$entry} = "running";
 	&save_state;
 
 	if (-e "$fifos/complete.pid") { 
-	    $state{$entry} = "fail";
-	    &save_state;
 	    print STDERR "elixir (sex)complete already running? check pid file $fifos/complete.pid"; 
-	    &escape ("failed to start ptolemy"); 
+	    &save_escape ($entry, "failed to start ptolemy"); 
 	}
 
 	if (! -d "$datdir/$runid") { mkdir ("$datdir/$runid", 0777); }
 	($tmp, $start, $stop) = split (" ", `mkrun run $runid`);
-	if ($?) { &escape ("error in RUNID $runid"); }
+	if ($?) { &save_escape ($entry, "error in RUNID $runid"); }
 	vsystem ("imsearch -type object -trange $start $stop -pt > $ptlist");
+	if ($?) { &save_escape ($entry, "error extracting images from db"); }
  	vsystem ("elixir -D mode sexcomplete $ptlist >& $ptlog &");
 
 	# wait for up to 10 seconds for $fifos/complete.pid to exist 
 	for ($Nwait = 0; ($Nwait < 30) && (! -e "$fifos/complete.pid"); $Nwait ++) { sleep 2; }
-	if (! -e "$fifos/complete.pid") { 
-	    $state{$entry} = "fail";
-	    &save_state;
-	    &escape ("failed to start elixir (sex)complete"); 
-	}
+	if (! -e "$fifos/complete.pid") { &save_escape ($entry, "failed to start elixir (sex)complete"); }
     }
 
@@ -194,4 +196,8 @@
     my ($entry) = "standards";
     $current = $state{$entry};
+
+    print "entry: $entry\n";
+    print "current: $current\n";
+
     if (! $current) { &escape ("error: standards state not set?"); }
 
@@ -206,7 +212,4 @@
 	# insert standards in photometry database
 	foreach $filter (@filter) {
-#	    vsystem ("addrefs -replace -v $stds/Landolt92$filter.fix $filter\_L92");	    
-#	    vsystem ("addrefs -replace -v $stds/Landolt92$filter.hq  $filter\_L92_HQ");
-
 	    @words = split (" ", `filtnames $filter -cal`);
 	    if ($words[1] == 0) { next; }
@@ -221,5 +224,5 @@
 	vsystem ("elixir.photreport $runid $catdir");
 	if ($?) { goto standards_fail; }
-	
+
 	# load lines from phot.reg files and execute:
 	@reglist = ();
@@ -398,4 +401,65 @@
     $state{$entry} = "fail";
     return;
+}
+
+##############
+sub imstats_state {
+
+    my ($entry) = "imstats";
+    $current = $state{$entry};
+    if (! $current) { &escape ("error: imstats state not set?"); }
+    
+    $fifos  = `gconfig FIFOS`; chop $fifos;
+    $pid    = "$fifos/imstats.pid";
+    $end    = "$fifos/imstats.pid";
+    $ptlist = "$datdir/$runid/$runid.redo.list";
+    $ptlog  = "$datdir/$runid/$runid.redo.log";
+
+    # if we can, run 'elixir complete'
+    if (($current eq "init") && ($state{"camera"} eq "off")) {
+	$state{$entry} = "running";
+	&save_state;
+	
+	# check for currently running imstats
+	if (-e $pid) { 
+	    print STDERR "elixir imstats still running?\n"; 
+	    print STDERR "run 'elixir -C $camera -D mode imstats -kill' to stop\n";
+	    &save_escape ($entry, "failure on imstats");
+	}
+
+	# extract redo list, run processing
+	($tmp, $start, $stop) = split (" ", `mkrun run $runid`);
+	if ($?) { &save_escape ($entry, "error in RUNID $runid"); }
+	vsystem ("imsearch -trange $start $stop -proc f -pt > $ptlist");
+	if ($?) { &save_escape ($entry, "error extracting unprocessed data"); }
+	vsystem ("elixir -D mode imstats $ptlist >& $ptlog &");
+	
+	# wait for up to 10 seconds for $pid to exist 
+	for ($Nwait = 0; ($Nwait < 30) && (! -e "$pid"); $Nwait ++) { sleep 2; }
+	if (! -e "$pid") { &save_escape ($entry, "failed to start elixir imstats"); }
+    }
+
+    # has 'elixir complete' finished? successfully?
+    if ($current eq "running") {
+	if (-e "$fifos/imstats.end") {
+	    $answer = `wc -l $fifos/imstats.success`;
+	    ($Nsuccess) = split (" ", $answer);
+	    $answer = `wc -l $fifos/imstats.failure`;
+	    ($Nfailure) = split (" ", $answer);
+	    $answer = `wc -l $ptlist`;
+	    ($Ntotal) = split (" ", $answer);
+
+	    print "Ntotal: $Ntotal\n";
+	    print "Nsuccess: $Nsuccess\n";
+	    print "Nfailure: $Nfailure\n";
+
+	    if ($Nsuccess < 0.5*$Ntotal) { &save_escape ($entry, "too many failures: $Nsuccess of $Ntotal"); }
+	    if ($Nsuccess + $Nfailure > $Ntotal) { &save_escape ($entry, "output list is inconsistent"); }
+	    $state{$entry} = "done"; 
+	    &save_state;
+	    return;
+	}
+	if ((! -e "$fifos/imstats.end") && (! -e "$fifos/imstats.pid")) { &save_escape ($entry, "elixir complete killed?"); }
+    }
 }
 
@@ -470,4 +534,12 @@
 }
 
+sub save_escape {
+    my ($entry) = $_[0];
+    my ($message) = $_[1];
+    $state{$entry} = "fail";
+    &save_state;
+    &escape ($message);
+}
+
 sub elixir_config {
     my (@arg) = @_;
@@ -554,4 +626,5 @@
 
     @def_state = ("camera",    "off",
+		  "imstats",   "init",
 		  "mkdetrend", "init",
 		  "mkfringe",  "init", 
@@ -614,4 +687,2 @@
     &goodbye;
 }
-
-
