Changeset 6575 for branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.c
- Timestamp:
- Mar 13, 2006, 4:23:40 PM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.c
r6570 r6575 4 4 5 5 #include "pmFPA.h" 6 #include "pmHDU.h" 7 #include "pmHDUGetLowest.h" 8 #include "pmConcepts.h" 6 9 #include "pmConceptsRead.h" 7 10 … … 88 91 default: 89 92 psError(PS_ERR_IO, true, "Concept %s (%s) is not of string type (%x) --- treating as " 90 "undefined.\n", name, item->comment, item->type);93 "undefined.\n", item->name, item->comment, item->type); 91 94 return psStringCopy(""); 92 95 } … … 98 101 // since the type is already known. 99 102 static psMetadataItem *parsePlain(psMetadataItem *concept, // The concept to parse 100 p mConceptSpec *spec // The concept specification103 psMetadataItem *pattern // The concept pattern 101 104 ) 102 105 { 103 psMetadataItem *blank = spec->blank;// The blank specification, which carries the name, comment, type 104 switch (blank->type) { 106 switch (pattern->type) { 105 107 case PS_DATA_STRING: { 106 108 psString string = parseString(concept); // Get the string, so I can free it after it goes on the MDI 107 psMetadataItem *item = psMetadataItemAllocStr( blank->name, blank->comment, string);109 psMetadataItem *item = psMetadataItemAllocStr(pattern->name, pattern->comment, string); 108 110 psFree(string); 109 111 return item; 110 112 } 111 113 case PS_DATA_S32: 112 return psMetadataItemAllocS32( blank->name, blank->comment, parseS32(concept));114 return psMetadataItemAllocS32(pattern->name, pattern->comment, parseS32(concept)); 113 115 case PS_DATA_F32: 114 return psMetadataItemAllocF32( blank->name, blank->comment, parseF32(concept));116 return psMetadataItemAllocF32(pattern->name, pattern->comment, parseF32(concept)); 115 117 case PS_DATA_F64: 116 return psMetadataItemAllocF64( blank->name, blank->comment, parseF64(concept));118 return psMetadataItemAllocF64(pattern->name, pattern->comment, parseF64(concept)); 117 119 default: 118 120 psLogMsg(__func__, PS_LOG_WARN, "Concept %s (%s) is not of a standard type (%x)\n", 119 blank->name, blank->comment, blank->type);121 pattern->name, pattern->comment, pattern->type); 120 122 return NULL; 121 123 } 122 }123 124 // Get the lowest HDU125 static pmHDU *getLowestHDU(pmFPA *fpa, // The FPA126 pmChip *chip, // The chip, or NULL127 pmCell *cell // The cell, or NULL128 )129 {130 pmHDU *hdu = NULL; // The HDU that's at the lowest level131 if (cell) {132 hdu = pmHDUFromCell(cell);133 } else if (chip) {134 hdu = pmHDUFromChip(chip);135 } else if (fpa) {136 hdu = pmHDUFromFPA(fpa);137 }138 139 return hdu;140 124 } 141 125 … … 154 138 psMetadataItem *parsed = NULL; // The parsed concept 155 139 if (spec->parse) { 156 parsed = spec->parse(concept, spec , cameraFormat, fpa, chip, cell);140 parsed = spec->parse(concept, spec->blank, cameraFormat, fpa, chip, cell); 157 141 } else { 158 142 parsed = parsePlain(concept, spec->blank); … … 160 144 161 145 // Reformat so that everything's clean 162 if (strcmp(spec->blank->name, parsed Item->name) != 0 ||163 strcmp(spec->blank->comment, parsed Item->comment) != 0) {146 if (strcmp(spec->blank->name, parsed->name) != 0 || 147 strcmp(spec->blank->comment, parsed->comment) != 0) { 164 148 psMetadataItem *cleaned = NULL; // Item that's been cleaned up --- correct name and comment 165 switch (spec-> type) {149 switch (spec->blank->type) { 166 150 case PS_DATA_STRING: 167 cleaned = psMetadataItemAllocStr(spec->blank->name, spec->blank->comment, concept->data.V);151 cleaned = psMetadataItemAllocStr(spec->blank->name, spec->blank->comment, parsed->data.V); 168 152 break; 169 153 case PS_DATA_S32: 170 cleaned = psMetadataItemAllocS32(spec->blank->name, spec->blank->comment, concept->data.S32);154 cleaned = psMetadataItemAllocS32(spec->blank->name, spec->blank->comment, parsed->data.S32); 171 155 break; 172 156 case PS_DATA_F32: 173 cleaned = psMetadataItemAllocF32(spec->blank->name, spec->blank->comment, concept->data.F32);157 cleaned = psMetadataItemAllocF32(spec->blank->name, spec->blank->comment, parsed->data.F32); 174 158 break; 175 159 case PS_DATA_F64: 176 cleaned = psMetadataItemAllocF64(spec->blank->name, spec->blank->comment, concept->data.F64);160 cleaned = psMetadataItemAllocF64(spec->blank->name, spec->blank->comment, parsed->data.F64); 177 161 break; 178 162 default: 179 163 cleaned = psMetadataItemAlloc(spec->blank->name, concept->type, spec->blank->comment, 180 concept->data.V);164 parsed->data.V); 181 165 } 182 166 psFree(parsed); … … 201 185 { 202 186 if (cell) { 203 pmHDU *hdu = getLowestHDU(NULL, NULL, cell); // The HDU at the lowest level187 pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level 204 188 psMetadata *cameraFormat = hdu->format; // The camera format 205 189 psMetadata *cellConfig = cell->config; // The camera configuration for this cell … … 214 198 // Check the SOURCE 215 199 psString nameSource = NULL; // String with the concept name and ".SOURCE" added 216 psStringAppend( nameSource, "%s.SOURCE", name);200 psStringAppend(&nameSource, "%s.SOURCE", name); 217 201 bool mdok = true; // Status of MD lookup 218 202 psString source = psMetadataLookupStr(&mdok, cell->config, nameSource); // The source … … 248 232 ) 249 233 { 250 bool mdok = true; // Status of MD lookup 234 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 235 psMetadata *cameraFormat = hdu->format; // The camera format 236 bool mdok = true; // Status of MD lookup 251 237 psMetadata *defaults = psMetadataLookupMD(&mdok, cameraFormat, "DEFAULTS"); // The DEFAULTS spec 252 238 if (mdok && defaults) { 253 pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level239 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 254 240 psMetadata *cameraFormat = hdu->format; // The camera format 255 241 psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator … … 274 260 ) 275 261 { 276 bool mdok = true; // Status of MD lookup 262 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 263 psMetadata *cameraFormat = hdu->format; // The camera format 264 bool mdok = true; // Status of MD lookup 277 265 psMetadata *transSpec = psMetadataLookupMD(&mdok, cameraFormat, "TRANSLATION"); // The TRANSLATION spec 278 266 if (mdok && transSpec) { 279 pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level267 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 280 268 psMetadata *cameraFormat = hdu->format; // The camera format 281 269 psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator … … 285 273 psString name = specItem->name; // The concept name 286 274 psString keywords = psMetadataLookupStr(&mdok, transSpec, name); // The FITS keywords 287 if (mdok && strlen(keyword ) > 0) {275 if (mdok && strlen(keywords) > 0) { 288 276 // In case there are multiple headers 289 277 psList *keys = psStringSplit(keywords, " ,;"); // List of keywords … … 294 282 } else { 295 283 psListIterator *keysIter = psListIteratorAlloc(keys, PS_LIST_HEAD, false); // Iterator 296 ps MetadataItem *key = NULL; // Item from iteration297 psList *values = psListAlloc( void); // List containing the values284 psString key = NULL; // Item from iteration 285 psList *values = psListAlloc(NULL); // List containing the values 298 286 while ((key = psListGetAndIncrement(keysIter))) { 299 287 psMetadataItem *value = psMetadataLookup(hdu->header, key); … … 325 313 ) 326 314 { 327 bool mdok = true; // Status of MD lookup 315 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 316 psMetadata *cameraFormat = hdu->format; // The camera format 317 bool mdok = true; // Status of MD lookup 328 318 psMetadata *dbSpec = psMetadataLookupMD(&mdok, cameraFormat, "DATABSE"); // The DATABASE spec 329 319 if (mdok && dbSpec) { 330 pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level320 pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level 331 321 psMetadata *cameraFormat = hdu->format; // The camera format 332 322 psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator … … 338 328 psMetadata *dbLookup = psMetadataLookupMD(&mdok, dbSpec, name); 339 329 if (mdok && dbLookup) { 340 const char *tableName = psMetadataLookupStr(&md Status, dbLookup, "TABLE"); // Table name330 const char *tableName = psMetadataLookupStr(&mdok, dbLookup, "TABLE"); // Table name 341 331 // Names of the "where" columns 342 const char *givenCols = psMetadataLookupStr(&md Status, dbLookup, "GIVENDBCOL");332 const char *givenCols = psMetadataLookupStr(&mdok, dbLookup, "GIVENDBCOL"); 343 333 // Values of the "where" columns 344 const char *givenPS = psMetadataLookupStr(&md Status, dbLookup, "GIVENPS");334 const char *givenPS = psMetadataLookupStr(&mdok, dbLookup, "GIVENPS"); 345 335 346 336 // Now, need to get the "given"s … … 352 342 psLogMsg(__func__, PS_LOG_WARN, 353 343 "The GIVENDBCOL and GIVENPS entries for %s do not have " 354 "the same number of entries --- ignored.\n", concept);344 "the same number of entries --- ignored.\n", name); 355 345 } else { 356 346 // Iterators for the lists … … 359 349 char *column = NULL; // Name of the column 360 350 while ((column = psListGetAndIncrement(colsIter))) { 361 char * name = psListGetAndIncrement(valuesIter); // Name for the value351 char *dependName = psListGetAndIncrement(valuesIter); // Name for the value 362 352 if (!strlen(column) || !strlen(name)) { 363 353 psLogMsg(__func__, PS_LOG_WARN, "One of the columns or value names for %s is " 364 " empty --- ignored.\n", concept);354 " empty --- ignored.\n", name); 365 355 } else { 366 356 // Search for the value name 367 psMetadataItem *item = pmConceptReadFromHeader(fpa, chip, cell, name); 368 if (! item) { 369 item = pmConceptReadFromDefault(fpa, chip, cell, name); 357 psMetadataItem *item = NULL; // The value 358 if (!item && cell) { 359 item = psMetadataLookup(cell->concepts, dependName); 360 } 361 if (!item && chip) { 362 item = psMetadataLookup(chip->concepts, dependName); 363 } 364 if (!item && fpa) { 365 item = psMetadataLookup(fpa->concepts, dependName); 370 366 } 371 367 if (! item) { 372 368 psLogMsg(__func__, PS_LOG_ERROR, "Unable to find the value name %s for DB" 373 " lookup on %s --- ignored.\n", name, concept);369 " lookup on %s --- ignored.\n", dependName, name); 374 370 } else { 375 371 // We need to create a new psMetadataItem. I don't think we can't 376 372 // simply hack the existing one, since that could conceivably cause 377 373 // memory leaks 378 psMetadataItem *newItem = psMetadataItemAlloc( concept, item->type,374 psMetadataItem *newItem = psMetadataItemAlloc(name, item->type, 379 375 item->comment, 380 376 item->data.V); … … 383 379 } 384 380 } 385 psFree( name);381 psFree(dependName); 386 382 psFree(column); 387 383 } // Iterating through the columns … … 395 391 if (dbResult->n == 0) { 396 392 psLogMsg(__func__, PS_LOG_WARN, 397 "Unable to find any rows in DB for %s --- ignored\n", concept);393 "Unable to find any rows in DB for %s --- ignored\n", name); 398 394 } else { 399 395 if (dbResult-> n > 1) { 400 396 psLogMsg(__func__, PS_LOG_WARN, 401 397 "Multiple rows returned in DB lookup for %s --- " 402 " using the first one only.\n", concept);398 " using the first one only.\n", name); 403 399 } 404 400 conceptItem = (psMetadataItem*)dbResult->data[0]; … … 406 402 407 403 // Now we have the result 408 conceptParse(spec, headerItem, cameraFormat, target, fpa, chip, cell);404 conceptParse(spec, conceptItem, cameraFormat, target, fpa, chip, cell); 409 405 410 406 } … … 425 421 426 422 427 #if 0423 #ifdef OLD 428 424 429 425 psMetadataItem *pmConceptReadFromCamera(pmCell *cell, // The cell
Note:
See TracChangeset
for help on using the changeset viewer.
