Coverage for tests/test_translator.py: 17%

103 statements  

« prev     ^ index     » next       coverage.py v7.5.1, created at 2024-05-15 02:34 -0700

1# This file is part of obs_lsst. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (http://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

9# This program is free software: you can redistribute it and/or modify 

10# it under the terms of the GNU General Public License as published by 

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

19# You should have received a copy of the GNU General Public License 

20# along with this program. If not, see <http://www.gnu.org/licenses/>. 

21 

22import os.path 

23import unittest 

24import warnings 

25import astropy.time 

26import astropy.units as u 

27import astropy.units.cds as cds 

28from astropy.io.fits.verify import VerifyWarning 

29 

30import lsst.obs.lsst.translators # noqa: F401 -- register the translators 

31from astro_metadata_translator.tests import MetadataAssertHelper 

32 

33TESTDIR = os.path.abspath(os.path.dirname(__file__)) 

34 

35 

36class LsstMetadataTranslatorTestCase(unittest.TestCase, MetadataAssertHelper): 

37 """Each test reads in raw headers from YAML files, constructs an 

38 `ObservationInfo`, and compares the properties with the expected values 

39 defined in the corresponding `dict`.""" 

40 

41 datadir = os.path.join(TESTDIR, "headers") 

42 

43 def test_lsstCam_translator(self): 

44 test_data = (("lsstCam-MC_C_20190319_000001_R10_S02.yaml", 

45 dict(telescope="Simonyi Survey Telescope", 

46 instrument="LSSTCam", 

47 boresight_rotation_coord="unknown", 

48 dark_time=0.0*u.s, 

49 detector_exposure_id=0x269200011d, 

50 detector_group="R10", 

51 detector_name="S02", 

52 detector_num=29, 

53 detector_serial="ITL-3800C-041", 

54 exposure_id=3019031900001, 

55 exposure_group="3019031900001", 

56 exposure_time=0.0*u.s, 

57 focus_z=0.0*u.mm, 

58 group_counter_end=1, 

59 group_counter_start=1, 

60 has_simulated_content=False, 

61 object="UNKNOWN", 

62 observation_counter=1, 

63 observation_id="MC_C_20190319_000001", 

64 observation_type="bias", 

65 observation_reason="bias", 

66 observing_day=20190319, 

67 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

68 physical_filter="unknown", 

69 pressure=None, 

70 relative_humidity=None, 

71 science_program="unknown", 

72 temperature=None, 

73 visit_id=3019031900001)), 

74 ("lsstCam-MC_C_20190319_000001_R22_S21.yaml", 

75 dict(telescope="Simonyi Survey Telescope", 

76 instrument="LSSTCam", 

77 boresight_rotation_coord="unknown", 

78 dark_time=0.0*u.s, 

79 detector_exposure_id=0x2692000161, 

80 detector_group="R22", 

81 detector_name="S21", 

82 detector_num=97, 

83 detector_serial="ITL-3800C-139", 

84 exposure_id=3019031900001, 

85 exposure_group="3019031900001", 

86 exposure_time=0.0*u.s, 

87 focus_z=0.0*u.mm, 

88 group_counter_end=1, 

89 group_counter_start=1, 

90 has_simulated_content=False, 

91 object="UNKNOWN", 

92 observation_counter=1, 

93 observation_id="MC_C_20190319_000001", 

94 observation_type="bias", 

95 observation_reason="bias", 

96 observing_day=20190319, 

97 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

98 physical_filter="unknown", 

99 pressure=None, 

100 relative_humidity=None, 

101 science_program="unknown", 

102 temperature=None, 

103 visit_id=3019031900001)), 

104 ("lsstCam-MC_C_20190322_000002_R10_S22.yaml", 

105 dict(telescope="Simonyi Survey Telescope", 

106 instrument="LSSTCam", 

107 boresight_rotation_coord="unknown", 

108 dark_time=1.0*u.s, 

109 detector_exposure_id=0x2693800223, 

110 detector_group="R10", 

111 detector_name="S22", 

112 detector_num=35, 

113 detector_serial="ITL-3800C-103", 

114 exposure_id=3019032200002, 

115 exposure_group="3019032200002", 

116 exposure_time=1.0*u.s, 

117 focus_z=0.0*u.mm, 

118 group_counter_end=2, 

119 group_counter_start=2, 

120 has_simulated_content=False, 

121 object="UNKNOWN", 

122 observation_counter=2, 

123 observation_id="MC_C_20190322_000002", 

124 observation_type="flat", 

125 observation_reason="flat", 

126 observing_day=20190322, 

127 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

128 physical_filter="SDSSi~ND_OD0.5", 

129 pressure=None, 

130 relative_humidity=None, 

131 science_program="6489D", 

132 temperature=None, 

133 visit_id=3019032200002)), 

134 ("lsstCam-MC_C_20190406_000643_R10_S00.yaml", 

135 dict(telescope="Simonyi Survey Telescope", 

136 instrument="LSSTCam", 

137 boresight_rotation_coord="unknown", 

138 dark_time=1007.422*u.s, 

139 detector_exposure_id=0x269b02831b, 

140 detector_group="R10", 

141 detector_name="S00", 

142 detector_num=27, 

143 detector_serial="ITL-3800C-145", 

144 exposure_id=3019040600643, 

145 exposure_group="3019040600643", 

146 exposure_time=999.99*u.s, 

147 focus_z=0.0*u.mm, 

148 group_counter_end=643, 

149 group_counter_start=643, 

150 has_simulated_content=False, 

151 object="UNKNOWN", 

152 observation_counter=643, 

153 observation_id="MC_C_20190406_000643", 

154 observation_type="flat", 

155 observation_reason="lambda", 

156 observing_day=20190406, 

157 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

158 physical_filter="950nm", 

159 pressure=None, 

160 relative_humidity=None, 

161 science_program="6549D", 

162 temperature=None, 

163 visit_id=3019040600643)), 

164 ("lsstCam-faked-future-ccs.yaml", # Old CCS observation with date in future for exp_id 

165 dict(telescope="Simonyi Survey Telescope", 

166 instrument="LSSTCam", 

167 boresight_rotation_coord="unknown", 

168 dark_time=0.0*u.s, 

169 detector_exposure_id=0xdb480011d, 

170 detector_group="R10", 

171 detector_name="S02", 

172 detector_num=29, 

173 detector_serial="ITL-3800C-041", 

174 exposure_id=2029031900001, 

175 exposure_group="2029031900001", 

176 exposure_time=0.0*u.s, 

177 focus_z=0.0*u.mm, 

178 group_counter_end=1, 

179 group_counter_start=1, 

180 has_simulated_content=False, 

181 object="UNKNOWN", 

182 observation_counter=1, 

183 observation_id="MC_C_20190319_000001", 

184 observation_type="bias", 

185 observation_reason="bias", 

186 observing_day=20290319, 

187 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

188 physical_filter="unknown", 

189 pressure=None, 

190 relative_humidity=None, 

191 science_program="unknown", 

192 temperature=None, 

193 visit_id=2029031900001)), 

194 ("lsstCam-MC_C_20231107_000078_R01_S01.json", 

195 dict(telescope="Simonyi Survey Telescope", 

196 instrument="LSSTCam", 

197 boresight_rotation_coord="unknown", 

198 dark_time=0.092*u.s, 

199 detector_exposure_id=0x9e1004e01, 

200 detector_group="R01", 

201 detector_name="S01", 

202 detector_num=1, 

203 detector_serial="ITL-3800C-226", 

204 exposure_id=2023110700078, 

205 exposure_group="2023110700078", 

206 exposure_time=0.0*u.s, 

207 focus_z=0.0*u.mm, 

208 group_counter_end=78, 

209 group_counter_start=78, 

210 has_simulated_content=False, 

211 object="UNKNOWN", 

212 observation_counter=78, 

213 observation_id="MC_C_20231107_000078", 

214 observation_type="bias", 

215 observation_reason="bot_persistence", 

216 observing_day=20231107, 

217 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

218 physical_filter="ph_5", 

219 pressure=None, 

220 relative_humidity=None, 

221 science_program="13518", 

222 temperature=None, 

223 visit_id=2023110700078)), 

224 ) 

