RosettaCommons / RosettaCommons/foundry

Error message for missing component files is sub-optimal

Open
#15 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement good first issue RosettaFold3
Dominant language
Python
Stars
966
Forks
181
Avg merge
4d 4h
Merged PRs (30d)
2

Description

If you have a path entry in a json setup file for a CIF file (e.g. as with 7o1r_from_json.json ), and you misspell the filename or otherwise don't have the CIF file in the proper path, you get a voluminous set of traceback outputs. There is a useful error message in there, but unfortunately it's buried. (The message is followed by a "The above exception was the direct cause of the following exception" traceback, so finding the actual error message is difficult.)

python3.12/site-packages/biotite/structure/io/pdbx/cif.py:866 in read                                                                                                                                                                                                                                                                                     │
│                                                                                                                                                                                                                                                                                                                                                                                                 │
│    863 │   │   """                                                                              ╭─────────── locals ───────────╮                                                                                                                                                                                                                                                                │
│    864 │   │   # File name                                                                      │ file = PosixPath('NAGG.cif') │                                                                                                                                                                                                                                                                │
│    865 │   │   if is_open_compatible(file):                                                     ╰──────────────────────────────╯                                                                                                                                                                                                                                                                │
│ ❱  866 │   │   │   with open(file, "r") as f:                                                                                                                                                                                                                                                                                                                                                   │
│    867 │   │   │   │   text = f.read()                                                                                                                                                                                                                                                                                                                                                          │
│    868 │   │   # File object                                                                                                                                                                                                                                                                                                                                                                    │
│    869 │   │   else:                                                                                                                                                                                                                                                                                                                                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
FileNotFoundError: [Errno 2] No such file or directory: 'NAGG.cif'

The above exception was the direct cause of the following exception:

... many, many lines of traceback ...

python3.12/site-packages/hydra/_internal/instantiate/_instantiate2.py:97 in _call_target                                                                                                                                                                                                                                                                  │
│                                                                                                                                                                                                                                                                                                                                                                                                 │
│    94 │   │   │   msg = f"Error in call to target '{_convert_target_to_string(_target_)}':\n{r ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮                                     │
│    95 │   │   │   if full_key:                                                                 │ _partial_ = False                                                                                                                                                                                                                                        │                                     │
│    96 │   │   │   │   msg += f"\nfull_key: {full_key}"                                         │      args = ()                                                                                                                                                                                                                                           │                                     │
│ ❱  97 │   │   │   raise InstantiationException(msg) from e                                     │  full_key = ''                                                                                                                                                                                                                                           │                                     │
│    98                                                                                          │    kwargs = {'ckpt_path': 'rf3_latest.pt', 'inputs': '7o1r.json', 'out_dir': './', 'num_nodes': 1, 'devices_per_node': 1, 'n_recycles': 10, 'diffusion_batch_size': 5, 'num_steps': 50, 'solver': 'af3', 'early_stopping_plddt_threshold': 0.5, ... +13} │                                     │
│    99                                                                                          │       msg = "Error in call to target 'modelhub.inference_engines.rf3.RF3InferenceEngine':\nFil"+46                                                                                                                                                       │                                     │
│   100 def _convert_target_to_string(t: Any) -> Any:                                            │         v = PosixPath('/tmp/tmpwk4yxdcm')                                                                                                                                                                                                                │                                     │
│                                                                                                ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                     │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
InstantiationException: Error in call to target 'modelhub.inference_engines.rf3.RF3InferenceEngine':
FileNotFoundError(2, 'No such file or directory')

It looks like a missing/misspelled SDF file avoids the issue, putting the "the file is missing" error message directly at the end of the output:

python3.12/site-packages/atomworks/io/tools/rdkit.py:469 in sdf_to_rdkit                                                                                                                                                                                                                                                                                  │
│                                                                                                                                                                                                                                                                                                                                                                                                 │
│   466 │   │   - TypeError: If the input is neither a StringIO buffer nor a valid path          ╭──────────── locals ─────────────╮                                                                                                                                                                                                                                                              │
│   467 │   """                                                                                  │           sanitize = True       │                                                                                                                                                                                                                                                              │
│   468 │   if isinstance(sdf_path_or_buffer, str | PathLike):                                   │ sdf_path_or_buffer = 'HEMM.sdf' │                                                                                                                                                                                                                                                              │
│ ❱ 469 │   │   supplier = Chem.SDMolSupplier(str(sdf_path_or_buffer), sanitize=sanitize)        ╰─────────────────────────────────╯                                                                                                                                                                                                                                                              │
│   470 │   elif isinstance(sdf_path_or_buffer, io.StringIO):                                                                                                                                                                                                                                                                                                                                     │
│   471 │   │   supplier = Chem.SDMolSupplier(sdf_path_or_buffer, sanitize=sanitize)                                                                                                                                                                                                                                                                                                              │
│   472 │   else:                                                                                                                                                                                                                                                                                                                                                                                 │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
OSError: File error: Bad input file HEMM.sdf

... many, many lines of traceback ...

python3.12/site-packages/hydra/_internal/instantiate/_instantiate2.py:97 in _call_target                                                                                                                                                                                                                                                                  │
│                                                                                                                                                                                                                                                                                                                                                                                                 │
│    94 │   │   │   msg = f"Error in call to target '{_convert_target_to_string(_target_)}':\n{r ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮                                     │
│    95 │   │   │   if full_key:                                                                 │ _partial_ = False                                                                                                                                                                                                                                        │                                     │
│    96 │   │   │   │   msg += f"\nfull_key: {full_key}"                                         │      args = ()                                                                                                                                                                                                                                           │                                     │
│ ❱  97 │   │   │   raise InstantiationException(msg) from e                                     │  full_key = ''                                                                                                                                                                                                                                           │                                     │
│    98                                                                                          │    kwargs = {'ckpt_path': 'rf3_latest.pt', 'inputs': '7o1r.json', 'out_dir': './', 'num_nodes': 1, 'devices_per_node': 1, 'n_recycles': 10, 'diffusion_batch_size': 5, 'num_steps': 50, 'solver': 'af3', 'early_stopping_plddt_threshold': 0.5, ... +13} │                                     │
│    99                                                                                          │       msg = "Error in call to target 'modelhub.inference_engines.rf3.RF3InferenceEngine':\nOSE"+43                                                                                                                                                       │                                     │
│   100 def _convert_target_to_string(t: Any) -> Any:                                            │         v = PosixPath('/tmp/tmppf7cjbmq')                                                                                                                                                                                                                │                                     │
│                                                                                                ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                     │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
InstantiationException: Error in call to target 'modelhub.inference_engines.rf3.RF3InferenceEngine':
OSError('File error: Bad input file HEMM.sdf')

Ideally a missing CIF file should have similar useful error reporting as a missing SDF file.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure with the linked 7o1r_from_json.json example and a missing CIF path, then inspect the RF3InferenceEngine call shown in the traceback and compare it with the missing-SDF path. Done should be a concise missing-file error at the end of the output instead of the useful message being buried in chained traceback text.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
machine-learning
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.