IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 20, 2008, 3:24:49 PM (18 years ago)
Author:
bills
Message:

Change type for ROI parameters in request file to F64.
Change DATE_MIN,DATE_MAX strings to MJD_MIN, MJD_MAX as F64.
Choose the value for exit status for errors.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/pstamp/src/pstamprequest.c

    r18550 r18637  
    1111    psString    fileName;
    1212    psString    requestName;
     13    bool        verbose;
    1314} psrOptions;
    1415
    15 char *str_columns[] = {
     16char *string_columns[] = {
    1617    "ROWNUM",
    1718    "PROJECT",
     
    2021    "ID",       // db id, exposure name, n/a
    2122    "CLASS_ID",
     23    "FILTER",
     24    "STAMP_NAME",
     25    NULL
     26};
     27char *double_columns[]= {
    2228    "CENTER_X",
    2329    "CENTER_Y",
     
    2531    "HEIGHT",
    2632    "FILTER",
    27     "DATE_MIN",
    28     "DATE_MAX",
    29     "STAMP_NAME",
    30     NULL
     33    "MJD_MIN",
     34    "MJD_MAX",
    3135};
    3236char *u32_columns[] = {
     
    3640};
    3741
    38 static void usage()
     42static void usage(int exitStatus)
    3943{
    4044    psErrorStackPrint(stderr, "Unable to parse command-line arguments.");
    41     exit(1);
     45    exit(exitStatus);
    4246}
    4347
     
    4650    psMetadata *md = psMetadataAlloc();
    4751
    48     for (char **col_name = str_columns; *col_name != NULL; col_name++) {
     52    //  unset columns with string type default to "null"
     53    for (char **col_name = string_columns; *col_name != NULL; col_name++) {
    4954        psMetadataAddStr(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", "null");
    5055    }
     56    //  unset columns with u32 type default to 0
    5157    for (char **col_name = u32_columns; *col_name != NULL; col_name++) {
    5258        psMetadataAddU32(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", 0);
    5359    }
     60    //  unset columns with f64 type default to 0.
     61    for (char **col_name = double_columns; *col_name != NULL; col_name++) {
     62        psMetadataAddF64(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", 0.0);
     63    }
    5464    return md;
    5565}
     
    5868    if (*pArgc < 2) {
    5969        fprintf(stderr, "must specify %s\n", idString);
    60         usage();
     70        usage(PS_EXIT_DATA_ERROR);
    6171    }
    6272    // catch common error
    6373    if (*argv[argnum] == '-') {
    6474        fprintf(stderr, "%s is not a valid %s\n", argv[argnum], idString);
    65         usage();
     75        usage(PS_EXIT_DATA_ERROR);
    6676    }
    6777
     
    7383static pstampImageType getType(int argnum, int *pArgc, char *argv[], psrOptions *options, char *paramName)
    7484{
    75     if (*pArgc < (argnum+2)) {
    76         fprintf(stderr, "must specify image type and %s\n", paramName);
    77         usage();
     85    if (paramName) {
     86        if (*pArgc < (argnum+2)) {
     87            fprintf(stderr, "must specify image type and %s\n", paramName);
     88            usage(PS_EXIT_DATA_ERROR);
     89        }
     90    }  else {
     91        if (*pArgc < (argnum+1)) {
     92            fprintf(stderr, "must specify image type");
     93            usage(PS_EXIT_DATA_ERROR);
     94        }
    7895    }
    7996    char *type = argv[argnum];
     
    95112    } else {
    96113        fprintf(stderr, "unknown image type %s\n", type);
    97         usage();
     114        usage(PS_EXIT_DATA_ERROR);
    98115    }
    99116    psMetadataAddStr (options->md, PS_LIST_TAIL, "IMG_TYPE", PS_META_REPLACE, "", type);
    100117
    101     getId(paramName, argnum, pArgc, argv, options);
     118    if (paramName) {
     119        getId(paramName, argnum, pArgc, argv, options);
     120    }
    102121
    103122    return itype;
     
    141160    }
    142161}
    143 
    144 static psrOptions *parseArguments(int argc, char *argv[])
     162static void doByCoord(int argnum, int *pArgc, char *argv[], psrOptions *options)
     163{
     164    switch (getType(argnum, pArgc, argv, options, NULL)) {
     165    case PSTAMP_RAW:
     166        getId("CLASS_ID", argnum, pArgc, argv, options);
     167        break;
     168    case PSTAMP_CHIP:
     169        getId("CLASS_ID", argnum, pArgc, argv, options);
     170        break;
     171    case PSTAMP_WARP:
     172    case PSTAMP_DIFF:
     173    case PSTAMP_STACK:
     174        break;
     175    default:
     176        fprintf(stderr, "programming error unexpected image type\n");
     177        exit(1);
     178    }
     179}
     180
     181static psrOptions *parseArguments(int argc, char *argv[], int *pExitStatus)
    145182{
    146183    psrOptions *options = psAlloc(sizeof(psrOptions));
     
    180217        if (argc < 2) {
    181218            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "value required for request name");
    182             usage();
     219            usage(PS_EXIT_DATA_ERROR);
    183220        }
    184221        options->requestName = argv[argnum];
     
    186223    } else {
    187224        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "req_name is required\n");
    188         usage();
     225        usage(PS_EXIT_DATA_ERROR);
    189226    }
    190227
     
    193230        if (argc < 2) {
    194231            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "project is required");
    195             usage();
     232            usage(PS_EXIT_DATA_ERROR);
    196233        }
    197234        psMetadataAddStr(md, PS_LIST_TAIL, "PROJECT", PS_META_REPLACE, "", argv[argnum]);
     
    199236    } else {
    200237        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "project is required\n");
    201         usage();
    202     }
    203 
    204     // user tag will be used as the base name for the postage stamp images
     238        usage(PS_EXIT_DATA_ERROR);
     239    }
     240
     241    // if provided, stamp name tag will be appended to the base name for the postage stamp images
    205242    if ((argnum = psArgumentGet(argc, argv, "-stamp_name"))) {
    206243        psArgumentRemove(argnum, &argc, argv);
    207244        if (argc < 2) {
    208245            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value for stamp_name");
    209             usage();
     246            usage(PS_EXIT_DATA_ERROR);
    210247        }
    211248        psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", argv[argnum]);
    212249        psArgumentRemove(argnum, &argc, argv);
    213     } else {
    214         // if stamp name not specified use requestName
    215         psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", options->requestName);
    216250    }
    217251
     
    228262    // find style & image type
    229263    if ((argnum = psArgumentGet(argc, argv, "-bycoord"))) {
    230         fprintf(stderr, "-bycoord not implemented yet\n");
    231         exit(1);
    232 
    233264        gotStyle = true;
    234265        psMetadataAddStr(md, PS_LIST_TAIL, "REQ_TYPE", PS_META_REPLACE, "", 1+argv[argnum]);
     
    236267        psArgumentRemove(argnum, &argc, argv); needCoord = true;
    237268        needROI = true;
    238         // TODO: we need an IMG_TYPE too...
     269        doByCoord(argnum, &argc, argv, options);
    239270    }
    240271
     
    242273        if (gotStyle) {
    243274            fprintf(stderr, "only one of -bycoord -byid -byexp may be specified\n");
    244             usage(1);
     275            usage(PS_EXIT_DATA_ERROR);
    245276        }
    246277        gotStyle = true;
     
    253284        if (gotStyle) {
    254285            fprintf(stderr, "only one of -bycoord -byid -byexp may be specified\n");
    255             usage(1);
     286            usage(PS_EXIT_DATA_ERROR);
    256287        }
    257288        gotStyle = true;
     
    260291        doByExp(argnum, &argc, argv, options);
    261292    }
    262 
    263293    if (!gotStyle) {
    264294        fprintf(stderr, "one of -bycoord -byid -byexp must be specified\n");
    265         usage();
     295        usage(PS_EXIT_DATA_ERROR);
     296    }
     297    if ((argnum = psArgumentGet(argc, argv, "-mjd_min"))) {
     298        psArgumentRemove(argnum, &argc, argv);
     299        if (argc < 2) {
     300            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value mjd_min");
     301            usage(PS_EXIT_DATA_ERROR);
     302        }
     303        psMetadataAddF64(md, PS_LIST_TAIL, "MJD_MIN", PS_META_REPLACE, "", atof(argv[argnum]));
     304        psArgumentRemove(argnum, &argc, argv);
     305    }
     306    if ((argnum = psArgumentGet(argc, argv, "-mjd_max"))) {
     307        psArgumentRemove(argnum, &argc, argv);
     308        if (argc < 2) {
     309            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value mjd_max");
     310            usage(PS_EXIT_DATA_ERROR);
     311        }
     312        psMetadataAddF64(md, PS_LIST_TAIL, "MJD_MAX", PS_META_REPLACE, "", atof(argv[argnum]));
     313        psArgumentRemove(argnum, &argc, argv);
    266314    }
    267315
     
    271319    if (!pstampGetROI(&roiParam, &argc, argv, &gotCenter, &gotRange)) {
    272320        if (needROI) {
    273             usage();
     321            usage(PS_EXIT_DATA_ERROR);
    274322        } else {
    275323            psErrorClear();
     
    280328        unsigned coord_mask = 0;
    281329
    282         if (!roiParam.celestialCenter) {
     330        if (roiParam.celestialCenter) {
     331            psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "",
     332                RAD_TO_DEG(roiParam.centerRA));
     333            psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "",
     334                RAD_TO_DEG(roiParam.centerDEC));
     335        } else {
    283336            if (needCoord) {
    284337                fprintf(stderr, "need to specify ROI in sky coordinates with -bycoord\n");
    285                 usage();
     338                usage(PS_EXIT_DATA_ERROR);
    286339            }
    287340            coord_mask |= PSTAMP_CENTER_IN_PIXELS;
    288         }
    289         psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", roiParam.center[0]);
    290         psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", roiParam.center[1]);
    291 
    292         if (!roiParam.celestialRange) {
     341            psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", atof(roiParam.center[0]));
     342            psMetadataAddF64 (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", atof(roiParam.center[1]));
     343        }
     344
     345        if (roiParam.celestialRange) {
     346            psMetadataAddF64 (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "", 
     347                RAD_TO_DEG(atof(roiParam.range[0])));
     348            psMetadataAddF64 (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "",
     349                RAD_TO_DEG(atof(roiParam.range[1])));
     350        } else {
    293351            coord_mask |= PSTAMP_RANGE_IN_PIXELS;
    294         }
    295         psMetadataAddStr (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "",  roiParam.range[0]);
    296         psMetadataAddStr (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", roiParam.range[1]);
     352            psMetadataAddF64 (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "",  atof(roiParam.range[0]));
     353            psMetadataAddF64 (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", atof(roiParam.range[1]));
     354        }
    297355
    298356        psMetadataAddU32(md, PS_LIST_TAIL, "COORD_MASK", PS_META_REPLACE, "", coord_mask);
     
    305363    } else if (argc == 1) {
    306364        fprintf(stderr, "output file name is required\n");
    307         usage();
     365        usage(PS_EXIT_DATA_ERROR);
    308366    } else {
    309367        fprintf(stderr, "too many arguments supplied:");
     
    313371        }
    314372        fprintf(stderr, "\n");
    315         usage();
     373        usage(PS_EXIT_DATA_ERROR);
    316374    }
    317375
     
    319377}
    320378
    321 static bool writeTable(psrOptions *options)
     379static bool writeTable(psrOptions *options, int *pExitStatus)
    322380{
    323381    psFits *fitsFile = psFitsOpen(options->fileName, "w");
    324382    if (fitsFile == NULL) {
    325383        psError(PS_ERR_IO, true, "failed to open %s for output\n", options->fileName);
     384        *pExitStatus = PS_EXIT_SYS_ERROR;
    326385        return false;
    327386    }
     
    336395    if (!psFitsWriteTable(fitsFile, header, table, STAMP_REQUEST_EXTNAME)) {
    337396        psError(PS_ERR_IO, false, "failed to write fits table");
     397        *pExitStatus = PS_EXIT_SYS_ERROR;
    338398        return false;
    339399    }
     
    341401    if (! psFitsClose(fitsFile)) {
    342402        psError(PS_ERR_IO, false, "failed to close fits table");
     403        *pExitStatus = PS_EXIT_SYS_ERROR;
    343404        return false;
    344405    }
     
    349410int main(int argc, char *argv[])
    350411{
    351     psrOptions *options = parseArguments(argc, argv);
     412    int exitStatus = 0;
     413
     414    // all of the action happens in parseArguments
     415    psrOptions *options = parseArguments(argc, argv, &exitStatus);
    352416
    353417    if (!options) {
     
    355419    }
    356420
    357     // psMetadataPrint(stderr, options->md, 0);
    358 
    359     if (writeTable(options)) {
    360         return 0;
    361     } else {
     421    if (options->verbose) {
     422        psMetadataPrint(stderr, options->md, 0);
     423    }
     424
     425    if (!writeTable(options, &exitStatus)) {
    362426        psErrorStackPrint(stderr, "failed to create request table");
    363         // XXX: we should have variable status codes that indicate what the problem was
    364         return 1;
    365     }
    366 }
     427    }
     428    return exitStatus;
     429}
Note: See TracChangeset for help on using the changeset viewer.