lsst.pipe.tasks  21.0.0-60-gcd97766f+19f409143c
registerDcrSubfilters.py
Go to the documentation of this file.
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 
23 from collections import defaultdict
24 import logging
25 from sqlalchemy.exc import IntegrityError
26 
27 from lsst.daf.butler import Butler
28 
29 
30 _log = logging.getLogger(__name__.partition(".")[2])
31 
32 
33 registeredMsg = "Registered subfilters {subfilters} for filter band \"{band}\"."
34 notRegisteredMsg = \
35  "Not registering subfilters for filter band \"{band}\"; subfilters {subfilters} already existed."
36 
37 
39  """Represents the results of adding subfilters to a filter band."""
40 
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.insertedinserted = []
53  self.existingexisting = []
54 
55  def __init__(self):
56  self.filtersfilters = defaultdict(self.InsertedSubfiltersInsertedSubfilters)
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.filtersfilters[filterName].inserted.append(subfilter)
74  else:
75  self.filtersfilters[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.filtersfilters.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 
97 def 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
def registerDcrSubfilters(repo, num_subfilters, band_names)