Index: /trunk/dbconfig/changes.txt
===================================================================
--- /trunk/dbconfig/changes.txt	(revision 24724)
+++ /trunk/dbconfig/changes.txt	(revision 24725)
@@ -1196,2 +1196,7 @@
 
 ALTER TABLE camRun ADD COLUMN magicked BIGINT;
+
+ALTER TABLE distTarget CHANGE COLUMN obs_mode label VARCHAR(64);
+ALTER TABLE distTarget ADD COLUMN filter VARCHAR(64) AFTER label;
+ALTER TABLE distTarget DROP KEY clean;
+ALTER TABLE distTarget ADD CONSTRAINT UNIQUE(label, filter, stage, clean);
Index: /trunk/dbconfig/dist.md
===================================================================
--- /trunk/dbconfig/dist.md	(revision 24724)
+++ /trunk/dbconfig/dist.md	(revision 24725)
@@ -1,5 +1,6 @@
 distTarget METADATA
     target_id   S64        0       # Primary Key
-    obs_mode    STR        64
+    label       STR        64
+    filter      STR        64
     stage       STR        64
     clean       BOOL       f
Index: /trunk/ippTools/share/disttool_definebyquery_camera.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_camera.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_camera.sql	(revision 24725)
@@ -3,5 +3,5 @@
     camRun.cam_id as stage_id,
     rawExp.exp_name as run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
@@ -10,5 +10,6 @@
 JOIN rawExp USING(exp_id)
 JOIN distTarget ON distTarget.stage = 'camera'
-    AND rawExp.obs_mode = distTarget.obs_mode
+    AND rawExp.filter = distTarget.filter
+    AND camRun.label  = distTarget.label
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'camera' 
Index: /trunk/ippTools/share/disttool_definebyquery_chip.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_chip.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_chip.sql	(revision 24725)
@@ -3,5 +3,5 @@
     chipRun.chip_id as stage_id,
     rawExp.exp_name as run_tag,
-    rawExp.obs_mode,
+    chipRun.label,
     distTarget.target_id,
     distTarget.clean
@@ -9,5 +9,6 @@
 JOIN rawExp USING(exp_id)
 JOIN distTarget ON distTarget.stage = 'chip'
-    AND rawExp.obs_mode = distTarget.obs_mode 
+    AND chipRun.label = distTarget.label 
+    AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'chip' 
Index: /trunk/ippTools/share/disttool_definebyquery_diff.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_diff.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_diff.sql	(revision 24725)
@@ -3,5 +3,5 @@
     diffRun.diff_id AS stage_id,
     rawExp.exp_name as run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
@@ -13,5 +13,7 @@
 JOIN chipRun USING(chip_id)
 JOIN rawExp USING(exp_id)
-JOIN distTarget ON distTarget.stage = 'diff' AND rawExp.obs_mode = distTarget.obs_mode
+JOIN distTarget ON distTarget.stage = 'diff'
+    AND diffRun.label = distTarget.label
+    AND distTarget.filter = rawExp.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'diff' AND (distRun.stage_id = diff_id)
Index: /trunk/ippTools/share/disttool_definebyquery_fake.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_fake.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_fake.sql	(revision 24725)
@@ -3,12 +3,13 @@
     fakeRun.fake_id AS stage_id,
     rawExp.exp_name as run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
 FROM fakeRun
-JOIN camRun USING(cam_id) -- ON fakeRun.cam_id = camRun.cam_id
+JOIN camRun USING(cam_id)
 JOIN chipRun USING(chip_id)
 JOIN rawExp USING(exp_id)
-JOIN distTarget ON distTarget.stage = 'fake' AND rawExp.obs_mode = distTarget.obs_mode
+JOIN distTarget ON distTarget.stage = 'fake' AND fakeRun.label = distTarget.label
+    AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'fake' AND (distRun.stage_id = fake_id)
Index: /trunk/ippTools/share/disttool_definebyquery_raw.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_raw.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_raw.sql	(revision 24725)
@@ -3,10 +3,11 @@
     rawExp.exp_id AS stage_id,
     rawExp.exp_name AS run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
 FROM rawExp
 JOIN chipRun USING(exp_id)
