LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
|
A Pixelization
(or partitioning) of the sphere is a mapping between points on the sphere and a set of pixels (a.k.a.
More...
#include <Pixelization.h>
Public Member Functions | |
virtual | ~Pixelization () |
virtual RangeSet | universe () const =0 |
universe returns the set of all pixel indexes for this pixelization. | |
virtual std::unique_ptr< Region > | pixel (std::uint64_t i) const =0 |
pixel returns the spherical region corresponding to the pixel with index i. | |
virtual std::uint64_t | index (UnitVector3d const &v) const =0 |
index computes the index of the pixel for v. | |
virtual std::string | toString (std::uint64_t i) const =0 |
toString converts the given pixel index to a human-readable string. | |
RangeSet | envelope (Region const &r, size_t maxRanges=0) const |
envelope returns the indexes of the pixels intersecting the spherical region r. | |
RangeSet | interior (Region const &r, size_t maxRanges=0) const |
interior returns the indexes of the pixels within the spherical region r. | |
Private Member Functions | |
virtual RangeSet | _envelope (Region const &r, size_t maxRanges) const =0 |
virtual RangeSet | _interior (Region const &r, size_t maxRanges) const =0 |
A Pixelization
(or partitioning) of the sphere is a mapping between points on the sphere and a set of pixels (a.k.a.
cells or partitions) with 64 bit integer labels (indexes), where each point is assigned to exactly one pixel.
A pixelization is capable of:
One use case for pixelizations is spatial search in an RDBMS. Given a table of points in S² indexed by pixel, one can quickly retrieve points inside of a region r by computing the indexes of pixels intersecting r:
RangeSet pixels = pixelization.envelope(r);
and then performing range lookups on the table. The range lookup results may include points outside of r but close to its boundary, so additional filtering is necessary if one wishes to obtain exactly those points inside r.
To mitigate this cost, which can be significant for large regions with complex boundaries, one can compute the indexes of pixels completely contained in R. Only points belonging to pixels in:
RangeSet s = pixelization.envelope(r) - pixelization.interior(r);
must be tested for membership in r. Note that the indexes of pixels disjoint from r can be computed as follows:
RangeSet exterior = pixelization.universe() - pixelization.envelope(r);
Definition at line 84 of file Pixelization.h.
|
inlinevirtual |
Definition at line 86 of file Pixelization.h.
|
privatepure virtual |
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.
|
privatepure virtual |
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.
|
inline |
envelope
returns the indexes of the pixels intersecting the spherical region r.
For hierarchical pixelizations, a good way to implement this is by top down tree traversal. Starting with the root pixels (e.g. Q3C cube faces, or HTM root triangles), a pixel P is tested for intersection with the region r. If P is already at the desired subdivision level and intersects r, its index is added to the output. If r contains P, the indexes of all children of P at the target subdivision level are output. Finally, if P intersects r, then P is subdivided and the algorithm recurses on its child pixels.
Using higher subdivision levels allows a region to be more closely approximated by smaller pixels, but for large input regions the cost of computing and storing their indexes can quickly become prohibitive.
The maxRanges
parameter can be used to limit both these costs - setting it to a non-zero value sets a cap on the number of ranges returned by this method. To meet this constraint, implementations are allowed to return pixels that do not intersect r along with those that do. This allows two ranges [a, b) and [c, d), a < b < c < d, to be merged into one range [a, d) (by adding in the pixels [b, c)). Since simplification proceeds by adding pixels, the return value will always be a superset of the intersecting pixels.
In practice, the implementation of this method for a hierarchical pixelization like Q3C or HTM will lower the subdivision level when too many ranges have been found. Each coarse pixel I at level L - n corresponds to pixels [I*4ⁿ, (I + 1)*4ⁿ) at level L.
Definition at line 138 of file Pixelization.h.
|
pure virtual |
index
computes the index of the pixel for v.
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.
|
inline |
interior
returns the indexes of the pixels within the spherical region r.
The maxRanges
argument is analogous to the identically named envelope() argument. The only difference is that implementations must remove interior pixels to keep the number of ranges at or below the maximum. The return value is therefore always a subset of the interior pixels.
Definition at line 150 of file Pixelization.h.
|
pure virtual |
pixel
returns the spherical region corresponding to the pixel with index i.
This region will contain all unit vectors v with index(v) == i
. But it may also contain points with index not equal to i. To see why, consider a point that lies on the edge of a polygonal pixel - it is inside the polygons for both pixels sharing the edge, but must be assigned to exactly one pixel by the pixelization.
If i is not a valid pixel index, a std::invalid_argument is thrown.
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.
|
pure virtual |
toString
converts the given pixel index to a human-readable string.
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.
|
pure virtual |
universe
returns the set of all pixel indexes for this pixelization.
Implemented in lsst::sphgeom::HtmPixelization, lsst::sphgeom::Mq3cPixelization, and lsst::sphgeom::Q3cPixelization.