225 for filename, expected in test_data: 

226 with self.subTest(f"Testing {filename}"): 

227 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

228 

229 def test_phoSimLsstCam_translator(self): 

230 test_data = (("lsstCam-MC_H_20100217_000032_R22_S00.yaml", 

231 dict(telescope="Simonyi Survey Telescope", 

232 instrument="LSSTCam", 

233 boresight_rotation_coord="sky", 

234 dark_time=15.0*u.s, 

235 detector_exposure_id=0x401780205a, 

236 detector_group="R22", 

237 detector_name="S00", 

238 detector_num=90, 

239 detector_serial="E2V-CCD250-369", 

240 detector_unique_name="R22_S00", 

241 exposure_group="4010021700032", 

242 exposure_id=4010021700032, 

243 exposure_time=15.0*u.s, 

244 focus_z=0.0*u.mm, 

245 group_counter_end=32, 

246 group_counter_start=32, 

247 has_simulated_content=True, 

248 object="UNKNOWN", 

249 observation_counter=32, 

250 observation_id="MC_H_20100217_000032", 

251 observation_reason="phosim", 

252 observation_type="science", 

253 observing_day=20100217, 

254 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

255 physical_filter="g", 

256 pressure=None, 

257 relative_humidity=None, 

258 science_program="9006001", 

259 temperature=None, 

260 visit_id=4010021700032)), 

261 ) 

262 for filename, expected in test_data: 

263 with self.subTest(f"Testing {filename}"): 

264 self.assertObservationInfoFromYaml(filename, dir=self.datadir, 

265 check_wcs=False, **expected) 

266 

267 def test_lsstCamSim_translator(self): 

268 test_data = (("lsstCamSim-MC_S_20240321_000720_R22_S11.yaml", 

269 dict(telescope="Simonyi Survey Telescope", 

270 instrument="LSSTCamSim", 

271 boresight_rotation_coord="sky", 

272 dark_time=30.0*u.s, 

273 detector_exposure_id=730756993118, 

274 detector_group="R22", 

275 detector_name="S11", 

276 detector_num=94, 

277 detector_serial="E2V-CCD250-382", 

278 detector_unique_name="R22_S11", 

279 exposure_group="7024032100720", 

280 exposure_id=7024032100720, 

281 exposure_time=30.0*u.s, 

282 focus_z=0.0*u.mm, 

283 group_counter_end=720, 

284 group_counter_start=720, 

285 has_simulated_content=True, 

286 object="UNKNOWN", 

287 observation_counter=720, 

288 observation_id="MC_S_20240321_000720", 

289 observation_reason="survey", 

290 observation_type="science", 

291 observing_day=20240321, 

292 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

293 physical_filter="r_57", 

294 pressure=None, 

295 relative_humidity=None, 

296 science_program="720", 

297 temperature=None, 

298 visit_id=7024032100720)), 

299 ) 

300 for filename, expected in test_data: 

301 with self.subTest(f"Testing {filename}"): 

302 self.assertObservationInfoFromYaml(filename, dir=self.datadir, 

303 check_wcs=False, **expected) 

304 

305 def test_comCam_translator(self): 

306 test_data = (("comCam-CC_C_20190530_000001_R22_S00.yaml", 

307 dict(telescope="Simonyi Survey Telescope", 

308 instrument="LSSTComCam", 

309 boresight_rotation_coord="unknown", 

310 dark_time=0.398*u.s, 

311 detector_exposure_id=0x26b6000100, 

312 detector_group="R22", 

313 detector_name="S00", 

314 detector_num=0, 

315 detector_serial="ITL-3800C-229", 

316 exposure_id=3019053000001, 

317 exposure_group="3019053000001", 

318 exposure_time=0.0*u.s, 

319 focus_z=0.0*u.mm, 

320 group_counter_end=1, 

321 group_counter_start=1, 

322 has_simulated_content=False, 

323 object="UNKNOWN", 

324 observation_counter=1, 

325 observation_id="CC_C_20190530_000001", 

326 observation_type="bias", 

327 observation_reason="bias", 

328 observing_day=20190530, 

329 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

330 physical_filter="unknown", 

331 pressure=None, 

332 relative_humidity=None, 

333 science_program="unknown", 

334 temperature=None, 

335 visit_id=3019053000001)), 

336 ("comCam-CC_C_20190526_000223_R22_S01.yaml", 

337 dict(telescope="Simonyi Survey Telescope", 

338 instrument="LSSTComCam", 

339 boresight_rotation_coord="unknown", 

340 dark_time=0.034*u.s, 

341 detector_exposure_id=0x26b400df01, 

342 detector_group="R22", 

343 detector_name="S01", 

344 detector_num=1, 

345 detector_serial="ITL-3800C-251", 

346 exposure_id=3019052600223, 

347 exposure_group="3019052600223", 

348 exposure_time=0.0*u.s, 

349 focus_z=0.0*u.mm, 

350 group_counter_end=223, 

351 group_counter_start=223, 

352 has_simulated_content=False, 

353 object="UNKNOWN", 

354 observation_counter=223, 

355 observation_id="CC_C_20190526_000223", 

356 observation_type="bias", 

357 observation_reason="dark", 

358 observing_day=20190526, 

359 observing_day_offset=astropy.time.TimeDelta(25200.0, scale="tai", format="sec"), 

360 physical_filter="unknown", 

361 pressure=None, 

362 relative_humidity=None, 

363 science_program="unknown", 

364 temperature=None, 

365 visit_id=3019052600223)), 

366 ) 

367 for filename, expected in test_data: 

368 with self.subTest(f"Testing {filename}"): 

369 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

370 

371 def test_comCamSim_translator(self): 

372 test_data = (("comCamSim-IM_P_20240117_000000_R22_S00.yaml", 

373 dict(telescope="Simonyi Survey Telescope", 

374 instrument="LSSTComCamSim", 

375 boresight_rotation_coord="unknown", 

376 dark_time=0.0*u.s, 

377 detector_group="R22", 

378 detector_name="S00", 

379 detector_num=0, 

380 detector_serial="ITL-3800C-229", 

381 exposure_id=5024011700000, 

382 exposure_group="5024011700000", 

383 exposure_time=0.0*u.s, 

384 focus_z=0.0 * u.mm, 

385 group_counter_end=5024011700000, 

386 group_counter_start=5024011700000, 

387 has_simulated_content=True, 

388 object="UNKNOWN", 

389 observation_counter=0, 

390 observation_id="IM_P_20240117_000000", 

391 observation_type="bias", 

392 observation_reason="calibration", 

393 observing_day=20240117, 

394 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

395 physical_filter="r_03", 

396 pressure=None, 

397 relative_humidity=None, 

398 science_program="calibration", 

399 temperature=None, 

400 visit_id=5024011700000, 

401 )), 

402 ("comCamSim-CC_S_20240321_000093_R22_S22.yaml", 

403 dict(telescope="Simonyi Survey Telescope", 

404 instrument="LSSTComCamSim", 

405 boresight_rotation_coord="sky", 

406 dark_time=33.0546 * u.s, 

407 detector_group="R22", 

408 detector_name="S22", 

409 detector_num=8, 

410 detector_serial="ITL-3800C-206", 

411 exposure_id=7024032100093, 

412 exposure_group="2024-03-22T03:41:54.994", 

413 exposure_time=30.0 * u.s, 

414 focus_z=0.0 * u.mm, 

415 group_counter_end=93, 

416 group_counter_start=93, 

417 has_simulated_content=True, 

418 object="TEST", 

419 observation_counter=93, 

420 observation_id="CC_S_20240321_000093", 

421 observation_type="science", 

422 observation_reason="object", 

423 observing_day=20240321, 

424 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

425 physical_filter="r_03", 

426 pressure=None, 

427 relative_humidity=None, 

428 science_program="unknown", 

429 temperature=None, 

430 visit_id=2910085149940000, 

431 )), 

432 ) 

