22 """Convert a gen2 butler repo to gen 3. See 23 `lsst.obs.base.ConvertRepoConfig` for most of the config options. 29 import lsst.daf.butler
34 Translator, ConstantKeyHandler, CopyKeyHandler,
39 parser = argparse.ArgumentParser(description=__doc__,
40 formatter_class=argparse.RawDescriptionHelpFormatter)
41 parser.add_argument(
"instrumentClass", metavar=
"lsst.obs.CAMERA.INSTRUMENT",
42 help=(
"The full import path to the gen3 Instrument class for this camera" 43 " (e.g. lsst.obs.decam.DarkEnergyCamera)."))
44 parser.add_argument(
"--gen2root", required=
True,
45 help=
"Root path of the gen 2 repo to be converted.")
46 parser.add_argument(
"--gen3root", required=
True,
47 help=
"Root path of the gen 3 repo to be produced.")
48 parser.add_argument(
"--skymapName", default=
None,
49 help=
"Name of the new gen3 skymap (e.g. 'discrete/ci_hsc').")
50 parser.add_argument(
"--skymapConfig", default=
None,
51 help=
"Path to skymap config file defining the new gen3 skymap.")
52 parser.add_argument(
"--calibs", default=
None,
53 help=
"Path to calibration repo; absolute, or relative to gen2root.")
54 parser.add_argument(
"-v",
"--verbose", action=
"store_const", dest=
"verbose",
55 default=lsst.log.Log.INFO, const=lsst.log.Log.DEBUG,
56 help=
"Set the log level to DEBUG.")
57 parser.add_argument(
"--calibFilterType", default=
"physical_filter",
58 help=
"physical_filter or abstract_filter as the id in the gen2 calibRegistry.")
59 parser.add_argument(
"-c",
"--config", default=
None,
60 help=(
"Path to a `ConvertRepoConfig` override to be included after " 61 "the Instrument config overrides are applied."))
67 args = parser.parse_args()
69 skymapList = [args.skymapName, args.skymapConfig]
70 if not all(x
is None for x
in skymapList)
and not all(x
is not None for x
in skymapList):
71 parser.error(
"Must specify both --skymapName and --skymapConfig, or neither.")
77 """Configure the gen3 translators so they know the correct instrument name. 81 instrument : `lsst.obs.base.Instrument` 82 The instrument that conversion is going to be run on. 83 calibFilterType : `str` 84 Whether the gen2 calibRegistry uses ``physical_filter`` or 85 ``abstract_filter`` as the ``filter`` key. 86 ccdKey : `str`, optional 87 The gen2 key used to identify what in gen3 is `detector`. 91 Translator.addRule(ConstantKeyHandler(
"instrument", instrument.getName()),
92 instrument=instrument.getName(), gen2keys=(
"visit",), consume=
False)
93 Translator.addRule(ConstantKeyHandler(
"instrument", instrument.getName()),
94 instrument=instrument.getName(), gen2keys=(ccdKey,), consume=
False)
98 Translator.addRule(CopyKeyHandler(
"exposure",
"visit"),
99 instrument=instrument.getName(), datasetTypeName=
"raw", gen2keys=(
"visit",),
100 consume=(
"visit",
"filter"))
103 Translator.addRule(CopyKeyHandler(
"visit"), instrument=instrument.getName(), gen2keys=(
"visit",),
104 consume=(
"visit",
"filter"))
107 Translator.addRule(CopyKeyHandler(
"detector", ccdKey),
108 instrument=instrument.getName(),
113 Translator.addRule(ConstantKeyHandler(
"instrument", instrument),
114 instrument=instrument.getName(), datasetTypeName=
"transmission_optics")
115 Translator.addRule(ConstantKeyHandler(
"instrument", instrument),
116 instrument=instrument.getName(), datasetTypeName=
"transmission_atmosphere")
117 Translator.addRule(ConstantKeyHandler(
"instrument", instrument),
118 instrument=instrument.getName(), datasetTypeName=
"transmission_filter")
119 Translator.addRule(CopyKeyHandler(
"physical_filter",
"filter"),
120 instrument=instrument.getName(), datasetTypeName=
"transmission_filter")
123 for calibType
in (
'flat',
'sky',
'fringe'):
124 Translator.addRule(CopyKeyHandler(calibFilterType,
"filter"),
125 instrument=instrument.getName(), datasetTypeName=calibType)
128 Translator.addRule(CalibKeyHandler(ccdKey), gen2keys=(
"calibDate",))
131 def convert(gen2root, gen3root, instrumentClass, calibFilterType,
132 skymapName=None, skymapConfig=None,
133 calibs=None, config=None):
134 """Convert the gen 2 Butler repo living at gen2root into a gen 3 repo 140 Root path to the gen2 repo to be converted. 142 Root path to the gen3 output repo. 143 instrumentClass : `str` 144 Full python path to the `lsst.obs.base.Instrument` class of the repo 146 calibFilterType : `str` 147 `abstract_filter` or `physical_filter`, depending on the type of 148 ``filter`` in the gen2 calib registry. 149 skymapName : `str`, optional 150 Name of the skymap to be converted in the repo. 151 skymapConfig : `str`, optional 152 Path to the `lsst.skymap.BaseSkyMapConfig` of the gen2 skymap to be 154 calibs : `str`, optional 155 Path to the gen2 calibration repository to be converted. 156 If a relative path, it is assumed to be relative to ``gen2root``. 157 config : `str`, optional 158 Path to `lsst.obs.base.ConvertRepoConfig` configuration to load 159 after all default/instrument configurations. 164 convertRepoConfig = ConvertRepoTask.ConfigClass()
165 instrument.applyConfigOverrides(ConvertRepoTask._DefaultName, convertRepoConfig)
166 if convertRepoConfig.raws.instrument
is None:
167 convertRepoConfig.raws.instrument = instrumentClass
168 convertRepoConfig.raws.transfer =
"symlink" 169 if skymapName
is not None:
170 convertRepoConfig.skyMaps[skymapName] = ConvertRepoSkyMapConfig()
171 convertRepoConfig.skyMaps[skymapName].load(skymapConfig)
172 if config
is not None:
173 convertRepoConfig.load(config)
177 butlerConfig = lsst.daf.butler.Butler.makeRepo(gen3root)
178 butler = lsst.daf.butler.Butler(butlerConfig, run=instrument.getName())
179 convertRepoTask = ConvertRepoTask(config=convertRepoConfig, butler3=butler)
187 collections=[instrument.getName()],
188 calibs=
None if calibs
is None else {calibs: [instrument.getName()]}
193 """To be run by the commandline script in `bin/`. 196 args = parser.parse_args()
198 log = lsst.log.Log.getLogger(
"convertRepo")
199 log.setLevel(args.verbose)
201 logger = logging.getLogger(
"convertRepo")
202 logger.setLevel(lsst.log.LevelTranslator.lsstLog2logging(log.getLevel()))
203 logger.addHandler(lsst.log.LogHandler())
205 convert(args.gen2root, args.gen3root, args.instrumentClass, args.calibFilterType,
206 skymapName=args.skymapName, skymapConfig=args.skymapConfig,
207 calibs=args.calibs, config=args.config)
def configure_translators(instrument, calibFilterType, ccdKey="ccd")
def convert(gen2root, gen3root, instrumentClass, calibFilterType, skymapName=None, skymapConfig=None, calibs=None, config=None)