test_fits_header_ops.py 4.37 KB
Newer Older
BO ZHANG's avatar
BO ZHANG committed
1
2
3
4
5
6
7
"""
Identifier:     tests/test_fits_header_ops.py
Name:           test_fits_header_ops.py
Description:    test append_header
Author:         Bo Zhang
Created:        2023-12-15
Modified-History:
BO ZHANG's avatar
tweaks    
BO ZHANG committed
8
9
    2023-12-15, Bo Zhang, add TestFitsHeaderOps.test_append_header
    2023-12-15, Bo Zhang, add TestFitsHeaderOps.test_reformat_header
BO ZHANG's avatar
BO ZHANG committed
10
"""
BO ZHANG's avatar
BO ZHANG committed
11

12
import unittest
BO ZHANG's avatar
BO ZHANG committed
13

14
15
from astropy.io import fits

BO ZHANG's avatar
tweaks    
BO ZHANG committed
16
17
18
19
20
21
from csst_common.io import (
    append_header,
    reformat_header,
    delete_section,
    get_proc_info,
    generate_meta,
BO ZHANG's avatar
BO ZHANG committed
22
    append_meta,
BO ZHANG's avatar
BO ZHANG committed
23
    extract_meta,
BO ZHANG's avatar
tweaks    
BO ZHANG committed
24
)
BO ZHANG's avatar
BO ZHANG committed
25

26

BO ZHANG's avatar
tweaks    
BO ZHANG committed
27
class TestFitsHeaderOps(unittest.TestCase):
28
29
30
31
32
    def test_append_header(self):
        h1 = fits.Header()
        h2 = fits.Header()

        h1.set("A", 1, "comment")
BO ZHANG's avatar
BO ZHANG committed
33
34
        h1.set("B", 1, "comment")
        h1.set("C", 1, "comment")
35
36
37
38
        h1.add_comment("=" * 72, before="A")
        h1.add_comment("one", before="A")
        h1.add_comment("=" * 72, before="A")

BO ZHANG's avatar
BO ZHANG committed
39
40
41
        h2.set("B", 2, "comment")
        h2.set("C", 2, "comment")
        h2.set("D", 2, "comment")
42
43
44
45
        h2.add_comment("=" * 72, before="B")
        h2.add_comment("another", before="B")
        h2.add_comment("=" * 72, before="B")

BO ZHANG's avatar
BO ZHANG committed
46
        h_update = append_header(h1, h2, duplicates="update")
47
        self.assertEqual(
BO ZHANG's avatar
BO ZHANG committed
48
            tuple(h_update.keys()),
49
50
51
52
53
54
            (
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "A",
                "B",
BO ZHANG's avatar
BO ZHANG committed
55
                "C",
56
57
58
                "COMMENT",
                "COMMENT",
                "COMMENT",
BO ZHANG's avatar
BO ZHANG committed
59
                "D",
60
61
62
            ),
            "update mode failed",
        )
BO ZHANG's avatar
BO ZHANG committed
63
64
65
66
67
68
        self.assertEqual(h_update["A"], 1)
        self.assertEqual(h_update["B"], 2)
        self.assertEqual(h_update["C"], 2)
        self.assertEqual(h_update["D"], 2)

        h_delete = append_header(h1, h2, duplicates="delete")
69
        self.assertEqual(
BO ZHANG's avatar
BO ZHANG committed
70
            tuple(h_delete.keys()),
71
72
73
74
75
76
77
78
79
80
            (
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "A",
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "B",
                "C",
BO ZHANG's avatar
BO ZHANG committed
81
                "D",
82
83
84
            ),
            "delete mode failed",
        )
BO ZHANG's avatar
BO ZHANG committed
85
86
87
88
        self.assertEqual(h_delete["A"], 1)
        self.assertEqual(h_delete["B"], 2)
        self.assertEqual(h_delete["C"], 2)
        self.assertEqual(h_delete["D"], 2)
BO ZHANG's avatar
BO ZHANG committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

    def test_reformat_header(self):
        h = fits.Header()
        h.add_comment("A")
        h.add_comment("B")
        h.add_comment("B")
        h.add_comment("C")
        h.add_comment("X")
        h.set("A", 1)
        h.set("SIMPLE", True)
        h.set("NAXIS1", 1)

        h_rfmt = reformat_header(h, strip=True, comment="WCS info")
        self.assertEqual(
            tuple(h_rfmt.keys()),
            ("COMMENT", "COMMENT", "COMMENT", "A", "NAXIS1"),
        )

        h_rfmt = reformat_header(h, strip=False, comment="WCS info")
        self.assertEqual(
            tuple(h_rfmt.keys()),
            ("COMMENT", "COMMENT", "COMMENT", "A", "SIMPLE", "NAXIS1"),
        )
BO ZHANG's avatar
BO ZHANG committed
112
113
114

    def test_delete_section(self):
        h = fits.Header()
BO ZHANG's avatar
BO ZHANG committed
115
116
117
118
119
120
121
122
123
124
125
        h.append(("COMMENT", "A", ""), bottom=True)
        h.append(("COMMENT", "C", ""), bottom=True)
        h.append(("COMMENT", "B", ""), bottom=True)
        h.append(("SIMPLE", True, ""), bottom=True)
        h.append(("NAXIS1", 1, ""), bottom=True)
        h.append(("COMMENT", "=" * 72, ""), bottom=True)
        h.append(("COMMENT", "WCS", ""), bottom=True)
        h.append(("COMMENT", "=" * 72, ""), bottom=True)
        h.append(("A", 1, ""), bottom=True)
        h.append(("COMMENT", "=" * 72, ""), bottom=True)
        h.append(("COMMENT", "=" * 72, ""), bottom=True)
BO ZHANG's avatar
BO ZHANG committed
126
127
128

        h_del = delete_section(h, title="WCS")
        self.assertEqual(len(h_del.cards), 7)
BO ZHANG's avatar
BO ZHANG committed
129
130
131
132

    def test_get_proc_info(self):
        proc_info = get_proc_info()
        self.assertEquals(proc_info["BUILD"], "-")
BO ZHANG's avatar
tweaks    
BO ZHANG committed
133
134
135
136

    def test_generate_meta(self):
        h = generate_meta()
        self.assertIsInstance(h, fits.Header)
BO ZHANG's avatar
tweaks    
BO ZHANG committed
137
138
139
140

    def test_generate_meta_with_invalid_args(self):
        with self.assertRaises(AssertionError):
            generate_meta(obs_id=1)
BO ZHANG's avatar
BO ZHANG committed
141
142

    def test_append_meta(self):
BO ZHANG's avatar
BO ZHANG committed
143
        hdulist = fits.HDUList([fits.PrimaryHDU()])
BO ZHANG's avatar
BO ZHANG committed
144
        hdulist = append_meta(hdulist, obs_id="123456")
BO ZHANG's avatar
BO ZHANG committed
145
146
147
        self.assertIn("META", set(hdulist[0].header.keys()))
        meta = extract_meta(hdulist)
        self.assertEqual(meta["obs_id"], "123456")