lsst-pipe-base 29.2025.2800__tar.gz → 29.2025.2900__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. {lsst_pipe_base-29.2025.2800/python/lsst_pipe_base.egg-info → lsst_pipe_base-29.2025.2900}/PKG-INFO +1 -1
  2. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/connections.py +86 -0
  3. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/prerequisite_helpers.py +4 -0
  4. lsst_pipe_base-29.2025.2900/python/lsst/pipe/base/version.py +2 -0
  5. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900/python/lsst_pipe_base.egg-info}/PKG-INFO +1 -1
  6. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_adjust_all_quanta.py +23 -4
  7. lsst_pipe_base-29.2025.2800/python/lsst/pipe/base/version.py +0 -2
  8. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/COPYRIGHT +0 -0
  9. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/LICENSE +0 -0
  10. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/MANIFEST.in +0 -0
  11. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/README.md +0 -0
  12. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/bsd_license.txt +0 -0
  13. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/CHANGES.rst +0 -0
  14. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/creating-a-pipeline.rst +0 -0
  15. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/creating-a-pipelinetask.rst +0 -0
  16. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/creating-a-task.rst +0 -0
  17. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/index.rst +0 -0
  18. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/task-framework-overview.rst +0 -0
  19. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/task-retargeting-howto.rst +0 -0
  20. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/testing-a-pipeline-task.rst +0 -0
  21. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/testing-pipelines-with-mocks.rst +0 -0
  22. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/doc/lsst.pipe.base/working-with-pipeline-graphs.rst +0 -0
  23. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/gpl-v3.0.txt +0 -0
  24. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/pyproject.toml +0 -0
  25. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/__init__.py +0 -0
  26. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/__init__.py +0 -0
  27. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/__init__.py +0 -0
  28. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_datasetQueryConstraints.py +0 -0
  29. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_dataset_handle.py +0 -0
  30. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_instrument.py +0 -0
  31. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_observation_dimension_packer.py +0 -0
  32. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_quantumContext.py +0 -0
  33. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_status.py +0 -0
  34. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/_task_metadata.py +0 -0
  35. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/all_dimensions_quantum_graph_builder.py +0 -0
  36. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/automatic_connection_constants.py +0 -0
  37. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/caching_limited_butler.py +0 -0
  38. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/__init__.py +0 -0
  39. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/_get_cli_subcommands.py +0 -0
  40. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/cmd/__init__.py +0 -0
  41. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/cmd/commands.py +0 -0
  42. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/opt/__init__.py +0 -0
  43. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/opt/arguments.py +0 -0
  44. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/cli/opt/options.py +0 -0
  45. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/config.py +0 -0
  46. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/configOverrides.py +0 -0
  47. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/connectionTypes.py +0 -0
  48. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/dot_tools.py +0 -0
  49. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/executionButlerBuilder.py +0 -0
  50. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/execution_reports.py +0 -0
  51. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/formatters/__init__.py +0 -0
  52. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/formatters/pexConfig.py +0 -0
  53. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/__init__.py +0 -0
  54. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/_implDetails.py +0 -0
  55. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/_loadHelpers.py +0 -0
  56. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/_versionDeserializers.py +0 -0
  57. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/graph.py +0 -0
  58. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/graphSummary.py +0 -0
  59. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/graph/quantumNode.py +0 -0
  60. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/mermaid_tools.py +0 -0
  61. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline.py +0 -0
  62. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipelineIR.py +0 -0
  63. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipelineTask.py +0 -0
  64. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/__init__.py +0 -0
  65. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/__main__.py +0 -0
  66. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_dataset_types.py +0 -0
  67. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_edges.py +0 -0
  68. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_exceptions.py +0 -0
  69. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_mapping_views.py +0 -0
  70. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_nodes.py +0 -0
  71. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_pipeline_graph.py +0 -0
  72. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_task_subsets.py +0 -0
  73. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/_tasks.py +0 -0
  74. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/expressions.py +0 -0
  75. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/io.py +0 -0
  76. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/__init__.py +0 -0
  77. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_dot.py +0 -0
  78. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_formatting.py +0 -0
  79. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_layout.py +0 -0
  80. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_merge.py +0 -0
  81. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_mermaid.py +0 -0
  82. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_options.py +0 -0
  83. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_printer.py +0 -0
  84. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_show.py +0 -0
  85. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py +0 -0
  86. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/py.typed +0 -0
  87. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/quantum_graph_builder.py +0 -0
  88. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/quantum_graph_skeleton.py +0 -0
  89. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/quantum_provenance_graph.py +0 -0
  90. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/__init__.py +0 -0
  91. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/register_instrument.py +0 -0
  92. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/retrieve_artifacts_for_quanta.py +0 -0
  93. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/transfer_from_graph.py +0 -0
  94. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/utils.py +0 -0
  95. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/script/zip_from_graph.py +0 -0
  96. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/struct.py +0 -0
  97. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/task.py +0 -0
  98. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/taskFactory.py +0 -0
  99. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/testUtils.py +0 -0
  100. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/__init__.py +0 -0
  101. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/mocks/__init__.py +0 -0
  102. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/mocks/_data_id_match.py +0 -0
  103. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/mocks/_pipeline_task.py +0 -0
  104. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/mocks/_storage_class.py +0 -0
  105. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/no_dimensions.py +0 -0
  106. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/pipelineStepTester.py +0 -0
  107. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/simpleQGraph.py +0 -0
  108. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/tests/util.py +0 -0
  109. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst/pipe/base/utils.py +0 -0
  110. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/SOURCES.txt +0 -0
  111. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/dependency_links.txt +0 -0
  112. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/entry_points.txt +0 -0
  113. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/requires.txt +0 -0
  114. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/top_level.txt +0 -0
  115. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/python/lsst_pipe_base.egg-info/zip-safe +0 -0
  116. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/setup.cfg +0 -0
  117. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_caching_limited_butler.py +0 -0
  118. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_cliCmdRegisterInstrument.py +0 -0
  119. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_configOverrides.py +0 -0
  120. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_config_formatter.py +0 -0
  121. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_connections.py +0 -0
  122. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_dataid_match.py +0 -0
  123. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_dataset_handle.py +0 -0
  124. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_dot_tools.py +0 -0
  125. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_dynamic_connections.py +0 -0
  126. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_executionButler.py +0 -0
  127. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_execution_reports.py +0 -0
  128. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_graphBuilder.py +0 -0
  129. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_init_output_run.py +0 -0
  130. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_instrument.py +0 -0
  131. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_mermaid.py +0 -0
  132. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipeline.py +0 -0
  133. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipelineIR.py +0 -0
  134. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipelineLoadSubset.py +0 -0
  135. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipelineTask.py +0 -0
  136. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipeline_graph.py +0 -0
  137. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_pipeline_graph_expressions.py +0 -0
  138. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_qg_builder_dimensions.py +0 -0
  139. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_quantumGraph.py +0 -0
  140. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_quantum_provenance_graph.py +0 -0
  141. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_quantum_success_caveats.py +0 -0
  142. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_script_utils.py +0 -0
  143. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_struct.py +0 -0
  144. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_task.py +0 -0
  145. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_taskmetadata.py +0 -0
  146. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_testUtils.py +0 -0
  147. {lsst_pipe_base-29.2025.2800 → lsst_pipe_base-29.2025.2900}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.2800
