From e0faa3a3720a0357bae4d639d8bf3ef6d253291b Mon Sep 17 00:00:00 2001 From: Raz Date: Tue, 17 May 2022 14:04:04 +0100 Subject: [PATCH 1/6] Fix for issue #128 --- TigGUI/Images/Manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index 740efa21..91ceaec5 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -480,7 +480,7 @@ def trimarray(array): return array.reshape(trimshape(array.shape)) try: - result = exprfunc(*[trimarray(x[1].data()) for x in arglist]) + result = exprfunc(*[x[1].data() for x in arglist]) except Exception as exc: busy.reset_cursor() traceback.print_exc() From f3a2d53a4d03f183cd3bd3896801426aba14b146 Mon Sep 17 00:00:00 2001 From: Raz Date: Thu, 19 May 2022 18:53:06 +0100 Subject: [PATCH 2/6] A new initial commit for issue #128. Instead, a new header is created, diff'd against the old. Missing header items are then added/modified into the new header. --- TigGUI/Images/Manager.py | 104 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 102 insertions(+), 2 deletions(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index 91ceaec5..6d41f4dd 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -30,6 +30,8 @@ from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QDockWidget from astropy.io import fits as pyfits +from astropy.wcs import WCS +from astropy.io.fits import Header from TigGUI.Images import FITS_ExtensionList from TigGUI.Images import SkyImage @@ -480,7 +482,7 @@ def trimarray(array): return array.reshape(trimshape(array.shape)) try: - result = exprfunc(*[x[1].data() for x in arglist]) + result = exprfunc(*[trimarray(x[1].data()) for x in arglist]) except Exception as exc: busy.reset_cursor() traceback.print_exc() @@ -526,8 +528,106 @@ def trimarray(array): self.signalShowMessage.emit("""Creating image for %s""" % expression, 3000) QApplication.flush() try: + # check and fix header + if numpy.ndim(result) < template.fits_header.get('NAXIS'): + dprint(2, "Fixing image header", expression) + self.signalShowMessage.emit(f"Fixing image header for {expression}", 3000) + + # get NAXIS diff + _max = template.fits_header.get('NAXIS') + _diff = numpy.ndim(result) + + # sub() WCS to new NAXIS + _wcs = WCS(template.fits_header) + new_wcs = _wcs.wcs.sub(2) + + # create new header + new_header = new_wcs.to_header() + _header = Header.fromstring(new_header) + + # create keyword ignore list + ignore_list = [] + for i in range(_diff): + ignore_list.append(f'NAXIS{i + 1 + _diff}') + ignore_list.append(f'CTYPE{i + 1 + _diff}') + ignore_list.append(f'CRVAL{i + 1 + _diff}') + ignore_list.append(f'CDELT{i + 1 + _diff}') + ignore_list.append(f'CUNIT{i + 1 + _diff}') + ignore_list.append(f'CRPIX{i + 1 + _diff}') + ignore_list.append('HISTORY') + ignore_list.append('COMMENT') + + # diff the two headers + d_header = pyfits.HeaderDiff(template.fits_header, _header, + ignore_keywords=ignore_list, + ignore_comments='*') + + # update new header with missing cards + for key in d_header.diff_keywords[0]: + _header[key] = template.fits_header[key] + + # check for PC and remove + # a brute force approach for now + if template.fits_header.get('PC01_01'): + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC0{i+1+_diff}_0{n + 1}') + except: + continue + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC0{i+1}_0{n + 1+_diff}') + except: + continue + elif template.fits_header.get('PC1_1'): + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC{i+1+_diff}_{n + 1}') + except: + continue + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC{i+1}_{n + 1+_diff}') + except: + continue + elif template.fits_header.get('PC001001'): + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC00{i+1+_diff}00{n + 1}') + except: + continue + for i in range(_max): + for n in range(_max): + try: + _header.remove(f'PC00{i+1}00{n + 1+_diff}') + except: + continue + + # try to add history and comments + # non-ascii chars causes issues here + try: + if template.fits_header.get('COMMENT'): + _header['COMMENT'] = f"{template.fits_header['COMMENTS']}" + if template.fits_header.get('HISTORY'): + _header['HISTORY'] = f"{template.fits_header['HISTORY']}" + except: + print("Error: COMMENTS or HISTORY contained non-ascii characters.") + + # set the fixed header + template.fits_header = _header + + # create new FITS file hdu = pyfits.PrimaryHDU(result.transpose(), template.fits_header) - skyimage = SkyImage.FITSImagePlotItem(name=expression, filename=None, hdu=hdu) + hdu.verify('fix') + print(f"AFTER HDU {repr(hdu.header)}") + skyimage = SkyImage.FITSImagePlotItem(name=expression, + filename=None, + hdu=hdu) except: busy.reset_cursor() traceback.print_exc() From 12c533473b5430bcf33793fa652824456d1a3ef3 Mon Sep 17 00:00:00 2001 From: Raz Date: Thu, 19 May 2022 19:29:51 +0100 Subject: [PATCH 3/6] Fixed typo --- TigGUI/Images/Manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index 6d41f4dd..a8b8783d 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -539,7 +539,7 @@ def trimarray(array): # sub() WCS to new NAXIS _wcs = WCS(template.fits_header) - new_wcs = _wcs.wcs.sub(2) + new_wcs = _wcs.wcs.sub(_diff) # create new header new_header = new_wcs.to_header() From 974a1da22fd9f6ec9f21a29488e2c958a0e2527e Mon Sep 17 00:00:00 2001 From: Raz Date: Thu, 19 May 2022 23:37:00 +0100 Subject: [PATCH 4/6] Fixes issue #128. Header history, comments and card comments are fixed. --- TigGUI/Images/Manager.py | 42 ++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index a8b8783d..9f4e4e20 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -539,11 +539,11 @@ def trimarray(array): # sub() WCS to new NAXIS _wcs = WCS(template.fits_header) - new_wcs = _wcs.wcs.sub(_diff) + _new_wcs = _wcs.wcs.sub(_diff) # create new header - new_header = new_wcs.to_header() - _header = Header.fromstring(new_header) + _new_header = _new_wcs.to_header() + _header = Header.fromstring(_new_header) # create keyword ignore list ignore_list = [] @@ -558,14 +558,15 @@ def trimarray(array): ignore_list.append('COMMENT') # diff the two headers - d_header = pyfits.HeaderDiff(template.fits_header, _header, + d_header = pyfits.HeaderDiff(template.fits_header, + _header, ignore_keywords=ignore_list, ignore_comments='*') # update new header with missing cards for key in d_header.diff_keywords[0]: _header[key] = template.fits_header[key] - + # check for PC and remove # a brute force approach for now if template.fits_header.get('PC01_01'): @@ -608,23 +609,30 @@ def trimarray(array): except: continue - # try to add history and comments - # non-ascii chars causes issues here - try: - if template.fits_header.get('COMMENT'): - _header['COMMENT'] = f"{template.fits_header['COMMENTS']}" - if template.fits_header.get('HISTORY'): - _header['HISTORY'] = f"{template.fits_header['HISTORY']}" - except: - print("Error: COMMENTS or HISTORY contained non-ascii characters.") - - # set the fixed header + # add comments + _comms = template.fits_header.get('COMMENT') + if _comms: + for card in _comms: + _header.append(('COMMENT', card)) + + # add history + _hist = template.fits_header.get('HISTORY') + if _hist: + for card in _hist: + _header.append(('HISTORY', card)) + + # restore card comments + for card in template.fits_header.keys(): + if card in _header: + if com := template.fits_header.comments[card]: + _header.set(keyword=card, comment=com) + + # set new header template.fits_header = _header # create new FITS file hdu = pyfits.PrimaryHDU(result.transpose(), template.fits_header) hdu.verify('fix') - print(f"AFTER HDU {repr(hdu.header)}") skyimage = SkyImage.FITSImagePlotItem(name=expression, filename=None, hdu=hdu) From 19b92a0a13a48fb1f6d60a00c2134456613f4b9f Mon Sep 17 00:00:00 2001 From: Raz Date: Thu, 19 May 2022 23:51:33 +0100 Subject: [PATCH 5/6] Reverted 'if' expression to be compatble with Ubuntu 18.04 --- TigGUI/Images/Manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index 9f4e4e20..ce8c4d23 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -624,7 +624,8 @@ def trimarray(array): # restore card comments for card in template.fits_header.keys(): if card in _header: - if com := template.fits_header.comments[card]: + com = template.fits_header.comments[card] + if com: _header.set(keyword=card, comment=com) # set new header From 65577e1d15ad89cf43e2e9a273233fab2acf8d5b Mon Sep 17 00:00:00 2001 From: Raz Date: Fri, 20 May 2022 13:10:29 +0100 Subject: [PATCH 6/6] Updated variable names and formatting --- TigGUI/Images/Manager.py | 72 ++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/TigGUI/Images/Manager.py b/TigGUI/Images/Manager.py index ce8c4d23..a27e7e45 100644 --- a/TigGUI/Images/Manager.py +++ b/TigGUI/Images/Manager.py @@ -534,12 +534,12 @@ def trimarray(array): self.signalShowMessage.emit(f"Fixing image header for {expression}", 3000) # get NAXIS diff - _max = template.fits_header.get('NAXIS') - _diff = numpy.ndim(result) + _naxis = template.fits_header.get('NAXIS') + _ndims = numpy.ndim(result) # sub() WCS to new NAXIS _wcs = WCS(template.fits_header) - _new_wcs = _wcs.wcs.sub(_diff) + _new_wcs = _wcs.wcs.sub(_ndims) # create new header _new_header = _new_wcs.to_header() @@ -547,65 +547,65 @@ def trimarray(array): # create keyword ignore list ignore_list = [] - for i in range(_diff): - ignore_list.append(f'NAXIS{i + 1 + _diff}') - ignore_list.append(f'CTYPE{i + 1 + _diff}') - ignore_list.append(f'CRVAL{i + 1 + _diff}') - ignore_list.append(f'CDELT{i + 1 + _diff}') - ignore_list.append(f'CUNIT{i + 1 + _diff}') - ignore_list.append(f'CRPIX{i + 1 + _diff}') + for i in range(_ndims): + ignore_list.append(f'NAXIS{i + 1 + _ndims}') + ignore_list.append(f'CTYPE{i + 1 + _ndims}') + ignore_list.append(f'CRVAL{i + 1 + _ndims}') + ignore_list.append(f'CDELT{i + 1 + _ndims}') + ignore_list.append(f'CUNIT{i + 1 + _ndims}') + ignore_list.append(f'CRPIX{i + 1 + _ndims}') ignore_list.append('HISTORY') ignore_list.append('COMMENT') # diff the two headers - d_header = pyfits.HeaderDiff(template.fits_header, - _header, - ignore_keywords=ignore_list, - ignore_comments='*') + _diff_header = pyfits.HeaderDiff(template.fits_header, + _header, + ignore_keywords=ignore_list, + ignore_comments='*') # update new header with missing cards - for key in d_header.diff_keywords[0]: + for key in _diff_header.diff_keywords[0]: _header[key] = template.fits_header[key] # check for PC and remove # a brute force approach for now if template.fits_header.get('PC01_01'): - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC0{i+1+_diff}_0{n + 1}') + _header.remove(f'PC0{i+1+_ndims}_0{n + 1}') except: continue - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC0{i+1}_0{n + 1+_diff}') + _header.remove(f'PC0{i+1}_0{n + 1+_ndims}') except: continue elif template.fits_header.get('PC1_1'): - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC{i+1+_diff}_{n + 1}') + _header.remove(f'PC{i+1+_ndims}_{n + 1}') except: continue - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC{i+1}_{n + 1+_diff}') + _header.remove(f'PC{i+1}_{n + 1+_ndims}') except: continue elif template.fits_header.get('PC001001'): - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC00{i+1+_diff}00{n + 1}') + _header.remove(f'PC00{i+1+_ndims}00{n + 1}') except: continue - for i in range(_max): - for n in range(_max): + for i in range(_naxis): + for n in range(_naxis): try: - _header.remove(f'PC00{i+1}00{n + 1+_diff}') + _header.remove(f'PC00{i+1}00{n + 1+_ndims}') except: continue @@ -624,9 +624,9 @@ def trimarray(array): # restore card comments for card in template.fits_header.keys(): if card in _header: - com = template.fits_header.comments[card] - if com: - _header.set(keyword=card, comment=com) + _comm = template.fits_header.comments[card] + if _comm: + _header.set(keyword=card, comment=_comm) # set new header template.fits_header = _header