private PKInterval pkIntervalFromDosingInterval(DosingInterval dosingInterval, List <float> time, List <float> concentration, PKCalculationOptions options) { if (dosingInterval == null) { return(null); } var dosingStartIndex = ArrayHelper.ClosestIndexOf(time, dosingInterval.StartValue); var dosingEndIndex = ArrayHelper.ClosestIndexOf(time, dosingInterval.EndValue); if (oneTimeIndexInvalid(dosingStartIndex, dosingEndIndex)) { return(null); } return(createPKInterval(time, concentration, dosingStartIndex, dosingEndIndex, options, dosingInterval.DrugMassPerBodyWeight)); }
private IEnumerable <DosingInterval> allIntervalsFor(IReadOnlyList <float> time, IReadOnlyList <float> concentration, PKCalculationOptions options) { var timeValues = time.ToList(); var concentrationValues = concentration.ToList(); if (!timeValues.Any() || !concentrationValues.Any()) { yield break; } var fullRange = new DosingInterval(timeValues, concentrationValues, options); //only one interval if (options.SingleDosing) { yield return(fullRange); yield break; } var firstDosingStartIndex = ArrayHelper.ClosestIndexOf(timeValues, options.FirstDosingStartValue); var firstDosingEndIndex = ArrayHelper.ClosestIndexOf(timeValues, options.FirstDosingEndValue); var lastMinusOneDosingStartIndex = ArrayHelper.ClosestIndexOf(timeValues, options.LastMinusOneDosingStartValue); var lastDosingStartIndex = ArrayHelper.ClosestIndexOf(timeValues, options.LastDosingStartValue); var lastDosingEndIndex = ArrayHelper.ClosestIndexOf(timeValues, options.LastDosingEndValue); if (oneTimeIndexInvalid(firstDosingEndIndex, firstDosingStartIndex, lastDosingStartIndex, lastDosingEndIndex, lastMinusOneDosingStartIndex)) { yield break; } yield return(dosingInterval(timeValues, concentrationValues, firstDosingStartIndex, firstDosingEndIndex, options)); //The end time of the last minus one dosing interval is the start time of the last interval yield return(dosingInterval(timeValues, concentrationValues, lastMinusOneDosingStartIndex, lastDosingStartIndex, options)); yield return(dosingInterval(timeValues, concentrationValues, lastDosingStartIndex, lastDosingEndIndex, options)); yield return(fullRange); }
private void addDynamicPKValues(ICache <string, double> pk, IReadOnlyList <UserDefinedPKParameter> dynamicPKParameters, List <float> time, List <float> concentration, PKCalculationOptions options) { foreach (var dynamicPKParameter in dynamicPKParameters) { //No start time specified? Then we assume we want to calculate from the beginning of the time array var startTime = dynamicPKParameter.EstimateStartTimeFrom(options) ?? time.First(); //No end time specified? Then we assume we want to calculate until the end of the time array var endTime = dynamicPKParameter.EstimateEndTimeFrom(options) ?? time.Last(); var startIndex = ArrayHelper.ClosestIndexOf(time, startTime); var endIndex = ArrayHelper.ClosestIndexOf(time, endTime); if (oneTimeIndexInvalid(startIndex, endIndex) || startIndex >= endIndex) { continue; } var drugMassPerBodyWeight = dynamicPKParameter.EstimateDrugMassPerBodyWeight(options) ?? options.TotalDrugMassPerBodyWeight; var pkInterval = createPKInterval(time, concentration, startIndex, endIndex, options, drugMassPerBodyWeight: drugMassPerBodyWeight, concentrationThreshold: dynamicPKParameter.ConcentrationThreshold); var value = pkInterval.ValueFor(dynamicPKParameter.StandardPKParameter, dynamicPKParameter.NormalizationFactor); setValue(pk, dynamicPKParameter.Name, value); } }