3
+ Version: 29.2025.2900
4
4
  Summary: Pipeline infrastructure for the Rubin Science Pipelines.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -45,6 +45,7 @@ __all__ = [
45
45
  import dataclasses
46
46
  import itertools
47
47
  import string
48
+ import uuid
48
49
  import warnings
49
50
  from collections import UserDict, defaultdict
50
51
  from collections.abc import Collection, Generator, Iterable, Iterator, Mapping, Sequence, Set
@@ -1271,6 +1272,52 @@ class QuantaAdjuster:
1271
1272
  for edge in self._task_node.iter_all_inputs()
1272
1273
  }
1273
1274
 
1275
+ def get_prerequisite_inputs(
1276
+ self,
1277
+ quantum_data_id: DataCoordinate,
1278
+ ) -> dict[str, dict[uuid.UUID, DataCoordinate]]:
1279
+ """Return the data IDs of all prerequisite inputs to a quantum.
1280
+
1281
+ Parameters
1282
+ ----------
1283
+ quantum_data_id : `~lsst.daf.butler.DataCoordinate`
1284
+ Data ID of the quantum to get the inputs of.
1285
+
1286
+ Returns
1287
+ -------
1288
+ inputs : `dict` [ `str`, \
1289
+ `dict` [ `uuid.UUID`, `~lsst.daf.butler.DataCoordinate` ] ]
1290
+ Dataset IDs and and data IDs of prerequisite inputs, keyed by the
1291
+ connection name (the internal task name, not the dataset type
1292
+ name). This only contains prerequisite inputs, not init-inputs or
1293
+ regular inputs.
1294
+
1295
+ Notes
1296
+ -----
1297
+ If two connections have the same dataset type, the current
1298
+ implementation assumes the set of datasets is the same for the two
1299
+ connections. This limitation may be removed in the future.
1300
+
1301
+ Unlike regular inputs, prerequisite inputs are not looked up from input
1302
+ collections or indexed by data ID. Instead, they are uniquely
1303
+ identified by dataset UUID and reused directly between quanta.
1304
+ """
1305
+ from .quantum_graph_skeleton import PrerequisiteDatasetKey, QuantumKey
1306
+
1307
+ by_dataset_type_name: defaultdict[str, dict[uuid.UUID, DataCoordinate]] = defaultdict(dict)
1308
+ quantum_key = QuantumKey(self._task_node.label, quantum_data_id.required_values)
1309
+
1310
+ for dataset_key in self._skeleton.iter_inputs_of(quantum_key):
1311
+ if not isinstance(dataset_key, PrerequisiteDatasetKey):
1312
+ continue
1313
+ by_dataset_type_name[dataset_key.parent_dataset_type_name][
1314
+ uuid.UUID(bytes=dataset_key.dataset_id_bytes)
1315
+ ] = self._skeleton.get_data_id(dataset_key)
1316
+ return {
1317
+ edge.connection_name: by_dataset_type_name[edge.parent_dataset_type_name]
1318
+ for edge in self._task_node.iter_all_inputs()
1319
+ }
1320
+
1274
1321
  def get_outputs(self, quantum_data_id: DataCoordinate) -> dict[str, list[DataCoordinate]]:
