Changeset 38753
- Timestamp:
- Sep 17, 2015, 8:27:18 PM (11 years ago)
- Location:
- branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src
- Files:
-
- 2 edited
-
dvomergeUpdate_catalogs.c (modified) (2 diffs)
-
dvorepairDeleteImagesByExternID.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c
r38651 r38753 207 207 } 208 208 209 if (!dvo_catalog_backup (&outcatalog, TRUE)) {209 if (!dvo_catalog_backup (&outcatalog, "~", TRUE)) { 210 210 fprintf (stderr, "ERROR: failed to make backup for catalog %s\n", outlist[0].filename[j]); 211 211 exit (1); … … 218 218 SetProtect (FALSE); 219 219 220 if (!dvo_catalog_unlink_backup (&outcatalog, TRUE)) {220 if (!dvo_catalog_unlink_backup (&outcatalog, "~", TRUE)) { 221 221 fprintf (stderr, "WARNING: failed to remove backup for catalog %s\n", outlist[0].filename[j]); 222 222 } -
branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c
r38730 r38753 16 16 int SaveImageTable (Image *image, off_t Nimage, char *catdir, FITS_DB *oldDB); 17 17 Image *DeleteSelectedImages (Image *image, off_t Nimage, int *deleteImage, myIndexType *imageIDindex, off_t *NnewImage); 18 int DeleteLensing (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete); 19 int DeleteMeasure (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete); 20 int RepairAverage (Catalog *catalog); 18 21 19 22 int dvorepairDeleteImagesByExternID (int argc, char **argv) { … … 21 24 FITS_DB db; // database handle pointing to input image table 22 25 23 int i, j, N, NmeasureNew, Ndelete, Nvalid;24 off_t Nimage , Nmeasure;26 int i, N; 27 off_t Nimage; 25 28 int nPass, raPass; 26 29 27 30 Image *image; 28 Measure *measure;29 Measure *measureNew;30 31 char *cpmFilenameSrc = NULL;32 char *cptFilenameSrc = NULL;33 char *cpsFilenameSrc = NULL;34 char *cpmFilenameTgt = NULL;35 char *cptFilenameTgt = NULL;36 char *cpsFilenameTgt = NULL;37 38 31 char *imageFilename = NULL; 39 40 DVOCatFormat catformat;41 32 42 33 N = get_argument (argc, argv, "-delete-images-by-extern-id"); … … 196 187 } 197 188 198 ALLOCATE(cpmFilenameSrc, char, strlen(catdir) + 64); 199 ALLOCATE(cptFilenameSrc, char, strlen(catdir) + 64); 200 ALLOCATE(cpsFilenameSrc, char, strlen(catdir) + 64); 201 ALLOCATE(cpmFilenameTgt, char, strlen(catdir) + 64); 202 ALLOCATE(cptFilenameTgt, char, strlen(catdir) + 64); 203 ALLOCATE(cpsFilenameTgt, char, strlen(catdir) + 64); 204 205 int NdeleteTotal = 0; 189 int NmeasureDelTotal = 0; 190 int NlensingDelTotal = 0; 206 191 207 192 for (raPass = 0; raPass < nPass; raPass++) { … … 231 216 232 217 // loop over the populated input regions 233 int Ncheck = 0;234 218 for (i = 0; i < inlist[0].Nregions; i++) { 235 219 if (!inlist[0].regions[i][0].table) continue; 236 220 237 sprintf (cpmFilenameSrc, "%s/%s.cpm", catdir, inlist[0].regions[i][0].name); 238 sprintf (cptFilenameSrc, "%s/%s.cpt", catdir, inlist[0].regions[i][0].name); 239 sprintf (cpsFilenameSrc, "%s/%s.cps", catdir, inlist[0].regions[i][0].name); 240 sprintf (cpmFilenameTgt, "%s/%s.cpm.broken", catdir, inlist[0].regions[i][0].name); 241 sprintf (cptFilenameTgt, "%s/%s.cpt.broken", catdir, inlist[0].regions[i][0].name); 242 sprintf (cpsFilenameTgt, "%s/%s.cps.broken", catdir, inlist[0].regions[i][0].name); 243 244 Header cpmHeaderPHU; 245 Header cpmHeaderTBL; 246 FTable cpmFtable; 247 248 /*** read and examine the CPM file ***/ 249 { 250 if (VERBOSE) fprintf (stderr, "check %s\n", cpmFilenameSrc); 251 252 cpmFtable.header = &cpmHeaderTBL; 253 254 // open cpm file 255 FILE *cpmFile = fopen(cpmFilenameSrc, "r"); 256 if (!cpmFile) continue; 257 // myAssert(cpmFile, "failed to open cpm file"); 258 259 // load the cpm header 260 if (!gfits_fread_header (cpmFile, &cpmHeaderPHU)) { 261 myAbort("failure to cpm header"); 262 } 263 264 // move to TBL header 265 int Nbytes = cpmHeaderPHU.datasize + gfits_data_size (&cpmHeaderPHU); 266 fseeko (cpmFile, Nbytes, SEEK_SET); 267 268 // read cpm TBL header 269 if (!gfits_fread_header (cpmFile, &cpmHeaderTBL)) { 270 myAbort("can't read header for cpm table"); 271 } 272 273 char nativeOrder; 274 Catalog catalog; 275 dvo_catalog_init (&catalog, TRUE); 276 catalog.f = cpmFile; 277 if (!gfits_fread_uncompressed (&catalog, &cpmFtable, &nativeOrder, TRUE)) { 278 myAbort("can't read data for cpm table"); 279 } 280 281 int NbytesPerRow; 282 gfits_scan(&cpmHeaderTBL, "NAXIS1", "%d", 1, &NbytesPerRow); 283 284 char compressMode[256]; 285 if (gfits_scan (&cpmHeaderTBL, "DVO_CMP", "%s", 1, compressMode)) { 286 if (strcmp (compressMode, "NONE")) { 287 myAbort ("fix compression"); 288 } 289 } 290 291 // this function can only handle PS1_V5 and later formats 292 // NOTE: FtableToMeasure (and equivalent) free the data associated with cpmFtable. 293 // We are left with the data in measure. 294 measure = FtableToMeasure (&cpmFtable, NULL, &Nmeasure, &catformat, nativeOrder); 295 myAssert(measure, "failed to convert ftable to measure data"); 296 297 Nvalid = (int)(cpmFtable.validsize / NbytesPerRow); 298 Nvalid = MIN(Nmeasure, Nvalid); 299 300 // close the input cpm file 301 fclose(cpmFile); 302 303 // allocate an output array of measures (to replace, if needed) 304 ALLOCATE (measureNew, Measure, Nvalid); 305 306 NmeasureNew = 0; 307 Ndelete = 0; 308 309 // examine all measurements: find ones that need to be deleted 310 for (j = 0; j < Nvalid; j++) { 311 int imageID = measure[j].imageID; 312 myAssert(imageID, "measure is missing an image ID"); 313 // XXX this case is valid if we have REF detections (no associated image) 314 315 int N = myIndexGetEntry(imageIDindex, imageID); 316 if (N < 0) { 317 // this detection comes from a non-existant image, delete 318 Ndelete ++; 319 continue; 320 } 321 322 if (deleteImage[N]) { 323 Ndelete ++; 324 continue; 325 } 326 measureNew[NmeasureNew] = measure[j]; 327 NmeasureNew ++; 328 } 221 char filename[DVO_MAX_PATH]; 222 snprintf (filename, DVO_MAX_PATH, "%s/%s.cpt", catdir, inlist[0].regions[i][0].name); 223 224 Catalog catalog; 225 226 // set up the basic catalog info 227 dvo_catalog_init (&catalog, TRUE); 228 catalog.filename = filename; // XXX only allow non-parallel dbs for now 229 catalog.catflags = DVO_LOAD_AVERAGE | DVO_LOAD_MEASURE | DVO_LOAD_SECFILT | DVO_LOAD_LENSING; 230 catalog.Nsecfilt = GetPhotcodeNsecfilt (); 231 232 if (!dvo_catalog_open (&catalog, inlist[0].regions[i], VERBOSE, "r")) { 233 fprintf (stderr, "ERROR: failure reading catalog %s\n", catalog.filename); 234 exit (1); 329 235 } 330 331 NdeleteTotal += Ndelete; 332 333 // if we actually want to delete any measurements, write out a new cpm file 334 if (Ndelete > 0) { 335 336 fprintf (stderr, "deleting %d of %d (keep %d) detections from %s -> %s\n", (int) Ndelete, (int) Nvalid, (int) NmeasureNew, cpmFilenameSrc, cpmFilenameTgt); 236 if (!catalog.Naverage_disk) { 237 if (VERBOSE) fprintf (stderr, "no data in %s, skipping\n", catalog.filename); 238 dvo_catalog_unlock (&catalog); 239 dvo_catalog_free (&catalog); 240 continue; 241 } 337 242 338 // the CPT and CPS tables need to be regenerated. This must happen first because, in the process, we also update measure->averef 339 // what about other tables? 340 RepairTableCPT_V1(cptFilenameSrc, cptFilenameTgt, cpsFilenameSrc, cpsFilenameTgt, measureNew, NmeasureNew, image, Nimage, imageIDindex, catformat); 341 342 // convert internal to external format 343 if (!MeasureToFtable (&cpmFtable, NULL, measureNew, NmeasureNew, catformat, TRUE)) { 344 myAbort("trouble converting format"); 345 } 346 347 // rename the old cpm file: 348 if (rename (cpmFilenameSrc, cpmFilenameTgt)) { 349 perror ("tried to rename file"); 350 exit (2); 351 } 352 353 // create and write the output file 354 FILE *cpmFile = fopen(cpmFilenameSrc, "w"); 355 myAssert(cpmFile, "failed to open cpt file"); 356 357 // write PHU header 358 if (!gfits_fwrite_header (cpmFile, &cpmHeaderPHU)) { 359 myAbort("can't write primary header"); 360 } 361 362 Matrix matrix; 363 364 // write the PHU matrix; this is probably a NOP, do I have to keep it in? 365 gfits_create_matrix (&cpmHeaderPHU, &matrix); 366 if (!gfits_fwrite_matrix (cpmFile, &matrix)) { 367 myAbort("can't write primary matrix"); 368 } 369 gfits_free_matrix (&matrix); 370 371 // write the table data 372 if (!gfits_fwrite_ftable_range (cpmFile, &cpmFtable, 0, NmeasureNew, 0, NmeasureNew)) { 373 myAbort("can't write table data"); 374 } 375 fclose (cpmFile); 376 377 gfits_free_table (&cpmFtable); 378 } else { 379 if (VERBOSE) fprintf (stderr, "nothing to delete in %s\n", cpmFilenameSrc); 243 /*** delete the measure and lensing entries matching the list of imageIDs ***/ 244 int NmeasureDel = 0; 245 DeleteMeasure (&catalog, imageIDindex, deleteImage, &NmeasureDel); 246 247 int NlensingDel = 0; 248 DeleteLensing (&catalog, imageIDindex, deleteImage, &NlensingDel); 249 250 fprintf (stderr, "deleting %d measure, %d lensing (keep %d, %d)\n", NmeasureDel, NlensingDel, (int) catalog.Nmeasure, (int) catalog.Nlensing); 251 252 if (!NmeasureDel && !NlensingDel) { 253 if (VERBOSE) fprintf (stderr, "nothing to delete in %s\n", catalog.filename); 254 dvo_catalog_unlock (&catalog); 255 dvo_catalog_free (&catalog); 256 continue; 380 257 } 381 258 382 gfits_free_header (&cpmHeaderPHU); 383 gfits_free_header (&cpmHeaderTBL); 384 free (measure); 385 free (measureNew); 386 387 Ncheck ++; 388 if (Ncheck % 1000 == 0) { 389 fprintf (stderr, "%s...", inlist[0].regions[i][0].name); 259 NmeasureDelTotal += NmeasureDel; 260 NlensingDelTotal += NlensingDel; 261 262 // the CPT and CPS tables need to be regenerated. This must happen first because, in the process, we also update measure->averef 263 // what about other tables? 264 RepairAverage (&catalog); 265 266 if (VERBOSE) fprintf (stderr, "saving catalog %s\n", catalog.filename); 267 268 if (!dvo_catalog_backup (&catalog, ".undel", TRUE)) { 269 fprintf (stderr, "ERROR: failed to make backup for catalog %s\n", catalog.filename); 270 exit (1); 390 271 } 272 273 SetProtect (TRUE); 274 if (!dvo_catalog_save (&catalog, VERBOSE)) { fprintf (stderr, "ERROR: failed to save %s\n", catalog.filename); exit (1); } 275 if (!dvo_catalog_unlock (&catalog)) { fprintf (stderr, "ERROR: failed to unlock %s\n", catalog.filename); exit (1); } 276 SetProtect (FALSE); 277 dvo_catalog_free (&catalog); 391 278 } 392 279 fprintf (stderr, "\n"); … … 394 281 } 395 282 396 fprintf (stderr, "Deleted %d detections\n", NdeleteTotal);283 fprintf (stderr, "Deleted %d measure, %d lensing detections\n", NmeasureDelTotal, NlensingDelTotal); 397 284 398 285 off_t NnewImage; … … 408 295 free (deleteIDs); 409 296 410 free(cpmFilenameSrc);411 free(cptFilenameSrc);412 free(cpsFilenameSrc);413 free(cpmFilenameTgt);414 free(cptFilenameTgt);415 free(cpsFilenameTgt);416 417 297 SkyTableFree(insky); 418 298 419 299 gfits_db_free (&db); 300 301 ohana_memcheck (TRUE); 420 302 421 303 exit (0); … … 789 671 } 790 672 673 int RepairAverage (Catalog *catalog) { 674 675 off_t i, j, Nave; 676 677 // average is sorted so averef is valid 678 // secfilt is also sorted so sequence is valid (but this is kind of moot since it will be re-calculated) 679 // average.measureOffset is NOT valid 680 // average.lensingOffset is NOT valid 681 682 Average *average = catalog->average; 683 Measure *measure = catalog->measure; 684 Lensing *lensing = catalog->lensing; 685 686 // reset the values of average.Nmeasure, average.Nlensing 687 for (i = 0; i < catalog->Naverage; i++) { 688 average[i].Nmeasure = 0; 689 average[i].Nlensing = 0; 690 } 691 692 // re-calculate average.Nmeasure 693 for (i = 0; i < catalog->Nmeasure; i++) { 694 Nave = measure[i].averef; 695 myAssert (measure[i].objID == average[Nave].objID, "invalid measure:average match"); 696 average[Nave].Nmeasure ++; 697 } 698 699 // re-calculate average.Nlensing 700 for (i = 0; i < catalog->Nlensing; i++) { 701 Nave = lensing[i].averef; 702 myAssert (lensing[i].objID == average[Nave].objID, "invalid lensing:average match"); 703 average[Nave].Nlensing ++; 704 } 705 706 // create a copy of the average table, keeping only the entries with Nmeasure & Nlensing > 0 707 ALLOCATE_PTR (averageNew, Average, catalog->Naverage); 708 ALLOCATE_PTR (averefNew, int, catalog->Naverage); 709 710 Nave = 0; 711 for (i = 0; i < catalog->Naverage; i++) { 712 averefNew[i] = -1; 713 if (!average[i].Nmeasure && !average[i].Nlensing) continue; 714 715 averageNew[Nave] = average[i]; 716 averefNew[i] = Nave; 717 Nave ++; 718 } 719 off_t NaverageNew = Nave; 720 721 // update measure.averef values 722 for (i = 0; i < catalog->Nmeasure; i++) { 723 Nave = averefNew[measure[i].averef]; 724 myAssert (Nave >= 0, "oops"); 725 measure[i].averef = Nave; 726 } 727 728 // update lensing.averef values 729 for (i = 0; i < catalog->Nlensing; i++) { 730 Nave = averefNew[lensing[i].averef]; 731 myAssert (Nave >= 0, "oops"); 732 lensing[i].averef = Nave; 733 } 734 735 // XXX need to update measureOffset and lensingOffset 736 737 // measure[] should be blocked and sequential: 738 // measure[i+1].averef >= measure[i].averef 739 740 // update average.measureOffset values 741 Nave = -1; 742 for (i = 0; i < catalog->Nmeasure; i++) { 743 if (measure[i].averef == Nave) continue; 744 Nave = measure[i].averef; 745 averageNew[Nave].measureOffset = i; 746 } 747 748 // update average.lensingOffset values 749 Nave = -1; 750 for (i = 0; i < catalog->Nlensing; i++) { 751 if (lensing[i].averef == Nave) continue; 752 Nave = lensing[i].averef; 753 averageNew[Nave].lensingOffset = i; 754 } 755 756 // check the result (measure -> average) 757 for (i = 0; i < catalog->Nmeasure; i++) { 758 Nave = measure[i].averef; 759 myAssert(averageNew[Nave].objID == measure[i].objID, "objIDs do not match"); 760 myAssert(averageNew[Nave].catID == measure[i].catID, "catIDs do not match"); 761 } 762 // check the result (average -> measure) 763 for (i = 0; i < NaverageNew; i++) { 764 int m = averageNew[i].measureOffset; 765 for (j = 0; j < averageNew[i].Nmeasure; j++) { 766 myAssert(averageNew[i].objID == measure[j+m].objID, "objIDs do not match"); 767 myAssert(averageNew[i].catID == measure[j+m].catID, "catIDs do not match"); 768 myAssert(measure[j+m].averef == i, "averef broken"); 769 } 770 } 771 772 // check the result (lensing -> average) 773 for (i = 0; i < catalog->Nlensing; i++) { 774 Nave = lensing[i].averef; 775 myAssert(averageNew[Nave].objID == lensing[i].objID, "objIDs do not match"); 776 myAssert(averageNew[Nave].catID == lensing[i].catID, "catIDs do not match"); 777 } 778 // check the result (average -> lensing) 779 for (i = 0; i < NaverageNew; i++) { 780 int m = averageNew[i].lensingOffset; 781 for (j = 0; j < averageNew[i].Nlensing; j++) { 782 myAssert(averageNew[i].objID == lensing[j+m].objID, "objIDs do not match"); 783 myAssert(averageNew[i].catID == lensing[j+m].catID, "catIDs do not match"); 784 myAssert(lensing[j+m].averef == i, "averef broken"); 785 } 786 } 787 788 free (catalog->secfilt); 789 ALLOCATE (catalog->secfilt, SecFilt, NaverageNew*catalog->Nsecfilt); 790 for (i = 0; i < NaverageNew*catalog->Nsecfilt; i++) { 791 dvo_secfilt_init (&catalog->secfilt[i], SECFILT_RESET_ALL); 792 } 793 794 free (averefNew); 795 free (catalog->average); 796 catalog->average = averageNew; 797 catalog->Naverage = NaverageNew; 798 799 return (TRUE); 800 } 801 802 // delete measure entries 803 int DeleteMeasure (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete) { 804 805 int j; 806 807 Measure *measure = catalog->measure; 808 809 // allocate an output array of measures (to replace, if needed) 810 ALLOCATE_PTR (measureNew, Measure, catalog->Nmeasure); 811 812 int NmeasureNew = 0; 813 int NmeasureDel = 0; 814 815 // examine all measurements: find ones that need to be deleted 816 for (j = 0; j < catalog->Nmeasure; j++) { 817 int imageID = measure[j].imageID; 818 myAssert(imageID, "measure is missing an image ID"); 819 // XXX this case is valid if we have REF detections (no associated image) 820 821 int N = myIndexGetEntry(imageIDindex, imageID); 822 if (N < 0) { 823 // this detection comes from a non-existant image; delete 824 NmeasureDel ++; 825 continue; 826 } 827 828 // measure matches a bad image; delete 829 if (deleteImage[N]) { 830 NmeasureDel ++; 831 continue; 832 } 833 834 // keep this measure 835 measureNew[NmeasureNew] = measure[j]; 836 NmeasureNew ++; 837 } 838 839 free (catalog->measure); 840 catalog->measure = measureNew; 841 catalog->Nmeasure = NmeasureNew; 842 843 *nDelete = NmeasureDel; 844 845 return TRUE; 846 } 847 848 // delete lensing entries 849 int DeleteLensing (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete) { 850 851 int j; 852 853 Lensing *lensing = catalog->lensing; 854 855 // allocate an output array of measures (to replace, if needed) 856 ALLOCATE_PTR (lensingNew, Lensing, catalog->Nlensing); 857 858 int NlensingNew = 0; 859 int NlensingDel = 0; 860 861 // examine all lensingments: find ones that need to be deleted 862 for (j = 0; j < catalog->Nlensing; j++) { 863 int imageID = lensing[j].imageID; 864 myAssert(imageID, "lensing is missing an image ID"); 865 // XXX this case is valid if we have REF detections (no associated image) 866 867 int N = myIndexGetEntry(imageIDindex, imageID); 868 if (N < 0) { 869 // this detection comes from a non-existant image; delete 870 NlensingDel ++; 871 continue; 872 } 873 874 // lensing matches a bad image; delete 875 if (deleteImage[N]) { 876 NlensingDel ++; 877 continue; 878 } 879 880 // keep this lensing 881 lensingNew[NlensingNew] = lensing[j]; 882 NlensingNew ++; 883 } 884 885 free (catalog->lensing); 886 catalog->lensing = lensingNew; 887 catalog->Nlensing = NlensingNew; 888 889 *nDelete = NlensingDel; 890 891 return TRUE; 892 } 893
Note:
See TracChangeset
for help on using the changeset viewer.
