Simplify CurveData data structures

This commit is contained in:
2018-08-24 21:28:00 -04:00
parent cc49f05d7e
commit ad41465c05
10 changed files with 55 additions and 96 deletions
+3 -13
View File
@@ -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<CurveParamSet> ParamSets { get; set; } = new List<CurveParamSet>();
}
}
+10 -33
View File
@@ -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<CurveData>(c=>c.FixedCndFixedCmp)}");
if (curveData.FixedCndEstimatedCmp == null)
throw new ArgumentException(
$"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName<CurveData>(c=>c.FixedCndEstimatedCmp)}");
if (curveData.EstimatedCndFixedCmp == null)
throw new ArgumentException(
$"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName<CurveData>(c=>c.EstimatedCndFixedCmp)}");
if (curveData.EstimatedCndEstimatedCmp == null)
throw new ArgumentException(
$"{comparisonGroup.CurveID} missing data for {ReflectionExtensions.GetPropertyDisplayName<CurveData>(c=>c.EstimatedCndEstimatedCmp)}");
yield return curveData;
}
}
+3 -1
View File
@@ -4,7 +4,9 @@ namespace LeafWeb.Core.Charter
{
public class CurveParamSet
{
public List<XyPoint> AnetMeasChloro1Data { get; } = new List<XyPoint>(); // y=AnetMeas column, x=PCO2c, for PointLimitType=1
public CurveType CurveType { get; set; }
public List<XyPoint> AnetMeasChloro1Data { get; } = new List<XyPoint>(); // y=AnetMeas column, x=PCO2c, for PointLimitType=1
public List<XyPoint> AnetMeasChloro2Data { get; } = new List<XyPoint>(); // y=AnetMeas column, x=PCO2c, for PointLimitType=2
public List<XyPoint> AnetMeasChloro3Data { get; } = new List<XyPoint>(); // y=AnetMeas column, x=PCO2c, for PointLimitType=3
public List<XyPoint> AnetMeasInter1Data { get; } = new List<XyPoint>(); // y=AnetMeas column, x=PCO2i, for PointLimitType=1
+16
View File
@@ -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
}
}
+1
View File
@@ -84,6 +84,7 @@
<Compile Include="Charter\CurveData.cs" />
<Compile Include="Charter\CurveDataConverter.cs" />
<Compile Include="Charter\CurveParamSet.cs" />
<Compile Include="Charter\CurveType.cs" />
<Compile Include="Charter\XYPoint.cs" />
<Compile Include="DAL\DataService.cs" />
<Compile Include="DAL\LeafWebContext.cs" />
+10 -32
View File
@@ -10,37 +10,15 @@ namespace LeafWeb.Core.Utility
{
public static class ReflectionExtensions
{
public static string GetPropertyDisplayName<T>(Expression<Func<T, object>> propertyExpression)
{
var memberInfo = GetPropertyInformation(propertyExpression.Body);
if (memberInfo == null)
{
throw new ArgumentException("No property reference expression was found.", nameof(propertyExpression));
}
var attr = memberInfo.Attributes<DisplayNameAttribute>().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<DescriptionAttribute>()
?.Description;
}
}
}