Example #1
0
        public ReadingsSummary(
			DateTime beginStamp,
			DateTime endStamp,
			ReadingValues min,
			ReadingValues max,
			ReadingValues mean,
			ReadingValues sampleStandardDeviation,
			int count,
			Dictionary<double, int> tempCounts,
			Dictionary<double, int> presCounts,
			Dictionary<double, int> humCounts,
			Dictionary<double, int> speedCounts,
			Dictionary<double, int> dirCounts
		)
        {
            BeginStamp = beginStamp;
            EndStamp = endStamp;
            Min = min;
            Max = max;
            Mean = mean;
            SampleStandardDeviation = sampleStandardDeviation;
            Count = count;
            TemperatureCounts = RoundAndCombine(tempCounts);
            PressureCounts = RoundAndCombine(presCounts);
            HumidityCounts = RoundAndCombine(humCounts);
            WindSpeedCounts = RoundAndCombine(speedCounts,2);
            WindDirectionCounts = RoundAndCombine(dirCounts);
        }
Example #2
0
 public ReadingsSummary(
     DateTime beginStamp,
     DateTime endStamp,
     ReadingValues min,
     ReadingValues max,
     ReadingValues mean,
     ReadingValues sampleStandardDeviation,
     int count,
     Dictionary <double, int> tempCounts,
     Dictionary <double, int> presCounts,
     Dictionary <double, int> humCounts,
     Dictionary <double, int> speedCounts,
     Dictionary <double, int> dirCounts
     )
 {
     BeginStamp = beginStamp;
     EndStamp   = endStamp;
     Min        = min;
     Max        = max;
     Mean       = mean;
     SampleStandardDeviation = sampleStandardDeviation;
     Count               = count;
     TemperatureCounts   = RoundAndCombine(tempCounts);
     PressureCounts      = RoundAndCombine(presCounts);
     HumidityCounts      = RoundAndCombine(humCounts);
     WindSpeedCounts     = RoundAndCombine(speedCounts, 2);
     WindDirectionCounts = RoundAndCombine(dirCounts);
 }
        public void ReadingValuesConverterCacheTestA()
        {
            var converterCache = ReadingValuesConverterCache <IReadingValues, ReadingValues> .Default;

            var inputA    = new ReadingValues(0, 0, 0, 0, 0);
            var expectedA = new ReadingValues(32, 0, 0, 0, 0);

            Assert.AreEqual(
                expectedA,
                converterCache.Get(
                    TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit,
                    SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec,
                    PressureUnit.Millibar, PressureUnit.KiloPascals
                    ).Convert(inputA)
                );

            var inputB    = new ReadingValues(30, 1000, .9, 98, 14);
            var expectedB = new ReadingValues(86, 100, .9, 98, 14);

            Assert.AreEqual(
                expectedB,
                converterCache.Get(
                    TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit,
                    SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec,
                    PressureUnit.Millibar, PressureUnit.KiloPascals
                    ).Convert(inputB)
                );
        }
        public void ReadingValuesConverterCacheTestA()
        {
            var converterCache = ReadingValuesConverterCache<IReadingValues, ReadingValues>.Default;

            var inputA = new ReadingValues(0, 0, 0, 0, 0);
            var expectedA = new ReadingValues(32, 0, 0, 0, 0);

            Assert.AreEqual(
                expectedA,
                converterCache.Get(
                    TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit,
                    SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec,
                    PressureUnit.Millibar, PressureUnit.KiloPascals
                ).Convert(inputA)
            );

            var inputB = new ReadingValues(30, 1000, .9, 98, 14);
            var expectedB = new ReadingValues(86, 100, .9, 98, 14);

            Assert.AreEqual(
                expectedB,
                converterCache.Get(
                    TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit,
                    SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec,
                    PressureUnit.Millibar, PressureUnit.KiloPascals
                ).Convert(inputB)
            );
        }
Example #5
0
 public ReadingValuesRange(ReadingValuesRange ranges)
 {
     Temperature = new Range(ranges.Temperature);
     Humidity = new Range(ranges.Humidity);
     Pressure = new Range(ranges.Pressure);
     WindSpeed = new Range(ranges.WindSpeed);
     WindDirection = new Range(ranges.WindDirection);
     _min = _max = null;
 }