433 for filename, expected in test_data: 

434 with self.subTest(f"Testing {filename}"): 

435 self.assertObservationInfoFromYaml( 

436 filename, dir=self.datadir, check_wcs=False, **expected 

437 ) 

438 

439 def test_phoSimComCam_translator(self): 

440 test_data = (("comCam-CC_H_20100217_006001_R22_S00.yaml", 

441 dict(telescope="Simonyi Survey Telescope", 

442 instrument="LSSTComCam", 

443 boresight_rotation_coord="sky", 

444 dark_time=1.0*u.s, 

445 detector_exposure_id=0x4017977100, 

446 detector_group="R22", 

447 detector_name="S00", 

448 detector_num=0, 

449 detector_serial="ITL-3800C-229", 

450 exposure_id=4010021706001, 

451 exposure_group="4010021706001", 

452 exposure_time=1.0*u.s, 

453 focus_z=0.0*u.mm, 

454 group_counter_end=6001, 

455 group_counter_start=6001, 

456 has_simulated_content=True, 

457 object="UNKNOWN", 

458 observation_counter=6001, 

459 observation_id="CC_H_20100217_006001", 

460 observation_type="science", 

461 observation_reason="test", 

462 observing_day=20100217, 

463 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

464 physical_filter="g_01", 

465 pressure=None, 

466 relative_humidity=None, 

467 science_program="9006001", 

468 temperature=None, 

469 visit_id=4010021706001)), 

470 ) 

471 for filename, expected in test_data: 

472 with self.subTest(f"Testing {filename}"): 

473 self.assertObservationInfoFromYaml(filename, dir=self.datadir, 

474 check_wcs=False, **expected) 

475 

476 def test_phosim_translator(self): 

477 test_data = (("phosim-lsst_a_204595_f3_R11_S02_E000.yaml", 

478 dict(telescope="Simonyi Survey Telescope", 

479 instrument="LSSTCam-PhoSim", 

480 boresight_rotation_coord="sky", 

481 dark_time=30.0*u.s, 

482 detector_exposure_id=204595038, 

483 detector_group="R11", 

484 detector_name="S02", 

485 detector_num=38, 

486 detector_serial="R11_S02", 

487 exposure_id=204595, 

488 exposure_group="204595", 

489 exposure_time=30.0*u.s, 

490 focus_z=0.0*u.mm, 

491 group_counter_end=204595, 

492 group_counter_start=204595, 

493 has_simulated_content=True, 

494 object="UNKNOWN", 

495 observation_counter=0, 

496 observation_id="204595", 

497 observation_type="science", 

498 observation_reason="phosim", 

499 observing_day=20221005, 

500 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

501 physical_filter="i", 

502 pressure=520.0*cds.mmHg, 

503 relative_humidity=40.0, 

504 science_program="204595", 

505 temperature=20.0*u.deg_C, 

506 visit_id=204595, 

507 wcs_params=dict(max_sep=3000.))), # 2022 

508 ) 

509 for filename, expected in test_data: 

510 with self.subTest(f"Testing {filename}"): 

511 with warnings.catch_warnings(): 

512 # Avoid warnings from too-long FITS header keys. 

513 warnings.simplefilter("ignore", VerifyWarning) 

514 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

515 

516 def test_latiss_translator(self): 

