Coverage for python/lsst/obs/cfht/_instrument.py: 48%

40 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-03-03 02:41 -0800

1# This file is part of obs_cfht. 

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 

22"""Butler instrument description for the CFHT MegaCam camera. 

23""" 

24 

25__all__ = ("MegaPrime",) 

26 

27import os 

28from functools import lru_cache 

29 

30from lsst.afw.cameraGeom import makeCameraFromPath, CameraConfig 

31from lsst.obs.base import Instrument, VisitSystem 

32from .cfhtFilters import MEGAPRIME_FILTER_DEFINITIONS 

33 

34from lsst.utils.introspection import get_full_type_name 

35from lsst.utils import getPackageDir 

36 

37 

38class MegaPrime(Instrument): 

39 filterDefinitions = MEGAPRIME_FILTER_DEFINITIONS 

40 policyName = "megacam" 

41 obsDataPackage = None 

42 

43 def __init__(self, **kwargs): 

44 super().__init__(**kwargs) 

45 packageDir = getPackageDir("obs_cfht") 

46 self.configPaths = [os.path.join(packageDir, "config")] 

47 

48 @classmethod 

49 def getName(cls): 

50 return "MegaPrime" 

51 

52 def getCamera(self): 

53 path = os.path.join(getPackageDir("obs_cfht"), self.policyName, "camera") 

54 return self._getCameraFromPath(path) 

55 

56 @staticmethod 

57 @lru_cache() 

58 def _getCameraFromPath(path): 

59 """Return the camera geometry given solely the path to the location 

60 of that definition.""" 

61 config = CameraConfig() 

62 config.load(os.path.join(path, "camera.py")) 

63 return makeCameraFromPath( 

64 cameraConfig=config, 

65 ampInfoPath=path, 

66 shortNameFunc=lambda name: name.replace(" ", "_"), 

67 ) 

68 

69 def register(self, registry, update=False): 

70 camera = self.getCamera() 

71 obsMax = 2**31 

72 with registry.transaction(): 

73 registry.syncDimensionData( 

74 "instrument", 

75 { 

76 "name": self.getName(), "detector_max": 36, "visit_max": obsMax, "exposure_max": obsMax, 

77 "class_name": get_full_type_name(self), 

78 # Some schemas support default visit_system 

79 "visit_system": VisitSystem.ONE_TO_ONE.value, 

80 }, 

81 update=update 

82 ) 

83 

84 for detector in camera: 

85 registry.syncDimensionData( 

86 "detector", 

87 { 

88 "instrument": self.getName(), 

89 "id": detector.getId(), 

90 "full_name": detector.getName(), 

91 "name_in_raft": detector.getName(), 

92 "raft": None, # MegaPrime does not have rafts 

93 "purpose": str(detector.getType()).split(".")[-1], 

94 }, 

95 update=update 

96 ) 

97 

98 self._registerFilters(registry, update=update) 

99 

100 def getRawFormatter(self, dataId): 

101 # local import to prevent circular dependency 

102 from .rawFormatter import MegaPrimeRawFormatter 

103 return MegaPrimeRawFormatter