Index: /branches/czw_branch/20110406/ippScripts/scripts/lap_science.pl
===================================================================
--- /branches/czw_branch/20110406/ippScripts/scripts/lap_science.pl	(revision 31427)
+++ /branches/czw_branch/20110406/ippScripts/scripts/lap_science.pl	(revision 31428)
@@ -96,25 +96,18 @@
 sub chip_mode {
     my $lap_id = shift;
-    return(queue_chips($lap_id));
-}
-
-# This creates the chiptool command to use for the specified parameters.
-sub construct_chiptool_command {
-    my $lap_id = shift;
-    my $label  = shift;
-    my $tess_id = shift;
-    my $projection_cell = shift;
-    my $data_group = shift;
-    my $workdir  = shift;
-    my $exp_id = shift;
-
-    my $cmd = "$chiptool -pretend";
-    $cmd .= " -pretend " if defined $debug;
-    $cmd .= " -dbname $dbname " if defined $dbname;
-
-    $cmd .= " -definebyquery -exp_id $exp_id -set_end_stage warp -set_tess_id $tess_id ";
-    $cmd .= " -set_label $label -set_workdir $workdir -set_dist_group $label -set_data_group $data_group ";
-
-    return($cmd);
+    my $status = queue_chips($lap_id);
+
+    if ($status) {
+	my $command = "$laptool -updaterun -lap_id $lap_id";
+	$command .= " -dbname $dbname " if defined $dbname;
+	$command .= " -set_state run ";
+	my ($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);
+	    &my_die("Unable to perform laptool: $error_code", $lap_id);
+	}
+    }
+    return($status);
 }
 
@@ -181,8 +174,12 @@
     my $data_group = "${label}.${date}";
 
-    my $chip_cmd = construct_chiptool_command($exposure->{lap_id},$exposure->{label},
-					      $exposure->{tess_id},$exposure->{proj_cell},
-					      $workdir, $data_group,
-					      $exposure->{exp_id});
+
+    my $chip_cmd = "$chiptool";
+    $chip_cmd .= " -pretend " if defined $debug;
+    $chip_cmd .= " -dbname $dbname " if defined $dbname;
+    $chip_cmd .= " -definebyquery -exp_id $exposure->{exp_id} -set_end_stage warp -set_tess_id $exposure->{tess_id} ";
+    $chip_cmd .= " -set_label $exposure->{label} -set_data_group $data_group ";
+    $chip_cmd .= " -set_workdir $workdir -set_dist_group $exposure->{dist_group} ";
+
     my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
 	run(command => $chip_cmd, verbose => $verbose);
@@ -242,4 +239,6 @@
 		&my_die("Exposure $exp_id for $lap_id is declared pairwise without a defined pair", $lap_id);
 	    }
+	    $matching{$object}{$comment} = $exp_id;
+	    $indexing{$exp_id} = $counter;
 	    $counter++; 
 	    next;
@@ -276,8 +275,14 @@
 
 	    $exp_A->{pairwise} = 1;
+	    $exp_A->{private} = 0;
 	    $exp_A->{pair_id} = $exp_B->{chip_id};
 	    
 	    $exp_B->{pairwise} = 1;
+	    $exp_B->{private} = 0;
 	    $exp_B->{pair_id} = $exp_A->{chip_id};
+	    
+	    if ($verbose) {
+		print "LAP_DIFFS: $object: $exp_A->{exp_id} and $exp_B->{exp_id} are a pair\n";
+	    }
 	}
     }
@@ -294,4 +299,5 @@
 	$exposure = update_this_exposure($exposure);
     }
+    return(1);
 }
 
@@ -300,4 +306,9 @@
 # Decide Things
 ################################################################################
