# Class SkyDensityPlotter

java.lang.Object
uk.ac.starlink.ttools.plot2.layer.SkyDensityPlotter

All Implemented Interfaces:
  `Plotter<SkyDensityPlotter.SkyDenseStyle>`

public class SkyDensityPlotter extends Object implements Plotter<SkyDensityPlotter.SkyDenseStyle>
Plotter that plots a genuine density map on a SkySurface. It paints a single Decal, no Glyphs.

Note it only works with a SkySurface.

Since:
  20 Sep 2015
Author:
  Mark Taylor

## Nested Class Summary

Nested Classes
Modifier and Type
Class
Description
`static class`
`SkyDensityPlotter.SkyDenseStyle`
Style for configuring with the sky density plot.

## Field Summary

Fields
Modifier and Type
Field
Description
`static final PerUnitConfigKey<SolidAngleUnit>`
`ANGLE_KEY`
Config key for solid angle units.
`static final ConfigKey<Combiner>`
`COMBINER_KEY`
Config key for combination mode.
`static final ReportKey<Double>`
`TILESIZE_REPKEY`
Report key for HEALPix tile area in square degrees.
`static final ConfigKey<Double>`
`TRANSPARENCY_KEY`
Config key for transparency.

## Constructor Summary

Constructors
Constructor
Description
`SkyDensityPlotter(boolean transparent, boolean hasWeight)`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`PlotLayer`
`createLayer(DataGeom geom, DataSpec dataSpec, SkyDensityPlotter.SkyDenseStyle style)`
Creates a PlotLayer based on the given geometry, data and style.
`SkyDensityPlotter.SkyDenseStyle`
`createStyle(ConfigMap config)`
Creates a style that can be used when creating a plot layer.
`CoordGroup`
`getCoordGroup()`
Returns an object describing which data coordinates are used for this plotter and how they are arranged in supplied DataSpec objects.
`static int`
`getPixelLevel(SkySurface surface)`
Calculates the HEALPix level whose pixels are of approximately the same size as the screen pixels for a given SkySurface.
`String`
`getPlotterDescription()`
Returns an XML description of this plotter.
`Icon`
`getPlotterIcon()`
Returns an icon for this plotter for use in user interface.
`String`
`getPlotterName()`
Returns the name of this plotter for use in user interface.
`Object`
`getRangeStyleKey(SkyDensityPlotter.SkyDenseStyle style)`
Returns an opaque object characterising the region of the plot surface covered when using a given plotter style.
`ConfigKey<?>[]`
`getStyleKeys()`
Returns the configuration keys used to configure style for this plotter.
`boolean`
`hasReports()`
Indicates whether the drawings produced by this plotter will return general interest report information to upstream plotting code.
`static double`
`vectorSeparation(double[] p1, double[] p2)`
Angle in radians between two (not necessarily unit) vectors.

### Methods inherited from class Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### TILESIZE_REPKEY

public static final ReportKey<Double> TILESIZE_REPKEY
Report key for HEALPix tile area in square degrees.

### TRANSPARENCY_KEY

public static final ConfigKey<Double> TRANSPARENCY_KEY
Config key for transparency.

### COMBINER_KEY

public static final ConfigKey<Combiner> COMBINER_KEY
Config key for combination mode.

### ANGLE_KEY

public static final PerUnitConfigKey<SolidAngleUnit> ANGLE_KEY
Config key for solid angle units.

## Constructor Details

### SkyDensityPlotter

public SkyDensityPlotter(boolean transparent, boolean hasWeight)
Constructor.

Parameters:
  `transparent` - if true, there will be a config option for setting the alpha value of the whole layer
  `hasWeight` - if true, an optional weight coordinate will be solicited alongside the positional coordinates

## Method Details

### getPlotterName

public String getPlotterName()
Description copied from interface: `Plotter`
Returns the name of this plotter for use in user interface.

Specified by:
  `getPlotterName` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  user-directed plotter name

### getPlotterIcon

public Icon getPlotterIcon()
Description copied from interface: `Plotter`
Returns an icon for this plotter for use in user interface.

Specified by:
  `getPlotterIcon` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  plotter icon

### getCoordGroup

public CoordGroup getCoordGroup()
Description copied from interface: `Plotter`
Returns an object describing which data coordinates are used for this plotter and how they are arranged in supplied DataSpec objects.