-JOIN distTarget ON distTarget.obs_mode = rawExp.obs_mode AND distTarget.stage = 'raw'
+JOIN distTarget ON distTarget.label = chipRun.label AND distTarget.stage = 'raw'
+    AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'raw' AND distRun.stage_id = exp_id
Index: /trunk/ippTools/share/disttool_definebyquery_stack.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_stack.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_stack.sql	(revision 24725)
@@ -4,15 +4,11 @@
     -- run tag in the form 'stack.$skycell_id.$stack_id'
     CONCAT_WS('.', 'stack', stackRun.skycell_id, convert(stackRun.stack_id, CHAR)) as run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
 FROM stackRun
-JOIN stackInputSkyfile using(stack_id)
-JOIN warpRun USING(warp_id)
-JOIN fakeRun USING(fake_id)
-JOIN camRun USING(cam_id)
-JOIN chipRun USING(chip_id)
-JOIN rawExp USING(exp_id)
-JOIN distTarget ON distTarget.stage = 'stack' AND rawExp.obs_mode = distTarget.obs_mode
+JOIN distTarget ON distTarget.stage = 'stack'
+    AND stackRun.label = distTarget.label
+    AND stackRun.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'stack' AND (distRun.stage_id = stack_id)
Index: /trunk/ippTools/share/disttool_definebyquery_warp.sql
===================================================================
--- /trunk/ippTools/share/disttool_definebyquery_warp.sql	(revision 24724)
+++ /trunk/ippTools/share/disttool_definebyquery_warp.sql	(revision 24725)
@@ -3,5 +3,5 @@
     warpRun.warp_id AS stage_id,
     rawExp.exp_name as run_tag,
-    rawExp.obs_mode,
+    distTarget.label,
     distTarget.target_id,
     distTarget.clean
@@ -11,5 +11,7 @@
 JOIN chipRun USING(chip_id)
 JOIN rawExp USING(exp_id)
-JOIN distTarget ON distTarget.stage = 'warp' AND rawExp.obs_mode = distTarget.obs_mode
+JOIN distTarget ON distTarget.stage = 'warp' 
+    AND warpRun.label = distTarget.label
+    AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'warp' AND (distRun.stage_id = warp_id)
Index: /trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- /trunk/ippTools/share/pxadmin_create_tables.sql	(revision 24724)
+++ /trunk/ippTools/share/pxadmin_create_tables.sql	(revision 24725)
@@ -1214,5 +1214,6 @@
 CREATE TABLE distTarget (
     target_id   BIGINT AUTO_INCREMENT,
-    obs_mode    VARCHAR(64),
+    label       VARCHAR(64),
+    filter      VARCHAR(64),
     stage       VARCHAR(64),
     clean       TINYINT,
@@ -1220,4 +1221,5 @@
     comment     VARCHAR(255),
     PRIMARY KEY(target_id)
+    CONSTRAINT UNIQUE (label, filter, stage, clean),
 )  ENGINE=innodb DEFAULT CHARSET=latin1;
 
Index: /trunk/ippTools/src/disttool.c
===================================================================
--- /trunk/ippTools/src/disttool.c	(revision 24724)
+++ /trunk/ippTools/src/disttool.c	(revision 24725)
@@ -189,5 +189,4 @@
     PXOPT_COPY_S64(config->args, where, "-exp_id",    "rawExp.exp_id",           "==");
     PXOPT_COPY_S64(config->args, where, "-chip_id",   "chipRun.chip_id",         "==");
-    PXOPT_COPY_STR(config->args, where, "-obs_mode",  "rawExp.obs_mode",         "==");
 
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
@@ -374,4 +373,5 @@
         psS64 stage_id = psMetadataLookupS64(NULL, md, "stage_id");
         psS64 target_id = psMetadataLookupS64(NULL, md, "target_id");
+        psString target_label = psMetadataLookupStr(NULL, md, "label");
         bool clean = psMetadataLookupBool(NULL, md, "clean");
 
@@ -379,4 +379,7 @@
         psStringAppend(&outroot, "%s/%s/%s", workdir, run_tag, stage); 
 