+sub monitor_mode {
+    my $lap_id = shift;
+    return(check_status($lap_id));
+}
+    
 
 sub check_stack_status {  # look at lapRun associated stacks, and confirm their states.
@@ -330,32 +341,38 @@
     my $complete_fstacks = 0;
     foreach my $stack (@$stacks) {
-	if ($stack->{quick_stack_id}) {
+	if (($stack->{quick_stack_id})&&
+	    (S64_IS_NOT_NULL($stack->{quick_stack_id}))) {
 	    $defined_qstack = 1;
 	    $total_qstacks++;
 	}
-	if ($stack->{final_stack_id}) {
+	if (($stack->{final_stack_id})&&
+	    (S64_IS_NOT_NULL($stack->{final_stack_id}))) {
 	    $defined_fstack = 1;
 	    $total_fstacks++;
 	}
 	
-	if ($stack->{quick_state} eq 'full') {
+	if (($stack->{quick_state})&&
+	    ($stack->{quick_state} eq 'full')) {
 	    $complete_qstacks++;
 	}
-	if ($stack->{final_state} eq 'full') {
+	if (($stack->{final_state})&&
+	    ($stack->{final_state} eq 'full')) {
 	    $complete_fstacks++;
 	}
     }
-    if ($complete_qstacks == $total_qstacks) {
+    if (($complete_qstacks > 0)&&
+	($complete_qstacks == $total_qstacks)) {
 	$have_qstack = 1;
     }
-    if ($complete_fstacks == $total_fstacks) {
+    if (($complete_fstacks > 0)&&
+	($complete_fstacks == $total_fstacks)) {
 	$have_fstack = 1;
     }
+    
 	
     return($defined_qstack,$have_qstack,$defined_fstack,$have_fstack);
 }
 sub check_status {
-    my $proj_cell = shift;
-    my $lap_id = get_lap_id($proj_cell);
+    my $lap_id = shift;
     
     my ($defined_qstack,$have_qstack,$defined_fstack,$have_fstack) = check_stack_status($lap_id);
@@ -368,5 +385,5 @@
     unless ($success) {
 	$error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
-	&my_die("Unable to perform laptool: $error_code", $lap_id, $proj_cell);
+	&my_die("Unable to perform laptool: $error_code", $lap_id);
     }
     
@@ -377,5 +394,5 @@
     
     my $exposures = $mdcParser->parse_list(join "", @$stdout_buf) or
-	&my_die("Unable to parse metadata from laptool", $lap_id, $proj_cell);
+	&my_die("Unable to parse metadata from laptool", $lap_id);
 
     # Need to prescan to see who matches whom.
@@ -394,4 +411,5 @@
     my $needs_something_private = 0;
     my $can_qstack = 0;
+    my $have_diff = 0;
     my $can_diff = 0;
     my $can_fstack = 0;
@@ -423,15 +441,36 @@
 	    }
 	}
-	if (($exposure->{warpRun_state} eq 'full')|| # This exposure's warp is either done or impossible.
-	    ($exposure->{data_state} eq 'drop')) {
+	if (($exposure->{warpRun_state})&&  # This exposure has a warp
+	    (($exposure->{warpRun_state} eq 'full')|| # This exposure's warp is either done or impossible.
+	     ($exposure->{data_state} eq 'drop'))) {
 	    $can_qstack ++;
 	    $can_diff ++;
 	}
-	if (($exposure->{magicked})||  # This exposure has been magicked, so it is through with diff.
+	if (($exposure->{magicked}&&
+	     &S64_IS_NOT_NULL($exposure->{magicked}))||  # This exposure has been magicked, so it is through with diff.
 	    ($exposure->{data_state} eq 'drop')) {
 	    $can_fstack ++;
 	}
-    }
-    
+	if (($exposure->{diff_id})&&(&S64_IS_NOT_NULL($exposure->{diff_id}))) {
+	    $have_diff ++;
+	}
+    }
+
+
+    print "STATUS: DEFINED_QSTACK:  $defined_qstack\n";
+    print "STATUS: HAVE_QSTACK:     $have_qstack\n";
+    print "STATUS: DEFINED_FSTACK:  $defined_fstack\n";
+    print "STATUS: HAVE_FSTACK:     $have_fstack\n";
+
+    print "STATUS: NEEDS_QSTACK:    $needs_qstack\n";
+    print "STATUS: NEEDS_REMADE:    $needs_something_remade\n";
+    print "STATUS: NEEDS PRIVATIZE: $needs_something_private\n";
+    print "STATUS: CAN_QSTACK:      $can_qstack\n";
+    print "STATUS: CAN_DIFF:        $can_diff\n";
+    print "STATUS: HAVE_DIFF:       $have_diff\n";
+    print "STATUS: CAN_FSTACK:      $can_fstack\n";
+
+    print "STATUS: TOTAL_EXPOSURES: $total_exposures\n";
+
     if (($needs_qstack == 1)&&              # Do we need the quick stack?
 	($defined_qstack == 0)&&            # Have we not made it already?
@@ -439,4 +478,5 @@
 	($needs_something_remade == 0)      # Do we need to wait for a stolen exposure?
 	) {
+	print "STATUS: Will now queue quickstacks\n";
 	&queue_quickstack($exposures);
     }
@@ -444,6 +484,8 @@
     if (($can_diff == $total_exposures)&&   # Are all warps done?
 	($needs_something_remade == 0)&&    # Do we need to wait for a stolen exposure?
+	($have_diff < $can_diff)&&          # We haven't already done them all.
 	(($needs_qstack == 0)||             # Are we just doing pairwise diffs?
 	 ($needs_qstack == 1)&&($have_qstack == 1)) ) { # If we need a quickstack, do we have it?
+	print "STATUS: Will now queue diffs\n";
 	&queue_diffs($exposures);
     }
@@ -452,8 +494,10 @@
 	($needs_something_remade == 0)&&    # Do we need to wait for a stolen exposure?
 	($defined_fstack == 0)) {           # Have we not made it already?
+	print "STATUS: Will now queue final stacks\n";
 	&queue_finalstack($exposures);
     }
 
     if (($have_fstack == 1)) {              # Are we all done making the final product?
+	print "STATUS: Will now deactivate exposures for this complete lapRun.\n";
 	&deactivate_exposures($exposures);
 	$command = "$laptool -updaterun -lap_id $lap_id";
@@ -464,14 +508,22 @@
 	unless ($success) {
 	    $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
-	    &my_die("Unable to perform laptool: $error_code", $lap_id, $proj_cell);
-	}
-    }
+	    &my_die("Unable to perform laptool: $error_code", $lap_id);
+	}
+    }
+    
 }
 
 sub queue_quickstack {
-    my $lap_id = shift;
-    my $label = shift;
-    my $filter = shift;
-    my $proj_cell = shift;
+    my $exposures = shift; # reference to exposure array;
+    my $exposure = ${ $exposures }[0]; # reference to the first exposure to get run level information
+    
+    my $lap_id    = $exposure->{lap_id};
+    my $label     = $exposure->{label};
+    my $filter    = $exposure->{filter};
+    my $proj_cell = $exposure->{projection_cell};
+
+    unless (defined($label) && defined($filter) && defined($proj_cell)) {
+	&my_die("Unable to perform stacktool. Insufficient information.", $lap_id);
+    }
 
     my @utctime = gmtime();
@@ -483,11 +535,24 @@
     my $data_group = "${label}.${date}";
 
-    my $command = "$stacktool ";
+    my $command = "$stacktool -pretend";
     $command .= " -dbname $dbname " if defined $dbname;
     $command .= " -definebyquery -select_label $label -select_skycell_id ${proj_cell}.% -select_filter $filter ";
-    $command .= " -set_label ${label}.quick -set_workdir $workdir -set_data_group ${proj_cell}.quick.${date} ";
+    $command .= " -set_label ${label}.quick -set_data_group ${proj_cell}.quick.${date} ";
+    $command .= "  -set_workdir $workdir  -set_dist_group NODIST ";
     $command .= " -min_num 2 -set_reduction QUICKSTACK ";
 
     my ($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);
+	&my_die("Unable to perform chiptool: $error_code", $lap_id);
+    }
+
+    $command = "$stacktool ";
+    $command .= " -dbname $dbname " if defined $dbname;
+    $command .= " -sassskyfile -data_group ${proj_cell}.quick.${date} ";
+    $command .= " -filter $filter -projection_cell ${proj_cell} ";
+
+    ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
 	run(command => $command, verbose => $verbose);
     unless ($success) {
@@ -501,5 +566,7 @@
     my $stack = ${ $stacks }[0];
     my $sass_id = $stack->{sass_id};
-
+    unless (defined($sass_id)) {
+	&my_die("Unable to parse metadata from laptool", $lap_id, "");
+    }
     $command = "$laptool -updaterun -lap_id $lap_id -set_quick_sass_id $sass_id";
     $command .= " -dbname $dbname " if defined $dbname;
@@ -515,8 +582,15 @@
 }
 sub queue_finalstack {
-    my $lap_id = shift;
-    my $label = shift;
-    my $filter = shift;
-    my $proj_cell = shift;
+    my $exposures = shift; # reference to exposure array;
+    my $exposure = ${ $exposures }[0]; # reference to the first exposure to get run level information
+    
+    my $lap_id    = $exposure->{lap_id};
+    my $label     = $exposure->{label};
+    my $filter    = $exposure->{filter};
+    my $proj_cell = $exposure->{projection_cell};
+
+    unless (defined($label) && defined($filter) && defined($proj_cell)) {
+	&my_die("Unable to perform stacktool. Insufficient information.", $lap_id);
+    }
 
     my @utctime = gmtime();
@@ -529,4 +603,5 @@
 
     my $command = "$stacktool ";
+    $command .= " -pretend " if defined $debug;
     $command .= " -dbname $dbname " if defined $dbname;
     $command .= " -definebyquery -select_label $label -select_skycell_id ${proj_cell}.% -select_filter $filter ";
@@ -541,10 +616,26 @@
     }
     
+    
+    $command = "$stacktool ";
+    $command .= " -dbname $dbname " if defined $dbname;
+    $command .= " -sassskyfile -data_group ${proj_cell}.final.${date} ";
+    $command .= " -filter $filter -projection_cell ${proj_cell} ";
+
+    ($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);
+	&my_die("Unable to perform chiptool: $error_code", $lap_id);
+    }
+
     my $stacks = $mdcParser->parse_list(join "", @$stdout_buf) or
 	&my_die("Unable to parse metadata from laptool", $lap_id, "");
