IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13185


Ignore:
Timestamp:
May 2, 2007, 7:06:03 PM (19 years ago)
Author:
eugene
Message:

revised skycell sequence to write image data in blocks

Location:
trunk/Ohana/src/addstar
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/addstar/include/skycells.h

    r12775 r13185  
    5252int    VERBOSE;
    5353int    MODE;
     54int    NMAX;
    5455double SCALE;
    5556
     
    6970int sky_triangle_to_rectangle (Image *image, SkyTriangle *triangle);
    7071
    71 Image *sky_tessalation (int level, int *nimages, int mode, double scale);
    72 Image *sky_tessalation_triangles (int level, int *nimages, double scale);
    73 Image *sky_tessalation_squares (int level, int *nimages, double scale);
     72int sky_tessalation (FITS_DB *db, int level, int Nmax, int mode, double scale);
     73int sky_tessalation_triangles (FITS_DB *db, int level, int Nmax);
     74int sky_tessalation_squares (FITS_DB *db, int level, int Nmax);
     75
     76// migrate to libdvo eventually
     77int dvo_image_clear_vtable (FITS_DB *db);
  • trunk/Ohana/src/addstar/src/args_skycells.c

    r12775 r13185  
    2727  }
    2828
    29   /* what type of output files? */
     29  /* pixel scale (arcsec/pixel) */
    3030  SCALE = 1.0;
    3131  if ((N = get_argument (argc, argv, "-scale"))) {
    3232    remove_argument (N, &argc, argv);
    3333    SCALE = atof (argv[N]);
     34    remove_argument (N, &argc, argv);
     35  }
     36
     37  /* max number of skycells kept in memory */
     38  NMAX = 200000;
     39  if ((N = get_argument (argc, argv, "-nmax"))) {
     40    remove_argument (N, &argc, argv);
     41    NMAX = atof (argv[N]);
    3442    remove_argument (N, &argc, argv);
    3543  }
     
    4048  }
    4149
    42   fprintf (stderr, "USAGE: skycells (level) [-triangles] [-scale arcsec/pix]\n");
     50  fprintf (stderr, "USAGE: skycells (level) [-triangles] [-scale arcsec/pix] [-nmax Max Cells in memory]\n");
    4351  exit (2);
    4452}
  • trunk/Ohana/src/addstar/src/sky_tessalation.c

    r13105 r13185  
    66static int warned = FALSE;
    77
    8 Image *sky_tessalation (int level, int *nimages, int mode, double scale) {
    9 
    10   Image *images;
     8int sky_tessalation (FITS_DB *db, int level, int Nmax, int mode, double scale) {
     9
     10  sky_tessalation_init (scale);
    1111
    1212  if (mode == SQUARES) {
    13     images = sky_tessalation_squares (level, nimages, scale);
    14     return images;
     13    sky_tessalation_squares (db, level, Nmax);
     14    return TRUE;
    1515  }
    1616
    1717  if (mode == TRIANGLES) {
    18     images = sky_tessalation_triangles (level, nimages, scale);
    19     return images;
    20   }
    21 
    22   return NULL;
    23 }
    24 
    25 Image *sky_tessalation_triangles (int level, int *nimages, double scale) {
    26 
    27   int i, Ndigit, Ntriangles;
    28   SkyTriangle *tri, *new;
     18    sky_tessalation_triangles (db, level, Nmax);
     19    return TRUE;
     20  }
     21
     22  return FALSE;
     23}
     24
     25int sky_tessalation_triangles (FITS_DB *db, int level, int Nmax) {
     26
     27  int i, j, Ndigit, Ntriangles, Nbase, Ntotal, Ltop, Nimages;
     28  double Ntop, fLtop;
     29  SkyTriangle *base, *tri, *new;
    2930  Image *image;
    3031  char format[16];
    3132
    32   Ndigit = (int)(log10(20*pow(4.0, level))) + 1 ;
     33  // generate the initial base set
     34  base = sky_base_triangles (&Nbase);
     35
     36  // how many triangles total for this level?
     37  Ntotal = Nbase*pow(4.0, level);
     38  Ndigit = (int)(log10(Ntotal)) + 1 ;
    3339  snprintf (format, 16, "skytri.%%0%dd", Ndigit);
    3440
    35   sky_tessalation_init (scale);
    36 
    37   tri = sky_base_triangles (&Ntriangles);
    38 
    39   for (i = 0; i < level; i++) {
    40     new = sky_divide_triangles (tri, &Ntriangles);
     41  // to what depth do we need to go to have only Nmax foreach subcell?
     42  Ntop = Ntotal / Nmax;
     43  if (Ntop > Nbase) {
     44    fLtop = log10(Ntop / Nbase) / log10(4.0);
     45    if (fLtop > (int)(fLtop)) {
     46      Ltop = fLtop + 1;
     47    } else {
     48      Ltop = fLtop;
     49    }
     50  } else {
     51    Ltop = 0;
     52  }
     53
     54  // subdivide the base set to Ltop level
     55  for (i = 0; i < Ltop; i++) {
     56    new = sky_divide_triangles (base, &Nbase);
     57    free (base);
     58    base = new;
     59  }
     60
     61  // for each base triangle, subdivide the rest of the way and save
     62  for (i = 0; i < Nbase; i++) {
     63    ALLOCATE (tri, SkyTriangle, 1);
     64    tri[0] = base[i];
     65    Ntriangles = 1;
     66    for (j = Ltop; j < level; j++) {
     67      new = sky_divide_triangles (tri, &Ntriangles);
     68      free (tri);
     69      tri = new;
     70    }
     71
     72    // convert the SkyTriangles to Image
     73    ALLOCATE (image, Image, Ntriangles);
     74    for (j = 0; j < Ntriangles; j++) {
     75      sky_triangle_to_image (&image[j], &tri[j]);
     76      snprintf (image[j].name, 32, format, j);
     77    } 
     78    Nimages = Ntriangles;
     79
     80    /* add the new images and save */
     81    dvo_image_addrows (db, image, Nimages);
     82    SetProtect (TRUE);
     83    dvo_image_update (db, VERBOSE);
     84    SetProtect (FALSE);
     85    dvo_image_clear_vtable (db);
     86
     87    free (image);
    4188    free (tri);
    42     tri = new;
    43   }
    44 
    45   ALLOCATE (image, Image, Ntriangles);
    46   for (i = 0; i < Ntriangles; i++) {
    47     sky_triangle_to_image (&image[i], &tri[i]);
    48     snprintf (image[i].name, 32, format, i);
    49   } 
    50 
    51   *nimages = Ntriangles;
    52   return (image);
    53 }
    54 
    55 Image *sky_tessalation_squares (int level, int *nimages, double scale) {
    56 
    57   int i, N, Ndigit, Ntriangles;
    58   SkyTriangle *tri, *new;
    59   Image *image, *outimage;
     89  }
     90  return (TRUE);
     91}
     92
     93int sky_tessalation_squares (FITS_DB *db, int level, int Nmax) {
     94
     95  int i, j, Ndigit, Ntriangles, Nbase, Ntotal, Ntop, Ltop, Nout;
     96  double fLtop;
     97  SkyTriangle *base, *tri, *new;
     98  Image *image, *out;
    6099  char format[16];
    61100
    62   // XXX I need to adjust for the number of cell subdivisions
    63   Ndigit = (int)(log10(20*pow(4.0, level))) + 1 ;
     101  // generate the initial base set
     102  base = sky_base_triangles (&Nbase);
     103
     104  // how many total cells for this level (multiply by subdivisions, if used)?
     105  Ntotal = Nbase*pow(4.0, level);
     106  Ndigit = (int)(log10(Ntotal)) + 1 ;
    64107  snprintf (format, 16, "skycell.%%0%dd", Ndigit);
    65108
    66   sky_tessalation_init (scale);
    67 
    68   tri = sky_base_triangles (&Ntriangles);
    69 
    70   for (i = 0; i < level; i++) {
    71     new = sky_divide_triangles (tri, &Ntriangles);
     109  // to what depth do we need to go to have only Nmax foreach subcell?
     110  Ntop = Ntotal / Nmax;
     111  if (Ntop > Nbase) {
     112    fLtop = log10(Ntotal / (double)(Ntop * Nbase)) / log10(4.0);
     113    if (fLtop > (int)(fLtop)) {
     114      Ltop = fLtop + 1;
     115    } else {
     116      Ltop = fLtop;
     117    }
     118  } else {
     119    Ltop = 0;
     120  }
     121
     122  // subdivide the base set to Ltop level
     123  for (i = 0; i < Ltop; i++) {
     124    new = sky_divide_triangles (base, &Nbase);
     125    free (base);
     126    base = new;
     127  }
     128
     129  // for each base triangle, subdivide the rest of the way and save
     130  for (i = 0; i < Nbase; i++) {
     131    ALLOCATE (tri, SkyTriangle, 1);
     132    tri[0] = base[i];
     133    Ntriangles = 1;
     134    for (j = Ltop; j < level; j++) {
     135      new = sky_divide_triangles (tri, &Ntriangles);
     136      free (tri);
     137      tri = new;
     138    }
     139
     140    // convert the SkyTriangles to Image
     141    ALLOCATE (image, Image, Ntriangles);
     142    for (j = 0; j < Ntriangles; j++) {
     143      sky_triangle_to_rectangle (&image[j], &tri[j]);
     144    } 
     145
     146    // drop the appropriate subset
     147    ALLOCATE (out, Image, Ntriangles);
     148    for (j = Nout = 0; j < Ntriangles; j++) {
     149      if (!strcmp(image[j].coords.ctype, "DROP")) continue;
     150      memcpy (&out[Nout], &image[j], sizeof(Image));
     151      snprintf (out[Nout].name, 32, format, j);
     152      Nout++;
     153    } 
     154    free (image);
     155
     156    /* add the new images and save */
     157    dvo_image_addrows (db, out, Nout);
     158    SetProtect (TRUE);
     159    dvo_image_update (db, VERBOSE);
     160    SetProtect (FALSE);
     161    dvo_image_clear_vtable (db);
     162
     163    free (out);
    72164    free (tri);
    73     tri = new;
    74   }
    75 
    76   ALLOCATE (image, Image, Ntriangles);
    77   for (i = 0; i < Ntriangles; i++) {
    78     sky_triangle_to_rectangle (&image[i], &tri[i]);
    79   } 
    80 
    81   // FILE *f1 = fopen ("center.keep.dat", "w");
    82   // FILE *f2 = fopen ("center.drop.dat", "w");
    83 
    84   ALLOCATE (outimage, Image, Ntriangles);
    85   for (i = N = 0; i < Ntriangles; i++) {
    86     if (!strcmp(image[i].coords.ctype, "DROP")) {
    87       // fprintf (f2, "%f %f\n", tri[i].r, tri[i].d);
    88       continue;
    89     } else {
    90       // fprintf (f1, "%f %f\n", tri[i].r, tri[i].d);
    91     }
    92     memcpy (&outimage[N], &image[i], sizeof(Image));
    93     snprintf (outimage[N].name, 32, format, i);
    94     N++;
    95   } 
    96   free (image);
    97 
    98   // fclose (f1);
    99   // fclose (f2);
    100 
    101   *nimages = N;
    102   return (outimage);
     165  }
     166  return (TRUE);
    103167}
    104168
     
    492556  return (TRUE);
    493557}
     558
     559// free the space used by the current vtable entries
     560int dvo_image_clear_vtable (FITS_DB *db) {
     561
     562  int Nimages;
     563  int i, N, Nx, Ny;
     564
     565  // free memory used by the current vtable rows
     566  for (i = 0; i < db[0].vtable.Nrow; i++) {
     567    free (db[0].vtable.buffer[i]);
     568  }
     569  REALLOCATE (db[0].vtable.buffer, char *, 1);
     570  REALLOCATE (db[0].vtable.row, int, 1);
     571  db[0].vtable.Nrow   = 0;
     572
     573  // reset db[0].theader(NAXIS1) to match Image
     574  gfits_modify (&db[0].theader, "NAXIS1", "%d", 1, sizeof(Image));
     575  db[0].theader.Naxis[0] = sizeof(Image);
     576
     577  return (TRUE);
     578}
  • trunk/Ohana/src/addstar/src/skycells.c

    r12775 r13185  
    1313  level = atoi (argv[1]);
    1414 
    15   images = sky_tessalation (level, &Nimages, MODE, SCALE);
    16 
    1715  /*** update the image table ***/
    1816  /* setup image table format and lock */
     
    3230  }
    3331
    34   /* add the new images and save */
    35   dvo_image_addrows (&db, images, Nimages);
    36   SetProtect (TRUE);
    37   dvo_image_update (&db, VERBOSE);
    38   SetProtect (FALSE);
     32  // we have to put the database update calls deep down in the sky_tessalation code so we
     33  // can write out the skycells in limited-sized chunks.
     34  sky_tessalation (&db, level, NMAX, MODE, SCALE);
    3935
    4036  dvo_image_unlock (&db);
    4137  exit (0);
    4238}
     39
     40/*
     41 * - we start with the image database loaded into memory (db)
     42 * - we convert this to an empty vtable
     43 * - add groups of images to the vtable
     44 * - we write out the vtable data
     45 * - zero-out the saved entries,
     46 */
     47
Note: See TracChangeset for help on using the changeset viewer.