Index: trunk/ippTools/share/Makefile.am
===================================================================
--- trunk/ippTools/share/Makefile.am	(revision 35194)
+++ trunk/ippTools/share/Makefile.am	(revision 35196)
@@ -466,4 +466,6 @@
 	releasetool_listrelease.sql \
 	releasetool_listrelexp.sql \
-	releasetool_definerelexp.sql
+	releasetool_definerelexp.sql \
+	releasetool_definerelstack.sql \
+	releasetool_definerelstack_with_skycal.sql
 
Index: trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- trunk/ippTools/share/pxadmin_create_tables.sql	(revision 35194)
+++ trunk/ippTools/share/pxadmin_create_tables.sql	(revision 35196)
@@ -2124,4 +2124,6 @@
       zpt_obs FLOAT,
       zpt_stdev FLOAT,
+      fwhm_major  FLOAT,
+      fwhm_minor  FLOAT,
       quality SMALLINT NOT NULL,
       hostname VARCHAR(64) NOT NULL,
@@ -2185,4 +2187,5 @@
     path_base   VARCHAR(255),   -- path_base of any supporting files for this
                                 -- release of this exposure.
+    fault SMALLINT NOT NULL,
     registered  DATETIME,       -- insertion time for this row
     time_stamp  DATETIME,       -- time of last update for this row
@@ -2190,4 +2193,5 @@
     FOREIGN KEY(rel_id) REFERENCES ippRelease(rel_id),
     KEY (state),
+    KEY (fault),
     FOREIGN KEY(exp_id) REFERENCES rawExp(exp_id),
     FOREIGN KEY(chip_id) REFERENCES chipRun(chip_id),
@@ -2201,6 +2205,7 @@
     skycal_id   BIGINT,         -- id of the sky calibration run that supplied the calibration
                                 -- for this release of this skycell.
-    skycell_id  varchar(64),
-    tess_id     varchar(64),
+    skycell_id  VARCHAR(64),
+    tess_id     VARCHAR(64),
+    filter      VARCHAR(16),
     state       VARCHAR(16),    -- released, pending, archive, drop  
     flags       INT UNSIGNED,
@@ -2208,11 +2213,16 @@
     zpt_obs     FLOAT,          -- calibrated zero point for this release of this skycell
     zpt_stdev   FLOAT,
-    fwhm_major  FLOAT,          -- seeing as measured by staticsky
+    mjd_obs     INT UNSIGNED,   -- for nightly stacks the mjd_obs
     path_base   VARCHAR(255),   -- path_base of any supporting files,
+    fault SMALLINT NOT NULL,
     registered  DATETIME,
     time_stamp  DATETIME,
     PRIMARY KEY (relstack_id),
     KEY (tess_id, skycell_id),
-    KEY (rel_id, tess_id, skycell_id),
+    KEY (rel_id, tess_id, skycell_id, filter, mjd_obs),
+    KEY (stack_type),
+    KEY (mjd_obs),
+    KEY (state),
+    KEY (fault),
     FOREIGN KEY(rel_id) REFERENCES ippRelease(rel_id),
     FOREIGN KEY(stack_id) REFERENCES stackRun(stack_id)
Index: trunk/ippTools/share/releasetool_definerelstack.sql
===================================================================
--- trunk/ippTools/share/releasetool_definerelstack.sql	(revision 35196)
+++ trunk/ippTools/share/releasetool_definerelstack.sql	(revision 35196)
@@ -0,0 +1,16 @@
+SELECT
+    ippRelease.rel_id,
+    stackRun.stack_id,
+    0 as skycal_id,
+    stackRun.skycell_id,
+    stackRun.tess_id,
+    stackRun.filter,
+    0 AS mjd_obs,
+    0 AS zpt_obs,
+    0 AS zpt_stdev
+
+FROM ippRelease
+JOIN stackRun
+LEFT JOIN relStack AS previousRelStack USING(rel_id, tess_id, skycell_id, filter)
+
+WHERE previousRelStack.relstack_id IS NULL
Index: trunk/ippTools/share/releasetool_definerelstack_with_skycal.sql
===================================================================
--- trunk/ippTools/share/releasetool_definerelstack_with_skycal.sql	(revision 35196)
+++ trunk/ippTools/share/releasetool_definerelstack_with_skycal.sql	(revision 35196)
@@ -0,0 +1,19 @@
+SELECT
+    ippRelease.rel_id,
+    stackRun.stack_id,
+    IFNULL(skycalRun.skycal_id, 0) as skycal_id,
+    stackRun.skycell_id,
+    stackRun.tess_id,
+    stackRun.filter,
+    stackSumSkyfile.mjd_obs,
+    skycalResult.zpt_obs,
+    skycalResult.zpt_stdev
+
+FROM ippRelease
+JOIN stackRun
+JOIN stackSumSkyfile USING(stack_id)
+LEFT JOIN relStack AS previousRelStack USING(rel_id, tess_id, skycell_id, filter)
+JOIN skycalRun ON skycalRun.stack_id = stackRun.stack_id
+JOIN skycalResult ON skycalRun.skycal_id = skycalResult.skycal_id
+
+WHERE previousRelStack.relstack_id IS NULL
Index: trunk/ippTools/src/releasetool.c
===================================================================
--- trunk/ippTools/src/releasetool.c	(revision 35194)
+++ trunk/ippTools/src/releasetool.c	(revision 35196)
@@ -201,5 +201,10 @@
         return false;
     }
