esqLABS / esqlabsR

Utility functions for modelling and simulation workflows within esqLABS organization
https://esqlabs.github.io/esqlabsR/
GNU General Public License v2.0
16 stars 2 forks source link

`sensitivityCalculation` bugs when one of the simulation failed #679

Closed Felixmil closed 1 month ago

Felixmil commented 2 months ago
devtools::load_all()
#> ℹ Loading esqlabsR
#> Loading required package: ospsuite
#> 
#> Loading required package: rClr
#> 
#> Loading the dynamic library for Microsoft .NET runtime...
#> Loaded Common Language Runtime version 4.0.30319.42000

simPath <- system.file("extdata", "Aciclovir.pkml", package = "ospsuite")
simulation <- loadSimulation(simPath)
outputPaths <- "Organism|PeripheralVenousBlood|Aciclovir|Plasma (Peripheral Venous Blood)"
parameterPaths <- "Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose"
variationRange <- c(-1, 2, 20) 

set.seed(123)
results <- sensitivityCalculation(
  simulation = simulation,
  outputPaths = outputPaths,
  parameterPaths = parameterPaths,
  variationRange = variationRange
)
#> Warning in .getConcurrentSimulationRunnerResults(results = results, resultsIdSimulationIdMap = resultsIdSimulationBatchIdMap, : Simulation run failed: some variables became negative when trying to reach t=1. There are different possible reasons for this:
#> 
#>   - Solver tolerances are too high. Please reduce the absolute and relative tolerances by one order of magnitude (e.g. from 1E-9 to 1E-10) and restart the simulation.
#>   - Some variables which are allowed to be negative were defined as non-negative.
#>   - Model is not properly established (e.g. the kinetic should be k*[A] but was defined as k*[B] etc.)
#> 
#> The following variables became negative :
#> Vergin 1995 IV|Organism|VenousBlood|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|VenousBlood|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|ArterialBlood|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|ArterialBlood|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Bone|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Bone|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Bone|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Bone|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Brain|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Brain|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Brain|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Brain|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Fat|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Fat|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Fat|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Fat|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Gonads|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Gonads|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Gonads|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Gonads|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Heart|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Heart|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Heart|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Heart|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Kidney|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Kidney|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Kidney|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Kidney|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Kidney|Urine|Aciclovir
#> Vergin 1995 IV|Organism|Stomach|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Stomach|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Stomach|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Stomach|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|Duodenum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|Duodenum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|Duodenum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|Duodenum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperJejunum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperJejunum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperJejunum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperJejunum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerJejunum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerJejunum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerJejunum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerJejunum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperIleum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperIleum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperIleum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|UpperIleum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerIleum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerIleum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerIleum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|SmallIntestine|Mucosa|LowerIleum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Caecum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Caecum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Caecum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Caecum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonAscendens|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonAscendens|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonAscendens|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonAscendens|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonTransversum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonTransversum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonTransversum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonTransversum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonDescendens|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonDescendens|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonDescendens|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonDescendens|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonSigmoid|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonSigmoid|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonSigmoid|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|ColonSigmoid|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Rectum|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Rectum|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Rectum|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|LargeIntestine|Mucosa|Rectum|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Liver|Periportal|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Liver|Periportal|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Liver|Periportal|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Liver|Periportal|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Lung|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Lung|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Lung|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Lung|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Muscle|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Muscle|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Muscle|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Muscle|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Pancreas|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Pancreas|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Pancreas|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Pancreas|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|PortalVein|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|PortalVein|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Skin|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Skin|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Skin|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Skin|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Spleen|Plasma|Aciclovir
#> Vergin 1995 IV|Organism|Spleen|BloodCells|Aciclovir
#> Vergin 1995 IV|Organism|Spleen|Interstitial|Aciclovir
#> Vergin 1995 IV|Organism|Spleen|Intracellular|Aciclovir
#> Vergin 1995 IV|Organism|Saliva|Saliva|Aciclovir
#> Called from: sensitivityCalculation(simulation = simulation, outputPaths = outputPaths, 
#>     parameterPaths = parameterPaths, variationRange = variationRange)
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#194: for (parameterPath in seq_along(simulationResultsBatch)) {
#>     for (parameterFactor in seq_along(simulationResultsBatch[[parameterPath]])) {
#>         simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>             batchResultsIdMap[[parameterPath]][[parameterFactor]])
#>     }
#> }
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#195: for (parameterFactor in seq_along(simulationResultsBatch[[parameterPath]])) {
#>     simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>         batchResultsIdMap[[parameterPath]][[parameterFactor]])
#> }
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#196: simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>     batchResultsIdMap[[parameterPath]][[parameterFactor]])
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#196: simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>     batchResultsIdMap[[parameterPath]][[parameterFactor]])
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#196: simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>     batchResultsIdMap[[parameterPath]][[parameterFactor]])
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#196: simulationResultsBatch[[parameterPath]][[parameterFactor]] <- purrr::pluck(simulationBatchesResults, 
#>     batchResultsIdMap[[parameterPath]][[parameterFactor]])
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#201: browser()
#> debug at C:/Users/Felix/Code/esqlabsR/R/sensitivity-calculation.R#206: pkData <- .simulationResultsBatchToPKDataFrame(simulationResultsBatch, 
#>     parameterPaths)
#> Error in `map2()`:
#> ℹ In index: 1.
#> ℹ With name: Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose.
#> Caused by error in `validateIsOfType()`:
#> ! base::tryCatch: argument 'container' is of type 'NULL', but expected 'Simulation, or Container, or Molecule'!

Created on 2024-07-09 with reprex v2.1.1

According to my test, it is caused by this part of sensitivity-calculation.R:

  for (parameterPath in seq_along(simulationResultsBatch)) {
    for (parameterFactor in seq_along(simulationResultsBatch[[parameterPath]])) {
      simulationResultsBatch[[parameterPath]][[parameterFactor]] <-
        purrr::pluck(simulationBatchesResults, batchResultsIdMap[[parameterPath]][[parameterFactor]])
    }
  }

This function expects that the simulation batch output has the same structure (lengh) than the simulationBatch initialization, however, in case of failing simulation, it is not the case.

If we look at the resulting simulationResultsBatch after this code we can see:

$`Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose`
$`Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose`$`1`
[1] "80cc4502-ac4c-42d1-9271-4bb85f01801a"

$`Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose`$`2`
SimulationResults: 
   Number of individuals: 1 

$`Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose`$`20`
SimulationResults: 
   Number of individuals: 1 

$`Applications|IV 250mg 10min|Application_1|ProtocolSchemaItem|Dose`[[4]]
SimulationResults: 
   Number of individuals: 1 

The first nested simulation is not there, and the last one has a wrong ID.

All these cause the next code line to break:

pkData <- .simulationResultsBatchToPKDataFrame(simulationResultsBatch, parameterPaths)