+        if (set_label == NULL) {
+            set_label = target_label;
+        }
         distRunRow *row = distRunRowAlloc(
                 0,      // dist_id
@@ -1265,5 +1268,6 @@
 
     // required
-    PXOPT_LOOKUP_STR(obs_mode, config->args, "-obs_mode", true, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", true, false);
     PXOPT_LOOKUP_STR(stage, config->args, "-stage", true, false);
 
@@ -1275,5 +1279,6 @@
     distTargetRow *row = distTargetRowAlloc(
             0,          // target_id
-            obs_mode,
+            label,
+            filter,
             stage,
             clean,
@@ -1311,5 +1316,6 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-obs_mode", "obs_mode", "==");
+    PXOPT_COPY_STR(config->args, where, "-label", "label", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
 
@@ -1346,5 +1352,6 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-obs_mode", "obs_mode", "==");
+    PXOPT_COPY_STR(config->args, where, "-label", "label", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
     PXOPT_COPY_STR(config->args, where, "-state", "state", "==");
@@ -1368,7 +1375,7 @@
         psFree(whereClause);
         if (clean) {
-            psStringAppend(&query, " (AND clean)");
+            psStringAppend(&query, " AND (clean)");
         } else if (full) {
-            psStringAppend(&query, " (AND !clean)");
+            psStringAppend(&query, " AND (!clean)");
         }
     } else if (clean) {
Index: /trunk/ippTools/src/disttoolConfig.c
===================================================================
--- /trunk/ippTools/src/disttoolConfig.c	(revision 24724)
+++ /trunk/ippTools/src/disttoolConfig.c	(revision 24725)
@@ -59,5 +59,4 @@
     psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-magic_ds_id",   0, "define chip_id", 0); 
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",         0, "select by label", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-obs_mode",      0, "select by obs_mode", NULL);
 
     psMetadataAddU64(definebyqueryArgs, PS_LIST_TAIL, "-limit",  0,  "limit result set to N items", 0);
@@ -226,5 +225,6 @@
     // -definetarget
     psMetadata *definetargetArgs = psMetadataAlloc();
-    psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-obs_mode",  0, "define obs_mode (required)", NULL);
+    psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-label",     0, "define label (required)", NULL);
+    psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-filter",     0, "define filter (required)", NULL);
     psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-stage",     0, "define stage (required)", NULL);
     psMetadataAddBool(definetargetArgs, PS_LIST_TAIL,"-clean",     0, "define clean", false);
@@ -235,16 +235,18 @@
     psMetadata *updatetargetArgs = psMetadataAlloc();
     psMetadataAddS64(updatetargetArgs, PS_LIST_TAIL, "-target_id", 0, "define target_id", 0);
-    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-obs_mode",  0, "define obs_mode", NULL);
     psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-stage",     0, "define stage", NULL);
     psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-set_state", 0, "define state", NULL);
+    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-label",     0, "define label", NULL);
+    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-filter",    0, "define filter", NULL);
 
     // -listtarget
     psMetadata *listtargetArgs = psMetadataAlloc();
     psMetadataAddS64(listtargetArgs, PS_LIST_TAIL, "-target_id", 0, "list target with target_id", 0);
-    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-obs_mode",  0, "list targets for obs_mode", NULL);
+    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-label",  0, "list targets for label", NULL);
+    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-filter",    0, "define filter", NULL);
     psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-stage",     0, "list targets for stage", NULL);
     psMetadataAddBool(listtargetArgs, PS_LIST_TAIL,"-clean",     0, "list clean targets", false);
     psMetadataAddBool(listtargetArgs, PS_LIST_TAIL,"-full",      0, "list full targets", false);
-    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-state",     0, "list tarets in state", NULL);
+    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-state",     0, "list targets in state", NULL);
     psMetadataAddU64(listtargetArgs, PS_LIST_TAIL, "-limit",     0, "limit number of targets listed to N", 0);
     psMetadataAddBool(listtargetArgs, PS_LIST_TAIL, "-simple",  0, "use the simple output format", false);
