IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 37360


Ignore:
Timestamp:
Sep 4, 2014, 7:57:02 AM (12 years ago)
Author:
eugene
Message:

dvoverify checks lensing indices, check image IDs in parallel context

Location:
trunk/Ohana/src/dvomerge
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/dvomerge/include/dvoverify.h

    r34405 r37360  
    5656int LoadImageIDs (char *catdir);
    5757int CheckImageID (Catalog *catalog);
     58
     59int SaveImageIDsSmall(char *filename);
     60int LoadImageIDsSmall (char *filename);
  • trunk/Ohana/src/dvomerge/src/dvo_image_merge_dbs.c

    r36833 r37360  
    179179  off_t lastID = IDmap->old[IDmap->Nmap-1];
    180180
     181  // update measure.imageID
    181182  for (i = 0; i < catalog[0].Nmeasure; i++) {
    182183    oldID = catalog[0].measure[i].imageID;
     
    200201    catalog[0].measure[i].imageID = newID;
    201202  }
     203
     204  // also update lensing.imageID if lensing exists
     205  for (i = 0; i < catalog[0].Nlensing; i++) {
     206    oldID = catalog[0].lensing[i].imageID;
     207    if (oldID == 0) continue;
     208
     209    newID = dvo_map_image_ID (IDmap, oldID);
     210    if (newID == 0) {
     211      if (oldID > lastID) {
     212        fprintf (stderr, "problem with image IDs : input out of range\n");
     213        fprintf (stderr, "old ID: "OFF_T_FMT", last ID: "OFF_T_FMT"\n", oldID, lastID);
     214        exit (2);
     215      }
     216      if (!IDmap->notFound[oldID]) {
     217        fprintf (stderr, "cannot find image ID "OFF_T_FMT"\n",  oldID);
     218        IDmap->notFound[oldID] = TRUE;
     219        // once we discover an imageID is not found, record that fact so we do not complain for every detection
     220      }
     221      // optionally exit here? or wait until end to report an error?
     222      // exit (2);
     223    }
     224    catalog[0].lensing[i].imageID = newID;
     225  }
    202226  return TRUE;
    203227}
  • trunk/Ohana/src/dvomerge/src/dvoverify_args.c

    r36101 r37360  
    5656  }
    5757
    58   /*** dvoverify -parallel (dvoverify_client, actually) ignores this argument
    59        dvoverify should save a subset table of just the IDs, and dvoverify_client should load it
    60        dvoverify -cpt should have CHECK_IMAGE_ID = F as default ***/
     58  /*** dvoverify -cpt should have CHECK_IMAGE_ID = F as default ***/
    6159       
    6260  CHECK_IMAGE_ID = TRUE;
     
    150148  }
    151149
     150  CHECK_IMAGE_ID = TRUE;
     151  if ((N = get_argument (*argc, argv, "-skip-image-ids"))) {
     152    CHECK_IMAGE_ID = FALSE;
     153    remove_argument (N, argc, argv);
     154  }
     155
    152156  // restrict to a portion of the sky
    153157  UserPatch.Rmin = 0;
  • trunk/Ohana/src/dvomerge/src/dvoverify_catalogs.c

    r36084 r37360  
    4747    }
    4848
     49    sprintf (filename, "%s/%s.cpx", mycatdir, skylist[0].regions[i][0].name);
     50    if (!VerifyTableFile (filename)) {
     51      Nbad ++;
     52      skipIndexCheck = TRUE;
     53      AddFailures (filename);
     54    }
     55
     56    sprintf (filename, "%s/%s.cpy", mycatdir, skylist[0].regions[i][0].name);
     57    if (!VerifyTableFile (filename)) {
     58      Nbad ++;
     59      skipIndexCheck = TRUE;
     60      AddFailures (filename);
     61    }
     62
    4963    sprintf (filename, "%s/%s.cpt", mycatdir, skylist[0].regions[i][0].name);
    5064    if (!skipIndexCheck) {
     
    8094    exit (1);
    8195  }   
     96
     97  // save the IDlist as a smaller FITS table
     98  if (CHECK_IMAGE_ID) {
     99    char filename[DVO_MAX_PATH];
     100    snprintf (filename, DVO_MAX_PATH, "%s/ImageIDs.fits", CATDIR);
     101    if (!SaveImageIDsSmall (filename)) {
     102      fprintf (stderr, "ERROR: failure to save image IDs\n");
     103      exit (2);
     104    }
     105  }
    82106
    83107  int i;
  • trunk/Ohana/src/dvomerge/src/dvoverify_client.c

    r34405 r37360  
    2222    // XXX in client mode, we should be reading a reduced table generated by the calling
    2323    // serial program
    24     LoadImageIDs (CATDIR);
     24    char filename[DVO_MAX_PATH];
     25    snprintf (filename, DVO_MAX_PATH, "%s/ImageIDs.fits", CATDIR);
     26    if (!LoadImageIDsSmall (filename)) {
     27      fprintf (stderr, "ERROR: failure to load image IDs\n");
     28      exit (2);
     29    }
    2530  }
    2631
  • trunk/Ohana/src/dvomerge/src/dvoverify_utils.c

    r36101 r37360  
    178178  catalog.catformat = DVO_FORMAT_UNDEF; // read-only,do not set the catformat
    179179  catalog.catmode   = DVO_MODE_UNDEF; // read-only, do not set the catmode
    180   catalog.catflags  = LOAD_AVES | LOAD_MEAS;
     180  catalog.catflags  = LOAD_AVES | LOAD_MEAS | LOAD_LENSING | LOAD_LENSOBJ;
    181181  catalog.Nsecfilt  = 0;
    182182 
     
    214214  int NmeasureTotal = 0;
    215215  int measureOffsetOK = TRUE;
     216  int NlensingTotal = 0;
     217  int lensingOffsetOK = TRUE;
     218  int NlensobjTotal = 0;
     219  int lensobjOffsetOK = TRUE;
    216220  for (i = 0; i < catalog.Naverage; i++) {
    217221    NmeasureTotal += catalog.average[i].Nmeasure;
     
    227231      fprintf (stderr, "measureOffset + Nmeasure > catalog.Nmeasure : %d %d %d\n", i, catalog.average[i].Nmeasure, (int) catalog.Nmeasure);
    228232    }
     233
     234    // sum of Nlensing for each object < Nlensing for catalog
     235    NlensingTotal += catalog.average[i].Nlensing;
     236    if (VERBOSE && !(NlensingTotal <= catalog.Nlensing)) {
     237      fprintf (stderr, "NlensingTotal > catalog.Nlensing: %d %d %d\n", i, catalog.average[i].Nlensing, (int) catalog.Nlensing);
     238    }
     239    // lensingOffset needs to be in range for each object
     240    lensingOffsetOK &= (catalog.average[i].lensingOffset < catalog.Nlensing);
     241    if (VERBOSE && !(catalog.average[i].lensingOffset < catalog.Nlensing)) {
     242      fprintf (stderr, "lensingOffset >= catalog.Nlensing: %d %d %d\n", i, catalog.average[i].lensingOffset, (int) catalog.Nlensing);
     243    }
     244    lensingOffsetOK &= (catalog.average[i].lensingOffset + catalog.average[i].Nlensing <= catalog.Nlensing);
     245    if (VERBOSE && !(catalog.average[i].lensingOffset + catalog.average[i].Nlensing <= catalog.Nlensing)) {
     246      fprintf (stderr, "lensingOffset + Nlensing > catalog.Nlensing : %d %d %d\n", i, catalog.average[i].Nlensing, (int) catalog.Nlensing);
     247    }
     248
     249    NlensobjTotal += catalog.average[i].Nlensobj;
     250    if (VERBOSE && !(NlensobjTotal <= catalog.Nlensobj)) {
     251      fprintf (stderr, "NlensobjTotal > catalog.Nlensobj: %d %d %d\n", i, catalog.average[i].Nlensobj, (int) catalog.Nlensobj);
     252    }
     253    lensobjOffsetOK &= (catalog.average[i].lensobjOffset < catalog.Nlensobj);
     254    if (VERBOSE && !(catalog.average[i].lensobjOffset < catalog.Nlensobj)) {
     255      fprintf (stderr, "lensobjOffset >= catalog.Nlensobj: %d %d %d\n", i, catalog.average[i].lensobjOffset, (int) catalog.Nlensobj);
     256    }
     257    lensobjOffsetOK &= (catalog.average[i].lensobjOffset + catalog.average[i].Nlensobj <= catalog.Nlensobj);
     258    if (VERBOSE && !(catalog.average[i].lensobjOffset + catalog.average[i].Nlensobj <= catalog.Nlensobj)) {
     259      fprintf (stderr, "lensobjOffset + Nlensobj > catalog.Nlensobj : %d %d %d\n", i, catalog.average[i].Nlensobj, (int) catalog.Nlensobj);
     260    }
    229261  }
    230262
     
    236268  if (NmeasureTotal != catalog.Nmeasure) {
    237269    fprintf (stderr, "ERROR: catalog %s has an invalid Nmeasure\n", catalog.filename);
     270    status = FALSE;
     271  }
     272
     273  if (!lensingOffsetOK) {
     274    fprintf (stderr, "ERROR: catalog %s has an invalid lensingOffset\n", catalog.filename);
     275    status = FALSE;
     276  }
     277
     278  if (NlensingTotal != catalog.Nlensing) {
     279    fprintf (stderr, "ERROR: catalog %s has an invalid Nlensing\n", catalog.filename);
     280    status = FALSE;
     281  }
     282
     283  if (!lensobjOffsetOK) {
     284    fprintf (stderr, "ERROR: catalog %s has an invalid lensobjOffset\n", catalog.filename);
     285    status = FALSE;
     286  }
     287
     288  if (NlensobjTotal != catalog.Nlensobj) {
     289    fprintf (stderr, "ERROR: catalog %s has an invalid Nlensobj\n", catalog.filename);
    238290    status = FALSE;
    239291  }
     
    247299  }
    248300
    249   int objIDsOK = TRUE;
    250   int catIDsOK = TRUE;
    251   int averefOK = TRUE;
    252 
    253   for (i = 0; i < catalog.Naverage; i++) {
    254     m = catalog.average[i].measureOffset;
    255     for (j = 0; j < catalog.average[i].Nmeasure; j++) {
    256       objIDsOK &= (catalog.average[i].objID == catalog.measure[m+j].objID);
    257       catIDsOK &= (catalog.average[i].catID == catalog.measure[m+j].catID);
    258       averefOK &= (catalog.measure[m+j].averef == i);
    259     }
    260   }
     301  // check measure <-> average links
     302  {
     303    int objIDsOK = TRUE;
     304    int catIDsOK = TRUE;
     305    int averefOK = TRUE;
     306
     307    for (i = 0; i < catalog.Naverage; i++) {
     308      m = catalog.average[i].measureOffset;
     309      for (j = 0; j < catalog.average[i].Nmeasure; j++) {
     310        objIDsOK &= (catalog.average[i].objID == catalog.measure[m+j].objID);
     311        catIDsOK &= (catalog.average[i].catID == catalog.measure[m+j].catID);
     312        averefOK &= (catalog.measure[m+j].averef == i);
     313      }
     314    }
    261315   
    262   if (!objIDsOK) {
    263     fprintf (stderr, "ERROR: catalog %s has invalid obj IDs\n", catalog.filename);
    264     status = FALSE;
    265   }
    266   if (!catIDsOK) {
    267     fprintf (stderr, "ERROR: catalog %s has invalid cat IDs\n", catalog.filename);
    268     status = FALSE;
    269   }
    270   if (!averefOK) {
    271     fprintf (stderr, "ERROR: catalog %s has invalid averef values\n", catalog.filename);
    272     status = FALSE;
     316    if (!objIDsOK) {
     317      fprintf (stderr, "ERROR: catalog %s has invalid obj IDs\n", catalog.filename);
     318      status = FALSE;
     319    }
     320    if (!catIDsOK) {
     321      fprintf (stderr, "ERROR: catalog %s has invalid cat IDs\n", catalog.filename);
     322      status = FALSE;
     323    }
     324    if (!averefOK) {
     325      fprintf (stderr, "ERROR: catalog %s has invalid averef values\n", catalog.filename);
     326      status = FALSE;
     327    }
     328  }
     329
     330  // check lensing <-> average links
     331  {
     332    int objIDsOK = TRUE;
     333    int catIDsOK = TRUE;
     334    int averefOK = TRUE;
     335
     336    for (i = 0; i < catalog.Naverage; i++) {
     337      m = catalog.average[i].lensingOffset;
     338      for (j = 0; j < catalog.average[i].Nlensing; j++) {
     339        objIDsOK &= (catalog.average[i].objID == catalog.lensing[m+j].objID);
     340        catIDsOK &= (catalog.average[i].catID == catalog.lensing[m+j].catID);
     341        averefOK &= (catalog.lensing[m+j].averef == i);
     342      }
     343    }
     344   
     345    if (!objIDsOK) {
     346      fprintf (stderr, "ERROR: catalog %s has invalid lensing obj IDs\n", catalog.filename);
     347      status = FALSE;
     348    }
     349    if (!catIDsOK) {
     350      fprintf (stderr, "ERROR: catalog %s has invalid lensing cat IDs\n", catalog.filename);
     351      status = FALSE;
     352    }
     353    if (!averefOK) {
     354      fprintf (stderr, "ERROR: catalog %s has invalid lensing averef values\n", catalog.filename);
     355      status = FALSE;
     356    }
     357  }
     358
     359  // check lensobj <-> average links
     360  {
     361    int objIDsOK = TRUE;
     362    int catIDsOK = TRUE;
     363
     364    for (i = 0; i < catalog.Naverage; i++) {
     365      m = catalog.average[i].lensobjOffset;
     366      for (j = 0; j < catalog.average[i].Nlensobj; j++) {
     367        objIDsOK &= (catalog.average[i].objID == catalog.lensobj[m+j].objID);
     368        catIDsOK &= (catalog.average[i].catID == catalog.lensobj[m+j].catID);
     369      }
     370    }
     371   
     372    if (!objIDsOK) {
     373      fprintf (stderr, "ERROR: catalog %s has invalid lensobj obj IDs\n", catalog.filename);
     374      status = FALSE;
     375    }
     376    if (!catIDsOK) {
     377      fprintf (stderr, "ERROR: catalog %s has invalid lensobj cat IDs\n", catalog.filename);
     378      status = FALSE;
     379    }
    273380  }
    274381
     
    321428    }
    322429  }
     430
     431  for (i = 0; i < catalog[0].Naverage; i++) {
     432    m = catalog[0].average[i].lensingOffset;
     433    for (j = 0; j < catalog[0].average[i].Nlensing; j++) {
     434      id = catalog[0].lensing[m+j].imageID;
     435      if (id == 0) continue; // detections from ref photcodes can (should) have unset image IDs
     436      if (id > maxID) {
     437        Nfail ++;
     438        continue;
     439        // is this sufficient to catch IDs set without an image table?
     440      }
     441      if (IDlist) {
     442        if (IDlist[id] < 0) {
     443          Nfail ++;
     444          continue;
     445        }
     446      } else {
     447        if (id > 0) {
     448          Nfail ++;
     449          continue;
     450        }
     451      }
     452    }
     453  }
     454
    323455  return Nfail;
    324456}
     
    382514  return TRUE;
    383515}
     516
     517# define GET_COLUMN(OUT,NAME,TYPE) \
     518  OUT = gfits_get_bintable_column_data (&theader, &ftable, NAME, type, &Nrow, &Ncol); \
     519  myAssert (!strcmp(type, #TYPE), "wrong column type");
     520
     521// STATUS is value expected for success
     522# define CHECK_STATUS(STATUS,MSG,...)                                   \
     523  if (!(STATUS)) {                                                      \
     524    fprintf (stderr, MSG, __VA_ARGS__);                                 \
     525    return FALSE;                                                       \
     526  }
     527
     528// write out the IDmap data for clients to read
     529int SaveImageIDsSmall(char *filename) {
     530
     531  Header header;
     532  Header theader;
     533  Matrix matrix;
     534  FTable ftable;
     535
     536  gfits_init_header (&header);
     537  header.extend = TRUE;
     538  gfits_create_header (&header);
     539  gfits_create_matrix (&header, &matrix);
     540
     541  gfits_create_table_header (&theader, "BINTABLE", "IMAGE_IDS");
     542
     543  gfits_define_bintable_column (&theader, "J", "IMAGE_IDS", "image IDs", NULL, 1.0, FT_BZERO_INT32);
     544
     545  // generate the output array that carries the data
     546  gfits_create_table (&theader, &ftable);
     547
     548  // add the columns to the output array
     549  gfits_set_bintable_column (&theader, &ftable, "IMAGE_IDS", IDlist, maxID + 1);
     550
     551  FILE *f = fopen (filename, "w");
     552  if (!f) {
     553    fprintf (stderr, "ERROR: cannot open image ID file for output %s\n", filename);
     554    return FALSE;
     555  }
     556
     557  int status;
     558  status = gfits_fwrite_header  (f, &header);
     559  CHECK_STATUS (status, "ERROR: cannot write header for image ID file %s\n", filename);
     560
     561  status = gfits_fwrite_matrix  (f, &matrix);
     562  CHECK_STATUS (status, "ERROR: cannot write matrix for image ID file %s\n", filename);
     563
     564  status = gfits_fwrite_Theader (f, &theader);
     565  CHECK_STATUS (status, "ERROR: cannot write table header for image ID file %s\n", filename);
     566
     567  status = gfits_fwrite_table  (f, &ftable);
     568  CHECK_STATUS (status, "ERROR: cannot write table data for image ID file %s\n", filename);
     569
     570  gfits_free_header (&header);
     571  gfits_free_matrix (&matrix);
     572  gfits_free_header (&theader);
     573  gfits_free_table (&ftable);
     574
     575  int fd = fileno (f);
     576
     577  status = fflush (f);
     578  CHECK_STATUS (!status, "ERROR: cannot flush file image ID file %s\n", filename);
     579
     580  status = fsync (fd);
     581  CHECK_STATUS (!status, "ERROR: cannot flush file image ID file %s\n", filename);
     582
     583  status = fclose (f);
     584  CHECK_STATUS (!status, "ERROR: problem closing image ID file file %s\n", filename);
     585
     586  return TRUE;
     587}
     588
     589int LoadImageIDsSmall (char *filename) {
     590
     591  int Ncol;
     592  off_t Nrow;
     593  Header header;
     594  Header theader;
     595  Matrix matrix;
     596  FTable ftable;
     597
     598  FILE *f = fopen (filename, "r");
     599  if (!f) {
     600    fprintf (stderr, "ERROR: cannot open image subset file %s\n", filename);
     601    return FALSE;
     602  }
     603
     604  /* load in PHU segment (ignore) */
     605  if (!gfits_fread_header (f, &header)) {
     606    if (VERBOSE) fprintf (stderr, "can't read image subset header\n");
     607    fclose (f);
     608    return FALSE;
     609  }
     610  if (!gfits_fread_matrix (f, &matrix, &header)) {
     611    if (VERBOSE) fprintf (stderr, "can't read image subset matrix\n");
     612    gfits_free_header (&header);
     613    fclose (f);
     614    return FALSE;
     615  }
     616
     617  ftable.header = &theader;
     618
     619  // load data for this header
     620  if (!gfits_load_header (f, &theader)) {
     621    fclose (f);
     622    return FALSE;
     623  }
     624
     625  // read the fits table bytes
     626  if (!gfits_fread_ftable_data (f, &ftable, FALSE)) {
     627    fclose (f);
     628    return FALSE;
     629  }
     630  fclose (f);
     631
     632  char type[16];
     633
     634  GET_COLUMN (IDlist, "IMAGE_IDS", int);
     635  maxID = Nrow - 1;
     636  fprintf (stderr, "loaded data for %lld images\n", (long long) Nrow);
     637
     638  return TRUE;
     639}
     640
Note: See TracChangeset for help on using the changeset viewer.