genSurveyDFSByPointing.py 9.2 KB
Newer Older
Zhang Xin's avatar
init  
Zhang Xin committed
1
2
3
4
'''
Author: Zhang Xin zhangx@bao.ac.cn
Date: 2025-04-21 09:53:28
LastEditors: Zhang Xin zhangx@bao.ac.cn
Zhang Xin's avatar
Zhang Xin committed
5
LastEditTime: 2025-09-03 16:56:04
Zhang Xin's avatar
init  
Zhang Xin committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
FilePath: /CSST_Survey/Users/zhangxin/Work/SurveyPlan/point/pointing_c9/genSurveyDFSByPointing.py
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
'''
import json
from datetime import datetime
from astropy.table import Table, join  # type: ignore
import numpy as np  # type: ignore
from astropy.time import Time
from datetime import datetime, timedelta
import pytz
import sys


def calculateTransTime(transAngle=1.0, shuterTime=1.5):
    angleVStime = np.array([[1, 20, 45, 180], [80, 127, 196, 581]])

    if transAngle < angleVStime[0, 0]:
        tTime = 70
    elif transAngle == angleVStime[0, 0]:
        tTime = angleVStime[1, 0]
    else:
        for i in np.arange(1, 4, 1):
            if (transAngle > angleVStime[0, i-1] and transAngle <= angleVStime[0, i]):
                tTime = angleVStime[1, i-1] * ((transAngle - angleVStime[0, i])) / (((angleVStime[0, i-1] - angleVStime[0, i]))) + \
                    angleVStime[1, i] * ((transAngle - angleVStime[0, i-1])) / \
                    (((angleVStime[0, i] - angleVStime[0, i-1])))
                break

    return tTime + shuterTime * 2.0


def JDTimeToBeijingTime(jd_time=2459766.):
    # 使用 astropy 转换到UTC时间
    t = Time(jd_time, format='jd', scale='utc')
    utc_time = t.datetime  # 转换为 datetime 对象
    # 转换为北京时间(UTC+8)
    beijing_time = utc_time + timedelta(hours=8)
    # 使用 pytz 添加时区信息(可选)
    beijing_tz = pytz.timezone('Asia/Shanghai')
    beijing_time = beijing_tz.localize(beijing_time)
    # 格式化输出
    formatted_time = beijing_time.strftime("%Y-%m-%d %H:%M:%S")
    return formatted_time, beijing_time


def dataInit():
    # 定义数据字典
    data = {
        "id": 1593,
        "opid": "101000001593",
        "obs_id": "10100001593",
        "instrument": "MSC",
Zhang Xin's avatar
update    
Zhang Xin committed
58
59
60
61
62
        "obs_group": "None",
        "proposal_id": "None",
        # "project_id": "None",
        # "file_type": "SCI",

Zhang Xin's avatar
init  
Zhang Xin committed
63
64
65
        "obs_type": "WIDE",
        "object": "m31",
        "mode": "OM1",
Zhang Xin's avatar
update    
Zhang Xin committed
66
        "dataset": "None",
Zhang Xin's avatar
init  
Zhang Xin committed
67
68
        "starttime": "2031-04-23 16:40:19",
        "endtime": "2031-04-23 16:43:37",
Zhang Xin's avatar
update    
Zhang Xin committed
69
70
        # "duration": 150.0,
        "exptime": 150.0,
Zhang Xin's avatar
init  
Zhang Xin committed
71
        "params": {
Zhang Xin's avatar
update    
Zhang Xin committed
72
            "t0": "2031-04-23 16:41:04",
Zhang Xin's avatar
init  
Zhang Xin committed
73
            "T1": 150.0,
Zhang Xin's avatar
update    
Zhang Xin committed
74
75
76
77
78
79
80
81
            "bias_voltage": 0,
            "r_rate": 0,
            "h_rate": 0,
            "expstart": "2031-04-23 16:41:04",
            "nframes": 1,
            "cover": 0,
            "gainlvl": "",
            "shutter": "F",
Zhang Xin's avatar
Zhang Xin committed
82
            "submode": "OM1-1",
Zhang Xin's avatar
update    
Zhang Xin committed
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
            "ledflag": "",
            "ledstat": "",
            "ledt01": 0.0,
            "ledt02": 0.0,
            "ledt03": 0.0,
            "ledt04": 0.0,
            "ledt05": 0.0,
            "ledt06": 0.0,
            "ledt07": 0.0,
            "ledt08": 0.0,
            "ledt09": 0.0,
            "ledt10": 0.0,
            "ledt11": 0.0,
            "ledt12": 0.0,
            "ledt13": 0.0,
            "ledt14": 0.0,
            "ra_obj": 146.4567,
            "dec_obj": 54.0354,
            "pa_obj": 25.0,
            "guide_window": 1,
            "guide_duration": 10,
Zhang Xin's avatar
Zhang Xin committed
104
            "guide_pos": [1.0, 2.0],
Zhang Xin's avatar
init  
Zhang Xin committed
105
106
        },
        "simresult": {
Zhang Xin's avatar
update    
Zhang Xin committed
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

            "jd": 2459766.56586422,
            "dec": 18.9566929133858,
            "ra": 55.716621253406,
            "sat_x": 2071.4244979379,
            "sat_y": 5303.28628499587,
            "sat_z": 3639.38736139007,
            "sun_x": -36018853.1282829,
            "sun_y": 135579783.188155,
            "sun_z": 58773491.2520049,
            "moon_x": -388299.686481602,
            "moon_y": -18964.2980441153,
            "moon_z": 20511.371245116,
            "deep_area": 0.0,
            "very_deep_area": 0.0,
Zhang Xin's avatar
init  
Zhang Xin committed
122
            "ca": -1.0,
Zhang Xin's avatar
update    
Zhang Xin committed
123
124
125
126
127
            "cb": 1.0,
            "exptime": 150.0,
            "turn_angle": 1.9229313453104,
            "is_in_sun": 1,
            "cmg": 0.0,
Zhang Xin's avatar
init  
Zhang Xin committed
128
            "charge": 97200.0,
Zhang Xin's avatar
update    
Zhang Xin committed
129
130
            "between_angle": 16.2831689171475,
            "saa_sec": 0.0,
Zhang Xin's avatar
Zhang Xin committed
131
            "skyid": 309072,
Zhang Xin's avatar
update    
Zhang Xin committed
132
133
134
135
136
137
138
            "board_angle": 25.0,
            "quad_0": 0.999859206659046,
            "quad_i": 0.00671061788580071,
            "quad_j": -0.00768959137244524,
            "quad_k": -0.0133193208638005,
            "sky_type": 1.0,
            "id": 0,
Zhang Xin's avatar
Zhang Xin committed
139
            "sat_vx": -7.104108,
Zhang Xin's avatar
update    
Zhang Xin committed
140
141
142
143
144
145
146
147
148
149
            "sat_vy": 2.912855,
            "sat_vz": 0.332436,
            "fov_lt_dec": 20.4566929133858,
            "fov_lt_ra": 47.6784104513669,
            "fov_lb_dec": 17.4566929133858,
            "fov_lb_ra": 47.6784104513669,
            "fov_rb_dec": 17.4566929133858,
            "fov_rb_ra": 47.9427837789041,
            "fov_rt_dec": 20.4566929133858,
            "fov_rt_ra": 47.9427837789041
Zhang Xin's avatar
init  
Zhang Xin committed
150
151
152
153
154
155
        }
    }
    return data


