eff_header.py 4.36 KB
title = "CheckHeader"
tip = "checks FITS header for missing keywords"
onein = True

import numpy as np
import pyfits
import xml2nod3

from guidata.qt.QtCore import Qt
from guidata.qt.QtGui import QMessageBox, QApplication, QCursor
from guidata.dataset.datatypes import DataSet
from guidata.dataset.dataitems import (IntItem, StringItem, ChoiceItem, FloatItem, BoolItem)
from guiqwt.config import _

class NOD3_App:

    def __init__(self, parent):
        self.parent = parent
        self.parent.activateWindow()

    def Error(self, msg):
        QMessageBox.critical(self.parent.parent(), title,
                              _(u"Error:")+"\n%s" % str(msg))

    def compute_app(self, **args):
        class FuncParam(DataSet):
            s = StringItem('s', default="string")
            i = IntItem('i', default=0, max=100, min=0)
            a = FloatItem('a', default=1.)
            b = BoolItem("bool", default=True)
            choice = ChoiceItem("Unit", ("Degree", "Arcmin", "Arcsec"), default=2)
        name = title.replace(" ", "")
        if args == {}:
           param = FuncParam(_(title), "description")
        else:
           param = self.parent.ScriptParameter(name, args)
        # if no parameter needed set param to None. activate next line
        param = None
        self.parent.compute_11(name, lambda m, p: self.function(m, p), param, onein) 

    def function(self, m, p):
        Nod3 = xml2nod3.NOD3_Fits()
        keys, nod3header = Nod3.NOD3Header()
        if not "FITSVERS" in m.header:
           m.header["FITSVERS"] = (pyfits.__version__, "FITSVERS")
        if not "NAXIS3" in m.header:
           m.header["NAXIS3"] = (1, "NAXIS3")
        #m.header.update("BLANK", np.nan, "Blank value")
        job = "class FuncParam(DataSet):\n"
        for key in keys:
            if not key in m.header or key.lower() == 'title':
               if key not in ("EXTEND", "FITSVERS"):
                  x = key, nod3header[key][0][-1], nod3header[key][1], nod3header[key][-2]
                  v = x[2]
                  u = nod3header[key][-1]
                  if key.lower() == 'title' and 'OBJECT' in m.header:
                     v = m.header['OBJECT']
                  if u == " ":
                     job += str("    %s = StringItem('%s:', default='%s')\n" % (key, key, v))
                  else:
                     job += str("    %s = StringItem('%s [%s]:', default='%s')\n" % (key, key, u, v))
                  #if x[1] == "A":
                  #   job += str("    %s = StringItem('%s =', default=%s)\n" % (key, key, None))
                  #elif x[1] in ("I", "J"):
                  #   job += str("    %s = IntItem('%s =', default=%d)\n" % (key, key, 0))
                  #elif x[1] in ("E", "D"):
                  #   job += str("    %s = FloatItem('%s =', default=%f)\n" % (key, key, 0.0))
        job += str("param = FuncParam('%s', _('<b>Edit missing header elements:</b>'))\n" % (title))
        job += "param.edit(parent=self.parent)"
        QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor))
        exec(job)
        try:
          for i in param._items:
            if hasattr(i, '_name'):
               key = i._name
               val = getattr(param, i._name)
               if type(i) in (StringItem, ChoiceItem):
                  val = str("%s" % val)
            else:
               key = i
               val = getattr(param, i)
               if type(val) == str:
                  val = str("%s" % val)
            if val != "":
               typ = nod3header[key][0][-1]
               if typ == "A":
                  m.header[key] = (val, nod3header[key][-2])
               elif typ == "L":
                  m.header[key] = (bool(val), nod3header[key][-2])
               elif typ in ("I", "J"):
                  try:
                     m.header[key] = (int(val), nod3header[key][-2])
                  except: 
                     m.header[key] = (int(val), nod3header[key][-2])
               elif typ in ("E", "D"):
                  try: 
                     m.header[key] = (float(eval(val)), nod3header[key][-2])
                  except: 
                     m.header[key] = float(eval(val))
               else:
                  print key, typ, 'not found'
        except:
           self.Error("keyword may be wrong type?")
           QApplication.restoreOverrideCursor()
           return [], p
        QApplication.restoreOverrideCursor()
        return m, p