From 167b61b2008bfaea134c9be32f933e0745f4e964 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Tue, 17 Nov 2020 22:59:37 +0100 Subject: [PATCH 01/17] Add tutorial for creating PEtab files (#488) * Add tutorial for creating PEtab files * Formatting * Table captions * Lists of fields to real lists * Highlight table headers * Formatting * Image to figure * Added tutorial PEtab files * fixed formatting * Fix yaml formatting. Fix filenames. * punct. * update link * Tutorial link to readme * Added COPASI section to tutorial * formatting, update sim section * Fix empty table cells * E * Break overwide table * fixup * update readme 'using petab' * add pdf generation script * fix docs * increase pdf margin Co-authored-by: LeonardSchmiester Co-authored-by: yannikschaelte --- README.md | 13 +- doc/compile_tutorial.sh | 9 + doc/gfx/copasi_simulation.png | Bin 0 -> 75161 bytes doc/gfx/tutorial_data.png | Bin 0 -> 58724 bytes doc/gfx/tutorial_model.png | Bin 0 -> 24775 bytes doc/index.rst | 1 + doc/tutorial.rst | 418 ++++++++ doc/tutorial/Boehm_JProteomeRes2014.yaml | 13 + doc/tutorial/experimental_conditions.tsv | 2 + doc/tutorial/measurement_data.tsv | 49 + doc/tutorial/model_Boehm_JProteomeRes2014.xml | 968 ++++++++++++++++++ doc/tutorial/observables.tsv | 4 + doc/tutorial/parameters.tsv | 12 + doc/tutorial/visualization_specification.tsv | 4 + 14 files changed, 1489 insertions(+), 4 deletions(-) create mode 100644 doc/compile_tutorial.sh create mode 100644 doc/gfx/copasi_simulation.png create mode 100644 doc/gfx/tutorial_data.png create mode 100644 doc/gfx/tutorial_model.png create mode 100644 doc/tutorial.rst create mode 100644 doc/tutorial/Boehm_JProteomeRes2014.yaml create mode 100644 doc/tutorial/experimental_conditions.tsv create mode 100644 doc/tutorial/measurement_data.tsv create mode 100755 doc/tutorial/model_Boehm_JProteomeRes2014.xml create mode 100644 doc/tutorial/observables.tsv create mode 100644 doc/tutorial/parameters.tsv create mode 100644 doc/tutorial/visualization_specification.tsv diff --git a/README.md b/README.md index c5447764..3c265f3f 100644 --- a/README.md +++ b/README.md @@ -107,10 +107,15 @@ Legend: ## Using PEtab -If you would like to use PEtab yourself, please have a look at -[doc/documentation_data_format.rst](doc/documentation_data_format.rst) or at -the example models provided in the -[benchmark collection](https://github.com/Benchmarking-Initiative/Benchmark-Models-PEtab). +If you would like to use PEtab yourself, please have a look at: + +* [a PEtab tutorial](https://petab.readthedocs.io/en/latest/tutorial.html) + going through the individual steps of setting up a parameter estimation + problem in PEtab, independently of any specific software +* [the PEtab format reference](https://petab.readthedocs.io/en/stable/documentation_data_format.html) +* the example models provided in the + [benchmark collection](https://github.com/Benchmarking-Initiative/Benchmark-Models-PEtab). +* the tutorials provided with each of the softwares supporting PEtab To convert your existing parameter estimation problem to the PEtab format, you will have to: diff --git a/doc/compile_tutorial.sh b/doc/compile_tutorial.sh new file mode 100644 index 00000000..e0972310 --- /dev/null +++ b/doc/compile_tutorial.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Build a pdflatex document from the tutorial + +pandoc tutorial.rst \ + -o tutorial.pdf \ + -V geometry:margin=1.5in -V geometry:a4paper -V fontsize=10pt \ + --toc \ + --pdf-engine pdflatex diff --git a/doc/gfx/copasi_simulation.png b/doc/gfx/copasi_simulation.png new file mode 100644 index 0000000000000000000000000000000000000000..c5db8ee3db4c98ce4a9ba5a1ba89a7da38c1bca4 GIT binary patch literal 75161 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

ATTM;8|iwF9+~0O*Dl#5S$CG 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≧vGy7qNEVP{wpmV4woe$WN$i^X#k@+kMzRJa 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

Re#m#)?MemNEGkkf(}!ePn;EKk9+9R~tBi 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 KbGfAP&;Jj0Q4}u# literal 0 HcmV?d00001 diff --git a/doc/gfx/tutorial_data.png b/doc/gfx/tutorial_data.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd5f4087d1011b0099000780ae40e799ec1317b GIT binary patch literal 58724 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≠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

{lt5H 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 + tutorial .. toctree:: :maxdepth: 3 diff --git a/doc/tutorial.rst b/doc/tutorial.rst new file mode 100644 index 00000000..50f80ebb --- /dev/null +++ b/doc/tutorial.rst @@ -0,0 +1,418 @@ +============== +PEtab Tutorial +============== + +Overview +++++++++ + +In the following, we demonstrate how to set up a parameter estimation +problem in PEtab based on a realistic application example. To this end, +we consider the model and experimental data by +`Boehm et al. (2014) `_. The +model describes the dynamics of phosphorylation and dimerization of the +transcription factors STAT5A and STAT5B. A visualization and the +corresponding reactions of the model are provided below, although the +details of the model are not relevant for the purpose of this tutorial. +For more details, we refer to the original publication (Boehm et al., +2014). + +A PEtab problem consists of 1) an SBML model of a biological system, 2) +condition, observable and measurement definitions, and 3) the +specification of the parameters. We will show how to generate the +respective files in the following. + +1. The model +++++++++++++ + +PEtab assumes that an SBML file of the model exists. Here, we use the +SBML model provided in the original publication, which is also available +on Biomodels (https://www.ebi.ac.uk/biomodels/BIOMD0000000591). For +illustration purposes we slightly modified the SBML model and shortened +some parts of the PEtab files. The full PEtab problem introduced in this +tutorial is available `online `_. + +.. figure:: gfx/tutorial_model.png + :width: 4.9846in + :height: 5.5634in + + Visualization of the model used as example in this tutorial. + The model describes the dynamics of phosphorylation and dimerization of the + transcription factors STAT5A and STAT5B. + +.. table:: Reactions included in the example model. + + == ========================== ============================================= + ID Reaction Rate law + == ========================== ============================================= + R1 2 STAT5A -> pApA cyt \* BaF3_Epo \* STAT5A^2 \* k_phos + R2 STAT5A + STAT5B -> pApB cyt \* BaF3_Epo \* STAT5A \* STAT5B \* k_phos + R3 2 STAT5B -> pBpB cyt \* BaF3_Epo \* STAT5B^2 \* k_phos + R4 pApA -> nucpApA cyt \* k_imp_homo \* pApA + R5 pApB -> nucpApB cyt \* k_imp_hetero \* pApB + R6 pBpB -> nucpBpB cyt \* k_imp_homo \* pBpB + R7 nucpApA -> 2 STAT5A nuc \* k_exp_homo \* nucpApA + R8 nucpApB -> STAT5A + STAT5B nuc \* k_exp_hetero \* nucpApB + R9 nucpBpB -> 2 STAT5B nuc \* k_exp_homo \* nucpBpB + == ========================== ============================================= + +2. Linking model and measurements ++++++++++++++++++++++++++++++++++ + +The model by Boehm et al. (2014) was calibrated on measurements on +phosphorylation levels of STAT5A and STAT5B as well as relative STAT5A +abundance for different timepoints between 0 - 240 minutes after +stimulation with erythropoietin (Epo): + +.. figure:: gfx/tutorial_data.png + :width: 6.2681in + :height: 2.0835in + + Measurements considered for model calibration in our example. + +To define a parameter estimation problem in PEtab, we need to map +measurements to the model states. To this end, we need to 1) specify the +experimental conditions the measurements were generated from, 2) specify +observation functions and error models, and 3) specify the measurements +themselves. For this, we need to define observation functions as well as +experimental conditions under which a measurement was performed. + +2.1 Specifying experimental conditions +-------------------------------------- + +The measurements were collected under the same experimental condition, +which is a stimulation with Epo. This is specified in the experimental +condition PEtab file, a tab-separated values (TSV) file\ [#f1]_, +by providing a condition identifier and listing all condition-specific +parameters and their respective values. + +In the problem considered here, the relevant parameter is +``Epo_concentration`` which we want to set to a value of 1.25E-7, as the +only condition-specific parameter. In our example we include data from +only one single experiment, so we would not need to specify it here, but +could set the value in the model or in the parameter table. However, +having it would allow us to easily add measurements from other +experiments performed with different Epo concentrations later on. + +The condition table would look as follows: + +.. table:: Conditions table ``experimental_conditions.tsv``. + + =============== ============================ ================= + conditionId conditionName Epo_concentration + =============== ============================ ================= + epo_stimulation Stimulation with 1.25E-7 Epo 1.25E-7 + =============== ============================ ================= + +* *conditionId* is a unique identifier to define the different conditions + and link them to the measurements (see measurement file below). + Additional measurements e.g. for different Epo concentrations can be + defined by adding new rows. + +* *conditionName* can be used as a human readable description of the + condition e.g. for plotting. + +The following column headers (here *Epo_concentration*) refer to +different parameters or species in the model, the values of which are +overridden by these condition-specific values. Here, we define the Epo +concentration, but additional columns could be used to e.g. set +different initial concentrations of STAT5A/B. In addition to numeric +values, also parameter identifiers can be used here to introduce +condition specific optimization parameters. + +2.2 Specifying the observation model +------------------------------------ + +To link the model states to the measured values, we specify observation +functions. Additionally, a noise model can be introduced to account for +the measurement errors. In PEtab, this can be encoded in the observable +file: + +.. list-table:: Observables table ``observables.tsv``. + :header-rows: 1 + + * - observableId + - observableName + - ... + * - pSTAT5A_rel + - Rel. STAT5A phosphorylation [%] + - ... + * - pSTAT5B_rel + - Rel. STAT5B phosphorylation [%] + - ... + * - rSTAT5A_rel + - Rel. STAT5A abundance [%] + - ... + +.. list-table:: Observables table ``observables.tsv`` (continued). + :header-rows: 1 + + * - ... + - observableFormula + - ... + * - ... + - 100*(2*pApA + pApB) / (2*pApA + pApB + STAT5A) + - ... + * - ... + - 100*(2*pBpB + pApB) / (2*pBpB + pApB + STAT5B) + - ... + * - ... + - 100*(STAT5A + pApB + 2*pApA) / (2 \* pApB + 2\* pApA + STAT5A + STAT5B + 2*pBpB) + - ... + +.. list-table:: Observables table ``observables.tsv`` (continued). + :header-rows: 1 + + * - ... + - noiseFormula + - noiseDistribution + * - ... + - noiseParameter1_pSTAT5A_rel + - normal + * - ... + - noiseParameter1_pSTAT5B_rel + - normal + * - ... + - noiseParameter1_rSTAT5A_rel + - normal + +* *observableId* specifies a unique identifier to the observables that can + be used to link them to the measurements (see below). + +* *observableName* can be used as a human readable description of the + observable. Here, this corresponds to the y-label in the figure above. + +* *observableFormula* is a mathematical expression defining how the model + output is calculated. The formula can consist of species and parameters + defined in the SBML file. In our example, we measure e.g. the relative + phosphorylation level of STAT5A (*pSTAT5A_rel*), which is the sum of all + species containing phosphorylated STAT5A over the sum of all species + containing any form of STAT5A. + +* *noiseFormula* is used to describe the formula for the measurement + noise. Together with *noiseDistribution*\ it defines the noise model. In + this example, we assume additive normally distributed measurement noise. + In this scenario, ``noiseParameter1_{observableId}`` is the standard + deviation of the measurement noise. Parameters following this naming + scheme are expected to be overridden in a measurement-specific manner in + the *noiseParameters* column of the measurement table (see below). + +* *observableTransformation* defines the scale in which model observable + and measurement data are compared. Here, we assume a linear scale. Other + transformations, such as log10 can also be used. + +2.3 Specifying measurements +--------------------------- + +The experimental data is linked to the conditions via the *conditionId* +and to the observables via the *observableId*. This is defined in the +PEtab measurement file: + +.. table:: Measurement table ``measurement_data.tsv``. + + ============ ===================== =========== ==== =============== + observableId simulationConditionId measurement time noiseParameters + ============ ===================== =========== ==== =============== + pSTAT5A_rel epo_stimulation 7.9 0 sd_pSTAT5A_rel + ... ... ... ... ... + pSTAT5A_rel epo_stimulation 15.4 240 sd_pSTAT5A_rel + pSTAT5B_rel epo_stimulation 4.6 0 sd_pSTAT5B_rel + ... ... ... ... ... + pSTAT5B_rel epo_stimulation 10.96 240 sd_pSTAT5B_rel + rSTAT5A_rel epo_stimulation 14.7 0 sd_rSTAT5A_rel + ... ... ... ... ... + rSTAT5A_rel epo_stimulation 32.2 240 sd_rSTAT5A_rel + ============ ===================== =========== ==== =============== + +* *observableId* references the *observableId* from the observable file. + +* *simulationConditionId* references the *conditionId* from the + experimental condition file. + +* *measurement* defines the values that are measured for the respective + observable and experimental condition. + +* *time* is the time point at which the measurement was performed. For + brevity, only the first and last time point of the example are shown + here (the omitted measurements are indicated by “...” in the example). + +* *noiseParameters* relates to the *noiseParameters* in the observables + file. In our example, the measurement noise is unknown. Therefore we + define parameters here which have to be estimated (see parameters sheet + below). If the noise is known, e.g. from multiple replicates, numeric + values can be used in this column. + +3. Defining parameters +++++++++++++++++++++++ + +The model by Boehm et al. (2014) contains nine unknown parameters that +need to be estimated from the experimental data. Additionally, it has +two known parameters that are fixed to literature values. + +The parameters file for this is given by: + +.. table:: Parameter table ``parameters.tsv``. + + ==================== ============== ========== ========== ============ ======== + parameterId parameterScale lowerBound upperBound nominalValue estimate + ==================== ============== ========== ========== ============ ======== + Epo_degradation_BaF3 log10 1E-5 1E+5 \ 1 + k_exp_hetero log10 1E-5 1E+5 \ 1 + k_exp_homo log10 1E-5 1E+5 \ 1 + k_imp_hetero log10 1E-5 1E+5 \ 1 + k_imp_homo log10 1E-5 1E+5 \ 1 + k_phos log10 1E-5 1E+5 \ 1 + ratio lin \ \ 0.693 0 + sd_pSTAT5A_rel log10 1E-5 1E+5 \ 1 + sd_pSTAT5B_rel log10 1E-5 1E+5 \ 1 + sd_rSTAT5A_rel log10 1E-5 1E+5 \ 1 + ==================== ============== ========== ========== ============ ======== + +* *parameterId* references parameters defined in the SBML file. + Additionally, parameters defined in the measurement table can be used + here. In this example, the standard deviations for the different + observables (*sd_{observableId}*) are estimated. + +* *parameterScale* is the scale on which parameters are estimated. Often, + a logarithmic scale improves optimization. Alternatively, a linear scale + can be used, e.g. when parameters can be negative. + +* *lowerBound* and *upperBound* define the bounds for the parameters used + during optimization. These are usually biologically plausible ranges. + +* *nominalValue* are known values used for simulation. The entry can be + left empty, if a value is unknown and subject to optimization. + +* *estimate* defines whether the parameter is subject to optimization (1) + or if it is fixed (0) to the value in the nominalValue column. + +4. Visualization file ++++++++++++++++++++++ + +Optionally, a visualization file can be specified in PEtab which defines +how the measurement data and potentially model simulations are plotted. +So far, the visualization files are only supported by the PEtab Python +library. Here, we describe a file that specifies the visualization of +the measurement data similar to the figure above. + +.. table:: Visualization specification table ``visualization_specification.tsv``. + + ====== ============ ========== =========== =============================== + plotId plotTypeData xLabel yValues yLabel + ====== ============ ========== =========== =============================== + plot1 MeanAndSD Time [min] pSTAT5A_rel Rel. STAT5A phosphorylation [%] + plot2 MeanAndSD Time [min] pSTAT5B_rel Rel. STAT5B phosphorylation [%] + plot3 MeanAndSD Time [min] rSTAT5A_rel Rel. STAT5A abundance [%] + ====== ============ ========== =========== =============================== + +* *plotId* corresponds to a specific plot. All lines which share the same + *plotId* are combined into one plot. + +* *plotTypeData* defines the plotting style of the measurement data. Here, + we use mean and (if available) standard deviations. + +* *xLabel* and *yLabel* are the labels of the x- and y-axes for the + corresponding plot. + +* *yValues* defines what is plotted. In this example the different + observables are plotted individually. + +There are various ways of further individualizing the plots, e.g. by +defining legend entries or data plotted on log-scale (see the +documentation for further information +https://petab.readthedocs.io/en/latest/documentation_data_format.html#visualization-table). + +5. YAML file +++++++++++++ + +To group the previously mentioned PEtab files, a YAML file can be used, +defining which files constitute a PEtab problem. While being optional, +this makes it easier to import a PEtab problem into tools, and allows +reusing files for different PEtab problems. This file has the following +format (``Boehm_JProteomeRes2014.yaml``): + +.. code-block:: yaml + + format_version: 1 + parameter_file: parameters.tsv + problems: + - condition_files: + - experimental_conditions.tsv + measurement_files: + - measurement_data.tsv + observable_files: + - observables.tsv + sbml_files: + - model_Boehm_JProteomeRes2014.xml + visualization_files: + - visualization_specification.tsv + +The first line specifies the version this file and the files referenced +adhere to. The current version number is 1. The second line references +the parameter file. This is followed by a list of (sub-)problems, in +this case only one, referencing the respective condition, measurement +observable, model, and visualization files. There can be multiple of +those files, e.g. for large numbers of measurements, one could split +those up into separate files, e.g. by experimental condition or +observable. + +6. Model simulation ++++++++++++++++++++ + +To simulate the model and compare it to the experimental data, the nominal +parameters in the parameters file need to be set. As some parameters are +a priori unknown, we here consider randomly sampled parameters to get a glance +of model behaviour and fit to the data. + +.. table:: Parameter table ``parameters.tsv`` with *nominalValue* set to random values. + + ==================== ============== ========== ========== ============ ======== + parameterId parameterScale lowerBound upperBound nominalValue estimate + ==================== ============== ========== ========== ============ ======== + Epo_degradation_BaF3 log10 1E-5 1E+5 0.105 1 + k_exp_hetero log10 1E-5 1E+5 1.85 1 + k_exp_homo log10 1E-5 1E+5 9.83 1 + k_imp_hetero log10 1E-5 1E+5 1048.96 1 + k_imp_homo log10 1E-5 1E+5 10.136 1 + k_phos log10 1E-5 1E+5 10.136 1 + ratio lin \ \ 0.693 0 + sd_pSTAT5A_rel log10 1E-5 1E+5 51.7 1 + sd_pSTAT5B_rel log10 1E-5 1E+5 0.257 1 + sd_rSTAT5A_rel log10 1E-5 1E+5 0.017 1 + ==================== ============== ========== ========== ============ ======== + +With this, the model can be simulated using the different tools that support +PEtab. The easiest tool to get started with is probably COPASI which comes +with a graphical user interface +(see https://github.com/copasi/python-petab-importer for further instructions). + +.. figure:: gfx/copasi_simulation.png + :width: 4.9846in + :height: 5.5634in + + Visualization of model outputs after simulation with random parameters and + measurements in COPASI. + +It is apparent from the figure, that the random parameters yield a poor fit of +the model with the data. Therefore, it is important to optimize the parameters +to improve the model fit. This can be done using various parameter +estimation tools. Links to detailed descriptions how to use the individual +toolboxes are provided at the `PEtab Github page `_. + +7. Further information +++++++++++++++++++++++ + +This tutorial only demonstrates a subset of PEtab functionality. For +full reference, consult the +`PEtab reference `_. After +finishing the implementation of the PEtab problem, its correctness can +be verified using the PEtab library (see +https://github.com/PEtab-dev/PEtab/blob/master/doc/example/example_petablint.ipynb +for instructions). The PEtab problem can then be used as input to the +supporting toolboxes to estimate the unknown parameters or calculate +parameter uncertainties. Links to tutorials for the different tools can +be found at the PEtab Github page +(https://github.com/PEtab-dev/PEtab#petab-support-in-systems-biology-tools). + +.. [#f1] + TSV files can be created using any standard spreadsheet application, + or for small files, text editor. diff --git a/doc/tutorial/Boehm_JProteomeRes2014.yaml b/doc/tutorial/Boehm_JProteomeRes2014.yaml new file mode 100644 index 00000000..d7bcf969 --- /dev/null +++ b/doc/tutorial/Boehm_JProteomeRes2014.yaml @@ -0,0 +1,13 @@ +format_version: 1 +parameter_file: parameters.tsv +problems: + - condition_files: + - experimental_conditions.tsv + measurement_files: + - measurement_data.tsv + observable_files: + - observables.tsv + sbml_files: + - model_Boehm_JProteomeRes2014.xml + visualization_files: + - visualization_specification.tsv diff --git a/doc/tutorial/experimental_conditions.tsv b/doc/tutorial/experimental_conditions.tsv new file mode 100644 index 00000000..6d60e478 --- /dev/null +++ b/doc/tutorial/experimental_conditions.tsv @@ -0,0 +1,2 @@ +conditionId conditionName Epo_concentration +epo_stimulation condition1 1.25E-07 diff --git a/doc/tutorial/measurement_data.tsv b/doc/tutorial/measurement_data.tsv new file mode 100644 index 00000000..20fde378 --- /dev/null +++ b/doc/tutorial/measurement_data.tsv @@ -0,0 +1,49 @@ +observableId simulationConditionId measurement time noiseParameters +pSTAT5A_rel epo_stimulation 7.901072999 0 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 66.36349397 2.5 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 81.17132392 5 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 94.73030806 10 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 95.11648305 15 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 91.44171655 20 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 91.25709923 30 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 93.67229784 40 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 88.75423282 50 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 85.26970322 60 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 81.13239534 80 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 76.13592848 100 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 65.24805913 120 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 42.59965871 160 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 25.15779754 200 sd_pSTAT5A_rel +pSTAT5A_rel epo_stimulation 15.4301824 240 sd_pSTAT5A_rel +pSTAT5B_rel epo_stimulation 4.596533343 0 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 29.63454599 2.5 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 46.04380647 5 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 81.97473362 10 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 80.5716093 15 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 79.03571964 20 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 75.67238037 30 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 71.62471986 40 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 69.06286328 50 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 67.14738432 60 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 60.89947629 80 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 54.80925777 100 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 43.98128998 120 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 29.77145816 160 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 20.08901656 200 sd_pSTAT5B_rel +pSTAT5B_rel epo_stimulation 10.96184517 240 sd_pSTAT5B_rel +rSTAT5A_rel epo_stimulation 14.72316822 0 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 33.76234229 2.5 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 36.79985129 5 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 49.71760229 10 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 46.9281201 15 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 47.83657456 20 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 46.92872725 30 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 40.59775294 40 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 43.78366389 50 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 44.45738765 60 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 41.32715926 80 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 41.06273321 100 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 39.23583003 120 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 36.61946054 160 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 34.8937144 200 sd_rSTAT5A_rel +rSTAT5A_rel epo_stimulation 32.21107716 240 sd_rSTAT5A_rel diff --git a/doc/tutorial/model_Boehm_JProteomeRes2014.xml b/doc/tutorial/model_Boehm_JProteomeRes2014.xml new file mode 100755 index 00000000..1ed41b80 --- /dev/null +++ b/doc/tutorial/model_Boehm_JProteomeRes2014.xml @@ -0,0 +1,968 @@ + + + + + + + +</head> +<body> +<pre>PEtab implementation of the model from Boehm et al. (2014), J. Proteome Res., 13, 12, 5685-5694</pre> +</body> +</html> +</notes> +<annotation> +<celldesigner:extension> +<celldesigner:modelVersion>4.0</celldesigner:modelVersion> +<celldesigner:modelDisplay sizeX="526" sizeY="587"/> +<celldesigner:listOfCompartmentAliases> +<celldesigner:compartmentAlias id="ca0" compartment="cyt"> +<celldesigner:class>SQUARE</celldesigner:class> +<celldesigner:bounds x="25.0" y="5.0" w="460.0" h="241.0"/> +<celldesigner:namePoint x="192.5" y="194.5"/> +<celldesigner:doubleLine thickness="12.0" outerWidth="2.0" innerWidth="1.0"/> +<celldesigner:paint color="ffcccc00" scheme="Color"/> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:compartmentAlias> +<celldesigner:compartmentAlias id="ca1" compartment="nuc"> +<celldesigner:class>SQUARE</celldesigner:class> +<celldesigner:bounds x="82.0" y="386.0" w="370.0" h="159.0"/> +<celldesigner:namePoint x="172.5" y="491.5"/> +<celldesigner:doubleLine thickness="12.0" outerWidth="2.0" innerWidth="1.0"/> +<celldesigner:paint color="ffcccc00" scheme="Color"/> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:compartmentAlias> +</celldesigner:listOfCompartmentAliases> +<celldesigner:listOfComplexSpeciesAliases/> +<celldesigner:listOfSpeciesAliases> +<celldesigner:speciesAlias id="sa0" species="STAT5A" compartmentAlias="ca0"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="291.0" y="33.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="266.0" y="28.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa1" species="STAT5B" compartmentAlias="ca0"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="134.0" y="29.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="109.0" y="24.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa2" species="pApB" compartmentAlias="ca0"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="221.0" y="158.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="196.0" y="153.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa3" species="pApA" compartmentAlias="ca0"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="368.0" y="156.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="343.0" y="151.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa4" species="pBpB" compartmentAlias="ca0"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="70.0" y="160.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="45.0" y="155.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa5" species="nucpApA" compartmentAlias="ca1"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="332.0" y="444.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="250.0" y="58.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa6" species="nucpApB" compartmentAlias="ca1"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="220.0" y="443.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="138.0" y="57.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +<celldesigner:speciesAlias id="sa7" species="nucpBpB" compartmentAlias="ca1"> +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="117.0" y="445.0" w="80.0" h="40.0"/> +<celldesigner:font size="12"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView> +<celldesigner:innerPosition x="35.0" y="59.0"/> +<celldesigner:boxSize width="80.0" height="40.0"/> +<celldesigner:singleLine width="1.0"/> +<celldesigner:paint color="ffccffcc" scheme="Color"/> +</celldesigner:usualView> +<celldesigner:briefView> +<celldesigner:innerPosition x="0.0" y="0.0"/> +<celldesigner:boxSize width="80.0" height="60.0"/> +<celldesigner:singleLine width="0.0"/> +<celldesigner:paint color="3fff0000" scheme="Color"/> +</celldesigner:briefView> +<celldesigner:info state="empty" angle="-1.5707963267948966"/> +</celldesigner:speciesAlias> +</celldesigner:listOfSpeciesAliases> +<celldesigner:listOfGroups/> +<celldesigner:listOfProteins> +<celldesigner:protein id="pr1" name="STAT5A" type="GENERIC"/> +<celldesigner:protein id="pr2" name="STAT5B" type="GENERIC"/> +<celldesigner:protein id="pr3" name="pApB" type="GENERIC"/> +<celldesigner:protein id="pr4" name="pApA" type="GENERIC"/> +<celldesigner:protein id="pr5" name="pBpB" type="GENERIC"/> +<celldesigner:protein id="pr6" name="nucpApA" type="GENERIC"/> +<celldesigner:protein id="pr7" name="nucpApB" type="GENERIC"/> +<celldesigner:protein id="pr8" name="nucpBpB" type="GENERIC"/> +</celldesigner:listOfProteins> +<celldesigner:listOfGenes/> +<celldesigner:listOfRNAs/> +<celldesigner:listOfAntisenseRNAs/> +<celldesigner:listOfLayers/> +<celldesigner:listOfBlockDiagrams/> +</celldesigner:extension> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/" xmlns:bqmodel="http://biomodels.net/model-qualifiers/"> +<rdf:Description rdf:about="#Boehm_JProteomeRes2014"> +<dc:creator> +<rdf:Bag> +<rdf:li rdf:parseType="Resource"> +<vCard:N rdf:parseType="Resource"> +<vCard:Family>Boehm</vCard:Family> +<vCard:Given>Martin</vCard:Given> +</vCard:N> +</rdf:li> +</rdf:Bag> +</dc:creator> +<dcterms:created rdf:parseType="Resource"> +<dcterms:W3CDTF>2019-11-29T09:41:48Z</dcterms:W3CDTF> +</dcterms:created> +<dcterms:modified rdf:parseType="Resource"> +<dcterms:W3CDTF>2019-11-29T09:41:48Z</dcterms:W3CDTF> +</dcterms:modified> +<bqbiol:isDescribedBy> +<rdf:Bag> +<rdf:li rdf:resource="http://identifiers.org/doi/10.1021%2Fpr5006923"/> +</rdf:Bag> +</bqbiol:isDescribedBy> +</rdf:Description> +</rdf:RDF> +</annotation> +<listOfUnitDefinitions> +<unitDefinition metaid="time" id="time" name="time"> +<listOfUnits> +<unit metaid="CDMT00030" kind="second" multiplier="60"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="substance" id="substance" name="substance"> +<listOfUnits> +<unit metaid="CDMT00031" kind="mole"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="volume" id="volume" name="volume"> +<listOfUnits> +<unit metaid="CDMT00032" kind="litre"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="area" id="area" name="area"> +<listOfUnits> +<unit metaid="CDMT00033" kind="metre" exponent="2"/> +</listOfUnits> +</unitDefinition> +<unitDefinition metaid="length" id="length" name="length"> +<listOfUnits> +<unit metaid="CDMT00034" kind="metre"/> +</listOfUnits> +</unitDefinition> +</listOfUnitDefinitions> +<listOfCompartments> +<compartment metaid="default" id="default" size="1" units="volume"/> +<compartment metaid="cyt" id="cyt" name="cyt" size="1.4" units="volume" outside="default"> +<annotation> +<celldesigner:extension> +<celldesigner:name>cyt</celldesigner:name> +</celldesigner:extension> +</annotation> +</compartment> +<compartment metaid="nuc" id="nuc" name="nuc" size="0.45" units="volume" outside="default"> +<annotation> +<celldesigner:extension> +<celldesigner:name>nuc</celldesigner:name> +</celldesigner:extension> +</annotation> +</compartment> +</listOfCompartments> +<listOfSpecies> +<species metaid="STAT5A" id="STAT5A" name="STAT5A" compartment="cyt" initialConcentration="1"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr1</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="STAT5B" id="STAT5B" name="STAT5B" compartment="cyt" initialConcentration="1"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr2</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="pApB" id="pApB" name="pApB" compartment="cyt" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr3</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="pApA" id="pApA" name="pApA" compartment="cyt" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr4</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="pBpB" id="pBpB" name="pBpB" compartment="cyt" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr5</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="nucpApA" id="nucpApA" name="nucpApA" compartment="nuc" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr6</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="nucpApB" id="nucpApB" name="nucpApB" compartment="nuc" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr7</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +<species metaid="nucpBpB" id="nucpBpB" name="nucpBpB" compartment="nuc" initialConcentration="0"> +<annotation> +<celldesigner:extension> +<celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment> +<celldesigner:speciesIdentity> +<celldesigner:class>PROTEIN</celldesigner:class> +<celldesigner:proteinReference>pr8</celldesigner:proteinReference> +</celldesigner:speciesIdentity> +</celldesigner:extension> +</annotation> +</species> +</listOfSpecies> +<listOfParameters> +<parameter metaid="Epo_degradation_BaF3" id="Epo_degradation_BaF3" value="0.0269738286367359"/> +<parameter metaid="k_exp_hetero" id="k_exp_hetero" value="1.00094251286741e-05"/> +<parameter metaid="k_exp_homo" id="k_exp_homo" value="0.00617193081581346"/> +<parameter metaid="k_imp_hetero" id="k_imp_hetero" value="0.0163708512310568"/> +<parameter metaid="k_imp_homo" id="k_imp_homo" value="96945.5391768823"/> +<parameter metaid="k_phos" id="k_phos" value="15766.8336642826"/> +<parameter metaid="ratio" id="ratio" value="0.693"/> +<parameter metaid="BaF3_Epo" id="BaF3_Epo" value="1.25e-07" constant="false"/> +<parameter metaid="Epo_concentration" id="Epo_concentration" value="1.25e-07"/> +</listOfParameters> +<listOfInitialAssignments> +<initialAssignment metaid="CDMT00036" symbol="STAT5A"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<cn> 207.6 </cn> +<ci> ratio </ci> +</apply> +</math> +</initialAssignment> +<initialAssignment metaid="CDMT00037" symbol="STAT5B"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<minus/> +<cn> 207.6 </cn> +<apply> +<times/> +<cn> 207.6 </cn> +<ci> ratio </ci> +</apply> +</apply> +</math> +</initialAssignment> +</listOfInitialAssignments> +<listOfRules> +<assignmentRule metaid="CDMT00035" variable="BaF3_Epo"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> Epo_concentration </ci> +<apply> +<exp/> +<apply> +<times/> +<cn type="integer"> -1 </cn> +<ci> Epo_degradation_BaF3 </ci> +<csymbol encoding="text" definitionURL="http://www.sbml.org/sbml/symbols/time"> t </csymbol> +</apply> +</apply> +</apply> +</math> +</assignmentRule> +</listOfRules> +<listOfReactions> +<reaction metaid="v1_v_0" id="v1_v_0" name="v_0" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_0</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="STAT5A" alias="sa0"> +<celldesigner:linkAnchor position="SE"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="pApA" alias="sa3"> +<celldesigner:linkAnchor position="N"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.5609411764706067,-0.05576470588234628 0.5465882352941343,-0.05035294117646183</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00001" species="STAT5A" stoichiometry="2"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa0</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00002" species="pApA"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa3</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00003"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> BaF3_Epo </ci> +<apply> +<power/> +<ci> STAT5A </ci> +<cn type="integer"> 2 </cn> +</apply> +<ci> k_phos </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v2_v_1" id="v2_v_1" name="v_1" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_1</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="STAT5A" alias="sa0"> +<celldesigner:linkAnchor position="S"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="pApB" alias="sa2"> +<celldesigner:linkAnchor position="N"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:listOfReactantLinks> +<celldesigner:reactantLink reactant="STAT5B" alias="sa1" targetLineIndex="-1,0"> +<celldesigner:linkAnchor position="SSE"/> +<celldesigner:connectScheme connectPolicy="direct"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:line width="1.0" color="ff000000" type="Straight"/> +</celldesigner:reactantLink> +</celldesigner:listOfReactantLinks> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.6321649484536196,0.2676288659793671 0.6321649484536201,0.26762886597936486</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00004" species="STAT5A"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa0</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +<speciesReference metaid="CDMT00005" species="STAT5B"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa1</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00006" species="pApB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa2</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00007"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> BaF3_Epo </ci> +<ci> STAT5A </ci> +<ci> STAT5B </ci> +<ci> k_phos </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v3_v_2" id="v3_v_2" name="v_2" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_2</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="STAT5B" alias="sa1"> +<celldesigner:linkAnchor position="SW"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="pBpB" alias="sa4"> +<celldesigner:linkAnchor position="N"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.36714710089118635,-0.0888986687204314 0.3827703817801735,-0.0714049950489617</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00008" species="STAT5B" stoichiometry="2"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa1</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00009" species="pBpB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa4</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00010"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> BaF3_Epo </ci> +<apply> +<power/> +<ci> STAT5B </ci> +<cn type="integer"> 2 </cn> +</apply> +<ci> k_phos </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v4_v_3" id="v4_v_3" name="v_3" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_3</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="pApA" alias="sa3"> +<celldesigner:linkAnchor position="SSW"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="nucpApA" alias="sa5"> +<celldesigner:linkAnchor position="NNE"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.37074122236670604,0.014044213263978422 0.3747724317295146,0.014109232769831781</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00011" species="pApA"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa3</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00012" species="nucpApA"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa5</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00013"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> k_imp_homo </ci> +<ci> pApA </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v5_v_4" id="v5_v_4" name="v_4" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_4</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="pApB" alias="sa2"> +<celldesigner:linkAnchor position="S"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="nucpApB" alias="sa6"> +<celldesigner:linkAnchor position="NNW"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.3772864088909451,0.02072238944200011 0.3783283167399847,0.03287798101412309</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00014" species="pApB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa2</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00015" species="nucpApB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa6</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00016"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> k_imp_hetero </ci> +<ci> pApB </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v6_v_5" id="v6_v_5" name="v_5" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_5</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="pBpB" alias="sa4"> +<celldesigner:linkAnchor position="SSE"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="nucpBpB" alias="sa7"> +<celldesigner:linkAnchor position="NW"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.36583388023292884,-0.04826914218449008 0.3656360562962322,-0.05232453288676531</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00017" species="pBpB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa4</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00018" species="nucpBpB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa7</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00019"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> cyt </ci> +<ci> k_imp_homo </ci> +<ci> pBpB </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v7_v_6" id="v7_v_6" name="v_6" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_6</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="nucpApA" alias="sa5"> +<celldesigner:linkAnchor position="N"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="STAT5A" alias="sa0"> +<celldesigner:linkAnchor position="SSE"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.42309642096725086,-0.04613200851668042 0.42294433742269166,-0.043445199229445786</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00020" species="nucpApA"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa5</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00021" species="STAT5A" stoichiometry="2"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa0</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00022"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> nuc </ci> +<ci> k_exp_homo </ci> +<ci> nucpApA </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v8_v_7" id="v8_v_7" name="v_7" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_7</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="nucpApB" alias="sa6"> +<celldesigner:linkAnchor position="NNE"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="STAT5A" alias="sa0"> +<celldesigner:linkAnchor position="S"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:listOfProductLinks> +<celldesigner:productLink product="STAT5B" alias="sa1" targetLineIndex="-1,1"> +<celldesigner:linkAnchor position="S"/> +<celldesigner:connectScheme connectPolicy="direct"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:line width="1.0" color="ff000000" type="Straight"/> +</celldesigner:productLink> +</celldesigner:listOfProductLinks> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.4044343768145028,-0.08547608977713395 0.4040687880373607,-0.08812840051325599</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00023" species="nucpApB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa6</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00024" species="STAT5A"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa0</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +<speciesReference metaid="CDMT00025" species="STAT5B"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa1</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00026"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> nuc </ci> +<ci> k_exp_hetero </ci> +<ci> nucpApB </ci> +</apply> +</math> +</kineticLaw> +</reaction> +<reaction metaid="v9_v_8" id="v9_v_8" name="v_8" reversible="false"> +<annotation> +<celldesigner:extension> +<celldesigner:name>v_8</celldesigner:name> +<celldesigner:reactionType>STATE_TRANSITION</celldesigner:reactionType> +<celldesigner:baseReactants> +<celldesigner:baseReactant species="nucpBpB" alias="sa7"> +<celldesigner:linkAnchor position="N"/> +</celldesigner:baseReactant> +</celldesigner:baseReactants> +<celldesigner:baseProducts> +<celldesigner:baseProduct species="STAT5B" alias="sa1"> +<celldesigner:linkAnchor position="SSW"/> +</celldesigner:baseProduct> +</celldesigner:baseProducts> +<celldesigner:connectScheme connectPolicy="direct" rectangleIndex="1"> +<celldesigner:listOfLineDirection> +<celldesigner:lineDirection index="0" value="unknown"/> +<celldesigner:lineDirection index="1" value="unknown"/> +<celldesigner:lineDirection index="2" value="unknown"/> +</celldesigner:listOfLineDirection> +</celldesigner:connectScheme> +<celldesigner:editPoints>0.40734860977669074,0.04620113207783233 0.40739104709323737,0.04088232173727302</celldesigner:editPoints> +<celldesigner:line width="1.0" color="ff000000"/> +</celldesigner:extension> +</annotation> +<listOfReactants> +<speciesReference metaid="CDMT00027" species="nucpBpB"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa7</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfReactants> +<listOfProducts> +<speciesReference metaid="CDMT00028" species="STAT5B" stoichiometry="2"> +<annotation> +<celldesigner:extension> +<celldesigner:alias>sa1</celldesigner:alias> +</celldesigner:extension> +</annotation> +</speciesReference> +</listOfProducts> +<kineticLaw metaid="CDMT00029"> +<math xmlns="http://www.w3.org/1998/Math/MathML"> +<apply> +<times/> +<ci> nuc </ci> +<ci> k_exp_homo </ci> +<ci> nucpBpB </ci> +</apply> +</math> +</kineticLaw> +</reaction> +</listOfReactions> +</model> +</sbml> diff --git a/doc/tutorial/observables.tsv b/doc/tutorial/observables.tsv new file mode 100644 index 00000000..2980df71 --- /dev/null +++ b/doc/tutorial/observables.tsv @@ -0,0 +1,4 @@ +observableId observableFormula noiseFormula observableTransformation noiseDistribution +pSTAT5A_rel (100 * pApB + 200 * pApA * specC17) / (pApB + STAT5A * specC17 + 2 * pApA * specC17) noiseParameter1_pSTAT5A_rel lin normal +pSTAT5B_rel -(100 * pApB - 200 * pBpB * (specC17 - 1)) / ((STAT5B * (specC17 - 1) - pApB) + 2 * pBpB * (specC17 - 1)) noiseParameter1_pSTAT5B_rel lin normal +rSTAT5A_rel (100 * pApB + 100 * STAT5A * specC17 + 200 * pApA * specC17) / (2 * pApB + STAT5A * specC17 + 2 * pApA * specC17 - STAT5B * (specC17 - 1) - 2 * pBpB * (specC17 - 1)) noiseParameter1_rSTAT5A_rel lin normal diff --git a/doc/tutorial/parameters.tsv b/doc/tutorial/parameters.tsv new file mode 100644 index 00000000..d8611982 --- /dev/null +++ b/doc/tutorial/parameters.tsv @@ -0,0 +1,12 @@ +parameterId parameterName parameterScale lowerBound upperBound nominalValue estimate +Epo_degradation_BaF3 EPO_{degradation,BaF3} log10 1E-05 100000 1 +k_exp_hetero k_{exp,hetero} log10 1E-05 100000 1 +k_exp_homo k_{exp,homo} log10 1E-05 100000 1 +k_imp_hetero k_{imp,hetero} log10 1E-05 100000 1 +k_imp_homo k_{imp,homo} log10 1E-05 100000 1 +k_phos k_{phos} log10 1E-05 100000 1 +ratio ratio lin 0.693 0 +sd_pSTAT5A_rel \sigma_{pSTAT5A,rel} log10 1E-05 100000 1 +sd_pSTAT5B_rel \sigma_{pSTAT5B,rel} log10 1E-05 100000 1 +sd_rSTAT5A_rel \sigma_{rSTAT5A,rel} log10 1E-05 100000 1 +specC17 specC17 lin 0.107 0 diff --git a/doc/tutorial/visualization_specification.tsv b/doc/tutorial/visualization_specification.tsv new file mode 100644 index 00000000..c281ae69 --- /dev/null +++ b/doc/tutorial/visualization_specification.tsv @@ -0,0 +1,4 @@ +plotId plotName plotTypeData xLabel yValues yLabel +plot1 pSTAT5A_rel MeanAndSD Time [min] pSTAT5A_rel Rel. STAT5A phosphorylation [%] +plot2 pSTAT5B_rel MeanAndSD Time [min] pSTAT5B_rel Rel. STAT5B phosphorylation [%] +plot3 rSTAT5A_rel MeanAndSD Time [min] rSTAT5A_rel Rel. STAT5A abundance [%] From 607c0caeacb0709756d2d2667218ea7247655724 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Fri, 20 Nov 2020 14:57:34 +0100 Subject: [PATCH 02/17] Update tutorial (#489) * Prettify reaction arrows * added Erikas comments * Simons comments * Highlight URLs in pdf * chmod +x compile_tutorial.sh * rewrap, typo Co-authored-by: LeonardSchmiester <leonard.schmiester@helmholtz-muenchen.de> --- doc/compile_tutorial.sh | 1 + doc/tutorial.rst | 38 ++++++++++++++++++-------------------- 2 files changed, 19 insertions(+), 20 deletions(-) mode change 100644 => 100755 doc/compile_tutorial.sh diff --git a/doc/compile_tutorial.sh b/doc/compile_tutorial.sh old mode 100644 new mode 100755 index e0972310..1d3040f8 --- a/doc/compile_tutorial.sh +++ b/doc/compile_tutorial.sh @@ -5,5 +5,6 @@ pandoc tutorial.rst \ -o tutorial.pdf \ -V geometry:margin=1.5in -V geometry:a4paper -V fontsize=10pt \ + -V urlcolor=cyan \ --toc \ --pdf-engine pdflatex diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 50f80ebb..4b4781a8 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -44,15 +44,15 @@ tutorial is available `online <https://github.com/PEtab-dev/PEtab/tree/b50d000a5 == ========================== ============================================= ID Reaction Rate law == ========================== ============================================= - R1 2 STAT5A -> pApA cyt \* BaF3_Epo \* STAT5A^2 \* k_phos - R2 STAT5A + STAT5B -> pApB cyt \* BaF3_Epo \* STAT5A \* STAT5B \* k_phos - R3 2 STAT5B -> pBpB cyt \* BaF3_Epo \* STAT5B^2 \* k_phos - R4 pApA -> nucpApA cyt \* k_imp_homo \* pApA - R5 pApB -> nucpApB cyt \* k_imp_hetero \* pApB - R6 pBpB -> nucpBpB cyt \* k_imp_homo \* pBpB - R7 nucpApA -> 2 STAT5A nuc \* k_exp_homo \* nucpApA - R8 nucpApB -> STAT5A + STAT5B nuc \* k_exp_hetero \* nucpApB - R9 nucpBpB -> 2 STAT5B nuc \* k_exp_homo \* nucpBpB + R1 2 STAT5A → pApA cyt \* BaF3_Epo \* STAT5A^2 \* k_phos + R2 STAT5A + STAT5B → pApB cyt \* BaF3_Epo \* STAT5A \* STAT5B \* k_phos + R3 2 STAT5B → pBpB cyt \* BaF3_Epo \* STAT5B^2 \* k_phos + R4 pApA → nucpApA cyt \* k_imp_homo \* pApA + R5 pApB → nucpApB cyt \* k_imp_hetero \* pApB + R6 pBpB → nucpBpB cyt \* k_imp_homo \* pBpB + R7 nucpApA → 2 STAT5A nuc \* k_exp_homo \* nucpApA + R8 nucpApB → STAT5A + STAT5B nuc \* k_exp_hetero \* nucpApB + R9 nucpBpB → 2 STAT5B nuc \* k_exp_homo \* nucpBpB == ========================== ============================================= 2. Linking model and measurements @@ -79,7 +79,7 @@ experimental conditions under which a measurement was performed. 2.1 Specifying experimental conditions -------------------------------------- -The measurements were collected under the same experimental condition, +All measurements were collected under the same experimental condition, which is a stimulation with Epo. This is specified in the experimental condition PEtab file, a tab-separated values (TSV) file\ [#f1]_, by providing a condition identifier and listing all condition-specific @@ -87,13 +87,14 @@ parameters and their respective values. In the problem considered here, the relevant parameter is ``Epo_concentration`` which we want to set to a value of 1.25E-7, as the -only condition-specific parameter. In our example we include data from -only one single experiment, so we would not need to specify it here, but -could set the value in the model or in the parameter table. However, -having it would allow us to easily add measurements from other +only condition-specific parameter. Since in this example we include data from +only one single experiment, it would not be necessary to specify the condition +parameter here, but instead the value could have been also set in the model or +in the parameter table. However, the benefit of specifying it in the condition +table is, that it allows us to easily add measurements from other experiments performed with different Epo concentrations later on. -The condition table would look as follows: +The condition table looks as follows: .. table:: Conditions table ``experimental_conditions.tsv``. @@ -189,16 +190,13 @@ file: containing any form of STAT5A. * *noiseFormula* is used to describe the formula for the measurement - noise. Together with *noiseDistribution*\ it defines the noise model. In - this example, we assume additive normally distributed measurement noise. + noise. Together with *noiseDistribution*, it defines the noise model. In + this example, we assume additive, normally distributed measurement noise. In this scenario, ``noiseParameter1_{observableId}`` is the standard deviation of the measurement noise. Parameters following this naming scheme are expected to be overridden in a measurement-specific manner in the *noiseParameters* column of the measurement table (see below). -* *observableTransformation* defines the scale in which model observable - and measurement data are compared. Here, we assume a linear scale. Other - transformations, such as log10 can also be used. 2.3 Specifying measurements --------------------------- From 26878419d4aabb55c29093ba5a8b461c05fb5f2c Mon Sep 17 00:00:00 2001 From: Daniel Weindl <daniel.weindl@helmholtz-muenchen.de> Date: Fri, 20 Nov 2020 15:03:34 +0100 Subject: [PATCH 03/17] Bump version number, update changelog --- CHANGELOG.md | 11 ++++++++++- petab/version.py | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ea1d559..4cf665e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ ## 0.1 series +### 0.1.12 + +* Documentation update: + * Added SBML2Julia to list of tools supporting PEtab + * Extended PEtab introduction + * Tutorial for creating PEtab files +* Minor fix: Default argument for optional 'model' parameter in + `petab.lint.check_condition_df`` (#477) + ### 0.1.11 * Function for generating synthetic data (#472) @@ -9,7 +18,7 @@ ### 0.1.10 -*Fixed deployment setup, no further changes.* +* Fixed deployment setup, no further changes.* ### 0.1.9 diff --git a/petab/version.py b/petab/version.py index 92acd911..f9bc76b2 100644 --- a/petab/version.py +++ b/petab/version.py @@ -1,2 +1,2 @@ """PEtab library version""" -__version__ = '0.1.11' +__version__ = '0.1.12' From 1f6495f819079cb134e4a81d34dc7afb808b0eb9 Mon Sep 17 00:00:00 2001 From: Dilan Pathirana <59329744+dilpath@users.noreply.github.com> Date: Fri, 1 Jan 2021 17:15:16 +0100 Subject: [PATCH 04/17] fix for pandas 1.2.0 (#493) * fix for pandas 1.2.0 -- use `get_handle` instead of `get_filepath_or_buffer` * fix erroneous petab_test_suite symlink --- petab/sbml.py | 14 +++----------- petab/yaml.py | 11 +++-------- setup.py | 2 +- tests/test_petab.py | 2 +- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/petab/sbml.py b/petab/sbml.py index 07fa1831..7ba26e6d 100644 --- a/petab/sbml.py +++ b/petab/sbml.py @@ -1,6 +1,7 @@ """Functions for interacting with SBML models""" from warnings import warn import logging +from pandas.io.common import get_handle, is_url, is_file_like import re from typing import Dict, Any, List, Union, Tuple import libsbml @@ -416,19 +417,10 @@ def get_sbml_model( File or URL or file handle to read the model from :return: The SBML document, model and reader """ - - from pandas.io.common import get_filepath_or_buffer, is_url, is_file_like - if is_file_like(filepath_or_buffer) or is_url(filepath_or_buffer): - buffer = get_filepath_or_buffer(filepath_or_buffer, mode='r')[0] - if is_url(filepath_or_buffer): - buffer = ''.join(line.decode('utf-8') for line in buffer) - else: - buffer = ''.join(line for line in buffer) - + handle = get_handle(filepath_or_buffer, mode='r').handle # URL or already opened file, we will load the model from a string - - return load_sbml_from_string(buffer) + return load_sbml_from_string(''.join(handle)) return load_sbml_from_file(filepath_or_buffer) diff --git a/petab/yaml.py b/petab/yaml.py index dd1c7862..0b892d2e 100644 --- a/petab/yaml.py +++ b/petab/yaml.py @@ -6,7 +6,7 @@ import jsonschema import numpy as np import yaml -from pandas.io.common import get_filepath_or_buffer +from pandas.io.common import get_handle from .C import * # noqa: F403 @@ -123,13 +123,8 @@ def load_yaml(yaml_config: Union[Dict, str]) -> Dict: if isinstance(yaml_config, dict): return yaml_config - filepath_or_buffer = get_filepath_or_buffer(yaml_config, mode='r')[0] - if isinstance(filepath_or_buffer, str): - # a filename - with open(filepath_or_buffer, 'r') as f: - return yaml.safe_load(f) - # a stream - return yaml.safe_load(filepath_or_buffer) + handle = get_handle(yaml_config, mode='r').handle + return yaml.safe_load(handle) def is_composite_problem(yaml_config: Union[Dict, str]) -> bool: diff --git a/setup.py b/setup.py index 768f64c7..3c3c5720 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ def absolute_links(txt): url='https://github.com/PEtab-dev/PEtab', packages=find_packages(exclude=['doc*', 'test*']), install_requires=['numpy>=1.15.1', - 'pandas>=1.0.1', + 'pandas>=1.2.0', 'matplotlib>=2.2.3', 'python-libsbml>=5.17.0', 'sympy', diff --git a/tests/test_petab.py b/tests/test_petab.py index 8a0e25a2..c4bdb987 100644 --- a/tests/test_petab.py +++ b/tests/test_petab.py @@ -545,7 +545,7 @@ def test_load_remote(): """Test loading remote files""" yaml_url = "https://raw.githubusercontent.com/PEtab-dev/petab_test_suite" \ - "/master/cases/0001/_0001.yaml" + "/master/petabtests/cases/0001/_0001.yaml" petab_problem = petab.Problem.from_yaml(yaml_url) assert petab_problem.sbml_model is not None From 15ba85bc88b658a40b2d135a67094922cbb52155 Mon Sep 17 00:00:00 2001 From: yannikschaelte <yannik.schaelte@gmail.com> Date: Sat, 2 Jan 2021 00:13:42 +0100 Subject: [PATCH 05/17] update releasenotes; version 0.1.13 --- CHANGELOG.md | 5 +++++ petab/version.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf665e6..bb8e3e6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## 0.1 series +### 0.1.13 + +* Fix for pandas 1.2.0 -- use `get_handle` instead of `get_filepath_or_buffer` +* Fix erroneous `petab_test_suite symlink` (all #493) + ### 0.1.12 * Documentation update: diff --git a/petab/version.py b/petab/version.py index f9bc76b2..b4899387 100644 --- a/petab/version.py +++ b/petab/version.py @@ -1,2 +1,2 @@ """PEtab library version""" -__version__ = '0.1.12' +__version__ = '0.1.13' From 75a1aed398fae9af2d0d8a06b9e7a682fa08ba35 Mon Sep 17 00:00:00 2001 From: yannikschaelte <yannik.schaelte@gmail.com> Date: Sat, 2 Jan 2021 09:14:06 +0100 Subject: [PATCH 06/17] fix typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb8e3e6d..b8458973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ ### 0.1.13 * Fix for pandas 1.2.0 -- use `get_handle` instead of `get_filepath_or_buffer` -* Fix erroneous `petab_test_suite symlink` (all #493) +* Fix erroneous `petab_test_suite` symlink (all #493) ### 0.1.12 From 59c42169da55c6db2b26c957bd0497862f62b6ad Mon Sep 17 00:00:00 2001 From: Jakob Vanhoefer <38346459+jvanhoefer@users.noreply.github.com> Date: Mon, 11 Jan 2021 16:53:57 +0100 Subject: [PATCH 07/17] fix ParameterScale sampler fixes #491 (#492) * fix ParameterScaleUniform * trafo in get_priors_from_df * clarify documentation --- doc/documentation_data_format.rst | 3 +++ petab/parameters.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/documentation_data_format.rst b/doc/documentation_data_format.rst index 1096f929..76b088ad 100644 --- a/doc/documentation_data_format.rst +++ b/doc/documentation_data_format.rst @@ -537,6 +537,9 @@ Detailed field description Prior parameters used for sampling of initial points for optimization, separated by a semicolon. Defaults to ``lowerBound;upperBound``. + The parameters are expected to be in linear scale except for the + ``parameterScale`` priors, where the prior parameters are expected to be + in parameter scale. So far, only numeric values will be supported, no parameter names. Parameters for the different prior types are: diff --git a/petab/parameters.py b/petab/parameters.py index d1213d18..e5466777 100644 --- a/petab/parameters.py +++ b/petab/parameters.py @@ -343,7 +343,8 @@ def get_priors_from_df(parameter_df: pd.DataFrame, # if no prior is specified, we assume a non-informative (uniform) one if prior_type == 'nan': prior_type = PARAMETER_SCALE_UNIFORM - prior_pars = (row[LOWER_BOUND], row[UPPER_BOUND]) + prior_pars = (scale(row[LOWER_BOUND], par_scale), + scale(row[UPPER_BOUND], par_scale)) prior_list.append((prior_type, prior_pars, par_scale, par_bounds)) From 132e71f9025b6d5563fddb6aedf958351e94c824 Mon Sep 17 00:00:00 2001 From: Jakob Vanhoefer <jakob.vanhoefer@uni-bonn.de> Date: Mon, 11 Jan 2021 17:13:46 +0100 Subject: [PATCH 08/17] prepare new version --- CHANGELOG.md | 5 +++++ petab/version.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8458973..0cd8b08c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## 0.1 series +### 0.1.14 + +* Fix sampling of priors in `parameterScale` (#492) +* Clarify documentation of `parameterScale` priors + ### 0.1.13 * Fix for pandas 1.2.0 -- use `get_handle` instead of `get_filepath_or_buffer` diff --git a/petab/version.py b/petab/version.py index b4899387..97969e6a 100644 --- a/petab/version.py +++ b/petab/version.py @@ -1,2 +1,2 @@ """PEtab library version""" -__version__ = '0.1.13' +__version__ = '0.1.14' From 10210c7e6f7b9714468b6933e46e3f47ae6619f7 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <daniel.weindl@helmholtz-muenchen.de> Date: Mon, 11 Jan 2021 23:31:29 +0100 Subject: [PATCH 09/17] Fix petab.simulate (#479) Default noise distribution wasn't handled in some cases Add option to ensure synthetic data is non-negative (can become negative after noise is added) * fix default noise distribution * switch to pandas isna * Return negative values by default. * change non-negative argument to zero-bounded * docs, set random seed Co-authored-by: dilpath <59329744+dilpath@users.noreply.github.com> Co-authored-by: Daniel Weindl <dweindl@users.noreply.github.com> --- petab/simulate.py | 60 +++++++++++++++++++++++-------- tests/test_simulate.py | 80 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 115 insertions(+), 25 deletions(-) diff --git a/petab/simulate.py b/petab/simulate.py index 69ad18df..c657c11a 100644 --- a/petab/simulate.py +++ b/petab/simulate.py @@ -1,3 +1,5 @@ +"""PEtab simulator base class and related functions.""" + import abc import numpy as np import pathlib @@ -10,8 +12,8 @@ class Simulator(abc.ABC): - """ - Base class that specific simulators should inherit. + """Base class that specific simulators should inherit. + Specific simulators should minimally implement the `simulate_without_noise` method. Example (AMICI): https://bit.ly/33SUSG4 @@ -32,10 +34,14 @@ class Simulator(abc.ABC): directory and its contents may be modified and deleted, and should be considered ephemeral. """ - def __init__(self, - petab_problem: petab.Problem, - working_dir: Optional[Union[pathlib.Path, str]] = None): - """ + + def __init__( + self, + petab_problem: petab.Problem, + working_dir: Optional[Union[pathlib.Path, str]] = None, + ): + """Initialize the simulator. + Initialize the simulator with sufficient information to perform a simulation. If no working directory is specified, a temporary one is created. @@ -64,14 +70,16 @@ def __init__(self, self.rng = np.random.default_rng() def remove_working_dir(self, force: bool = False, **kwargs) -> None: - """ - Remove the simulator working directory and all files within (see the - `__init__` method arguments). + """Remove the simulator working directory, and all files within. + + See the `__init__` method arguments. Arguments: force: If True, the working directory is removed regardless of whether it is a temporary directory. + **kwargs: + Additional keyword arguments are passed to `shutil.rmtree`. """ if force or self.temporary_working_dir: shutil.rmtree(self.working_dir, **kwargs) @@ -85,10 +93,10 @@ def remove_working_dir(self, force: bool = False, **kwargs) -> None: @abc.abstractmethod def simulate_without_noise(self) -> pd.DataFrame: - """ - Simulate a PEtab problem. This is an abstract method that should be - implemented in a simulation package. Links to examples of this are in - the class docstring. + """Simulate the PEtab problem. + + This is an abstract method that should be implemented with a simulation + package. Examples of this are referenced in the class docstring. Returns: Simulated data, as a PEtab measurements table, which should be @@ -96,6 +104,7 @@ def simulate_without_noise(self) -> pd.DataFrame: column of the measurements table (of the PEtab problem supplied to the `__init__` method), with simulated values. """ + raise NotImplementedError def simulate( self, @@ -109,6 +118,9 @@ def simulate( noise: If True, noise is added to simulated data. noise_scaling_factor: A multiplier of the scale of the noise distribution. + **kwargs: + Additional keyword arguments are passed to + `simulate_without_noise`. Returns: Simulated data, as a PEtab measurements table. @@ -122,6 +134,7 @@ def add_noise( self, simulation_df: pd.DataFrame, noise_scaling_factor: float = 1, + **kwargs ) -> pd.DataFrame: """Add noise to simulated data. @@ -130,6 +143,8 @@ def add_noise( A PEtab measurements table that contains simulated data. noise_scaling_factor: A multiplier of the scale of the noise distribution. + **kwargs: + Additional keyword arguments are passed to `sample_noise`. Returns: Simulated data with noise, as a PEtab measurements table. @@ -143,6 +158,7 @@ def add_noise( self.noise_formulas, self.rng, noise_scaling_factor, + **kwargs, ) for _, row in simulation_df_with_noise.iterrows() ] @@ -156,6 +172,7 @@ def sample_noise( noise_formulas: Optional[Dict[str, sp.Expr]] = None, rng: Optional[np.random.Generator] = None, noise_scaling_factor: float = 1, + zero_bounded: bool = False, ) -> float: """Generate a sample from a PEtab noise distribution. @@ -176,6 +193,10 @@ def sample_noise( A NumPy random generator. noise_scaling_factor: A multiplier of the scale of the noise distribution. + zero_bounded: + Return zero if the sign of the return value and `simulated_value` + differ. Can be used to ensure non-negative and non-positive values, + if the sign of `simulated_value` should not change. Returns: The sample from the PEtab noise distribution. @@ -200,9 +221,20 @@ def sample_noise( .loc[measurement_row[petab.C.OBSERVABLE_ID]] .get(petab.C.NOISE_DISTRIBUTION, petab.C.NORMAL) ) + # an empty noise distribution column in an observables table can result in + # `noise_distribution == float('nan')` + if pd.isna(noise_distribution): + noise_distribution = petab.C.NORMAL # below is e.g.: `np.random.normal(loc=simulation, scale=noise_value)` - return getattr(rng, noise_distribution)( + simulated_value_with_noise = getattr(rng, noise_distribution)( loc=simulated_value, scale=noise_value * noise_scaling_factor ) + + if ( + zero_bounded and + np.sign(simulated_value) != np.sign(simulated_value_with_noise) + ): + return 0.0 + return simulated_value_with_noise diff --git a/tests/test_simulate.py b/tests/test_simulate.py index 34dd8b32..a80cccfa 100644 --- a/tests/test_simulate.py +++ b/tests/test_simulate.py @@ -65,15 +65,67 @@ def test_remove_working_dir(petab_problem): assert not pathlib.Path(simulator.working_dir).is_dir() +def test_zero_bounded(petab_problem): + """Test `zero_bounded` argument of `sample_noise`.""" + positive = np.spacing(1) + negative = -positive + + simulator = TestSimulator(petab_problem) + # Set the random seed to ensure predictable tests. + simulator.rng = np.random.default_rng(seed=0) + + # Set approximately half of the measurements to negative values, and the + # rest to positive values. + n_measurements = len(petab_problem.measurement_df) + neg_indices = range(round(n_measurements / 2)) + pos_indices = range(len(neg_indices), n_measurements) + measurements = [ + negative if index in neg_indices else + (positive if index in pos_indices else np.nan) + for index in range(n_measurements) + ] + synthetic_data_df = simulator.simulate().assign(**{ + petab.C.MEASUREMENT: measurements + }) + # All measurements are non-zero + assert (synthetic_data_df['measurement'] != 0).all() + # No measurements are NaN + assert not (np.isnan(synthetic_data_df['measurement'])).any() + + synthetic_data_df_with_noise = simulator.add_noise( + synthetic_data_df, + ) + # Both negative and positive values are returned by default. + assert all([ + (synthetic_data_df_with_noise['measurement'] <= 0).any(), + (synthetic_data_df_with_noise['measurement'] >= 0).any(), + ]) + + synthetic_data_df_with_noise = simulator.add_noise( + synthetic_data_df, + zero_bounded=True, + ) + # Values with noise that are different in sign to values without noise are + # zeroed. + assert all([ + (synthetic_data_df_with_noise['measurement'][neg_indices] <= 0).all(), + (synthetic_data_df_with_noise['measurement'][pos_indices] >= 0).all(), + (synthetic_data_df_with_noise['measurement'][neg_indices] == 0).any(), + (synthetic_data_df_with_noise['measurement'][pos_indices] == 0).any(), + (synthetic_data_df_with_noise['measurement'][neg_indices] < 0).any(), + (synthetic_data_df_with_noise['measurement'][pos_indices] > 0).any(), + ]) + + def test_add_noise(petab_problem): """Test the noise generating method.""" tested_noise_distributions = {'normal', 'laplace'} assert set(petab.C.NOISE_MODELS) == tested_noise_distributions, ( 'The noise generation methods have only been tested for ' - f'{tested_noise_distributions}. Please edit this test ' - 'to include this distribution in its tested distributions. The ' - 'appropriate SciPy distribution will need to be added to ' + f'{tested_noise_distributions}. Please edit this test to include this ' + 'distribution in its tested distributions. The appropriate SciPy ' + 'distribution will need to be added to ' '`petab_numpy2scipy_distribution` in `_test_add_noise`.' ) @@ -94,6 +146,8 @@ def _test_add_noise(petab_problem) -> None: } simulator = TestSimulator(petab_problem) + # Set the random seed to ensure predictable tests. + simulator.rng = np.random.default_rng(seed=0) synthetic_data_df = simulator.simulate() # Generate samples of noisy data @@ -144,26 +198,30 @@ def row2cdf(row, index) -> Callable: getattr( scipy.stats, petab_numpy2scipy_distribution[ - expected_noise_distributions[index]] - ).cdf, loc=row[MEASUREMENT], scale=expected_noise_values[index]) + expected_noise_distributions[index] + ] + ).cdf, + loc=row[MEASUREMENT], + scale=expected_noise_values[index] + ) # Test whether the distribution of the samples is equal to the expected # distribution, for each measurement. results = [] for index, row in synthetic_data_df.iterrows(): - r = scipy.stats.ks_1samp( + results.append(scipy.stats.ks_1samp( samples[:, index], row2cdf(row, index) - ) - results.append(r) + )) observed_fraction_above_threshold = ( - sum(r.pvalue > ks_1samp_pvalue_threshold for r in results) / - len(results) + sum(r.pvalue > ks_1samp_pvalue_threshold for r in results) + / len(results) ) # Sufficient distributions of measurement samples are sufficiently similar # to the expected distribution assert ( - observed_fraction_above_threshold > minimum_fraction_above_threshold) + observed_fraction_above_threshold > minimum_fraction_above_threshold + ) simulator.remove_working_dir() assert not pathlib.Path(simulator.working_dir).is_dir() From 064680e596ad1639fb0da13b2829dd9a7586da42 Mon Sep 17 00:00:00 2001 From: Jakob Vanhoefer <jakob.vanhoefer@uni-bonn.de> Date: Tue, 12 Jan 2021 11:02:35 +0100 Subject: [PATCH 10/17] add #479 to chancelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd8b08c..2aa96140 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ * Fix sampling of priors in `parameterScale` (#492) * Clarify documentation of `parameterScale` priors +* Improvements in `petab.simulate` (#479): + * Fix default noise distributions + * Add option for non-negative synthetic data ### 0.1.13 From 41b003d46d35b7e8142700d4687ff8a40e79b1ed Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Wed, 13 Jan 2021 10:46:36 +0100 Subject: [PATCH 11/17] Doc: Update tutorial references (#497) Add reference to original model publication --- doc/tutorial.rst | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 4b4781a8..f336f774 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -2,19 +2,21 @@ PEtab Tutorial ============== +.. _Boehm et al. (2014): https://dx.doi.org/10.1021/pr5006923 + + Overview ++++++++ In the following, we demonstrate how to set up a parameter estimation problem in PEtab based on a realistic application example. To this end, we consider the model and experimental data by -`Boehm et al. (2014) <https://pubs.acs.org/doi/abs/10.1021/pr5006923>`_. The +`Boehm et al. (2014)`_. The model describes the dynamics of phosphorylation and dimerization of the transcription factors STAT5A and STAT5B. A visualization and the corresponding reactions of the model are provided below, although the details of the model are not relevant for the purpose of this tutorial. -For more details, we refer to the original publication (Boehm et al., -2014). +For more details, we refer to the original publication. A PEtab problem consists of 1) an SBML model of a biological system, 2) condition, observable and measurement definitions, and 3) the @@ -58,7 +60,7 @@ tutorial is available `online <https://github.com/PEtab-dev/PEtab/tree/b50d000a5 2. Linking model and measurements +++++++++++++++++++++++++++++++++ -The model by Boehm et al. (2014) was calibrated on measurements on +The model by `Boehm et al. (2014)`_ was calibrated on measurements on phosphorylation levels of STAT5A and STAT5B as well as relative STAT5A abundance for different timepoints between 0 - 240 minutes after stimulation with erythropoietin (Epo): @@ -242,7 +244,7 @@ PEtab measurement file: 3. Defining parameters ++++++++++++++++++++++ -The model by Boehm et al. (2014) contains nine unknown parameters that +The model by `Boehm et al. (2014)`_ contains nine unknown parameters that need to be estimated from the experimental data. Additionally, it has two known parameters that are fixed to literature values. @@ -414,3 +416,12 @@ be found at the PEtab Github page .. [#f1] TSV files can be created using any standard spreadsheet application, or for small files, text editor. + + +References +++++++++++ + +* Martin E. Boehm, Lorenz Adlung, Marcel Schilling, Susanne Roth, + Ursula Klingmüller, and Wolf D. Lehmann. + *Journal of Proteome Research* **2014** 13 (12), 5685-5694. + DOI: `10.1021/pr5006923 <https://dx.doi.org/10.1021/pr5006923>`_. From 7e80cf155a9c5cb0dcd486b504bd532c3d43d3c2 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Thu, 28 Jan 2021 17:39:25 +0100 Subject: [PATCH 12/17] Update Python requirement (3.7.1) (#502) --- README.md | 2 +- setup.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3c265f3f..9ac58f89 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ it is running pip3 install petab -It will require Python>=3.6 to run. +It will require Python>=3.7.1 to run. Development versions of the PEtab library can be installed using diff --git a/setup.py b/setup.py index 3c3c5720..a809a234 100644 --- a/setup.py +++ b/setup.py @@ -26,8 +26,8 @@ def absolute_links(txt): # Python version check. We need >= 3.6 due to e.g. f-strings -if sys.version_info < (3, 6): - sys.exit('PEtab requires at least Python version 3.6') +if sys.version_info < (3, 7, 1): + sys.exit('PEtab requires at least Python version 3.7.1') # read version from file __version__ = '' @@ -64,7 +64,7 @@ def absolute_links(txt): ], include_package_data=True, tests_require=['flake8', 'pytest', 'python-libcombine'], - python_requires='>=3.6', + python_requires='>=3.7.1', entry_points=ENTRY_POINTS, extras_require={'reports': ['Jinja2'], 'combine': ['python-libcombine>=0.2.6']}, From 115679974dff0dbe6fb93f08bcbc7ed52972d04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yannik=20Sch=C3=A4lte?= <31767307+yannikschaelte@users.noreply.github.com> Date: Sun, 14 Feb 2021 20:15:31 +0100 Subject: [PATCH 13/17] Broadcast and mapping of scale and unscale functions (#505) * allow broadcasting in `map_scale` * fixup * fixup * add docstring --- petab/parameters.py | 47 +++++++++++++++++++++++++++++++++++----- tests/test_parameters.py | 29 ++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/petab/parameters.py b/petab/parameters.py index e5466777..91cc15c1 100644 --- a/petab/parameters.py +++ b/petab/parameters.py @@ -352,7 +352,7 @@ def get_priors_from_df(parameter_df: pd.DataFrame, def scale(parameter: numbers.Number, scale_str: 'str') -> numbers.Number: - """Scale parameter according to scale_str + """Scale parameter according to `scale_str`. Arguments: parameter: @@ -375,7 +375,7 @@ def scale(parameter: numbers.Number, scale_str: 'str') -> numbers.Number: def unscale(parameter: numbers.Number, scale_str: 'str') -> numbers.Number: - """Unscale parameter according to scale_str + """Unscale parameter according to `scale_str`. Arguments: parameter: @@ -397,12 +397,49 @@ def unscale(parameter: numbers.Number, scale_str: 'str') -> numbers.Number: raise ValueError("Invalid parameter scaling: " + scale_str) -def map_scale(parameters: Iterable[numbers.Number], - scale_strs: Iterable[str]) -> Iterable[numbers.Number]: - """As scale(), but for Iterables""" +def map_scale( + parameters: Iterable[numbers.Number], + scale_strs: Union[Iterable[str], str] +) -> Iterable[numbers.Number]: + """Scale the parameters, i.e. as `scale()`, but for Iterables. + + Arguments: + parameters: + Parameters to be scaled. + scale_strs: + Scales to apply. Broadcast if a single string. + + Returns: + parameters: + The scaled parameters. + """ + if isinstance(scale_strs, str): + scale_strs = [scale_strs] * len(parameters) return map(lambda x: scale(x[0], x[1]), zip(parameters, scale_strs)) +def map_unscale( + parameters: Iterable[numbers.Number], + scale_strs: Union[Iterable[str], str] +) -> Iterable[numbers.Number]: + """Unscale the parameters, i.e. as `unscale()`, but for Iterables. + + Arguments: + parameters: + Parameters to be unscaled. + scale_strs: + Scales that the parameters are currently on. + Broadcast if a single string. + + Returns: + parameters: + The unscaled parameters. + """ + if isinstance(scale_strs, str): + scale_strs = [scale_strs] * len(parameters) + return map(lambda x: unscale(x[0], x[1]), zip(parameters, scale_strs)) + + def normalize_parameter_df(parameter_df: pd.DataFrame) -> pd.DataFrame: """Add missing columns and fill in default values.""" df = parameter_df.copy(deep=True) diff --git a/tests/test_parameters.py b/tests/test_parameters.py index 763b99bb..80886d0a 100644 --- a/tests/test_parameters.py +++ b/tests/test_parameters.py @@ -1,8 +1,9 @@ """Tests for petab/parameters.py""" import tempfile import pytest - +import numpy as np import pandas as pd + import petab from petab.C import * @@ -170,3 +171,29 @@ def test_normalize_parameter_df(): # check is valid petab petab.check_parameter_df(actual) + + +def test_scale_unscale(): + """Test the parameter scaling functions.""" + par = 2.5 + # scale + assert petab.scale(par, LIN) == par + assert petab.scale(par, LOG) == np.log(par) + assert petab.scale(par, LOG10) == np.log10(par) + # unscale + assert petab.unscale(par, LIN) == par + assert petab.unscale(par, LOG) == np.exp(par) + assert petab.unscale(par, LOG10) == 10**par + + # map scale + assert list(petab.map_scale([par]*3, [LIN, LOG, LOG10])) == \ + [par, np.log(par), np.log10(par)] + # map unscale + assert list(petab.map_unscale([par]*3, [LIN, LOG, LOG10])) == \ + [par, np.exp(par), 10**par] + + # map broadcast + assert list(petab.map_scale([par, 2*par], LOG)) == \ + list(np.log([par, 2*par])) + assert list(petab.map_unscale([par, 2*par], LOG)) == \ + list(np.exp([par, 2*par])) From e7647cbfa917b3749a5eb792d995ad292427283f Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Thu, 25 Feb 2021 23:33:44 +0100 Subject: [PATCH 14/17] Update how-to-cite (Closes #432) (#509) --- doc/how_to_cite.rst | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/doc/how_to_cite.rst b/doc/how_to_cite.rst index c43f9029..5a00b219 100644 --- a/doc/how_to_cite.rst +++ b/doc/how_to_cite.rst @@ -3,15 +3,20 @@ How to cite =========== -Help us to promote PEtab: When using PEtab, please cite our `preprint <https://arxiv.org/abs/2004.01154v4>`_: +Help us to promote PEtab: When using PEtab, please cite our `PEtab article <https://doi.org/10.1371/journal.pcbi.1008646>`_: -.. code-block:: latex +.. code-block:: bibtex - @misc{schmiester2020petab, - title={PEtab -- interoperable specification of parameter estimation problems in systems biology}, - author={Leonard Schmiester and Yannik Schälte and Frank T. Bergmann and Tacio Camba and Erika Dudkin and Janine Egert and Fabian Fröhlich and Lara Fuhrmann and Adrian L. Hauber and Svenja Kemmer and Polina Lakrisenko and Carolin Loos and Simon Merkt and Wolfgang Müller and Dilan Pathirana and Elba Raimúndez and Lukas Refisch and Marcus Rosenblatt and Paul L. Stapor and Philipp Städter and Dantong Wang and Franz-Georg Wieland and Julio R. Banga and Jens Timmer and Alejandro F. Villaverde and Sven Sahle and Clemens Kreutz and Jan Hasenauer and Daniel Weindl}, - year={2020}, - eprint={2004.01154}, - archivePrefix={arXiv}, - primaryClass={q-bio.QM} + @Article{SchmiesterSch2021, + author = {Schmiester, Leonard AND Schälte, Yannik AND Bergmann, Frank T. AND Camba, Tacio AND Dudkin, Erika AND Egert, Janine AND Fröhlich, Fabian AND Fuhrmann, Lara AND Hauber, Adrian L. AND Kemmer, Svenja AND Lakrisenko, Polina AND Loos, Carolin AND Merkt, Simon AND Müller, Wolfgang AND Pathirana, Dilan AND Raimúndez, Elba AND Refisch, Lukas AND Rosenblatt, Marcus AND Stapor, Paul L. AND Städter, Philipp AND Wang, Dantong AND Wieland, Franz-Georg AND Banga, Julio R. AND Timmer, Jens AND Villaverde, Alejandro F. AND Sahle, Sven AND Kreutz, Clemens AND Hasenauer, Jan AND Weindl, Daniel}, + journal = {PLOS Computational Biology}, + title = {PEtab—Interoperable specification of parameter estimation problems in systems biology}, + year = {2021}, + month = {01}, + number = {1}, + pages = {1-10}, + volume = {17}, + doi = {10.1371/journal.pcbi.1008646}, + publisher = {Public Library of Science}, + url = {https://doi.org/10.1371/journal.pcbi.1008646}, } From 42ab89ed038a6b6c1c21c55078bfdd24b31127e9 Mon Sep 17 00:00:00 2001 From: LeonardSchmiester <leonard.schmiester@helmholtz-muenchen.de> Date: Tue, 2 Mar 2021 13:11:54 +0100 Subject: [PATCH 15/17] Update tutorial.rst (#512) --- doc/tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorial.rst b/doc/tutorial.rst index f336f774..b95908b5 100644 --- a/doc/tutorial.rst +++ b/doc/tutorial.rst @@ -246,7 +246,7 @@ PEtab measurement file: The model by `Boehm et al. (2014)`_ contains nine unknown parameters that need to be estimated from the experimental data. Additionally, it has -two known parameters that are fixed to literature values. +one known parameter that is fixed to a literature value. The parameters file for this is given by: From 7acc64cf375fb03bfbcc3e08792dc979ea31f496 Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Fri, 5 Mar 2021 18:47:57 +0100 Subject: [PATCH 16/17] Doc: Add description of PEtab development process (#507) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Doc: Add description of PEtab development process As drafted and agreed on by the PEtab authors. * Apply suggestions from code review Co-authored-by: Fabian Fröhlich <fabian@schaluck.com> Co-authored-by: Svenja Kemmer <svenja.kemmer@fdm.uni-freiburg.de> --- doc/development.rst | 222 ++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 1 + 2 files changed, 223 insertions(+) create mode 100644 doc/development.rst diff --git a/doc/development.rst b/doc/development.rst new file mode 100644 index 00000000..8c9f29c0 --- /dev/null +++ b/doc/development.rst @@ -0,0 +1,222 @@ +.. _development: + +PEtab development process +========================= + +Motivation for this document / general remarks +++++++++++++++++++++++++++++++++++++++++++++++ + +Reproducibility and reusability of the results of data-based modeling +studies are essential. Yet, until recently, there was no broadly supported +format for the specification of parameter estimation problems in systems +biology. Therefore, we developed PEtab. Having released the specifications +for PEtab version 1.0, we would like to keep development of PEtab active by +attracting more users and tool developers. We acknowledge that it is +important for any potential contributors to know how PEtab is managed and +developed, which we will explain in the remainder of this document. + +Values +++++++ + +We are committed to diversity, open communication, transparent processes, +democratic decision-making by the community and fostering a welcoming +environment. While we want to have clear processes, we don’t want to +overformalize things to avoid unnecessary slowdowns. + +Roles within the PEtab community +++++++++++++++++++++++++++++++++ + +The following subsections describe the different roles in the development of +PEtab. + +Anybody interested in PEtab +--------------------------- + +Input from every interested person is welcome. + +Anyone may... + +* propose changes to PEtab + +PEtab forum +----------- + +The PEtab forum includes anybody who is interested in PEtab and is +subscribed to the `PEtab mailing list <https://groups.google.com/g/petab-discuss>`_ +using their real name. (Although anybody is invited to subscribe to the +mailing list with any name or email address, we require the use of real +names for participation in any votes. This is to ensure that every person +has only one vote.) + +The PEtab forum ... + +* votes for changes to PEtab +* nominates editors +* elects editors + +PEtab editors +------------- + +PEtab is meant to be a community effort. Decisions should therefore be made +as far as possible by a broad community interested in the use and +development of PEtab. Nevertheless, such a project cannot run fully +autonomously, but requires a core team of editors to take care of certain +management tasks. The PEtab editorial board is a team of 5 representatives +nominated and elected by the PEtab forum. + +The duties / privileges of the editors include the following: + +* organizing polls +* writing/updating specifications +* organizing and announcing annual meetings / hackathons +* promoting PEtab +* deciding minor PEtab issues among themselves + ("minor" as defined by the editors but reasons for the decision need to be communicated) +* managing the PEtab mailing lists +* managing the PEtab GitHub organization and respective repositories +* delegating any of the above + +Other +----- + +Other roles may be created as required based on the decision of the editors by majority vote. + +Communication channels +++++++++++++++++++++++ + +The main discussion channel should be the GitHub +`issues <https://github.com/PEtab-dev/PEtab/issues>`_ / +`discussion <https://github.com/PEtab-dev/PEtab/discussions>`_ pages. +Additionally, the `mailing list <https://groups.google.com/g/petab-discuss>`_ +is used for the announcement of new releases, polls, and the likes and can be +used for discussions that seem unfit for GitHub. An archive of the mailing list +shall be publicly accessible. +The PEtab Editors can be contacted through +`https://groups.google.com/g/petab-editors <https://groups.google.com/g/petab-editors>`_, +which is only readable by the current Editors. +Regular, ideally non-virtual, PEtab hackathons are planned to happen at least +annually, e.g., in combination with +`COMBINE events <https://co.mbine.org/events/>`_. + +Election of Editors ++++++++++++++++++++ + +Editors are elected for 3 years by the PEtab forum. Editors may serve +multiple terms, but there needs to be a break of 1 year between subsequent +terms. To maintain continuity, not all editors shall be replaced at the same +time. Editors may resign any time before the end of their term. + +Whenever an Editor position becomes vacant: + +* Editors announce upcoming elections and request nominations via the PEtab + mailing list. The time given for nominations shall be no shorter than 10 days. +* Interested parties submit nominations including a short statement on the + reason for nomination before the deadline. Self-nominations are allowed. +* Editors ask the nominees whether they accept the nomination (nominees are + given 5 days to accept). This step may start already during the nomination + phase. +* Editors announce the nominees who accepted their nomination along with the + submitted statements and open the poll via the PEtab mailing list. The + editors choose a sensible medium and deadline for the poll. +* The PEtab forum casts their votes secretly. (Votes may have to be open to the + editors, as they need to verify that only qualified votes are counted. + However, the editors are required to maintain confidentiality.) Every + participant has 1 vote per vacant position. +* After passing the deadline, the editors count the votes and ask the + editor-elect to accept or decline the election. No acceptance before the end + of the deadline set by the editors, which shall not be less than 3 days, is + considered decline. +* If an editor-elect declines, the position will be offered to the next + candidate according to the number of votes. (If there is no candidate left + with at least one vote, the election for the vacant position needs to be + repeated. +* If there is a tie between candidates of which only a subset can become an + editor, run-off elections including only those candidates have to be + organized by the PEtab editors as soon as possible. Voters will again have a + number of votes equal to the number of vacant positions. +* If the editor-elect accepts, the other editors announce the new editor on the + PEtab mailing list. The editors shall furthermore announce the number of + votes each nominee, elected or not, has received. + +Special procedure for the first election (February, 2021): +---------------------------------------------------------- + +The first election was held among the authors of the original PEtab +publication. Nominees were not required to be among the authors. The election +was managed by two persons who were not among the candidates and were +coming from two different labs. To avoid a simultaneous replacement of all +of the editors elected during the first election, the first election was +subject to the following special rules: 2 persons were elected for 3 +years, 2 persons for 2 years and one person for 1 year. The persons with +more votes were elected for a longer period (if they accepted +for the longer period). In case of an equal number of votes among any of the +top 5 candidates, there would have been run-off elections between those +candidates with equal numbers of votes. The editors-elect were given 3 working +days to accept the election. +If an editor would decide to hand over his editorial role before the end of +their term, an editor elected for a shorter term period could decide to take +over and extend their term to the end of the leaving editor's original term. + +PEtab format development process +++++++++++++++++++++++++++++++++ + +We acknowledge that PEtab cannot accommodate everybody’s needs, but we are +committed to addressing current and future requirements in upcoming versions of +the PEtab format. Although we value backwards-compatibility, we don’t want to +exclude breaking changes if justified by the benefits. + +Anybody is welcomed to propose changes or additions to PEtab. Any proposals +shall be made using GitHub issues. Benefits, problems, and potential +alternatives shall be discussed in the respective thread. + +A proposal is considered accepted for inclusion in the next version of PEtab +if it’s endorsed by the majority of the PEtab editors and if distinct +developers of at least 2 tools provide a prototype implementation. For any +changes, respective test cases sufficiently covering the changes are to be +added to the `PEtab test suite <https://github.com/PEtab-dev/petab_test_suite>`_ +prior to release. + +Requirements for new releases: + +* Updated format specifications +* Updated converter +* Updated validator +* Updated test suite +* Updated changelog + +The PEtab editors jointly decide whether these requirements are met. + +Upon a new release, the PEtab editors ensure that + +* a new release is created in the GitHub repository +* the new version of the specifications is deposited at Zenodo +* the new release is announced on the PEtab mailing list + +Versioning of the PEtab format +------------------------------ + +The PEtab specifications follow `semantic versioning <https://semver.org/>`_. +Any changes to the PEtab specifications require a new release. Any necessary +clarifications or corrections shall be collected on an Errata page until a new +version is released. + +The time for a new PEtab release is left to the discretion of the editors. +However, accepted changes should be released within 2 months after acceptance. + +With any new PEtab version it shall be ensured that a converter between the new +and the previous version(s) is available. Parallel maintenance of multiple +versions is not intended. + +Generally, any parameter estimation problem that could have been specified +in an earlier version should be specifiable in a new version (potentially +requiring different syntax). Any changes to the PEtab specifications that +would remove certain features without adequate replacement require the +support of at least 4 out of the 5 editors. + +Changes to these processes +++++++++++++++++++++++++++ + +Changes to the processes specified above require a public vote with +agreement of the majority of voters. Any other changes not directly +affecting those processes, such as changes to structure, orthography, +grammar, formatting, the preamble can be made by the editors any time. diff --git a/doc/index.rst b/doc/index.rst index 7550c12a..32eee205 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -19,6 +19,7 @@ :caption: About Changelog <CHANGELOG.md> + Development <development> how_to_cite license logo/LICENSE.md From c7a4778a4f5e434a14a085a910522ccf594582ed Mon Sep 17 00:00:00 2001 From: Daniel Weindl <dweindl@users.noreply.github.com> Date: Sat, 13 Mar 2021 07:49:44 +0100 Subject: [PATCH 17/17] Doc: Add editorial board (#511) --- doc/editorial_board.rst | 28 ++++++++++++++++++++++++++++ doc/index.rst | 1 + 2 files changed, 29 insertions(+) create mode 100644 doc/editorial_board.rst diff --git a/doc/editorial_board.rst b/doc/editorial_board.rst new file mode 100644 index 00000000..6f5f2eea --- /dev/null +++ b/doc/editorial_board.rst @@ -0,0 +1,28 @@ +Editorial board +=============== + +The development of PEtab is overseen by an editorial board. The editorial board +is elected by the PEtab community as described on the +:ref:`PEtab development <development>` page. + +The current board members are: + +.. |JH| image:: https://avatars.githubusercontent.com/u/12297214?s=128 + +.. |DW| image:: https://avatars.githubusercontent.com/u/18048784?s=128 + +.. |FB| image:: https://avatars.githubusercontent.com/u/949059?s=128 + +.. |SK| image:: https://avatars.githubusercontent.com/u/18700932?s=128 + +.. |FF| image:: https://avatars.githubusercontent.com/u/14923969?s=128 + ++--------------------+-------------------------+--------------------------+------------------------+------------------------+ +| |JH| | |DW| | |FB| | |SK| | |FF| | +| | | | | | +| Jan Hasenauer | Daniel Weindl | Frank Bergmann | Svenja Kemmer | Fabian Fröhlich | +| | | | | | +| University of Bonn | Helmholtz Centre Munich | University of Heidelberg | University of Freiburg | Harvard Medical School | +| | | | | | +| 2021-2024 | 2021-2024 | 2021-2023 | 2021-2023 | 2021-2022 | ++--------------------+-------------------------+--------------------------+------------------------+------------------------+ diff --git a/doc/index.rst b/doc/index.rst index 32eee205..2749cc3a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -22,6 +22,7 @@ Development <development> how_to_cite license + editorial_board logo/LICENSE.md .. toctree::