protected virtual PopulationSimulationPKAnalyses CalculateFor(IModelCoreSimulation simulation, SimulationResults runResults, Action <int> performIndividualScalingAction) { _lazyLoadTask.Load(simulation as ILazyLoadable); var popAnalyses = new PopulationSimulationPKAnalyses(); foreach (var selectedQuantityForMolecule in simulation.OutputSelections.GroupBy(moleculeNameFrom)) { var moleculeName = selectedQuantityForMolecule.Key; var pkCalculationOptions = _pkCalculationOptionsFactory.CreateFor(simulation, moleculeName); var allApplicationParameters = simulation.AllApplicationParametersOrderedByStartTimeFor(moleculeName); foreach (var selectedQuantity in selectedQuantityForMolecule) { addPKParametersForOutput(simulation, runResults, performIndividualScalingAction, selectedQuantity, popAnalyses, moleculeName, pkCalculationOptions, allApplicationParameters); } } return(popAnalyses); }
public PKCalculationOptions CreateFor(IModelCoreSimulation simulation, string moleculeName) { var options = new PKCalculationOptions(); var endTime = (simulation.EndTime ?? 0).ToFloat(); var allApplicationParameters = simulation.AllApplicationParametersOrderedByStartTimeFor(moleculeName); // all application start times starting before the end of the simulation var applicationStartTimes = allApplicationParameters.Select(x => x.StartTime.Value).ToFloatArray(); var applicationEndTimes = new List <float>(applicationStartTimes.Skip(1)) { endTime }; for (int i = 0; i < applicationStartTimes.Length; i++) { var dosingInterval = new DosingInterval { StartValue = applicationStartTimes[i], EndValue = applicationEndTimes[i] }; options.AddInterval(dosingInterval); } // single dosing if (applicationStartTimes.Length <= 1) { options.InfusionTime = allApplicationParameters.FirstOrDefault()?.InfusionTime?.Value; } // Once all dosing are defined, update total drug mass UpdateTotalDrugMassPerBodyWeight(simulation, moleculeName, options, allApplicationParameters); return(options); }