-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DM-41606: Option to output pipetask report info to command line #277
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
Make option to output `pipetask report` information to the command-line using | ||
astropy tables and set to default. | ||
Unpack a more human-readable dictionary from | ||
`lsst.pipe.base.QuantumGraphExecutionReports.to_summary_dict` and print summary | ||
tables of quanta and datasets to the command-line. Save error messages and | ||
associated data ids to a yaml file in the working directory, or optionally print | ||
them to screen as well. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,34 +24,86 @@ | |
# | ||
# You should have received a copy of the GNU General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
import pprint | ||
|
||
import yaml | ||
from astropy.table import Table | ||
from lsst.daf.butler import Butler | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Probably should be a blank line between the astropy and Butler imports too, if you're being a format stickler. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. isort won't allow that. |
||
from lsst.pipe.base import QuantumGraph | ||
from lsst.pipe.base.execution_reports import QuantumGraphExecutionReport | ||
|
||
|
||
def report(butler_config: str, qgraph_uri: str, output_yaml: str, logs: bool = True) -> None: | ||
"""Write a yaml file summarizing the produced and missing expected datasets | ||
in a quantum graph. | ||
def report( | ||
butler_config: str, | ||
qgraph_uri: str, | ||
full_output_filename: str | None, | ||
logs: bool = True, | ||
show_errors: bool = False, | ||
) -> None: | ||
"""Summarize the produced and missing expected dataset in a quantum graph. | ||
|
||
Parameters | ||
---------- | ||
butler_config : `str` | ||
The Butler used for this report. This should match the Butler used | ||
for the run associated with the executed quantum graph. | ||
qgraph_uri : `str` | ||
The uri of the location of said quantum graph. | ||
output_yaml : `str` | ||
The name to be used for the summary yaml file. | ||
logs : `bool` | ||
Get butler log datasets for extra information. | ||
|
||
See Also | ||
-------- | ||
lsst.pipe.base.QuantumGraphExecutionReport.make_reports : Making reports. | ||
lsst.pipe.base.QuantumGraphExecutionReport.write_summary_yaml : Summaries. | ||
butler_config : `str` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The indenting looks a little funny here relative to the old doc string, like it's an extra 4 spaces over. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agreed. I'm kind of surprised that the numpydoc validator doesn't spot this -- maybe I've missed some configuration setting for numpydoc. |
||
The Butler used for this report. This should match the Butler used | ||
for the run associated with the executed quantum graph. | ||
qgraph_uri : `str` | ||
The uri of the location of said quantum graph. | ||
full_output_filename : `str` | ||
Output the full summary report to a yaml file (named herein). | ||
Each data id and error message is keyed to a quantum graph node id. | ||
A convenient output format for error-matching and cataloguing tools | ||
such as the ones in the Campaign Management database. If this is | ||
not included, quanta and dataset information will be printed to the | ||
command-line instead. | ||
logs : `bool` | ||
Get butler log datasets for extra information (error messages). | ||
show_errors : `bool` | ||
If no output yaml is provided, print error messages to the | ||
command-line along with the report. By default, these messages and | ||
their associated data ids are stored in a yaml file with format | ||
`{run timestamp}_err.yaml` in the working directory instead. | ||
""" | ||
butler = Butler.from_config(butler_config, writeable=False) | ||
qgraph = QuantumGraph.loadUri(qgraph_uri) | ||
report = QuantumGraphExecutionReport.make_reports(butler, qgraph) | ||
report.write_summary_yaml(butler, output_yaml, do_store_logs=logs) | ||
if not full_output_filename: | ||
# this is the option to print to the command-line | ||
summary_dict = report.to_summary_dict(butler, logs, human_readable=True) | ||
dataset_table_rows = [] | ||
data_products = [] | ||
quanta_summary = [] | ||
error_summary = [] | ||
for task in summary_dict.keys(): | ||
for data_product in summary_dict[task]["outputs"]: | ||
dataset_table_rows.append(summary_dict[task]["outputs"][data_product]) | ||
data_products.append(data_product) | ||
|
||
quanta_summary.append( | ||
{ | ||
"Task": task, | ||
"Failed Quanta": summary_dict[task]["failed_quanta"], | ||
"Blocked Quanta": summary_dict[task]["n_quanta_blocked"], | ||
} | ||
) | ||
|
||
if "errors" in summary_dict[task].keys(): | ||
error_summary.append({task: summary_dict[task]["errors"]}) | ||
quanta = Table(quanta_summary) | ||
datasets = Table(dataset_table_rows) | ||
datasets.add_column(data_products, index=0, name="DatasetType") | ||
quanta.pprint_all() | ||
print("\n") | ||
if show_errors: | ||
pprint.pprint(error_summary) | ||
print("\n") | ||
else: | ||
assert qgraph.metadata is not None, "Saved QGs always have metadata." | ||
collection = qgraph.metadata["output_run"] | ||
collection = str(collection) | ||
run_name = collection.split("/")[-1] | ||
with open(f"{run_name}_err.yaml", "w") as stream: | ||
yaml.safe_dump(error_summary, stream) | ||
datasets.pprint_all() | ||
else: | ||
report.write_summary_yaml(butler, full_output_filename, do_store_logs=logs) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
types-PyYAML |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Switch the blank line order here. See PEP8 for import format.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We use isort and black for formatting so I think this is right.
pprint
is part of core python andyaml
is not so a line separates them.