-    
+
     my $stack = ${ $stacks }[0];
     my $sass_id = $stack->{sass_id};
-
+    unless (defined($sass_id)) {
+	&my_die("Unable to parse metadata from laptool", $lap_id, "");
+    }
+    print "FINAL_SASS_ID: $sass_id\n";
     $command = "$laptool -updaterun -lap_id $lap_id -set_final_sass_id $sass_id";
     $command .= " -dbname $dbname " if defined $dbname;
@@ -576,5 +667,9 @@
 	    next;
 	}
-	if ($exposure->{diff_id}) { # Not sure how this would happen, but still.
+	if ($exposure->{diff_id}&&S64_IS_NOT_NULL($exposure->{diff_id})) { # Not sure how this would happen, but still.
+	    next;
+	}
+	if ($already_queued{$exposure->{warp_id}}) {
+	    print "STATUS: Have already queued a diff containing $exposure->{exp_id} $exposure->{chip_id} $exposure->{warp_id}\n";
 	    next;
 	}
@@ -591,8 +686,12 @@
 	my $data_group = "${label}.${date}";
 
+
 	my $command = "$difftool ";
+	$command .= " -pretend " if defined $debug;
 	$command .= " -dbname $dbname " if defined $dbname;
 	$command .= " -set_label $label -set_workdir $workdir -set_data_group $data_group ";
-	$command .= " -set_dist_group $dist_group ";
+	if ($exposure->{dist_group}) {
+	    $command .= " -set_dist_group $exposure->{dist_group} ";
+	}
 	
 	if ($exposure->{pairwise}) { # warpwarp
@@ -601,9 +700,12 @@
 	    $command .= "-input_label $label -template_label $label -backwards ";
 	    $command .= "-warp_id $exposure->{warp_id} -template_warp_id $companion->{warp_id} ";
-
+	    $already_queued{$exposure->{warp_id}} = 1;
+	    $already_queued{$companion->{warp_id}} = 1;
+	    
 	}
 	else { # warp-qstack
 	    $command .= " -definewarpstack -set_reduction WARPQSTACK -available -good_frac 0.2 ";
 	    $command .= " -warp_id $exposure->{warp_id} -stack_label ${label}.quick ";
+	    $already_queued{$exposure->{warp_id}} = 1;
 	}
 	
@@ -612,6 +714,8 @@
 	unless ($success) {
 	    $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
-	    &my_die("unable to perform chiptool: $error_code", $exposure->{lap_id}, $exposure->{proj_cell});
-	}
+	    &my_die("unable to perform difftool: $error_code", $exposure->{lap_id}, $exposure->{proj_cell});
+	}
+
+	
     }
 }
