IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 41424


Ignore:
Timestamp:
Sep 29, 2020, 12:14:23 PM (6 years ago)
Author:
eugene
Message:

updates to allow for level L5

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

Legend:

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

    r40583 r41424  
    11351135SkyList   *SkyListChildrenByBounds_List PROTO((SkyList *table, int depth, double Rmin, double Rmax, double Dmin, double Dmax));
    11361136
     1137/* APIs to split and extend a skytable */
     1138void       SkyTableL5fromL4_List   PROTO((SkyRegion *L4, SkyTable *L5, int Nfirst));
     1139void       SkyTableExtend          PROTO((SkyTable *old, SkyTable *new, int depth));
     1140
     1141
    11371142int set_skyregion(double Rs, double Re, double Ds, double De);
    11381143int get_skyregion (double *Rs, double *Re, double *Ds, double *De);
  • trunk/Ohana/src/libdvo/src/skyregion_gsc.c

    r41422 r41424  
    3939int NsetForDecRange (float dDec);
    4040void SkyRegionPrint (SkyRegion *region);
     41
     42void SkyTableExtend (SkyTable *old, SkyTable *new, int depth);
     43void SkyTableL5fromL4_List (SkyRegion *L4, SkyTable *L5, int Nfirst);
     44
     45void SkyTableValidate (SkyTable *table);
    4146
    4247SkyTable *SkyTableFromGSC (char *filename, int depth, int VERBOSE) {
     
    160165  skytable[0].Nregions = 0;
    161166
     167  skytable[0].filename = NULL;
     168
    162169  // define the host table filename
    163170  strcpy (skytable->hosts, "HostTable.dat");
     
    171178  SkyTableAppend (skytable, &L2, skytable[0].Nregions - L1.Nregions);
    172179  SkyTableAppend (skytable, &L3, skytable[0].Nregions - L2.Nregions);
     180  SkyTableAppend (skytable, &L4, skytable[0].Nregions - L3.Nregions);
     181
     182  SkyTableValidate (skytable);
     183
     184  free (L0.regions);
     185  free (L1.regions);
     186  free (L2.regions);
     187  free (L3.regions);
     188  free (L4.regions);
     189  gfits_free_header (&theader);
     190  gfits_free_table (&ftable);
    173191
    174192  // XXX TEST : for L4 entries in a certain ra,dec range, generate L5 entries:
    175 
     193# if (0)
    176194  SkyTable L5;
    177195  L5.Nregions = 0;
     
    189207  }
    190208
    191   SkyTableAppend (skytable, &L4, skytable[0].Nregions - L3.Nregions);
    192 
    193209  SkyTableAppend (skytable, &L5, skytable[0].Nregions - L4.Nregions);
    194210  free (L5.regions);
    195 
    196   free (L0.regions);
    197   free (L1.regions);
    198   free (L2.regions);
    199   free (L3.regions);
    200   free (L4.regions);
    201   gfits_free_header (&theader);
    202   gfits_free_table (&ftable);
     211# endif
    203212
    204213  /* fix the depth elements and create the filename array */
     
    208217    skytable[0].regions[i].table = (skytable[0].regions[i].depth == depth);
    209218  }
     219
     220  // XXX TEST : for L4 entries in a certain ra,dec range, generate L5 entries:
     221# if (0)
     222  SkyTable L5;
     223  L5.Nregions = 0;
     224  L5.Nalloc   = 1000;
     225  ALLOCATE (L5.regions, SkyRegion, L5.Nalloc);
     226
     227  // get a list of the SkyRegions which overlap the point at the depth (only 1)
     228  SkyList *skylist = SkyRegionByPoint (skytable, 4, 10.0, 40.0);
     229
     230  for (i = 0; i < skylist->Nregions; i++) {
     231    SkyTableL5fromL4_List (skylist->regions[i], &L5, skytable->Nregions);
     232  }
     233
     234  SkyTableExtend (skytable, &L5, depth);
     235  free (L5.regions);
     236# endif
    210237
    211238  // ohana_memdump (0);
     
    565592}
    566593
     594int NDIV_L5 = 5;
     595
    567596// append new regions on to the supplied L5 list (may be empty)
    568597void SkyTableL5fromL4 (SkyRegion *L4, SkyTable *L5) {
     
    573602
    574603  Nr = L5[0].Nregions;
    575   L5[0].Nregions += NDIV*NDIV;
     604  L5[0].Nregions += NDIV_L5*NDIV_L5;
    576605  CHECK_REALLOCATE (L5[0].regions, SkyRegion, L5[0].Nalloc, L5[0].Nregions, 0.5*L5[0].Nalloc);
    577606
     
    582611  // XXX handle the pole regions just a bit differently...
    583612
    584   /* subdivide L4 into NDIV boxes */
     613  /* subdivide L4 into NDIV_L5 boxes */
    585614  Rmin = L4[0].Rmin;
    586615  Dmin = L4[0].Dmin;
    587   dR = (L4[0].Rmax - L4[0].Rmin) / NDIV;
    588   dD = (L4[0].Dmax - L4[0].Dmin) / NDIV;
     616  dR = (L4[0].Rmax - L4[0].Rmin) / NDIV_L5;
     617  dD = (L4[0].Dmax - L4[0].Dmin) / NDIV_L5;
    589618
    590619  Nbox = 0;
    591   for (ny = 0; ny < NDIV; ny ++) {
    592     for (nx = 0; nx < NDIV; nx ++) {
     620  for (ny = 0; ny < NDIV_L5; ny ++) {
     621    for (nx = 0; nx < NDIV_L5; nx ++) {
    593622      L5[0].regions[Nr].Rmin     = Rmin  + (nx + 0)*dR;
    594623      L5[0].regions[Nr].Rmax     = Rmin  + (nx + 1)*dR;
     
    618647}
    619648
     649// append new regions on to the supplied L5 list (may be empty)
     650void SkyTableL5fromL4_List (SkyRegion *L4, SkyTable *L5, int Nfirst) {
     651
     652  int nx, ny, Nr, Nbox;
     653  double Rmin, Dmin, dR, dD;
     654  char name[80];
     655
     656  Nr = L5[0].Nregions;
     657  L5[0].Nregions += NDIV_L5*NDIV_L5;
     658  CHECK_REALLOCATE (L5[0].regions, SkyRegion, L5[0].Nalloc, L5[0].Nregions, 0.5*L5[0].Nalloc);
     659
     660  // Nfirst is the index value which the first entry in the new table of regions would get.
     661
     662  // These child ranges are relative to the index of the first entry in this L5 region.
     663  // This is the value of Nregions of the full table.
     664
     665  L4[0].child  = TRUE;
     666  L4[0].childS = Nfirst + Nr;
     667  L4[0].childE = Nfirst + L5[0].Nregions;
     668
     669  // XXX handle the pole regions just a bit differently...
     670
     671  /* subdivide L4 into NDIV_L5 boxes */
     672  Rmin = L4[0].Rmin;
     673  Dmin = L4[0].Dmin;
     674  dR = (L4[0].Rmax - L4[0].Rmin) / NDIV_L5;
     675  dD = (L4[0].Dmax - L4[0].Dmin) / NDIV_L5;
     676
     677  Nbox = 0;
     678  for (ny = 0; ny < NDIV_L5; ny ++) {
     679    for (nx = 0; nx < NDIV_L5; nx ++) {
     680      L5[0].regions[Nr].Rmin     = Rmin  + (nx + 0)*dR;
     681      L5[0].regions[Nr].Rmax     = Rmin  + (nx + 1)*dR;
     682      L5[0].regions[Nr].Dmin     = Dmin + (ny + 0)*dD;
     683      L5[0].regions[Nr].Dmax     = Dmin + (ny + 1)*dD;
     684
     685      L5[0].regions[Nr].index    =  Nfirst + Nr;
     686      L5[0].regions[Nr].depth    =  5;
     687      L5[0].regions[Nr].table    =  -1;
     688      L5[0].regions[Nr].parent   =  L4[0].index;
     689      L5[0].regions[Nr].child    =  FALSE;
     690      L5[0].regions[Nr].childS   =  0;
     691      L5[0].regions[Nr].childE   =  0;
     692      L5[0].regions[Nr].hostFlags = 0;
     693      L5[0].regions[Nr].hostID    = 0;
     694      L5[0].regions[Nr].backupID  = 0;
     695
     696      myAssert (snprintf (name, 80, "%s.%02d", L4[0].name, Nbox) < 80, "overflow");
     697      strcpy (L5[0].regions[Nr].name, name);
     698      if (DEBUG >= 4) SkyRegionPrint (&L5[0].regions[Nr]);
     699
     700      Nr ++;
     701      Nbox ++;
     702    }
     703  }
     704  return;
     705}
     706
     707// add the supplied skytable regions to the end.
     708// the parent, child, and index values are already correct
     709void SkyTableExtend (SkyTable *old, SkyTable *new, int depth) {
     710
     711  int i, Nold;
     712
     713  Nold = old[0].Nregions;
     714
     715  old[0].Nregions += new[0].Nregions;
     716  REALLOCATE (old[0].regions,  SkyRegion, old[0].Nregions);
     717  REALLOCATE (old[0].filename, char *,    old[0].Nregions);
     718
     719  for (i = 0; i < new[0].Nregions; i++) {
     720    old[0].regions[i + Nold] = new[0].regions[i];
     721    old[0].regions[i + Nold].table = (old[0].regions[i + Nold].depth == depth);
     722    old[0].filename[i + Nold] = NULL;
     723  }
     724  return;
     725}
     726
    620727// memory neutral
     728
     729/* We have a skytable with a certain number of entries.
     730   Add the new entries on to the end of this table
     731 */
     732
    621733void SkyTableAppend (SkyTable *old, SkyTable *new, int Nprev) {
    622734
     
    628740  REALLOCATE (old[0].regions, SkyRegion, old[0].Nregions);
    629741
     742  // this code assumes that the parents of all supplied
     743  // new regions are the last block of regions
    630744  for (i = Nprev; i < Nold; i++) {
    631745    old[0].regions[i].childS += Nold;
     
    635749  for (i = 0; i < new[0].Nregions; i++) {
    636750    old[0].regions[i + Nold] = new[0].regions[i];
    637     old[0].regions[i + Nold].parent += Nold;
     751    old[0].regions[i + Nold].parent += Nprev;
    638752    old[0].regions[i + Nold].index += Nold;
    639753  }
     754  return;
     755}
     756
     757void SkyTableValidate (SkyTable *table) {
     758
     759  for (int i = 0; i < table[0].Nregions; i++) {
     760    int idx = table[0].regions[i].index; // my index
     761
     762    // index should match sequence
     763    myAssert (i == idx, "bad index");
     764
     765    int parent = table[0].regions[i].parent;
     766    if (parent != -1) {
     767      // my index should be in the range of my parent's children
     768      myAssert (idx >= table[0].regions[parent].childS, "bad childS");
     769      myAssert (idx  < table[0].regions[parent].childE, "bad childE");
     770    }
     771    int Ns = table[0].regions[i].childS;
     772    int Ne = table[0].regions[i].childE;
     773    if (Ns && Ne) {
     774      for (int j = Ns; j < Ne; j++) {
     775        // my children should all have my index as the parent
     776        myAssert (table[0].regions[j].parent == idx, "bad parent");
     777      }
     778    }
     779  }
     780
     781  fprintf (stderr, "validated skytable\n");
    640782  return;
    641783}
  • trunk/Ohana/src/libdvo/src/skyregion_ops.c

    r40384 r41424  
    116116
    117117  list[0].regions[0] = &region[No];
    118   list[0].filename[0] = table[0].filename[No];
     118  if (table[0].filename) {
     119    list[0].filename[0] = table[0].filename[No];
     120  }
    119121  list[0].Nregions = 1;
    120122  return (list);
Note: See TracChangeset for help on using the changeset viewer.