diff --git a/.Rbuildignore b/.Rbuildignore index c3e9c9c..c0e272e 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,11 +1,14 @@ ^.*\.Rproj$ ^\.Rproj\.user$ -^\.Rhistory -^\.gitignore -LICENSE -README.md -^\.DS_Store +^\.Rhistory$ +(^|/)\.Rhistory$ +^\.gitignore$ +^\.github$ +LICENSE$ +README.md$ +^\.DS_Store$ ^\.git$ -cran_comments.md +cran_comments.md$ ^doc$ ^Meta$ +^\.old$ \ No newline at end of file diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml new file mode 100644 index 0000000..5752d3f --- /dev/null +++ b/.github/workflows/R-CMD-check.yaml @@ -0,0 +1,50 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples + +on: + push: + branches: [main, master] + pull_request: + +name: R-CMD-check + +permissions: read-all + +jobs: + R-CMD-check: + runs-on: ${{ matrix.config.os }} + + name: ${{ matrix.config.os }} / R ${{ matrix.config.r }} + + strategy: + fail-fast: false + matrix: + config: + - {os: macos-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + + steps: + - uses: actions/checkout@v5 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + r-version: ${{ matrix.config.r }} + http-user-agent: ${{ matrix.config.http-user-agent }} + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::rcmdcheck + needs: check + + - uses: r-lib/actions/check-r-package@v2 + with: + upload-snapshots: true + build_args: 'c("--no-manual", "--compact-vignettes=gs+qpdf")' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 710c7fc..e8f5a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,15 @@ source/ /.Rproj.user/* LoopDetectR.Rproj +.Rhistory +.Rproj.user/ +*.Rproj +.DS_Store +doc/ +Meta/ +*.tar.gz +*.Rcheck/ + # Compiled source # ################### @@ -40,6 +49,10 @@ __pycache__ *.sql *.sqlite +# Backup # +###################### +old/ + # OS generated files # ###################### .DS_Store diff --git a/DESCRIPTION b/DESCRIPTION index d83f344..11619ce 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: LoopDetectR Type: Package Title: Comprehensive Feedback Loop Detection in ODE Models -Version: 0.1.2 +Version: 0.1.3 Authors@R: c(person("Katharina", "Baum", email = "katharina.baum@hpi.de", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-7256-0566")), person("Sandra", "Krüger", role = c("ctb"))) @@ -15,5 +15,7 @@ Encoding: UTF-8 LazyData: true Depends: R (>= 4.0.0) -RoxygenNote: 7.1.0 +RoxygenNote: 7.3.3 VignetteBuilder: knitr +URL: https://github.com/DILiS-lab/LoopDetectR, https://cran.r-project.org/package=LoopDetectR +BugReports: https://github.com/DILiS-lab/LoopDetectR/issues diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..20c8f71 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,7 @@ +# LoopDetectR 0.1.3 + +* Updated installation instructions from GitLab to GitHub. +* Added GitHub repository and issue tracker links to DESCRIPTION. +* Cleaned repository metadata and normalized text-file formatting. +* Removed local development history files from the repository. +* Added GitHub Actions checks for package validation. \ No newline at end of file diff --git a/R/data.R b/R/data.R index 6ebaaac..aeb62d6 100644 --- a/R/data.R +++ b/R/data.R @@ -20,7 +20,7 @@ #' Division Cycle of Caulobacter crescentus Stalked Cells. Plos Comput Biol. #' 2008;4(1):e9. The solutions were generated with MATLAB using the #' functions accompanying the above reference on -#' \url{http://mpf.biol.vt.edu/research/caulobacter/SWST/pp/}. +#' \doi{10.1371/journal.pcbi.0040009}. #' "li08_solution" @@ -59,7 +59,7 @@ #' Li S, Brazhnik P, Sobral B, Tyson JJ. A Quantitative Study of the #' Division Cycle of Caulobacter crescentus Stalked Cells. Plos Comput Biol. #' 2008;4(1):e9. The function corresponds to the MATLAB function modelwtin(t,y) -#' as given on \url{http://mpf.biol.vt.edu/research/caulobacter/SWST/pp/}. +#' as given on \doi{10.1371/journal.pcbi.0040009}. #' #' @details #' The Caulobacter cell cycle model function will only give the solution as diff --git a/README.md b/README.md index 8b0a1f6..b02da4e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,17 @@ # LoopDetectR: An R package for comprehensive detection of feedback loops in ODE models +

+ + Python implementation + + + R implementation + + + MATLAB implementation + +

+ ## Scope of the package This package can be used to detect feedback loops (cycles, circuits) between species in ordinary differential equation (ODE) models. These are paths from one node to itself without @@ -21,13 +33,17 @@ LoopDetectR is on CRAN [link](https://cran.r-project.org/web/packages/LoopDetect # Load package library("LoopDetectR") -You can also install the package from gitlab. Call the following -commands in an R session. +You can also install the development version from GitHub. Call the following +commands in an R session. - # Install from gitlab - remotes::install_gitlab(kabaum/LoopDetectR, build_manual = TRUE, build_vignettes = TRUE) - # Load package - library("LoopDetectR") + # install.packages("remotes") + remotes::install_github( + "DILiS-lab/LoopDetectR", + build_manual = TRUE, + build_vignettes = TRUE + ) + + library(LoopDetectR) ## Workflow and documentation @@ -37,7 +53,6 @@ A detailed workflow document can be found in the *vignettes* folder and as CRAN within an R session with installed and loaded LoopDetectR to obtain details on the function `find_loops`. For an overview of the functions, download the [reference manual](https://cran.r-project.org/web/packages/LoopDetectR/LoopDetectR.pdf). - ## Licensing All code is licensed under the GNU GPLv3, LoopDetectR, Copyright (C) 2020 Katharina Baum. diff --git a/cran_comments.md b/cran_comments.md index fcedcc9..5332072 100644 --- a/cran_comments.md +++ b/cran_comments.md @@ -1,25 +1,26 @@ -##Resubmission v. 0.1.2 -This is a resubmission to the initial package version 0.1.1. +##LoopDetectR v. 0.1.3 -Introduced changes -* suppress installation of all packages in the vignette (I had overlooked one, sorry for that) -* checked all examples in the help files: they do not install any package +## Changes -## Test environments for version 0.1.2 -* local OS X install (R 4.0.2, R-devel 2020-07-01 r78761) -* win-builder (4.0.2, R-devel 2020-07-11 r788124) +This is a maintenance release. +* Updated installation instructions from GitLab to GitHub. +* Updated repository links to point to `DILiS-lab/LoopDetectR`. +* Removed local development history files from the source repository. +* Added GitHub Actions checks for R CMD check. ## R CMD check results -There were no ERRORs or WARNINGs. -* checking CRAN incoming feasibility ... NOTE -Maintainer: ‘Katharina Baum ’ - -New submission -This is correct, it is (the resubmission of) a new submission. +0 errors | 0 warnings | 0 notes +## Test environments +* GitHub Actions: macOS-latest, R release +* GitHub Actions: Windows-latest, R release +* GitHub Actions: Ubuntu-latest, R devel +* GitHub Actions: Ubuntu-latest, R release +* GitHub Actions: Ubuntu-latest, R oldrel-1 ## Downstream dependencies + There are currently no downstream dependencies for this package. \ No newline at end of file diff --git a/man/func_li08.Rd b/man/func_li08.Rd index c111567..a983b1b 100644 --- a/man/func_li08.Rd +++ b/man/func_li08.Rd @@ -14,7 +14,7 @@ The Caulobacter cell cycle model was proposed in Li S, Brazhnik P, Sobral B, Tyson JJ. A Quantitative Study of the Division Cycle of Caulobacter crescentus Stalked Cells. Plos Comput Biol. 2008;4(1):e9. The function corresponds to the MATLAB function modelwtin(t,y) -as given on \url{http://mpf.biol.vt.edu/research/caulobacter/SWST/pp/}. +as given on \doi{10.1371/journal.pcbi.0040009}. } \usage{ func_li08 diff --git a/man/li08_solution.Rd b/man/li08_solution.Rd index 4da46d2..d398819 100644 --- a/man/li08_solution.Rd +++ b/man/li08_solution.Rd @@ -20,7 +20,7 @@ Li S, Brazhnik P, Sobral B, Tyson JJ. A Quantitative Study of the Division Cycle of Caulobacter crescentus Stalked Cells. Plos Comput Biol. 2008;4(1):e9. The solutions were generated with MATLAB using the functions accompanying the above reference on -\url{http://mpf.biol.vt.edu/research/caulobacter/SWST/pp/}. +\doi{10.1371/journal.pcbi.0040009}. } \usage{ li08_solution diff --git a/vignettes/.Rhistory b/vignettes/.Rhistory deleted file mode 100644 index 7dfb9ee..0000000 --- a/vignettes/.Rhistory +++ /dev/null @@ -1,9 +0,0 @@ -remotes::install_gitlab("kabaum/LoopDetectR", build_manual=TRUE, -build_vignettes = TRUE) -remove.packages("LoopDetectR") -remotes::install_gitlab("kabaum/LoopDetectR", build_manual=TRUE, -build_vignettes = TRUE) -remove.packages('LoopDetectR') -remotes::install_gitlab("kabaum/LoopDetectR", build_manual=TRUE, -build_vignettes = TRUE) -remove.packages('LoopDetectR') diff --git a/vignettes/workflow_LoopDetectR.Rmd b/vignettes/workflow_LoopDetectR.Rmd index b38547b..58a59cf 100644 --- a/vignettes/workflow_LoopDetectR.Rmd +++ b/vignettes/workflow_LoopDetectR.Rmd @@ -22,13 +22,16 @@ LoopDetectR is on CRAN and can be installed within R by install.packages("LoopDetectR") ``` -Alternatively, you can install the package from gitlab. Call the following +Alternatively, you can install the package from GitHub. Call the following commands in an R session. ```{r install_fromgit, message=FALSE, results='hide', eval=FALSE} # Install the package including the vignette and the manual -remotes::install_gitlab("kabaum/LoopDetectR", build_manual=TRUE, - build_vignettes = TRUE) +remotes::install_github( + "DILiS-lab/LoopDetectR", + build_manual = TRUE, + build_vignettes = TRUE +) ``` diff --git a/vignettes/workflow_LoopDetectR.html b/vignettes/workflow_LoopDetectR.html deleted file mode 100644 index 6f263be..0000000 --- a/vignettes/workflow_LoopDetectR.html +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - -LoopDetectR: Comprehensive Feedback Loop Detection in ODE models - - - - - - - - - - - - - - - - - - - - - - -

LoopDetectR: Comprehensive Feedback Loop Detection in ODE models

-

Katharina Baum

-

07/06/2020

- - - -
-

Installation

-

LoopDetectR is on CRAN and can be installed within R by

-
# Download and install
-install.packages("LoopDetectR")
-

Alternatively, you can install the package from gitlab. Call the following commands in an R session.

-
# Install the package including the vignette and the manual
-remotes::install_gitlab("kabaum/LoopDetectR", build_manual=TRUE, 
-                        build_vignettes = TRUE)
-

After installation, load the package.

-
# Load package
-library("LoopDetectR")
-
-
-

In brief and quick start

-

The package LoopDetectR enables determining all feedback loops of an ordinary differential equation (ODE) system at user-defined values of the model parameters and of the modelled variables.

-

The following call reports (up to 10) feedback loops for an ODE system determined by a function, here the example function func_POSm4, at variable values s_star (here, these are all equal to 1). Additional arguments to the example function are supplied.

-
# Load example ODE system with function func_POSm4, 4 variables
-data("func_POSm4")
-# Example variable values
-s_star <- rep(1,4)
-# Further arguments of func_POSm4, in addition: time t as argument
-klin <- rep(1,8)
-knonlin <- c(2.5,3)
-
-# compute loops
-res_tab <- find_loops_vset(func_POSm4,vset=list(s_star),t=1,klin=klin,
-                           knonlin=knonlin,max_num_loops=10)
-# The loop list is reported
-res_tab$loop_rep[[1]]
-
##           loop length sign
-## 1         1, 1      1   -1
-## 2         2, 2      1   -1
-## 3         3, 3      1   -1
-## 4         4, 4      1   -1
-## 5 3, 4, 1,....      4   -1
-## 6   3, 4, 2, 3      3    1
-
# This is the sixth loop of the list. It is a positive feedback loop (sign in 
-# the loop list equals +1) of length 3 in that variable 3 regulates variable 4, 
-# variable 4 regulates variable 2, and variable 2 regulates variable 3. 
-res_tab$loop_rep[[1]][6,]
-
##         loop length sign
-## 6 3, 4, 2, 3      3    1
-
# The corresponding signed Jacobian matrix
-res_tab$jac_rep[[1]]
-
##      [,1] [,2] [,3] [,4]
-## [1,]   -1    0    0   -1
-## [2,]    1   -1    0    1
-## [3,]    0    1   -1    0
-## [4,]    0    0    1   -1
-
-
-

Introduction

-

Ordinary differential equation (ODE) models are used frequently to mathematically represent biological systems. Feedback loops are important regulatory features of biological systems and can give rise to different dynamic behavior such as multistability for positive feedback loops or oscillations for negative feedback loops.

-

The feedback loops in an ODE system can be detected with the help of its Jacobian matrix, the matrix of partial derivatives of the variables. It captures all interactions between the variables and gives rise to the interaction graph of the ODE model. In this graph, each modelled variable is a node and non-zero entries in the Jacobian matrix are (weighted) edges of the graph. Interactions can be positive or negative, according to the sign of the Jacobian matrix entry.

-

Directed path detection in this graph is used to determine all feedback loops (in graphs also called cycles or circuits) of the system. They are marked by a set of directed interactions forming a chain in which only the first and the last node (variable) is the same. Thereby, self-loops (loops of length one) can also occur.

-

LoopDetectR allows for detection of all loops of the graph and also reports the sign of each loop, i.e. whether it is a positive feedback loop (the number of negative interactions is even) or a negative feedback loop (the number of negative interactions is uneven). The output is a table that captures the order of the variables forming the loop, their length and the sign of each loop.

-

Jacobian determination in LoopDetectR relies on the package numDeriv, and path finding in graphs uses algorithms supplied in the package igraph.

-
-
-

Solving the ODE model to generate variable values of interest

-

Solving an ODE model can be performed with the package deSolve. Note: You can skip this step if you already have a point of interest in state space, or if you want to use dummy values for the variables such as s_star <- 1:4.

-
# Load example ODE system with function func_POSm4, 
-# Positive feedback chain model from [Baum et al., 2016], 4 variables
-data(func_POSm4)
-# The function func_POSm4 returns a vector, but deSolve needs the vector within
-# a list as output. Therefore, we define a function that simply puts the output 
-# of func_POSm4 into a list:
-func_POSm4_list <- function(t,x,klin,knonlin){list(func_POSm4(t,x,klin,knonlin))}
-# Kinetic parameters of the model, supplied as arguments to func_POSm4
-klin <- c(165,0.044,0.27,550,5000,78,4.4,5.1)
-knonlin <- c(0.3,2)
-# Solve the system using deSolve
-sol <-  deSolve::ode(y = rep(1,4), times = seq(0,15,0.1), func = func_POSm4_list, 
-                     parms=klin, knonlin=knonlin)
-# The solution of the 4-variable system is oscillatory, showing only the first 
-# variable here
-plot(sol[,1],sol[,2],type='l',xlab='time',ylab ='variable 1')
-

-
# Set the last point of the numeric solution as point of interest, omit the 
-# first column (it contains the time)
-s_star <- sol[dim(sol)[1],2:dim(sol)[2]]
-

State variable values of interest could be steady state values, values at a specific point in time (e.g. after a stimulus) or even a set of values (see section Determining loops over a set of variable values).

-
-
-

Calculating the Jacobian matrix

-

The function jacobian from the numDeriv package can be used to determine numerically the Jacobian matrix of an ODE system at a certain set of values for the variables, s_star. The approach is that of finite differences (with real step) or complex step approach, the latter of which is supposed to deliver more exact results [Martins et al., 2003].

-

The input function, in the example func_POSm4 (positive feedback chain model from [Baum et al., 2016]) defines the time derivatives of the modelled variables as a vector: \(f_i(s)=dS_i/dt\). Note that only those input arguments to the function that encode the modelled variables (and hence in whose direction the partial derivatives are taken) are allowed to be called x.

-
klin <- c(165,0.044,0.27,550,5000,78,4.4,5.1)
-knonlin <- c(0.3,2)
-j_matrix <- numDeriv::jacobian(func_POSm4,s_star,method="complex",
-                               t=1,klin=klin,knonlin=knonlin,)
-j_matrix
-
##            [,1]  [,2]  [,3]     [,4]
-## [1,] -1.2396132     0   0.0 -85.9719
-## [2,]  0.9696132 -5550   0.0  85.9719
-## [3,]  0.0000000   550 -82.4   0.0000
-## [4,]  0.0000000     0  78.0  -5.1000
-
signed_jacobian <- sign(j_matrix)
-

The (i,j)th entry of the Jacobian matrix denotes the partial derivative of variable \(S_i\) with respect to variable \(S_j\), \(J_{ij}=\delta S_i/\delta S_j\), which is positive if \(S_j\) has a direct positive effect on \(S_i\), negative if \(S_j\) has a direct negative effect on \(S_i\) and zero if \(S_j\) does not have a direct effect on \(S_i\). For example, the entry in row 2, column 4, \(J_{24}\), of the signed_jacobian matrix above is positive, meaning that in the underlying ODE model, variable 4 positively regulates variable 2.

-
- -
-

Computing feedback loops over multiple sets of variable values of interest

-

In this example of a model of the bacterial cell cycle [Li et al., 2008], it is demonstrated how feedback loops can be determined over multiple sets of variable values. Here, it is focused on the solution of the ODE systems along the time axis (provided as data in the package, li08_solution.RData).

-
# Load in the example ODE model function func_li08, the kinetic parameters are
-# defined within the function, and the function returns a vector of the time
-# derivatives (in the same order as the modelled variables in the arguments)
-data("func_li08")
-# Load sets of variable values (solution to the ODE over time)
-data("li08_solution") #loads the data.frame li08_solution, columns: variables
-# Cast the solution into the correct list format and remove time (first column)
-li08_sol_list <- as.list(as.data.frame(t(li08_solution[,-1])))
-# Compute all different loop lists along the solution
-res_tab <- find_loops_vset(func_li08,vset=li08_sol_list,t=1,
-                           compute_full_list=FALSE)
-

The solutions of the example ODE model give rise to seven different loop lists that are saved as elements of the list res_tab$loop_rep. Here, two examples of resulting loop lists are given (without self-loops).

-
loop_list_2 <- res_tab$loop_rep[[2]][res_tab$loop_rep[[2]]$length>1,]
-loop_list_2
-
##          loop length sign
-## 16 6, 7, 1, 6      3   -1
-## 17    6, 7, 6      2    1
-## 18    2, 3, 2      2   -1
-
loop_list_7 <- res_tab$loop_rep[[7]][res_tab$loop_rep[[7]]$length>1,]
-loop_list_7
-
##            loop length sign
-## 15      1, 2, 1      2   -1
-## 16   1, 3, 2, 1      3    1
-## 17      2, 3, 2      2   -1
-## 18 5, 7, 1,....      4   -1
-## 19 6, 7, 1,....      5    1
-## 20   6, 7, 1, 6      3   -1
-## 21      6, 7, 6      2    1
-## 22 10, 11, ....      6    1
-## 23 10, 12, ....      3   -1
-## 24 10, 13, ....      4   -1
-## 25 10, 14, ....      8   -1
-## 26 10, 14, ....      7    1
-

The entry res_tab$loop_rep_index is a vector of the same length as the number of different states at which the loops were determined (length(li08_sol_list)), and returns which entry of res_tab$loop_rep belongs to each input state.

-
# Determine the loop list belonging to the 10th up to 20th input state. 
-# It is loop_list_2 for all of these input states.
-res_tab$loop_rep_index[10:20]
-
##  [1] 2 2 2 2 2 2 2 2 2 2 2
-

Similarly, res_tab$jac_rep and res_tab$jac_rep_index capture the different Jacobian matrices and for each input state which Jacobian belongs to it.

-

Results of this analysis could be plotted along the solution and analyzed further to discover reasons of changing loops. Please note that in order to obtain the sample solution in li08_solution.RData also event functions are required; the solution cannot be retrieved from integrating func_li08 alone. Please refer to the model’s publication [Li et al., 2008] for details.

-
-
-

Comparing two loop lists

-

LoopDetectR provides a function for comparing the loops of two systems, compare_loop_list. For a meaningful comparison, the loop indices in the compared systems should point to the same variables. This could be the case when regulations change within one system between different sets of variables of interest (along a dynamic trajectory, at different steady states of the system), or when comparing different systems in which one or more regulations are altered (as in the below example the positive feedback chain model vs. the negative feedback chain model, [Baum et al., 2016]).

-
# Load the ODE function of the positive feedback chain model
-data(func_POSm4)
-# Set kinetic parameters
-klin <- c(165,0.044,0.27,550,5000,78,4.4,5.1)
-knonlin <- c(0.3,2)
-# Compute the Jacobian matrix of the system at the state [1,1,1,1]
-j_matrix <- numDeriv::jacobian(func_POSm4,rep(1,4),method="complex",
-                               t=1, klin=klin, knonlin=knonlin)
-# Compute all loops for this Jacobian
-loop_list_pos <- find_loops(j_matrix)
-
-# Function with negative regulation. The altered regulation affects 
-# two entries of the Jacobian matrix. Parameter values and the set of 
-# variable values remain identical.
-j_matrix_neg <- sign(j_matrix)
-j_matrix_neg[1:2,4] <- -sign(j_matrix[1:2,4])
-# Compute the loop list for this Jacobian with altered regulation
-loop_list_neg <- find_loops(j_matrix_neg);
-
-# Compute comparison
-comp_inds <- compare_loop_list(loop_list_pos,loop_list_neg)
-# Only the four self-loops remain identical in both systems (the indices
-# with respect to the first input list, loop_list_pos, are saved in ind_a_id).
-loop_list_pos[comp_inds$ind_a_id,]
-
##   loop length sign
-## 1 1, 1      1   -1
-## 2 2, 2      1   -1
-## 3 3, 3      1   -1
-## 4 4, 4      1   -1
-
# ind_b_id saves the indices of the corresponding loops in the negatively 
-# regulated system, loop_list_neg.
-loop_list_neg[comp_inds$ind_b_id,]
-
##   loop length sign
-## 1 1, 1      1   -1
-## 2 2, 2      1   -1
-## 3 3, 3      1   -1
-## 4 4, 4      1   -1
-
# Two loops are the same in both systems but they have switched their signs. 
-# Their indices in the first list are saved in ind_a_switch
-loop_list_pos[comp_inds$ind_a_switch,]
-
##           loop length sign
-## 5 3, 4, 1,....      4   -1
-## 6   3, 4, 2, 3      3    1
-
# Their indices in the second list are saved in ind_b_switch 
-loop_list_neg[comp_inds$ind_b_switch,]
-
##           loop length sign
-## 5 3, 4, 1,....      4    1
-## 6   3, 4, 2, 3      3   -1
-
# All loops in the positively regulated system do also occur in the negatively
-# regulated system, i.e. ind_a_notin is empty.
-comp_inds$ind_a_notin
-
## integer(0)
-
-
-

References

-

Baum K, Politi AZ, Kofahl B, Steuer R, Wolf J. Feedback, Mass Conservation and Reaction Kinetics Impact the Robustness of Cellular Oscillations. PLoS Comput Biol. 2016;12(12):e1005298.

-

Li S, Brazhnik P, Sobral B, Tyson JJ. A Quantitative Study of the Division Cycle of Caulobacter crescentus Stalked Cells. Plos Comput Biol. 2008;4(1):e9.

-

Martins JRRA, Sturdza P, Alonso JJ. The complex-step derivative approximation. ACM Trans Math Softw. 2003;29(3):245–62.

-
- - - - - - - - - - -