IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 38753


Ignore:
Timestamp:
Sep 17, 2015, 8:27:18 PM (11 years ago)
Author:
eugene
Message:

substantial rework DeleteImagesByExternID to handle lensing

Location:
branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c

    r38651 r38753  
    207207      }
    208208
    209       if (!dvo_catalog_backup (&outcatalog, TRUE)) {
     209      if (!dvo_catalog_backup (&outcatalog, "~", TRUE)) {
    210210        fprintf (stderr, "ERROR: failed to make backup for catalog %s\n", outlist[0].filename[j]);
    211211        exit (1);
     
    218218      SetProtect (FALSE);
    219219
    220       if (!dvo_catalog_unlink_backup (&outcatalog, TRUE)) {
     220      if (!dvo_catalog_unlink_backup (&outcatalog, "~", TRUE)) {
    221221        fprintf (stderr, "WARNING: failed to remove backup for catalog %s\n", outlist[0].filename[j]);
    222222      }
  • branches/eam_branches/ipp-20150625/Ohana/src/dvomerge/src/dvorepairDeleteImagesByExternID.c

    r38730 r38753  
    1616int SaveImageTable (Image *image, off_t Nimage, char *catdir, FITS_DB *oldDB);
    1717Image *DeleteSelectedImages (Image *image, off_t Nimage, int *deleteImage, myIndexType *imageIDindex, off_t *NnewImage);
     18int DeleteLensing (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete);
     19int DeleteMeasure (Catalog *catalog, myIndexType *imageIDindex, int *deleteImage, int *nDelete);
     20int RepairAverage (Catalog *catalog);
    1821
    1922int dvorepairDeleteImagesByExternID (int argc, char **argv) {
     
    2124  FITS_DB db;  // database handle pointing to input image table
    2225 
    23   int i, j, N, NmeasureNew, Ndelete, Nvalid;
    24   off_t Nimage, Nmeasure;
     26  int i, N;
     27  off_t Nimage;
    2528  int nPass, raPass;
    2629
    2730  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 
    3831  char *imageFilename = NULL;
    39 
    40   DVOCatFormat catformat;
    4132
    4233  N = get_argument (argc, argv, "-delete-images-by-extern-id");
     
    196187  }
    197188 
    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;
    206191
    207192  for (raPass = 0; raPass < nPass; raPass++) {
     
    231216 
    232217    // loop over the populated input regions
    233     int Ncheck = 0;
    234218    for (i = 0; i < inlist[0].Nregions; i++) {
    235219      if (!inlist[0].regions[i][0].table) continue;
    236220
    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);
    329235      }
    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      }
    337242     
    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;
    380257      }
    381258
    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);
    390271      }
     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);
    391278    }
    392279    fprintf (stderr, "\n");
     
    394281  }
    395282
    396   fprintf (stderr, "Deleted %d detections\n", NdeleteTotal);
     283  fprintf (stderr, "Deleted %d measure, %d lensing detections\n", NmeasureDelTotal, NlensingDelTotal);
    397284
    398285  off_t NnewImage;
     
    408295  free (deleteIDs);
    409296
    410   free(cpmFilenameSrc);
    411   free(cptFilenameSrc);
    412   free(cpsFilenameSrc);
    413   free(cpmFilenameTgt);
    414   free(cptFilenameTgt);
    415   free(cpsFilenameTgt);
    416 
    417297  SkyTableFree(insky);
    418298
    419299  gfits_db_free (&db);
     300
     301  ohana_memcheck (TRUE);
    420302
    421303  exit (0);
     
    789671}
    790672
     673int 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
     803int 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
     849int 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.