Example #6
0
 public ReadingValuesRange(ReadingValuesRange ranges)
 {
     Temperature   = new Range(ranges.Temperature);
     Humidity      = new Range(ranges.Humidity);
     Pressure      = new Range(ranges.Pressure);
     WindSpeed     = new Range(ranges.WindSpeed);
     WindDirection = new Range(ranges.WindDirection);
     _min          = _max = null;
 }
Example #7
0
        public ReadingValuesRange(
			Range temperature,
			Range humidity,
			Range pressure,
			Range windSpeed,
			Range windDirection
		)
        {
            Temperature = new Range(temperature);
            Humidity = new Range(humidity);
            Pressure = new Range(pressure);
            WindSpeed = new Range(windSpeed);
            WindDirection = new Range(windDirection);
            _min = _max = null;
        }
Example #8
0
 /// <summary>
 /// Constructs a new persistent state store with default values.
 /// </summary>
 public PersistentState()
 {
     IsDirty                = true;
     MinRangeSizes          = new ReadingValues(10, 5, 0.20, 0, 0);
     MinRangeSizeDewPoint   = 10;
     MinRangeSizeAirDensity = 0.05;
     HeightAboveSeaLevel    = Double.NaN;
     UserGraphAttribute     = default(UserCalculatedAttribute);
     PressureUnit           = default(PressureUnit);
     TemperatureUnit        = default(TemperatureUnit);
     SpeedUnit              = default(SpeedUnit);
     SelectedDatabases      = null;
     //StationNames = null;
     AutoSyncClock = false;
 }
Example #9
0
 public ReadingValuesRange(
     Range temperature,
     Range humidity,
     Range pressure,
     Range windSpeed,
     Range windDirection
     )
 {
     Temperature   = new Range(temperature);
     Humidity      = new Range(humidity);
     Pressure      = new Range(pressure);
     WindSpeed     = new Range(windSpeed);
     WindDirection = new Range(windDirection);
     _min          = _max = null;
 }
Example #10
0
 /// <summary>
 /// Constructs a new persistent state store with default values.
 /// </summary>
 public PersistentState()
 {
     IsDirty = true;
     MinRangeSizes = new ReadingValues(10, 5, 0.20, 0, 0);
     MinRangeSizeDewPoint = 10;
     MinRangeSizeAirDensity = 0.05;
     HeightAboveSeaLevel = Double.NaN;
     UserGraphAttribute = default(UserCalculatedAttribute);
     PressureUnit = default(PressureUnit);
     TemperatureUnit = default(TemperatureUnit);
     SpeedUnit = default(SpeedUnit);
     SelectedDatabases = null;
     StationNames = null;
     AutoSyncClock = false;
 }
        public void ReadingValuesConverterTestA()
        {
            var converter = new ReadingValuesConverter<ReadingValues, ReadingValues>(
                new TemperatureConverter(TemperatureUnit.Celsius,TemperatureUnit.Fahrenheit),
                new SpeedConverter(SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec),
                new PressureConverter(PressureUnit.Millibar, PressureUnit.KiloPascals)
            );

            var inputA = new ReadingValues(0, 0, 0, 0, 0);
            var expectedA = new ReadingValues(32, 0, 0, 0, 0);

            Assert.AreEqual(expectedA, converter.Convert(inputA));

            var inputB = new ReadingValues(30, 1000, .9, 98, 14);
            var expectedB = new ReadingValues(86, 100, .9, 98, 14);

            Assert.AreEqual(expectedB, converter.Convert(inputB));
        }
        public void ReadingValuesConverterTestA()
        {
            var converter = new ReadingValuesConverter <ReadingValues, ReadingValues>(
                new TemperatureConverter(TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit),
                new SpeedConverter(SpeedUnit.MetersPerSec, SpeedUnit.MetersPerSec),
                new PressureConverter(PressureUnit.Millibar, PressureUnit.KiloPascals)
                );

            var inputA    = new ReadingValues(0, 0, 0, 0, 0);
            var expectedA = new ReadingValues(32, 0, 0, 0, 0);

            Assert.AreEqual(expectedA, converter.Convert(inputA));

            var inputB    = new ReadingValues(30, 1000, .9, 98, 14);
            var expectedB = new ReadingValues(86, 100, .9, 98, 14);

            Assert.AreEqual(expectedB, converter.Convert(inputB));
        }
