Index: trunk/ippMonitor/Makefile.in
===================================================================
--- trunk/ippMonitor/Makefile.in	(revision 19183)
+++ trunk/ippMonitor/Makefile.in	(revision 19302)
@@ -71,4 +71,5 @@
 $(DESTWWW)/newImfile.php \
 $(DESTWWW)/guidePendingExp.php \
+$(DESTWWW)/chipSummary.php \
 $(DESTWWW)/chipStageExp.php \
 $(DESTWWW)/chipPendingExp.php \
@@ -77,4 +78,5 @@
 $(DESTWWW)/chipProcessedImfile.php \
 $(DESTWWW)/chipProcessedImfile_failure.php \
+$(DESTWWW)/camSummary.php \
 $(DESTWWW)/camStageExp.php \
 $(DESTWWW)/camPendingExp.php \
@@ -83,4 +85,5 @@
 $(DESTWWW)/camProcessedExp_failure.php \
 $(DESTWWW)/camProcessedImfile.php \
+$(DESTWWW)/fakeSummary.php \
 $(DESTWWW)/fakeStageExp.php \
 $(DESTWWW)/fakePendingExp.php \
@@ -105,4 +108,5 @@
 $(DESTWWW)/summitExp.php \
 $(DESTWWW)/summitImfile.php \
+$(DESTWWW)/warpSummary.php \
 $(DESTWWW)/warpStageExp.php \
 $(DESTWWW)/warpStageSkyfiles.php \
Index: trunk/ippMonitor/def/autocode.php
===================================================================
--- trunk/ippMonitor/def/autocode.php	(revision 19183)
+++ trunk/ippMonitor/def/autocode.php	(revision 19302)
@@ -27,5 +27,10 @@
 
 // get the result table count
-$sql = "SELECT count(*) FROM $TABLE $WHERE";
+if ($MODE == "basic") {
+  $sql = "SELECT count(*) FROM $TABLE $WHERE";
+}
+if ($MODE == "summary") {
+  $sql = "SELECT count(*) FROM (SELECT $FIELDS FROM $TABLE $WHERE) as TEMP";
+}
 
 $qry = $db->query($sql);
@@ -52,5 +57,10 @@
 
 // query the database
-$sql = "SELECT $FIELDS FROM $TABLE $WHERE LIMIT $dTABLE OFFSET $rowStart";
+if ($MODE == "basic") {
+  $sql = "SELECT $FIELDS FROM $TABLE $WHERE LIMIT $dTABLE OFFSET $rowStart";
+}
+if ($MODE == "summary") {
+  $sql = "SELECT $FIELDS FROM $TABLE $WHERE LIMIT $dTABLE OFFSET $rowStart";
+}
 
 $qry = $db->query($sql);
