Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 7421)
+++ trunk/ippTools/src/dettool.c	(revision 7422)
@@ -27,5 +27,5 @@
 static bool addresidexpMode(pxConfig *config);
 static bool residexpMode(pxConfig *config);
-static bool addmasterframeMode(pxConfig *config);
+static bool declaremasterframeMode(pxConfig *config);
 static bool masterframeMode(pxConfig *config);
 static bool masterMode(pxConfig *config);
@@ -62,5 +62,5 @@
         MODECASE(DETTOOL_MODE_ADDRESIDEXP, addresidexpMode);
         MODECASE(DETTOOL_MODE_RESIDEXP, residexpMode);
-        MODECASE(DETTOOL_MODE_ADDMASTERFRAME, addmasterframeMode);
+        MODECASE(DETTOOL_MODE_DECLAREMASTERFRAME, declaremasterframeMode);
         MODECASE(DETTOOL_MODE_MASTERFRAME, masterframeMode);
         MODECASE(DETTOOL_MODE_MASTER, masterMode);
@@ -83,5 +83,5 @@
 
     // what type of detRun is this?
-    // det_type & iteration are required
+    // det_type is required
     psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
     if (!status) {
@@ -93,13 +93,4 @@
         return false;
     }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
-        return false;
-    }    
 
     // start a transaction so we don't end up with orphaned det_ids
@@ -161,7 +152,7 @@
 
     // check that the specified exp_ids actually exist
-    psArray *rawExps = rawDetrendExpSelectRowObjects(config->dbh, where, 0);
+    psArray *detrendExps = rawDetrendExpSelectRowObjects(config->dbh, where, 0);
     psFree(where);
-    if (!rawExps) {
+    if (!detrendExps) {
         psError(PS_ERR_UNKNOWN, false, "no rawDetrendExp rows found");
         // rollback
@@ -173,6 +164,6 @@
 
     if (item->type == PS_DATA_METADATA_MULTI) {
-        // we should have one rawExp row be exp_id specified
-        if (psListLength(item->data.list) != psArrayLength(rawExps)) {
+        // we should have one rawDetrendExp row be exp_id specified
+        if (psListLength(item->data.list) != psArrayLength(detrendExps)) {
             // rollback
             if (!psDBRollback(config->dbh)) {
@@ -180,10 +171,10 @@
             }
             psAbort(config->argv[0],
-        "an -exp_id matched more then one rawExp (this should not happen");
+        "an -exp_id matched more then one rawDetrendExp (this should not happen");
 
         }
     } else {
         // we should have matched only one exp_id
-        if (psArrayLength(rawExps) != 1) {
+        if (psArrayLength(detrendExps) != 1) {
             // rollback
             if (!psDBRollback(config->dbh)) {
@@ -191,15 +182,15 @@
             }
             psAbort(config->argv[0],
-        "an -exp_id matched more then one rawExp (this should not happen");
-        }
-    }
-
-    // create new detInputExp row(s) from the rawExp row(s)
-    psArray *inputExps = psArrayAlloc(psArrayLength(rawExps));
-    for (long i = 0; i < psArrayLength(rawExps); i++) {
+        "-exp_id matched more then one rawDetrendExp (this should not happen");
+        }
+    }
+
+    // create new detInputExp row(s) from the rawDetrendExp row(s)
+    psArray *inputExps = psArrayAlloc(psArrayLength(detrendExps));
+    for (long i = 0; i < psArrayLength(detrendExps); i++) {
         detInputExpRow *inputExp = rawDetrenTodetInputExpRow(
-            rawExps->data[i],
+            detrendExps->data[i],
             det_id,
-            iteration
+            0 // the first iteration is explicitly 0
         );
         psArrayAdd(inputExps, 0, inputExp);
@@ -780,13 +771,4 @@
         return false;
     }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
-        return false;
-    }    
     psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
     if (!status) {
@@ -823,4 +805,11 @@
     if (!recipe) {
         psError(PS_ERR_UNKNOWN, true, "-recipe is required");
+        return false;
+    }
+
+    // iteration has a default value
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
         return false;
     }
@@ -1081,5 +1070,6 @@
         psMetadata *where = psMetadataAlloc();
         for (long i = 0; i < psArrayLength(inputExps); i++) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==",
+            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id",
+                    PS_META_DUPLICATE_OK, "==",
                     ((detInputExpRow *)inputExps->data[i])->exp_id)) {
                 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
@@ -1115,13 +1105,4 @@
         return false;
     }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
-        return false;
-    }    
     psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
     if (!status) {
@@ -1142,4 +1123,13 @@
         return false;
     }
+    psString stats = psMetadataLookupStr(&status, config->args, "-stats");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stats");
+        return false;
+    }
+    if (!stats) {
+        psError(PS_ERR_UNKNOWN, true, "-stats is required");
+        return false;
+    }
     psString recipe = psMetadataLookupStr(&status, config->args, "-recipe");
     if (!status) {
@@ -1151,11 +1141,9 @@
         return false;
     }
-    psString stats = psMetadataLookupStr(&status, config->args, "-stats");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stats");
-        return false;
-    }
-    if (!stats) {
-        psError(PS_ERR_UNKNOWN, true, "-stats is required");
+
+    // iteration has a default value
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
         return false;
     }
@@ -1242,9 +1230,4 @@
     psArray *residImfiles = detResidImfileAnalysisSelectRowObjects(config->dbh,
             config->where, 0);
-    if (!residImfiles) {
-        psError(PS_ERR_UNKNOWN, false, "no detResidImfileAnalysis rows found");
-        return false;
-    }
-
     if (residImfiles) {
         for (long i = 0; i < psArrayLength(normalizedImfiles); i++) {
@@ -1386,13 +1369,4 @@
         return false;
     }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
-        return false;
-    }    
     psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
     if (!status) {
@@ -1429,4 +1403,11 @@
     if (!recipe) {
         psError(PS_ERR_UNKNOWN, true, "-recipe is required");
+        return false;
+    }
+
+    // iteration has a default value
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
         return false;
     }
@@ -1550,13 +1531,4 @@
         return false;
     }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
-        return false;
-    }    
     psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
     if (!status) {
@@ -1584,4 +1556,11 @@
     if (!recipe) {
         psError(PS_ERR_UNKNOWN, true, "-recipe is required");
+        return false;
+    }
+
+    // iteration has a default value
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
         return false;
     }
@@ -1676,5 +1655,5 @@
 }
 
-static bool addmasterframeMode(pxConfig *config)
+static bool declaremasterframeMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -1691,11 +1670,9 @@
         return false;
     }
-    psString iteration = psMetadataLookupStr(&status, config->args, "-iteration");
+
+    // iteration has a default value
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
     if (!status) {
         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-    if (!iteration) {
-        psError(PS_ERR_UNKNOWN, true, "-iteration is required");
         return false;
     }
@@ -1710,5 +1687,5 @@
     detMasterFrameRow *masterFrame = detMasterFrameRowAlloc(
                 (psS32)atol(det_id),
-                (psS32)atol(iteration),
+                iteration,
                 comment // may be NULL
             );
@@ -1777,5 +1754,5 @@
         psMetadata *output = psMetadataAlloc();
         for (long i = 0; i < psArrayLength(normalizedImfiles); i++) {
-            psMetadata *md = detMasterFrameMetadataFromObject(
+            psMetadata *md = detNormalizedImfileMetadataFromObject(
                     normalizedImfiles->data[i]);
             psMetadataAddMetadata(
