IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 7, 2005, 6:33:25 AM (21 years ago)
Author:
eugene
Message:

working on the update concept, added split table support

Location:
trunk/Ohana/src/libohana
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/libohana/include/dvo.h

    r5228 r5234  
    2424
    2525/* catalog values to be loaded */
    26 # define LOAD_AVES 0x01
    27 # define LOAD_MEAS 0x02
    28 # define LOAD_MISS 0x04
    29 # define LOAD_SECF 0x08
     26# define LOAD_AVES      0x01
     27# define LOAD_MEAS      0x02
     28# define LOAD_MISS      0x04
     29# define LOAD_SECF      0x08
     30# define LOAD_MEAS_META 0x10
    3031
    3132/* invalid mag value */
     
    128129  Missing *missing;
    129130  SecFilt *secfilt;
    130   int Naverage, Nmeasure, Nmissing, Nsecfilt;
     131  int Naverage, Nmeasure, Nmissing, Nsecfilt;   /* current number of each component */
     132  int Nave_disk, Nmeas_disk, Nmiss_disk;        /* number of component on disk */
     133  int Nmeas_off;                                /* dist seq of first loaded data value */
     134  /* note the different counting for Nsecfilt */
    131135
    132136  /* pointers to split data files */
     
    139143  int catmode;                          /* storage mode (raw, mef, split, mysql) */
    140144  int catformat;                        /* storage format (elixir, panstarrs, etc) */
    141   int ordered;                          /* is measure table average-ordered? */
     145  int sorted;                           /* is measure table average-sorted? */
    142146 
    143147  /* pointers for data manipulation */
     
    177181int load_catalog (Catalog *catalog, char mode, int VERBOSE);
    178182int save_catalog (Catalog *catalog, char VERBOSE);
     183int update_catalog (Catalog *catalog, char VERBOSE);
    179184
    180185int FindMosaicForImage (Image *images, int Nimages, int entry);
     
    291296int load_catalog_split (Catalog *catalog, char mode, int VERBOSE);
    292297int save_catalog_split (Catalog *catalog, char VERBOSE);
     298int update_catalog_split (Catalog *catalog, char VERBOSE);
    293299
    294300/*** DVO image db I/O Functions ***/
  • trunk/Ohana/src/libohana/src/dvo_catalog.c

    r5228 r5234  
    110110      break;
    111111    case DVO_MODE_SPLIT:
    112       update_catalog_split (catalog, VERBOSE);
     112      /* new file needs to use save_catalog_split */
     113      if (catalog[0].Nave_disk == 0) {
     114        save_catalog_split (catalog, VERBOSE);
     115      } else {
     116        update_catalog_split (catalog, VERBOSE);
     117      }
    113118      break;
    114119    default:
  • trunk/Ohana/src/libohana/src/dvo_catalog_split.c

    r5228 r5234  
    6565
    6666  measure = NULL;
     67
     68  /* (Full Load) */
    6769  if (mode & LOAD_MEAS) {
    6870    ALLOCATE (measure, Catalog, 1);
     
    104106      fprintf (stderr, "Warning: mismatch between Nmeasure in PHU and Table headers (%d vs %d)\n", Nmeasure, catalog[0].Nmeasure);
    105107    }
    106     fits_free_header (&header);
    107     fits_free_matrix (&matrix);
     108    catalog[0].Nmeas_off = 0;
     109    fits_free_header (&header);
     110    fits_free_matrix (&matrix);
     111  }
     112
     113  /* (Meta Load) */
     114  if (mode & LOAD_MEAS_META) {
     115    ALLOCATE (measure, Catalog, 1);
     116
     117    /* get split filename from main header (paths relative to cpt file) */
     118    if (!fits_scan (&catalog[0].header, "MEASURE",  "%s", 1, string)) return (FALSE);
     119    ALLOCATE (measure[0].filename, char, strlen(path) + strlen(string) + 2);
     120    sprintf (measure[0].filename, "%s/%s", path, string);
     121
     122    /* lock & open catalog file */
     123    if (lock_catalog (measure, catalog[0].lockmode) != 1) {
     124      fprintf (stderr, "cannot access measure file %s\n", measure[0].filename);
     125      exit (2);
     126    }
     127
     128    /* read PHU */
     129    if (!fits_load_header (measure[0].f, &measure[0].header)) {
     130      if (VERBOSE) fprintf (stderr, "catalog file does not exist: %s\n", measure[0].filename);
     131      return (FALSE);
     132    }
     133
     134    /* set up the table size information */
     135    catalog[0].Nmeasure  = 0;        /* no rows loaded */
     136    catalog[0].Nmeas_off = Nmeasure; /* start of new entries */
    108137  }
    109138  catalog[0].measure_catalog = measure;
     
    203232  catalog[0].secfilt_catalog = secfilt;
    204233
     234  /* save the current number so we can do partial updates */
     235  catalog[0].Nave_disk  = Naverage;
     236  catalog[0].Nmeas_disk = Nmeasure;
     237  catalog[0].Nmiss_disk = Nmissing;
     238
    205239  return (TRUE);
    206240}
     
    275309    measure = catalog[0].measure_catalog;
    276310
     311    /* XXX EAM : warn about this condition; add code to handle? */
     312    if (catalog[0].Nmeas_off != 0) {
     313      fprintf (stderr, "WARNING: LOAD_MEAS_META mixed with save??\n");
     314      fprintf (stderr, "WARNING: this should not be allowed to happen!\n");
     315    }
     316
    277317    /* rewind file pointers and truncate (file is still open) */
    278318    fseek (measure[0].f, 0, SEEK_SET);
     
    394434int update_catalog_split (Catalog *catalog, char VERBOSE) {
    395435
    396   int Nitems;
     436  int i, Nx, Ny, Nlines;
     437  int Nitems, Nskip, Nout, Ndisk, Nstart;
    397438  Matrix matrix;
    398439  Header header;
    399440  FTable ftable;
     441  VTable vtable;
    400442  Catalog *measure, *missing, *secfilt;
    401443
    402444  ftable.header = &header;
     445  vtable.header = &header;
    403446
    404447  if (catalog[0].Naverage == 0) {
     
    409452  /* make sure header is consistent with data */
    410453  fits_modify (&catalog[0].header, "NSTARS",   "%d", 1, catalog[0].Naverage);
    411   fits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure);
     454  fits_modify (&catalog[0].header, "NMEAS",    "%d", 1, catalog[0].Nmeasure + catalog[0].Nmeas_off);
    412455  fits_modify (&catalog[0].header, "NMISS",    "%d", 1, catalog[0].Nmissing);
    413456  fits_modify (&catalog[0].header, "NSECFILT", "%d", 1, catalog[0].Nsecfilt);
     
    424467  }
    425468
    426   /* in split mode, we can save only part of the data */
    427 
    428469  /*** Average Table ***/
    429470
    430471  if (catalog[0].average != NULL) {
    431     ftruncate (fileno (catalog[0].f), catalog[0].header.size);
    432 
    433     /* this is probably a NOP, do I have to keep it in? */
    434     fits_create_matrix (&catalog[0].header, &matrix);
    435     if (!fits_fwrite_matrix  (catalog[0].f, &matrix)) {
    436       fprintf (stderr, "can't write primary matrix");
    437       return (FALSE);
    438     }
    439     fits_free_matrix (&matrix);
     472
     473    /* skip past matrix (already at end of header) */
     474    Nskip = fits_matrix_size (&catalog[0].header);
     475    fseek (catalog[0].f, Nskip, SEEK_CUR);
     476
     477    /* how many lines to write out? */
     478    Nout = catalog[0].Naverage - catalog[0].Nave_disk;
    440479
    441480    /* write out Average table (convert to FITS table format) */
    442481    AverageToFtable (&ftable, catalog[0].average, catalog[0].Naverage, catalog[0].catformat);
     482    /* convert only output rows to vtable */
     483    fits_table_to_vtable (&ftable, &vtable, catalog[0].Nave_disk, Nout);
     484
    443485    if (!fits_fwrite_Theader (catalog[0].f, &header)) {
    444486      fprintf (stderr, "can't write table header");
    445487      return (FALSE);
    446488    }
    447     if (!fits_fwrite_table (catalog[0].f, &ftable)) {
    448       fprintf (stderr, "can't write table data");
    449       return (FALSE);
    450     }
     489    if (!fits_fwrite_vtable (catalog[0].f, &vtable)) {
     490      fprintf (stderr, "can't write table data");
     491      return (FALSE);
     492    }
     493    fits_free_vtable (&vtable);
    451494    fits_free_table (&ftable);
    452495    fits_free_header (&header);
     
    459502    measure = catalog[0].measure_catalog;
    460503
    461     /* rewind file pointers and truncate (file is still open) */
    462     fseek (measure[0].f, 0, SEEK_SET);
    463     ftruncate (fileno (measure[0].f), 0);
    464 
    465     /* write table PHU header */
    466     if (!fits_fwrite_header  (measure[0].f, &measure[0].header)) {
    467       fprintf (stderr, "can't write primary header");
    468       return (FALSE);
    469     }
    470 
    471     /* this is probably a NOP, do I have to keep it in? */
    472     fits_create_matrix (&measure[0].header, &matrix);
    473     if (!fits_fwrite_matrix  (measure[0].f, &matrix)) {
    474       fprintf (stderr, "can't write primary matrix");
    475       return (FALSE);
    476     }
    477     fits_free_matrix (&matrix);
    478 
    479     /* write out Measure table (convert to FITS table format) */
    480     MeasureToFtable (&ftable, catalog[0].measure, catalog[0].Nmeasure, catalog[0].catformat);
     504    /* skip past PHU header and matrix */
     505    Nskip = measure[0].header.size + fits_matrix_size (&measure[0].header);
     506    fseek (measure[0].f, Nskip, SEEK_SET);
     507
     508    Ndisk  = catalog[0].Nmeas_disk;
     509    Nstart = catalog[0].Nmeas_disk - catalog[0].Nmeas_off; /* where is first new line? */
     510    Nout   = catalog[0].Nmeasure - Nstart;                   /* how many lines to write out? */
     511    Nlines = catalog[0].Nmeasure + catalog[0].Nmeas_off;   /* how many lines total in file */
     512
     513    /* convert to output format FITS table (only rows for output : 0 - Nout) */
     514    MeasureToFtable (&ftable, &catalog[0].measure[Nstart], Nout, catalog[0].catformat);
     515
     516    fits_scan (&header, "NAXIS1", "%d", 1, &Nx);
     517    fits_scan (&header, "NAXIS2", "%d", 1, &Ny);
     518
     519    /* convert all output rows to vtable */
     520    ALLOCATE (vtable.row, int, MAX (1, Nout));
     521    ALLOCATE (vtable.buffer, char *, MAX (1, Nout));
     522    for (i = 0; i < Nout; i++) {
     523      ALLOCATE (vtable.buffer[i], char, MAX (1, Nx));
     524      memcpy (vtable.buffer[i], &ftable.buffer[i*Nx], Nx);
     525      vtable.row[i] = i + Ndisk;
     526    }
     527
     528    /* modify vtable to represent full disk table */
     529    fits_modify (&header, "NAXIS2", "%d", 1, Nlines);
     530    header.Naxis[1] = Nlines;
     531
     532    vtable.size = fits_matrix_size (&header);
     533    vtable.Nrow = Nout;
     534    vtable.pad = vtable.size - Nx*Ny;
     535
    481536    if (!fits_fwrite_Theader (measure[0].f, &header)) {
    482537      fprintf (stderr, "can't write table header");
    483538      return (FALSE);
    484539    }
    485     if (!fits_fwrite_table (measure[0].f, &ftable)) {
    486       fprintf (stderr, "can't write table data");
    487       return (FALSE);
    488     }
     540    if (!fits_fwrite_vtable (measure[0].f, &vtable)) {
     541      fprintf (stderr, "can't write table data");
     542      return (FALSE);
     543    }
     544    fits_free_vtable (&vtable);
    489545    fits_free_table (&ftable);
    490546    fits_free_header (&header);
     
    492548
    493549  /*** Missing Table ***/
     550  /* missing table CANNOT be written unsorted, thus it is always written
     551     out in full */
    494552
    495553  if (catalog[0].missing != NULL) {
     
    535593    secfilt = catalog[0].secfilt_catalog;
    536594
    537     /* rewind file pointers and truncate (file is still open) */
    538     fseek (secfilt[0].f, 0, SEEK_SET);
    539     ftruncate (fileno (secfilt[0].f), 0);
    540 
    541     /* write table PHU header */
    542     if (!fits_fwrite_header  (secfilt[0].f, &secfilt[0].header)) {
    543       fprintf (stderr, "can't write primary header");
    544       return (FALSE);
    545     }
    546 
    547     /* this is probably a NOP, do I have to keep it in? */
    548     fits_create_matrix (&secfilt[0].header, &matrix);
    549     if (!fits_fwrite_matrix  (secfilt[0].f, &matrix)) {
    550       fprintf (stderr, "can't write primary matrix");
    551       return (FALSE);
    552     }
    553     fits_free_matrix (&matrix);
    554 
    555     /* write out SecFilt table (convert to FITS table format) */
     595    /* skip past PHU header and matrix */
     596    Nskip = secfilt[0].header.size + fits_matrix_size (&secfilt[0].header);
     597    fseek (secfilt[0].f, Nskip, SEEK_SET);
     598
     599    /* how many lines to write out? */
     600    Nout  = catalog[0].Nsecfilt * (catalog[0].Naverage - catalog[0].Nave_disk);
     601    Ndisk = catalog[0].Nsecfilt * catalog[0].Nave_disk;
     602
     603    /* convert to output format FITS table */
    556604    Nitems = catalog[0].Naverage * catalog[0].Nsecfilt;
    557605    SecFiltToFtable (&ftable, catalog[0].secfilt, Nitems, catalog[0].catformat);
     606    /* convert only output rows to vtable */
     607    fits_table_to_vtable (&ftable, &vtable, Ndisk, Nout);
     608
    558609    if (!fits_fwrite_Theader (secfilt[0].f, &header)) {
    559610      fprintf (stderr, "can't write table header");
    560611      return (FALSE);
    561612    }
    562     if (!fits_fwrite_table (secfilt[0].f, &ftable)) {
    563       fprintf (stderr, "can't write table data");
    564       return (FALSE);
    565     }
     613    if (!fits_fwrite_vtable (secfilt[0].f, &vtable)) {
     614      fprintf (stderr, "can't write table data");
     615      return (FALSE);
     616    }
     617    fits_free_vtable (&vtable);
    566618    fits_free_table (&ftable);
    567619    fits_free_header (&header);
     
    578630
    579631/* XXX EAM : this file needs work on the error exit conditions and memory leaks, esp under errors */
     632
     633/* XXX EAM : update is not efficient.  MeasureToFtable should only
     634   convert the new rows (Nmeas_disk to Nmeasure). the resulting
     635   table represents the end rows of the vtable.  we need to define
     636   the vtable based on the ftable, but with Ny = Nmeasure */ 
     637 
Note: See TracChangeset for help on using the changeset viewer.