517 test_data = (("latiss-2018-09-20-05700065-det000.yaml", 

518 dict(telescope="Rubin Auxiliary Telescope", 

519 instrument="LATISS", 

520 boresight_rotation_coord="unknown", 

521 dark_time=27.0*u.s, 

522 detector_exposure_id=0x2638004100, 

523 detector_group="RXX", 

524 detector_name="S00", 

525 detector_num=0, 

526 detector_serial="ITL-3800C-098", 

527 exposure_id=3018092000065, 

528 exposure_group="3018092000065", 

529 exposure_time=27.0*u.s, 

530 focus_z=0.0*u.mm, 

531 group_counter_end=65, 

532 group_counter_start=65, 

533 has_simulated_content=False, 

534 object="UNKNOWN", 

535 observation_counter=65, 

536 observation_id="AT_C_20180920_000065", 

537 observation_type="unknown", 

538 observation_reason="unknown", 

539 observing_day=20180920, 

540 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

541 physical_filter="unknown~unknown", 

542 pressure=None, 

543 relative_humidity=None, 

544 science_program="unknown", 

545 temperature=None, 

546 visit_id=3018092000065, 

547 )), 

548 ("latiss-AT_O_20190306_000014.yaml", 

549 dict(telescope="Rubin Auxiliary Telescope", 

550 instrument="LATISS", 

551 boresight_rotation_coord="unknown", 

552 dark_time=1.06*u.s, 

553 detector_exposure_id=0x68b800e00, 

554 detector_group="RXX", 

555 detector_name="S00", 

556 detector_num=0, 

557 detector_serial="ITL-3800C-098", 

558 exposure_id=2019030600014, 

559 exposure_group="2019030600014", 

560 exposure_time=1.06*u.s, 

561 focus_z=0.0*u.mm, 

562 group_counter_end=14, 

563 group_counter_start=14, 

564 has_simulated_content=False, 

565 object="UNKNOWN", 

566 observation_counter=14, 

567 observation_id="AT_O_20190306_000014", 

568 observation_type="unknown", 

569 observation_reason="unknown", 

570 observing_day=20190306, 

571 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

572 physical_filter="unknown~unknown", 

573 pressure=None, 

574 relative_humidity=None, 

575 science_program="unknown", 

576 temperature=None, 

577 visit_id=2019030600014, 

578 )), 

579 ("latiss-AT_O_20190329_000022-ats-wfs_ccd.yaml", 

580 dict(telescope="Rubin Auxiliary Telescope", 

581 instrument="LATISS", 

582 boresight_rotation_coord="unknown", 

583 dark_time=0.0*u.s, 

584 detector_exposure_id=0x697001600, 

585 detector_group="RXX", 

586 detector_name="S00", 

587 detector_num=0, 

588 detector_serial="ITL-3800C-098", 

589 exposure_id=2019032900022, 

590 exposure_group="2019032900022", 

591 exposure_time=0.0*u.s, 

592 focus_z=0.0*u.mm, 

593 group_counter_end=22, 

594 group_counter_start=22, 

595 has_simulated_content=False, 

596 object="UNKNOWN", 

597 observation_counter=22, 

598 observation_id="AT_O_20190329_000022", 

599 observation_type="bias", 

600 observation_reason="unknown", 

601 observing_day=20190329, 

602 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

603 physical_filter="unknown~unknown", 

604 pressure=None, 

605 relative_humidity=None, 

606 science_program="unknown", 

607 temperature=None, 

608 visit_id=2019032900022, 

609 )), 

610 ("latiss-future.yaml", 

611 dict(telescope="Rubin Auxiliary Telescope", 

612 instrument="LATISS", 

613 boresight_rotation_coord="unknown", 

614 dark_time=0.0*u.s, 

615 detector_exposure_id=0x74e001600, 

616 detector_group="RXX", 

617 detector_name="S00", 

618 detector_num=0, 

619 detector_serial="ITL-3800C-068", 

620 exposure_id=2020032900022, 

621 exposure_group="2020-03-29T16:55:00.012#24", 

622 exposure_time=0.0*u.s, 

623 focus_z=0.0*u.mm, 

624 group_counter_end=22, 

625 group_counter_start=22, 

626 has_simulated_content=False, 

627 object="UNKNOWN", 

628 observation_counter=22, 

629 observation_id="AT_X_20200329_000022", 

630 observation_type="bias", 

631 observation_reason="unknown", 

632 observing_day=20200329, 

633 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

634 physical_filter="unknown~unknown", 

635 pressure=None, 

636 relative_humidity=None, 

637 science_program="unknown", 

638 temperature=None, 

639 visit_id=1654305000120024, 

640 )), 

641 ("latiss-AT_O_20190915_000037.yaml", 

642 dict(telescope="Rubin Auxiliary Telescope", 

643 instrument="LATISS", 

644 boresight_rotation_coord="unknown", 

645 dark_time=0.0*u.s, 

646 detector_exposure_id=0x6ec002500, 

647 detector_group="RXX", 

648 detector_name="S00", 

649 detector_num=0, 

650 detector_serial="ITL-3800C-068", 

651 exposure_id=2019091500037, 

652 exposure_group="bias_0027_0100", 

653 exposure_time=0.0*u.s, 

654 focus_z=0.0*u.mm, 

655 group_counter_end=37, 

656 group_counter_start=37, 

657 has_simulated_content=False, 

658 object="UNKNOWN", 

659 observation_counter=37, 

660 observation_id="AT_O_20190915_000037", 

661 observation_type="bias", 

662 observation_reason="unknown", 

663 observing_day=20190915, 

664 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

665 physical_filter="unknown~unknown", 

666 pressure=None, 

667 relative_humidity=None, 

668 science_program="unknown", 

669 temperature=None, 

670 visit_id=3575576933793566714, 

671 )), 

672 ("latiss-AT_O_20191031_000004.yaml", 

673 dict(telescope="Rubin Auxiliary Telescope", 

674 instrument="LATISS", 

675 boresight_rotation_coord="unknown", 

676 dark_time=3.0*u.s, 

677 detector_exposure_id=0x703000400, 

678 detector_group="RXX", 

679 detector_name="S00", 

680 detector_num=0, 

681 detector_serial="ITL-3800C-068", 

682 exposure_id=2019103100004, 

683 exposure_group="TEST01", 

684 exposure_time=3.0*u.s, 

685 focus_z=0.0*u.mm, 

686 group_counter_end=4, 

687 group_counter_start=4, 

688 has_simulated_content=False, 

689 object="UNKNOWN", 

690 observation_counter=4, 

691 observation_id="AT_O_20191031_000004", 

692 observation_type="engtest", 

693 observation_reason="unknown", 

694 observing_day=20191031, 

695 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

696 physical_filter="unknown~unknown", 

697 pressure=None, 

698 relative_humidity=None, 

699 science_program="unknown", 

700 temperature=None, 

701 visit_id=1123819875881954006, 

702 )), 

703 ("latiss-AT_O_20191104_000003.yaml", 

704 dict(telescope="Rubin Auxiliary Telescope", 

705 instrument="LATISS", 

706 boresight_rotation_coord="unknown", 

707 dark_time=3.0*u.s, 

708 detector_exposure_id=0x705000300, 

709 detector_group="RXX", 

710 detector_name="S00", 

711 detector_num=0, 

712 detector_serial="ITL-3800C-068", 

713 exposure_id=2019110400003, 

714 exposure_group="TEST01", 

715 exposure_time=3.0*u.s, 

716 focus_z=0.0*u.mm, 

717 group_counter_end=3, 

718 group_counter_start=3, 

719 has_simulated_content=False, 

720 object="UNKNOWN", 

721 observation_counter=3, 

722 observation_id="AT_O_20191104_000003", 

723 observation_type="engtest", 

724 observation_reason="unknown", 

725 observing_day=20191104, 

726 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

727 physical_filter="unknown~unknown", 

728 pressure=None, 

729 relative_humidity=None, 

730 science_program="unknown", 

731 temperature=None, 

732 visit_id=1123819875881954006, 

733 )), 

734 ("latiss-AT_O_20191113_000061.yaml", 

735 dict(telescope="Rubin Auxiliary Telescope", 

736 instrument="LATISS", 

737 boresight_rotation_coord="unknown", 

738 dark_time=0.5*u.s, 

739 detector_exposure_id=0x709803d00, 

740 detector_group="RXX", 

741 detector_name="S00", 

742 detector_num=0, 

743 detector_serial="ITL-3800C-068", 

744 exposure_id=2019111300061, 

745 exposure_group="wave,Focus,455,32.0PH=5um", 

746 exposure_time=0.5*u.s, 

747 focus_z=0.0*u.mm, 

748 group_counter_end=61, 

749 group_counter_start=61, 

750 has_simulated_content=False, 

751 object="UNKNOWN", 

752 observation_counter=61, 

753 observation_id="AT_O_20191113_000061", 

754 observation_type="engtest", 

755 observation_reason="unknown", 

756 observing_day=20191113, 

757 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

758 physical_filter="empty~ronchi90lpmm", 

759 pressure=None, 

760 relative_humidity=None, 

761 science_program="unknown", 

762 temperature=None, 

763 visit_id=1892608703001301325, 

764 )), 

765 ("latiss-AT_O_20191118_000011.yaml", 

766 dict(telescope="Rubin Auxiliary Telescope", 

767 instrument="LATISS", 

768 boresight_rotation_coord="unknown", 

769 dark_time=15.0*u.s, 

770 detector_exposure_id=0x70c000b00, 

771 detector_group="RXX", 

772 detector_name="S00", 

773 detector_num=0, 

774 detector_serial="ITL-3800C-068", 

775 exposure_id=2019111800011, 

776 exposure_group="dark_0002_0005", 

777 exposure_time=15.0*u.s, 

778 focus_z=0.0*u.mm, 

779 group_counter_end=11, 

780 group_counter_start=11, 

781 has_simulated_content=False, 

782 object="UNKNOWN", 

783 observation_counter=11, 

784 observation_id="AT_O_20191118_000011", 

785 observation_type="dark", 

786 observation_reason="unknown", 

787 observing_day=20191118, 

788 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

789 physical_filter="diffuser~ronchi170lpmm", 

790 pressure=None, 

791 relative_humidity=None, 

792 science_program="unknown", 

793 temperature=None, 

794 visit_id=6861884254113212214, 

795 )), 

796 ("latiss-AT_O_20200121_000045.yaml", 

797 dict(telescope="Rubin Auxiliary Telescope", 

798 instrument="LATISS", 

799 boresight_rotation_coord="sky", 

800 dark_time=100.0*u.s, 

801 detector_exposure_id=0x72c002d00, 

802 detector_group="RXX", 

803 detector_name="S00", 

804 detector_num=0, 

805 detector_serial="ITL-3800C-068", 

806 exposure_id=2020012100045, 

807 exposure_group="test", 

808 exposure_time=100.0*u.s, 

809 focus_z=0.560002659202*u.mm, 

810 group_counter_end=45, 

811 group_counter_start=45, 

812 has_simulated_content=False, 

813 object="UNKNOWN", 

814 observation_counter=45, 

815 observation_id="AT_O_20200121_000045", 

816 observation_type="engtest", 

817 observation_reason="unknown", 

818 observing_day=20200121, 

819 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

820 physical_filter="blank_bk7_wg05~empty", 

821 pressure=None, 

822 relative_humidity=None, 

823 science_program="unknown", 

824 temperature=None, 

825 visit_id=4702443654717948604, 

826 check_altaz=True, 

827 )), 

828 ("latiss-AT_O_20200128_000379.yaml", 

829 dict(telescope="Rubin Auxiliary Telescope", 

830 instrument="LATISS", 

831 boresight_rotation_coord="sky", 

832 dark_time=5.0*u.s, 

833 detector_exposure_id=0x72f817b00, 

834 detector_group="RXX", 

835 detector_name="S00", 

836 detector_num=0, 

837 detector_serial="ITL-3800C-068", 

838 exposure_id=2020012800379, 

839 exposure_group="2020-01-29T07:25:52.166", 

840 exposure_time=5.0*u.s, 

841 focus_z=0.35416568455*u.mm, 

842 group_counter_end=379, 

843 group_counter_start=379, 

844 has_simulated_content=False, 

845 object="HD107696", 

846 observation_counter=379, 

847 observation_id="AT_O_20200128_000379", 

848 observation_type="science", 

849 observation_reason="science", 

850 observing_day=20200128, 

851 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

852 physical_filter="KPNO_406_828nm~empty", 

853 pressure=None, 

854 relative_humidity=None, 

855 science_program="unknown", 

856 temperature=None, 

857 visit_id=1602123521660000, 

858 # We have some timing discrepancies in the headers 

859 # that make it hard to match the demand RA/DEC to 

860 # the recorded AZ/EL/TIME. 

861 wcs_params=dict(max_sep=7.), 

862 )), 

863 ("latiss-AT_O_20220405_000348.yaml", 

864 dict(telescope="Rubin Auxiliary Telescope", 

865 instrument="LATISS", 

866 boresight_rotation_coord="sky", 

867 dark_time=30.3176279067993*u.s, 

868 detector_exposure_id=0x8be815c00, 

869 detector_group="RXX", 

870 detector_name="S00", 

871 detector_num=0, 

872 detector_serial="ITL-3800C-068", 

873 exposure_id=2022040500348, 

874 exposure_group="2022-04-06T02:58:07.181", 

875 exposure_time=30.0*u.s, 

876 focus_z=0.0697081759572029*u.mm, 

877 group_counter_end=349, 

878 group_counter_start=348, 

879 has_simulated_content=False, 

880 object="LATISS_E6A_00000040", 

881 observation_counter=348, 

882 observation_id="AT_O_20220405_000348", 

883 observation_type="science", 

884 observation_reason="object", 

885 observing_day=20220405, 

886 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

887 physical_filter="SDSSr~empty", 

888 pressure=744.3*u.hPa, 

889 relative_humidity=19.0, 

890 science_program="LATISS_E6A", 

891 temperature=12.3*u.deg_C, 

892 visit_id=2291434871810000, 

893 # We have some timing discrepancies in the headers 

894 # that make it hard to match the demand RA/DEC to 

895 # the recorded AZ/EL/TIME. 

896 wcs_params=dict(max_sep=7.), 

897 )), 

898 ("latiss-AT_O_20220405_000349.yaml", 

899 dict(telescope="Rubin Auxiliary Telescope", 

900 instrument="LATISS", 

901 boresight_rotation_coord="sky", 

902 dark_time=30.2387452125549*u.s, 

903 detector_exposure_id=0x8be815d00, 

904 detector_group="RXX", 

905 detector_name="S00", 

906 detector_num=0, 

907 detector_serial="ITL-3800C-068", 

908 exposure_id=2022040500349, 

909 exposure_group="2022-04-06T02:58:07.181", 

910 exposure_time=30.0*u.s, 

911 focus_z=0.0697081759572029*u.mm, 

912 group_counter_end=349, 

913 group_counter_start=348, 

914 has_simulated_content=False, 

915 object="LATISS_E6A_00000040", 

916 observation_counter=349, 

917 observation_id="AT_O_20220405_000349", 

918 observation_type="science", 

919 observation_reason="object", 

920 observing_day=20220405, 

921 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

922 physical_filter="SDSSr~empty", 

923 pressure=744.3*u.hPa, 

924 relative_humidity=19.0, 

925 science_program="LATISS_E6A", 

926 temperature=12.3*u.deg_C, 

927 visit_id=2291434871810000, 

928 # We have some timing discrepancies in the headers 

929 # that make it hard to match the demand RA/DEC to 

930 # the recorded AZ/EL/TIME. 

931 wcs_params=dict(max_sep=7.), 

932 )), 

933 ("latiss-AT_C_20220426_000004_R00_S00.yaml", 

934 dict(telescope="Rubin Auxiliary Telescope", 

935 instrument="LATISS", 

936 boresight_rotation_coord="unknown", 

937 dark_time=537.406*u.s, 

938 detector_exposure_id=0x28c9000400, 

939 detector_group="RXX", 

940 detector_name="S00", 

941 detector_num=0, 

942 detector_serial="ITL-3800C-068", 

943 exposure_id=3022042600004, 

944 exposure_group="3022042600004", 

945 exposure_time=-1.0*u.s, 

946 focus_z=0.0*u.mm, 

947 group_counter_end=4, 

948 group_counter_start=4, 

949 has_simulated_content=False, 

950 object="UNKNOWN", 

951 observation_counter=4, 

952 observation_id="AT_C_20220426_000004", 

953 observation_type="unknown", 

954 observation_reason="unknown", 

955 observing_day=20220426, 

956 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

957 physical_filter="unknown~unknown", 

958 pressure=None, 

959 relative_humidity=None, 

960 science_program="unknown", 

961 temperature=None, 

962 visit_id=3022042600004, 

963 )), 

964 ("latiss-AT_O_20230321_000053.yaml", 

965 dict(telescope="Rubin Auxiliary Telescope", 

966 instrument="LATISS", 

967 boresight_rotation_coord="unknown", 

968 dark_time=30.0126*u.s, 

969 detector_exposure_id=0x96d803500, 

970 detector_group="RXX", 

971 detector_name="S00", 

972 detector_num=0, 

973 detector_serial="ITL-3800C-068", 

974 exposure_id=2023032100053, 

975 exposure_group="2023-03-21T16:11:07.633", 

976 exposure_time=30.0*u.s, 

977 focus_z=0.0*u.mm, 

978 group_counter_end=53, 

979 group_counter_start=53, 

980 has_simulated_content=False, 

981 object="slew_icrs", 

982 observation_counter=53, 

983 observation_id="AT_O_20230321_000053", 

984 observation_type="dark", 

985 observation_reason="dark", 

986 observing_day=20230321, 

987 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

988 physical_filter="empty~empty", 

989 pressure=None, 

990 relative_humidity=None, 

991 science_program="unknown", 

992 temperature=None, 

993 visit_id=2593446676330000, 

994 check_altaz=True, 

995 )), 

996 ("latiss-AT_O_20230705_000379_R00_S00.json", 

997 dict(telescope="Rubin Auxiliary Telescope", 

998 instrument="LATISS", 

999 boresight_rotation_coord="sky", 

1000 dark_time=30.2418*u.s, 

1001 detector_exposure_id=0x9a2817b00, 

1002 detector_group="RXX", 

1003 detector_name="S00", 

1004 detector_num=0, 

1005 detector_serial="ITL-3800C-068", 

1006 exposure_id=2023070500379, 

1007 exposure_group="2023-07-06T04:53:15.609", 

1008 exposure_time=30.0*u.s, 

1009 focus_z=-0.008921561762690544*u.mm, 

1010 group_counter_end=379, 

1011 group_counter_start=379, 

1012 has_simulated_content=False, 

1013 object="HD165763", 

1014 observation_counter=379, 

1015 observation_id="AT_O_20230705_000379", 

1016 observation_type="science", 

1017 observation_reason="sitcom-857", 

1018 observing_day=20230705, 

1019 observing_day_offset=astropy.time.TimeDelta(43200.0, scale="tai", format="sec"), 

1020 physical_filter="empty~holo4_003", 

1021 pressure=777.80*u.hPa, 

1022 relative_humidity=15.149999618530273, 

1023 science_program="BLOCK-59", 

1024 temperature=5.775000095367432*u.deg_C, 

1025 visit_id=2685487956090000, 

1026 check_altaz=True, 

1027 )), 

1028 ) 

