public void AddReading(DepthReadingModel reading)
        {
            var index = DrillSiteModel.DepthReadings.Count();

            DrillSiteModel.AddReading(reading);
            // todo - change to List for guaranteed ordering
            var depthReadings = DrillSiteModel.DepthReadings.ToList();

            UpdateReadingsTrustworthiness(depthReadings, index);
        }
        private void TrickleDownTrustWorthiness(DrillSiteModel drillSite, DepthReadingModel currentReading, int nRecordsRequired)
        {
            var index = drillSite.DepthReadings.OrderBy(x => x.Id).IndexOf(currentReading);
            // starting index is the current index - the number of records necessary for the query
            // e.g. if we need to query 3 records and current index is 35, then start index would be 32
            var indexOfFirstRequiredReading = Math.Max(0, index - nRecordsRequired);
            var indexToUpdate    = index - indexOfFirstRequiredReading;
            var affectedReadings = drillSite.DepthReadings.OrderBy(x => x.Id).Skip(indexOfFirstRequiredReading).Take(nRecordsRequired * 2 + 1).ToList();

            DrillSiteService.UpdateReadingsTrustworthiness(affectedReadings, indexToUpdate);
        }
        private static void CalculateTrustWorthiness(DrillConfigModel config, DepthReadingModel reading, List <DepthReadingModel> dipRecordsToQuery, List <DepthReadingModel> azimuthRecordsToQuery)
        {
            // take averages
            var azimuthAverage = azimuthRecordsToQuery.Any()
                ? azimuthRecordsToQuery.Sum(x => x.Azimuth) / azimuthRecordsToQuery.Count()
                : (double?)null;
            var dipAverage = dipRecordsToQuery.Any()
                ? dipRecordsToQuery.Sum(x => x.Dip) / dipRecordsToQuery.Count()
                : (double?)null;

            if (!dipAverage.HasValue || !azimuthAverage.HasValue)
            {
                // assume trustworthy, likely no records exist before this node
                reading.TrustWorthiness = 100f;
                return;
            }

            // calculate trustworthiness
            reading.TrustWorthiness = Math.Abs(reading.Azimuth - azimuthAverage.Value) < config.AzimuthMarginOfError &&
                                      Math.Abs(reading.Dip - dipAverage.Value) < config.DipMarginOfError
                ? 100
                : 0;
        }
 public DepthReadingService(DepthReadingModel depthReadingModel)
 {
     DepthReadingModel = depthReadingModel;
 }