IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 22, 2012, 1:34:12 PM (14 years ago)
Author:
eugene
Message:

working on delstar -photcodes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20120905/Ohana/src/delstar/src/delete_photcodes.c

    r34684 r34685  
    11# include "delstar.h"
    22
    3 void delete_times (FITS_DB *db) {
     3void delete_photcodes (FITS_DB *db, photcodes, Nphotcodes) {
    44
    55  int found, code;
    66  off_t i, j, k, n;
    7   off_t Nimage, Nimlist;
    87  off_t Nregions, NREGIONS;
    98  off_t *imlist;
    109  SkyList *skylist, *skyset;
    1110  SkyTable *sky;
    12   Image *image;
    1311  Catalog catalog;
    1412
     13  // xxx where does this go?
    1514  photcodesDrop = ParsePhotcodeList (PHOTCODE_LIST, &NphotcodesDrop, FALSE);
    1615
     
    2322
    2423  // delete images with these photcodes
    25   delete_photcodes_images (db, photcodesDrop, NphotcodesDrop);
    26 
    27   // delete images with these photcodes
    2824  delete_photcodes_catalogs (db, photcodesDrop, NphotcodesDrop);
    2925
     
    3228}
    3329
    34 void delete_photcodes_catalogs (skylist, photcodesDrop, NphotcodesDrop) {
    35 
    36   // XXX need to decide how to determine PARALLEL mode...
     30void delete_photcodes_catalogs (skylist, hostID, photcodesDrop, NphotcodesDrop) {
     31
     32  // launch the remote jobs
    3733  if (PARALLEL && !hostID) {
    38     delete_photcodes_parallel (skylist, photcodesDrop, NphotcodesDrop);
    39     return TRUE;
     34    int status = delete_photcodes_parallel (skylist, photcodesDrop, NphotcodesDrop);
     35    return status;
    4036  }
    4137
     
    4642    if (!HostTableTestHost(skylist[0].regions[i], hostID)) continue;
    4743
    48     // set up the basic catalog info
    4944    // set up the basic catalog info
    5045    char hostfile[1024];
     
    6863    }
    6964
    70     find_matches (&catalog, code, START, END);
     65    delete_photcodes_from_catalog (&catalog, photcodes, Nphotcodes);
    7166    dvo_catalog_save (&catalog, VERBOSE);
    7267    dvo_catalog_unlock (&catalog);
     
    9893
    9994    // options / arguments that can affect relphot_client -update-objects:
    100     // VERBOSE, VERBOSE2
    101     // KEEP_UBERCAL
    102     // RESET (-reset)
    103     // TimeSelect -time
    104     // DophotSelect
    105     // (note that psfQF is applied rigidly at 0.85, as is the galaxy test)
    106     // MAG_LIM
    107     // SIGMA_LIM
    108     // ImagSelect, ImagMin, ImagMax
    109     // MaxDensityUse, MaxDensityValue
     95    // VERBOSE
    11096
    11197    char command[1024];
    11298    snprintf (command, 1024, "delstar_client -hostID %d -D CATDIR %s -hostdir %s -region %f %f %f %f -photcodes %s",
    113               table->hosts[i].hostID, CATDIR, table->hosts[i].pathname, UserPatch.Rmin, UserPatch.Rmax, UserPatch.Dmin, UserPatch.Dmax, PHOTCODE_LIST);
     99              table->hosts[i].hostID, CATDIR, table->hosts[i].pathname,
     100              UserPatch.Rmin, UserPatch.Rmax, UserPatch.Dmin, UserPatch.Dmax,
     101              PHOTCODE_LIST);
    114102
    115103    char tmpline[1024];
     
    123111      int status = system (command);
    124112      if (status) {
    125         fprintf (stderr, "ERROR running relphot_client\n");
     113        fprintf (stderr, "ERROR running delstar_client\n");
    126114        exit (2);
    127115      }
     
    148136  return TRUE;
    149137}     
     138
     139// sort the measure Sequence based on the average Sequence entries
     140void SortAveMeasMatch (off_t *MEAS, off_t *AVE, off_t N) {
     141
     142# define SWAPFUNC(A,B){ off_t tmp_meas; off_t tmp_ave;  \
     143    tmp_meas = MEAS[A]; MEAS[A] = MEAS[B]; MEAS[B] = tmp_meas;          \
     144    tmp_ave  = AVE[A];  AVE[A]  = AVE[B];  AVE[B]  = tmp_ave;           \
     145  }
     146# define COMPARE(A,B)(AVE[A] < AVE[B])
     147  OHANA_SORT (N, COMPARE, SWAPFUNC);
     148# undef SWAPFUNC
     149# undef COMPARE
     150}
     151
     152int delete_photcodes_catalog (Catalog *catalog, photcodes, Nphotcodes) {
     153
     154  off_t i, j, N, currentAve;
     155
     156  off_t *measureSeq = NULL;
     157  off_t *averageSeq = NULL;
     158  Measure *measureTMP = NULL;
     159
     160  /* internal counters */
     161  off_t Nmeasure = catalog[0].Nmeasure;
     162  off_t Naverage = catalog[0].Naverage;
     163
     164  Measure *measure = catalog[0].measure;
     165  Average *average = catalog[0].average;
     166 
     167  if (VERBOSE) fprintf (stderr, "starting with Nave, Nmeas: "OFF_T_FMT" "OFF_T_FMT"\n",  catalog[0].Naverage,  catalog[0]Nmeasure);
     168
     169  // we have a table of average objects and an unsorted table of measurements.  each measurement
     170  // has a reference to the average object sequence (as well as an ID)
     171  // measure[i].averef -> average[averef]
     172  // measure[i].objID = average[averef].objID
     173  // measure[i].catID = average[averef].catID
     174
     175  // we want a sorted measure array with all averef entries in sequence, skipping the entries which match our criteria
     176
     177  // arrays
     178  ALLOCATE (measureDrop,   off_t, Nmeasure);
     179  ALLOCATE (measureSeqRaw, off_t, Nmeasure);
     180  ALLOCATE (measureSeqOut, off_t, Nmeasure);
     181  ALLOCATE (measureAveRaw, off_t, Nmeasure);
     182  ALLOCATE (averageNmeas,  off_t, Naverage);
     183  ALLOCATE (averageDmeas,  off_t, Naverage);
     184  ALLOCATE (averageSeqOut, off_t, Naverage);
     185  ALLOCATE (averageRefOut, off_t, Naverage);
     186  ALLOCATE (measureAveOut, off_t, NmeasOut);
     187
     188  // mark the measures to be dropped
     189  for (i = 0; i < Nmeasure; i++) {
     190    int drop = FALSE;
     191    for (j = 0; !drop && (j < Nphotcodes); j++) {
     192      drop |= (photcodes[j].code == measure[i].photcode);
     193    }
     194    measureDrop[i] = drop;
     195  }
     196
     197  // set up the measure sequence lists
     198  for (i = 0; i < Nmeasure; i++) {
     199    measureSeqRaw[i] = i;
     200    measureAveRaw[i] = measure[i].averef;
     201  }
     202  // sort measureSeqRaw and measureAveRaw in order of measureAveRaw
     203  SortAveMeasMatch(measureSeqRaw, measureAveRaw, Nmeasure);
     204
     205  // generate the measureSeqOut array
     206  off_t NmeasOut = 0;
     207  for (i = 0; i < Nmeasure; i++) {
     208    j = measureSeqRaw[i];
     209    if (measureDrop[j]) continue;
     210    measureSeqOut[NmeasOut] = j;
     211    measureRefOut[j] = NmeasOut;
     212    NmeasOut ++;
     213  }
     214  // n = measureSeqOut[i] : measureOut[i] = measure[n]  (i = 0 -- NmeasOut, n = 0 -- Nmeasure)
     215  // n = measureRefOut[i] : measureOut[n] = measure[i]
     216
     217  // count the number of measures for each averef
     218  off_t N =  0;
     219  off_t D = -1;
     220  currentAve = measureAveRaw[0];
     221  for (i = 0; i < Nmeasure; i++) {
     222    if (measureAveRaw[i] != currentAve) {
     223      // we have hit the next entry in the list
     224      averageNmeas[currentAve] = N; // number of measures
     225      averageDmeas[currentAve] = D; // first measure
     226      N =  0;
     227      D = -1;
     228      currentAve = measureAveRaw[i];
     229    }
     230    j = measureSeqRaw[i];
     231    if (measureDrop[j]) continue;
     232    N++;
     233    if (D == -1) {
     234      // first valid measureOut for this averef
     235      D = measureRefOut[j];
     236    }
     237  }
     238  averageNmeas[currentAve] = N; // number of measures
     239  averageDmeas[currentAve] = D; // first measure
     240
     241  // generate the new average sequence, skipping entries with no measurements
     242  int NaveOut = 0;
     243  for (i = 0; i < Naverage; i++) {
     244    if (averageNmeas[i] == 0) continue;
     245    averageSeqOut[Nave] = i;
     246    averageRefOut[i] = Nave;
     247    Nave ++;
     248  }
     249  // n = averageSeqOut[i] : averageOut[i] = average[n]  (i = 0 -- NaveOut, n = 0 -- Naverage)
     250  // n = averageRefOut[i] : averageOut[n] = average[i]
     251
     252  // generate the output averefs
     253  for (i = 0; i < NmeasOut; i++) {
     254    j = measureSeqOut[i]; // measure[j] = measureOut[i]
     255    n = measureAveRaw[j]; // average[n] : measure[j]
     256    N = averageRefOut[n]; // averageOut[N] = average[n];
     257    measureAveOut[i] = N; // measureOut[i].averef = measureAveOut[i]
     258  }
     259
     260  // copy the (kept) measurements in the sorted order
     261  ALLOCATE (measureOut, Measure, Nmeas);
     262  for (i = 0; i < Nmeas; i++) {
     263    j = measureSeqOut[i];
     264    measureOut[i] = measure[j];
     265    measureOut[i].averef = measureAveOut[i];
     266  }
     267
     268  // copy the (kept) average entries
     269  ALLOCATE (averageOut, Average, Nave);
     270  for (i = 0; i < Nave; i++) {
     271    j = averageSeqOut[i];
     272    averageOut[i] = average[j];
     273    averageOut[i].Nmeasure      = averageNmeas[j];
     274    averageOut[i].measureOffset = averageDmeas[j];
     275  }
     276
     277  // update the values of average.measureOffset and average.Nmeasure
     278  FREE(measure);
     279  FREE(average);
     280  catalog[0].measure = measureOut;
     281  catalog[0].average = averageOut;
     282
     283  // update catalog.Nmeasure and catalog.Naverage, double check
     284  int NmeasureTotal = 0;
     285  int measureOffsetOK = TRUE;
     286  for (i = 0; i < Naverage; i++) {
     287    NmeasureTotal += catalog[0].average[i].Nmeasure;
     288    if (VERBOSE && !(NmeasureTotal <= catalog[0].Nmeasure)) {
     289      fprintf (stderr, "too few measurements: %d %d %d\n", (int) i, NmeasureTotal, (int) catalog[0].Nmeasure);
     290    }
     291    measureOffsetOK &= (catalog[0].average[i].measureOffset < catalog[0].Nmeasure);
     292    if (VERBOSE && !(catalog[0].average[i].measureOffset < catalog[0].Nmeasure)) {
     293      fprintf (stderr, "offset too large: %d %d %d\n", (int) i, catalog[0].average[i].Nmeasure, (int) catalog[0].Nmeasure);
     294    }
     295    measureOffsetOK &= (catalog[0].average[i].measureOffset + catalog[0].average[i].Nmeasure <= catalog[0].Nmeasure);
     296    if (VERBOSE && !(catalog[0].average[i].measureOffset + catalog[0].average[i].Nmeasure <= catalog[0].Nmeasure)) {
     297      fprintf (stderr, "orrset + Nmeasure too large: %d + %d > %d %d\n", (int) i, catalog[0].average[i].measureOffset, catalog[0].average[i].Nmeasure, (int) catalog[0].Nmeasure);
     298    }
     299    m = catalog[0].average[i].measureOffset;
     300    for (j = 0; j < catalog[0].average[i].Nmeasure; j++) {
     301      averefOK &= (catalog[0].measure[m+j].averef == i);
     302      if (VERBOSE && !(catalog[0].measure[m+j].averef == i)) {
     303        fprintf (stderr, "averef broken: %d vs %d (measure %d)\n", (int) i, catalog[0].measure[m+j].averef, m+j);
     304      }
     305    }
     306  }
     307
     308  if (!measureOffsetOK) {
     309    fprintf (stderr, "ERROR: catalog %s has an invalid measureOffset\n", catalog[0].filename);
     310  }
     311
     312  if (!averefOK) {
     313    fprintf (stderr, "ERROR: catalog %s has invalid averefs\n", catalog[0].filename);
     314  }
     315
     316  if (NmeasureTotal != catalog[0].Nmeasure) {
     317    fprintf (stderr, "ERROR: catalog %s has an invalid Nmeasure\n", catalog[0].filename);
     318  }
     319
     320  // MARKTIME("  match time %9.4f sec for %7lld measures, %6lld average\n", dtime, (long long) Nmeasure, (long long) Naverage);
     321
     322  catalog[0].sorted = TRUE;
     323
     324  FREE (measureDrop);
     325  FREE (measureSeqRaw);
     326  FREE (measureSeqOut);
     327  FREE (measureAveRaw);
     328  FREE (averageNmeas);
     329  FREE (averageDmeas);
     330  FREE (averageSeqOut);
     331  FREE (averageRefOut);
     332  FREE (measureAveOut);
     333
     334  return TRUE;
     335}
Note: See TracChangeset for help on using the changeset viewer.