Index: trunk/ippMonitor/def/camSummary.d
===================================================================
--- trunk/ippMonitor/def/camSummary.d	(revision 19302)
+++ trunk/ippMonitor/def/camSummary.d	(revision 19302)
@@ -0,0 +1,16 @@
+TABLE camRun
+TITLE Cam Summary
+FILE  camSummary.php
+MENU  ipp.science.dat
+
+#     field           size  format  name         show    link to         extras
+FIELD label,    	 7, %s,     label
+FIELD workdir,    	 7, %s,     workdir
+FIELD tess_id,    	 7, %s,     tess_id
+FIELD state,    	 7, %s,     state
+FIELD count(state) as n, 7, %d,     count
+
+MODE  summary
+GROUP state
+GROUP label
+GROUP workdir
Index: trunk/ippMonitor/def/chipSummary.d
===================================================================
--- trunk/ippMonitor/def/chipSummary.d	(revision 19302)
+++ trunk/ippMonitor/def/chipSummary.d	(revision 19302)
@@ -0,0 +1,16 @@
+TABLE chipRun
+TITLE Chip Summary
+FILE  chipSummary.php
+MENU  ipp.science.dat
+
+#     field           size  format  name         show    link to         extras
+FIELD label,    	 7, %s,     label
+FIELD workdir,    	 7, %s,     workdir
+FIELD tess_id,    	 7, %s,     tess_id
+FIELD state,    	 7, %s,     state
+FIELD count(state) as n, 7, %d,     count
+
+MODE  summary
+GROUP state
+GROUP label
+GROUP workdir
Index: trunk/ippMonitor/def/fakeSummary.d
===================================================================
--- trunk/ippMonitor/def/fakeSummary.d	(revision 19302)
+++ trunk/ippMonitor/def/fakeSummary.d	(revision 19302)
@@ -0,0 +1,16 @@
+TABLE fakeRun
+TITLE Fake Summary
+FILE  fakeSummary.php
+MENU  ipp.science.dat
+
+#     field           size  format  name         show    link to         extras
+FIELD label,    	 7, %s,     label
+FIELD workdir,    	 7, %s,     workdir
+FIELD tess_id,    	 7, %s,     tess_id
+FIELD state,    	 7, %s,     state
+FIELD count(state) as n, 7, %d,     count
+
+MODE  summary
+GROUP state
+GROUP label
+GROUP workdir
Index: trunk/ippMonitor/def/warpSummary.d
===================================================================
--- trunk/ippMonitor/def/warpSummary.d	(revision 19302)
+++ trunk/ippMonitor/def/warpSummary.d	(revision 19302)
@@ -0,0 +1,18 @@
+TABLE warpRun
+TITLE Warp Summary
+FILE  warpSummary.php
+MENU  ipp.science.dat
+
+# WHERE warp_id > 200 
+
+#     field           size  format  name         show    link to         extras
+FIELD label,    	 7, %s,     label
+FIELD workdir,    	 7, %s,     workdir
+FIELD tess_id,    	 7, %s,     tess_id
+FIELD state,    	 7, %s,     state
+FIELD count(state) as n, 7, %d,     count
+
+MODE  summary
+GROUP state
+GROUP label
+GROUP workdir
Index: trunk/ippMonitor/raw/ipp.menu.dat
===================================================================
--- trunk/ippMonitor/raw/ipp.menu.dat	(revision 19183)
+++ trunk/ippMonitor/raw/ipp.menu.dat	(revision 19302)
@@ -21,7 +21,5 @@
 menutop   | menutop      | link    | Detrend Steps                | ipp.detrend.php
 menutop   | menutop      | link    | Science Steps                | ipp.science.php
-menutop   | menutop      | link    | Warp Steps                   | ipp.warp.php
 menutop   | menutop      | link    | Stack Steps                  | ipp.stack.php
-menutop   | menutop      | link    | Diff Steps                   | ipp.diff.php
 menutop   | menutop      | link    | Cal Steps                    | ipp.cal.php
 menutop   | menutop      | link    | Imfile Tables                | ipp.imfiles.php
Index: trunk/ippMonitor/raw/ipp.php
===================================================================
--- trunk/ippMonitor/raw/ipp.php	(revision 19183)
+++ trunk/ippMonitor/raw/ipp.php	(revision 19302)
@@ -416,5 +416,9 @@
 }
 
