Package: ztv
ztv- astronomical image viewerztvis an astronomical image viewer designed to be used from a python
command line for display and analysis.ztvis useful as-is for display and simple analysis of images already
loaded in tonumpy arrays, as well asFITS
files. It can display
the most recently acquired image by watching a directory for new FITS
files to appear or watching a single FITS file for when it changes. It
can also receive new images via anActiveMQ message
stream.ztvis intended for real-time display and analysis.ztvis not
intended to produce publication quality figures.ztvcomes with a number of built-in control panels, for: - selecting
input source (FITS file, auto-reload from FITS file, etc) - selecting a
frame to subtract (e.g. sky or dark) and a flat field frame to divide by
- setting colormap, stretch, and lower/upper limits - doing basic slice
plots, statistics, and aperture photometry. Additional panels can be
written and added, for e.g. controlling a camera. (One example add-on
panel is included that generates faked images in the FITS format.)If proper FITS header keywords are available,ztvwill display the
ra/dec of the cursor point.Examples of usageTo launch:import ztv
z = ztv.ZTV()To load an image in a numpy array:import numpy as np
im = np.random.normal(size=[10, 256, 256])  # create a 3-d image stack
z.load(im)You can now look at your data, manipulate display parameters, etc all
using the gui elements. All of these elements are accessible through the
tabbed control panels. You can also switch amongst the control panel
tabs bycmd-alt-#where#is the number of the panel, starting
from 1. Or, bycmd-[andcmd-]to move left/right amongst the
tabs. You can even switch tabs from the command line api, e.g.:z.control_panel('Color')To change cursor mode, presscmd-#where#is the number shown in
the pop-up menu that’s available by right-clicking in the primary image
area:To manipulate display parameters:z.cmap('gist_heat')
z.minmax(0., 4.)
z.scaling('Sqrt')
z.xy_center(100, 100)
z.zoom(5.)To set up a statistics box and see the GUI output (note that output is
also returned to your command line as a dict):z.stats_box(xrange=[80, 100], yrange=[100,120], show_overplot=True)
z.control_panel('Stats')There’s a lot more you can do from the command line if you play withztv, especially in an exploration-friendly environment likeipython. And, anything you can do from the
command line can be done from the GUI.Download an iconic FITS image from the web and display it:from urllib import urlopen
from zipfile import ZipFile
from StringIO import StringIO
remote_url = 'http://www.spacetelescope.org/static/projects/fits_liberator/datasets/eagle/656nmos.zip'
local_filename = '/tmp/hst-eagle-nebula-656nmos.fits'
zip = ZipFile(StringIO(urlopen(remote_url).read()))
zip_filename = zip.filelist[0].filename
open(local_filename, 'w').write(zip.open(zip_filename).read())
z.load(local_filename)
z.scaling('Log')
z.minmax(0, 500)We can even do a little aperture photometry while we’re here:z.cmap('gray')
z.xy_center(624, 524)
z.zoom(4)
z.minmax(0, 1000)
z.scaling('Asinh')
z.control_panel('phot')
z.aperture_phot(xclick=614, yclick=516, show_overplot=True)And, of course, you can adjust the window size to suit your needs,
either smaller:or larger:Example of an Add-on Control PanelOne of the motivating use cases forztvwas real-time quick-look of
incoming images and the ability to extend the basic installation,
including instrumentat control. An example of this is thatztvwill be
used to both control and inspect the images from a slit viewing camera
on a spectrograph of mine. To demonstrate this extensibility, there’s a
simple example inztv_examples/fits_faker_panel/:from ztv_examples.fits_faker_panel.launch_ztv import launch_ztv
z = launch_ztv()
z.start_fits_faker()Our fake example data looks a lot better when we subtract the sky and
divide the flat field (someone needs to blow the dust off that fake
dewar window…):z.control_panel('Source')
z.sky_frame(True)
z.flat_frame(True)Installation and Dependenciesztvuses several packages, includingwxPython,astropy. These should be automatically
installed if you installztvfrompypiwith:pip install ztvYou can also grab source code fromgithub.Note thatztvwas developed and tested on OS X.Example of installation using Mac OS X’s included PythonThe following steps worked on a fresh install of OS X Yosemite 10.10.5
on 2015-09-06:Install Xcode from the App StoreLaunch Xcode one time to accept licensesInstall pip and other necessary python packagesRun following command lines in a terminal:curl -o ~/Downloads/get-pip.py https://bootstrap.pypa.io/get-pip.py
sudo -H python ~/Downloads/get-pip.py
sudo -H pip install matplotlib
sudo -H pip install astropy
sudo -H pip install astropy-helpersInstall wxPython version 3DownloadOS X cocoa version of wxPython version 3 from
here(waswxPython3.0-osx-docs-demos-3.0.2.0-cocoa-py2.7.dmgat time of
writing)Open disk image and install with the following command line
command:(This is necessary because package isn’t properly signed & is an
old-style package, seehere.
Obviously may need to update exact file path to the pkg.)sudo installer -pkg /Volumes/wxPython3.0-osx-3.0.2.0-cocoa-py2.7/wxPython3.0-osx-cocoa-py2.7.pkg -target /Finally, installztv:sudo -H pip install ztvExample of installation into anaconda python distributionThe following was tested on a fresh install of OS X 10.10.5 on
2015-09-08.Install Xcode from the App Store and launch Xcode one time to accept its
licenses.DownloadAnaconda-2.3.0-MacOSX-x86_64.shfrom here.bash Anaconda-2.3.0-MacOSX-x86_64.sh
source ~/.bash_profile
conda create --name ztv-test wxpython matplotlib
source activate ztv-test
pip install ztvExample of installation into a Homebrew python distributionThe following was tested on a fresh install of OS X 10.10.5 on
2015-09-07.Install Xcode from the App Store and launch Xcode one time to accept its
licenses.InstallHomebrewwith the one-line ruby command onHomebrew’s home pageInstall python & other necessary bits with the following commands.brew install python
brew install wxpython
pip install numpy
pip install ztvNote thatnumpyis explicitly installed first usingpip install numpybeforeztvis installed. During testing on OS
X 10.10.5 on 2015-09-07 allowing the numpy dependency to be
automatically filled bypip install ztvresulted in an installation
error that does not occur if you follow the above sequence.Linux/UbuntuI tested briefly on Ubuntu 14.04.ztvbasically works, although the
pulldown colormap menus will not have bitmaps of the colormaps. Also,
(at least on my testing virtual machine) the performance ofztvwas
much laggier than on my main OS X laptop. For the colormaps you could
try looking atthis
link,
but it didn’t work on my test system.BackgroundIn graduate school in the late 1990’s I learnedIDLand
usedAaron Barth’s ATVextensively. I even contributed a little to a now-outdated version ofATV, adding 3-d image stack
capability.ATVwas and is
incredibly useful for quick-looks at image data, analysis, and all the
things you want when working with typical astronomical image data.After graduate school I began migrating toward python and away from IDL.
I’ve written about this choice elsewhere, but some of the basic reasons
were to avoid IDL licensing issues and being beholden to one company.
(To be fair, how much I pay every year to keep my IDL license current
has always been reasonable. It helps that my license has some obscure
history to it that makes the maintenance fees moderate. But, at any time
they could raise the prices on me massively. And, I wanted to use a
language that could effectively be on every machine I touch, from my
main laptop to an embedded server.)In python there are already a multitude of possible image viewers. Many
of which are great and can do much of what I needed. (See next section
for some links.) But, inevitably as I’ve played with them I’ve found
they each doesn’t scratch my itch in some way. I wanted something that
worked exactly the way I wanted, with the right (for me) mix of
complexity and simplicity. I need day-to-day image quicklook from the
python command-line, e.g. while I’m developing some new image processing
algorithm or to check on last night’s data. But, I also need to be able
to easily adapt my viewer to other situations, including real-time use
on a slit-viewing camera, quick-reduction of incoming data, etc.. So, I
wroteztv.The nameztvis an obvious play off ofATV. And, “z” is my
daughter’s middle initial.Other Image Viewers You Should Check OutIf you’re using IDL, check outATVof course!SAOImage DS9Aladin Desktop Sky Atlas(not
primarily an image viewer, but can open FITS files and overlay
catalogs and other images nicely)gingaToyz(If your favorite isn’t on this list, please emailhroe@hroe.meto get
it added.)AcknowledgementsThank you to Aaron Barth for his originalATV. Thank you to all the
numerous people who have put so much effort in to all the packages that
make my work not only easier but possible. I especially thank the
developers ofastropyand its associated
packages. e.g. It’s an amazing thing to do correct FITS coordinate
conversions in one line of code.AuthorHenry Roe (hroe@hroe.me)Licenseztvis licensed under the MIT License, seeLICENSE.txt. Basically,
feel free to use any or all of this code in any way. But, no warranties,
guarantees, etc etc..