IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 23, 2007, 11:50:52 AM (19 years ago)
Author:
bills
Message:

Extract postage stamp from chip mosaic image. Changed -celcenter to -skycenter
Range in celestial coordinates not specified with -arcrange (arcseconds)
Better error handling.
Allow files without WCS if we don't need it

Location:
trunk/ppstamp/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppstamp/src

    • Property svn:ignore
      •  

        old new  
        66config.h.in
        77stamp-h1
         8ppstampErrorCodes.c
         9ppstampErrorCodes.h
  • trunk/ppstamp/src/ppstampArguments.c

    r15323 r15363  
    66#include "ohana.h"
    77
    8 static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothDegrees, double *p1, double *p2);
    9 static bool get2Ints(int argnum, int *pArgc, char **argv, int *p1, int *p2);
    10 
    11 // XXX This usage output is kind of busy
     8static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothDegrees, bool makePositive, double *p1, double *p2);
     9static bool get2Ints(int argnum, int *pArgc, char **argv, bool makePositive, int *p1, int *p2);
    1210
    1311static void usage (void)
     
    1513    fprintf(stderr, "\n");
    1614
    17     fprintf(stderr, "USAGE: ppstamp -celcenter RA DEC -arcrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    18     fprintf(stderr, "       ppstamp -celcenter RA DEC -celrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    19     fprintf(stderr, "       ppstamp -celcenter RA DEC -pixrange dx dy    [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    20     fprintf(stderr, "       ppstamp -pixcenter x y    -pixrange dx dy    -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    21     fprintf(stderr, "       ppstamp -pixcenter x y    -arcrange dRA dDEC -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    22     fprintf(stderr, "       ppstamp -pixcenter x y    -celrange dRA dDEC -chip chipname [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
    23     fprintf(stderr, "\n");
    24 
    25     fprintf(stderr, "celcenter & celrange may be specified in HH:MM:SS DD:MM:SS or as 2 values in decimal degrees\n");
    26     fprintf(stderr, "arcrange may be specfied as 2 values DD:MM:SS DD:MM:SS or decimal degrees\n");
     15    fprintf(stderr, "USAGE: ppstamp -skycenter RA DEC -pixrange dx dy    [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
     16    fprintf(stderr, "       ppstamp -skycenter RA DEC -arcrange dRA dDEC [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
     17    fprintf(stderr, "       ppstamp -pixcenter x y    -pixrange dx dy    [-chip chipname] [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
     18    fprintf(stderr, "       ppstamp -pixcenter x y    -arcrange dRA dDEC [-chip chipname] [-file INPUT.fits] [-list INPUT.txt] OUTPUT\n");
     19    fprintf(stderr, "\n");
     20
     21    fprintf(stderr, "-skycenter is specified as HH:MM:SS DD:MM:SS or decimal degrees\n");
     22    fprintf(stderr, "-arcrange values are seconds of arc\n");
    2723    fprintf(stderr, "\n");
    2824    fprintf(stderr, "Optional arguments:\n");
     
    5551    pmConfig *config = pmConfigRead(&argc, argv, NULL);
    5652    if (config == NULL) {
    57         psErrorStackPrint(stderr, "Can't find site configuration!\n");
    58         exit(EXIT_FAILURE);
     53        psError(PPSTAMP_ERR_CONFIG, false, "Can't read site configuration!\n");
     54        return(NULL);
    5955    }
    6056
     
    6763        psArgumentRemove(argnum, &argc, argv);
    6864
    69         if (!get2Ints(argnum, &argc, argv, &options->centerX, &options->centerY)) {
    70             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "invalid pixcenter specification\n");
    71             usage();
    72         }
    73     }
    74 
    75     if ((argnum = psArgumentGet(argc, argv, "-celcenter"))) {
     65        if (!get2Ints(argnum, &argc, argv, false, &options->centerX, &options->centerY)) {
     66            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid pixcenter specification: %s %s\n",
     67                argv[argnum], argv[argnum+1]);
     68            usage();
     69        }
     70        psArgumentRemove(argnum, &argc, argv);
     71        psArgumentRemove(argnum, &argc, argv);
     72    }
     73
     74    if ((argnum = psArgumentGet(argc, argv, "-skycenter"))) {
    7675        if (gotCenter) {
    77             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "can't specify both -pixcenter and -celcenter\n");;
     76            psError(PPSTAMP_ERR_ARGUMENTS, true, "can't specify both -pixcenter and -skycenter\n");;
    7877            usage();
    7978        }
     
    8180
    8281        double raDeg, decDeg;
    83         if (!get2Angles(argnum, &argc, argv, false, &raDeg, &decDeg)) {
    84             usage();
    85         }
     82        if (!get2Angles(argnum, &argc, argv, false, false, &raDeg, &decDeg)) {
     83            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid skycenter specification: %s %s\n",
     84                argv[argnum], argv[argnum+1]);
     85            usage();
     86        }
     87        psArgumentRemove(argnum, &argc, argv);
     88        psArgumentRemove(argnum, &argc, argv);
    8689        options->centerRA  = DEG_TO_RAD(raDeg);
    8790        options->centerDEC = DEG_TO_RAD(decDeg);
     
    9194
    9295    if (!gotCenter) {
    93         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify center of region of interest\n");
     96        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify center of region of interest\n");
    9497        usage();
    9598    }
     
    99102        options->celestialRange = false;
    100103        psArgumentRemove(argnum, &argc, argv);
    101         if (!get2Ints(argnum, &argc, argv, &options->dX, &options->dY)) {
    102             usage();
    103         }
     104        if (!get2Ints(argnum, &argc, argv, true, &options->dX, &options->dY)) {
     105            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid pixrange specification: %s %s\n",
     106                argv[argnum], argv[argnum+1]);
     107            usage();
     108        }
     109        psArgumentRemove(argnum, &argc, argv);
     110        psArgumentRemove(argnum, &argc, argv);
    104111    }
    105112
    106113    if ((argnum = psArgumentGet(argc, argv, "-arcrange"))) {
    107114        if (gotRange) {
    108             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "specify only one of -pixrange or -arcrange or -celrange\n");;
     115            psError(PPSTAMP_ERR_ARGUMENTS, true, "specify only one of -pixrange or -arcrange\n");;
    109116            usage();
    110117        }
     
    113120        options->celestialRange = true;
    114121
     122        // arcrange values are seconds of arc
     123        options->dRA  = DEG_TO_RAD(atof(argv[argnum]) * 3600.);
     124        options->dDEC = DEG_TO_RAD(atof(argv[argnum+1]) * 3600.);
     125
     126        psArgumentRemove(argnum, &argc, argv);
     127        psArgumentRemove(argnum, &argc, argv);
     128    }
     129    // I'm leaving in the -celrange option (HH:MM:SS DD:MM:SS), but not publicizing it
     130    if ((argnum = psArgumentGet(argc, argv, "-celrange"))) {
     131        if (gotRange) {
     132            psError(PPSTAMP_ERR_ARGUMENTS, true, "specify one of -pixrange, -arcrange, or -celrange\n");;
     133            usage();
     134        }
     135        psArgumentRemove(argnum, &argc, argv);
     136        gotRange = true;
     137        options->celestialRange = true;
     138
    115139        double deg1, deg2;
    116         if (!get2Angles(argnum, &argc, argv, true, &deg1, &deg2)) {
    117             usage();
    118         }
     140        if (!get2Angles(argnum, &argc, argv, false, true, &deg1, &deg2)) {
     141            psError(PPSTAMP_ERR_ARGUMENTS, true, "invalid celrange specification: %s %s\n",
     142                argv[argnum], argv[argnum+1]);
     143            usage();
     144        }
     145        psArgumentRemove(argnum, &argc, argv);
     146        psArgumentRemove(argnum, &argc, argv);
    119147        options->dRA = DEG_TO_RAD(deg1);
    120148        options->dDEC = DEG_TO_RAD(deg2);
    121149    }
    122     if ((argnum = psArgumentGet(argc, argv, "-celrange"))) {
    123         if (gotRange) {
    124             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "specify one of -pixrange or -arcrange or -celrange\n");;
    125             usage();
    126         }
    127         psArgumentRemove(argnum, &argc, argv);
    128         gotRange = true;
    129         options->celestialRange = true;
    130 
    131         double deg1, deg2;
    132         if (!get2Angles(argnum, &argc, argv, false, &deg1, &deg2)) {
    133             usage();
    134         }
    135         options->dRA = DEG_TO_RAD(deg1);
    136         options->dDEC = DEG_TO_RAD(deg2);
    137     }
    138150
    139151    if (!gotRange) {
    140         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify range\n");
     152        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify range\n");
    141153        usage();
    142154    }
     
    151163    bool status = pmConfigFileSetsMD (config->arguments, &argc, argv, "INPUT", "-file", "-list");
    152164    if (!status) {
    153         // TODO: shall we print a specific message?
    154         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify INPUT\n");
    155         usage ();
     165        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify INPUT\n");
     166        usage();
    156167    }
    157168
    158169    // finally the output file
    159     if (argc != 2) {
    160         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "must specify OUTPUT\n");
    161         usage ();
    162     }
    163 
    164     // Add the input and output images (which remain on the command-line) to the arguments list
     170    if (argc < 2) {
     171        psError(PPSTAMP_ERR_ARGUMENTS, true, "must specify OUTPUT\n");
     172        usage();
     173    } else if (argc > 2) {
     174        psError(PPSTAMP_ERR_ARGUMENTS, true, "unknown argument(s)\n");
     175        usage();
     176    }
     177
     178    // Add the output image (which remains on the command-line) to the arguments list
    165179    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "OUTPUT", 0, "Name of the output image", argv[1]);
    166180
     
    173187{
    174188    char *p = string;
     189
    175190    if ((*p == '+') || (*p == '-')) {
    176191        p++;
     
    179194}
    180195
    181 static bool get2Ints(int argnum, int *pArgc, char **argv, int *p1, int *p2)
     196static bool get2Ints(int argnum, int *pArgc, char **argv, bool makePositive, int *p1, int *p2)
    182197{
    183198    if (*pArgc < 2) {
     
    188203        return false;
    189204    }
    190 
    191205    *p1 = atoi(argv[argnum]);
    192     psArgumentRemove(argnum, pArgc, argv);
    193 
    194     if (!validNumber(argv[argnum])) {
     206
     207    if (!validNumber(argv[argnum+1])) {
    195208        return false;
    196209    }
    197 
    198     *p2 = atoi(argv[argnum]);
    199     psArgumentRemove(argnum, pArgc, argv);
     210    *p2 = atoi(argv[argnum+1]);
     211
     212    if (makePositive) {
     213        *p1 = abs(*p1);
     214        *p2 = abs(*p2);
     215    }
    200216
    201217    return true;
    202218}
    203219
    204 static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothInDegrees, double *p1, double *p2)
     220static bool get2Angles(int argnum, int *pArgc, char **argv, bool bothInDegrees, bool makePositive,
     221    double *p1, double *p2)
    205222{
    206223    bool rval;
     
    221238    }
    222239
    223     psArgumentRemove(argnum, pArgc, argv);
    224     psArgumentRemove(argnum, pArgc, argv);
     240    if (rval && makePositive) {
     241        *p1 = abs(*p1);
     242        *p2 = abs(*p2);
     243    }
    225244
    226245    return rval;
Note: See TracChangeset for help on using the changeset viewer.