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
33 from ..gen2to3
import ConvertRepoTask, ConvertRepoSkyMapConfig, Rerun
37 parser = argparse.ArgumentParser(description=__doc__,
38 formatter_class=argparse.RawDescriptionHelpFormatter)
39 parser.add_argument(
"instrumentClass", metavar=
"lsst.obs.CAMERA.INSTRUMENT",
40 help=(
"The full import path to the gen3 Instrument class for this camera"
41 " (e.g. lsst.obs.decam.DarkEnergyCamera)."))
42 parser.add_argument(
"--gen2root", required=
True,
43 help=
"Root path of the gen 2 repo to be converted.")
44 parser.add_argument(
"--gen3root", required=
True,
45 help=
"Root path of the gen 3 repo to be produced.")
46 parser.add_argument(
"--skymapName", default=
None,
47 help=
"Name of the new gen3 skymap (e.g. 'discrete/ci_hsc').")
48 parser.add_argument(
"--skymapConfig", default=
None,
49 help=
"Path to skymap config file defining the new gen3 skymap.")
50 parser.add_argument(
"--calibs", default=
None,
51 help=
"Path to the gen 2 calibration repo; absolute, or relative to gen2root.")
52 parser.add_argument(
"--reruns", default=[], nargs=
"*",
53 help=
"List of gen 2 reruns to convert.")
54 parser.add_argument(
"--transferMode", default=
"auto",
55 choices=[
"auto",
"link",
"symlink",
"hardlink",
"copy",
"move",
"relsymlink"],
56 help=
"Mode to use to transfer files into the new repository.")
57 parser.add_argument(
"-v",
"--verbose", action=
"store_const", dest=
"verbose",
58 default=lsst.log.Log.INFO, const=lsst.log.Log.DEBUG,
59 help=
"Set the log level to DEBUG.")
60 parser.add_argument(
"-c",
"--config", default=
None,
61 help=(
"Path to a `ConvertRepoConfig` override to be included after "
62 "the Instrument config overrides are applied."))
68 args = parser.parse_args()
70 skymapList = [args.skymapName, args.skymapConfig]
71 if not all(x
is None for x
in skymapList)
and not all(x
is not None for x
in skymapList):
72 parser.error(
"Must specify both --skymapName and --skymapConfig, or neither.")
77 def convert(gen2root, gen3root, instrumentClass,
78 skymapName=None, skymapConfig=None,
79 calibs=None, reruns=[], config=None, transferMode="auto"):
80 """Convert the gen 2 Butler repo living at gen2root into a gen 3 repo
86 Root path to the gen2 repo to be converted.
88 Root path to the gen3 output repo.
89 instrumentClass : `str`
90 Full python path to the `lsst.obs.base.Instrument` class of the repo
92 skymapName : `str`, optional
93 Name of the skymap to be converted in the repo.
94 skymapConfig : `str`, optional
95 Path to the `lsst.skymap.BaseSkyMapConfig` of the gen2 skymap to be
97 calibs : `str`, optional
98 Path to the gen2 calibration repository to be converted.
99 If a relative path, it is assumed to be relative to ``gen2root``.
100 reruns : `list` [`str`], optional
101 List of reruns to convert. They will be placed in the
102 ``shared/INSTRUMENT/RERUN`` collection.
103 config : `str`, optional
104 Path to `lsst.obs.base.ConvertRepoConfig` configuration to load
105 after all default/instrument configurations.
106 transferMode : `str`, optional
107 Mode to use when transferring data into the gen3 repository.
112 convertRepoConfig = ConvertRepoTask.ConfigClass()
113 instrument.applyConfigOverrides(ConvertRepoTask._DefaultName, convertRepoConfig)
114 convertRepoConfig.instrument = instrumentClass
115 convertRepoConfig.raws.transfer = transferMode
116 if skymapName
is not None:
118 convertRepoConfig.skyMaps[skymapName].load(skymapConfig)
119 convertRepoConfig.rootSkyMapName = skymapName
120 if config
is not None:
121 convertRepoConfig.load(config)
123 rerunsArg = [
Rerun(rerun, runName=f
"shared/{instrument.getName()}/{rerun}",
124 chainName=f
"shared/{instrument.getName()}", parents=[])
for rerun
in reruns]
128 butlerConfig = lsst.daf.butler.Butler.makeRepo(gen3root)
129 except FileExistsError:
131 butlerConfig = gen3root
132 butler = lsst.daf.butler.Butler(butlerConfig, run=f
"raw/{instrument.getName()}")
133 convertRepoTask =
ConvertRepoTask(config=convertRepoConfig, butler3=butler)
137 calibs=
None if calibs
is None else {calibs: f
"calib/{instrument.getName()}"}
142 """To be run by the commandline script in `bin/`.
145 args = parser.parse_args()
147 log = lsst.log.Log.getLogger(
"convertRepo")
148 log.setLevel(args.verbose)
150 logger = logging.getLogger(
"convertRepo")
151 logger.setLevel(lsst.log.LevelTranslator.lsstLog2logging(log.getLevel()))
152 logger.addHandler(lsst.log.LogHandler())
154 convert(args.gen2root, args.gen3root, args.instrumentClass,
155 skymapName=args.skymapName, skymapConfig=args.skymapConfig,
156 calibs=args.calibs, reruns=args.reruns, config=args.config, transferMode=args.transferMode)