Leaf Input Parsing complete
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>LeafWeb.Core.Tests</RootNamespace>
|
||||
<AssemblyName>Core.Tests</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="nunit.framework, Version=3.0.5797.27534, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\NUnit.3.0.0\lib\net45\nunit.framework.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Services\LeafInputCsvParserTests.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
<Content Include="Services\LeafInputData\LeafInput-valid.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Services\LeafInputData\LeafInput-titlesRemoved.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Services\LeafInputData\LeafInput-incompleteRows.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Services\LeafInputData\LeafInput-noData.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<None Include="Services\LeafInputData\LeafInput-tabSeparated.csv" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core\Core.csproj">
|
||||
<Project>{25BAED75-7E75-4D11-90D9-358472054DF6}</Project>
|
||||
<Name>Core</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,2 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=Services_005CLeafInputData/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Core.Tests")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Core.Tests")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("78716ff3-35e2-4b92-a475-b222851a5c90")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,160 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using LeafWeb.Core.Models;
|
||||
using LeafWeb.Core.Services;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace LeafWeb.Core.Tests.Services
|
||||
{
|
||||
[TestFixture]
|
||||
public class LeafInputCsvParserTests
|
||||
{
|
||||
private const string LeafInputFolder = @"Services\LeafInputData\";
|
||||
|
||||
[Test]
|
||||
public void Parse_Valid()
|
||||
{
|
||||
var fileInfo = new FileInfo(LeafInputFolder + "LeafInput-valid.csv");
|
||||
var leafInput = new LeafInputCsvParser(fileInfo);
|
||||
var input = leafInput.Parse();
|
||||
|
||||
Assert.That(input.InvestigatorName, Is.EqualTo("Valid Name"));
|
||||
Assert.That(input.ContactInformation, Is.EqualTo("validname@ornl.gov"));
|
||||
Assert.That(input.SiteName, Is.EqualTo("FACE"));
|
||||
Assert.That(input.VegetationType, Is.EqualTo("tropical forest"));
|
||||
Assert.That(input.SoilType, Is.EqualTo("dense soil"));
|
||||
Assert.That(input.MajorSpecies, Is.EqualTo("Tulip Poplar, Oak"));
|
||||
Assert.That(input.SampleLeafLightEnv, Is.EqualTo("heavily shaded from above"));
|
||||
Assert.That(input.WaterStressAssessment, Is.EqualTo("Little to no stress"));
|
||||
Assert.That(input.InstrumentUsed, Is.EqualTo("Licor-6400"));
|
||||
Assert.That(input.ExtraInfo, Is.EqualTo("dear01"));
|
||||
|
||||
var site = input.Site;
|
||||
Assert.That(site.SiteID, Is.EqualTo("Metropolitano"));
|
||||
Assert.That(site.Latitude, Is.EqualTo(8.98333));
|
||||
Assert.That(site.Longitude, Is.EqualTo(-79.55));
|
||||
Assert.That(site.Elevation, Is.Null);
|
||||
Assert.That(site.SampleYear, Is.EqualTo(2013));
|
||||
Assert.That(site.SampleDayOfYear, Is.EqualTo(22));
|
||||
Assert.That(site.GrowSeasonStart, Is.Null);
|
||||
Assert.That(site.GrowSeasonEnd, Is.Null);
|
||||
Assert.That(site.StandAge, Is.Null);
|
||||
Assert.That(site.CanopyHeight, Is.Null);
|
||||
Assert.That(site.LeafAreaIndex, Is.Null);
|
||||
Assert.That(site.SpeciesSampled, Is.EqualTo("Dendropanax_arboreus"));
|
||||
Assert.That(site.AverageTimeResolution, Is.Null);
|
||||
Assert.That(site.SampleHeight, Is.Null);
|
||||
Assert.That(site.LeafAge, Is.Null);
|
||||
Assert.That(site.SpecificLeafArea, Is.EqualTo(245.5609363));
|
||||
Assert.That(site.LfNitrogenContent, Is.EqualTo(2.19));
|
||||
Assert.That(site.LfCarbonContent, Is.EqualTo(46.03));
|
||||
Assert.That(site.LfPhosphContent, Is.EqualTo(0.129929353));
|
||||
//Assert.That(site.WoodPorosity, Is.Null);
|
||||
//Assert.That(site.SapWoodDensity, Is.Null);
|
||||
|
||||
var photosynthetic = input.Photosynthetic;
|
||||
Assert.That(photosynthetic.GammaStar, Is.EqualTo(1.2));
|
||||
Assert.That(photosynthetic.Kc, Is.EqualTo(2.3));
|
||||
Assert.That(photosynthetic.Ko, Is.EqualTo(3.4));
|
||||
Assert.That(photosynthetic.Alpha, Is.EqualTo(4.5));
|
||||
Assert.That(photosynthetic.Rd, Is.EqualTo(6.5));
|
||||
Assert.That(photosynthetic.gi, Is.EqualTo(4.3));
|
||||
|
||||
var data = input.Data;
|
||||
Assert.That(data.Count(), Is.GreaterThan(2));
|
||||
var dataItem = data.First();
|
||||
|
||||
Assert.That(dataItem.Obs, Is.EqualTo(2));
|
||||
Assert.That(dataItem.HHMMSS, Is.EqualTo("11:26:17"));
|
||||
Assert.That(dataItem.FTime, Is.EqualTo(681.5));
|
||||
Assert.That(dataItem.Photo, Is.EqualTo(6.707855907));
|
||||
Assert.That(dataItem.AdjPhoto, Is.EqualTo(6.707855907));
|
||||
Assert.That(dataItem.StomCond, Is.EqualTo(0.066161416));
|
||||
Assert.That(dataItem.Ci, Is.EqualTo(185.9999057));
|
||||
Assert.That(dataItem.Trmmol, Is.EqualTo(0.936751155));
|
||||
Assert.That(dataItem.VpdL, Is.EqualTo(1.386027641));
|
||||
Assert.That(dataItem.Area, Is.EqualTo(2));
|
||||
Assert.That(dataItem.StmRat, Is.EqualTo(1));
|
||||
Assert.That(dataItem.BLCond, Is.EqualTo(9.289719582));
|
||||
Assert.That(dataItem.Tair, Is.EqualTo(29.09575272));
|
||||
Assert.That(dataItem.Tleaf, Is.EqualTo(29.91356087));
|
||||
Assert.That(dataItem.TBlk, Is.EqualTo(28.63459015));
|
||||
Assert.That(dataItem.CO2R, Is.EqualTo(360.0646362));
|
||||
Assert.That(dataItem.CO2S, Is.EqualTo(355.3765869));
|
||||
Assert.That(dataItem.H2OR, Is.EqualTo(27.71545029));
|
||||
Assert.That(dataItem.H2OS, Is.EqualTo(28.32151604));
|
||||
Assert.That(dataItem.RH_R, Is.EqualTo(69.04498291));
|
||||
Assert.That(dataItem.RH_S, Is.EqualTo(70.5548172));
|
||||
Assert.That(dataItem.Flow, Is.EqualTo(300.3703613));
|
||||
Assert.That(dataItem.PARi, Is.EqualTo(500.4228821));
|
||||
Assert.That(dataItem.PARo, Is.EqualTo(23.31687355));
|
||||
Assert.That(dataItem.Press, Is.EqualTo(100.7472458));
|
||||
Assert.That(dataItem.CsMch, Is.EqualTo(1.491710782));
|
||||
Assert.That(dataItem.HsMch, Is.EqualTo(10.9474802));
|
||||
Assert.That(dataItem.StableF, Is.EqualTo(0.5));
|
||||
Assert.That(dataItem.Status, Is.EqualTo("111115"));
|
||||
Assert.That(dataItem.PhiPS2, Is.Null);
|
||||
Assert.That(dataItem.OxygenPress, Is.Null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_TitlesRemoved()
|
||||
{
|
||||
var fileInfo = new FileInfo(LeafInputFolder + "LeafInput-titlesRemoved.csv");
|
||||
var leafInput = new LeafInputCsvParser(fileInfo);
|
||||
var input = leafInput.Parse();
|
||||
|
||||
Assert.That(input.InvestigatorName, Is.EqualTo("Valid Name"));
|
||||
Assert.That(input.ContactInformation, Is.EqualTo("validname@ornl.gov"));
|
||||
Assert.That(input.SiteName, Is.EqualTo("FACE"));
|
||||
Assert.That(input.VegetationType, Is.EqualTo("tropical forest"));
|
||||
Assert.That(input.SoilType, Is.EqualTo("dense soil"));
|
||||
Assert.That(input.MajorSpecies, Is.EqualTo("Tulip Poplar, Oak"));
|
||||
Assert.That(input.SampleLeafLightEnv, Is.EqualTo("heavily shaded from above"));
|
||||
Assert.That(input.WaterStressAssessment, Is.EqualTo("Little to no stress"));
|
||||
Assert.That(input.InstrumentUsed, Is.EqualTo("Licor-6400"));
|
||||
Assert.That(input.ExtraInfo, Is.EqualTo("dear01"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_IncompleteRows()
|
||||
{
|
||||
var fileInfo = new FileInfo(LeafInputFolder + "LeafInput-incompleteRows.csv");
|
||||
var parser = new LeafInputCsvParser(fileInfo);
|
||||
Assert.That(() => parser.Parse(), Throws.TypeOf<ParseException>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Parse_NoData()
|
||||
{
|
||||
var fileInfo = new FileInfo(LeafInputFolder + "LeafInput-noData.csv");
|
||||
var parser = new LeafInputCsvParser(fileInfo);
|
||||
var input = parser.Parse();
|
||||
}
|
||||
|
||||
[Test, Explicit]
|
||||
public void Parse_FindIssues()
|
||||
{
|
||||
var dir = @"C:\Users\poprhythm\Documents\code\LeafWeb\Notes\leafweb database work\newcurves\RemovableDisk\curves";
|
||||
var files = Directory.GetFiles(dir, "*.csv").Select(f => new FileInfo(f));
|
||||
var leafInputs = new List<LeafInput>();
|
||||
foreach (var file in files)
|
||||
{
|
||||
try
|
||||
{
|
||||
var parser = new LeafInputCsvParser(file);
|
||||
var leafInput = parser.Parse();
|
||||
leafInputs.Add(leafInput);
|
||||
//Console.WriteLine("{0}, {1}, {2}", leafInput.FileName, leafInput.InvestigatorName, leafInput.ContactInformation);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("{1} : {0}", ex.Message, file.Name);
|
||||
}
|
||||
}
|
||||
LeafInputCsvParser.ExportCsv(@"C:\Temp\test.csv", leafInputs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
Investigator name: Valid Name,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Contact information: validname@ornl.gov,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Site name in full: FACE ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Vegetation type: tropical forest,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Soil type: dense soil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
"Major species: Tulip Poplar, Oak",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Sample leaf light environment: heavily shaded from above,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
|
@@ -0,0 +1,18 @@
|
||||
Investigator name: Nick Smith,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Contact information: ngsmith@purdue.edu,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Site name in full: Purdue Growth Chamber,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Vegetation type: NA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Soil type: Field Mixture,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Major species: NA,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Sample leaf light environment: Chamber light (~1000 PAR),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Water stress assessment: No water stress,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Instrument used: Licor-6400,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Extra info:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
SiteID,Latitude(Degrees),Longitude(Degrees),Elevation,SampleYear,SampleDayOfYear,GrowSeasonStart,GrowSeasonEnd,StandAge,CanopyHeight,LeafAreaIndex,SpeciesSampled,AveTimeResolution,SampleHeight,LeafAge,SpecificLeafArea,LfNitrogenContent,LfCarbonContent,LfPhosphContent,,,,,,,,,,,,
|
||||
NoUnit,NorthPositive,EastPositive,m,NoUnit,DayOfYear,DayOfYear,DayOfYear,Year,m,m2/m2,NoBlankSpace,Minutes,m,days,cm2/g,%,%,%,,,,,,,,,,,,
|
||||
NA,NA,NA,NA,2012,252,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,,,,,,,,,,,,
|
||||
Gamma*,Kc,Ko,Alpha,Rd,gi,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Pa,Pa,Pa,NoUnit,umol/m2/s,umol/m2/s/Pa,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
-9999,-9999,-9999,-9999,0.822,-9999,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Obs,HHMMSS,FTime,Photo,!AdjPhoto,!StomCond,!Ci,!Trmmol,!VpdL,Area,StmRat,BLCond,Tair,!Tleaf,TBlk,CO2R,CO2S,H2OR,H2OS,RH_R,RH_S,Flow,!PARi,PARo,Press,CsMch,HsMch,StableF,Status,PhiPS2,OxygenPress
|
||||
NoUnit,HHMMSS,Second,umol/m2/s,umol/m2/s,mol/m2/s,umol/mol,mmol/m2/s,kPa,cm2,NA,mol/m2/s,oC,oC,oC,umol/mol,umol/mol,mmol/mol,mmol/mol,%,%,umol/s,umol/m2/s,umol/m2/s,Kpa,umol/mol,mmol/mol,NA,NA,NA,KPA
|
||||
|
@@ -0,0 +1,31 @@
|
||||
"Investigator name: Nick Smith"
|
||||
"Contact information: ngsmith@purdue.edu"
|
||||
"Site name in full: Purdue Growth Chamber"
|
||||
"Vegetation type: NA"
|
||||
"Soil type: Field Mixture"
|
||||
"Major species: NA"
|
||||
"Sample leaf light environment: Chamber light (~1000 PAR)"
|
||||
"Water stress assessment: No water stress"
|
||||
"Instrument used: Licor-6400"
|
||||
"Extra info: 7day acclimation at 20c"
|
||||
"SiteID Latitude(Degrees) Longitude(Degrees) Elevation SampleYear SampleDayOfYear GrowSeasonStart GrowSeasonEnd StandAge CanopyHeight LeafAreaIndex SpeciesSampled AveTimeResolution SampleHeight LeafAge SpecificLeafArea LfNitrogenContent LfCarbonContent LfPhosphContent"
|
||||
"NoUnit NorthPositive EastPositive m NoUnit DayOfYear DayOfYear DayOfYear Year m m2/m2 NoBlankSpace Minutes m days cm2/g % % %"
|
||||
"NA NA NA NA 2014 282 NA NA NA NA NA Tamarindusindica NA NA NA 159.0634345 1.4 NA NA"
|
||||
"Gamma* Kc Ko Alpha Rd gi"
|
||||
"Pa Pa Pa NoUnit umol/m2/s umol/m2/s/Pa"
|
||||
"-9999 -9999 -9999 -9999 2.189610949 -9999"
|
||||
"Obs HHMMSS FTime Photo !AdjPhoto !StomCond !Ci !Trmmol !VpdL Area StmRat BLCond Tair !Tleaf TBlk CO2R CO2S H2OR H2OS RH_R RH_S Flow !PARi PARo Press CsMch HsMch StableF Status PhiPS2 OxygenPress"
|
||||
"NoUnit HHMMSS Second umol/m2/s umol/m2/s mol/m2/s umol/mol mmol/m2/s kPa cm2 NA mol/m2/s oC oC oC umol/mol umol/mol mmol/mol mmol/mol % % umol/s umol/m2/s umol/m2/s Kpa umol/mol mmol/mol NA NA NA KPA"
|
||||
"66 17:38:55 16298.00005 -0.215426597 -0.215426597 0.007774086 387.5601933 0.691837268 8.326482961 5.265 0.5 2.523228275 48.75154114 46.73216629 49.93317795 399.3782959 399.2714844 20.96022415 22.1486187 17.9028511 18.91743469 299.7191772 1199.456543 43.07281876 99.64649963 2.999198914 1.05813694 1 111114 -9999 -9999"
|
||||
"67 17:40:40 16402.50005 -0.505870892 -0.505870892 0.0085163 349.5536599 0.761887632 8.369241706 5.265 0.5 2.523228275 48.81954193 46.83860397 49.93241501 300.4419861 300.927887 20.98658371 22.29515648 17.88055229 18.97615433 299.7085876 1199.490479 43.07907867 99.6419754 3.762382507 1.066325188 1 111114 -9999 -9999"
|
||||
"68 17:42:23 16505.00005 -0.718271361 -0.718271361 0.009213096 291.3857548 0.826080193 8.387930436 5.265 0.5 2.523228275 48.8538208 46.89636993 49.93274307 200.7705383 201.739502 21.00330162 22.42184448 17.87025642 19.0505619 299.7295837 1199.116821 44.01655579 99.63645935 4.080833435 1.060667992 1 111114 -9999 -9999"
|
||||
"69 17:44:11 16613.00005 -0.991620268 -0.991620268 0.010095712 235.0120968 0.907467284 8.409155772 5.265 0.5 2.523228275 48.86945724 46.96108246 49.93239212 100.027565 101.6075668 21.003088 22.56126976 17.85757637 19.15289497 299.7096863 1199.012329 46.25364304 99.63273621 3.954681396 1.065255165 1 111114 -9999 -9999"
|
||||
"70 17:46:46 16768.00005 -1.045282227 -1.045282227 0.011287996 183.1882237 1.009646387 8.371469809 5.265 0.5 2.523228275 48.87886429 46.92841721 49.93133163 49.55680847 51.30204773 21.0290432 22.76230049 17.87363815 19.3139534 299.7124939 1198.983521 43.66405487 99.6309967 3.677768707 1.070101738 1 111114 -9999 -9999"
|
||||
"71 17:48:56 16898.50005 -0.358454456 -0.358454456 0.012415238 389.9600226 1.109333954 8.36545804 5.265 0.5 2.523228275 48.89009094 46.94281769 49.92983246 400.4476013 400.2972107 20.99722672 22.90138435 17.83179474 19.42071342 299.7065125 1198.709229 42.7310257 99.6289444 3.165927887 1.073033333 1 111114 -9999 -9999"
|
||||
"72 17:50:04 16966.50005 -0.369359541 -0.369359541 0.012860315 389.0550121 1.148128169 8.359215055 5.265 0.5 2.523228275 48.89198303 46.94270706 49.9316597 399.6208496 399.4640198 20.9937439 22.96431923 17.82751465 19.47166443 299.7133789 1199.011597 46.73867416 99.62515259 3.196323395 1.071206093 1 111114 -9999 -9999"
|
||||
"73 17:52:29 17111.50005 -0.000448038 -0.000448038 0.013857559 519.5473911 1.23260114 8.331337797 5.265 0.5 2.523228275 48.89042282 46.9200325 49.93070602 600.796814 599.4993896 21.00602722 23.12145042 17.84046745 19.60547066 299.6844788 1199.114502 43.48819351 99.62283325 1.873325348 1.067681313 1 111114 -9999 -9999"
|
||||
"74 17:54:57 17259.50005 0.229358264 0.229358264 0.015404105 668.456214 1.363738633 8.29717668 5.265 0.5 2.523228275 48.89125443 46.88843155 49.92894745 799.0285034 796.7166748 20.95309639 23.29321289 17.76644516 19.75002861 299.6789551 1198.772827 42.78263092 99.6211319 0.459568024 1.070916176 1 111114 -9999 -9999"
|
||||
"75 17:56:48 17370.50005 0.647329733 0.647329733 0.01610465 804.9132425 1.420754821 8.269994013 5.265 0.5 2.523228275 48.88961792 46.86376572 49.93006134 1001.105164 997.4780273 20.99555397 23.43319511 17.83556366 19.86952591 299.6744385 1199.096558 43.42731094 99.61750793 -1.527980804 1.074719429 1 111114 -9999 -9999"
|
||||
"76 17:59:09 17511.50005 1.071500245 1.071500245 0.017460418 945.566887 1.535388617 8.246544404 5.265 0.5 2.523228275 48.89328766 46.85366821 49.93212891 1200.983765 1195.875977 20.98199844 23.61549187 17.82249069 20.01953888 299.7128296 1198.785034 45.1896286 99.61073303 -3.668849945 1.068657875 1 111114 -9999 -9999"
|
||||
"77 18:01:35 17657.50005 1.609415729 1.609415729 0.019173401 1170.685812 1.674877491 8.197620033 5.265 0.5 2.523228275 48.88559723 46.80513382 49.93037033 1500.460083 1493.239014 20.97205353 23.84428024 17.82379532 20.22059631 299.6965942 1198.97876 43.85221481 99.60964966 -7.248439789 1.062548637 1 111114 -9999 -9999"
|
||||
"78 18:05:01 17863.50005 2.509786563 2.509786563 0.022670681 1563.338984 1.962966907 8.135609987 5.265 0.5 2.523228275 48.8908844 46.76280594 49.93166351 2001.122437 1989.85083 20.87425804 24.2393074 17.69743919 20.54927826 299.6837769 1198.699219 45.60385132 99.60519409 -13.40700912 1.060843468 1 111114 -9999 -9999"
|
||||
|
@@ -0,0 +1,34 @@
|
||||
Valid Name,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
validname@ornl.gov,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
FACE ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
tropical forest,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
dense soil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
"Tulip Poplar, Oak",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
heavily shaded from above,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Little to no stress,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Licor-6400,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
dear01,,,,sla/nut no. 2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
SiteID,Latitude(Degrees),Longitude(Degrees),Elevation,SampleYear,SampleDayOfYear,GrowSeasonStart,GrowSeasonEnd,StandAge,CanopyHeight,LeafAreaIndex,SpeciesSampled,AveTimeResolution,SampleHeight,LeafAge,SpecificLeafArea,LfNitrogenContent,LfCarbonContent,LfPhosphContent,WoodPorosity,SapWoodDensity,,,,,,,,,,,,,,,,,
|
||||
NoUnit,NorthPositive,EastPositive,m,NoUnit,DayOfYear,DayOfYear,DayOfYear,Year,m,m2/m2,NoBlankSpace,Minutes,m,days,cm2/g,%,%,%,NoUnit,g/cm3,,,,,,,,,,,,,,,,,
|
||||
Metropolitano ,8.98333,-79.55,-9999,2013,22,-9999,-9999,-9999,-9999,-9999,Dendropanax_arboreus,-9999,-9999,-9999,245.5609363,2.19,46.03,0.129929353,-9999,0.42,,,,,,,,,,,,,,,,,
|
||||
Gamma*,Kc,Ko,Alpha,Rd,gi,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Pa,Pa,Pa,NoUnit,umol/m2/s,umol/m2/s/Pa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
-9999,-9999,-9999,-9999,-9999,-9999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Obs,HHMMSS,FTime,Photo,!AdjPhoto,!StomCond,!Ci,!Trmmol,!VpdL,Area,StmRat,BLCond,Tair,!Tleaf,TBlk,CO2R,CO2S,H2OR,H2OS,RH_R,RH_S,Flow,!PARi,PARo,Press,CsMch,HsMch,StableF,Status,PhiPS2,OxygenPress,DataType,TissueArea,TissueMass,Fo'_or_Fo,Fm'_or_Fm,Fs,MeasLight
|
||||
NoUnit,HHMMSS,Second,umol/m2/s,umol/m2/s,mol/m2/s,umol/mol,mmol/m2/s,kPa,cm2,NA,mol/m2/s,oC,oC,oC,umol/mol,umol/mol,mmol/mol,mmol/mol,%,%,umol/s,umol/m2/s,umol/m2/s,Kpa,umol/mol,mmol/mol,NA,NA,NA,KPA,123Flu11_25ACi31_45ALight_9999others,cm2,gram,Arb_Unit,Arb_Unit,Arb_Unit,umolm-2s-1
|
||||
2,11:26:17,681.5,6.707855907,6.707855907,0.066161416,185.9999057,0.936751155,1.386027641,2,1,9.289719582,29.09575272,29.91356087,28.63459015,360.0646362,355.3765869,27.71545029,28.32151604,69.04498291,70.5548172,300.3703613,500.4228821,23.31687355,100.7472458,1.491710782,10.9474802,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
3,11:30:29,933.5,5.771831799,5.771831799,0.07942629,172.5935849,1.09826383,1.355495012,2,1,9.289719582,29.09716606,29.85159492,28.63698769,298.9832153,294.9247742,27.76527977,28.47566414,69.16172028,70.9312439,300.3979492,500.3692017,25.71452522,100.7446976,1.531658292,10.98022556,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
4,11:33:59,1144,4.325258223,4.325258223,0.085983618,151.023036,1.188274711,1.355434906,2,1,9.289719582,29.13848686,29.91317749,28.63607216,239.5308838,236.4640961,27.85741615,28.62590981,69.22337341,71.13302612,300.3952637,500.3513489,33.338871,100.741394,1.670513272,11.00670147,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
5,11:37:31,1356,2.827309844,2.827309844,0.09812974,127.6065847,1.335534508,1.336460632,2,1,9.289719582,29.13998985,29.8854599,28.63371277,179.5149384,177.474411,27.88515472,28.74891472,69.28231049,71.42836761,300.347168,500.2981567,24.44124985,100.735611,1.570171475,11.03241634,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
6,11:41:04,1569,1.194818958,1.194818958,0.107753176,88.63161349,1.460041169,1.331723176,2,1,9.289719582,29.28667641,29.92069626,28.83418274,109.6109619,108.7097931,27.93833351,28.88233376,68.82578278,71.15132141,300.3964844,500.3841248,31.03587151,100.7314072,1.507373929,11.05681133,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
7,11:43:45,1729.5,-0.756032277,-0.756032277,0.1155767,51.30436732,1.560378208,1.327865608,2,1,9.289719582,29.31532288,29.95697784,28.83176422,41.28229904,41.7423172,27.99954605,29.00834846,68.86295319,71.34403229,300.3787842,500.3143005,24.70624542,100.7319412,1.261989713,11.08116055,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
8,11:46:42,1906.5,7.34330065,7.34330065,0.118790057,268.5384085,1.59344573,1.319710687,2,1,9.289719582,29.33441162,29.95470619,28.83215523,380.8040466,375.516449,28.05409241,29.08415985,68.92025757,71.45082092,300.3884277,500.2626648,35.80098343,100.73069,1.607235074,11.10654354,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
9,11:49:44,2089,7.904847079,7.904847079,0.110187779,290.9430443,1.476094614,1.316732146,2,1,9.289719582,29.30088615,29.93460655,28.82966614,420.2006836,414.5297546,28.11221123,29.06651115,69.19332123,71.54216003,300.364624,500.5073242,33.35251617,100.7255707,1.686336637,11.10749531,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
10,11:52:17,2242,8.412550198,8.412550198,0.107218775,329.0402424,1.427586651,1.308429964,2,1,9.289719582,29.2647934,29.87786865,28.83231163,470.3963318,464.3539124,28.08907318,29.01198196,69.28002167,71.55632019,300.391449,500.6035767,26.83644104,100.7247086,1.531368375,11.10119152,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
11,11:54:49,2394,8.942760877,8.942760877,0.099987679,369.6233746,1.337743766,1.313900888,2,1,9.289719582,29.23348236,29.8452034,28.83133125,530.1151733,523.6935425,28.01350403,28.87860107,69.21929932,71.35688782,300.3389282,500.8887329,22.21284676,100.7255859,1.323848844,11.08121204,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
12,11:58:35,2620,9.558578395,9.558578395,0.088424049,437.1518216,1.230003596,1.364140129,2,1,9.289719582,29.38029861,29.99291992,29.02685356,630.2923584,623.4188232,27.9438591,28.73913193,68.45996857,70.40831757,300.4388733,500.8171997,22.24046707,100.7190247,1.161373258,11.05481243,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
13,12:01:07,2771.5,9.873152604,9.873152604,0.080181353,510.6765842,1.143831655,1.397517525,2,1,9.289719582,29.41447258,30.11022568,29.02637482,730.4609985,723.3362427,27.95492935,28.69467545,68.34937286,70.15804291,300.3759766,500.7625427,23.86174965,100.7148819,0.70708859,11.04821491,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
14,12:03:46,2930.5,9.873834511,9.873834511,0.065068937,562.5871977,0.932179735,1.401146672,2,1,9.289719582,29.05545425,30.09852409,28.43083191,829.8916016,822.8070679,28.02915764,28.63202095,69.96215057,71.46692657,300.3963013,500.498291,37.39061737,100.7079849,0.278255582,11.03235149,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
15,12:06:22,3086.5,10.02683312,10.02683312,0.064134644,653.7121812,0.905940007,1.381484098,2,1,9.289719582,29.00729942,30.02923965,28.43653297,930.4942627,923.2613525,28.07292557,28.65882683,70.26574707,71.73223877,300.3840027,500.588623,27.13081169,100.7063675,-0.062930942,11.0444231,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
16,12:09:14,3258.5,10.05007126,10.05007126,0.056535537,717.0210045,0.799662235,1.382177405,2,1,9.289719582,28.98132896,30.00952148,28.43982887,1029.953247,1022.716675,28.0886879,28.60592461,70.40614319,71.70262909,300.3604126,500.6481628,32.60289001,100.6995239,-0.451480746,11.03314304,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
17,12:11:46,3410.5,10.08104453,10.08104453,0.05308502,795.1938984,0.752668042,1.385043349,2,1,9.289719582,28.9710083,30.00168419,28.43811226,1129.660278,1122.383789,28.07155228,28.55850601,70.40500641,71.62631226,300.3049011,500.8016663,38.56233597,100.6991959,-0.955020785,11.02880192,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
|
@@ -0,0 +1,34 @@
|
||||
Investigator name: Valid Name,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Contact information: validname@ornl.gov,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Site name in full: FACE ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Vegetation type: tropical forest,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Soil type: dense soil,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
"Major species: Tulip Poplar, Oak",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Sample leaf light environment: heavily shaded from above,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Water stress assessment: Little to no stress,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Instrument used: Licor-6400,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Extra info: dear01,,,,sla/nut no. 2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
SiteID,Latitude(Degrees),Longitude(Degrees),Elevation,SampleYear,SampleDayOfYear,GrowSeasonStart,GrowSeasonEnd,StandAge,CanopyHeight,LeafAreaIndex,SpeciesSampled,AveTimeResolution,SampleHeight,LeafAge,SpecificLeafArea,LfNitrogenContent,LfCarbonContent,LfPhosphContent,WoodPorosity,SapWoodDensity,,,,,,,,,,,,,,,,,
|
||||
NoUnit,NorthPositive,EastPositive,m,NoUnit,DayOfYear,DayOfYear,DayOfYear,Year,m,m2/m2,NoBlankSpace,Minutes,m,days,cm2/g,%,%,%,NoUnit,g/cm3,,,,,,,,,,,,,,,,,
|
||||
Metropolitano ,8.98333,-79.55,-9999,2013,22,-9999,-9999,-9999,-9999,-9999,Dendropanax_arboreus,-9999,-9999,-9999,245.5609363,2.19,46.03,0.129929353,-9999,0.42,,,,,,,,,,,,,,,,,
|
||||
Gamma*,Kc,Ko,Alpha,Rd,gi,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Pa,Pa,Pa,NoUnit,umol/m2/s,umol/m2/s/Pa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
1.2,2.3,3.4,4.5,6.5,4.3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
|
||||
Obs,HHMMSS,FTime,Photo,!AdjPhoto,!StomCond,!Ci,!Trmmol,!VpdL,Area,StmRat,BLCond,Tair,!Tleaf,TBlk,CO2R,CO2S,H2OR,H2OS,RH_R,RH_S,Flow,!PARi,PARo,Press,CsMch,HsMch,StableF,Status,PhiPS2,OxygenPress,DataType,TissueArea,TissueMass,Fo'_or_Fo,Fm'_or_Fm,Fs,MeasLight
|
||||
NoUnit,HHMMSS,Second,umol/m2/s,umol/m2/s,mol/m2/s,umol/mol,mmol/m2/s,kPa,cm2,NA,mol/m2/s,oC,oC,oC,umol/mol,umol/mol,mmol/mol,mmol/mol,%,%,umol/s,umol/m2/s,umol/m2/s,Kpa,umol/mol,mmol/mol,NA,NA,NA,KPA,123Flu11_25ACi31_45ALight_9999others,cm2,gram,Arb_Unit,Arb_Unit,Arb_Unit,umolm-2s-1
|
||||
2,11:26:17,681.5,6.707855907,6.707855907,0.066161416,185.9999057,0.936751155,1.386027641,2,1,9.289719582,29.09575272,29.91356087,28.63459015,360.0646362,355.3765869,27.71545029,28.32151604,69.04498291,70.5548172,300.3703613,500.4228821,23.31687355,100.7472458,1.491710782,10.9474802,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
3,11:30:29,933.5,5.771831799,5.771831799,0.07942629,172.5935849,1.09826383,1.355495012,2,1,9.289719582,29.09716606,29.85159492,28.63698769,298.9832153,294.9247742,27.76527977,28.47566414,69.16172028,70.9312439,300.3979492,500.3692017,25.71452522,100.7446976,1.531658292,10.98022556,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
4,11:33:59,1144,4.325258223,4.325258223,0.085983618,151.023036,1.188274711,1.355434906,2,1,9.289719582,29.13848686,29.91317749,28.63607216,239.5308838,236.4640961,27.85741615,28.62590981,69.22337341,71.13302612,300.3952637,500.3513489,33.338871,100.741394,1.670513272,11.00670147,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
5,11:37:31,1356,2.827309844,2.827309844,0.09812974,127.6065847,1.335534508,1.336460632,2,1,9.289719582,29.13998985,29.8854599,28.63371277,179.5149384,177.474411,27.88515472,28.74891472,69.28231049,71.42836761,300.347168,500.2981567,24.44124985,100.735611,1.570171475,11.03241634,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
6,11:41:04,1569,1.194818958,1.194818958,0.107753176,88.63161349,1.460041169,1.331723176,2,1,9.289719582,29.28667641,29.92069626,28.83418274,109.6109619,108.7097931,27.93833351,28.88233376,68.82578278,71.15132141,300.3964844,500.3841248,31.03587151,100.7314072,1.507373929,11.05681133,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
7,11:43:45,1729.5,-0.756032277,-0.756032277,0.1155767,51.30436732,1.560378208,1.327865608,2,1,9.289719582,29.31532288,29.95697784,28.83176422,41.28229904,41.7423172,27.99954605,29.00834846,68.86295319,71.34403229,300.3787842,500.3143005,24.70624542,100.7319412,1.261989713,11.08116055,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
8,11:46:42,1906.5,7.34330065,7.34330065,0.118790057,268.5384085,1.59344573,1.319710687,2,1,9.289719582,29.33441162,29.95470619,28.83215523,380.8040466,375.516449,28.05409241,29.08415985,68.92025757,71.45082092,300.3884277,500.2626648,35.80098343,100.73069,1.607235074,11.10654354,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
9,11:49:44,2089,7.904847079,7.904847079,0.110187779,290.9430443,1.476094614,1.316732146,2,1,9.289719582,29.30088615,29.93460655,28.82966614,420.2006836,414.5297546,28.11221123,29.06651115,69.19332123,71.54216003,300.364624,500.5073242,33.35251617,100.7255707,1.686336637,11.10749531,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
10,11:52:17,2242,8.412550198,8.412550198,0.107218775,329.0402424,1.427586651,1.308429964,2,1,9.289719582,29.2647934,29.87786865,28.83231163,470.3963318,464.3539124,28.08907318,29.01198196,69.28002167,71.55632019,300.391449,500.6035767,26.83644104,100.7247086,1.531368375,11.10119152,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
11,11:54:49,2394,8.942760877,8.942760877,0.099987679,369.6233746,1.337743766,1.313900888,2,1,9.289719582,29.23348236,29.8452034,28.83133125,530.1151733,523.6935425,28.01350403,28.87860107,69.21929932,71.35688782,300.3389282,500.8887329,22.21284676,100.7255859,1.323848844,11.08121204,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
12,11:58:35,2620,9.558578395,9.558578395,0.088424049,437.1518216,1.230003596,1.364140129,2,1,9.289719582,29.38029861,29.99291992,29.02685356,630.2923584,623.4188232,27.9438591,28.73913193,68.45996857,70.40831757,300.4388733,500.8171997,22.24046707,100.7190247,1.161373258,11.05481243,0.25,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
13,12:01:07,2771.5,9.873152604,9.873152604,0.080181353,510.6765842,1.143831655,1.397517525,2,1,9.289719582,29.41447258,30.11022568,29.02637482,730.4609985,723.3362427,27.95492935,28.69467545,68.34937286,70.15804291,300.3759766,500.7625427,23.86174965,100.7148819,0.70708859,11.04821491,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
14,12:03:46,2930.5,9.873834511,9.873834511,0.065068937,562.5871977,0.932179735,1.401146672,2,1,9.289719582,29.05545425,30.09852409,28.43083191,829.8916016,822.8070679,28.02915764,28.63202095,69.96215057,71.46692657,300.3963013,500.498291,37.39061737,100.7079849,0.278255582,11.03235149,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
15,12:06:22,3086.5,10.02683312,10.02683312,0.064134644,653.7121812,0.905940007,1.381484098,2,1,9.289719582,29.00729942,30.02923965,28.43653297,930.4942627,923.2613525,28.07292557,28.65882683,70.26574707,71.73223877,300.3840027,500.588623,27.13081169,100.7063675,-0.062930942,11.0444231,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
16,12:09:14,3258.5,10.05007126,10.05007126,0.056535537,717.0210045,0.799662235,1.382177405,2,1,9.289719582,28.98132896,30.00952148,28.43982887,1029.953247,1022.716675,28.0886879,28.60592461,70.40614319,71.70262909,300.3604126,500.6481628,32.60289001,100.6995239,-0.451480746,11.03314304,0.5,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
17,12:11:46,3410.5,10.08104453,10.08104453,0.05308502,795.1938984,0.752668042,1.385043349,2,1,9.289719582,28.9710083,30.00168419,28.43811226,1129.660278,1122.383789,28.07155228,28.55850601,70.40500641,71.62631226,300.3049011,500.8016663,38.56233597,100.6991959,-0.955020785,11.02880192,0.75,111115,-9999,-9999,-9999,-9999,-9999,0,0,0,-9999
|
||||
|
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="NUnit" version="3.0.0" targetFramework="net45" />
|
||||
</packages>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
||||
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
||||
</configSections>
|
||||
<entityFramework>
|
||||
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
|
||||
<providers>
|
||||
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
|
||||
</providers>
|
||||
</entityFramework>
|
||||
</configuration>
|
||||
@@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{25BAED75-7E75-4D11-90D9-358472054DF6}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>LeafWeb.Core</RootNamespace>
|
||||
<AssemblyName>Core</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="CsvHelper, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8c4959082be5c823, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\CsvHelper.2.13.2.0\lib\net40-client\CsvHelper.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Fasterflect, Version=2.1.3.0, Culture=neutral, PublicKeyToken=38d18473284c1ca7, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\fasterflect.2.1.3\lib\net40\Fasterflect.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Models\LeafInput.cs" />
|
||||
<Compile Include="Models\LeafInputData.cs" />
|
||||
<Compile Include="Models\LeafInputFile.cs" />
|
||||
<Compile Include="Models\LeafInputPhotosynthetic.cs" />
|
||||
<Compile Include="Models\LeafInputSite.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Services\ParseInfoAttribute.cs" />
|
||||
<Compile Include="Services\LeafInputCsvParser.cs" />
|
||||
<Compile Include="Services\ParsedObjectFactory.cs" />
|
||||
<Compile Include="Services\ParseException.cs" />
|
||||
<Compile Include="Utility\StringExtensions.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,54 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using LeafWeb.Core.Services;
|
||||
|
||||
namespace LeafWeb.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Descriptive information about the investigator,
|
||||
/// contact information, the site,the sample leaf and its general environmental condition
|
||||
/// </summary>
|
||||
public class LeafInput
|
||||
{
|
||||
[Key]
|
||||
public string LeafInputId { get; set; }
|
||||
|
||||
public string FileName { get; set; }
|
||||
|
||||
[ParseInfo(1, exampleValue: "First and last name")]
|
||||
public string InvestigatorName { get; set; }
|
||||
|
||||
[ParseInfo(2, exampleValue: "Your email / mail addresses")]
|
||||
public string ContactInformation { get; set; }
|
||||
|
||||
[ParseInfo(3, alternateTitle: "Site name in full", exampleValue: "Your site's identifier / name")]
|
||||
public string SiteName { get; set; }
|
||||
|
||||
[ParseInfo(4, exampleValue: "Mixed forest / grasslands / croplands/ etc")]
|
||||
public string VegetationType { get; set; }
|
||||
|
||||
[ParseInfo(5, exampleValue: "Soil type at your site")]
|
||||
public string SoilType { get; set; }
|
||||
|
||||
[ParseInfo(6, exampleValue: "List of major species at the site")]
|
||||
public string MajorSpecies { get; set; }
|
||||
|
||||
[ParseInfo(7,
|
||||
alternateTitle: "Sample leaf light environment",
|
||||
exampleValue: "The general light environment in which the leaf is in (e.g. heavily shaded from above)")]
|
||||
public string SampleLeafLightEnv { get; set; }
|
||||
|
||||
[ParseInfo(8, exampleValue: "Indicate whether there is water stress at the time of sampling")]
|
||||
public string WaterStressAssessment { get; set; }
|
||||
|
||||
[ParseInfo(9, exampleValue: "For example - Licor-6400")]
|
||||
public string InstrumentUsed { get; set; }
|
||||
|
||||
[ParseInfo(10, exampleValue: "Any extra information you feel would be helpful to put the sampled leaf in context")]
|
||||
public string ExtraInfo { get; set; }
|
||||
|
||||
public virtual LeafInputSite Site { get; set; }
|
||||
public virtual LeafInputPhotosynthetic Photosynthetic { get; set; }
|
||||
public virtual IEnumerable<LeafInputData> Data { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using LeafWeb.Core.Services;
|
||||
|
||||
namespace LeafWeb.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// A/Ci data for a variety of analyses, including photosynthesis, stomatal conductance, internal conductance, water use efficiency.
|
||||
/// </summary>
|
||||
public class LeafInputData
|
||||
{
|
||||
public int ListOrder { get; set; }
|
||||
|
||||
/// <summary>the data point No.</summary>
|
||||
[ParseInfo(1, units: "no unit")]
|
||||
public double? Obs { get; set; }
|
||||
|
||||
/// <summary>clock time</summary>
|
||||
[StringLength(8)]
|
||||
[ParseInfo(2, units: "hh:mm:ss")]
|
||||
public string HHMMSS { get; set; }
|
||||
|
||||
/// <summary>number of seconds since file opened</summary>
|
||||
[ParseInfo(3, units: "seconds")]
|
||||
public double? FTime { get; set; }
|
||||
|
||||
/// <summary>photosynthetic rate</summary>
|
||||
[ParseInfo(4, units: "umol/m2/s")]
|
||||
public double? Photo { get; set; }
|
||||
|
||||
/// <summary>adjusted photosynthetic rate (leakage corrected)</summary>
|
||||
/// <remarks>required</remarks>
|
||||
[ParseInfo(5, alternateTitle: "!AdjPhoto", units: "umol/m2/s")]
|
||||
public double? AdjPhoto { get; set; }
|
||||
|
||||
/// <summary>stomatal conductance</summary>
|
||||
/// <remarks>required</remarks>
|
||||
[ParseInfo(6, alternateTitle: "!StomCond", units: "mol/m2/s")]
|
||||
public double? StomCond { get; set; }
|
||||
|
||||
/// <summary>intercellular CO2 concentration (umol CO2 / mol moist air)</summary>
|
||||
[ParseInfo(7, alternateTitle: "!Ci", units: "umol/mol")]
|
||||
public double? Ci { get; set; }
|
||||
|
||||
/// <summary>transpiration rate</summary>
|
||||
/// <remarks>must provide</remarks>
|
||||
[ParseInfo(8, alternateTitle: "!Trmmol", units:"mmol/m2/s")]
|
||||
public double? Trmmol { get; set; }
|
||||
|
||||
/// <summary>water vapor pressure deficit based on leaf temperature, must provide</summary>
|
||||
[ParseInfo(9, alternateTitle: "!VpdL", units: "KPa")]
|
||||
public double? VpdL { get; set; }
|
||||
|
||||
/// <summary>leaf area</summary>
|
||||
[ParseInfo(10, units:"cm2")]
|
||||
public double? Area { get; set; }
|
||||
|
||||
/// <summary>estimate of the ratio of stomatal conductances of one side of the leaf to the other</summary>
|
||||
[ParseInfo(11, units: "NA")]
|
||||
public double? StmRat { get; set; }
|
||||
|
||||
/// <summary>total boundary layer conductance</summary>
|
||||
[ParseInfo(12, units: "mol/m2/s")]
|
||||
public double? BLCond { get; set; }
|
||||
|
||||
/// <summary>temperature in sample cell</summary>
|
||||
[ParseInfo(13, units: "oC")]
|
||||
public double? Tair { get; set; }
|
||||
|
||||
/// <summary>temperature of leaf thermocouple</summary>
|
||||
/// <remarks>required</remarks>
|
||||
[ParseInfo(14, alternateTitle: "!Tleaf", units: "oC")]
|
||||
public double? Tleaf { get; set; }
|
||||
|
||||
/// <summary>IRGA Block temperature</summary>
|
||||
[ParseInfo(15, units: "oC")]
|
||||
public double? TBlk { get; set; }
|
||||
|
||||
/// <summary>reference CO2 concentration</summary>
|
||||
[ParseInfo(16, units: "umol/mol")]
|
||||
public double? CO2R { get; set; }
|
||||
|
||||
/// <summary>Sample CO2 concentration</summary>
|
||||
[ParseInfo(17, units: "umol/mol")]
|
||||
public double? CO2S { get; set; }
|
||||
|
||||
/// <summary>reference cell water vapor concentration</summary>
|
||||
[ParseInfo(18, units: "mmol/mol")]
|
||||
public double? H2OR { get; set; }
|
||||
|
||||
/// <summary>sample cell water vapor concentration</summary>
|
||||
[ParseInfo(19, units: "mmol/mol")]
|
||||
public double? H2OS { get; set; }
|
||||
|
||||
/// <summary>(%) Reference cell relative humidity</summary>
|
||||
[ParseInfo(20)]
|
||||
public double? RH_R { get; set; }
|
||||
|
||||
/// <summary>(%) sample cell relative humidity</summary>
|
||||
[ParseInfo(21)]
|
||||
public double? RH_S { get; set; }
|
||||
|
||||
/// <summary>(umol/s) molar flow rate of air entering the leaf chamber</summary>
|
||||
[ParseInfo(22)]
|
||||
public double? Flow { get; set; }
|
||||
|
||||
/// <summary> PAR measured by the in-chamber quantum sensor</summary>
|
||||
/// <remarks>required</remarks>
|
||||
[ParseInfo(23, alternateTitle: "!PARi", units: "umol/m2/s")]
|
||||
public double? PARi { get; set; }
|
||||
|
||||
/// <summary>PAR measured by the external quantum sensor</summary>
|
||||
[ParseInfo(24, units: "umol/m2/s")]
|
||||
public double? PARo { get; set; }
|
||||
|
||||
/// <summary>atmospheric pressure</summary>
|
||||
[ParseInfo(25, units: "KPa")]
|
||||
public double? Press { get; set; }
|
||||
|
||||
/// <summary>sample CO2 offset</summary>
|
||||
[ParseInfo(26, units: "umol/mol")]
|
||||
public double? CsMch { get; set; }
|
||||
|
||||
/// <summary>sample H2O offset</summary>
|
||||
[ParseInfo(27, units: "mmol/mol")]
|
||||
public double? HsMch { get; set; }
|
||||
|
||||
/// <summary>a stability indicator as a decimal value</summary>
|
||||
[ParseInfo(28, units: "NA")]
|
||||
public double? StableF { get; set; }
|
||||
|
||||
/// <summary>status flag</summary>
|
||||
[ParseInfo(29, units: "NA")]
|
||||
public string Status { get; set; }
|
||||
|
||||
/// <summary>DeltaF/Fm, the fraction of absorbed PSII photons that are used in photochemistry</summary>
|
||||
[ParseInfo(30, units: "NA")]
|
||||
public double? PhiPS2 { get; set; }
|
||||
|
||||
/// <summary>atmospheric O2 partial pressure</summary>
|
||||
[ParseInfo(31, units: "Pa")]
|
||||
public double? OxygenPress { get; set; }
|
||||
|
||||
public virtual LeafInput LeafInput { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace LeafWeb.Core.Models
|
||||
{
|
||||
public class LeafInputFile
|
||||
{
|
||||
[Key]
|
||||
public string LeafInputId { get; set; }
|
||||
public byte[] File { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using LeafWeb.Core.Services;
|
||||
|
||||
namespace LeafWeb.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Photosynthetic parameters of Leaf Input
|
||||
/// </summary>
|
||||
public class LeafInputPhotosynthetic
|
||||
{
|
||||
/// <summary>chloroplastic CO2 photocompensation point</summary>
|
||||
/// <remarks>must be positive</remarks>
|
||||
[ParseInfo(1, alternateTitle:"Gamma*", units: "Pa")]
|
||||
public double GammaStar { get; set; }
|
||||
|
||||
/// <summary>Michaelis-Menten constant for RuBP carboxylation</summary>
|
||||
/// <remarks>must be positive</remarks>
|
||||
[ParseInfo(2, units: "Pa")]
|
||||
public double Kc { get; set; }
|
||||
|
||||
/// <summary>Michaelis-Menten constant for RuBP oxygenation</summary>
|
||||
/// <remarks>must be positive</remarks>
|
||||
[ParseInfo(3, units: "Pa")]
|
||||
public double Ko { get; set; }
|
||||
|
||||
/// <summary>the fraction of glycolate carbon not returned to the chloroplast</summary>
|
||||
/// <remarks>must be between 0~1 if provided</remarks>
|
||||
[ParseInfo(4)]
|
||||
public double Alpha { get; set; }
|
||||
|
||||
/// <summary>dark respiration</summary>
|
||||
/// <remarks>must be positive if provided</remarks>
|
||||
[ParseInfo(5, units: "umol/m2/s")]
|
||||
public double Rd { get; set; }
|
||||
|
||||
/// <summary>internal (also known as mesophyll) conductance</summary>
|
||||
[ParseInfo(6, units: "umol/m2/s/Pa")]
|
||||
public double gi { get; set; }
|
||||
|
||||
public virtual LeafInput LeafInput { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
using LeafWeb.Core.Services;
|
||||
|
||||
namespace LeafWeb.Core.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains info about the site such as elevation, canopy height, site ID, etc
|
||||
/// </summary>
|
||||
public class LeafInputSite
|
||||
{
|
||||
/// <summary>Site identifier</summary>
|
||||
/// <remarks>do not leave blank between letters</remarks>
|
||||
[ParseInfo(1)]
|
||||
public string SiteID { get; set; }
|
||||
|
||||
/// <summary>Site latitude, northern hermisphere positive</summary>
|
||||
[ParseInfo(2, units:"degrees")]
|
||||
public double? Latitude { get; set; }
|
||||
|
||||
/// <summary>Site longitude, east positive</summary>
|
||||
[ParseInfo(3, units: "degrees")]
|
||||
public double? Longitude { get; set; }
|
||||
|
||||
/// <summary>site elevation</summary>
|
||||
[ParseInfo(4, units: "m")]
|
||||
public double? Elevation { get; set; }
|
||||
|
||||
/// <summary>the year when the A/Ci data is taken</summary>
|
||||
[ParseInfo(5, units: "year")]
|
||||
public int? SampleYear { get; set; }
|
||||
|
||||
/// <summary>the day of year (since 1 Jan) when the A/Ci data is taken</summary>
|
||||
[ParseInfo(6, units: "day")]
|
||||
public int? SampleDayOfYear { get; set; }
|
||||
|
||||
/// <summary>the approximate start day (since 1 Jan) of growing season</summary>
|
||||
[ParseInfo(7, units: "day")]
|
||||
public int? GrowSeasonStart { get; set; }
|
||||
|
||||
/// <summary>the approximate end day (since 1 Jan) of growing season</summary>
|
||||
[ParseInfo(8, units: "day")]
|
||||
public int? GrowSeasonEnd { get; set; }
|
||||
|
||||
/// <summary>stand age since the last disturbance</summary>
|
||||
[ParseInfo(9, units: "year")]
|
||||
public double? StandAge { get; set; }
|
||||
|
||||
/// <summary>the height of the canopy</summary>
|
||||
[ParseInfo(10, units: "m")]
|
||||
public double? CanopyHeight { get; set; }
|
||||
|
||||
/// <summary>the leaf area index in the middle of growing season</summary>
|
||||
[ParseInfo(11, units: "m2/m2")]
|
||||
public double? LeafAreaIndex { get; set; }
|
||||
|
||||
/// <summary>the species of the leaf sample</summary>
|
||||
/// <remarks>don't leave blank between letters</remarks>
|
||||
[ParseInfo(12, units: "dimensionless")]
|
||||
public string SpeciesSampled { get; set; }
|
||||
|
||||
/// <summary>the average time interval between two consecutive A/Ci data points</summary>
|
||||
[ParseInfo(13, alternateTitle: "AveTimeResolution", units: "minutes")]
|
||||
public double? AverageTimeResolution { get; set; }
|
||||
|
||||
/// <summary>the height at which the leaf is located</summary>
|
||||
[ParseInfo(14, units: "m")]
|
||||
public double? SampleHeight { get; set; }
|
||||
|
||||
/// <summary>the age of the leaf</summary>
|
||||
[ParseInfo(15, units: "day")]
|
||||
public int? LeafAge { get; set; }
|
||||
|
||||
/// <summary>specific leaf area of the sample</summary>
|
||||
[ParseInfo(16, units: "cm2/g")]
|
||||
public double? SpecificLeafArea { get; set; }
|
||||
|
||||
/// <summary>dry leaf nitrogen content of the sample</summary>
|
||||
[ParseInfo(17, units: "%")]
|
||||
public double? LfNitrogenContent { get; set; }
|
||||
|
||||
/// <summary>dry leaf carbon content of the sample</summary>
|
||||
[ParseInfo(18, units: "%")]
|
||||
public double? LfCarbonContent { get; set; }
|
||||
|
||||
/// <summary>dry leaf phosphorus content of the sample</summary>
|
||||
[ParseInfo(19, units: "%")]
|
||||
public double? LfPhosphContent { get; set; }
|
||||
|
||||
// WoodPorosity
|
||||
|
||||
// SapWoodDensity
|
||||
|
||||
// DataType,TissueArea,TissueMass,Fo'_or_Fo,Fm'_or_Fm,Fs,MeasLight
|
||||
|
||||
public virtual LeafInput LeafInput { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Core")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2015")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("678132a7-2bfc-426b-a14a-761822c06bd5")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,155 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using CsvHelper;
|
||||
using CsvHelper.Configuration;
|
||||
using LeafWeb.Core.Models;
|
||||
|
||||
namespace LeafWeb.Core.Services
|
||||
{
|
||||
public class LeafInputCsvParser : IDisposable
|
||||
{
|
||||
private readonly FileSystemInfo _csvFile;
|
||||
private readonly StreamReader _reader;
|
||||
private readonly CsvReader _csv;
|
||||
|
||||
public LeafInputCsvParser(FileSystemInfo csvFile)
|
||||
{
|
||||
_csvFile = csvFile;
|
||||
if (!csvFile.Exists)
|
||||
throw new FileNotFoundException("Cannot find file '" + csvFile.Name + "'");
|
||||
|
||||
_reader = File.OpenText(csvFile.FullName);
|
||||
var csvConfiguration = new CsvConfiguration {HasHeaderRecord = false};
|
||||
_csv = new CsvReader(_reader, csvConfiguration);
|
||||
}
|
||||
|
||||
public LeafInput Parse()
|
||||
{
|
||||
// First 10 lines
|
||||
var leafInput = ParseLeafInput();
|
||||
leafInput.FileName = _csvFile.Name;
|
||||
|
||||
// Next 3 (Header, Units, and Values)
|
||||
leafInput.Site = ParseLeafInputSite();
|
||||
|
||||
// Next 3 (Header, Units, and Values)
|
||||
leafInput.Photosynthetic = ParseLeafInputPhotosynthetic();
|
||||
|
||||
// Remaining lines (Header, Units, and Data)
|
||||
leafInput.Data = ParseLeafInputData();
|
||||
|
||||
return leafInput;
|
||||
}
|
||||
|
||||
private LeafInput ParseLeafInput()
|
||||
{
|
||||
var items = new List<string>();
|
||||
for (var i = 0; i < 10; i++)
|
||||
{
|
||||
if (!_csv.Read())
|
||||
throw new ParseException("Could not read line number " + _csv.Row);
|
||||
|
||||
string field;
|
||||
if (!_csv.TryGetField(0, out field))
|
||||
throw new ParseException("Could not read first field on line number " + _csv.Row);
|
||||
items.Add(field);
|
||||
}
|
||||
return ParsedObjectFactory<LeafInput>.Create(items.ToArray());
|
||||
}
|
||||
|
||||
private string[] GetNextCsvRowValues()
|
||||
{
|
||||
// get values from row
|
||||
if (!_csv.Read())
|
||||
return null;
|
||||
|
||||
// put all the values from this row into an array
|
||||
var values = new List<string>();
|
||||
var index = 0;
|
||||
string value;
|
||||
while (_csv.TryGetField(index, out value))
|
||||
{
|
||||
values.Add(value);
|
||||
index++;
|
||||
}
|
||||
return values.ToArray();
|
||||
}
|
||||
|
||||
private LeafInputSite ParseLeafInputSite()
|
||||
{
|
||||
var titles = GetNextCsvRowValues();
|
||||
if (titles == null)
|
||||
throw new ParseException("Could not read site header row on line number " + _csv.Row);
|
||||
var units = GetNextCsvRowValues();
|
||||
if (units == null)
|
||||
throw new ParseException("Could not read site units row on line number " + _csv.Row);
|
||||
var values = GetNextCsvRowValues();
|
||||
if (values == null)
|
||||
throw new ParseException("Could not read site value row on line number " + _csv.Row);
|
||||
|
||||
var items = new List<Tuple<string, string>>();
|
||||
for (var i = 0; i < titles.Length && i < values.Length; i++)
|
||||
{
|
||||
var item = Tuple.Create(titles[i], values[i]);
|
||||
items.Add(item);
|
||||
}
|
||||
return ParsedObjectFactory<LeafInputSite>.Create(items.ToArray());
|
||||
}
|
||||
|
||||
private LeafInputPhotosynthetic ParseLeafInputPhotosynthetic()
|
||||
{
|
||||
var titles = GetNextCsvRowValues();
|
||||
if (titles == null)
|
||||
throw new ParseException("Could not read photosynthetic header row on line number " + _csv.Row);
|
||||
var units = GetNextCsvRowValues();
|
||||
if (units == null)
|
||||
throw new ParseException("Could not read photosynthetic units row on line number " + _csv.Row);
|
||||
var values = GetNextCsvRowValues();
|
||||
if (values == null)
|
||||
throw new ParseException("Could not read photosynthetic value row on line number " + _csv.Row);
|
||||
|
||||
var items = new List<Tuple<string, string>>();
|
||||
for (var i = 0; i < titles.Length && i < values.Length; i++)
|
||||
{
|
||||
var item = Tuple.Create(titles[i], values[i]);
|
||||
items.Add(item);
|
||||
}
|
||||
return ParsedObjectFactory<LeafInputPhotosynthetic>.Create(items.ToArray());
|
||||
}
|
||||
|
||||
private LeafInputData[] ParseLeafInputData()
|
||||
{
|
||||
var titles = GetNextCsvRowValues();
|
||||
if (titles == null)
|
||||
throw new ParseException("Could not read data header row on line number " + _csv.Row);
|
||||
var units = GetNextCsvRowValues();
|
||||
if (units == null)
|
||||
throw new ParseException("Could not read data units row on line number " + _csv.Row);
|
||||
|
||||
var valueArrays = new List<string[]>();
|
||||
while (true)
|
||||
{
|
||||
var values = GetNextCsvRowValues();
|
||||
if (values == null)
|
||||
break;
|
||||
valueArrays.Add(values);
|
||||
}
|
||||
return ParsedObjectFactory<LeafInputData>.Create(titles, valueArrays.ToArray());
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_reader.Dispose();
|
||||
}
|
||||
|
||||
public static void ExportCsv(string filename, IEnumerable<LeafInput> leafInputs)
|
||||
{
|
||||
using (var textWriter = new StreamWriter(filename))
|
||||
{
|
||||
var csv = new CsvWriter(textWriter);
|
||||
csv.WriteRecords(leafInputs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
|
||||
namespace LeafWeb.Core.Services
|
||||
{
|
||||
public class ParseException : Exception
|
||||
{
|
||||
public ParseException(string message)
|
||||
: base(message)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using LeafWeb.Core.Utility;
|
||||
|
||||
namespace LeafWeb.Core.Services
|
||||
{
|
||||
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
|
||||
public class ParseInfoAttribute : Attribute
|
||||
{
|
||||
public int Position { get; private set; }
|
||||
public string Units { get; private set; }
|
||||
public string Title { get; private set; }
|
||||
public string AlterateTitle { get; private set; }
|
||||
public string ExampleValue { get; private set; }
|
||||
public string[] FieldNames
|
||||
{
|
||||
get
|
||||
{
|
||||
var fieldNames = new[] {Title, Title.SplitCamelCase()};
|
||||
if (!string.IsNullOrEmpty(AlterateTitle))
|
||||
fieldNames = fieldNames.Concat(new[] { AlterateTitle }).ToArray();
|
||||
return fieldNames;
|
||||
}
|
||||
}
|
||||
|
||||
public ParseInfoAttribute(int position, [CallerMemberName]string title = null, string units = null, string alternateTitle = null, string exampleValue = null)
|
||||
{
|
||||
AlterateTitle = alternateTitle;
|
||||
ExampleValue = exampleValue;
|
||||
Title = title;
|
||||
Position = position;
|
||||
Units = units;
|
||||
}
|
||||
|
||||
public bool IsTitleMatch(string title)
|
||||
{
|
||||
return FieldNames.Any(t => string.Compare(title, t, StringComparison.InvariantCultureIgnoreCase) == 0);
|
||||
}
|
||||
|
||||
public bool IsPositionMatch(int index)
|
||||
{
|
||||
return Position == index;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Fasterflect;
|
||||
|
||||
namespace LeafWeb.Core.Services
|
||||
{
|
||||
public static class ParsedObjectFactory<T> where T : new()
|
||||
{
|
||||
private static PropertyInfo[] GetProperties()
|
||||
{
|
||||
var propertyInfos = typeof(T).Properties();
|
||||
return propertyInfos.Where(p => p.HasAttribute<ParseInfoAttribute>()).ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an object type T filling properties from the given title values
|
||||
/// </summary>
|
||||
/// <param name="titleValues">Colon separated title: values</param>
|
||||
public static T Create(string[] titleValues)
|
||||
{
|
||||
var properties = GetProperties();
|
||||
var obj = new T();
|
||||
// take each of the
|
||||
for (var index = 0; index < titleValues.Length; index++)
|
||||
{
|
||||
PropertyInfo property = null;
|
||||
string value = null;
|
||||
|
||||
var lineNumber = index + 1;
|
||||
var row = titleValues[index];
|
||||
var split = row.Split(':');
|
||||
if (split.Length > 1)
|
||||
{
|
||||
// handles case for "Title : Value"
|
||||
var title = split[0].Trim();
|
||||
value = split[1].Trim();
|
||||
property =
|
||||
properties
|
||||
.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsTitleMatch(title));
|
||||
}
|
||||
if (property == null)
|
||||
{
|
||||
// handles case for row number, i.e. "Value"
|
||||
value = row.Trim();
|
||||
property =
|
||||
properties
|
||||
.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsPositionMatch(lineNumber));
|
||||
}
|
||||
|
||||
if (property != null)
|
||||
{
|
||||
object convertedVal;
|
||||
if (!TryConvertValue(property, value, out convertedVal))
|
||||
throw new ParseException(string.Format("Cannot convert value '{0}' for {1} at line number {2}", value, property.Name, lineNumber));
|
||||
property.Set(obj, convertedVal);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static T[] Create(string[] titles, string[][] valueArrays)
|
||||
{
|
||||
var properties = GetProperties();
|
||||
var objs = new T[valueArrays.Length];
|
||||
|
||||
for (var vIndex = 0; vIndex < valueArrays.Length; vIndex++)
|
||||
{
|
||||
var obj = new T();
|
||||
var values = valueArrays[vIndex];
|
||||
for (var tIndex = 0; tIndex < titles.Length; tIndex++)
|
||||
{
|
||||
var title = titles[tIndex];
|
||||
var value = values[tIndex];
|
||||
var position = tIndex + 1;
|
||||
|
||||
if (IsMissingValue(value))
|
||||
continue;
|
||||
|
||||
var property = MatchProperty(properties, title, position);
|
||||
|
||||
if (property != null)
|
||||
{
|
||||
object convertedVal;
|
||||
if (!TryConvertValue(property, value, out convertedVal))
|
||||
throw new ParseException(string.Format("Cannot convert value '{0}' for {1} in position {2}", value, property.Name, position));
|
||||
property.Set(obj, convertedVal);
|
||||
}
|
||||
}
|
||||
objs[vIndex] = obj;
|
||||
}
|
||||
return objs;
|
||||
}
|
||||
|
||||
public static T Create(Tuple<string, string>[] titleValues)
|
||||
{
|
||||
var properties = GetProperties();
|
||||
var obj = new T();
|
||||
|
||||
for (var index = 0; index < titleValues.Length; index++)
|
||||
{
|
||||
var item = titleValues[index];
|
||||
var position = index + 1;
|
||||
var title = item.Item1.Trim();
|
||||
var value = item.Item2.Trim();
|
||||
|
||||
if (IsMissingValue(value))
|
||||
continue;
|
||||
|
||||
var property = MatchProperty(properties, title, position);
|
||||
|
||||
if (property != null)
|
||||
{
|
||||
object convertedVal;
|
||||
if (!TryConvertValue(property, value, out convertedVal))
|
||||
throw new ParseException(string.Format("Cannot convert value '{0}' for {1} in position {2}", value, property.Name, position));
|
||||
property.Set(obj, convertedVal);
|
||||
}
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
private static bool IsMissingValue(string value)
|
||||
{
|
||||
return string.IsNullOrEmpty(value) || value == "NA" || value == "-9999";
|
||||
}
|
||||
|
||||
private static PropertyInfo MatchProperty(PropertyInfo[] properties, string title, int position)
|
||||
{
|
||||
var property =
|
||||
properties
|
||||
.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsTitleMatch(title));
|
||||
|
||||
if (property == null)
|
||||
{
|
||||
property =
|
||||
properties
|
||||
.FirstOrDefault(p => p.Attribute<ParseInfoAttribute>().IsPositionMatch(position));
|
||||
}
|
||||
return property;
|
||||
}
|
||||
|
||||
private static bool TryConvertValue(PropertyInfo property, object value, out object convertedValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
// http://stackoverflow.com/questions/3531318/convert-changetype-fails-on-nullable-types
|
||||
var t = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType;
|
||||
convertedValue = Convert.ChangeType(value, t);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
convertedValue = null;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace LeafWeb.Core.Utility
|
||||
{
|
||||
public static class StringExtensions
|
||||
{
|
||||
public static string SplitCamelCase(this string str)
|
||||
{
|
||||
return str.Aggregate(
|
||||
String.Empty,
|
||||
(current, c) =>
|
||||
current + (Char.IsUpper(c) && current.Length > 0 ? " " + c : c.ToString(CultureInfo.InvariantCulture)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="CsvHelper" version="2.13.2.0" targetFramework="net45" />
|
||||
<package id="EntityFramework" version="6.1.3" targetFramework="net45" />
|
||||
<package id="fasterflect" version="2.1.3" targetFramework="net45" />
|
||||
</packages>
|
||||
+12
@@ -5,6 +5,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web", "Web\Web.csproj", "{0
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web.Tests", "Web.Tests\Web.Tests.csproj", "{0DBE7CB9-71B3-46BA-8045-0F1E36C1C8F7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "Core\Core.csproj", "{25BAED75-7E75-4D11-90D9-358472054DF6}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Tests", "Core.Tests\Core.Tests.csproj", "{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -19,6 +23,14 @@ Global
|
||||
{0DBE7CB9-71B3-46BA-8045-0F1E36C1C8F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0DBE7CB9-71B3-46BA-8045-0F1E36C1C8F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0DBE7CB9-71B3-46BA-8045-0F1E36C1C8F7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{25BAED75-7E75-4D11-90D9-358472054DF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{25BAED75-7E75-4D11-90D9-358472054DF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{25BAED75-7E75-4D11-90D9-358472054DF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{25BAED75-7E75-4D11-90D9-358472054DF6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8207F6FE-EA80-41CA-81B5-ACD020FB0F3C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<ProjectGuid>{0DBE7CB9-71B3-46BA-8045-0F1E36C1C8F7}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Web.Tests</RootNamespace>
|
||||
<RootNamespace>LeafWeb.Web.Tests</RootNamespace>
|
||||
<AssemblyName>Web.Tests</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
|
||||
Reference in New Issue
Block a user