-function check_ordering ($where) {
+function check_ordering ($groups, $where) {
+
+  if ($groups != "") {
+    $where = $where . " GROUP BY $groups";
+  }
 
   if ($_SERVER[REQUEST_METHOD] == 'GET') { 
Index: trunk/ippMonitor/raw/ipp.science.dat
===================================================================
--- trunk/ippMonitor/raw/ipp.science.dat	(revision 19183)
+++ trunk/ippMonitor/raw/ipp.science.dat	(revision 19302)
@@ -26,4 +26,5 @@
 
 menutop   | menutop      | plain   | &nbsp;                       | 
+menulink  | menuselect   | link    | Chip Summary                 | chipSummary.php
 menulink  | menuselect 	 | link    | Chip-Stage Exp               | chipStageExp.php            
 menulink  | menuselect 	 | link    | Chip Pending Exp             | chipPendingExp.php              
@@ -34,4 +35,5 @@
 
 menutop   | menutop      | plain   | &nbsp;                       | 
+menulink  | menuselect   | link    | Cam Summary                 | camSummary.php
 menulink  | menuselect 	 | link    | Cam-Stage Exp                | camStageExp.php            
 menulink  | menuselect 	 | link    | Cam Pending Exp              | camPendingExp.php              
@@ -42,4 +44,5 @@
 
 menutop   | menutop      | plain   | &nbsp;                       | 
+menulink  | menuselect   | link    | Fake Summary                 | fakeSummary.php
 menulink  | menuselect 	 | link    | Fake-Stage Exp               | fakeStageExp.php            
 menulink  | menuselect 	 | link    | Fake Pending Exp             | fakePendingExp.php              
@@ -50,4 +53,5 @@
 
 menutop   | menutop      | plain   | &nbsp;                       | 
+menulink  | menuselect   | link    | Warp Summary                 | warpSummary.php
 menulink  | menuselect   | link    | Warp Stage Exp               | warpStageExp.php
 menulink  | menuselect   | link    | Warp Stage Skyfiles          | warpStageSkyfiles.php
Index: trunk/ippMonitor/scripts/generate
===================================================================
--- trunk/ippMonitor/scripts/generate	(revision 19183)
+++ trunk/ippMonitor/scripts/generate	(revision 19302)
@@ -27,4 +27,5 @@
     &init_key ("MENU");
     &init_key ("STYLE");
+    &init_key ("MODE");
     &init_key ("TABLE");
     &init_key ("TITLE");
@@ -32,4 +33,5 @@
 
     &init_key ("FIELDS");
+    &init_key ("GROUPS");
 
     foreach $line (@list) {
@@ -47,16 +49,21 @@
 	    ($field, $width, $format, $name, $show, $link, $extras) = split (/,\s+/, $value, 7);
 	    if (! $name) { die "table $ARGV[0] missing required elements\n"; }
-	    # ($field) = $field =~ m|\s*(\S+)\s*|;
-
+	    if ($field =~ m|\S+\s+as\s+\S+|) {
+		($fieldreal) = $field =~ m|\S+\s+as\s+(\S+)|;
+	    } else {
+		$fieldreal = $field;
+	    }
+	    
 	    if ($VERBOSE) { printf "%-20s %-20s %-20s %-20s %-20s %-20s\n", $field, $name, $format, $show, $link, $extras; }
 
 	    if ($show eq "") {$show = "value";}
-	    push @field,   $field;
-	    push @width,   $width;
-	    push @format,  $format;
-	    push @name,    $name;
-	    push @show,    $show;
-	    push @link,    $link;
-	    push @extras,  $extras;
+	    push @field,     $field;
+	    push @fieldreal, $fieldreal;
+	    push @width,     $width;
+	    push @format,    $format;
+	    push @name,      $name;
+	    push @show,      $show;
+	    push @link,      $link;
+	    push @extras,    $extras;
 	}
 
@@ -73,4 +80,9 @@
 	if ($key eq "IMAGE") {
 	    push @imagedefs, $value;
+	}
+
+	# the GROUP entries are used in summary tables as arguments to the GROUP BY sql statement
+	if ($key eq "GROUP") {
+	    push @group, $value;
 	}
 
@@ -108,4 +120,5 @@
     &check_key ("MENU", "ipp.menu.dat");
     &check_key ("STYLE", "ipp.css");
+    &check_key ("MODE", "basic");
     &check_key ("TABLE", "");
     &check_key ("TITLE", "");
@@ -115,5 +128,16 @@
     for ($i = 0; $i < @key; $i++) {
 	if ($key[$i] eq "MENU") { $MENU = $value[$i]; }
-    }
+	if ($key[$i] eq "MODE") { 
+	    if ($value[$i] eq "summary") {
+		if (@group == 0) {
+		    print STDERR "a summary table must have at least one group\n";
+		    exit 1;
+		}
+		&define_groups_string (@group);
+	    }
+	}
+    }
+
+    &check_key ("GROUPS", "none");
 
     # define FIELDS and WHERE strings, add to keypairs
@@ -246,5 +270,5 @@
 	    print FILE "write_sort_cell (\"list\", \"$opf{$value}\", \$buttonLink, \$ID, '$myFile');\n";
 	} else {
-	    print FILE "write_sort_cell (\"list\", \"$field[$i]\", \$buttonLink, \$ID, '$myFile');\n";
+	    print FILE "write_sort_cell (\"list\", \"$fieldreal[$i]\", \$buttonLink, \$ID, '$myFile');\n";
 	}
     }
