Changeset 7924
- Timestamp:
- Jul 17, 2006, 5:01:41 PM (20 years ago)
- Location:
- trunk/ppStats/src
- Files:
-
- 2 edited
-
ppStatsLoop.c (modified) (6 diffs)
-
ppStatsSetup.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ppStats/src/ppStatsLoop.c
r7910 r7924 1 1 #include <stdio.h> 2 #include <string.h> 2 3 #include <pslib.h> 3 4 #include <psmodules.h> … … 22 23 } 23 24 25 static 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 24 48 25 49 void ppStatsLoop(ppStatsData *data, // The data … … 51 75 } 52 76 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 53 83 psMetadata *chipResults = psMetadataAlloc(); // Metadata to hold the chip-level results 54 84 … … 69 99 } 70 100 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 71 107 psMetadata *cellResults = psMetadataAlloc(); // Metadata to hold the cell-level results 72 108 … … 84 120 if (!data->doStats) { 85 121 // 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) { 86 127 continue; 87 128 } … … 192 233 psFree(conceptsIter); 193 234 235 if (psListLength(fpaResults->list) == 0) { 236 psError(PS_ERR_UNKNOWN, true, "No output.\n"); 237 return; 238 } 239 194 240 psString output = psMetadataConfigFormat(fpaResults); 195 241 psFree(fpaResults); -
trunk/ppStats/src/ppStatsSetup.c
r7910 r7924 5 5 6 6 #include "ppStats.h" 7 #include "ppStatsData.h" 7 8 8 9 // Print usage information and die … … 10 11 ) 11 12 { 12 printf("Return statistics.\n\n"13 printf("Return headers, concepts and/or image statistics.\n\n" 13 14 "Usage:\n" 14 "\t%s INPUT.fits OUTPUT .fits\n"15 "\t%s INPUT.fits OUTPUT_NAME\n" 15 16 "\n", config->argv[0]); 16 17 psArgumentHelp(config->arguments); … … 21 22 exit(EXIT_FAILURE); 22 23 } 24 25 // Generate a list from the arguments 26 static 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(®ex, "^%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 53 static 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(®ex, "^%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 100 static 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 114 static 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 23 127 24 128 ppStatsData *ppStatsSetup(pmConfig *config // Configuration … … 43 147 psMetadataAddBool(arguments, PS_LIST_TAIL, "-clipped-stdev", 0, "Calculate clipped standard deviation", false); 44 148 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); 46 150 psMetadataAddS32(arguments, PS_LIST_TAIL, "-sample", 0, "Sampling fraction", 0.0); 47 151 … … 60 164 data->outName = config->argv[2]; 61 165 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); 81 170 82 171 // 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); 100 183 data->stats->clipSigma = psMetadataLookupF32(NULL, arguments, "-rej"); 101 184 data->stats->clipIter = psMetadataLookupS32(NULL, arguments, "-iter"); … … 150 233 } 151 234 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); 183 239 184 240 // Parse the statistics options 185 241 psList *recipeStats = psListAlloc(NULL); 186 GET_LIST_FROM_RECIPE("STATS", recipeStats);242 listFromRecipe(recipe, "STAT", recipeStats); 187 243 if (psListLength(recipeStats) > 0) { 188 244 psListIterator *iterator = psListIteratorAlloc(recipeStats, PS_LIST_HEAD, false); 189 245 psString stat; 246 190 247 191 248 #define CHECK_STAT(NAME, SYMBOL) \ … … 240 297 "retaining default.\n"); 241 298 } 242 243 299 } 244 300 … … 260 316 } 261 317 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 } 262 325 263 326 return data;
Note:
See TracChangeset
for help on using the changeset viewer.
