IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 7924 for trunk/ppStats


Ignore:
Timestamp:
Jul 17, 2006, 5:01:41 PM (20 years ago)
Author:
Paul Price
Message:

Cleaning up ppStatsSetup(). Bug fixes. Seems to be working.

Location:
trunk/ppStats/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ppStats/src/ppStatsLoop.c

    r7910 r7924  
    11#include <stdio.h>
     2#include <string.h>
    23#include <pslib.h>
    34#include <psmodules.h>
     
    2223}
    2324
     25static bool doThis(psList *toDoList,    // List of things to do
     26                   const char *this     // The name of "this"
     27    )
     28{
     29    if (psListLength(toDoList) == 0) {
     30        // No list --- do everything
     31        return true;
     32    }
     33
     34    psListIterator *iterator = psListIteratorAlloc(toDoList, PS_LIST_HEAD, false); // Iterator
     35    psString test;                      // Test string, from iteration
     36    while ((test = psListGetAndIncrement(iterator))) {
     37        if (strcmp(this, test) == 0) {
     38            // It's in the list --- do it
     39            psFree(iterator);
     40            return true;
     41        }
     42    }
     43    psFree(iterator);
     44    // Couldn't find it --- don't do it
     45    return false;
     46}
     47
    2448
    2549void ppStatsLoop(ppStatsData *data,     // The data
     
    5175        }
    5276        const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
     77
     78        // Check to see if this is a chip of interest
     79        if (!doThis(data->chips, chipName)) {
     80            continue;
     81        }
     82
    5383        psMetadata *chipResults = psMetadataAlloc(); // Metadata to hold the chip-level results
    5484
     
    6999            }
    70100            const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell
     101
     102            // Check to see if this is a cell of interest
     103            if (!doThis(data->cells, cellName)) {
     104                continue;
     105            }
     106
    71107            psMetadata *cellResults = psMetadataAlloc(); // Metadata to hold the cell-level results
    72108
     
    84120            if (!data->doStats) {
    85121                // Nothing further to do --- don't want to waste our time reading the data
     122                continue;
     123            }
     124
     125            pmHDU *hdu = pmHDUFromCell(cell); // HDU for cell
     126            if (!hdu || hdu->blankPHU) {
    86127                continue;
    87128            }
     
    192233    psFree(conceptsIter);
    193234
     235    if (psListLength(fpaResults->list) == 0) {
     236        psError(PS_ERR_UNKNOWN, true, "No output.\n");
     237        return;
     238    }
     239
    194240    psString output = psMetadataConfigFormat(fpaResults);
    195241    psFree(fpaResults);
  • trunk/ppStats/src/ppStatsSetup.c

    r7910 r7924  
    55
    66#include "ppStats.h"
     7#include "ppStatsData.h"
    78
    89// Print usage information and die
     
    1011    )
    1112{
    12     printf("Return statistics .\n\n"
     13    printf("Return headers, concepts and/or image statistics.\n\n"
    1314           "Usage:\n"
    14            "\t%s INPUT.fits OUTPUT.fits\n"
     15           "\t%s INPUT.fits OUTPUT_NAME\n"
    1516           "\n", config->argv[0]);
    1617    psArgumentHelp(config->arguments);
     
    2122    exit(EXIT_FAILURE);
    2223}
     24
     25// Generate a list from the arguments
     26static void listFromArguments(psMetadata *arguments, // Arguments to parse
     27                              const char *name, // Name of the item, for error message
     28                              const char *flag, // The flag for the argument of interest
     29                              psList *target // The target list
     30    )
     31{
     32    psString regex = NULL;              // Regular expression for the flag
     33    psStringAppend(&regex, "^%s$", flag);
     34    psMetadataIterator *iterator = psMetadataIteratorAlloc(arguments, PS_LIST_HEAD, regex); // Iterator
     35    psFree(regex);
     36    psMetadataItem *item;               // Item from iteration
     37    while ((item = psMetadataGetAndIncrement(iterator))) {
     38        if (item->type != PS_DATA_STRING) {
     39            psLogMsg(__func__, PS_LOG_WARN, "%s name is not of type STRING (%x) --- ignored.\n",
     40                     name, item->type);
     41            continue;
     42        }
     43        if (item->data.V && strlen(item->data.V) > 0) {
     44            psListAdd(target, PS_LIST_TAIL, item->data.V);
     45        }
     46    }
     47    psFree(iterator);
     48
     49    return;
     50}
     51
     52// Strings in a recipe may be defined multiply (with MULTI) or listed on a single line
     53static void listFromRecipe(psMetadata *recipe, // Recipe to search
     54                           const char *name, // Name for item within recipe
     55                           psList *target // The target list
     56    )
     57{
     58    // If the list already has entries, don't read anything else
     59    if (psListLength(target) > 0) {
     60        return;
     61    }
     62
     63    // First check that at least one item of interest exists
     64    psMetadataItem *checkItem = psMetadataLookup(recipe, name);
     65    if (!checkItem) {
     66        // Nothing to see here
     67        return;
     68    }
     69
     70    psString regex = NULL;              // Regular expression for the flag
     71    psStringAppend(&regex, "^%s$", name);
     72    psMetadataIterator *iterator = psMetadataIteratorAlloc(recipe, PS_LIST_HEAD, regex);
     73    psFree(regex);
     74    psMetadataItem *item;
     75    int numItem = 0; // Occurrence of the item in the recipe; to help the user in case of trouble
     76    while ((item = psMetadataGetAndIncrement(iterator))) {
     77        numItem++;
     78        if (item->type != PS_DATA_STRING) {
     79            psLogMsg(__func__, PS_LOG_WARN, "Occurrence %d of %s in the recipe is "
     80                     "not of type STRING (%x) --- ignored.\n", numItem, name, item->type);
     81            continue;
     82        }
     83        // Parse into a list of independent values
     84        psList *values = psStringSplit(item->data.V, " ,;", false);
     85        // Copy into the target
     86        psListIterator *valuesIter = psListIteratorAlloc(values, PS_LIST_HEAD, false);
     87        psString valueString;
     88        while ((valueString = psListGetAndIncrement(valuesIter))) {
     89            psListAdd(target, PS_LIST_TAIL, valueString);
     90        }
     91        psFree(valuesIter);
     92        psFree(values);
     93    }
     94    psFree(iterator);
     95
     96    return;
     97}
     98
     99// Set the statistics option; for arguments
     100static inline void statsOptionArguments(psMetadata *arguments, // Arguments to parse
     101                                        const char *name, // Name for option
     102                                        ppStatsData *data, // Configuration data
     103                                        psStatsOptions option // Option to check for
     104    )
     105{
     106    if (psMetadataLookupBool(NULL, arguments, name)) {
     107        data->stats->options |= option;
     108        data->doStats = true;
     109    }
     110    return;
     111}
     112
     113// Print out what we're going to do, from the list
     114static void checkList(psList *list,     // List
     115                      const char *name  // Name of list
     116    )
     117{
     118    psString value;
     119    psListIterator *iterator = psListIteratorAlloc(list, PS_LIST_HEAD, false);
     120    while ((value = psListGetAndIncrement(iterator))) {
     121        printf("%s: %s\n", name, value);
     122    }
     123    psFree(iterator);
     124    return;
     125}
     126
    23127
    24128ppStatsData *ppStatsSetup(pmConfig *config // Configuration
     
    43147    psMetadataAddBool(arguments, PS_LIST_TAIL, "-clipped-stdev", 0, "Calculate clipped standard deviation", false);
    44148    psMetadataAddS32(arguments, PS_LIST_TAIL, "-iter", 0, "Clipping iterations", 0);
    45     psMetadataAddF32(arguments, PS_LIST_TAIL, "-rej", 0, "Clipping level", NAN);
     149    psMetadataAddF32(arguments, PS_LIST_TAIL, "-rej", 0, "Clipping level", 0.0);
    46150    psMetadataAddS32(arguments, PS_LIST_TAIL, "-sample", 0, "Sampling fraction", 0.0);
    47151
     
    60164    data->outName = config->argv[2];
    61165
    62     // Get the list of chips, cells and headers
    63     #define GET_LIST_FROM_ARGUMENTS(NAME, FLAG, TARGET) { \
    64         psMetadataIterator *iterator = psMetadataIteratorAlloc(arguments, PS_LIST_HEAD, "^" FLAG "$"); \
    65         psMetadataItem *item; \
    66         while ((item = psMetadataGetAndIncrement(iterator))) { \
    67             if (item->type != PS_DATA_STRING) { \
    68                 psLogMsg(__func__, PS_LOG_WARN, NAME " name is not of type STRING (%x) --- ignored.\n", \
    69                          item->type); \
    70                 continue; \
    71             } \
    72             psListAdd(TARGET, PS_LIST_TAIL, item->data.V); \
    73         } \
    74         psFree(iterator); \
    75     }
    76 
    77     GET_LIST_FROM_ARGUMENTS("Chip", "-chip", data->chips);
    78     GET_LIST_FROM_ARGUMENTS("Cell", "-cell", data->cells);
    79     GET_LIST_FROM_ARGUMENTS("Header", "-header", data->headers);
    80     GET_LIST_FROM_ARGUMENTS("Concept", "-concept", data->concepts);
     166    listFromArguments(arguments, "Chip", "-chip", data->chips);
     167    listFromArguments(arguments, "Cell", "-cell", data->cells);
     168    listFromArguments(arguments, "Header", "-header", data->headers);
     169    listFromArguments(arguments, "Concept", "-concept", data->concepts);
    81170
    82171    // Set the statistics options
    83     #define STATS_OPTION(NAME, SYMBOL) \
    84     if (psMetadataLookupBool(NULL, arguments, NAME)) { \
    85         data->stats->options |= SYMBOL; \
    86         data->doStats = true; \
    87     } \
    88 
    89     STATS_OPTION("-mean",     PS_STAT_SAMPLE_MEAN);
    90     STATS_OPTION("-stdev",    PS_STAT_SAMPLE_STDEV);
    91     STATS_OPTION("-median",   PS_STAT_SAMPLE_MEDIAN);
    92     STATS_OPTION("-quartile", PS_STAT_SAMPLE_QUARTILE);
    93     STATS_OPTION("-robust-median",   PS_STAT_ROBUST_MEDIAN);
    94     STATS_OPTION("-robust-stdev",    PS_STAT_ROBUST_STDEV);
    95     STATS_OPTION("-robust-quartile", PS_STAT_ROBUST_QUARTILE);
    96     STATS_OPTION("-fitted-mean",   PS_STAT_FITTED_MEAN);
    97     STATS_OPTION("-fitted-stdev",  PS_STAT_FITTED_STDEV);
    98     STATS_OPTION("-clipped-mean",  PS_STAT_CLIPPED_MEAN);
    99     STATS_OPTION("-clipped-stdev", PS_STAT_CLIPPED_STDEV);
     172    statsOptionArguments(arguments, "-mean", data,     PS_STAT_SAMPLE_MEAN);
     173    statsOptionArguments(arguments, "-stdev", data,    PS_STAT_SAMPLE_STDEV);
     174    statsOptionArguments(arguments, "-median", data,   PS_STAT_SAMPLE_MEDIAN);
     175    statsOptionArguments(arguments, "-quartile", data, PS_STAT_SAMPLE_QUARTILE);
     176    statsOptionArguments(arguments, "-robust-median", data,   PS_STAT_ROBUST_MEDIAN);
     177    statsOptionArguments(arguments, "-robust-stdev", data,    PS_STAT_ROBUST_STDEV);
     178    statsOptionArguments(arguments, "-robust-quartile", data, PS_STAT_ROBUST_QUARTILE);
     179    statsOptionArguments(arguments, "-fitted-mean", data,   PS_STAT_FITTED_MEAN);
     180    statsOptionArguments(arguments, "-fitted-stdev", data,  PS_STAT_FITTED_STDEV);
     181    statsOptionArguments(arguments, "-clipped-mean", data,  PS_STAT_CLIPPED_MEAN);
     182    statsOptionArguments(arguments, "-clipped-stdev", data, PS_STAT_CLIPPED_STDEV);
    100183    data->stats->clipSigma = psMetadataLookupF32(NULL, arguments, "-rej");
    101184    data->stats->clipIter = psMetadataLookupS32(NULL, arguments, "-iter");
     
    150233    }
    151234
    152     // Strings in a recipe may be defined multiply (with MULTI) or listed on a single line
    153     #define GET_LIST_FROM_RECIPE(NAME, TARGET) \
    154     if (psListLength(TARGET) < 0) { \
    155         psMetadataIterator *iterator = psMetadataIteratorAlloc(recipe, PS_LIST_HEAD, "^" NAME "$"); \
    156         psMetadataItem *item; \
    157         int numItem = 0; /* Occurrence of the item in the recipe; to help the user in case of trouble */ \
    158         while ((item = psMetadataGetAndIncrement(iterator))) { \
    159             numItem++; \
    160             if (item->type != PS_DATA_STRING) { \
    161                 psLogMsg(__func__, PS_LOG_WARN, NAME "Occurrence %d of %s in the recipe is " \
    162                          "not of type STRING (%x) --- ignored.\n", numItem, NAME, item->type); \
    163                 continue; \
    164             } \
    165             /* Parse into a list of independent values */ \
    166             psList *values = psStringSplit(item->data.V, " ,;", false); \
    167             /* Copy into the target */ \
    168             psListIterator *valuesIter = psListIteratorAlloc(values, PS_LIST_HEAD, false); \
    169             psString valueString; \
    170             while ((valueString = psListGetAndIncrement(valuesIter))) { \
    171                 psListAdd(TARGET, PS_LIST_TAIL, valueString); \
    172             } \
    173             psFree(valuesIter); \
    174             psFree(values); \
    175         } \
    176         psFree(iterator);\
    177     }
    178 
    179     GET_LIST_FROM_RECIPE("CHIPS", data->chips);
    180     GET_LIST_FROM_RECIPE("CELLS", data->cells);
    181     GET_LIST_FROM_RECIPE("HEADER", data->headers);
    182     GET_LIST_FROM_RECIPE("CONCEPT", data->concepts);
     235    listFromRecipe(recipe, "CHIP", data->chips);
     236    listFromRecipe(recipe, "CELL", data->cells);
     237    listFromRecipe(recipe, "HEADER", data->headers);
     238    listFromRecipe(recipe, "CONCEPT", data->concepts);
    183239
    184240    // Parse the statistics options
    185241    psList *recipeStats = psListAlloc(NULL);
    186     GET_LIST_FROM_RECIPE("STATS", recipeStats);
     242    listFromRecipe(recipe, "STAT", recipeStats);
    187243    if (psListLength(recipeStats) > 0) {
    188244        psListIterator *iterator = psListIteratorAlloc(recipeStats, PS_LIST_HEAD, false);
    189245        psString stat;
     246
    190247
    191248        #define CHECK_STAT(NAME, SYMBOL) \
     
    240297                     "retaining default.\n");
    241298        }
    242 
    243299    }
    244300
     
    260316    }
    261317
     318    // Print out what we're going to do
     319    if (psTraceGetLevel(__func__) > 9) {
     320        checkList(data->chips, "CHIP");
     321        checkList(data->cells, "CELL");
     322        checkList(data->headers, "HEADER");
     323        checkList(data->concepts, "CONCEPT");
     324    }
    262325
    263326    return data;
Note: See TracChangeset for help on using the changeset viewer.