1029 with warnings.catch_warnings(): 

1030 # Avoid warnings from too-long FITS header keys. 

1031 warnings.simplefilter("ignore", VerifyWarning) 

1032 self.assertObservationInfoFromYaml("latiss-future.yaml", dir=self.datadir) 

1033 for filename, expected in test_data: 

1034 with self.subTest(f"Testing {filename}"): 

1035 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

1036 

1037 # This translation should fail 

1038 with self.assertRaises(KeyError): 

1039 self.assertObservationInfoFromYaml("latiss-future-bad.yaml", dir=self.datadir) 

1040 

1041 def test_imsim_translator(self): 

1042 test_data = (("imsim-bias-lsst_a_3010002_R11_S00.yaml", 

1043 dict(telescope="Simonyi Survey Telescope", 

1044 instrument="LSSTCam-imSim", 

1045 boresight_rotation_coord="sky", 

1046 dark_time=0.0*u.s, 

1047 detector_exposure_id=3010002036, 

1048 detector_group="R11", 

1049 detector_name="S00", 

1050 detector_num=36, 

1051 detector_serial="LCA-11021_RTM-000", 

1052 exposure_id=3010002, 

1053 exposure_group="3010002", 

1054 exposure_time=0.0*u.s, 

1055 focus_z=0.0*u.mm, 

1056 group_counter_end=3010002, 

1057 group_counter_start=3010002, 

1058 has_simulated_content=True, 

1059 object="UNKNOWN", 

1060 observation_counter=0, 

1061 observation_id="3010002", 

1062 observation_type="science", # The header is wrong 

1063 observation_reason="imsim", 

1064 observing_day=20220101, 

1065 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1066 physical_filter="i", 

1067 pressure=None, 

1068 relative_humidity=40.0, 

1069 science_program="42", 

1070 temperature=None, 

1071 visit_id=3010002, 

1072 wcs_params=dict(max_sep=3000.), # 2022 

1073 )), 

1074 ("imsim-lsst_a_204595_R11_S02_i.yaml", 

1075 dict(telescope="Simonyi Survey Telescope", 

1076 instrument="LSSTCam-imSim", 

1077 boresight_rotation_coord="sky", 

1078 dark_time=30.0*u.s, 

1079 detector_exposure_id=204595038, 

1080 detector_group="R11", 

1081 detector_name="S02", 

1082 detector_num=38, 

1083 detector_serial="LCA-11021_RTM-000", 

1084 exposure_id=204595, 

1085 exposure_group="204595", 

1086 exposure_time=30.0*u.s, 

1087 focus_z=0.0*u.mm, 

1088 group_counter_end=204595, 

1089 group_counter_start=204595, 

1090 has_simulated_content=True, 

1091 object="UNKNOWN", 

1092 observation_counter=0, 

1093 observation_id="204595", 

1094 observation_type="science", # The header is wrong 

1095 observation_reason="imsim", 

1096 observing_day=20221005, 

1097 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1098 physical_filter="i_sim_1.4", 

1099 pressure=None, 

1100 relative_humidity=40.0, 

1101 science_program="204595", 

1102 temperature=None, 

1103 visit_id=204595, 

1104 wcs_params=dict(max_sep=3000.), # 2022 

1105 )), 

1106 ("imsim-flats-lsst_a_5000007_R11_S20_i.yaml", 

1107 dict(telescope="Simonyi Survey Telescope", 

1108 instrument="LSSTCam-imSim", 

1109 boresight_rotation_coord="sky", 

1110 dark_time=30.0*u.s, 

1111 detector_exposure_id=5000007042, 

1112 detector_group="R11", 

1113 detector_name="S20", 

1114 detector_num=42, 

1115 detector_serial="LCA-11021_RTM-000", 

1116 exposure_id=5000007, 

1117 exposure_group="5000007", 

1118 exposure_time=30.0*u.s, 

1119 focus_z=0.0*u.mm, 

1120 group_counter_end=5000007, 

1121 group_counter_start=5000007, 

1122 has_simulated_content=True, 

1123 object="UNKNOWN", 

1124 observation_counter=0, 

1125 observation_id="5000007", 

1126 observation_type="flat", 

1127 observation_reason="imsim", 

1128 observing_day=20220806, 

1129 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1130 physical_filter="i", 

1131 pressure=None, 

1132 relative_humidity=40.0, 

1133 science_program="5000007", 

1134 temperature=None, 

1135 visit_id=5000007, 

1136 wcs_params=dict(max_sep=3000.), # 2022 

1137 )), 

1138 ("imsim-dark-lsst_a_4010003_R11_S11.yaml", 

1139 dict(telescope="Simonyi Survey Telescope", 

1140 instrument="LSSTCam-imSim", 

1141 boresight_rotation_coord="sky", 

1142 dark_time=500.0*u.s, 

1143 detector_exposure_id=4010003040, 

1144 detector_group="R11", 

1145 detector_name="S11", 

1146 detector_num=40, 

1147 detector_serial="LCA-11021_RTM-000", 

1148 exposure_id=4010003, 

1149 exposure_group="4010003", 

1150 exposure_time=500.0*u.s, 

1151 focus_z=0.0*u.mm, 

1152 group_counter_end=4010003, 

1153 group_counter_start=4010003, 

1154 has_simulated_content=True, 

1155 object="UNKNOWN", 

1156 observation_counter=0, 

1157 observation_id="4010003", 

1158 observation_type="science", # The header is wrong 

1159 observation_reason="imsim", 

1160 observing_day=20220101, 

1161 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1162 physical_filter="i", 

1163 pressure=None, 

1164 relative_humidity=40.0, 

1165 science_program="42", 

1166 temperature=None, 

1167 visit_id=4010003, 

1168 wcs_params=dict(max_sep=3000.), # 2022 

1169 )), 

1170 ) 