Specified by:
  `getCoordGroup` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  coordinate group

### hasReports

public boolean hasReports()
Description copied from interface: `Plotter`
Indicates whether the drawings produced by this plotter will return general interest report information to upstream plotting code.

Specified by:
  `hasReports` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  true if the plot report may return interesting information
See Also:
  - `Drawing.getReport(Object)`

### getPlotterDescription

public String getPlotterDescription()
Description copied from interface: `Plotter`
Returns an XML description of this plotter.

Note: really this should appear at the LayerType level.

Specified by:
  `getPlotterDescription` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  one or more <p> elements

### getStyleKeys

public ConfigKey<?>[] getStyleKeys()
Description copied from interface: `Plotter`
Returns the configuration keys used to configure style for this plotter. The keys in the return value are used in the map supplied to the `Plotter.createStyle(ConfigMap)` method.

Specified by:
  `getStyleKeys` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Returns:
  keys used when creating a style for this plotter.

### createStyle

public SkyDensityPlotter.SkyDenseStyle createStyle(ConfigMap config)
Description copied from interface: `Plotter`
Creates a style that can be used when creating a plot layer. The keys that are significant in the supplied config map are those returned by `Plotter.getStyleKeys()`. The return value can be used as input to `Plotter.createLayer(DataGeom, DataSpec, S)`.

Specified by:
  `createStyle` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Parameters:
  `config` - map of style configuration items
Returns:
  plotter-specific plot style

### getRangeStyleKey

public Object getRangeStyleKey(SkyDensityPlotter.SkyDenseStyle style)
Description copied from interface: `Plotter`
Returns an opaque object characterising the region of the plot surface covered when using a given plotter style. If this object changes between layers produced by this plotter, it provides a hint that it may be necessary to redetermine the axis ranges (using `extendCoordinateRanges`).

In many cases, such as scatter-plot-like plotters, the range is determined only by the coordinate data (managed by `DataSpec` inputs) so a null value may be returned. This method is chiefly required by histogram-like plotters for which the region on the plot surface is not the union of the input positions.

Specified by:
  `getRangeStyleKey` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Parameters:
  `style` - plot style to assess
Returns:
  opaque object with equality semantics, or null if axis range is not a function of style

### createLayer

public PlotLayer createLayer(DataGeom geom, DataSpec dataSpec, SkyDensityPlotter.SkyDenseStyle style)
Description copied from interface: `Plotter`
Creates a PlotLayer based on the given geometry, data and style.

The `style` parameter is the result of a call to `Plotter.createStyle(ConfigMap)`.

The `dataSpec` parameter must contain the coordinates defined by this plotter's CoordGroup.

The `pointDataGeom` parameter is only used if the `CoordGroup.getBasicPositionCount()` or `CoordGroup.getExtraPositionCount()` method from this plotter's CoordGroup return a non-zero value, otherwise the plot does not have point positions.

It is legal to supply null for any of the parameters; if insufficient data is supplied to generate a plot, then the method should return null.

Creating a layer should be cheap; layers may be created and not used.

Specified by:
  `createLayer` in interface `Plotter<SkyDensityPlotter.SkyDenseStyle>`
Parameters:
  `geom` - indicates base position coordinates and their mapping to points in the data space
  `dataSpec` - specifies the data required for the plot
  `style` - data style as obtained from `createStyle`
Returns:
  new plot layer, or null if no drawing will take place

### getPixelLevel

public static int getPixelLevel(SkySurface surface)
Calculates the HEALPix level whose pixels are of approximately the same size as the screen pixels for a given SkySurface. There is not an exact correspondance here. An attempt is made to return the result for the "largest" screen pixel (the one covering more of the sky than any other).

Parameters:
  `surface` - plot surface
Returns:
  approximately corresponding HEALPix level

### vectorSeparation

public static double vectorSeparation(double[] p1, double[] p2)
Angle in radians between two (not necessarily unit) vectors. The code follows that of SLA_SEPV from SLALIB. The straightforward thing to do would just be to use the cosine rule, but that may suffer numeric instabilities for small angles, so this more complicated approach is more robust.

Parameters:
  `p1` - first input vector
  `p2` - second input vector
Returns:
  angle between p1 and p2 in radians