Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 7602)
+++ trunk/ippTools/src/dettool.c	(revision 7611)
@@ -12,4 +12,5 @@
 static bool runsMode(pxConfig *config);
 static bool selectrunsMode(pxConfig *config);
+static bool selectMode(pxConfig *config);
 static bool inputMode(pxConfig *config);
 static bool rawMode(pxConfig *config);
@@ -52,4 +53,5 @@
         MODECASE(DETTOOL_MODE_RUNS, runsMode);
         MODECASE(DETTOOL_MODE_SELECTRUNS, selectrunsMode);
+        MODECASE(DETTOOL_MODE_SELECT, selectMode);
         MODECASE(DETTOOL_MODE_INPUT, inputMode);
         MODECASE(DETTOOL_MODE_RAW, rawMode);
@@ -279,4 +281,5 @@
     PS_ASSERT_PTR_NON_NULL(config, 0);
 
+    // detselect -camera megacam -type flat -time 2005/1/1
     // -inst & -dete_type are required
     bool status = false;
@@ -327,4 +330,5 @@
     psFree(result);
 
+    // FLAT CHIP flat.0000 DONE
     fprintf(stdout, "FLAT CHIP %d DONE\n", det_id);
 
@@ -332,4 +336,64 @@
 }
 
+static bool selectMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, 0);
+
+    // detselect -select -detID flat.0000 -classID ccd00
+    // -detID & -classID are required
+    bool status = false;
+    psString det_id = psMetadataLookupStr(&status, config->args, "-detID");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -detID");
+        return false;
+    }
+    if (!det_id) {
+        psError(PS_ERR_UNKNOWN, true, "-detID is required");
+        return false;
+    }
+    psString class_id = psMetadataLookupStr(&status, config->args, "-classID");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -classID");
+        return false;
+    }
+    if (!class_id) {
+        psError(PS_ERR_UNKNOWN, true, "-classID is required");
+        return false;
+    }
+
+    char *query = "SELECT uri FROM detNormalizedImfile"
+        " WHERE iteration = (SELECT iteration FROM detMasterFrame"
+        " WHERE det_id = '%s' ORDER BY iteration DESC LIMIT 1)";
+
+    if (!p_psDBRunQuery(config->dbh, query, det_id)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    psArray *result = p_psDBFetchResult(config->dbh);
+    if (!result) {
+    }
+
+    // sanity check the result
+    if (psArrayLength(result) != 1) {
+    }
+
+    // just a view... doesn't need to be free'd
+    psMetadata *run = result->data[0];
+
+    psString uri = psMetadataLookupStr(&status, run, "uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for uri");
+        psFree(result);
+        return false;
+    }
+    psFree(result);
+
+    // flat.0000 ccd00 flat.split/flat.00.fits DONE
+
+    fprintf(stdout, "%s %s %s DONE\n", det_id, class_id, uri);
+
+    return true;
+}
 static detInputExpRow *rawDetrenTodetInputExpRow(rawDetrendExpRow *rawExp, psS32 det_id, psS32 iteration)
 {
