test_io.py 4.56 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

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

15
from astropy.io import fits
BO ZHANG's avatar
BO ZHANG committed
16
from astropy import table
17

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

29

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

        h1.set("A", 1, "comment")
BO ZHANG's avatar
BO ZHANG committed
36
37
        h1.set("B", 1, "comment")
        h1.set("C", 1, "comment")
38
39
40
41
        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
42
43
44
        h2.set("B", 2, "comment")
        h2.set("C", 2, "comment")
        h2.set("D", 2, "comment")
45
46
47
48
        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
49
        h_update = append_header(h1, h2, duplicates="update")
50
        self.assertEqual(
BO ZHANG's avatar
BO ZHANG committed
51
            tuple(h_update.keys()),
52
53
54
55
56
57
            (
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "A",
                "B",
BO ZHANG's avatar
BO ZHANG committed
58
                "C",
59
60
61
                "COMMENT",
                "COMMENT",
                "COMMENT",
BO ZHANG's avatar
BO ZHANG committed
62
                "D",
63
64
65
            ),
            "update mode failed",
        )
BO ZHANG's avatar
BO ZHANG committed
66
67
68
69
70
71
        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")
72
        self.assertEqual(
BO ZHANG's avatar
BO ZHANG committed
73
            tuple(h_delete.keys()),
74
75
76
77
78
79
80
81
82
83
            (
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "A",
                "COMMENT",
                "COMMENT",
                "COMMENT",
                "B",
                "C",
BO ZHANG's avatar
BO ZHANG committed
84
                "D",
85
86
87
            ),
            "delete mode failed",
        )
BO ZHANG's avatar
BO ZHANG committed
88
89
90
91
        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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114

    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
115
116
117

    def test_delete_section(self):
        h = fits.Header()
BO ZHANG's avatar
BO ZHANG committed
118
119
120
121
122
123
124
125
126
127
128
        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
129
130
131

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

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

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

BO ZHANG's avatar
BO ZHANG committed
141
    def test_append_meta(self):
BO ZHANG's avatar
BO ZHANG committed
142
        hdulist = fits.HDUList([fits.PrimaryHDU()])
BO ZHANG's avatar
BO ZHANG committed
143
144
        meta = generate_meta(obs_id="123456")
        hdulist = append_meta(hdulist, meta)
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")
BO ZHANG's avatar
BO ZHANG committed
148
149
150
151
152
153

    def test_add_meta_to_table(self):
        t = table.Table([{"a": 1, "b": 2}] * 5)
        meta = generate_meta(obs_id="123456")
        t = add_meta_to_table(t, meta)
        self.assertEqual(set(t.colnames), ("a", "b", "healpix", "data_uuid"))