Index: trunk/ippTools/src/warptool.c
===================================================================
--- trunk/ippTools/src/warptool.c	(revision 10689)
+++ trunk/ippTools/src/warptool.c	(revision 10690)
@@ -25,4 +25,5 @@
 #include <string.h>
 #include <stdlib.h>
+#include <math.h>
 #include <ippdb.h>
 
@@ -91,4 +92,138 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
+    // required options
+    bool status = false;
+    psString survey_mode = psMetadataLookupStr(&status, config->args, "-survey_mode");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -survey_mode");
+        return false;
+    }
+    if (!survey_mode) {
+        psError(PS_ERR_UNKNOWN, true, "-survery_mode is required");
+        return false;
+    }
+
+    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
+        return false;
+    }
+    if (!filter) {
+        psError(PS_ERR_UNKNOWN, true, "-survery_mode is required");
+        return false;
+    }
+
+    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
+        return false;
+    }
+    if (!skycell_id) {
+        psError(PS_ERR_UNKNOWN, true, "-survery_mode is required");
+        return false;
+    }
+
+    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
+        return false;
+    }
+    if (!tess_id) {
+        psError(PS_ERR_UNKNOWN, true, "-survery_mode is required");
+        return false;
+    }
+
+    psS32 imfiles = psMetadataLookupS32(&status, config->args, "-imfiles");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -imfiles");
+        return false;
+    }
+    if (imfiles < 1) {
+        psError(PS_ERR_UNKNOWN, true, "-imfiles is required");
+        return false;
+    }
+
+    // optional options
+    psF64 ra = psMetadataLookupS32(&status, config->args, "-ra");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ra");
+        return false;
+    }
+
+    psF64 decl = psMetadataLookupS32(&status, config->args, "-decl");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -decl");
+        return false;
+    }
+
+    psString input_ss = psMetadataLookupStr(&status, config->args, "-input_ss");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -input_ss");
+        return false;
+    }
+
+    psString output_ss = psMetadataLookupStr(&status, config->args, "-output_ss");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -output_ss");
+        return false;
+    }
+
+    psTime *registered = NULL;
+    {
+        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
+            return false;
+        }
+        // pass through NULL as this is an optional field
+        if (registeredStr) {
+            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
+        } else {
+            registered = NULL;
+        }
+    }
+
+    p4RunRow *p4Run = p4RunRowAlloc(
+            0,
+            survey_mode,
+            "run",
+            filter,
+            skycell_id,
+            tess_id,
+            ra,
+            decl,
+            input_ss,
+            output_ss
+    );
+    psFree(registered);
+    if (!p4Run) {
+        psError(PS_ERR_UNKNOWN, false, "failed to alloc p4Run object");
+        return true;
+    }
+    if (!p4RunInsertObject(config->dbh, p4Run)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(p4Run);
+        return true;
+    }
+
+    bool simple = false;
+    {
+        bool status = false;
+        simple = psMetadataLookupBool(&status, config->args, "-simple");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
+            psFree(p4Run);
+            return false;
+        }
+    }
+
+    if (!p4RunPrintObject(stdout, p4Run, !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print object");
+            psFree(p4Run);
+            return false;
+    }
+
+    psFree(p4Run);
+
     return true;
 }
Index: trunk/ippTools/src/warptoolConfig.c
===================================================================
--- trunk/ippTools/src/warptoolConfig.c	(revision 10689)
+++ trunk/ippTools/src/warptoolConfig.c	(revision 10690)
@@ -49,5 +49,5 @@
             "define the type of suvery (required)", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-filter",  0,
-            "define filter", NULL);
+            "define filter (required)", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,
             "define skycell ID (required)", NULL);
@@ -141,17 +141,17 @@
     // -adddiffimfile
     psMetadata *adddiffimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-p4_id", 0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-p4_id", 0,
             "define p4 ID (required)", NULL);
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-exp_tag", 0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-exp_tag", 0,
             "define exposure tag (required)", NULL);
-    psMetadataAddS32(addstackedimfileArgs, PS_LIST_TAIL, "-p3_version", 0,
+    psMetadataAddS32(adddiffimfileArgs, PS_LIST_TAIL, "-p3_version", 0,
             "define phase 3 version of exposure tag (required)", 0);
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-class_id", 0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-class_id", 0,
             "define class ID (required)", 0);
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-uri", 0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-uri", 0,
             "define URI of file (required)", 0);
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-b1_uri",  0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-b1_uri",  0,
             "define banana 1", NULL);
-    psMetadataAddStr(addstackedimfileArgs, PS_LIST_TAIL, "-b2_uri",  0,
+    psMetadataAddStr(adddiffimfileArgs, PS_LIST_TAIL, "-b2_uri",  0,
             "define banana 2", NULL);
 
