Changeset 30193 for trunk/ippToPsps/src/DetectionBatch.c
- Timestamp:
- Dec 28, 2010, 10:40:28 AM (15 years ago)
- File:
-
- 1 edited
-
trunk/ippToPsps/src/DetectionBatch.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippToPsps/src/DetectionBatch.c
r30189 r30193 1 1 #include "DetectionBatch.h" 2 2 #include "DetectionBatchEnums.h" 3 4 /** 5 Source for all methods in the DetectionBatch class 6 */ 3 7 4 8 /** … … 14 18 15 19 /** 16 Does the work. 20 Does the work. Loops through the provided smf files, tallies the contents with the DVO database already connected to and generates a new FITS file of the fomat required by PSPS (i.e. a binary table per PSPS database table) 17 21 */ 18 22 static int run(DetectionBatch* this) { … … 82 86 83 87 // stuff for detections table 84 uint32_t s,d, invalidDvoRows, unmatched, totalDetections= 0;88 uint32_t s,d, invalidDvoRows, nChipDetectionsOut = 0; 85 89 86 90 long longnull = -999; … … 122 126 short nOta = 0; 123 127 long i; 124 bool isDuplicate;125 128 uint32_t numOfDuplicates, numInvalidFlux, numOfInvalidIppIDet; 126 long numDetectionsOut,totalDetectionsOut = 0, numPhotoRef, totalNumPhotoRef = 0;129 long totalDetectionsOut = 0, numPhotoRef, totalNumPhotoRef = 0; 127 130 long* removeList = (long*)calloc(this->MAXDETECT, sizeof(long)); 128 131 long thisObjId; … … 220 223 nOta++; 221 224 222 long n Det= 0;223 if (fits_get_num_rows(fitsIn, &n Det, &status)) {225 long nChipDetectionsIn = 0; 226 if (fits_get_num_rows(fitsIn, &nChipDetectionsIn, &status)) { 224 227 fits_report_error(stderr, status); 225 228 } 226 229 227 230 // loop round detections to populate some extra stuff 228 s = d = totalDetections = invalidDvoRows = unmatched= 0;231 s = d = nChipDetectionsOut = invalidDvoRows = 0; 229 232 230 233 // determine column numbers for certain IPP detection columns … … 244 247 245 248 anynull = 0; 246 fits_read_col(fitsIn, TLONG, ippIDetNum, 1, 1, n Det, &longnull, ippIDet, &anynull, &status);247 fits_read_col(fitsIn, TFLOAT, instMagNum, 1, 1, n Det, &floatnull, instMag, &anynull, &status);248 fits_read_col(fitsIn, TFLOAT, instMagErrNum, 1, 1, n Det, &floatnull, instMagErr, &anynull, &status);249 fits_read_col(fitsIn, TFLOAT, peakMagNum, 1, 1, n Det, &floatnull, peakMag, &anynull, &status);249 fits_read_col(fitsIn, TLONG, ippIDetNum, 1, 1, nChipDetectionsIn, &longnull, ippIDet, &anynull, &status); 250 fits_read_col(fitsIn, TFLOAT, instMagNum, 1, 1, nChipDetectionsIn, &floatnull, instMag, &anynull, &status); 251 fits_read_col(fitsIn, TFLOAT, instMagErrNum, 1, 1, nChipDetectionsIn, &floatnull, instMagErr, &anynull, &status); 252 fits_read_col(fitsIn, TFLOAT, peakMagNum, 1, 1, nChipDetectionsIn, &floatnull, peakMag, &anynull, &status); 250 253 251 254 // DVO detections are ordered by IPP_IDET, which increments from 0 in SMF table … … 254 257 numInvalidFlux = 0; 255 258 numOfInvalidIppIDet = 0; 256 for (long s = 0; s<nDet; s++) { 257 258 isDuplicate = false; 259 260 // catch crazy large or negative IPP_IDET 259 260 // loop through all detections in smf file extension for this chip. 261 // there are three ways for a detection to be ommitted from the final FITS output: 262 // 1. it has a duplicate obj ID to a previous detection 263 // 2. it has an invalid detection ID (< 0 or > max DVO det ID) 264 // 3. it has an invalid flux value 265 for (long s = 0; s<nChipDetectionsIn; s++) { 266 267 // catch crazy large or negative IPP_IDET, and skip them 261 268 if (ippIDet[s] < 0 || ippIDet[s] > maxDvoDetId) { 262 269 263 270 removeList[numOfDuplicates+numInvalidFlux+numOfInvalidIppIDet] = s+1; 264 271 numOfInvalidIppIDet++; 272 continue; 265 273 } 266 else { 267 while (ippIDet[s] > dvoDetections[d].meas.detID && dvoDetections[d].meas.detID <= maxDvoDetId) {268 269 d++; 270 if (!dvoDetections[d].valid) invalidDvoRows++;271 }274 275 // loop forward through DVO detections until we find corresponding detection ID 276 while (ippIDet[s] > dvoDetections[d].meas.detID && dvoDetections[d].meas.detID <= maxDvoDetId) { 277 278 d++; 279 if (!dvoDetections[d].valid) invalidDvoRows++; 272 280 } 281 282 // if we have found matching detection IDs then continue to populate other columns 273 283 if (ippIDet[s] == dvoDetections[d].meas.detID ) { 274 284 275 // TODO HACK duplicates bug - don't include any duplicates285 // check if we have already seen this obj ID, and if we have, skip this detection 276 286 thisObjId = dvoDetections[d].ave.extID; 277 for (i=0; i<totalDetections; i++) { 287 bool isDuplicate = false; 288 for (i=0; i<s; i++) { 278 289 if (thisObjId == objID[i]) { 279 290 removeList[numOfDuplicates+numInvalidFlux+numOfInvalidIppIDet] = s+1; … … 283 294 } 284 295 } 296 if (isDuplicate) continue; 297 285 298 // populate some arrays to be shoved in table in bulk later 286 299 objID[s] = thisObjId; … … 298 311 instFluxOk = getFlux(exposureTime, instMag[s], &instFlux[s], instMagErr[s], &instFluxErr[s]); 299 312 300 // check for invalid flux values (if not already labelled as a duplicate)301 if ( (!peakFluxOk || !instFluxOk) && !isDuplicate) {313 // check for invalid flux values, and skip them 314 if ( !peakFluxOk || !instFluxOk) { 302 315 removeList[numOfDuplicates+numInvalidFlux+numOfInvalidIppIDet] = s+1; 303 316 numInvalidFlux++; 317 continue; 304 318 } 305 else { 306 307 // store max/min objID 308 if (objID[s] > maxObjID) maxObjID = objID[s]; 309 if (objID[s] < minObjID) minObjID = objID[s]; 310 } 311 totalDetections++; 319 320 // store max/min objID 321 if (objID[s] > maxObjID) maxObjID = objID[s]; 322 if (objID[s] < minObjID) minObjID = objID[s]; 323 324 nChipDetectionsOut++; 312 325 } 313 // if we get here then we cannot find this smf detection in DVO 314 else { 315 316 unmatched++; 317 continue; 318 } 319 320 if (dvoDetections[d].meas.detID == maxDvoDetId) break; 321 } 326 } // end of loop round detections 322 327 323 328 // write number of rows (detections) to ImageMeta 324 numDetectionsOut = totalDetections - numOfDuplicates - numInvalidFlux; 325 fits_write_col(this->base.fitsOut, TLONG, IMAGEMETA_NDETECT, 1, 1, 1, &numDetectionsOut, &status); 329 fits_write_col(this->base.fitsOut, TLONG, IMAGEMETA_NDETECT, 1, 1, 1, &nChipDetectionsOut, &status); 330 331 int totalRemove = numOfDuplicates+numInvalidFlux+numOfInvalidIppIDet; 326 332 327 333 // avoid writing out an empty table of detections 328 if (n umDetectionsOut > 0) {334 if (nChipDetectionsOut > 0) { 329 335 330 336 // detections 331 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nDet, "Detection", false); 332 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_OBJID, 1, 1, nDet, objID, &status); 333 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_DETECTID, 1, 1, nDet, detectID, &status); 334 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IPPOBJID, 1, 1, nDet, ippObjID, &status); 335 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IPPDETECTID, 1, 1, nDet, ippDetectID, &status); 336 fits_write_col(this->base.fitsOut, TBYTE, DETECTION_FILTERID, 1, 1, nDet, filterIDs, &status); 337 fits_write_col(this->base.fitsOut, TBYTE, DETECTION_SURVEYID, 1, 1, nDet, surveyIDs, &status); 338 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IMAGEID, 1, 1, nDet, imageID, &status); 339 fits_write_col(this->base.fitsOut, TDOUBLE, DETECTION_OBSTIME, 1, 1, nDet, obsTimes, &status); 340 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_INSTFLUX, 1, 1, nDet, instFlux, &status); 341 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_INSTFLUXERR, 1, 1, nDet, instFluxErr, &status); 342 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_PEAKADU, 1, 1, nDet, peakFlux, &status); 343 fits_write_col(this->base.fitsOut, TSTRING, DETECTION_ASSOCDATE, 1, 1, nDet, assocDate, &status); 344 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_INFOFLAG, 1, 1, nDet, flags, &status); 345 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->base.fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 337 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nChipDetectionsIn, "Detection", false); 338 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_OBJID, 1, 1, nChipDetectionsIn, objID, &status); 339 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_DETECTID, 1, 1, nChipDetectionsIn, detectID, &status); 340 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IPPOBJID, 1, 1, nChipDetectionsIn, ippObjID, &status); 341 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IPPDETECTID, 1, 1, nChipDetectionsIn, ippDetectID, &status); 342 fits_write_col(this->base.fitsOut, TBYTE, DETECTION_FILTERID, 1, 1, nChipDetectionsIn, filterIDs, &status); 343 fits_write_col(this->base.fitsOut, TBYTE, DETECTION_SURVEYID, 1, 1, nChipDetectionsIn, surveyIDs, &status); 344 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_IMAGEID, 1, 1, nChipDetectionsIn, imageID, &status); 345 fits_write_col(this->base.fitsOut, TDOUBLE, DETECTION_OBSTIME, 1, 1, nChipDetectionsIn, obsTimes, &status); 346 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_INSTFLUX, 1, 1, nChipDetectionsIn, instFlux, &status); 347 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_INSTFLUXERR, 1, 1, nChipDetectionsIn, instFluxErr, &status); 348 fits_write_col(this->base.fitsOut, TFLOAT, DETECTION_PEAKADU, 1, 1, nChipDetectionsIn, peakFlux, &status); 349 fits_write_col(this->base.fitsOut, TSTRING, DETECTION_ASSOCDATE, 1, 1, nChipDetectionsIn, assocDate, &status); 350 fits_write_col(this->base.fitsOut, TLONGLONG, DETECTION_INFOFLAG, 1, 1, nChipDetectionsIn, flags, &status); 351 if (numOfDuplicates||numInvalidFlux||numOfInvalidIppIDet) 352 fits_delete_rowlist(this->base.fitsOut, removeList, totalRemove, &status); 346 353 347 354 // skinny object 348 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nDet, "SkinnyObject", false); 349 fits_write_col(this->base.fitsOut, TLONGLONG, SKINNYOBJECT_OBJID, 1, 1, nDet, objID, &status); 350 fits_write_col(this->base.fitsOut, TLONGLONG, SKINNYOBJECT_IPPOBJID, 1, 1, nDet, ippObjID, &status); 351 fits_write_col(this->base.fitsOut, TBYTE, SKINNYOBJECT_SURVEYID, 1, 1, nDet, surveyIDs, &status); 352 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->base.fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 355 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nChipDetectionsIn, "SkinnyObject", false); 356 fits_write_col(this->base.fitsOut, TLONGLONG, SKINNYOBJECT_OBJID, 1, 1, nChipDetectionsIn, objID, &status); 357 fits_write_col(this->base.fitsOut, TLONGLONG, SKINNYOBJECT_IPPOBJID, 1, 1, nChipDetectionsIn, ippObjID, &status); 358 fits_write_col(this->base.fitsOut, TBYTE, SKINNYOBJECT_SURVEYID, 1, 1, nChipDetectionsIn, surveyIDs, &status); 359 if (numOfDuplicates||numInvalidFlux||numOfInvalidIppIDet) 360 fits_delete_rowlist(this->base.fitsOut, removeList, totalRemove, &status); 353 361 354 362 // object calibration color 355 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nDet, "ObjectCalColor", false); 356 fits_write_col(this->base.fitsOut, TLONGLONG, OBJECTCALCOLOR_OBJID, 1, 1, nDet, objID, &status); 357 fits_write_col(this->base.fitsOut, TLONGLONG, OBJECTCALCOLOR_IPPOBJID, 1, 1, nDet, ippObjID, &status); 358 fits_write_col(this->base.fitsOut, TBYTE, OBJECTCALCOLOR_FILTERID, 1, 1, nDet, filterIDs, &status); 359 if (numOfDuplicates||numInvalidFlux) fits_delete_rowlist(this->base.fitsOut, removeList, numOfDuplicates+numInvalidFlux, &status); 363 ippToPspsConfig_writeTable(this->base.config, fitsIn, this->base.fitsOut, nChipDetectionsIn, "ObjectCalColor", false); 364 fits_write_col(this->base.fitsOut, TLONGLONG, OBJECTCALCOLOR_OBJID, 1, 1, nChipDetectionsIn, objID, &status); 365 fits_write_col(this->base.fitsOut, TLONGLONG, OBJECTCALCOLOR_IPPOBJID, 1, 1, nChipDetectionsIn, ippObjID, &status); 366 fits_write_col(this->base.fitsOut, TBYTE, OBJECTCALCOLOR_FILTERID, 1, 1, nChipDetectionsIn, filterIDs, &status); 367 if (numOfDuplicates||numInvalidFlux||numOfInvalidIppIDet) 368 fits_delete_rowlist(this->base.fitsOut, removeList, totalRemove, &status); 360 369 } 361 370 362 371 psLogMsg("ippToPsps", PS_LOG_INFO, 363 "+-----------+---------+----------+---------------- --+---------------+--------------+\n"364 "| Extension | Rows in | Rows out | Missing from DVO | Duplicate IDs | Invalid Flux|\n"365 "| %s | %5ld | %5 ld | %5d | %5d| %5d |\n",366 extensionName, n Det, numDetectionsOut, unmatched, numOfDuplicates, numInvalidFlux);367 368 totalDetectionsOut += n umDetectionsOut;372 "+-----------+---------+----------+----------------+--------------+--------------+\n" 373 "| Extension | Rows in | Rows out | Duplicate IDs | Invalid Flux | Bogus det ID |\n" 374 "| %s | %5ld | %5d | %5d | %5d | %5d |\n", 375 extensionName, nChipDetectionsIn, nChipDetectionsOut, numOfDuplicates, numInvalidFlux, numOfInvalidIppIDet); 376 377 totalDetectionsOut += nChipDetectionsOut; 369 378 370 379 if (dvoDetections!= NULL) dvoFree(dvoDetections); … … 492 501 493 502 /** 494 Constructor 503 Constructor. Returns a new DetectionBatch object. 495 504 */ 496 505 DetectionBatch* new_DetectionBatch(int *argc, char **argv) {
Note:
See TracChangeset
for help on using the changeset viewer.