Example #13
0
        public void TestFixtureSetUp()
        {
            _values = new[] {
                new ReadingValues(1.0, 2.0, Double.NaN, 180, 4.0),
                new ReadingValues(2.0, Double.NaN, Double.NaN, 45, 6.0),
                new ReadingValues(3.0, 6.0, Double.NaN, 315, Double.NaN),
                new ReadingValues(Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN)
            };
            var minMaxCalc = new ReadingValueMinMaxCalculator <ReadingValues>();
            var meanCalc   = new ReadingValuesMeanCalculator <ReadingValues>();

            foreach (var readingValues in _values)
            {
                minMaxCalc.Proccess(readingValues);
                meanCalc.Proccess(readingValues);
            }
            _min    = minMaxCalc.Result.Min;
            _max    = minMaxCalc.Result.Max;
            _mean   = meanCalc.Result;
            _median = ReadingValues.CreateInvalid();
        }
Example #14
0
        public void ConstructorGetTest()
        {
            var values = new ReadingValues(
// ReSharper disable RedundantArgumentName
                temperature: 11.1,
                pressure: 22.2,
                humidity: 33.3,
                windDirection: 44.4,
                windSpeed: 55.5
// ReSharper restore RedundantArgumentName
                );

            Assert.AreEqual(11.1, values.Temperature);
            Assert.AreEqual(22.2, values.Pressure);
            Assert.AreEqual(33.3, values.Humidity);
            Assert.AreEqual(44.4, values.WindDirection);
            Assert.AreEqual(55.5, values.WindSpeed);
            Assert.IsTrue(values.IsValid);
            Assert.IsTrue(values.IsHumidityValid);
            Assert.IsTrue(values.IsTemperatureValid);
            Assert.IsTrue(values.IsPressureValid);
            Assert.IsTrue(values.IsWindSpeedValid);
            Assert.IsTrue(values.IsWindDirectionValid);
        }
Example #15
0
        public void ConstructorGetTest()
        {
            var values = new ReadingValues(
            // ReSharper disable RedundantArgumentName
                temperature: 11.1,
                pressure: 22.2,
                humidity: 33.3,
                windDirection: 44.4,
                windSpeed: 55.5
            // ReSharper restore RedundantArgumentName
            );

            Assert.AreEqual(11.1, values.Temperature);
            Assert.AreEqual(22.2, values.Pressure);
            Assert.AreEqual(33.3, values.Humidity);
            Assert.AreEqual(44.4, values.WindDirection);
            Assert.AreEqual(55.5, values.WindSpeed);
            Assert.IsTrue(values.IsValid);
            Assert.IsTrue(values.IsHumidityValid);
            Assert.IsTrue(values.IsTemperatureValid);
            Assert.IsTrue(values.IsPressureValid);
            Assert.IsTrue(values.IsWindSpeedValid);
            Assert.IsTrue(values.IsWindDirectionValid);
        }
 public void TestFixtureSetUp()
 {
     _values = new[] {
         new ReadingValues(1.0,	2.0,		Double.NaN,180,	4.0),
         new ReadingValues(2.0,	Double.NaN,	Double.NaN,45,	6.0),
         new ReadingValues(3.0,	6.0,		Double.NaN,315,	Double.NaN),
         new ReadingValues(Double.NaN,Double.NaN,Double.NaN,Double.NaN,Double.NaN)
     };
     var minMaxCalc = new ReadingValueMinMaxCalculator<ReadingValues>();
     var meanCalc = new ReadingValuesMeanCalculator<ReadingValues>();
     foreach(var readingValues in _values)
     {
         minMaxCalc.Proccess(readingValues);
         meanCalc.Proccess(readingValues);
     }
     _min = minMaxCalc.Result.Min;
     _max = minMaxCalc.Result.Max;
     _mean = meanCalc.Result;
     _median = ReadingValues.CreateInvalid();
 }