@@ -726,8 +830,8 @@
     
     my $command = "$laptool -updateexp -lap_id $lap_id -exp_id $exp_id ";
-    if ($exposure->{chip_id}) {
+    if (($exposure->{chip_id})&&(S64_IS_NOT_NULL($exposure->{chip_id}))) {
 	$command .= " -set_chip_id  $exposure->{chip_id} ";
     }
-    if ($exposure->{pair_id}) {
+    if (($exposure->{pair_id})&&(S64_IS_NOT_NULL($exposure->{pair_id}))) {
 	$command .= " -set_pair_id  $exposure->{pair_id} ";
     }
Index: /branches/czw_branch/20110406/ippTools/share/laptool_definerun.sql
===================================================================
--- /branches/czw_branch/20110406/ippTools/share/laptool_definerun.sql	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/share/laptool_definerun.sql	(revision 31428)
@@ -1,10 +1,16 @@
-SELECT exp_id, chip_id, false as private, true as active, false as pairwise
-  FROM rawExp 
-  LEFT JOIN 
-  (SELECT exp_id, chip_id
-     FROM lapExp 
-     where private IS FALSE 
-     AND data_state = 'full') AS old USING(exp_id)
+SELECT want.exp_id, have.chip_id, false as private, true as active, false as pairwise
+  FROM
+  (SELECT exp_id FROM rawExp 
      WHERE rawExp.exp_type= 'OBJECT' AND
      rawExp.dateobs >= '2009-04-01T00:00:00.000000' AND
 -- Position restriction goes here.
+     @WHERE@
+  ) AS want
+  LEFT JOIN 
+  (SELECT *
+     FROM lapExp 
+     where private IS FALSE 
+     AND chip_id IS NOT NULL
+     AND active = TRUE ) AS have USING(exp_id)
+     
+
Index: /branches/czw_branch/20110406/ippTools/share/laptool_exposures.sql
===================================================================
--- /branches/czw_branch/20110406/ippTools/share/laptool_exposures.sql	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/share/laptool_exposures.sql	(revision 31428)
@@ -1,5 +1,5 @@
 SELECT DISTINCT 
     D.*,diffRun.state,
-    CONVERT(sum(others.private),SIGNED) AS needs_remade 
+    coalesce(CONVERT(sum(others.private),SIGNED),0) AS needs_remade 
 --      0 AS needs_remade
     FROM (
@@ -7,17 +7,17 @@
       W.*,CONVERT(IFNULL(diff1.diff_id,diff2.diff_id),SIGNED) AS diff_id FROM (
     SELECT DISTINCT
-        lap_id,lapRun.tess_id,projection_cell,filter,lapRun.state as lapRun_state, lapRun.registered, lapRun.fault, lapRun.label,
+        lap_id,lapRun.tess_id,projection_cell,filter,lapRun.state as lapRun_state, lapRun.registered, lapRun.fault, lapRun.label, lapRun.dist_group,
         lapExp.exp_id,lapExp.chip_id,lapExp.pair_id,private,pairwise,active,lapExp.data_state,
         chipRun.state as chipRun_state, 
-	CONVERT(sum(chipProcessedImfile.fault),SIGNED) as chip_faults, 
-	CONVERT(sum(chipProcessedImfile.quality),SIGNED) as chip_quality,
+	coalesce(CONVERT(sum(chipProcessedImfile.fault),SIGNED),0) as chip_faults, 
+	coalesce(CONVERT(sum(chipProcessedImfile.quality),SIGNED),0) as chip_quality,
         camRun.cam_id, camRun.state as camRun_state,   
-	CONVERT(sum(camProcessedExp.fault),SIGNED) AS cam_faults, 
-	CONVERT(sum(camProcessedExp.quality),SIGNED) AS cam_quality,
+	coalesce(CONVERT(sum(camProcessedExp.fault),SIGNED),0) AS cam_faults, 
+	coalesce(CONVERT(sum(camProcessedExp.quality),SIGNED),0) AS cam_quality,
 	fakeRun.fake_id, fakeRun.state as fakeRun_state, 
-	CONVERT(sum(fakeProcessedImfile.fault),SIGNED) as fake_faults,
+	coalesce(CONVERT(sum(fakeProcessedImfile.fault),SIGNED),0) as fake_faults,
   	warpRun.warp_id, warpRun.state as warpRun_state, 
-	CONVERT(sum(warpSkyfile.fault),SIGNED) as warp_faults, 
-	CONVERT(sum(warpSkyfile.quality),SIGNED) as warp_quality,
+	coalesce(CONVERT(sum(warpSkyfile.fault),SIGNED),0) as warp_faults, 
+	coalesce(CONVERT(sum(warpSkyfile.quality),SIGNED),0) as warp_quality,
         warpRun.magicked
     FROM lapRun JOIN lapExp USING(lap_id)
@@ -28,6 +28,8 @@
     LEFT JOIN warpRun USING(fake_id) LEFT JOIN warpSkyfile USING(warp_id)
     WHERE    @WHERE@
-    AND warpSkyfile.quality != 8007 -- known cases where quality != 0, but everything's fine.
-    AND warpSkyfile.quality != 3006 -- known cases where quality != 0, but everything's fine.
+    AND (warpSkyfile.quality IS NULL OR
+         (warpSkyfile.quality != 8007      -- known cases where quality != 0, but everything's fine.
+          AND warpSkyfile.quality != 3006  -- known cases where quality != 0, but everything's fine.
+	  ))
     GROUP BY lap_id,exp_id
     ) AS W
@@ -37,4 +39,5 @@
 ) AS D
 LEFT JOIN diffRun USING(diff_id)
-JOIN lapExp AS others ON (D.chip_id = others.chip_id AND D.lap_id != others.lap_id)
+LEFT JOIN lapExp AS others ON (D.chip_id = others.chip_id AND D.lap_id != others.lap_id)
+GROUP BY lap_id,exp_id
 
Index: /branches/czw_branch/20110406/ippTools/share/laptool_pendingexp.sql
===================================================================
--- /branches/czw_branch/20110406/ippTools/share/laptool_pendingexp.sql	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/share/laptool_pendingexp.sql	(revision 31428)
@@ -1,3 +1,4 @@
-select lapRun.lap_id, lapRun.seq_id, lapRun.tess_id, lapRun.projection_cell, lapRun.filter, lapRun.state, lapRun.label,
+select lapRun.lap_id, lapRun.seq_id, lapRun.tess_id, lapRun.projection_cell, lapRun.filter, 
+       lapRun.state, lapRun.label,
        lapRun.dist_group, lapRun.registered, lapRun.fault, lapRun.quick_sass_id, lapRun.final_sass_id,
        exp_id, chip_id, pair_id, private, pairwise, active, lapExp.data_state,
Index: /branches/czw_branch/20110406/ippTools/share/laptool_stacks.sql
===================================================================
--- /branches/czw_branch/20110406/ippTools/share/laptool_stacks.sql	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/share/laptool_stacks.sql	(revision 31428)
@@ -3,6 +3,6 @@
        lapRun.state,lapRun.label,lapRun.dist_group,lapRun.registered,lapRun.fault,
        skycell_id,
-       quick_sass_id,quick_data_group,quick_stack_id,quick_state,quick_fault,quick_quality,
-       final_sass_id,final_data_group,final_stack_id,final_state,final_fault,final_quality
+       lapRun.quick_sass_id,quick_data_group,quick_stack_id,quick_state,quick_fault,quick_quality,
+       lapRun.final_sass_id,final_data_group,final_stack_id,final_state,final_fault,final_quality
        FROM
        lapRun LEFT JOIN 
@@ -95,4 +95,9 @@
 	   AND sass_id = lapRun.final_sass_id
        ) AS final USING(lap_id,projection_cell,tess_id,filter,skycell_id)
- ) stacks USING(lap_id,projection_cell,tess_id,filter,quick_sass_id,final_sass_id)
+ ) stacks ON (stacks.lap_id = lapRun.lap_id AND
+             stacks.projection_cell = lapRun.projection_cell AND
+             stacks.tess_id = lapRun.tess_id AND
+             stacks.filter = lapRun.filter AND
+             (lapRun.quick_sass_id IS NULL OR lapRun.quick_sass_id = stacks.quick_sass_id) AND
+             (lapRun.final_sass_id IS NULL OR lapRun.final_sass_id = stacks.final_sass_id))
 WHERE 1 @WHERE@
