Index: /trunk/ippTools/src/dettool.c
===================================================================
--- /trunk/ippTools/src/dettool.c	(revision 7610)
+++ /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)
 {
Index: /trunk/ippTools/src/dettool.h
===================================================================
--- /trunk/ippTools/src/dettool.h	(revision 7610)
+++ /trunk/ippTools/src/dettool.h	(revision 7611)
@@ -9,4 +9,5 @@
     DETTOOL_MODE_RUNS,
     DETTOOL_MODE_SELECTRUNS,
+    DETTOOL_MODE_SELECT,
     DETTOOL_MODE_INPUT,
     DETTOOL_MODE_RAW,
Index: /trunk/ippTools/src/dettoolConfig.c
===================================================================
--- /trunk/ippTools/src/dettoolConfig.c	(revision 7610)
+++ /trunk/ippTools/src/dettoolConfig.c	(revision 7611)
@@ -34,9 +34,18 @@
 
     // -selectruns
+    // detselect -camera megacam -type flat -time 2005/1/1
     psMetadata *selectrunsArgs = psMetadataAlloc();
     psMetadataAddStr(selectrunsArgs, PS_LIST_TAIL, "-inst",  0,
-        "search for detrend run for this camera", NULL);
+        "search for detrend run for this camera (required)", NULL);
     psMetadataAddStr(selectrunsArgs, PS_LIST_TAIL, "-det_type",  0,
-        "search for type of detrend run", NULL);
+        "search for type of detrend run (required)", NULL);
+
+    // -select
+    // detselect -select -detID flat.0000 -classID ccd00
+    psMetadata *selectArgs = psMetadataAlloc();
+    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-detID",  0,
+        "defined detrend ID (required)", NULL);
+    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-classID",  0,
+        "defined class ID (required)", NULL);
 
     // -input
@@ -284,4 +293,5 @@
     PXTOOL_MODE("-runs",            DETTOOL_MODE_RUNS,          runsArgs);
     PXTOOL_MODE("-selectruns",      DETTOOL_MODE_SELECTRUNS,    selectrunsArgs);
+    PXTOOL_MODE("-select",          DETTOOL_MODE_SELECT,        selectArgs);
     PXTOOL_MODE("-input",           DETTOOL_MODE_INPUT,         inputArgs);
     PXTOOL_MODE("-addprocessed",    DETTOOL_MODE_ADDPROCESSED,  addprocArgs);
@@ -314,5 +324,5 @@
         printf("\nPan-STARRS Detrend Tool\n");
         printf("Usage: %s <mode> [<options>]\n\n", argv[0]);
-        printf(" <mode> : [-define|-runs|-selectruns|-raw|-addprocessed|-processed|-addstacked|-stacked|-stackedframe|-addnormalized|-normalized|-normalizedframe|-addresid|-resid|-addresidexp|-residexp|-declaremasterframe|-masterframe|-master|-rerun]\n\n");
+        printf(" <mode> : [-define|-runs|-selectruns|-select|-raw|-addprocessed|-processed|-addstacked|-stacked|-stackedframe|-addnormalized|-normalized|-normalizedframe|-addresid|-resid|-addresidexp|-residexp|-declaremasterframe|-masterframe|-master|-rerun]\n\n");
         fprintf (stdout, "-define ");
         psArgumentHelp(defineArgs);
@@ -324,4 +334,7 @@
         psArgumentHelp(selectrunsArgs);
         psFree(selectrunsArgs);
+        fprintf (stdout, "-select");
+        psArgumentHelp(selectArgs);
+        psFree(selectArgs);
         fprintf (stdout, "-input ");
         psArgumentHelp(inputArgs);
@@ -385,4 +398,5 @@
     psFree(runsArgs);
     psFree(selectrunsArgs);
+    psFree(selectArgs);
     psFree(inputArgs);
     psFree(rawArgs);