1171 for filename, expected in test_data: 

1172 with self.subTest(f"Testing {filename}"): 

1173 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

1174 

1175 def test_ts3_translator(self): 

1176 test_data = (("ts3-E2V-CCD250-411_lambda_flat_1000_025_20181115075559.yaml", 

1177 dict(telescope=None, 

1178 instrument="LSST-TS3", 

1179 dark_time=44.631*u.s, 

1180 detector_exposure_id=201811151255111433, 

1181 detector_group="R433", 

1182 detector_name="S00", 

1183 detector_num=433, 

1184 detector_serial="E2V-CCD250-411", 

1185 exposure_id=201811151255111, 

1186 exposure_group="201811151255111", 

1187 exposure_time=44.631*u.s, 

1188 focus_z=0.0*u.mm, 

1189 group_counter_end=25, 

1190 group_counter_start=25, 

1191 has_simulated_content=False, 

1192 observation_counter=25, 

1193 observation_id="E2V-CCD250-411_lambda_flat_1000_025_20181115075559", 

1194 observation_type="flat", 

1195 observation_reason="lambda", 

1196 observing_day=20181115, 

1197 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1198 physical_filter="550CutOn", 

1199 science_program="2018-11-15", 

1200 visit_id=201811151255111)), 

1201 ("ts3-ITL-3800C-098_lambda_flat_1000_067_20160722020740.yaml", 

1202 dict(telescope=None, 

1203 instrument="LSST-TS3", 

1204 dark_time=30.611*u.s, 

1205 detector_exposure_id=201607220607067071, 

1206 detector_group="R071", 

1207 detector_name="S00", 

1208 detector_num=71, 

1209 detector_serial="ITL-3800C-098", 

1210 exposure_id=201607220607067, 

1211 exposure_group="201607220607067", 

1212 exposure_time=30.611*u.s, 

1213 focus_z=0.0*u.mm, 

1214 group_counter_end=67, 

1215 group_counter_start=67, 

1216 has_simulated_content=False, 

1217 observation_counter=67, 

1218 observation_id="ITL-3800C-098_lambda_flat_1000_067_20160722020740", 

1219 observation_type="flat", 

1220 observation_reason="lambda", 

1221 observing_day=20160721, 

1222 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1223 physical_filter="550CutOn", 

1224 science_program="2016-07-22", 

1225 visit_id=201607220607067)), 

1226 ) 

