From ad41465c0560b326f915beae631fa49bc9eacc89 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Fri, 24 Aug 2018 21:28:00 -0400 Subject: [PATCH] Simplify CurveData data structures --- .gitignore | 1 + Core.Tests/Charter/CurveDataConverterTests.cs | 13 +++--- Core/Charter/CurveData.cs | 16 ++----- Core/Charter/CurveDataConverter.cs | 43 +++++-------------- Core/Charter/CurveParamSet.cs | 4 +- Core/Charter/CurveType.cs | 16 +++++++ Core/Core.csproj | 1 + Core/Utility/ReflectionExtensions.cs | 42 +++++------------- WebCms/App_Data/Models/all.dll.path | 2 +- WebCms/Services/LeafGasCharter.cs | 13 ++---- 10 files changed, 55 insertions(+), 96 deletions(-) create mode 100644 Core/Charter/CurveType.cs diff --git a/.gitignore b/.gitignore index 3db8897..7ec675b 100644 --- a/.gitignore +++ b/.gitignore @@ -199,3 +199,4 @@ weblogs/* # ImageProcessor DiskCache **/App_Data/cache/ +WebCms/App_Data/Models/all.dll.path diff --git a/Core.Tests/Charter/CurveDataConverterTests.cs b/Core.Tests/Charter/CurveDataConverterTests.cs index 4a6ff47..4d45e63 100644 --- a/Core.Tests/Charter/CurveDataConverterTests.cs +++ b/Core.Tests/Charter/CurveDataConverterTests.cs @@ -19,7 +19,7 @@ namespace LeafWeb.Core.Tests.Charter using (var parser = new LeafGasComparisonParser(fileInfo)) leafGasComparisons = parser.Parse(); - var curves = CurveDataConverter.Convert(leafGasComparisons); + var curves = CurveDataConverter.Convert(leafGasComparisons).ToArray(); Assert.That(curves.Count(),Is.EqualTo(1)); } @@ -36,7 +36,7 @@ namespace LeafWeb.Core.Tests.Charter } [Test] - public void Convert_ThrowsExpectionWhenNotEnoughDataSets() + public void Convert_PartialCurveData() { var fileInfo = FileUtility.GetContentFile(ContentDirectory, "leafgascomparison_PartialCurveData.csv"); @@ -44,9 +44,10 @@ namespace LeafWeb.Core.Tests.Charter using (var parser = new LeafGasComparisonParser(fileInfo)) leafGasComparisons = parser.Parse(); - //var h = CurveDataConverter.Convert(leafGasComparisons).ToArray(); + //var h = CurveDataConverter.Convert(leafGasComparisons).ToArray(); - Assert.Throws(() => CurveDataConverter.Convert(leafGasComparisons).ToArray()); - } - } + var curves = CurveDataConverter.Convert(leafGasComparisons).ToArray(); + Assert.That(curves.Count(), Is.EqualTo(1)); + } + } } \ No newline at end of file diff --git a/Core/Charter/CurveData.cs b/Core/Charter/CurveData.cs index d3fcee7..5116947 100644 --- a/Core/Charter/CurveData.cs +++ b/Core/Charter/CurveData.cs @@ -1,21 +1,11 @@ -using System.ComponentModel; +using System.Collections.Generic; namespace LeafWeb.Core.Charter { - public class CurveData + public class CurveData { public string CurveId { get; set; } - [DisplayName("Internal conductance fixed, compensation point and M-M constants fixed")] - public CurveParamSet FixedCndFixedCmp { get; set; } - - [DisplayName("Internal conductance fixed, compensation point and M-M constants estimated")] - public CurveParamSet FixedCndEstimatedCmp { get; set; } - - [DisplayName("Internal conductance estimated, compensation point and M-M constants fixed")] - public CurveParamSet EstimatedCndFixedCmp { get; set; } - - [DisplayName("Internal conductance estimated, compensation point and M-M constants estimated")] - public CurveParamSet EstimatedCndEstimatedCmp { get; set; } + public IList ParamSets { get; set; } = new List(); } } \ No newline at end of file diff --git a/Core/Charter/CurveDataConverter.cs b/Core/Charter/CurveDataConverter.cs index 6de0575..45b115e 100644 --- a/Core/Charter/CurveDataConverter.cs +++ b/Core/Charter/CurveDataConverter.cs @@ -28,18 +28,6 @@ namespace LeafWeb.Core.Charter foreach (var comparisonGroup in comparisonGroups) { - if (comparisonGroup.FitType.Count() != 4) - { - var missing = - from rwp in new[] {true, false} - from gamma in new [] {true, false} - where !comparisonGroup.FitType.Any(ft => ft.FitRwp == rwp && ft.FitGammaStar == gamma) - select $"(FitRwp: {(rwp ? "yes" : "no")}, FitGamma*: {(gamma ? "yes" : "no")})"; - throw new ParseException( - $"Curve data in '{comparisonGroup.CurveID}' requires data sets representing all combinations of FitRwp and FitGamma." - + " Combinations missing are: " + string.Join(", ", missing)); - } - var curveData = new CurveData {CurveId = comparisonGroup.CurveID}; foreach (var fitType in comparisonGroup.FitType) @@ -52,29 +40,18 @@ namespace LeafWeb.Core.Charter // gammastar = chloroplastic CO2 partial pressure photocompensation point = "Cmp" // put each comparison into the correct curve location - if (!fitType.FitRwp && !fitType.FitGammaStar) - curveData.FixedCndFixedCmp = paramSet; - else if (!fitType.FitRwp && fitType.FitGammaStar) - curveData.FixedCndEstimatedCmp = paramSet; - else if (fitType.FitRwp && !fitType.FitGammaStar) - curveData.EstimatedCndFixedCmp = paramSet; - else if (fitType.FitRwp && fitType.FitGammaStar) - curveData.EstimatedCndEstimatedCmp = paramSet; + if (!fitType.FitRwp && !fitType.FitGammaStar) + paramSet.CurveType = CurveType.FixedCndFixedCmp; + else if (!fitType.FitRwp && fitType.FitGammaStar) + paramSet.CurveType = CurveType.FixedCndEstimatedCmp; + else if ( fitType.FitRwp && !fitType.FitGammaStar) + paramSet.CurveType = CurveType.EstimatedCndFixedCmp; + else if ( fitType.FitRwp && fitType.FitGammaStar) + paramSet.CurveType = CurveType.EstimatedCndEstimatedCmp; + + curveData.ParamSets.Add(paramSet); } - // guarantee all data is present - if (curveData.FixedCndFixedCmp == null) - throw new ArgumentException( - $"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName(c=>c.FixedCndFixedCmp)}"); - if (curveData.FixedCndEstimatedCmp == null) - throw new ArgumentException( - $"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName(c=>c.FixedCndEstimatedCmp)}"); - if (curveData.EstimatedCndFixedCmp == null) - throw new ArgumentException( - $"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName(c=>c.EstimatedCndFixedCmp)}"); - if (curveData.EstimatedCndEstimatedCmp == null) - throw new ArgumentException( - $"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName(c=>c.EstimatedCndEstimatedCmp)}"); yield return curveData; } } diff --git a/Core/Charter/CurveParamSet.cs b/Core/Charter/CurveParamSet.cs index d70a163..b604076 100644 --- a/Core/Charter/CurveParamSet.cs +++ b/Core/Charter/CurveParamSet.cs @@ -4,7 +4,9 @@ namespace LeafWeb.Core.Charter { public class CurveParamSet { - public List AnetMeasChloro1Data { get; } = new List(); // y=AnetMeas column, x=PCO2c, for PointLimitType=1 + public CurveType CurveType { get; set; } + + public List AnetMeasChloro1Data { get; } = new List(); // y=AnetMeas column, x=PCO2c, for PointLimitType=1 public List AnetMeasChloro2Data { get; } = new List(); // y=AnetMeas column, x=PCO2c, for PointLimitType=2 public List AnetMeasChloro3Data { get; } = new List(); // y=AnetMeas column, x=PCO2c, for PointLimitType=3 public List AnetMeasInter1Data { get; } = new List(); // y=AnetMeas column, x=PCO2i, for PointLimitType=1 diff --git a/Core/Charter/CurveType.cs b/Core/Charter/CurveType.cs new file mode 100644 index 0000000..a3c9bd4 --- /dev/null +++ b/Core/Charter/CurveType.cs @@ -0,0 +1,16 @@ +using System.ComponentModel; + +namespace LeafWeb.Core.Charter +{ + public enum CurveType + { + [Description("Internal conductance fixed, compensation point and M-M constants fixed")] + FixedCndFixedCmp, + [Description("Internal conductance fixed, compensation point and M-M constants estimated")] + FixedCndEstimatedCmp, + [Description("Internal conductance estimated, compensation point and M-M constants fixed")] + EstimatedCndFixedCmp, + [Description("Internal conductance estimated, compensation point and M-M constants estimated")] + EstimatedCndEstimatedCmp + } +} \ No newline at end of file diff --git a/Core/Core.csproj b/Core/Core.csproj index e4a676e..7618753 100644 --- a/Core/Core.csproj +++ b/Core/Core.csproj @@ -84,6 +84,7 @@ + diff --git a/Core/Utility/ReflectionExtensions.cs b/Core/Utility/ReflectionExtensions.cs index 2ac1fe2..1fa4781 100644 --- a/Core/Utility/ReflectionExtensions.cs +++ b/Core/Utility/ReflectionExtensions.cs @@ -10,37 +10,15 @@ namespace LeafWeb.Core.Utility { public static class ReflectionExtensions { - public static string GetPropertyDisplayName(Expression> propertyExpression) - { - var memberInfo = GetPropertyInformation(propertyExpression.Body); - if (memberInfo == null) - { - throw new ArgumentException("No property reference expression was found.", nameof(propertyExpression)); - } - - var attr = memberInfo.Attributes().SingleOrDefault(); - return attr == null ? memberInfo.Name : attr.DisplayName; - } - - public static MemberInfo GetPropertyInformation(Expression propertyExpression) - { - Debug.Assert(propertyExpression != null, "propertyExpression != null"); - var memberExpr = propertyExpression as MemberExpression; - if (memberExpr == null) - { - var unaryExpr = propertyExpression as UnaryExpression; - if (unaryExpr != null && unaryExpr.NodeType == ExpressionType.Convert) - { - memberExpr = unaryExpr.Operand as MemberExpression; - } - } - - if (memberExpr != null && memberExpr.Member.MemberType == MemberTypes.Property) - { - return memberExpr.Member; - } - - return null; - } + public static string GetDescription(this Enum value) + { + return + value + .GetType() + .GetMember(value.ToString()) + .FirstOrDefault() + ?.GetCustomAttribute() + ?.Description; + } } } \ No newline at end of file diff --git a/WebCms/App_Data/Models/all.dll.path b/WebCms/App_Data/Models/all.dll.path index 9c800f0..5b7016b 100644 --- a/WebCms/App_Data/Models/all.dll.path +++ b/WebCms/App_Data/Models/all.dll.path @@ -1 +1 @@ -C:\Users\poprhythm\AppData\Local\Temp\Temporary ASP.NET Files\vs\f80e29bb\faae20bf\App_Web_all.generated.cs.8f9494c4.wqlgo3gh.dll \ No newline at end of file +C:\Users\poprhythm\AppData\Local\Temp\Temporary ASP.NET Files\vs\f80e29bb\faae20bf\App_Web_all.generated.cs.8f9494c4.u298vp5l.dll \ No newline at end of file diff --git a/WebCms/Services/LeafGasCharter.cs b/WebCms/Services/LeafGasCharter.cs index 0e2ac02..2731557 100644 --- a/WebCms/Services/LeafGasCharter.cs +++ b/WebCms/Services/LeafGasCharter.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Web.UI.DataVisualization.Charting; @@ -21,15 +22,7 @@ namespace LeafWeb.WebCms.Services { var curveId = curve.CurveId; - var paramTitles = new[] - { - new {param = curve.FixedCndFixedCmp, title = ReflectionExtensions.GetPropertyDisplayName(c => c.FixedCndFixedCmp) }, - new {param = curve.FixedCndEstimatedCmp, title = ReflectionExtensions.GetPropertyDisplayName(c => c.FixedCndEstimatedCmp) }, - new {param = curve.EstimatedCndFixedCmp, title = ReflectionExtensions.GetPropertyDisplayName(c => c.EstimatedCndFixedCmp) }, - new {param = curve.EstimatedCndEstimatedCmp,title = ReflectionExtensions.GetPropertyDisplayName(c => c.EstimatedCndEstimatedCmp) }, - }; - - return paramTitles.SelectMany(item => CurveSeries(curveId, item.param, item.title)); + return curve.ParamSets.SelectMany(item => CurveSeries(curveId, item, item.CurveType.GetDescription())); } private static IEnumerable CurveSeries(string curveId, CurveParamSet paramSet, string chartTitle)