Skip to content

Commit

Permalink
Function to create problem yaml file (#398)
Browse files Browse the repository at this point in the history
* resolves 386

* resolves #397

* include create_default_yaml() as part of problem.to_file()

* allow for list of files in creation of yaml file
  • Loading branch information
MerktSimon authored Mar 23, 2020
1 parent 8abdd7d commit e713f8b
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 6 deletions.
4 changes: 4 additions & 0 deletions petab/petab_schema.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ properties:
type: array
description: List of PEtab observable files.

items:
type: string
description: PEtab observable file name or URL.

visualization_files:
type: array
description: List of PEtab visualization files.
Expand Down
10 changes: 9 additions & 1 deletion petab/problem.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,8 @@ def to_files(self,
measurement_file: Optional[str] = None,
parameter_file: Optional[str] = None,
visualization_file: Optional[str] = None,
observable_file: Optional[str] = None) -> None:
observable_file: Optional[str] = None,
yaml_file: Optional[str] = None) -> None:
"""
Write PEtab tables to files for this problem
Expand All @@ -282,6 +283,7 @@ def to_files(self,
parameter_file: Parameter table destination
visualization_file: Visualization table destination
observable_file: Observables table destination
yaml_file: YAML file destination
Raises:
ValueError: If a destination was provided for a non-existing
Expand Down Expand Up @@ -333,6 +335,12 @@ def error(name: str) -> ValueError:
else:
raise error("visualization")

if yaml_file:
yaml.create_problem_yaml(sbml_file, condition_file,
measurement_file, parameter_file,
observable_file, yaml_file,
visualization_file)

def get_optimization_parameters(self):
"""
Return list of optimization parameter IDs.
Expand Down
50 changes: 47 additions & 3 deletions petab/yaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,12 @@

import os

from typing import Any, Dict, Union, Optional
from typing import Any, Dict, Union, Optional, List

import jsonschema
import yaml
from .C import * # noqa: F403


SCHEMA = os.path.join(os.path.abspath(os.path.dirname(__file__)),
"petab_schema.yaml")

Expand Down Expand Up @@ -159,4 +158,49 @@ def write_yaml(yaml_config: Dict[str, Any], filename: str) -> None:
"""

with open(filename, 'w') as outfile:
yaml.dump(yaml_config, outfile, default_flow_style=False)
yaml.dump(yaml_config, outfile, default_flow_style=False,
sort_keys=False)


def create_problem_yaml(sbml_files: Union[str, List[str]],
condition_files: Union[str, List[str]],
measurement_files: Union[str, List[str]],
parameter_file: str,
observable_files: Union[str, List[str]],
yaml_file: str,
visualization_files: Optional[Union[str, List[str]]]
= None) -> None:
"""
Create and write default YAML file for a single PEtab problem
Arguments:
sbml_files: Path of SBML model file or list of such
condition_files: Path of condition file or list of such
measurement_files: Path of measurement file or list of such
parameter_file: Path of parameter file
observable_files: Path of observable file or lsit of such
yaml_file: Path to which YAML file should be written
visualization_files: Optional Path to visualization file or list of
such
"""
if isinstance(sbml_files, str):
sbml_files = [sbml_files]
if isinstance(condition_files, str):
condition_files = [condition_files]
if isinstance(measurement_files, str):
measurement_files = [measurement_files]
if isinstance(observable_files, str):
observable_files = [observable_files]
if isinstance(visualization_files, str):
visualization_files = [visualization_files]

problem_dic = {CONDITION_FILES: condition_files,
MEASUREMENT_FILES: measurement_files,
SBML_FILES: sbml_files,
OBSERVABLE_FILES: observable_files}
if visualization_files is not None:
problem_dic.update({'visualization_files': visualization_files})
yaml_dic = {PARAMETER_FILE: parameter_file,
FORMAT_VERSION: 1,
PROBLEMS: [problem_dic]}
write_yaml(yaml_dic, yaml_file)
3 changes: 2 additions & 1 deletion tests/test_petab.py
Original file line number Diff line number Diff line change
Expand Up @@ -531,7 +531,8 @@ def test_to_files(petab_problem): # pylint: disable=W0621
measurement_file=measurement_file,
parameter_file=parameter_file,
visualization_file=None,
observable_file=observable_file)
observable_file=observable_file,
yaml_file=None)

# exemplarily load some
parameter_df = petab.get_parameter_df(parameter_file)
Expand Down
36 changes: 35 additions & 1 deletion tests/test_yaml.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"""Test for petab.yaml"""
import tempfile

import pytest
from petab.yaml import validate
from petab.yaml import validate, create_problem_yaml

from jsonschema.exceptions import ValidationError

Expand All @@ -18,3 +19,36 @@ def test_validate():
# should be well-formed
file_ = "doc/example/example_Fujita/Fujita.yaml"
validate(file_)


def test_create_problem_yaml():
with tempfile.TemporaryDirectory() as folder:
# test with single problem files
# create target files
sbml_file = tempfile.mkstemp(dir=folder)[1]
condition_file = tempfile.mkstemp(dir=folder)[1]
measurement_file = tempfile.mkstemp(dir=folder)[1]
parameter_file = tempfile.mkstemp(dir=folder)[1]
observable_file = tempfile.mkstemp(dir=folder)[1]
yaml_file = tempfile.mkstemp(dir=folder)[1]
visualization_file = tempfile.mkstemp(dir=folder)[1]
create_problem_yaml(sbml_file, condition_file, measurement_file,
parameter_file, observable_file, yaml_file,
visualization_file)
validate(yaml_file)

# test for list of files
# create additional target files
sbml_file2 = tempfile.mkstemp(dir=folder)[1]
condition_file2 = tempfile.mkstemp(dir=folder)[1]
measurement_file2 = tempfile.mkstemp(dir=folder)[1]
observable_file2 = tempfile.mkstemp(dir=folder)[1]
yaml_file2 = tempfile.mkstemp(dir=folder)[1]

sbml_files = [sbml_file, sbml_file2]
condition_files = [condition_file, condition_file2]
measurement_files = [measurement_file, measurement_file2]
observable_files = [observable_file, observable_file2]
create_problem_yaml(sbml_files, condition_files, measurement_files,
parameter_file, observable_files, yaml_file2)
validate(yaml_file2)

0 comments on commit e713f8b

Please sign in to comment.