Index: /branches/czw_branch/20110406/ippTools/share/stacktool_sassskyfile.sql
===================================================================
--- /branches/czw_branch/20110406/ippTools/share/stacktool_sassskyfile.sql	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/share/stacktool_sassskyfile.sql	(revision 31428)
@@ -18,6 +18,6 @@
         where stack_id = stackRun.stack_id limit 1
     ) as camera
-FROM stackRun
-JOIN stackSumSkyfile USING(stack_id)
-JOIN stackAssociationMap USING(stack_id)
-JOIN stackAssociation USING(sass_id)
+FROM stackAssociation
+JOIN stackAssociationMap USING(sass_id)
+JOIN stackRun USING(stack_id)
+LEFT JOIN stackSumSkyfile USING(stack_id)
Index: /branches/czw_branch/20110406/ippTools/src/difftool.c
===================================================================
--- /branches/czw_branch/20110406/ippTools/src/difftool.c	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/src/difftool.c	(revision 31428)
@@ -1625,4 +1625,5 @@
     PXOPT_COPY_S64(config->args, selectWhere, "-exp_id", "inputRawExp.exp_id", "==");
     PXOPT_COPY_S64(config->args, selectWhere, "-template_exp_id", "templateRawExp.exp_id", "==");
+    PXOPT_COPY_S64(config->args, selectWhere, "-template_warp_id", "templateWarpRun.warp_id", "==");
     PXOPT_COPY_STR(config->args, selectWhere, "-filter", "inputRawExp.filter", "==");
     PXOPT_COPY_STR(config->args, selectWhere, "-obs_mode", "inputRawExp.obs_mode", "==");
