display_firefly

The display_firefly package is a backend for the lsst.afw.display interface, allowing the Firefly visualization framework to be used for displaying data objects from the stack.

Introduction

Firefly is a web framework for astronomical data access and visualization, developed at Caltech/IPAC and deployed for the archives of several major facilities including Spitzer, WISE, Plank and others. Firefly is a part of the LSST Science User Platform. Its client-server architecture is designed to enable a user to easily visualize images and catalog data from a remote site.

The lsst.display.firefly backend is a client that can connect to a Firefly server and visualize data objects from an LSST stack session. It is best used with a Python session and Firefly server that are both remote and situated close to the data.

A user typically will not import lsst.display.firefly directly. Instead, the lsst.afw.display interface will commonly be used with backend=firefly.

Getting Started

This short example uses data that has been run through the LSST stack demo.

If running in an LSST Science Platform environment, these setup steps will already have been done for you. If not, setup the stack and the default environment variables FIREFLY_URL and FIREFLY_HTML.

setup lsst_distrib
export FIREFLY_URL=https://lsst-demo.ncsa.illinois.edu/firefly
export FIREFLY_HTML=slate.html

Start a Python session of some kind in the directory where the demo was run. These statements will create a Butler instance for the processed data and then retrieve an exposure.

from lsst.daf.persistence import Butler
butler = Butler('./output')
calexp = butler.get('calexp', run=4192, camcol=4, field=300, filter='g')

The next lines will set up the display, using the Firefly server located at the URL in the FIREFLY_URL environment variable.

import lsst.afw.display as afw_display
afw_display.setDefaultBackend('firefly')
display1 = afw_display.getDisplay(frame=1)

The creation of the display will attempt to open a web browser. If that is unsuccessful, a URL will be displayed, as a link if running in a notebook and as text to copy/paste if in a terminal.

Then display the exposure:

display1.mtv(calexp)

The displayed exposure will appear in your browser.

Subsequent image displays can be opened:

display2 = afw_display.getDisplay(frame=2)

Using lsst.display.firefly

The lsst.display.firefly package is not used directly. Instead, instances of lsst.afw.display are created with parameters passed to the backend. The Firefly backend is based upon the Python API in firefly_client.FireflyClient.

Setup

Before a Python session or Jupyter notebook is started, setup of stack packages must be completed. Use setup display_firefly to enable the Firefly backend. This is not normally needed when using lsst_distrib.

Initializing with lsst.afw.display

The recommended way to create a display object for Firefly is using the getDisplay() method from lsst.afw.display:

import lsst.afw.display as afw_display
afw_display.setDefaultBackend('firefly')
display1 = afw_display.getDisplay(frame=1, url='http://localhost:8080/firefly')

The parameters shown above (besides frame) are the defaults and will apply when running a Firefly server locally with default settings.

If a Firefly server has been provided to you, set url and according to the information provided, or set the environment variables FIREFLY_URL and FIREFLY_HTML.

Warning

Once a Display instance is created, it will not be possible within your Python session to define another display pointing to a different server.

Opening a browser window

A browser window or tab must be opened before any data are displayed.

When using a Firefly server on localhost, creating the display object will cause a browser window to open to the correct location. If using another server (as in the above example), the display1.show() method opens the browser window, if your Python session is on your local machine, and displays a URL for your browser if running a remote Python session.

Displaying an image

The mtv() method of your display is used to display Exposures, MaskedImages and Images from the stack. Assuming that your session includes an Exposure named calexp:

display1.mtv(calexp)

Mask display and manipulation

If the data object passed to mtv() contains masks, these will automatically be overlaid on the image. A layer control icon at the top of the browser window can be used to turn mask layers on and off.

The display1.setMaskPlaneColor() and display1.setMaskTransparency() methods can be used to programmatically change the mask display. display1.setMaskPlaneColor() must be used before the image is displayed, while the transparency may be changed at any time.

display1.setMaskPlaneColor('DETECTED', afw_display.GREEN)
display1.mtv(calexp)
display1.setMaskTransparency(30)

Image scale, zoom, pan

The display1 object includes methods for setting the image scale or stretch, the zoom and the pan position.

display1.scale('log', -1, 10, 'sigma')
display1.zoom(4)
display1.pan(1064, 890)

Overlaying symbols

The display1.dot() method will overlay a symbol at a point.

display1.dot('x', 1064, 890, size=8, ctype=afw_display.RED)

Accessing the underlying FireflyClient instance

The underlying instance of firefly_client.FireflyClient can be accessed as an attribute of a display.

fc = display1._client

See the firefly_client documentation for more information about using FireflyClient.

Installing lsst.display.firefly

Since display_firefly is included in the lsst_distrib set of stack packages, the setup lsst_distrib command will set up this package and its dependencies. See methods for installing lsst_distrib at pipelines.lsst.io.

Firefly Servers

In many cases, such as when using an LSST Science Platform environment, a Firefly server sitting close to your data and your Python workspace will have been provided to you. An alternative supported use case is to run a Firefly server on your local machine.

Firefly server using Docker

With Docker installed, you can start a Firefly server with 8 GB of memory on port 8080:

docker run -p 8080:8080 -e "MAX_JVM_SIZE=8G" --rm ipac/firefly

In this case, the URL for Firefly will be http://localhost:8080/firefly.

To run it on port 8090, in the background and saving logging information to a file:

docker run -p 8090:8080  -e "MAX_JVM_SIZE=8G" --rm ipac/firefly >& my.log &

Useful Docker commands may be found in this cheat sheet.

Project info

Repository
https://github.com/lsst/display_firefly
JIRA component
display_firefly