[Kst] HPIC update

Theodore Kisner kisner at physics.ucsb.edu
Thu Jun 9 07:10:59 CEST 2005


I was re-reading my previous response and I think I wasn't quite clear, here 
is another attempt to straighten out any confusion...  Also see very bottom 
of this mail for another proposed way of implementing all this.

> what do you plan for part-sphere maps (like b2k deep)?  Will there be a way
> to auto-scale in xy?

ok, if you are talking about storing partial-sky maps in memory, this will not 
be supported initially.  Every FITS file (cut sky or full sky) will be read 
into a full-sky vector in memory.  Once HPIC supports tree-based storage, it 
will be possible to read a cut-sphere FITS file into a smaller memory 
footprint, in exchange for a slight hit in acess time.

Also, just to be clear how the projection works, if I have an N_x by N_y 
rectangular grid that represents an angular range (Theta_min, Phi_min) to 
(Theta_max, Phi_max), then I have functions in HPIC that do the 
forward/reverse projection from pixels to (theta, phi).  So I'm NOT talking 
about projecting the whole sphere, just a defined range.

So I was going to obtain the current theta/phi range and window size from 
Kst2DPlot and project the data accordingly onto the backbuffer.

> The problem with this is that it seems to add a parallel map structure to
> the Matrix/Image stuff, (which already has UI issues in actually accessing
> maps.)

ok, I think we are just using slightly different terminology here, and I think 
I see what you are getting at.  KstMatrix + KstImage + Kst2DPlot::plotImages 
is also a way of taking a KstVector and painting it to a buffer.  So the 2 
"analogous" methods we have are:

KstVector (flat-packed matrix) 
 --> KstMatrix (vector "projected" onto a 2D grid)
  --> KstImage (describes parameters of how matrix is painted 
      with a palette and contours) 
   --> Kst2DPlot::plotImages (actually does the painting)

KstVector (healpix map vector)
 --> KstHpic (describes parameters of how the map should be 
     projected, including palette, etc)
  --> Kst2DPlot::plotHpic (actually does the projection and 
      painting in a single step)

Sooo, it seems like the concerns are:  (1) can we merge any redundant features 
and (2) should we do the projection outside of Kst2DPlot for speed reasons.

I now see what you were saying earlier, Barth.  If we move the projection into 
the datasource and output an already-projected KstMatrix, that would 
certainly be faster for zooming.  However- if we project a subset of the data 
to a limited range of theta/phi, what happens when the user scrolls outside 
that range?  Do we regenerate the projection?  Do we just show white space 
until they click the "re-render" option?  This is the reason I was going to 
try to reproject the data at each redraw...

Also, we still need a way of taking 2 maps, using them as vector components, 
and outputting the projected coordinates of vector heads/tails.  I was 
originally going to have all the necessary vectors stored in KstHpic and then 
do the vectorfield projection in the paint function.  I guess that *would* be 
slow...

So here is another option that would be fast and require minimal code 
modifications:

1.  add a virtual function to KstDataSource that returns a field as a matrix 
(readFieldMatrix?)

2.  for datasources that define the readFieldMatrix function, make sure that 
all of the necessary projection information is either read from the file or 
obtained via the datasource config dialog.

3.  for the HPIC datasource, readFieldMatrix would return a given field 
projected onto a matrix, using projection range and parameters set from the 
config dialog.  The defaults for the projection range would be set initially 
so that the theta/phi range of the projection was big enough to include all 
non-null pixels.

4.  for the HPIC datasource, readField would return the same healpix map 
vectors that it currently does.

5.  I could create a plugin that takes 2 healpix map vectors, treats them as 
vector field components, and outputs a vector of head/tail coordinates to be 
plotted as lines.  (not sure where this would go)

So with this scheme, maps would be projected at read time and when the user 
changed the projection parameters.  These projections would be stored as 
KstMatrices and plotted using the KstImage formalism.  Vector fields would be 
plotted somewhere else, to be determined.  

When the user zooms/scrolls outside the defined projection region, they get 
white space.  They can go into the datasource config dialog and change the 
size (pixel dimensions) of the projection and also the min/max theta/phi 
values.

Does this scheme sound more feasible/sane?

thanks for all the feedback,

-Ted
 





More information about the Kst mailing list