Example #17
0
            public static PackedReading GetCurrentReading(DateTime now, Random rand, IReadingValues lastReading)
            {
                double averagePressure = 1014.23;
                double pressureRange   = 100.0;

                double pressure         = (rand.NextDouble() * pressureRange) - (pressureRange / 2) + averagePressure;
                double windDirectionRad = (rand.NextDouble() * Math.PI * 2.0);


                //double windDirectionDeg = Vector2D.RadiansToDegrees(windDirectionRad);
                //Vector2D windDirectionVec = new Vector2D((Math.Cos(windDirectionRad) * 2.0), (Math.Sin(windDirectionRad) * 2.0));
                //double windDirectionDeg = windDirectionVec.GetNorthRelativeClockwiseAngularDegrees();


                double averageWindSpeed = 9;
                double averageTemp      = 51.0;
                double tempRange        = 10.0;
                double averageHumM      = 79;
                double averageHumA      = 58;

                switch (now.Month)
                {
                case 1: {
                    averageWindSpeed = 10.4;
                    averageTemp      = 27.5;
                    averageHumM      = 77;
                    averageHumA      = 66;
                    break;
                }

                case 2: {
                    averageWindSpeed = 10.3;
                    averageTemp      = 30.5;
                    averageHumM      = 75;
                    averageHumA      = 62;
                    break;
                }

                case 3: {
                    averageWindSpeed = 10.6;
                    averageTemp      = 39.8;
                    averageHumM      = 76;
                    averageHumA      = 57;
                    break;
                }

                case 4: {
                    averageWindSpeed = 10.2;
                    averageTemp      = 49.9;
                    averageHumM      = 74;
                    averageHumA      = 51;
                    break;
                }

                case 5: {
                    averageWindSpeed = 8.7;
                    averageTemp      = 60.0;
                    averageHumM      = 77;
                    averageHumA      = 52;
                    break;
                }

                case 6: {
                    averageWindSpeed = 8;
                    averageTemp      = 68.4;
                    averageHumM      = 80;
                    averageHumA      = 53;
                    break;
                }

                case 7: {
                    averageWindSpeed = 7.3;
                    averageTemp      = 72.6;
                    averageHumM      = 83;
                    averageHumA      = 54;
                    break;
                }

                case 8: {
                    averageWindSpeed = 6.8;
                    averageTemp      = 71;
                    averageHumM      = 86;
                    averageHumA      = 56;
                    break;
                }

                case 9: {
                    averageWindSpeed = 7.4;
                    averageTemp      = 64.0;
                    averageHumM      = 87;
                    averageHumA      = 57;
                    break;
                }

                case 10: {
                    averageWindSpeed = 8.3;
                    averageTemp      = 52.5;
                    averageHumM      = 82;
                    averageHumA      = 55;
                    break;
                }

                case 11: {
                    averageWindSpeed = 9.7;
                    averageTemp      = 42.3;
                    averageHumM      = 79;
                    averageHumA      = 62;
                    break;
                }

                case 12: {
                    averageWindSpeed = 10.1;
                    averageTemp      = 32.5;
                    averageHumM      = 78;
                    averageHumA      = 67;
                    break;
                }
                }
                averageTemp      = UnitUtility.ConvertUnit(averageTemp, TemperatureUnit.Fahrenheit, TemperatureUnit.Celsius);
                tempRange        = 4;
                averageWindSpeed = UnitUtility.ConvertUnit(averageWindSpeed, SpeedUnit.MilesPerHour, SpeedUnit.MetersPerSec) * 4.0;

                double humidityRange = Math.Abs(averageHumM - averageHumA) * 1.5;
                double humidity      = (humidityRange * rand.NextDouble()) - (humidityRange / 2.0) + ((averageHumM + averageHumA) / 2.0);

                humidity /= 100.0;
                double temp = (rand.NextDouble() * tempRange) - (tempRange / 2.0) + averageTemp;

                double windSpeed = rand.NextDouble();

                windSpeed = (windSpeed > 0.5) ? 0 : 4.0 * averageWindSpeed * windSpeed * windSpeed;

                double windDirectionDeg = (((rand.NextDouble() * 360.0) * 4) + 90) / 5.0;           // 4 parts random, 1 part 90 degrees

                var newValues = new ReadingValues(
                    temp,
                    pressure,
                    humidity,
                    windDirectionDeg,
                    windSpeed
                    );

                if (null != lastReading && lastReading.IsValid)
                {
                    var readings = new[] { lastReading, lastReading, lastReading, newValues };

                    var meanCalc = new ReadingValuesMeanCalculator <IReadingValues>();
                }

                var stamp = now.Date.Add(new TimeSpan(now.Hour, now.Minute, now.Second));

                return(new PackedReading(
                           stamp,
                           new PackedReadingValues(newValues)
                           ));
            }
