Index: trunk/ippTools/src/detselect.c
===================================================================
--- trunk/ippTools/src/detselect.c	(revision 11198)
+++ trunk/ippTools/src/detselect.c	(revision 11204)
@@ -68,4 +68,93 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+
+    // airmass_min  < airmass  < airmass_max
+    {
+        bool status = false;
+        psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
+            psFree(where);
+            return false;
+        }
+
+        if (!isnan(airmass)) {
+            psMetadataAddF32(where, PS_LIST_TAIL, "airmass_min", 0, "<=", airmass);
+            psMetadataAddF32(where, PS_LIST_TAIL, "airmass_max", 0, ">=", airmass);
+        }
+    }
+
+    // exp_time_min < exp_time < exp_time_max
+    {
+        bool status = false;
+        psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
+            psFree(where);
+            return false;
+        }
+
+        if (!isnan(exp_time)) {
+            psMetadataAddF32(where, PS_LIST_TAIL, "exp_time_min", 0, "<=", exp_time);
+            psMetadataAddF32(where, PS_LIST_TAIL, "exp_time_max", 0, ">=", exp_time);
+        }
+    }
+
+    // ccd_temp_min < ccd_temp < ccd_temp_max
+    {
+        bool status = false;
+        psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
+            psFree(where);
+            return false;
+        }
+
+        if (!isnan(ccd_temp)) {
+            psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp_min", 0, "<=", ccd_temp);
+            psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp_max", 0, ">=", ccd_temp);
+        }
+    }
+    
+    {
+        bool status = false;
+        psF64 posang = psMetadataLookupF64(&status, config->args, "-posang");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
+            psFree(where);
+            return false;
+        }
+
+        if (!isnan(posang)) {
+            psMetadataAddF32(where, PS_LIST_TAIL, "posang_min", 0, "<=", posang);
+            psMetadataAddF32(where, PS_LIST_TAIL, "posang_max", 0, ">=", posang);
+        }
+    }
+
+    // time_begin    < time     < time_end
+    {
+        bool status = false;
+        psString timeStr = psMetadataLookupStr(&status, config->args, "-time");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time");
+            psFree(where);
+            return false;
+        }
+
+        if (timeStr) {
+            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
+            if (!time) {
+                psError(PS_ERR_UNKNOWN, false, "error in time format %s", timeStr);
+                psFree(where);
+                return false;
+            }
+
+            psMetadataAddTime(where, PS_LIST_TAIL, "time_begin", 0, "<=", time);
+            psMetadataAddTime(where, PS_LIST_TAIL, "time_end", 0, ">=", time);
+            psFree(time);
+        }
+    }
 
     psString query = psStringCopy(
@@ -81,32 +170,4 @@
         "   AND detRunSummary.accept = 1" 
     );
-# if 0
-    psString query = psStringCopy(
-        "SELECT DISTINCT"
-        "   detRunSummary.det_id,"
-        "   detRunSummary.iteration,"
-        "   rawImfile.class,"
-        "   detRun.det_type"
-        // "   detRun.state,"
-        // "   detRunSummary.accept,"
-        // "   rawExp.camera"
-        " FROM detRun"
-        " JOIN detRunSummary "
-        "   USING(det_id)"
-        " JOIN detInputExp"
-        "   ON detRunSummary.det_id = detInputExp.det_id"
-        "   AND detRunSummary.iteration = detInputExp.iteration"
-        " JOIN rawExp"
-        "   ON detInputExp.exp_tag = rawExp.exp_tag"
-        " JOIN rawImfile"
-        "   ON rawExp.exp_tag = rawImfile.exp_tag"
-        " WHERE"
-        "   detRun.state = 'stop'"
-        "   AND detRunSummary.accept = 1"
-        // XXX the following entry is needed to exclude db mismatched
-        // XXX these are caused by an error upstream and should be fixed
-//        "   AND detRun.det_type = rawExp.object"
-    );
-# endif
 
     if (config->where) {
@@ -116,23 +177,10 @@
     }
 
-    // XXX need to place in here the range constraints for range-based values:
-    // use_begin    < time     < use_end
-    // airmass_min  < airmass  < airmass_max
-    // ccd_temp_min < ccd_temp < ccd_temp_max
-    // exp_time_min < exp_time < exp_time_max
-
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-det_type"))) {
-            psStringAppend(&query, " AND detRun.det_type = '%s'", str);
-        }
-    }
-
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-filter"))) {
-            psStringAppend(&query, " AND detRun.filter = '%s'", str);
+    {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detRun");
+        psFree(where);
+        if (whereClause) {
+            psStringAppend(&query, " AND %s", whereClause);
+            psFree(whereClause);
         }
     }
@@ -141,5 +189,5 @@
     // single detrend image which matches all criteria and has the latest 
     // insertion date
-    psStringAppend(&query, " LIMIT 1");
+    psStringAppend(&query, " ORDER BY detRun.registered DESC LIMIT 1");
 
     if (!p_psDBRunQuery(config->dbh, query)) {
Index: trunk/ippTools/src/detselectConfig.c
===================================================================
--- trunk/ippTools/src/detselectConfig.c	(revision 11198)
+++ trunk/ippTools/src/detselectConfig.c	(revision 11204)
@@ -45,17 +45,20 @@
     // -search
     psMetadata *searchArgs = psMetadataAlloc();
-    // XXX date/time
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-inst", 0,
-            "search by camera (required)", NULL);
+            "search by camera", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-telescope", 0,
+            "search by telescope", NULL);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-det_type", 0,
-            "search by detrend type (required)", NULL);
+            "search by detrend type", NULL);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-filter", 0,
             "search by filter", NULL);
+    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-airmass", 0,
+            "define airmass", NAN);
     psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-exp_time", 0,
             "search by exposure time", NAN);
-    psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-ccd_temp", 0,
+    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-ccd_temp", 0,
             "search by ccd tempature", NAN);
-    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-airmass", 0,
-            "define airmass", NAN);
+    psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-posang", 0,
+            "search by rotator position angle", NAN);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-time", 0,
             "define time for desired detrend data", NULL);
@@ -223,4 +226,5 @@
     }
     addWhereStr(telescope);
+    addWhereStr(det_type);
     addWhereStr(exp_type);
     addWhereS32(imfiles);
@@ -228,9 +232,9 @@
     addWhereStr(class_id);
     addWhereStr(filter);
-    addWhereF32(exp_time);
-    addWhereF64(ccd_temp);
-    addWhereF32(airmass);
-    addWhereTimeStr(use_begin);
-    addWhereTimeStr(use_end);
+//    addWhereF32(exp_time);
+//    addWhereF64(ccd_temp);
+//    addWhereF32(airmass);
+//    addWhereTimeStr(use_begin);
+//    addWhereTimeStr(use_end);
 
     if (config->where->list->n < 1) {