-    PXOPT_LOOKUP_STR(release_state,       config->args, "-set_release_state",  true, false);
+    PXOPT_LOOKUP_STR(release_state,    config->args, "-set_release_state",  false, false);
+    PXOPT_LOOKUP_S32(priority,         config->args, "-set_priority",  false, false);
+    if (!release_state && !priority) {
+        psError(PXTOOLS_ERR_CONFIG, true, "at least one of -set_release_staate and -set_priority is required\n");
+        return false;
+    }
 
     psMetadata *where = psMetadataAlloc();
@@ -208,6 +213,15 @@
     PXOPT_COPY_STR(config->args, where, "-releaseName", "releaseName", "==");
 
-    psString query = NULL;
-    psStringAppend(&query, "UPDATE ippRelease SET release_state = '%s'", release_state);
+    psString sep = "";
+    psString comma = ", ";
+    psString query = psStringCopy("UPDATE ippRelease SET");
+    if (release_state) {
+        psStringAppend(&query, "%s release_state = '%s'", sep, release_state);
+        sep = comma;
+    }
+    if (priority != 0) {
+        psStringAppend(&query, "%s priority = %d", sep, priority);
+        sep = comma;
+    }
 
     psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
@@ -334,5 +348,8 @@
     PXOPT_LOOKUP_STR(state, config->args,     "-set_state", true, false);
     PXOPT_LOOKUP_U32(flags, config->args,     "-set_flags", false, false);