Example #18
0
 public Reading(DateTime timeStamp, ReadingValues values)
     : base(values)
 {
     TimeStamp = timeStamp;
 }
Example #19
0
        public static ReadingsSummary Combine <TSummary>(List <TSummary> readings) where TSummary : IReadingsSummary
        {
            int      totalTempCount   = 0;
            int      totalPresCount   = 0;
            int      totalHumCount    = 0;
            int      totalSpeedCount  = 0;
            int      totalDirCount    = 0;
            int      totalRecordCount = 0;
            DateTime minStamp         = DateTime.MaxValue;
            DateTime maxStamp         = DateTime.MinValue;
            double   dirSinSum        = 0;
            double   dirCosSum        = 0;

            var summary = new ReadingsSummary(
                default(DateTime),
                default(DateTime),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                ReadingValues.CreateInvalid(),
                0,
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>(),
                new Dictionary <double, int>()
                );

            if (0 == readings.Count)
            {
                return(summary);
            }

            summary.Min  = new ReadingValues(Double.MaxValue, Double.MaxValue, Double.MaxValue, Double.MaxValue, Double.MaxValue);
            summary.Max  = new ReadingValues(Double.MinValue, Double.MinValue, Double.MinValue, Double.MinValue, Double.MinValue);
            summary.Mean = new ReadingValues(0, 0, 0, 0, 0);
            summary.SampleStandardDeviation = new ReadingValues(0, 0, 0, 0, 0);

            foreach (var reading in readings)
            {
                if (reading.BeginStamp < minStamp)
                {
                    minStamp = reading.BeginStamp;
                }
                if (reading.EndStamp > maxStamp)
                {
                    maxStamp = reading.EndStamp;
                }

                if (summary.Min.Temperature > reading.Min.Temperature)
                {
                    summary.Min.Temperature = reading.Min.Temperature;
                }
                if (summary.Min.Pressure > reading.Min.Pressure)
                {
                    summary.Min.Pressure = reading.Min.Pressure;
                }
                if (summary.Min.Humidity > reading.Min.Humidity)
                {
                    summary.Min.Humidity = reading.Min.Humidity;
                }
                if (summary.Min.WindSpeed > reading.Min.WindSpeed)
                {
                    summary.Min.WindSpeed = reading.Min.WindSpeed;
                }
                if (summary.Min.WindDirection > reading.Min.WindDirection)
                {
                    summary.Min.WindDirection = reading.Min.WindDirection;
                }
                if (summary.Max.Temperature < reading.Max.Temperature)
                {
                    summary.Max.Temperature = reading.Max.Temperature;
                }
                if (summary.Max.Pressure < reading.Max.Pressure)
                {
                    summary.Max.Pressure = reading.Max.Pressure;
                }
                if (summary.Max.Humidity < reading.Max.Humidity)
                {
                    summary.Max.Humidity = reading.Max.Humidity;
                }
                if (summary.Max.WindSpeed < reading.Max.WindSpeed)
                {
                    summary.Max.WindSpeed = reading.Max.WindSpeed;
                }
                if (summary.Max.WindDirection < reading.Max.WindDirection)
                {
                    summary.Max.WindDirection = reading.Max.WindDirection;
                }

                int localTempCount  = AppendCounts(summary.TemperatureCounts, reading.GetTemperatureCounts());
                int localPresCount  = AppendCounts(summary.PressureCounts, reading.GetPressureCounts());
                int localHumCount   = AppendCounts(summary.HumidityCounts, reading.GetHumidityCounts());
                int localSpeedCount = AppendCounts(summary.WindSpeedCounts, reading.GetWindSpeedCounts());
                int localDirCount   = AppendCounts(summary.WindDirectionCounts, reading.GetWindDirectionCounts());

                totalTempCount   += localTempCount;
                totalPresCount   += localPresCount;
                totalHumCount    += localHumCount;
                totalSpeedCount  += localSpeedCount;
                totalDirCount    += localDirCount;
                totalRecordCount += reading.Count;

                summary.Mean.Temperature += reading.Mean.Temperature * localTempCount;
                summary.Mean.Pressure    += reading.Mean.Pressure * localPresCount;
                summary.Mean.Humidity    += reading.Mean.Humidity * localHumCount;
                summary.Mean.WindSpeed   += reading.Mean.WindSpeed * localSpeedCount;

                double dirRad = reading.Mean.WindDirection * DegToRadFactor;
                dirSinSum += Math.Sin(dirRad) * localDirCount;
                dirCosSum += Math.Cos(dirRad) * localDirCount;
            }

            if (0 != totalTempCount && 1 != totalTempCount)
            {
                summary.Mean.Temperature /= totalTempCount;
            }
            if (0 != totalPresCount && 1 != totalPresCount)
            {
                summary.Mean.Pressure /= totalPresCount;
            }
            if (0 != totalHumCount && 1 != totalHumCount)
            {
                summary.Mean.Humidity /= totalHumCount;
            }
            if (0 != totalSpeedCount && 1 != totalSpeedCount)
            {
                summary.Mean.WindSpeed /= totalSpeedCount;
            }
            summary.Mean.WindDirection = (totalDirCount == 0 || Double.IsNaN(dirSinSum) || Double.IsNaN(dirCosSum))
                            ? Double.NaN
                            : UnitUtility.WrapDegree(Math.Atan2(dirSinSum / totalDirCount, dirCosSum / totalDirCount) * RadToDegFactor);


            double dev;

            foreach (var reading in readings)
            {
                int localTempCount  = reading.GetTemperatureCounts().Sum(c => c.Value);
                int localPresCount  = reading.GetPressureCounts().Sum(c => c.Value);
                int localHumCount   = reading.GetHumidityCounts().Sum(c => c.Value);
                int localSpeedCount = reading.GetWindSpeedCounts().Sum(c => c.Value);
                int localDirCount   = reading.GetWindDirectionCounts().Sum(c => c.Value);

                dev = (reading.Mean.Temperature - summary.Mean.Temperature);
                summary.SampleStandardDeviation.Temperature += (dev * dev) * localTempCount;

                dev = (reading.Mean.Pressure - summary.Mean.Pressure);
                summary.SampleStandardDeviation.Pressure += (dev * dev) * localPresCount;

                dev = (reading.Mean.Humidity - summary.Mean.Humidity);
                summary.SampleStandardDeviation.Humidity += (dev * dev) * localHumCount;

                dev = (reading.Mean.WindSpeed - summary.Mean.WindSpeed);
                summary.SampleStandardDeviation.WindSpeed += (dev * dev) * localSpeedCount;

                dev = (reading.Mean.WindDirection - summary.Mean.WindDirection);
                summary.SampleStandardDeviation.WindDirection += (dev * dev) * localDirCount;
            }

            if (0 != totalTempCount && 1 != totalTempCount)
            {
                summary.SampleStandardDeviation.Temperature = Math.Sqrt(summary.SampleStandardDeviation.Temperature / totalTempCount);
            }
            if (0 != totalPresCount && 1 != totalPresCount)
            {
                summary.SampleStandardDeviation.Pressure = Math.Sqrt(summary.SampleStandardDeviation.Pressure / totalPresCount);
            }
            if (0 != totalHumCount && 1 != totalHumCount)
            {
                summary.SampleStandardDeviation.Humidity = Math.Sqrt(summary.SampleStandardDeviation.Humidity / totalHumCount);
            }
            if (0 != totalSpeedCount && 1 != totalSpeedCount)
            {
                summary.SampleStandardDeviation.WindSpeed = Math.Sqrt(summary.SampleStandardDeviation.WindSpeed / totalSpeedCount);
            }
            if (0 != totalDirCount && 1 != totalDirCount)
            {
                summary.SampleStandardDeviation.WindDirection = Math.Sqrt(summary.SampleStandardDeviation.WindDirection / totalDirCount);
            }

            summary.Count      = totalRecordCount;
            summary.BeginStamp = minStamp;
            summary.EndStamp   = maxStamp;
            return(summary);
        }