1227 for filename, expected in test_data: 

1228 with self.subTest(f"Testing {filename}"): 

1229 with warnings.catch_warnings(): 

1230 # Avoid warnings from too-long FITS header keys. 

1231 warnings.simplefilter("ignore", VerifyWarning) 

1232 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

1233 

1234 def test_ts8_translator(self): 

1235 test_data = (("ts8-E2V-CCD250-179_lambda_bias_024_6006D_20180724104156.yaml", 

1236 dict(telescope=None, 

1237 instrument="LSST-TS8", 

1238 dark_time=0.0*u.s, 

1239 detector_exposure_id=201807241041568067, 

1240 detector_group="RTM-010", 

1241 detector_name="S11", 

1242 detector_num=67, 

1243 detector_serial="E2V-CCD250-179", 

1244 exposure_id=201807241041568, 

1245 exposure_group="201807241041568", 

1246 exposure_time=0.0*u.s, 

1247 focus_z=0.0*u.mm, 

1248 group_counter_end=24, 

1249 group_counter_start=24, 

1250 has_simulated_content=False, 

1251 observation_counter=24, 

1252 observation_id="E2V-CCD250-179_lambda_bias_024_6006D_20180724104156", 

1253 observation_type="bias", 

1254 observation_reason="lambda", 

1255 observing_day=20180724, 

1256 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1257 physical_filter="y", 

1258 science_program="6006D", 

1259 visit_id=201807241041568)), 

1260 ("ts8-E2V-CCD250-200-Dev_lambda_flat_0700_6006D_20180724102845.yaml", 

1261 dict(telescope=None, 

1262 instrument="LSST-TS8", 

1263 dark_time=21.913*u.s, 

1264 detector_exposure_id=201807241028453065, 

1265 detector_group="RTM-010", 

1266 detector_name="S02", 

1267 detector_num=65, 

1268 detector_serial="E2V-CCD250-200", 

1269 exposure_id=201807241028453, 

1270 exposure_group="201807241028453", 

1271 exposure_time=21.913*u.s, 

1272 focus_z=0.0*u.mm, 

1273 group_counter_end=17, 

1274 group_counter_start=17, 

1275 has_simulated_content=False, 

1276 observation_counter=17, 

1277 observation_id="E2V-CCD250-200-Dev_lambda_flat_0700_6006D_20180724102845", 

1278 observation_type="flat", 

1279 observation_reason="lambda", 

1280 observing_day=20180724, 

1281 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1282 physical_filter="z", 

1283 science_program="6006D", 

1284 visit_id=201807241028453)), 

1285 ("ts8-E2V-CCD250-220_fe55_fe55_094_6288_20171215114006.yaml", 

1286 dict(telescope=None, 

1287 instrument="LSST-TS8", 

1288 dark_time=300.0*u.s, 

1289 detector_exposure_id=201712151140062027, 

1290 detector_group="RTM-005", 

1291 detector_name="S00", 

1292 detector_num=27, 

1293 detector_serial="E2V-CCD250-220", 

1294 exposure_id=201712151140062, 

1295 exposure_group="201712151140062", 

1296 exposure_time=300.0*u.s, 

1297 focus_z=0.0*u.mm, 

1298 group_counter_end=94, 

1299 group_counter_start=94, 

1300 has_simulated_content=False, 

1301 observation_counter=94, 

1302 observation_id="E2V-CCD250-220_fe55_fe55_094_6288_20171215114006", 

1303 observation_type="fe55", 

1304 observation_reason="fe55", 

1305 observing_day=20171215, 

1306 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1307 physical_filter="i", 

1308 science_program="6288", 

1309 visit_id=201712151140062)), 

1310 ("ts8-TS_C_20220711_000174_R22_S00.yaml", 

1311 dict(telescope=None, 

1312 instrument="LSST-TS8", 

1313 dark_time=210.315*u.s, 

1314 detector_exposure_id=202207111714459018, 

1315 detector_group="RTM-004", 

1316 detector_name="S00", 

1317 detector_num=18, 

1318 detector_serial="ITL-3800C-372", 

1319 exposure_id=202207111714459, 

1320 exposure_group="202207111714459", 

1321 exposure_time=210.0*u.s, 

1322 focus_z=0.0*u.mm, 

1323 group_counter_end=174, 

1324 group_counter_start=174, 

1325 has_simulated_content=False, 

1326 observation_counter=174, 

1327 observation_id="TS_C_20220711_000174", 

1328 observation_type="spot", 

1329 observation_reason="spot_flat", 

1330 observing_day=20220711, 

1331 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1332 physical_filter="unknown", 

1333 science_program="7074D", 

1334 visit_id=202207111714459)), 

1335 ("ts8-TS_C_20230512_000021_R22_S02.yaml", 

1336 dict(telescope=None, 

1337 instrument="LSST-TS8", 

1338 dark_time=15.165*u.s, 

1339 detector_exposure_id=202305121917591020, 

1340 detector_group="RTM-004", 

1341 detector_name="S02", 

1342 detector_num=20, 

1343 detector_serial="ITL-3800C-380", 

1344 exposure_id=202305121917591, 

1345 exposure_group="202305121917591", 

1346 exposure_time=15.0*u.s, 

1347 focus_z=0.0*u.mm, 

1348 group_counter_end=21, 

1349 group_counter_start=21, 

1350 has_simulated_content=False, 

1351 observation_counter=21, 

1352 observation_id="TS_C_20230512_000021", 

1353 observation_type="flat", 

1354 observation_reason="sflat_hi", 

1355 observing_day=20230512, 

1356 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1357 physical_filter="HIGH", 

1358 science_program="7187D", 

1359 visit_id=202305121917591)), 

1360 ("ts8-TS_C_20230512_000021_R22_S02-fixed.yaml", # Will not apply header fixups 

1361 dict(telescope=None, 

1362 instrument="LSST-TS8", 

1363 dark_time=15.165*u.s, 

1364 detector_exposure_id=202305121917591020, 

1365 detector_group="RTM-004", 

1366 detector_name="S02", 

1367 detector_num=20, 

1368 detector_serial="ITL-3800C-380", 

1369 exposure_id=202305121917591, 

1370 exposure_group="202305121917591", 

1371 exposure_time=15.0*u.s, 

1372 focus_z=0.0*u.mm, 

1373 group_counter_end=21, 

1374 group_counter_start=21, 

1375 has_simulated_content=False, 

1376 observation_counter=21, 

1377 observation_id="TS_C_20230512_000021", 

1378 observation_type="flat", 

1379 observation_reason="sflat_hi", 

1380 observing_day=20230512, 

1381 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1382 physical_filter="HIGH", 

1383 science_program="7187D", 

1384 visit_id=202305121917591)), 

1385 ("ts8-TS_C_20230523_000127_R22_S00.yaml", 

1386 dict(telescope=None, 

1387 instrument="LSST-TS8", 

1388 dark_time=15.16*u.s, 

1389 detector_exposure_id=202305231936194018, 

1390 detector_group="RTM-004", 

1391 detector_name="S00", 

1392 detector_num=18, 

1393 detector_serial="ITL-3800C-372", 

1394 exposure_id=202305231936194, 

1395 exposure_group="202305231936194", 

1396 exposure_time=15.0*u.s, 

1397 focus_z=0.0*u.mm, 

1398 group_counter_end=127, 

1399 group_counter_start=127, 

1400 has_simulated_content=False, 

1401 observation_counter=127, 

1402 observation_id="TS_C_20230523_000127", 

1403 observation_type="flat", 

1404 observation_reason="flat", 

1405 observing_day=20230523, 

1406 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1407 physical_filter="unknown", 

1408 science_program="7220D", 

1409 visit_id=202305231936194)), 

1410 ("ts8-TS_C_20230525_000041_R22_S00.yaml", 

1411 dict(telescope=None, 

1412 instrument="LSST-TS8", 

1413 dark_time=30.151*u.s, 

1414 detector_exposure_id=3023052500041018, 

1415 detector_group="RTM-004", 

1416 detector_name="S00", 

1417 detector_num=18, 

1418 detector_serial="ITL-3800C-372", 

1419 exposure_id=3023052500041, 

1420 exposure_group="3023052500041", 

1421 exposure_time=30.0*u.s, 

1422 focus_z=0.0*u.mm, 

1423 group_counter_end=41, 

1424 group_counter_start=41, 

1425 has_simulated_content=False, 

1426 observation_counter=41, 

1427 observation_id="TS_C_20230525_000041", 

1428 observation_type="flat", 

1429 observation_reason="flat", 

1430 observing_day=20230525, 

1431 observing_day_offset=astropy.time.TimeDelta(28800.0, scale="tai", format="sec"), 

1432 physical_filter="unknown", 

1433 science_program="7227D", 

1434 visit_id=3023052500041)), 

1435 ) 

