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));
        }
示例#2
0
        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);
            }
        }