+    PXOPT_LOOKUP_F32(zpt_obs, config->args,   "-set_zpt_obs", false, false);
+    PXOPT_LOOKUP_F32(zpt_stdev, config->args, "-set_zpt_stdev", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-set_path_base", false, false);
+    PXOPT_LOOKUP_S16(fault, config->args,     "-set_fault", false, false);
 
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
@@ -398,6 +415,11 @@
         psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
         psS64 cam_id = psMetadataLookupS64(&status, md, "cam_id");
-        psF32 zpt_obs = psMetadataLookupF32(&status, md, "zpt_obs");
-        psF32 zpt_stdev = psMetadataLookupF32(&status, md, "zpt_stdev");
+        // if zpt_obs or zpt_stdev were not supplied use the results from the camRun
+        if (!isfinite(zpt_obs)) {
+            zpt_obs = psMetadataLookupF32(&status, md, "zpt_obs");
+        }
+        if (!isfinite(zpt_stdev)) {
+            zpt_stdev = psMetadataLookupF32(&status, md, "zpt_stdev");
+        }
 
         if (!relExpInsert(config->dbh,
@@ -412,4 +434,5 @@
             zpt_stdev,
             path_base,
+            fault,
             now,       // registered
             now        // time_stamp
@@ -546,9 +569,18 @@
     psMetadata *where = psMetadataAlloc();
 
-    PXOPT_COPY_STR(config->args, where, "-label",      "skycalRun.label", "==");
-    PXOPT_COPY_STR(config->args, where, "-data_group", "skycalRun.data_group", "==");
-    PXOPT_COPY_S64(config->args, where, "-skycal_id",  "skcalRun.skycal_id", "==");
-
-    // Insure that at least one of the skcalRun selectors is supplied
+    bool includeSkycal = false;
+
+    PXOPT_COPY_S64(config->args, where, "-skycal_id",  "skycalRun.skycal_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycal_label", "skycalRun.label", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycal_data_group", "skycalRun.data_group", "==");
+    if (psListLength(where->list)) {
+        includeSkycal = true;
+    }
+
+    PXOPT_COPY_STR(config->args, where, "-label",      "stackRun.label", "==");
+    PXOPT_COPY_STR(config->args, where, "-data_group", "stackRun.data_group", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id",   "stackRun.stack_id", "==");
+
+    // Insure that at least one of the skycalRun selectors is supplied
     if (!psListLength(where->list)) {
         psFree(where);
@@ -557,7 +589,6 @@
     }
 
-    PXOPT_COPY_S64(config->args, where, "-stack_id",   "stackRun.stack_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-tess_id",    "stackRun.tess_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-skycell_id", "stackRun.skycell_id", "==");
+    // PXOPT_COPY_STR(config->args, where, "-tess_id",    "stackRun.tess_id", "==");
+    // PXOPT_COPY_STR(config->args, where, "-skycell_id", "stackRun.skycell_id", "==");
 
     // insure that at least one of these is supplied to select the release
@@ -580,6 +611,6 @@
     PXOPT_LOOKUP_F32(zpt_obs, config->args,   "-set_zpt_obs", false, false);
     PXOPT_LOOKUP_F32(zpt_stdev, config->args, "-set_zpt_stdev", false, false);
-    PXOPT_LOOKUP_F32(fwhm_major, config->args, "-set_fwhm_major", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-set_path_base", false, false);
+    PXOPT_LOOKUP_S16(fault, config->args,     "-set_fault", false, false);
 
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
@@ -587,5 +618,11 @@
 
     // find the parameters of all the exposures that we want to add to the release
-    psString query = pxDataGet("releasetool_definerelstack.sql");
+    psString query;
+    
+    if (includeSkycal) {
+        query = pxDataGet("releasetool_definerelstack_with_skycal.sql");
+    } else {
+        query = pxDataGet("releasetool_definerelstack.sql");
+    }
     if (!query) {
         psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
@@ -620,5 +657,5 @@
     if (pretend) {
         // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "chipRun", !simple)) {
+        if (!ippdbPrintMetadatas(stdout, output, "relstack", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(output);
@@ -642,26 +679,42 @@
         bool status = true;
         psS32 rel_id = psMetadataLookupS32(&status, md, "rel_id");
+        psS64 stack_id = psMetadataLookupS64(&status, md, "stack_id");
         psS64 skycal_id = psMetadataLookupS64(&status, md, "skycal_id");
         psString skycell_id = psMetadataLookupStr(&status, md, "skycell_id");
         psString tess_id = psMetadataLookupStr(&status, md, "tess_id");
-        psString state = psMetadataLookupStr(&status, md, "state");
+        psString filter = psMetadataLookupStr(&status, md, "filter");
 
         // use skycal zero point measurement if not supplied with arguments
         psF32 sc_zpt_obs = psMetadataLookupF32(&status, md, "zpt_obs");
         psF32 sc_zpt_stdev = psMetadataLookupF32(&status, md, "zpt_stdev");
+        psF32 stack_mjd_obs = psMetadataLookupF32(&status, md, "mjd_obs");
+
+        psU32 mjd_obs = 0;
+        if (!strcmp(stack_type, "nightly")) {
+            // only for nightly stacks do we set mjd_obs to a non zero value
+            // We use integer day because this is part of the key that is used
+            // to make sure entries are unique
+            //      KEY (rel_id, tess_id, skycell_id, filter, mjd_obs),
+            // 1 entry per release, skycell, filter and mjd_obs. 
+            // mjd_obs is zero for deep and reference stacks
+            mjd_obs = (psU32) stack_mjd_obs;
+        }
 
         if (!relStackInsert(config->dbh,
             0,          // relstack_id (auto increment)
             rel_id,
+            stack_id,
             skycal_id,
             skycell_id,
             tess_id,
+            filter,
             state,
             flags,
             stack_type,
-            isfinite(zpt_obs)  ? zpt_obs : sc_zpt_obs,
+            isfinite(zpt_obs)   ? zpt_obs   : sc_zpt_obs,
             isfinite(zpt_stdev) ? zpt_stdev : sc_zpt_stdev,
-            fwhm_major,
+            mjd_obs,
             path_base,
+            fault,
             now,       // registered
             now        // time_stamp
@@ -671,5 +724,5 @@
             }
             psError(PS_ERR_UNKNOWN, false,
-                    "failed to trying to insert relExp for skycal_id %" PRId64, skycal_id);
+                    "failed to trying to insert relStack for stack_id %" PRId64, stack_id);
             psFree(output);
             psFree(now);
@@ -705,7 +758,7 @@
     PXOPT_COPY_TIME(config->args, where, "-dateobs_begin","rawExp.dateobs", ">=");
     PXOPT_COPY_TIME(config->args, where, "-dateobs_end", "rawExp.dateobs", "<=");
-    PXOPT_COPY_F32(config->args, where, "-fwhm_min",    "camProcessedExp.fwhm_major", ">=");
-    PXOPT_COPY_F32(config->args, where, "-fwhm_max",    "camProcessedExp.fwhm_major", "<=");
-    PXOPT_COPY_STR(config->args, where, "-exp_name",    "rawExp.exp_name", "==");
+    PXOPT_COPY_F32(config->args, where, "-fwhm_min",    "skycalResult.fwhm_major", ">=");
+    PXOPT_COPY_F32(config->args, where, "-fwhm_max",    "skycalresult.fwhm_major", "<=");
+    PXOPT_COPY_STR(config->args, where, "-exp_name",    "rawExp.exp_ame", "==");
     PXOPT_COPY_S64(config->args, where, "-exp_id",      "relExp.exp_id", "==");
     PXOPT_COPY_S64(config->args, where, "-chip_id",     "relExp.chip_id", "==");
Index: trunk/ippTools/src/releasetoolConfig.c
===================================================================
--- trunk/ippTools/src/releasetoolConfig.c	(revision 35194)
+++ trunk/ippTools/src/releasetoolConfig.c	(revision 35196)
@@ -63,5 +63,5 @@
     psMetadataAddS32(definereleaseArgs, PS_LIST_TAIL, "-set_dataRelease", 0,   "define dataRelease", -1);
     psMetadataAddStr(definereleaseArgs, PS_LIST_TAIL, "-set_release_state", 0, "define release state", NULL);
-    psMetadataAddS32(definereleaseArgs, PS_LIST_TAIL, "-set_priority", 0,      "define release priority", -1);
+    psMetadataAddS32(definereleaseArgs, PS_LIST_TAIL, "-set_priority", 0,      "define release priority", 0);
 
     // -uptdaterelease
@@ -73,5 +73,5 @@
 
     // Only support changing state and priority for now
-    psMetadataAddStr(updatereleaseArgs, PS_LIST_TAIL, "-set_release_state", 0,  "define new release state(required)", NULL);
+    psMetadataAddStr(updatereleaseArgs, PS_LIST_TAIL, "-set_release_state", 0,  "define new release state", NULL);
     psMetadataAddS32(updatereleaseArgs, PS_LIST_TAIL, "-set_priority", 0,       "define new release priority", 0);
 
@@ -109,8 +109,11 @@
         // parameters of the relExp
     psMetadataAddStr(definerelexpArgs,  PS_LIST_TAIL, "-set_state", 0,      "define state (required)", NULL);
-    psMetadataAddStr(definerelexpArgs,  PS_LIST_TAIL, "-set_path_base", 0,  "define state", NULL);
     psMetadataAddU32(definerelexpArgs,  PS_LIST_TAIL, "-set_flags", 0,      "define flags", 0);
-
-    psMetadataAddBool(definerelexpArgs, PS_LIST_TAIL, "-pretend",  0, "do not actual modify the database", false);
+    psMetadataAddF32(definerelexpArgs,  PS_LIST_TAIL, "-set_zpt_obs", 0,    "define zero point", NAN);
+    psMetadataAddF32(definerelexpArgs,  PS_LIST_TAIL, "-set_zpt_stdev", 0,  "define zero point stdev", NAN);
+    psMetadataAddStr(definerelexpArgs,  PS_LIST_TAIL, "-set_path_base", 0,  "define state (required)", NULL);
+    psMetadataAddS16(definerelexpArgs,  PS_LIST_TAIL, "-set_fault", 0,      "define fault", 0);
+
+    psMetadataAddBool(definerelexpArgs, PS_LIST_TAIL, "-pretend",  0, "do not actually modify the database", false);
     psMetadataAddBool(definerelexpArgs, PS_LIST_TAIL, "-simple",  0, "use the simpel output format", false);
 
@@ -155,4 +158,34 @@
     psMetadataAddBool(listrelexpArgs, PS_LIST_TAIL, "-simple",      0, "use the simple output format", false);
 
+    // -definerelstack
+    psMetadata *definerelstackArgs = psMetadataAlloc();
+
+        // set the target release
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-releaseName", 0, "define release name", NULL);
+    psMetadataAddS32(definerelstackArgs, PS_LIST_TAIL,  "-rel_id", 0,      "define release ID", 0);
+
+        // select the processing
+    psMetadataAddS64(definerelstackArgs, PS_LIST_TAIL,  "-stack_id", 0,    "select by stack ID", 0);
+    psMetadataAddS64(definerelstackArgs, PS_LIST_TAIL,  "-skycal_id", 0,   "select by skycal ID", 0);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-label",  0,      "select by stackRun.label", NULL);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-data_group", 0,  "select by stackRun.data_group", NULL);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-skycal_label",  0, "select by skycalRun.label", NULL);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-skycal_data_group", 0,  "select by skycalRun.data_group", NULL);
+
+        // parameters of the relStack
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-set_state", 0,      "define state (required)", NULL);
+    psMetadataAddU32(definerelstackArgs,  PS_LIST_TAIL, "-set_flags", 0,      "define flags", 0);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-set_stack_type", 0, "define stack type (required)", NULL);
+    psMetadataAddF32(definerelstackArgs,  PS_LIST_TAIL, "-set_zpt_obs", 0,    "define zero point", NAN);
+    psMetadataAddF32(definerelstackArgs,  PS_LIST_TAIL, "-set_zpt_stdev", 0,  "define zero point stdev", NAN);
+    psMetadataAddF32(definerelstackArgs,  PS_LIST_TAIL, "-set_fwhm_major", 0, "define fwhm_major", NAN);
+    psMetadataAddStr(definerelstackArgs,  PS_LIST_TAIL, "-set_path_base", 0,  "define state (required)", NULL);
+    psMetadataAddS16(definerelstackArgs,  PS_LIST_TAIL, "-set_fault", 0,      "define fault", 0);
+
+    psMetadataAddBool(definerelstackArgs, PS_LIST_TAIL, "-pretend",  0, "do not actually modify the database", false);
+    psMetadataAddBool(definerelstackArgs, PS_LIST_TAIL, "-simple",  0, "use the simpel output format", false);
+
+    // ******************************************************************
+
     psMetadata *argSets = psMetadataAlloc();
     psMetadata *modes = psMetadataAlloc();
@@ -160,10 +193,15 @@
     PXOPT_ADD_MODE("-definesurvey",     "define a survey",              RELEASETOOL_MODE_DEFINESURVEY,  definesurveyArgs);
     PXOPT_ADD_MODE("-listsurvey",       "list skycell parameters",      RELEASETOOL_MODE_LISTSURVEY,    listsurveyArgs);
+
     PXOPT_ADD_MODE("-definerelease",    "define a release",             RELEASETOOL_MODE_DEFINERELEASE, definereleaseArgs);
     PXOPT_ADD_MODE("-updaterelease",    "update a release",             RELEASETOOL_MODE_UPDATERELEASE, updatereleaseArgs);
     PXOPT_ADD_MODE("-listrelease",      "list releases",                RELEASETOOL_MODE_LISTRELEASE,   listreleaseArgs);
+
     PXOPT_ADD_MODE("-definerelexp",     "define a released exposure",   RELEASETOOL_MODE_DEFINERELEXP,  definerelexpArgs);
     PXOPT_ADD_MODE("-updaterelexp",     "update a released exposure",   RELEASETOOL_MODE_UPDATERELEXP,  updaterelexpArgs);
     PXOPT_ADD_MODE("-listrelexp",       "list released exposures",      RELEASETOOL_MODE_LISTRELEXP,    listrelexpArgs);
+
+    PXOPT_ADD_MODE("-definerelstack",     "define a released stack",    RELEASETOOL_MODE_DEFINERELSTACK,  definerelstackArgs);
+
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