1275
1322
  """Return the data IDs of all regular outputs to a quantum.
1276
1323
 
@@ -1340,6 +1387,45 @@ class QuantaAdjuster:
1340
1387
  )
1341
1388
  self._skeleton.add_input_edge(quantum_key, dataset_key)
1342
1389
 
1390
+ def add_prerequisite_input(
1391
+ self, quantum_data_id: DataCoordinate, connection_name: str, dataset_uuid: uuid.UUID
1392
+ ) -> None:
1393
+ """Add a new prerequisite input to a quantum.
1394
+
1395
+ Parameters
1396
+ ----------
1397
+ quantum_data_id : `~lsst.daf.butler.DataCoordinate`
1398
+ Data ID of the quantum to add an input to.
1399
+ connection_name : `str`
1400
+ Name of the connection (the task-internal name, not the butler
1401
+ dataset type name).
1402
+ dataset_uuid : `uuid.UUID`
1403
+ UUID of the prerequisite input dataset. Must already exist in the
1404
+ graph as an input to a different quantum of this task, and must be
1405
+ a prerequisite input, not a regular input or init-input.
1406
+
1407
+ Notes
1408
+ -----
1409
+ If two connections have the same dataset type, the current
1410
+ implementation assumes the set of datasets is the same for the two
1411
+ connections. This limitation may be removed in the future.
1412
+
1413
+ Unlike regular inputs, prerequisite inputs are not looked up from input
1414
+ collections or indexed by data ID. Instead, they are uniquely
1415
+ identified by dataset UUID and reused directly between quanta.
1416
+ """
1417
+ from .quantum_graph_skeleton import PrerequisiteDatasetKey, QuantumKey
1418
+
1419
+ quantum_key = QuantumKey(self._task_node.label, quantum_data_id.required_values)
1420
+ read_edge = self._task_node.prerequisite_inputs[connection_name]
1421
+ dataset_key = PrerequisiteDatasetKey(read_edge.parent_dataset_type_name, dataset_uuid.bytes)
1422
+ if dataset_key not in self._skeleton:
1423
+ raise LookupError(
1424
+ f"Prerequisite Dataset {read_edge.parent_dataset_type_name}@{dataset_uuid} "
1425
+ "is not already in the graph."
1426
+ )
1427
+ self._skeleton.add_input_edge(quantum_key, dataset_key)
1428
+
1343
1429
  def move_output(
1344
1430
  self, quantum_data_id: DataCoordinate, connection_name: str, dataset_data_id: DataCoordinate
1345
1431
  ) -> None:
@@ -353,6 +353,8 @@ class PrerequisiteFinder:
353
353
  where=" AND ".join(where_terms),
354
354
  bind=bind,
355
355
  with_dimension_records=True,
356
+ limit=None,
357
+ explain=False,
356
358
  )
357
359
  except MissingDatasetTypeError:
358
360
  return []
@@ -383,6 +385,8 @@ class PrerequisiteFinder:
383
385
  collections=input_collections,
384
386
  data_id=data_id,
385
387
  with_dimension_records=True,
388
+ limit=None,
389
+ explain=False,
386
390
  )
387
391
  except MissingDatasetTypeError:
388
392
  return []
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.2900"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.2800
3
+ Version: 29.2025.2900
4
4
  Summary: Pipeline infrastructure for the Rubin Science Pipelines.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -49,10 +49,10 @@ from lsst.resources import ResourcePath
49
49
 
50
50
  class GroupTestConnections(PipelineTaskConnections, dimensions=("detector",)):
51
51
  """Connections for a task whose quanta read in all of the biases for all