@@ -281,5 +305,5 @@
     }	
     for ($i = 0; $i < @field; $i++) {
-	$value = $field[$i];
+	$value = $fieldreal[$i];
 	if ($value eq "*") { next; }
 	if ($format[$i] eq "%s") {
@@ -291,5 +315,5 @@
 	}
     }
-    print FILE "\$WHERE = check_ordering (\$WHERE);\n";
+    print FILE "\$WHERE = check_ordering ('$GROUPS', \$WHERE);\n";
 }
 
@@ -298,5 +322,5 @@
 
     for ($i = 0; $i < @field; $i++) {
-	$value = $field[$i];
+	$value = $fieldreal[$i];
 	if ($value eq "*") { next; }
 	if ($format[$i] eq "%s") {
@@ -323,7 +347,7 @@
 	} else {
 	    if ($format[$i] eq "%s") {
-		print FILE "write_query_row ('$field[$i]', $width[$i], 'string');\n";
+		print FILE "write_query_row ('$fieldreal[$i]', $width[$i], 'string');\n";
 	    } else {
-		print FILE "write_query_row ('$field[$i]', $width[$i], 'min');\n";
+		print FILE "write_query_row ('$fieldreal[$i]', $width[$i], 'min');\n";
 	    }
 	}
@@ -336,5 +360,5 @@
 	    print FILE "echo \"<td> &nbsp; </td>\\n\";\n";
 	} else {
-	    print FILE "write_query_row ('$field[$i]', $width[$i], 'max');\n";
+	    print FILE "write_query_row ('$fieldreal[$i]', $width[$i], 'max');\n";
 	}
     }
@@ -421,4 +445,17 @@
 }
 
+sub define_groups_string {
+    my (@array) = @_;
+    my ($i);
+
+    $GROUPS = "$array[0]";
+    for ($i = 1; $i < @array; $i++) {
+	# skip * fields (not a valid query element
+	if ($array[$i] eq "*") { next; }
+	$GROUPS = "$GROUPS,$array[$i]";
+    }
+    set_keypair ("GROUPS", $GROUPS);
+}
+
 sub define_fields_count {
     my ($i, $Nrow);
@@ -502,7 +539,7 @@
 	    for ($i = 0; $i < @field; $i++) {
 		if ($field[$i] eq "*") { next; }
-		if ($value =~ m|^\$$field[$i]|) {
-		    # print "field: $field[$i]\n";
-		    ($name, $extra) = $value =~ m|^\$($field[$i])\@(\S+)|;
+		if ($value =~ m|^\$$fieldreal[$i]|) {
+		    # print "field: $fieldreal[$i]\n";
+		    ($name, $extra) = $value =~ m|^\$($fieldreal[$i])\@(\S+)|;
 		    # print "name: $name\n";
 		    # print "extra: $extra\n";
@@ -543,8 +580,8 @@
 
     for ($i = 0; $i < @field; $i++) {
-	# print STDERR "$i: $field[$i] : $fieldname\n";
+	# print STDERR "$i: $fieldreal[$i] : $fieldname\n";
 
 	if ($field[$i] eq "*") { next; }
-	if ($fieldname ne $field[$i]) { next; }
+	if ($fieldname ne $fieldreal[$i]) { next; }
 
 