Example #20
0
        private static ReadingsSummary FormSummary <T>(DateTime dateRangeLow, DateTime dateRangeHigh, List <T> readings) where T : IReadingValues
        {
            int    tempCount  = 0;
            int    presCount  = 0;
            int    humCount   = 0;
            int    speedCount = 0;
            int    dirCount   = 0;
            double tempSum    = 0;
            double presSum    = 0;
            double humSum     = 0;
            double speedSum   = 0;
            double dirSinSum  = 0;
            double dirCosSum  = 0;

            var tempCounts  = new Dictionary <double, int>();
            var presCounts  = new Dictionary <double, int>();
            var humCounts   = new Dictionary <double, int>();
            var speedCounts = new Dictionary <double, int>();
            var dirCounts   = new Dictionary <double, int>();

            int count;

            ReadingValues minValues;
            ReadingValues maxValues;
            ReadingValues meanValues;
            ReadingValues sampleStandardDeviationValues;

            if (readings.Count > 0)
            {
                minValues = new ReadingValues(readings[0]);
                maxValues = new ReadingValues(readings[0]);

                double value;

                for (int i = 0; i < readings.Count; i++)
                {
                    T reading = readings[i];

                    if (reading.IsTemperatureValid)
                    {
                        tempCount++;
                        value    = reading.Temperature;
                        tempSum += value;

                        if (minValues.Temperature > value)
                        {
                            minValues.Temperature = value;
                        }
                        else if (maxValues.Temperature < value)
                        {
                            maxValues.Temperature = value;
                        }

                        value             = Math.Round(value);
                        tempCounts[value] = tempCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsPressureValid)
                    {
                        presCount++;
                        value    = reading.Pressure;
                        presSum += value;

                        if (minValues.Pressure > value)
                        {
                            minValues.Pressure = value;
                        }
                        else if (maxValues.Pressure < value)
                        {
                            maxValues.Pressure = value;
                        }

                        value             = Math.Round(value);
                        presCounts[value] = presCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsHumidityValid)
                    {
                        humCount++;
                        value   = reading.Humidity;
                        humSum += value;

                        if (minValues.Humidity > value)
                        {
                            minValues.Humidity = value;
                        }
                        else if (maxValues.Humidity < value)
                        {
                            maxValues.Humidity = value;
                        }

                        value            = Math.Round(value);
                        humCounts[value] = humCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsWindSpeedValid)
                    {
                        speedCount++;
                        value     = reading.WindSpeed;
                        speedSum += value;

                        if (minValues.WindSpeed > value)
                        {
                            minValues.WindSpeed = value;
                        }
                        else if (maxValues.WindSpeed < value)
                        {
                            maxValues.WindSpeed = value;
                        }

                        value = Math.Round(value * 2.0) / 2;                     // round to nearest .5
                        speedCounts[value] = speedCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                    if (reading.IsWindDirectionValid)
                    {
                        dirCount++;
                        value = reading.WindDirection;
                        //dirSum += value;

                        double dirRad = value * DegToRadFactor;
                        dirSinSum += Math.Sin(dirRad);
                        dirCosSum += Math.Cos(dirRad);

                        if (minValues.WindDirection > value)
                        {
                            minValues.WindDirection = value;
                        }
                        else if (maxValues.WindDirection < value)
                        {
                            maxValues.WindDirection = value;
                        }

                        value            = Math.Round(value);
                        dirCounts[value] = dirCounts.TryGetValue(value, out count) ? count + 1 : 1;
                    }
                }

                meanValues = new ReadingValues(
                    tempCount == 0 ? Double.NaN : (tempSum / tempCount),
                    presCount == 0 ? Double.NaN : (presSum / presCount),
                    humCount == 0 ? Double.NaN : (humSum / humCount),
                    (dirCount == 0 || Double.IsNaN(dirSinSum) || Double.IsNaN(dirCosSum))
                                                ? Double.NaN
                                                : UnitUtility.WrapDegree(Math.Atan2(dirSinSum / dirCount, dirCosSum / dirCount) * RadToDegFactor),
                    speedCount == 0 ? Double.NaN : (speedSum / speedCount)
                    );

                sampleStandardDeviationValues = new ReadingValues(0, 0, 0, 0, 0);

                for (int i = 0; i < readings.Count; i++)
                {
                    T reading = readings[i];

                    if (reading.IsTemperatureValid)
                    {
                        value = reading.Temperature - meanValues.Temperature;
                        sampleStandardDeviationValues.Temperature += value * value;
                    }
                    if (reading.IsPressureValid)
                    {
                        value = reading.Pressure - meanValues.Pressure;
                        sampleStandardDeviationValues.Pressure += value * value;
                    }
                    if (reading.IsHumidityValid)
                    {
                        value = reading.Humidity - meanValues.Humidity;
                        sampleStandardDeviationValues.Humidity += value * value;
                    }
                    if (reading.IsWindSpeedValid)
                    {
                        value = reading.WindSpeed - meanValues.WindSpeed;
                        sampleStandardDeviationValues.WindSpeed += value * value;
                    }
                    if (reading.IsWindDirectionValid)
                    {
                        value = reading.WindDirection - meanValues.WindDirection;
                        sampleStandardDeviationValues.WindDirection += value * value;
                    }
                }

                sampleStandardDeviationValues.Temperature   = Math.Sqrt(sampleStandardDeviationValues.Temperature / tempCount);
                sampleStandardDeviationValues.Pressure      = Math.Sqrt(sampleStandardDeviationValues.Pressure / presCount);
                sampleStandardDeviationValues.Humidity      = Math.Sqrt(sampleStandardDeviationValues.Humidity / humCount);
                sampleStandardDeviationValues.WindSpeed     = Math.Sqrt(sampleStandardDeviationValues.WindSpeed / speedCount);
                sampleStandardDeviationValues.WindDirection = Math.Sqrt(sampleStandardDeviationValues.WindDirection / dirCount);
            }
            else
            {
                minValues  = ReadingValues.CreateInvalid();
                maxValues  = ReadingValues.CreateInvalid();
                meanValues = ReadingValues.CreateInvalid();
                sampleStandardDeviationValues = ReadingValues.CreateInvalid();
            }

            return(new ReadingsSummary(
                       dateRangeLow,
                       dateRangeHigh.Subtract(new TimeSpan(1)),
                       minValues, maxValues,
                       meanValues, sampleStandardDeviationValues,
                       readings.Count,
                       tempCounts,
                       presCounts,
                       humCounts,
                       speedCounts,
                       dirCounts
                       ));
        }
Example #21
0
 public new static ReadingAggregate CreateInvalid()
 {
     return(new ReadingAggregate(DateTime.MinValue, DateTime.MaxValue, ReadingValues.CreateInvalid(), 0));
 }
Example #22
0
 public ReadingAggregate(DateTime beingStamp, DateTime endStamp, ReadingValues values, int count) : base(values)
 {
     TimeRange = new TimeRange(beingStamp, endStamp);
     Count     = count;
 }
Example #23
0
 public ReadingAggregate(DateTime beingStamp, DateTime endStamp, ReadingValues values, int count)
     : base(values)
 {
     TimeRange = new TimeRange(beingStamp, endStamp);
     Count = count;
 }