Index: trunk/ippTools/share/magicdstool_definebyquery_camera.sql
===================================================================
--- trunk/ippTools/share/magicdstool_definebyquery_camera.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_definebyquery_camera.sql	(revision 25013)
@@ -6,5 +6,7 @@
     camRun.cam_id,
     magicRun.label,
-    magicRun.workdir
+    magicRun.workdir,
+    CAST(NULL AS SIGNED) AS inv_magic_id,
+    CAST(NULL AS SIGNED) AS inv_exp_id
 FROM magicRun
     JOIN magicMask USING(magic_id)
Index: trunk/ippTools/share/magicdstool_definebyquery_chip.sql
===================================================================
--- trunk/ippTools/share/magicdstool_definebyquery_chip.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_definebyquery_chip.sql	(revision 25013)
@@ -6,5 +6,7 @@
     camRun.cam_id,
     magicRun.label,
-    magicRun.workdir
+    magicRun.workdir,
+    CAST(NULL AS SIGNED) AS inv_magic_id,
+    CAST(NULL AS SIGNED) AS inv_exp_id
 FROM magicRun
     JOIN magicMask USING(magic_id)
Index: trunk/ippTools/share/magicdstool_definebyquery_diff.sql
===================================================================
--- trunk/ippTools/share/magicdstool_definebyquery_diff.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_definebyquery_diff.sql	(revision 25013)
@@ -1,2 +1,4 @@
+SELECT *
+FROM (
 SELECT
     magicRun.magic_id,
@@ -6,5 +8,7 @@
     0 AS cam_id,
     magicRun.label,
-    magicRun.workdir
+    magicRun.workdir,
+    CAST(NULL AS SIGNED) AS inv_magic_id,
+    CAST(NULL AS SIGNED) AS inv_exp_id
 FROM magicRun
     JOIN magicMask USING(magic_id)
@@ -15,5 +19,50 @@
     AND ( -- rerun HOOK magicdstool sends "\n1 " if rerun else "\n0 " %s
         OR magicDSRun.magic_ds_id IS NULL)
+    AND diffRun.bothways = 0
     AND diffRun.magicked  = 0
     AND diffRun.state = 'full'
+    -- WHERE hook %s
+UNION
+SELECT
+    forwardRun.magic_id,
+    forwardRun.exp_id,
+    'diff' AS stage,
+    forwardRun.diff_id AS stage_id,
+    0 AS cam_id,
+    forwardRun.label,
+    forwardRun.workdir,
+    inverseRun.magic_id AS inv_magic_id,
+    inverseRun.exp_id AS inv_exp_id
+FROM (
+    SELECT
+        magicRun.magic_id,
+        exp_id,
+        diff_id,
+        magicRun.label,
+        magicRun.workdir
+    FROM magicRun
+        JOIN magicMask USING(magic_id)
+        JOIN diffRun USING(diff_id)
+        LEFT JOIN magicDSRun ON magicRun.magic_id = magicDSRun.magic_id
+                             AND magicDSRun.stage  = 'diff'
+    WHERE magicRun.state = 'full'
+        AND magicRun.inverse = 0
+        AND ( -- rerun HOOK magicdstool sends "\n1 " if rerun else "\n0 " %s
+            OR magicDSRun.magic_ds_id IS NULL)
+        AND diffRun.state = 'full'
+        AND diffRun.bothways
+        AND diffRun.magicked  = 0
+        -- WHERE hook %s
+) AS forwardRun
+JOIN (
+    SELECT
+        magic_id,
+        exp_id,
+        diff_id
+    FROM magicRun
+        JOIN magicMask USING(magic_id)
+    WHERE magicRun.state = 'full'
+        AND magicRun.inverse = 1
+) AS inverseRun USING(diff_id)
 
+) AS Foo
Index: trunk/ippTools/share/magicdstool_definebyquery_raw.sql
===================================================================
--- trunk/ippTools/share/magicdstool_definebyquery_raw.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_definebyquery_raw.sql	(revision 25013)
@@ -6,5 +6,7 @@
     0 AS cam_id,
     magicRun.label,
-    magicRun.workdir
+    magicRun.workdir,
+    CAST(NULL AS SIGNED) AS inv_magic_id,
+    CAST(NULL AS SIGNED) AS inv_exp_id
 FROM magicRun
     JOIN magicMask USING(magic_id)