Index: /branches/czw_branch/20110406/ippTools/src/difftoolConfig.c
===================================================================
--- /branches/czw_branch/20110406/ippTools/src/difftoolConfig.c	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/src/difftoolConfig.c	(revision 31428)
@@ -278,4 +278,5 @@
     psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-not-bothways",  0, "only do the single-direction subtraction?", false);
     psMetadataAddS64(definewarpwarpArgs, PS_LIST_TAIL,  "-template_exp_id",  0,  "search by template exposure ID", 0);
+    psMetadataAddS64(definewarpwarpArgs, PS_LIST_TAIL,  "-template_warp_id",  0,  "search by template warp ID", 0);
     psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-filter", 0, "search by filter", NULL);
     psMetadataAddF32(definewarpwarpArgs, PS_LIST_TAIL, "-distance", 0, "limit distance between input and template (deg)", NAN);
Index: /branches/czw_branch/20110406/ippTools/src/laptool.c
===================================================================
--- /branches/czw_branch/20110406/ippTools/src/laptool.c	(revision 31427)
+++ /branches/czw_branch/20110406/ippTools/src/laptool.c	(revision 31428)
@@ -295,5 +295,8 @@
     return(false);
   }
-  psStringAppend(&query, " %s", whereClause);
+
+  if (whereClause) {
+    psStringSubstitute(&query,whereClause,"@WHERE@");
+  }
   psFree(where);
 
