From e072616a3a99687cb3e173fd2221c4675bd654a6 Mon Sep 17 00:00:00 2001
From: Roberto Susino <roberto.susino@inaf.it>
Date: Mon, 5 Sep 2022 09:45:29 +0200
Subject: [PATCH] Fix headers in FITS extensions

---
 metis_l2_prep_uv.pro         |  34 ++++++--
 metis_l2_prep_vl_generic.pro |  34 ++++++--
 metis_l2_prep_vl_polariz.pro | 158 +++++++++++++++++++++++++----------
 3 files changed, 166 insertions(+), 60 deletions(-)

diff --git a/metis_l2_prep_uv.pro b/metis_l2_prep_uv.pro
index 9703fe2..b5bbe30 100644
--- a/metis_l2_prep_uv.pro
+++ b/metis_l2_prep_uv.pro
@@ -189,10 +189,25 @@ pro metis_l2_prep_uv
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
+	base_header = primary_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'UV')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name, extension_header, /no_comment, /silent
@@ -201,11 +216,14 @@ pro metis_l2_prep_uv
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = data * sqrt(error)
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then error_matrix = metis_rectify(error_matrix, 'UV')
 	fits_add_checksum, extension_header, float(error_matrix)
 	mwrfits, float(error_matrix), out_file_name, extension_header, /no_comment, /silent
diff --git a/metis_l2_prep_vl_generic.pro b/metis_l2_prep_vl_generic.pro
index fca9edb..cd6e834 100644
--- a/metis_l2_prep_vl_generic.pro
+++ b/metis_l2_prep_vl_generic.pro
@@ -230,10 +230,25 @@ pro metis_l2_prep_vl_generic
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
+	base_header = primary_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'VL')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name, extension_header, /no_comment, /silent
@@ -242,11 +257,14 @@ pro metis_l2_prep_vl_generic
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = data * sqrt(error)
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then data = metis_rectify(error_matrix, 'VL')
 	fits_add_checksum, extension_header, float(error_matrix)
 	mwrfits, float(error_matrix), out_file_name, extension_header, /no_comment, /silent
diff --git a/metis_l2_prep_vl_polariz.pro b/metis_l2_prep_vl_polariz.pro
index 9b6c791..34f09d6 100755
--- a/metis_l2_prep_vl_polariz.pro
+++ b/metis_l2_prep_vl_polariz.pro
@@ -403,10 +403,25 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
+	base_header = primary_pb_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'VL')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name[0], extension_header, /no_comment, /silent
@@ -415,11 +430,14 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = intarr(header.naxis1, header.naxis2)
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then error_matrix = metis_rectify(error_matrix, 'VL')
 	fits_add_checksum, extension_header, error_matrix
 	mwrfits, float(error_matrix), out_file_name[0], extension_header, /no_comment, /silent
@@ -457,10 +475,25 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
+	base_header = primary_tb_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'VL')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name[1], extension_header, /no_comment, /silent
@@ -469,11 +502,14 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = intarr(header.naxis1, header.naxis2)
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then error_matrix = metis_rectify(error_matrix, 'VL')
 	fits_add_checksum, extension_header, error_matrix
 	mwrfits, float(error_matrix), out_file_name[1], extension_header, /no_comment, /silent
@@ -511,10 +547,25 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
+	base_header = primary_polangle_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'VL')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name[2], extension_header, /no_comment, /silent
@@ -523,11 +574,14 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = intarr(header.naxis1, header.naxis2)
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then error_matrix = metis_rectify(error_matrix, 'VL')
 	fits_add_checksum, extension_header, error_matrix
 	mwrfits, float(error_matrix), out_file_name[2], extension_header, /no_comment, /silent
@@ -587,15 +641,15 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the stokes q image
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Stokes Q', 'extension name'
+	extension_header = primary_stokes_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Stokes Q', 'extension name', before = 'LONGSTRN'
 	fxaddpar, extension_header, 'BTYPE', 'Stokes Q'
 	fxaddpar, extension_header, 'BUNIT', cal_pack.vl_channel.cal_units
 	fxaddpar, extension_header, 'DATAMIN', min(q, /nan)
 	fxaddpar, extension_header, 'DATAMAX', max(q, /nan)
-
+	sxdelpar, extension_header, 'EXTEND'
 	if not ref_detector then q = metis_rectify(q, 'VL')
 	fits_add_checksum, extension_header, q
 	mwrfits, float(q), out_file_name[3], extension_header, /no_comment, /silent
@@ -604,15 +658,15 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the stokes u image
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Stokes U', 'extension name'
+	extension_header = primary_stokes_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Stokes U', 'extension name', before = 'LONGSTRN'
 	fxaddpar, extension_header, 'BTYPE', 'Stokes U'
 	fxaddpar, extension_header, 'BUNIT', cal_pack.vl_channel.cal_units
 	fxaddpar, extension_header, 'DATAMIN', min(u, /nan)
 	fxaddpar, extension_header, 'DATAMAX', max(u, /nan)
-
+	sxdelpar, extension_header, 'EXTEND'
 	if not ref_detector then u = metis_rectify(u, 'VL')
 	fits_add_checksum, extension_header, u
 	mwrfits, float(u), out_file_name[3], extension_header, /no_comment, /silent
@@ -621,11 +675,25 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the quality matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name'
-
+	base_header = primary_stokes_header
+	sxdelpar, base_header, 'EXTEND'
+	sxdelpar, base_header, 'DATASUM'
+	sxdelpar, base_header, 'CHECKSUM'
+	sxdelpar, base_header, 'COMMENT'
+	sxdelpar, base_header, 'HISTORY'
+	
+	extension_header = base_header
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Quality matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Pixel quality'
+	fxaddpar, extension_header, 'BUNIT', 'None'
+	fxaddpar, extension_header, 'DATAMIN', min(quality_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(quality_matrix, /nan)
+	fxaddpar, extension_header, 'COMMENT', 'Quality matrix values:'
+	fxaddpar, extension_header, 'COMMENT', '  NaN = saturated or null L0 pixel counts'
+	fxaddpar, extension_header, 'COMMENT', '  0   = unreliable pixel value'
+	fxaddpar, extension_header, 'COMMENT', '  1   = good pixel'
 	if not ref_detector then quality_matrix = metis_rectify(quality_matrix, 'VL')
 	fits_add_checksum, extension_header, quality_matrix
 	mwrfits, float(quality_matrix), out_file_name[3], extension_header, /no_comment, /silent
@@ -634,12 +702,14 @@ pro metis_l2_prep_vl_polariz
 
 	; add the extension with the error matrix
 
-	extension_header = !null
-	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count'
-	fxaddpar, extension_header, 'GCOUNT', 1, 'group count'
-	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name'
+	extension_header = base_header
 	error_matrix = intarr(header.naxis1, header.naxis2)
-	
+	fxaddpar, extension_header, 'PCOUNT', 0, 'parameter count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'GCOUNT', 1, 'group count', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'EXTNAME', 'Error matrix', 'extension name', before = 'LONGSTRN'
+	fxaddpar, extension_header, 'BTYPE', 'Absolute error'
+	fxaddpar, extension_header, 'DATAMIN', min(error_matrix, /nan)
+	fxaddpar, extension_header, 'DATAMAX', max(error_matrix, /nan)
 	if not ref_detector then error_matrix = metis_rectify(error_matrix, 'VL')
 	fits_add_checksum, extension_header, error_matrix
 	mwrfits, float(error_matrix), out_file_name[3], extension_header, /no_comment, /silent
-- 
GitLab