Source code for sofia_redux.pipeline.gui.qad.qad_headview

# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""FITS header viewing widget."""

import os
from sofia_redux.pipeline.gui.textview import TextView

__all__ = ['HeaderViewer']


[docs] class HeaderViewer(TextView): """View, find, and filter text from FITS headers.""" def __init__(self, parent=None): """ Initialize the header viewer widget. Parameters ---------- parent : `QWidget` Parent widget. """ super().__init__(parent) self.tableButton.setEnabled(True) self.tableButton.clicked.connect(self.table)
[docs] def load(self, header): """ Load FITS headers into TextEdit widget. Parameters ---------- header : dict Keys are file paths; values are lists of FITS header objects (`astropy.io.fits.Header`) from each relevant FITS extension. """ # header is a dictionary of FITS header objects, keyed # by the file path self.text = header # format to html self.html = self.format() # set in text window self.textEdit.setHtml(self.html) self.textEdit.repaint()
[docs] def format(self): """Format header text into HTML for display.""" # some useful strings anchor = '<a name="anchor"></a>' br = '<br>' jstr = anchor + br + anchor + '-' * 80 + br # format headers as strings header_strs = [] sortkeys = sorted(self.text.keys()) for fpath in sortkeys: hlist = self.text[fpath] if type(hlist) is not list: hlist = [hlist] for i, hdr in enumerate(hlist): if 'EXTNAME' in hdr: extname = "Extension: {}".format(hdr['EXTNAME']) else: extname = "Extension: {}".format(i) # convert the whole header to a string hdr = hdr.tostring(sep=br) # add the filename to separate different headers # add the anchor tag to keep the separation when filtering extname = anchor + br + anchor + extname + \ anchor + br + anchor + '-' * len(extname) if i == 0: start = jstr + anchor + os.path.basename(fpath) + jstr else: start = '' hdr = start + extname + br + hdr header_strs.append(hdr) hdstr = (br + br).join(header_strs) hdstr = '<pre>' + anchor + hdstr + br + '</pre>' + anchor return hdstr
[docs] def table(self): """ Format selected parameters into a table. Uses comma-separated filter values as keys to display from each header. Requires `pandas` to display. """ # read text to filter # may be comma-separated keys (no substrings) find_text = self.findText.text().strip() if find_text == '': # clear previous filter / table self.textEdit.setHtml(self.html) else: # check for pandas try: import pandas as pd except ImportError: msg = '(install pandas for table display)' self.textEdit.setPlainText(msg) return # split field on commas for multiple keys sep = ['File name'] sep.extend(find_text.upper().split(',')) # find keys in headers data = {} sortkeys = sorted(self.text.keys()) for key in sep: data[key] = [] for fpath in sortkeys: hlist = self.text[fpath] if type(hlist) is not list: hlist = [hlist] for i, hdr in enumerate(hlist): if key == 'File name': basename = os.path.splitext( os.path.basename(fpath))[0] if 'EXTNAME' in hdr: extname = " [{}]".format(hdr['EXTNAME']) else: extname = " [{}]".format(i) data[key].append(basename + extname) elif key in hdr: data[key].append(hdr[key]) else: data[key].append(None) # pandas dataframe for table display df = pd.DataFrame(data, columns=sep) htmltable = df.to_html(max_rows=None, max_cols=None, border=1) htmltable = htmltable.replace('<table', '<table cellpadding="10"', 1) self.textEdit.setHtml(htmltable) # repaint required for some versions of Qt/OS self.textEdit.repaint()