52
- detectors with the same purpose and (theoretically) writes both a single
53
- summary output for all inputs and another output for each input. The data
54
- IDs of the quanta and the summary outputs using the detector with the
55
- lowest ID in that group.
52
+ detectors with the same purpose, use flat-field exposures as prerequisites,
53
+ and (theoretically) writes both a single summary output for all inputs and
54
+ another output for each input. The data IDs of the quanta and the summary
55
+ outputs using the detector with the lowest ID in that group.
56
56
  """
57
57
 
58
58
  input_group = cT.Input(
@@ -62,6 +62,13 @@ class GroupTestConnections(PipelineTaskConnections, dimensions=("detector",)):
62
62
  dimensions=("detector",),
63
63
  isCalibration=True,
64
64
  )
65
+ prereq_input_group = cT.PrerequisiteInput(
66
+ "flat",
67
+ "Exposure",
68
+ multiple=True,
69
+ dimensions=("detector", "physical_filter", "band"),
70
+ isCalibration=True,
71
+ )
65
72
  output_group = cT.Output(
66
73
  "bias_stuff",
67
74
  "StructuredDataDict",
@@ -90,6 +97,8 @@ class GroupTestConnections(PipelineTaskConnections, dimensions=("detector",)):
90
97
  for drop_data_id in drop:
91
98
  for input_data_id in adjuster.get_inputs(drop_data_id)["input_group"]:
92
99
  adjuster.add_input(keep, "input_group", input_data_id)
100
+ for input_uuid in adjuster.get_prerequisite_inputs(drop_data_id)["prereq_input_group"]:
101
+ adjuster.add_prerequisite_input(keep, "prereq_input_group", input_uuid)
93
102
  for output_data_id in adjuster.get_outputs(drop_data_id)["output_group"]:
94
103
  adjuster.move_output(keep, "output_group", output_data_id)
95
104
  adjuster.remove_quantum(drop_data_id)
@@ -135,18 +144,28 @@ class AdjustAllQuantaTestCase(unittest.TestCase):
135
144
  # 1-3 have purpose=SCIENCE, and 4 has purpose=WAVEFRONT.
136
145
  self.assertEqual(quanta.keys(), {1, 4})
137
146
  self.assertEqual(len(quanta[1].inputs["bias"]), 3)
147
+ self.assertEqual(len(quanta[1].inputs["flat"]), 5)
138
148
  self.assertEqual(len(quanta[1].outputs["bias_stuff"]), 3)
139
149
  self.assertCountEqual(
140
150
  quanta[1].inputs["bias"],
141
151
  butler.query_datasets("bias", collections=collections, where="detector.purpose = 'SCIENCE'"),
142
152
  )
153
+ self.assertCountEqual(
154
+ quanta[1].inputs["flat"],
155
+ butler.query_datasets("flat", collections=collections, where="detector.purpose = 'SCIENCE'"),
156
+ )
143
157
  self.assertEqual(len(quanta[1].outputs["bias_summary"]), 1)
144
158
  self.assertEqual(quanta[1].outputs["bias_summary"][0].dataId["detector"], 1)
145
159
  self.assertEqual(len(quanta[4].inputs["bias"]), 1)
160
+ self.assertEqual(len(quanta[4].inputs["flat"]), 2)
146
161
  self.assertEqual(len(quanta[4].outputs["bias_stuff"]), 1)
147
162
  self.assertCountEqual(
148
163
  quanta[4].inputs["bias"],
149
164
  butler.query_datasets("bias", collections=collections, where="detector.purpose = 'WAVEFRONT'"),
150
165
  )
166
+ self.assertCountEqual(
167
+ quanta[4].inputs["flat"],
168
+ butler.query_datasets("flat", collections=collections, where="detector.purpose = 'WAVEFRONT'"),
169
+ )
151
170
  self.assertEqual(len(quanta[4].outputs["bias_summary"]), 1)
152
171
  self.assertEqual(quanta[4].outputs["bias_summary"][0].dataId["detector"], 4)
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.2800"