IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 8295


Ignore:
Timestamp:
Aug 11, 2006, 4:50:07 PM (20 years ago)
Author:
eugene
Message:

working on intermediate level between dec bands and gsc regions

Location:
trunk/Ohana/src/libdvo
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/libdvo/Makefile

    r6683 r8295  
    105105        cp $(INC)/$* $(DESTINC)/
    106106
     107tabletest: install
     108        gcc -L$(LLIB) -I$(LINC) -o tabletest $(SRC)/tabletest.c -ldvo -lFITS -lohana -lm
     109
    107110clean:
    108111        rm -f */*~
  • trunk/Ohana/src/libdvo/src/skyregion_gsc.c

    r7782 r8295  
    1212                           "s0000", "s0730", "s1500", "s2230", "s3000", "s3730", "s4500", "s5230", "s6000", "s6730", "s7500", "s8230", "none"};
    1313
     14void SkyTableSort (SkyTable *table);
     15
    1416SkyTable *SkyTableFromGSC (char *filename, int depth, int VERBOSE) {
    1517
    16   int i, j, Nx, Ny, No, Nr, NR, Nlines;
     18  int i, j, Nx, Ny, No, Nb, Nr, NR, Nlines;
    1719  int nx, ny, Ne, Ns, Nbox;
    1820  double RA0, RA1, DEC0, DEC1, dR, dD;
     
    2325  SkyTable *skytable;
    2426  SkyRegion *regions;
     27  SkyTable bandregions;
    2528  FILE *f;
    2629 
     
    9598  regions[No].childE = Nr;
    9699
    97   /* level 2 : copy the data from the GSC Region files */
     100  /* level 2 : identify the blocks in the DEC bands */
     101  No = 1;
     102  for (i = 0; i < 25; i++) {
     103    if (i == 12) continue;
     104
     105    Nlines = 0;
     106    for (j = 0; j < i; j++) Nlines += DecLines[j];
     107
     108    /* find and save all GSC Regions in this band */
     109    Nb = 0;
     110    ALLOCATE (bandregions.regions, SkyRegion, DecLines[i]);
     111    ALLOCATE (bandregions.filename, char *, DecLines[i]);
     112    for (j = 0; j < DecLines[i]; j++) {
     113      strncpy (temp, &ftable.buffer[(j + Nlines)*48], 48);
     114      temp[49] = 0;
     115      hstgsc_hms_to_deg (&RA0, &RA1, &DEC0, &DEC1, &temp[7]);
     116      if (DEC1 < DEC0) SWAP (DEC0, DEC1);
     117
     118      /* check that we are in correct Dec band */
     119      if (DEC1 < regions[No].Dmin) {
     120        fprintf (stderr, "error: table mis-match (1)\n");
     121        fprintf (stderr, "line: %s\n", temp);
     122        fprintf (stderr, "region %d: %f - %f\n", No, regions[No].Dmin, regions[No].Dmax);
     123        return (NULL);
     124      }
     125      if (DEC0 > regions[No].Dmax) {
     126        fprintf (stderr, "error: table mis-match (2)\n");
     127        fprintf (stderr, "line: %s\n", temp);
     128        fprintf (stderr, "region %d: %f - %f\n", No, regions[No].Dmin, regions[No].Dmax);
     129        return (NULL);
     130      }
     131
     132      /* regions with RA0 < 360 have RA1 == 0.0 */
     133      if (RA1 < RA0) RA1 += 360.0;
     134
     135      bandregions.regions[Nb].Dmin = DEC0;
     136      bandregions.regions[Nb].Dmax = DEC1;
     137      bandregions.regions[Nb].Rmin = RA0;
     138      bandregions.regions[Nb].Rmax = RA1;
     139      bandregions.filename[Nb] = NULL;
     140      Nb ++;
     141    }
     142    bandregions.Nregions = Nb;
     143
     144    /* sort the band regions by Rmin */
     145    SkyTableSort (&bandregions);
     146   
     147    {
     148      int k, Nt, Nrange, Ndiv, Nset;
     149      int *transitions;
     150      float dDec, dDcur;
     151
     152      /* search for transitions in the region dDec */
     153      ALLOCATE (transitions, int, 50);
     154      Nt = 0;
     155      dDec = bandregions.regions[0].Dmax - bandregions.regions[0].Dmin;
     156      dDcur = dDec;
     157      transitions[0] = 0;
     158      Nt++;
     159      DEC0 = bandregions.regions[0].Dmin;
     160      DEC1 = bandregions.regions[0].Dmax;
     161      for (j = 0; j < Nb; j++) {
     162        DEC0 = MIN (bandregions.regions[j].Dmin, DEC0);
     163        DEC1 = MAX (bandregions.regions[j].Dmax, DEC1);
     164        dDec = bandregions.regions[j].Dmax - bandregions.regions[j].Dmin;
     165        if (dDec != dDcur) {
     166          dDcur = dDec;
     167          transitions[Nt] = j;
     168          Nt++;
     169        }
     170      }
     171      transitions[Nt] = Nb;
     172      Nt++;
     173
     174      /* subdivide each transition range */
     175      for (j = 1; j < Nt; j++) {
     176        Ne = transitions[j];
     177        Ns = transitions[j-1];
     178        dDec = bandregions.regions[Ns].Dmax - bandregions.regions[Ns].Dmin;
     179        fprintf (stderr, "trans: %d - %d : ", Ns, Ne);
     180        fprintf (stderr, "%f,%f - %f,%f\n",
     181                 bandregions.regions[Ns].Rmin, bandregions.regions[Ne-1].Rmax,
     182                 bandregions.regions[Ns].Dmin, bandregions.regions[Ns].Dmax);
     183
     184        Nrange = transitions[j] - transitions[j-1];
     185        Ndiv = (int) (0.5 + 7.5 / dDec);
     186        switch (Ndiv) {
     187          case 2:
     188            Nset = 4*2;
     189            break;
     190          case 3:
     191            Nset = 6*3;
     192            break;
     193          case 4:
     194            Nset = 8*4;
     195            break;
     196          default:
     197            fprintf (stderr, "programming error\n");
     198            exit (2);
     199        }
     200        for (k = Ns; k < Ne; k += Nset) {
     201          regions[Nr].Rmin = bandregions.regions[k].Rmin;
     202          if (k + Nset < Ne) {
     203            regions[Nr].Rmax = bandregions.regions[k+Nset-1].Rmax;
     204          } else {
     205            regions[Nr].Rmax = bandregions.regions[Ne-1].Rmax;
     206          }     
     207          regions[Nr].Dmin = DEC0;
     208          regions[Nr].Dmax = DEC1;
     209          fprintf (stderr, "new: %f - %f :%f - %f\n",
     210                   regions[Nr].Rmin, regions[Nr].Rmax,
     211                   regions[Nr].Dmin, regions[Nr].Dmax);
     212        }
     213
     214        regions[Nr].index    =  Nr;
     215        regions[Nr].depth    =  2;
     216        regions[Nr].parent   =  No;
     217        regions[Nr].child    =  TRUE;
     218        regions[Nr].table    =  (depth == 2);
     219        regions[Nr].childS   =  0;
     220        regions[Nr].childE   =  0;
     221      }
     222      regions[No].childS = Nr;
     223      regions[No].childE = Nr;
     224      No ++;
     225    }
     226  }
     227
     228  /* level 3 : copy the data from the GSC Region files */
     229  /* XXX fix this: level here is now 3 */
    98230  No = 1;
    99231  for (i = 0; i < 25; i++) {
     
    152284
    153285  /* subdivide level 2 into NDIV boxes */
     286  /* XXX level here is now 4 */
    154287  Ns = regions[regions[0].childS].childS;
    155288  Ne = regions[regions[0].childE - 1].childE;
     
    201334  return (skytable);
    202335}
     336
     337/* sort skytable by Rmin */
     338void SkyTableSort (SkyTable *table) {
     339
     340  int i, j, k, l, ir, N;
     341  SkyRegion *regions;
     342  SkyRegion tempregion;
     343  char **filename;
     344  char *tempfile;
     345 
     346  N = table[0].Nregions;
     347  regions = table[0].regions;
     348  filename = table[0].filename;
     349
     350  if (N < 2) return;
     351  l = N >> 1;
     352  ir = N - 1;
     353  for (;;) {
     354    if (l > 0) {
     355      l--;
     356      tempregion = regions[l];
     357      tempfile   = filename[l];
     358    } else {
     359      tempregion   = regions[ir];
     360      tempfile     = filename[ir];
     361      regions[ir]   = regions[0];
     362      filename[ir] = filename[0];
     363      if (--ir == 0) {
     364        regions[0]   = tempregion;
     365        filename[0] = tempfile;
     366        return;
     367      }
     368    }
     369    i = l;
     370    j = (l << 1) + 1;
     371    while (j <= ir) {
     372      if (j < ir && regions[j].Rmin < regions[j+1].Rmin) ++j;
     373      if (tempregion.Rmin < regions[j].Rmin) {
     374        regions[i]   = regions[j];
     375        filename[i] = filename[j];
     376        j += (i=j) + 1;
     377      }
     378      else j = ir + 1;
     379    }
     380    regions[i]   = tempregion;
     381    filename[i] = tempfile;
     382  }
     383}
Note: See TracChangeset for help on using the changeset viewer.