Index: trunk/ippTools/share/magicdstool_definebyquery_warp.sql
===================================================================
--- trunk/ippTools/share/magicdstool_definebyquery_warp.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_definebyquery_warp.sql	(revision 25013)
@@ -6,5 +6,7 @@
     0 AS cam_id,
     magicRun.label,
-    magicRun.workdir
+    magicRun.workdir,
+    CAST(NULL AS SIGNED) AS inv_magic_id,
+    CAST(NULL AS SIGNED) AS inv_exp_id
 FROM magicRun
     JOIN magicMask USING(magic_id)
Index: trunk/ippTools/share/magicdstool_todestreak.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak.sql	(revision 25012)
+++ trunk/ippTools/share/magicdstool_todestreak.sql	(revision 25013)
@@ -8,4 +8,5 @@
     camera,
     magicMask.uri as streaks_uri,
+    NULL AS inv_streaks_uri,
     stage,
     stage_id,
@@ -40,4 +41,5 @@
     camera,
     magicMask.uri as streaks_uri,
+    NULL AS inv_streaks_uri,
     stage,
     stage_id,
@@ -77,4 +79,5 @@
     camera,
     magicMask.uri as streaks_uri,
+    NULL AS inv_streaks_uri,
     stage,
     stage_id,
@@ -115,4 +118,5 @@
     camera,
     magicMask.uri as streaks_uri,
+    NULL AS inv_streaks_uri,
     stage,
     stage_id,
@@ -143,5 +147,5 @@
     AND magicDSFile.component IS NULL
 UNION
--- diffSkyfiles
+-- regular diffSkyfiles
 SELECT DISTINCT
     magicDSRun.magic_ds_id,
@@ -151,4 +155,5 @@
     rawExp.camera,
     magicMask.uri as streaks_uri,
+    NULL AS inv_streaks_uri,
     stage,
     magicRun.diff_id as stage_id,
@@ -167,4 +172,5 @@
 JOIN magicDSRun USING(magic_id)
 JOIN magicInputSkyfile USING(magic_id)
+JOIN diffRun USING(diff_id)
 JOIN diffSkyfile
     ON  magicRun.diff_id = diffSkyfile.diff_id
@@ -176,6 +182,47 @@
     magicDSRun.state = 'new'
     AND magicDSRun.stage = 'diff'
+    AND diffRun.bothways = 0
     AND diffSkyfile.fault = 0
     AND diffSkyfile.quality = 0
     AND magicDSFile.component IS NULL
+-- bothways diffSkyfiles
+UNION
+SELECT DISTINCT
+    magicDSRun.magic_ds_id,
+    magicRun.magic_id,
+    magicRun.exp_id,
+    magicDSRun.label,
+    rawExp.camera,
+    magicMask.uri as streaks_uri,
+    (SELECT uri from magicMask where magic_id = inv_magic_id) AS inv_streaks_uri,
+    stage,
+    magicRun.diff_id as stage_id,
+    diffSkyfile.skycell_id as component,
+    NULL AS uri,
+    diffSkyfile.path_base,
+    magicRun.inverse,
+    NULL as cam_path_base,
+    outroot,
+    recoveryroot,
+    re_place,
+    remove
+FROM rawExp
+JOIN magicRun USING (exp_id)
+JOIN magicMask USING (magic_id)
+JOIN magicDSRun USING(magic_id)
+JOIN magicInputSkyfile USING(magic_id)
+JOIN diffRun USING(diff_id)
+JOIN diffSkyfile
+    ON  magicRun.diff_id = diffSkyfile.diff_id
+    AND magicInputSkyfile.node = diffSkyfile.skycell_id
+LEFT JOIN magicDSFile
+    ON magicDSRun.magic_ds_id = magicDSFile.magic_ds_id
+    AND magicDSFile.component = diffSkyfile.skycell_id
+WHERE
+    magicDSRun.state = 'new'
+    AND magicDSRun.stage = 'diff'
+    AND diffRun.bothways
+    AND diffSkyfile.fault = 0
+    AND diffSkyfile.quality = 0
+    AND magicDSFile.component IS NULL
 ) as Foo