@@ -467,12 +470,11 @@
       }
       else {
-	return(false);
+	return(true); // We shouldn't really fail if we didn't change anything. Maybe there's nothing to change.
       }
     }
-    return(true);
-  }
-  else {
-    return(false);
-  }
+
+  }
+
+  return(true);
 }
 
@@ -496,14 +498,15 @@
   if (psListLength(where->list)) {
     psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-    psStringAppend(&query, " WHERE %s", whereClause);
+    psStringAppend(&query, "\n AND %s", whereClause);
     psFree(whereClause);
   }
-
+  psStringAppend(&query, " ORDER BY rawExp.dateobs ");
+  
   if (limit) {
     psString limitString = psDBGenerateLimitSQL(limit);
-    psStringAppend(&query, " %s", limitString);
+    psStringAppend(&query, "\n %s", limitString);
     psFree(limitString);
   }
-  psStringAppend(&query, " ORDER BY rawExp.dateobs ");
+
   
   if (!p_psDBRunQuery(config->dbh, query)) {
@@ -615,5 +618,5 @@
 
   psMetadata *where = psMetadataAlloc();
-  PXOPT_COPY_S64(config->args, where, "-lap_id", "lap_id", "==");
+  PXOPT_COPY_S64(config->args, where, "-lap_id", "lapRun.lap_id", "==");
   
   psString query = pxDataGet("laptool_stacks.sql");