if __name__ == "__main__":
Zhang Xin's avatar
update    
Zhang Xin committed
156
157
    if len(sys.argv) < 4:
        print('input_file_name  output_file_name datasec')
Zhang Xin's avatar
Zhang Xin committed
158
159
160
161
162
163
164
    obs_group = "None"
    if len(sys.argv) == 5:
        obs_group = sys.argv[4]
    subMod = "OM1-1"
    if len(sys.argv) == 6:
        obs_group = sys.argv[4]
        subMod = sys.argv[5]
Zhang Xin's avatar
init  
Zhang Xin committed
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
    fn1 = 'E17.5_b17.5_beta_11.6_opt_transtime_1_CMG_1_dp_2_0.25_da_10_Texp_1.5_DEC60_500_0.1_800_1000_+5deg.obsid.csv'
    # fn2 = 'pointing_50_5_n.dat'
    fn2 = sys.argv[1]
    outFn = sys.argv[2]
    t1 = Table.read(fn1, format='ascii')
    t2 = Table.read(fn2, format='ascii')
    t1['obs_id'] = (t1['obs_id']//1e11*1e8+t1['obs_id'] % 1e8).astype(np.int64)

    t2.rename_column('id', 'obs_id')
    inputData = join(t1, t2, keys='obs_id')

    # dfn = 'pointing_50_5_n_obsid.dat'
    # inputData = Table.read(dfn, format='ascii')

    all_data = []
    for i in np.arange(len(inputData)):
        d1 = inputData[i]
        data = dataInit()
        data['id'] = int(d1['id'])
        data['obs_id'] = d1['obs_id']
        data['opid'] = (str(d1['obs_id'])[0:3]+'0'+str(d1['obs_id'])[3:])
        data['instrument'] = 'MSC'
Zhang Xin's avatar
Zhang Xin committed
187
        data['obs_group'] = obs_group
Zhang Xin's avatar
update    
Zhang Xin committed
188
        # data['file_type'] = 'SCI'
Zhang Xin's avatar
Zhang Xin committed
189
        if d1['sky_type'] == 2:
Zhang Xin's avatar
update    
Zhang Xin committed
190
            data['obs_type'] = 'DEEP'
Zhang Xin's avatar
Zhang Xin committed
191
192
        else:
            data['obs_type'] = 'WIDE'
Zhang Xin's avatar
init  
Zhang Xin committed
193
        data['object'] = d1['skyid']
Zhang Xin's avatar
update    
Zhang Xin committed
194
        data['dataset'] = sys.argv[3]
Zhang Xin's avatar
init  
Zhang Xin committed
195
196
197
198
        data['starttime'] = JDTimeToBeijingTime(
            d1['jd'])[1].isoformat()
        data['endtime'] = JDTimeToBeijingTime(
            d1['jd']+d1['exposure']/86400.)[1].isoformat()
Zhang Xin's avatar
update    
Zhang Xin committed
199
        data['exptime'] = d1['exposure']
Zhang Xin's avatar
init  
Zhang Xin committed
200
201

        # param
Zhang Xin's avatar
update    
Zhang Xin committed
202
203
204
        data['params']['ra_obj'] = d1['ra_2']
        data['params']['dec_obj'] = d1['dec_2']
        data['params']['pa_obj'] = d1['pos_angle']
Zhang Xin's avatar
init  
Zhang Xin committed
205
        data['params']['T1'] = d1['exposure']
Zhang Xin's avatar
update    
Zhang Xin committed
206
        data['params']['t0'] = JDTimeToBeijingTime(
Zhang Xin's avatar
init  
Zhang Xin committed
207
            d1['jd'])[1].isoformat()
Zhang Xin's avatar
update    
Zhang Xin committed
208
209
210
        data['params']['expstart'] = data['params']['t0']
        data['params']['cover'] = 1
        data['params']['shutter'] = "T"
Zhang Xin's avatar
Zhang Xin committed
211
        data['params']['submode'] = subMod
Zhang Xin's avatar
init  
Zhang Xin committed
212
213
214

        # simresult
        data['simresult']['jd'] = d1['jd']
Zhang Xin's avatar
update    
Zhang Xin committed
215
216
        data['simresult']['dec'] = d1['decH']
        data['simresult']['ra'] = d1['raH']
Zhang Xin's avatar
init  
Zhang Xin committed
217
218
219
220
221
222
223
224
225
        data['simresult']['sat_x'] = d1['sat_x_1']
        data['simresult']['sat_y'] = d1['sat_y_1']
        data['simresult']['sat_z'] = d1['sat_z_1']
        data['simresult']['sun_x'] = d1['sun_x_1']
        data['simresult']['sun_y'] = d1['sun_y_1']
        data['simresult']['sun_z'] = d1['sun_z_1']
        data['simresult']['moon_x'] = d1['moon_x_1']
        data['simresult']['moon_y'] = d1['moon_y_1']
        data['simresult']['moon_z'] = d1['moon_z_1']
Zhang Xin's avatar
update    
Zhang Xin committed
226
227
        data['simresult']['deep_area'] = d1['deepArea']
        data['simresult']['very_deep_area'] = d1['veryDeepArea']
Zhang Xin's avatar
Zhang Xin committed
228
229
        data['simresult']['ca'] = float(d1['ca'])
        data['simresult']['cb'] = float(d1['cb'])
Zhang Xin's avatar
update    
Zhang Xin committed
230
231
232
        data['simresult']['exptime'] = d1['exposure']
        data['simresult']['turn_angle'] = d1['turnAngle']
        data['simresult']['is_in_sun'] = d1['isInSun']
Zhang Xin's avatar
init  
Zhang Xin committed
233
234
        data['simresult']['cmg'] = d1['cmg']
        data['simresult']['charge'] = d1['charge']
Zhang Xin's avatar
Zhang Xin committed
235
        data['simresult']['skyid'] = int(d1['skyid'])
Zhang Xin's avatar
update    
Zhang Xin committed
236
        data['simresult']['board_angle'] = d1['boardAngle']
Zhang Xin's avatar
init  
Zhang Xin committed
237
238
239
240
        data['simresult']['quad_0'] = d1['quad_0']
        data['simresult']['quad_i'] = d1['quad_i']
        data['simresult']['quad_j'] = d1['quad_j']
        data['simresult']['quad_k'] = d1['quad_k']
Zhang Xin's avatar
Zhang Xin committed
241
242
        data['simresult']['sky_type'] = float(d1['sky_type'])
        data['simresult']['id'] = int(d1['id'])
Zhang Xin's avatar
update    
Zhang Xin committed
243
244
245
246
247
248
249
250
251
252
253
254
        data['simresult']['sat_vx'] = d1['sat_vx']
        data['simresult']['sat_vy'] = d1['sat_vy']
        data['simresult']['sat_vz'] = d1['sat_vz']

        data['simresult']['fov_lt_dec'] = 0.
        data['simresult']['fov_lt_ra'] = 0.
        data['simresult']['fov_lb_dec'] = 0.
        data['simresult']['fov_lb_ra'] = 0.
        data['simresult']['fov_rb_dec'] = 0.
        data['simresult']['fov_rb_ra'] = 0.
        data['simresult']['fov_rt_dec'] = 0.
        data['simresult']['fov_rt_ra'] = 0.
Zhang Xin's avatar
init  
Zhang Xin committed
255
256
257
258
259
260
261
262
263
264
265

        all_data.append(data)
        # break

    json_data = json.dumps(all_data, indent=4, default=str)

    # 打印JSON格式的字符串
    # print(json_data)

    with open(outFn, "w") as file:
        file.write(json_data)