1436 for filename, expected in test_data: 

1437 with self.subTest(f"Testing {filename}"): 

1438 with warnings.catch_warnings(): 

1439 # Avoid warnings from too-long FITS header keys. 

1440 warnings.simplefilter("ignore", VerifyWarning) 

1441 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

1442 

1443 def test_ucdcam_translator(self): 

1444 test_data = (("UCD-E2V-CCD250-TS_C_20231031_000227_R21_S01.yaml", 

1445 dict(telescope=None, 

1446 instrument="LSST-UCDCam", 

1447 dark_time=2.07859*u.s, 

1448 detector_exposure_id=42370917130, 

1449 detector_group="R21", 

1450 detector_name="S01", 

1451 detector_num=10, 

1452 detector_serial="E2V-CCD250-112-09", 

1453 exposure_id=2023103100227, 

1454 exposure_group="2023103100227", 

1455 exposure_time=1.0*u.s, 

1456 focus_z=0.0*u.mm, 

1457 group_counter_end=227, 

1458 group_counter_start=227, 

1459 has_simulated_content=False, 

1460 observation_counter=227, 

1461 observation_id="TS_C_20231031_000227", 

1462 observation_type="flat", 

1463 observation_reason="flat", 

1464 observing_day=20231031, 

1465 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1466 physical_filter="r", 

1467 science_program="unknown", 

1468 visit_id=2023103100227)), 

1469 ("UCD-ITL-3800C-TS_C_20230730_000237_R22_S01.yaml", 

1470 dict(telescope=None, 

1471 instrument="LSST-UCDCam", 

1472 dark_time=3.082*u.s, 

1473 detector_exposure_id=179029732609, 

1474 detector_group="R22", 

1475 detector_name="S01", 

1476 detector_num=1, 

1477 detector_serial="ITL-3800C-002", 

1478 exposure_id=3023073000237, 

1479 exposure_group="3023073000237", 

1480 exposure_time=2.0*u.s, 

1481 focus_z=0.0*u.mm, 

1482 group_counter_end=237, 

1483 group_counter_start=237, 

1484 has_simulated_content=False, 

1485 observation_counter=237, 

1486 observation_id="TS_C_20230730_000237", 

1487 observation_type="flat", 

1488 observation_reason="flat", 

1489 observing_day=20230730, 

1490 observing_day_offset=astropy.time.TimeDelta(0.0, scale="tai", format="sec"), 

1491 physical_filter="r", 

1492 science_program="unknown", 

1493 visit_id=3023073000237)), 

1494 ) 

1495 for filename, expected in test_data: 

1496 with self.subTest(f"Testing {filename}"): 

1497 self.assertObservationInfoFromYaml(filename, dir=self.datadir, **expected) 

1498 

1499 def test_checker(self): 

1500 filename = "latiss-future.yaml" 

1501 from astro_metadata_translator.tests import read_test_file 

1502 from astro_metadata_translator import ObservationInfo 

1503 header = read_test_file(filename, self.datadir) 

1504 obsInfo = ObservationInfo(header, pedantic=True, filename=filename) 

1505 self.assertTrue(obsInfo) 

1506 

1507 def test_fix_header(self): 

1508 from astro_metadata_translator import fix_header 

1509 from astro_metadata_translator.tests import read_test_file 

1510 # Test that header fix up is working 

1511 # Not all headers are used in metadata translation 

1512 test_data = ( 

1513 ("latiss-AT_O_20210212_000006.yaml", 

1514 dict(RASTART=260.024385071917)), 

1515 ("latiss-AT_O_20210210_000011.yaml", 

1516 dict(RASTART=355.41750341182313)), 

1517 ) 

1518 for filename, expected in test_data: 

1519 with self.subTest(f"Testing {filename}"): 

1520 header = read_test_file(filename, dir=self.datadir) 

1521 modified = fix_header(header) 

1522 self.assertTrue(modified) 

1523 for k, v in expected.items(): 

1524 self.assertEqual(header[k], v, f"Testing {k} in {filename}") 

1525 

1526 

1527if __name__ == "__main__": 1527 ↛ 1528line 1527 didn't jump to line 1528, because the condition on line 1527 was never true

1528 unittest.main()