Coverage for python/lsst/pipe/tasks/script/registerDcrSubfilters.py: 28%

43 statements  

« prev     ^ index     » next       coverage.py v6.4.1, created at 2022-06-23 03:24 -0700

1# This file is part of pipe_tasks. 

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 

23from collections import defaultdict 

24import logging 

25from sqlalchemy.exc import IntegrityError 

26 

27from lsst.daf.butler import Butler 

28 

29 

30_log = logging.getLogger(__name__) 

31 

32 

33registeredMsg = "Registered subfilters {subfilters} for filter band \"{band}\"." 

34notRegisteredMsg = \ 

35 "Not registering subfilters for filter band \"{band}\"; subfilters {subfilters} already existed." 

36 

37 

38class InsertResults: 

39 """Represents the results of adding subfilters to a filter band.""" 

40 

41 class InsertedSubfilters: 

42 """Keeps track of the inserted and existing subfilter numbers. 

43 

44 Attributes 

45 ---------- 

46 inserted : `list` [`int`] 

47 The inserted subfilters. 

48 existing : `list` [`int`] 

49 The subfilters that already existed. 

50 """ 

51 def __init__(self): 

52 self.inserted = [] 

53 self.existing = [] 

54 

55 def __init__(self): 

56 self.filters = defaultdict(self.InsertedSubfilters) 

57 

58 def add(self, filterName, subfilter, inserted): 

59 """Add result information about attemping to add a subfilter to a 

60 filter band. 

61 

62 Parameters 

63 ---------- 

64 filterName : `str` 

65 The name of the filter band. 

66 subfilter : `int` 

67 The subfilter id. 

68 inserted : `bool` 

69 `True` if the subfilter was inserted, or `False` if this is the id 

70 of a subfilter that already existed. 

71 """ 

72 if inserted: 

73 self.filters[filterName].inserted.append(subfilter) 

74 else: 

75 self.filters[filterName].existing.append(subfilter) 

76 

77 def __str__(self): 

78 """Get the results formated for CLI output. 

79 

80 Returns 

81 ------- 

82 results : `str` 

83 The results formatted for CLI output. 

84 """ 

85 ret = "" 

86 for filterName, subs in self.filters.items(): 

87 if ret: 

88 ret += "\n" 

89 if subs.inserted: 

90 ret += registeredMsg.format(band=filterName, subfilters=subs.inserted) 

91 if subs.existing: 

92 subs.existing.sort() 

93 ret += notRegisteredMsg.format(band=filterName, subfilters=subs.existing) 

94 return ret 

95 

96 

97def registerDcrSubfilters(repo, num_subfilters, band_names): 

98 """Construct a set of subfilters for chromatic modeling and add them to a 

99 registry. 

100 

101 Parameters 

102 ---------- 

103 repo : `str` 

104 URI to the location to read the repo. 

105 num_subfilters : `int` 

106 The number of subfilters to add. 

107 band_names : `list` [`str`] 

108 The filter band names to add. 

109 

110 Returns 

111 ------- 

112 insertResults : ``InsertResults`` 

113 A class that contains the results of the subfilters that were inserted 

114 or already exist in each filter band, that has a __str__ method so it 

115 can be easily printed to the CLI output. 

116 """ 

117 butler = Butler(repo, writeable=True) 

118 results = InsertResults() 

119 for filterName in band_names: 

120 try: 

121 with butler.registry.transaction(): 

122 for sub in range(num_subfilters): 

123 butler.registry.insertDimensionData("subfilter", {"band": filterName, "subfilter": sub}) 

124 results.add(filterName, sub, True) 

125 except IntegrityError: 

126 records = butler.registry.queryDimensionRecords("subfilter", dataId={"band": filterName}) 

127 for record in records: 

128 results.add(filterName, record.id, False) 

129 

130 return results