IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 22, 2011, 12:35:53 AM (15 years ago)
Author:
eugene
Message:

merged from eam_branches/ipp-20110505: plugged some leaks, allow limited density

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/relastro/src/bcatalog.c

    r30616 r31664  
    7070      // allowed.
    7171
     72      // CopyMeasureTiny (&subcatalog[0].measureT[Nmeasure], &catalog[0].measure[offset]);
     73
     74      subcatalog[0].measure[Nmeasure] = catalog[0].measure[offset];
    7275      subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_SKIP_ASTROM;
    7376      subcatalog[0].measure[Nmeasure].dbFlags &= ~ID_MEAS_NOCAL;
    74       subcatalog[0].measure[Nmeasure]          = catalog[0].measure[offset];
    7577      subcatalog[0].measure[Nmeasure].averef   = Naverage;
    7678      if (RESET) {
     
    9698  REALLOCATE (subcatalog[0].average, Average, MAX (Naverage, 1));
    9799  REALLOCATE (subcatalog[0].measure, Measure, MAX (Nmeasure, 1));
    98   REALLOCATE (subcatalog[0].secfilt, SecFilt, Nsecfilt*MAX (Naverage, 1));
     100  REALLOCATE (subcatalog[0].secfilt, SecFilt, MAX (Naverage, 1)*Nsecfilt);
    99101  subcatalog[0].Naverage = Naverage;
    100102  subcatalog[0].Nmeasure = Nmeasure;
     
    103105  assert (Nsecfilt == catalog[0].Nsecfilt);
    104106
     107  // limit the total number of stars in the catalog
     108  if (MaxDensityUse) {
     109    LimitDensityCatalog (subcatalog, catalog);
     110  }
     111
    105112  if (VERBOSE) {
    106113    fprintf (stderr, OFF_T_FMT": using "OFF_T_FMT" stars ("OFF_T_FMT" measures) for catalog\n",  i,  subcatalog[0].Naverage,  subcatalog[0].Nmeasure);
     
    108115  return (TRUE);
    109116}
     117
     118/* this version does NOT use AverageTiny, MeasureTiny */
     119int LimitDensityCatalog (Catalog *subcatalog, Catalog *catalog) {
     120
     121  Catalog tmpcatalog;
     122
     123  double Rmin, Rmax, Dmin, Dmax;
     124
     125  int Nsecfilt = GetPhotcodeNsecfilt ();
     126
     127  gfits_scan (&catalog[0].header, "RA0",  "%lf", 1, &Rmin);
     128  gfits_scan (&catalog[0].header, "DEC0", "%lf", 1, &Dmin);
     129  gfits_scan (&catalog[0].header, "RA1",  "%lf", 1, &Rmax);
     130  gfits_scan (&catalog[0].header, "DEC1", "%lf", 1, &Dmax);
     131
     132  if (VERBOSE2) fprintf (stderr, "extracting from catalog covering region %f,%f to %f,%f\n", Rmin, Dmin, Rmax, Dmax);
     133
     134  float AREA = fabs(Dmax - Dmin) * fabs(Rmax - Rmin) * cos (0.5*RAD_DEG*(Dmax + Dmin));
     135  assert (AREA > 0);
     136
     137  off_t Nmax = MaxDensityValue * AREA;
     138  if (subcatalog[0].Naverage <= Nmax) {
     139    if (VERBOSE) {
     140      fprintf (stderr, "subcatalog has less than the max density\n");
     141    }
     142    return (TRUE);
     143  }
     144
     145  off_t Naverage = subcatalog[0].Naverage;
     146
     147  // select a random subset of Nmax stars from subcatalog using Fisher-Yates
     148
     149  // we are going to select Nmax entries by generating a random-sorted index list
     150  off_t *index, tmp, i, j, ave;
     151  ALLOCATE (index, off_t, Naverage);
     152  for (i = 0; i < Naverage; i++) {
     153    index[i] = i;
     154  }
     155  for (i = 0; i < Naverage; i++) {
     156    j = (Naverage - i) * drand48() + i; // a number between i and Naverage
     157    tmp = index[j];
     158    index[j] = index[i];
     159    index[i] = tmp;
     160  }
     161
     162  // count the number of measurements this selection will yield
     163  off_t NMEASURE = 0;
     164  for (i = 0; i < Nmax; i++) {
     165    ave = index[i];
     166    NMEASURE += subcatalog[0].average[ave].Nmeasure;
     167  }
     168
     169  // allocate the output data
     170  ALLOCATE (tmpcatalog.average, Average, Nmax);
     171  ALLOCATE (tmpcatalog.measure, Measure, NMEASURE);
     172  ALLOCATE (tmpcatalog.secfilt, SecFilt, Nmax * Nsecfilt);
     173
     174  off_t Nmeasure = 0;
     175
     176  // copy the Nmax selected entries from subcatalog to tmpcatalog (adjusting links)
     177  for (i = 0; i < Nmax; i++) {
     178    ave = index[i];
     179    tmpcatalog.average[i] = subcatalog[0].average[ave];
     180    tmpcatalog.average[i].measureOffset = Nmeasure;
     181    for (j = 0; j < tmpcatalog.average[i].Nmeasure; j++) {
     182      off_t offset = subcatalog[0].average[ave].measureOffset + j;
     183      tmpcatalog.measure[Nmeasure] = subcatalog[0].measure[offset];
     184      tmpcatalog.measure[Nmeasure].averef = i;
     185      Nmeasure ++;
     186    }
     187  }
     188
     189  if (VERBOSE) {
     190    fprintf (stderr, "limited to "OFF_T_FMT" of "OFF_T_FMT" stars ("OFF_T_FMT" of "OFF_T_FMT" measures) for catalog %s\n",
     191             Nmax, subcatalog[0].Naverage, Nmeasure, subcatalog[0].Nmeasure,  catalog[0].filename);
     192  }
     193
     194  free (subcatalog[0].average);
     195  free (subcatalog[0].measure);
     196  free (subcatalog[0].secfilt);
     197
     198  subcatalog[0].average = tmpcatalog.average;
     199  subcatalog[0].measure = tmpcatalog.measure;
     200  subcatalog[0].secfilt = tmpcatalog.secfilt;
     201  subcatalog[0].Naverage = Nmax;
     202  subcatalog[0].Nmeasure = Nmeasure;
     203  subcatalog[0].Nsecfilt = catalog[0].Nsecfilt;
     204  subcatalog[0].Nsecf_mem = Naverage * catalog[0].Nsecfilt;
     205
     206  return (TRUE);
     207}
     208
Note: See TracChangeset for help on using the changeset viewer.