From 36bebdb8abbffad05ea295bf77e09dfcea4bdaa9 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 28 Jul 2016 14:15:41 +0200
Subject: [PATCH] change aux input structure

---
 .../InputData/DeclarationInputData.cs         |  22 +---
 .../InputData/EngineeringInputData.cs         |  10 +-
 .../VectoCommon/Models}/AuxiliaryType.cs      |  44 +------
 VectoCommon/VectoCommon/VectoCommon.csproj    |   1 +
 .../InputData/FileIO/JSON/JSONInputData.cs    |  17 +--
 .../VectoCore/InputData/Impl/InputData.cs     |  10 +-
 .../ComponentData/AuxiliaryDataReader.cs      | 105 +++++++++++++++++
 .../DeclarationDataAdapter.cs                 |  14 +--
 .../EngineeringDataAdapter.cs                 |  14 +--
 .../Models/Simulation/Data/VectoRunData.cs    |  10 +-
 .../SimulationComponent/Data/AuxiliaryData.cs | 110 ++----------------
 VectoCore/VectoCore/VectoCore.csproj          |   3 +-
 VectoCore/VectoCoreTest/FileIO/JsonTest.cs    |  40 +++----
 .../Models/Simulation/AuxTests.cs             |   9 +-
 .../AuxiliaryTypeHelperTest.cs                |   6 +-
 15 files changed, 192 insertions(+), 223 deletions(-)
 rename {VectoCore/VectoCore/Models/SimulationComponent/Data => VectoCommon/VectoCommon/Models}/AuxiliaryType.cs (50%)
 create mode 100644 VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs

diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
index 18411c284f..ad9bdc4e22 100644
--- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs
@@ -83,7 +83,7 @@ namespace TUGraz.VectoCommon.InputData
 		/// cf. VECTO Input Parameters.xlsx
 		/// </summary>
 		Kilogram CurbWeightChassis { get; }
-		
+
 		/// <summary>
 		/// P041  Max. vehicle weight
 		/// cf. VECTO Input Parameters.xlsx
@@ -375,30 +375,18 @@ namespace TUGraz.VectoCommon.InputData
 
 	public interface IAuxiliaryDeclarationInputData
 	{
-		bool SavedInDeclarationMode { get; }
-
-		/// <summary>
-		/// P006  Aux-ID
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		string ID { get; }
-
 		/// <summary>
 		/// P005  Aux-Type
 		/// cf. VECTO Input Parameters.xlsx
 		/// </summary>
-		string Type { get; }
+		AuxiliaryType Type { get; }
 
 		/// <summary>
 		/// P118  Aux-Technology
 		/// cf. VECTO Input Parameters.xlsx
 		/// </summary>
-		string Technology { get; }
-
-		/// <summary>
-		/// P143  Aux-Techlist
-		/// cf. VECTO Input Parameters.xlsx
-		/// </summary>
-		IList<string> TechList { get; }
+		IList<string> Technology { get; }
 	}
+
+
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
index 38d30a59b8..3db09e9cf3 100644
--- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
+++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs
@@ -214,7 +214,7 @@ namespace TUGraz.VectoCommon.InputData
 		KilogramSquareMeter Inertia { get; }
 	}
 
-	public interface IAuxiliariesEngineeringInputData : IAuxiliariesDeclarationInputData
+	public interface IAuxiliariesEngineeringInputData
 	{
 		new IList<IAuxiliaryEngineeringInputData> Auxiliaries { get; }
 
@@ -312,8 +312,14 @@ namespace TUGraz.VectoCommon.InputData
 		DataTable CoastingDecisionFactorVelocityDropLookup { get; }
 	}
 
-	public interface IAuxiliaryEngineeringInputData : IAuxiliaryDeclarationInputData
+	public interface IAuxiliaryEngineeringInputData
 	{
+		/// <summary>
+		/// P006  Aux-ID
+		/// cf. VECTO Input Parameters.xlsx
+		/// </summary>
+		string ID { get; }
+
 		/// <summary>
 		/// either mapping or constant
 		/// </summary>
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs b/VectoCommon/VectoCommon/Models/AuxiliaryType.cs
similarity index 50%
rename from VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs
rename to VectoCommon/VectoCommon/Models/AuxiliaryType.cs
index 301861343d..4b0e572845 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryType.cs
+++ b/VectoCommon/VectoCommon/Models/AuxiliaryType.cs
@@ -30,55 +30,15 @@
 */
 
 using System;
-using TUGraz.VectoCore.Configuration;
 
-namespace TUGraz.VectoCore.Models.SimulationComponent.Data
+namespace TUGraz.VectoCommon.Models
 {
 	public enum AuxiliaryType
 	{
 		Fan,
 		SteeringPump,
-		HeatingVentilationAirCondition,
+		HVAC,
 		PneumaticSystem,
 		ElectricSystem
 	}
-
-	public static class AuxiliaryTypeHelper
-	{
-		public static AuxiliaryType Parse(string s)
-		{
-			switch (s) {
-				case Constants.Auxiliaries.Names.Fan:
-					return AuxiliaryType.Fan;
-				case Constants.Auxiliaries.Names.SteeringPump:
-					return AuxiliaryType.SteeringPump;
-				case Constants.Auxiliaries.Names.HeatingVentilationAirCondition:
-					return AuxiliaryType.HeatingVentilationAirCondition;
-				case Constants.Auxiliaries.Names.ElectricSystem:
-					return AuxiliaryType.ElectricSystem;
-				case Constants.Auxiliaries.Names.PneumaticSystem:
-					return AuxiliaryType.PneumaticSystem;
-				default:
-					throw new ArgumentOutOfRangeException("s", s, "Could not parse auxiliary type string.");
-			}
-		}
-
-		public static string ToString(AuxiliaryType t)
-		{
-			switch (t) {
-				case AuxiliaryType.Fan:
-					return Constants.Auxiliaries.Names.Fan;
-				case AuxiliaryType.SteeringPump:
-					return Constants.Auxiliaries.Names.SteeringPump;
-				case AuxiliaryType.HeatingVentilationAirCondition:
-					return Constants.Auxiliaries.Names.HeatingVentilationAirCondition;
-				case AuxiliaryType.PneumaticSystem:
-					return Constants.Auxiliaries.Names.PneumaticSystem;
-				case AuxiliaryType.ElectricSystem:
-					return Constants.Auxiliaries.Names.ElectricSystem;
-				default:
-					throw new ArgumentOutOfRangeException();
-			}
-		}
-	}
 }
\ No newline at end of file
diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj
index 0a9080e74c..1132531c6f 100644
--- a/VectoCommon/VectoCommon/VectoCommon.csproj
+++ b/VectoCommon/VectoCommon/VectoCommon.csproj
@@ -44,6 +44,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Models\AuxiliaryType.cs" />
     <Compile Include="Exceptions\VectoExceptions.cs" />
     <Compile Include="Exceptions\VectoSimulationException.cs" />
     <Compile Include="InputData\DeclarationInputData.cs" />
diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index f3e79e02a1..c382a404ed 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -107,7 +107,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 	/// Fileformat: .vecto
 	/// </summary>
 	public class JSONInputDataV2 : JSONFile, IEngineeringInputDataProvider, IDeclarationInputDataProvider,
-		IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData
+		IEngineeringJobInputData, IDriverEngineeringInputData, IAuxiliariesEngineeringInputData,
+		IAuxiliariesDeclarationInputData
 	{
 		protected IGearboxEngineeringInputData Gearbox;
 		protected IAxleGearInputData AxleGear;
@@ -262,7 +263,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		IAuxiliariesDeclarationInputData IDeclarationInputDataProvider.AuxiliaryInputData()
 		{
-			return AuxiliaryInputData();
+			return this;
 		}
 
 		public virtual IRetarderInputData RetarderInputData
@@ -450,7 +451,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 
 		#endregion
 
-		public virtual IList<IAuxiliaryEngineeringInputData> Auxiliaries
+		IList<IAuxiliaryEngineeringInputData> IAuxiliariesEngineeringInputData.Auxiliaries
 		{
 			get { return AuxData().Cast<IAuxiliaryEngineeringInputData>().ToList(); }
 		}
@@ -466,12 +467,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 			foreach (var aux in Body["Aux"] ?? Enumerable.Empty<JToken>()) {
 				var auxData = new AuxiliaryDataInputData {
 					ID = aux.GetEx<string>("ID"),
-					Type = aux.GetEx<string>("Type"),
-					Technology = aux.GetEx<string>("Technology"),
+					Type = AuxiliaryTypeHelper.Parse(aux.GetEx<string>("Type")),
+					Technology = new List<string>() { aux.GetEx<string>("Technology") },
 				};
-				if (aux["TechList"] != null) {
-					auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); //  .Select(x => x.ToString).ToArray();
-				}
+				//if (aux["TechList"] != null) {
+				//	auxData.TechList = aux["TechList"].Select(x => x.ToString()).ToList(); //  .Select(x => x.ToString).ToArray();
+				//}
 				var auxFile = aux["Path"];
 				retVal.Add(auxData);
 
diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs
index a142e60497..7f065d5a4b 100644
--- a/VectoCore/VectoCore/InputData/Impl/InputData.cs
+++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs
@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.InputData.Impl
 		public KilogramSquareMeter Inertia { get; internal set; }
 	}
 
-	public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData
+	public class AuxiliaryDataInputData : IAuxiliaryEngineeringInputData, IAuxiliaryDeclarationInputData
 	{
 		public AuxiliaryDataInputData()
 		{
@@ -146,15 +146,11 @@ namespace TUGraz.VectoCore.InputData.Impl
 
 		public AuxiliaryDemandType AuxiliaryType { get; internal set; }
 
-		public bool SavedInDeclarationMode { get; internal set; }
-
 		public string ID { get; internal set; }
 
-		public string Type { get; internal set; }
-
-		public string Technology { get; internal set; }
+		public AuxiliaryType Type { get; internal set; }
 
-		public IList<string> TechList { get; internal set; }
+		public IList<string> Technology { get; internal set; }
 
 		public double TransmissionRatio { get; internal set; }
 
diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs
new file mode 100644
index 0000000000..83aef8d8b7
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/AuxiliaryDataReader.cs
@@ -0,0 +1,105 @@
+using System.Data;
+using System.IO;
+using System.Linq;
+using System.Text;
+using TUGraz.VectoCommon.Exceptions;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.InputData.Reader.ComponentData
+{
+	public sealed class AuxiliaryDataReader
+	{
+		public static AuxiliaryData Create(IAuxiliaryEngineeringInputData data)
+		{
+			var map = ReadAuxMap(data.ID, data.DemandMap);
+			return new AuxiliaryData(data.TransmissionRatio, data.EfficiencyToEngine, data.EfficiencyToSupply, map);
+		}
+
+		public static AuxiliaryData ReadFromFile(string fileName, string id)
+		{
+			try {
+				var stream = new StreamReader(fileName);
+				stream.ReadLine(); // skip header "Transmission ration to engine rpm [-]"
+				var transmissionRatio = stream.ReadLine().IndulgentParse();
+				stream.ReadLine(); // skip header "Efficiency to engine [-]"
+				var efficiencyToEngine = stream.ReadLine().IndulgentParse();
+				stream.ReadLine(); // skip header "Efficiency auxiliary to supply [-]"
+				var efficiencyToSupply = stream.ReadLine().IndulgentParse();
+
+				var m = new MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd()));
+				var table = VectoCSVFile.ReadStream(m);
+				var map = ReadAuxMap(id, table);
+
+				return new AuxiliaryData(transmissionRatio, efficiencyToEngine, efficiencyToSupply, map);
+				;
+			} catch (FileNotFoundException e) {
+				throw new VectoException("Auxiliary file not found: " + fileName, e);
+			}
+		}
+
+		private static DelaunayMap ReadAuxMap(string id, DataTable table)
+		{
+			var map = new DelaunayMap(id);
+			if (HeaderIsValid(table.Columns)) {
+				FillFromColumnNames(table, map);
+			} else {
+				FillFromColumnIndizes(table, map);
+			}
+
+			map.Triangulate();
+			return map;
+		}
+
+
+		private static void FillFromColumnIndizes(DataTable table, DelaunayMap map)
+		{
+			var data = table.Rows.Cast<DataRow>().Select(row => new {
+				AuxiliarySpeed = row.ParseDouble(0).RPMtoRad(),
+				MechanicalPower = row.ParseDouble(1).SI().Kilo.Watt.Cast<Watt>(),
+				SupplyPower = row.ParseDouble(2).SI().Kilo.Watt.Cast<Watt>()
+			});
+			foreach (var d in data) {
+				map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value());
+			}
+		}
+
+		private static void FillFromColumnNames(DataTable table, DelaunayMap map)
+		{
+			var data = table.Rows.Cast<DataRow>().Select(row => new {
+				AuxiliarySpeed = DataTableExtensionMethods.ParseDouble(row, (string)Fields.AuxSpeed).RPMtoRad(),
+				MechanicalPower = DataTableExtensionMethods.ParseDouble(row, (string)Fields.MechPower).SI().Kilo.Watt.Cast<Watt>(),
+				SupplyPower = DataTableExtensionMethods.ParseDouble(row, (string)Fields.SupplyPower).SI().Kilo.Watt.Cast<Watt>()
+			});
+			foreach (var d in data) {
+				map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value());
+			}
+		}
+
+		private static bool HeaderIsValid(DataColumnCollection columns)
+		{
+			return columns.Contains(Fields.AuxSpeed) && columns.Contains(Fields.MechPower) &&
+					columns.Contains(Fields.SupplyPower);
+		}
+
+		public static class Fields
+		{
+			/// <summary>
+			/// [1/min]
+			/// </summary>
+			public const string AuxSpeed = "Auxiliary speed";
+
+			/// <summary>
+			/// [kW]
+			/// </summary>
+			public const string MechPower = "Mechanical power";
+
+			/// <summary>
+			/// [kW]
+			/// </summary>
+			public const string SupplyPower = "Supply power";
+		}
+	}
+}
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 77cc69ecfa..a97cef888c 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -240,7 +240,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 			}
 
 			foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) {
-				var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => AuxiliaryTypeHelper.Parse(a.Type) == auxType);
+				var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType);
 				if (auxData == null) {
 					throw new VectoException("Auxiliary {0} not found.", auxType);
 				}
@@ -250,14 +250,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				};
 				switch (auxType) {
 					case AuxiliaryType.Fan:
-						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology);
+						aux.PowerDemand = DeclarationData.Fan.Lookup(mission, auxData.Technology.First());
 						aux.ID = Constants.Auxiliaries.IDs.Fan;
 						break;
 					case AuxiliaryType.SteeringPump:
-						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology);
+						aux.PowerDemand = DeclarationData.SteeringPump.Lookup(mission, hvdClass, auxData.Technology.First());
 						aux.ID = Constants.Auxiliaries.IDs.SteeringPump;
 						break;
-					case AuxiliaryType.HeatingVentilationAirCondition:
+					case AuxiliaryType.HVAC:
 						aux.PowerDemand = DeclarationData.HeatingVentilationAirConditioning.Lookup(mission, hvdClass);
 						aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition;
 						break;
@@ -266,10 +266,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 						aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem;
 						break;
 					case AuxiliaryType.ElectricSystem:
-						aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission,
-							auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray());
+						//aux.PowerDemand = DeclarationData.ElectricSystem.Lookup(mission,
+						//	auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray());
 						aux.ID = Constants.Auxiliaries.IDs.ElectricSystem;
-						aux.TechList = auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray();
+						//aux.TechList = auxData.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray();
 						break;
 					default:
 						continue;
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
index 223e245d2b..70c767dea0 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs
@@ -36,6 +36,7 @@ using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
@@ -149,7 +150,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				} else {
 					throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1);
 				}
-				
+
 				var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque);
 				var shiftPolygon = gear.ShiftPolygon != null
 					? ShiftPolygonReader.Create(gear.ShiftPolygon)
@@ -172,9 +173,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 
 		public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData)
 		{
-			if (auxInputData.SavedInDeclarationMode) {
-				WarnEngineeringMode("AuxData");
-			}
 			return auxInputData.Auxiliaries.Select(a => {
 				switch (a.AuxiliaryType) {
 					case AuxiliaryDemandType.Mapping:
@@ -190,18 +188,16 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		private static VectoRunData.AuxData CreateMappingAuxiliary(IAuxiliaryEngineeringInputData a)
 		{
 			if (a.DemandMap == null) {
-				throw new VectoSimulationException("Demand Map for auxiliary {0} {1} required", a.ID, a.Technology);
+				throw new VectoSimulationException("Demand Map for auxiliary {0} required", a.ID);
 			}
 			if (a.DemandMap.Columns.Count != 3 || a.DemandMap.Rows.Count < 4) {
 				throw new VectoSimulationException(
-					"Demand Map for auxiliary {0} {1} has to contain exactly 3 columns and at least 4 rows", a.ID, a.Technology);
+					"Demand Map for auxiliary {0} has to contain exactly 3 columns and at least 4 rows", a.ID);
 			}
 			return new VectoRunData.AuxData {
 				ID = a.ID,
-				Technology = a.Technology,
-				TechList = a.TechList.DefaultIfNull(Enumerable.Empty<string>()).ToArray(),
 				DemandType = AuxiliaryDemandType.Mapping,
-				Data = new AuxiliaryData(a, a.ID) //AuxiliaryData.Create(a.DemandMap)
+				Data = AuxiliaryDataReader.Create(a)
 			};
 		}
 
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
index cfcd4fc25b..b1a536787d 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs
@@ -29,6 +29,7 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using TUGraz.VectoCommon.Exceptions;
@@ -102,7 +103,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 			[Required] public AuxiliaryType Type;
 
-			public string Technology;
+			public IList<string> Technology;
 
 			public string[] TechList;
 
@@ -143,6 +144,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 									string.Format("Interpolation of Gear-{0}-LossMap failed with torque={1} and angularSpeed={2}", gear.Key,
 										inTorque, angularVelocity.ConvertTo().Rounds.Per.Minute));
 							}
+							var velocity = angularVelocity / gear.Value.Ratio / axleGearData.AxleGear.Ratio *
+											runData.VehicleData.DynamicTyreRadius;
 
 							if (axleGearData != null) {
 								var axleAngularVelocity = angularVelocity / gear.Value.Ratio;
@@ -151,8 +154,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 								} catch (VectoException) {
 									return
 										new ValidationResult(
-											string.Format("Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1}", axleTorque,
-												axleAngularVelocity.ConvertTo().Rounds.Per.Minute));
+											string.Format(
+												"Interpolation of AxleGear-LossMap failed with torque={0} and angularSpeed={1} (gear={2}, velocity={3})",
+												axleTorque, axleAngularVelocity.ConvertTo().Rounds.Per.Minute, gear.Key, velocity));
 								}
 							}
 						}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs
index fdf0714366..4056d61288 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/AuxiliaryData.cs
@@ -40,6 +40,7 @@ using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.SimulationComponent.Data
@@ -61,109 +62,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public Watt GetPowerDemand(PerSecond nAuxiliary, Watt powerAuxOut)
 		{
 			var value = _map.Interpolate(nAuxiliary.Value(), powerAuxOut.Value());
-			if (value.HasValue)
+			if (value.HasValue) {
 				return value.Value.SI<Watt>();
+			}
 
 			throw new VectoException("AuxiliaryData: Interpolation failed. nAux: {0}, powerOut:{1}", nAuxiliary.AsRPM,
 				powerAuxOut);
 		}
 
-		public static AuxiliaryData ReadFromFile(string fileName, string id)
-		{
-			var auxData = new AuxiliaryData(id);
-
-			try {
-				var stream = new StreamReader(fileName);
-				stream.ReadLine(); // skip header "Transmission ration to engine rpm [-]"
-				auxData.TransmissionRatio = stream.ReadLine().IndulgentParse();
-				stream.ReadLine(); // skip header "Efficiency to engine [-]"
-				auxData.EfficiencyToEngine = stream.ReadLine().IndulgentParse();
-				stream.ReadLine(); // skip header "Efficiency auxiliary to supply [-]"
-				auxData.EfficiencyToSupply = stream.ReadLine().IndulgentParse();
-
-				var m = new MemoryStream(Encoding.UTF8.GetBytes(stream.ReadToEnd()));
-				var table = VectoCSVFile.ReadStream(m);
-
-				if (HeaderIsValid(table.Columns)) {
-					FillFromColumnNames(table, auxData._map);
-				} else {
-					FillFromColumnIndizes(table, auxData._map);
-				}
-
-				auxData._map.Triangulate();
-
-				return auxData;
-			} catch (FileNotFoundException e) {
-				throw new VectoException("Auxiliary file not found: " + fileName, e);
-			}
-		}
-
-		private static void FillFromColumnIndizes(DataTable table, DelaunayMap map)
-		{
-			var data = table.Rows.Cast<DataRow>().Select(row => new {
-				AuxiliarySpeed = row.ParseDouble(0).RPMtoRad(),
-				MechanicalPower = row.ParseDouble(1).SI().Kilo.Watt.Cast<Watt>(),
-				SupplyPower = row.ParseDouble(2).SI().Kilo.Watt.Cast<Watt>()
-			});
-			foreach (var d in data) {
-				map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value());
-			}
-		}
-
-		private static void FillFromColumnNames(DataTable table, DelaunayMap map)
-		{
-			var data = table.Rows.Cast<DataRow>().Select(row => new {
-				AuxiliarySpeed = row.ParseDouble(Fields.AuxSpeed).RPMtoRad(),
-				MechanicalPower = row.ParseDouble(Fields.MechPower).SI().Kilo.Watt.Cast<Watt>(),
-				SupplyPower = row.ParseDouble(Fields.SupplyPower).SI().Kilo.Watt.Cast<Watt>()
-			});
-			foreach (var d in data) {
-				map.AddPoint(d.AuxiliarySpeed.Value(), d.SupplyPower.Value(), d.MechanicalPower.Value());
-			}
-		}
-
-		internal AuxiliaryData(string id)
-		{
-			_map = new DelaunayMap(id);
-		}
-
-		internal AuxiliaryData(IAuxiliaryEngineeringInputData data, string id)
-		{
-			_map = new DelaunayMap("AuxiliaryData " + id);
-			TransmissionRatio = data.TransmissionRatio;
-			EfficiencyToEngine = data.EfficiencyToEngine;
-			EfficiencyToSupply = data.EfficiencyToSupply;
-			if (HeaderIsValid(data.DemandMap.Columns)) {
-				FillFromColumnNames(data.DemandMap, _map);
-			} else {
-				FillFromColumnIndizes(data.DemandMap, _map);
-			}
-
-			_map.Triangulate();
-		}
-
-		private static bool HeaderIsValid(DataColumnCollection columns)
-		{
-			return columns.Contains(Fields.AuxSpeed) && columns.Contains(Fields.MechPower) &&
-					columns.Contains(Fields.SupplyPower);
-		}
-
-		private static class Fields
+		internal AuxiliaryData(double transmissionRatio, double efficiencyToEngine, double efficiencyToSupply, DelaunayMap map)
 		{
-			/// <summary>
-			/// [1/min]
-			/// </summary>
-			public const string AuxSpeed = "Auxiliary speed";
-
-			/// <summary>
-			/// [kW]
-			/// </summary>
-			public const string MechPower = "Mechanical power";
-
-			/// <summary>
-			/// [kW]
-			/// </summary>
-			public const string SupplyPower = "Supply power";
+			_map = map;
+			TransmissionRatio = transmissionRatio;
+			EfficiencyToEngine = efficiencyToEngine;
+			EfficiencyToSupply = efficiencyToSupply;
 		}
 
 		/// <summary>
@@ -180,17 +92,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 
 			var results = new List<ValidationResult>();
 			foreach (var entry in data._map.Points) {
-				context.DisplayName = Fields.AuxSpeed;
+				context.DisplayName = AuxiliaryDataReader.Fields.AuxSpeed;
 				if (!Validator.TryValidateValue(entry.X, context, results, xValidationRules)) {
 					return new ValidationResult(string.Concat(results));
 				}
 
-				context.DisplayName = Fields.SupplyPower;
+				context.DisplayName = AuxiliaryDataReader.Fields.SupplyPower;
 				if (!Validator.TryValidateValue(entry.Y, context, results, yValidationRules)) {
 					return new ValidationResult(string.Concat(results));
 				}
 
-				context.DisplayName = Fields.MechPower;
+				context.DisplayName = AuxiliaryDataReader.Fields.MechPower;
 				if (!Validator.TryValidateValue(entry.Z, context, results, zValidationRules)) {
 					return new ValidationResult(string.Concat(results));
 				}
diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj
index 6280561b3c..2bae0791eb 100644
--- a/VectoCore/VectoCore/VectoCore.csproj
+++ b/VectoCore/VectoCore/VectoCore.csproj
@@ -136,8 +136,10 @@
     <Compile Include="InputData\Reader\ComponentData\TransmissionLossMapReader.cs" />
     <Compile Include="InputData\Reader\ComponentData\RetarderLossMapReader.cs" />
     <Compile Include="InputData\Reader\ComponentData\TorqueConverterDataReader.cs" />
+    <Compile Include="InputData\Reader\ComponentData\AuxiliaryDataReader.cs" />
     <Compile Include="Models\SimulationComponent\Data\Engine\FuelConsumptionMapReader.cs" />
     <Compile Include="Models\SimulationComponent\Impl\TorqueConverter.cs" />
+    <Compile Include="Utils\AuxiliaryTypeHelper.cs" />
     <Compile Include="Utils\ProviderExtensions.cs" />
     <Compile Include="Models\Declaration\AirDrag.cs" />
     <Compile Include="Models\Declaration\Fan.cs" />
@@ -197,7 +199,6 @@
     <Compile Include="Models\Simulation\DataBus\IClutchInfo.cs" />
     <Compile Include="Models\Simulation\DataBus\IDriverInfo.cs" />
     <Compile Include="Models\Simulation\DataBus\IWheelsInfo.cs" />
-    <Compile Include="Models\SimulationComponent\Data\AuxiliaryType.cs" />
     <Compile Include="Models\SimulationComponent\Data\FullLoadCurve.cs" />
     <Compile Include="Models\Simulation\DataBus\IMileageCounter.cs" />
     <Compile Include="Utils\DebugData.cs" />
diff --git a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
index 69f9c6ad9a..e086e41bc5 100644
--- a/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
+++ b/VectoCore/VectoCoreTest/FileIO/JsonTest.cs
@@ -95,9 +95,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			((JObject)json["Body"]).Property("Cycles").Remove();
 
 			AssertHelper.Exception<InvalidFileFormatException>(
-				() => {
-					var tmp = new JSONInputDataV2(json, TestJobFile).Cycles;
-				}, "Key Cycles not found");
+				() => { var tmp = new JSONInputDataV2(json, TestJobFile).Cycles; }, "Key Cycles not found");
 		}
 
 		[TestMethod]
@@ -107,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			((JObject)json["Body"]).Property("Aux").Remove();
 
 			// MK,2016-01-20: Changed for PWheel: aux entry may be missing, and that is ok.
-			var tmp = new JSONInputDataV2(json, TestJobFile).Auxiliaries;
+			var tmp = new JSONInputDataV2(json, TestJobFile).AuxiliaryInputData().Auxiliaries;
 			Assert.IsTrue(tmp.Count == 0);
 		}
 
@@ -154,26 +152,24 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			((JObject)json["Body"]).Property("OverSpeedEcoRoll").Remove();
 
 			AssertHelper.Exception<VectoException>(
-				() => {
-					var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll;
-				},
+				() => { var tmp = new JSONInputDataV2(json, TestJobFile).DriverInputData.OverSpeedEcoRoll; },
 				"Key OverSpeedEcoRoll not found");
 		}
 
-		[TestMethod]
-		public void TestReadingElectricTechlist()
-		{
-			var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
-			((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights");
-
-			var job = new JSONInputDataV2(json, TestJobFile);
-			foreach (var aux in job.Auxiliaries) {
-				if (aux.ID == "ES") {
-					Assert.AreEqual(1, aux.TechList.Count);
-					Assert.AreEqual("LED lights", aux.TechList.First());
-				}
-			}
-		}
+		//[TestMethod]
+		//public void TestReadingElectricTechlist()
+		//{
+		//	var json = (JObject)JToken.ReadFrom(new JsonTextReader(File.OpenText(TestJobFile)));
+		//	((JArray)json["Body"]["Aux"][3]["TechList"]).Add("LED lights");
+
+		//	var job = new JSONInputDataV2(json, TestJobFile);
+		//	foreach (var aux in job.Auxiliaries) {
+		//		if (aux.ID == "ES") {
+		//			Assert.AreEqual(1, aux.TechList.Count);
+		//			Assert.AreEqual("LED lights", aux.TechList.First());
+		//		}
+		//	}
+		//}
 
 		[TestMethod]
 		public void JSON_Read_AngleGear()
@@ -184,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
 			Assert.AreEqual(AngularGearType.SeparateAngularGear,
 				angleGear["Type"].Value<string>().ParseEnum<AngularGearType>());
 			Assert.AreEqual(3.5, angleGear["Ratio"].Value<double>());
-			Assert.AreEqual("AngularGear.vtlm", angleGear["LossMap"].Value<string>());
+			Assert.AreEqual("AngleGear.vtlm", angleGear["LossMap"].Value<string>());
 		}
 	}
 
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
index 70d7c3a54d..45c5cd4824 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/AuxTests.cs
@@ -39,6 +39,7 @@ using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Utils;
 using TUGraz.VectoCore.InputData.FileIO.JSON;
 using TUGraz.VectoCore.InputData.Reader;
+using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using TUGraz.VectoCore.OutputData;
@@ -104,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			var testColumns = new[] { "P_aux_FAN", "P_aux_STP", "P_aux_AC", "P_aux_ES", "P_aux_PS", "P_aux" };
 
 			ResultFileHelper.TestModFile(@"TestData\Results\EngineOnlyCycles\40t_Long_Haul_Truck_Long_Haul_Empty Loading.vmod",
-				@"AuxWriteModFileSumFile.vmod", testColumns, testVelocity:false);
+				@"AuxWriteModFileSumFile.vmod", testColumns, testVelocity: false);
 			ResultFileHelper.TestSumFile(@"TestData\Results\EngineOnlyCycles\AuxWriteModFileSumFile.vsum",
 				@"AuxWriteModFileSumFile.vsum");
 		}
@@ -187,7 +188,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 
 			var aux = new EngineAuxiliary(container);
 
-			var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT");
+			var auxData = AuxiliaryDataReader.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT");
 			// ratio = 4.078
 			// efficiency_engine = 0.96
 			// efficiency_supply = 0.98
@@ -246,7 +247,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 
 			var aux = new EngineAuxiliary(container);
 
-			var auxData = AuxiliaryData.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT");
+			var auxData = AuxiliaryDataReader.ReadFromFile(@"TestData\Components\24t_Coach_ALT.vaux", "ALT");
 			// ratio = 4.078
 			// efficiency_engine = 0.96
 			// efficiency_supply = 0.98
@@ -297,7 +298,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 		[TestMethod]
 		public void AuxFileMissing()
 		{
-			AssertHelper.Exception<VectoException>(() => AuxiliaryData.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux", "N.A."),
+			AssertHelper.Exception<VectoException>(() => AuxiliaryDataReader.ReadFromFile(@"NOT_EXISTING_AUX_FILE.vaux", "N.A."),
 				"Auxiliary file not found: NOT_EXISTING_AUX_FILE.vaux");
 		}
 
diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs
index 39c9c69acd..868c10ab9c 100644
--- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs
+++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/AuxiliaryTypeHelperTest.cs
@@ -31,9 +31,11 @@
 
 using System;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
+using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCore.Configuration;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Tests.Utils;
+using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 {
@@ -46,7 +48,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			Assert.AreEqual(AuxiliaryType.Fan, AuxiliaryTypeHelper.Parse("Fan"));
 			Assert.AreEqual(AuxiliaryType.SteeringPump, AuxiliaryTypeHelper.Parse("Steering pump"));
 			Assert.AreEqual(AuxiliaryType.ElectricSystem, AuxiliaryTypeHelper.Parse("Electric System"));
-			Assert.AreEqual(AuxiliaryType.HeatingVentilationAirCondition, AuxiliaryTypeHelper.Parse("HVAC"));
+			Assert.AreEqual(AuxiliaryType.HVAC, AuxiliaryTypeHelper.Parse("HVAC"));
 			Assert.AreEqual(AuxiliaryType.PneumaticSystem, AuxiliaryTypeHelper.Parse("Pneumatic System"));
 			AssertHelper.Exception<ArgumentOutOfRangeException>(() => { AuxiliaryTypeHelper.Parse("Foo Bar Blupp"); });
 		}
@@ -57,7 +59,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData
 			Assert.AreEqual(Constants.Auxiliaries.Names.Fan, AuxiliaryTypeHelper.ToString(AuxiliaryType.Fan));
 			Assert.AreEqual(Constants.Auxiliaries.Names.SteeringPump, AuxiliaryTypeHelper.ToString(AuxiliaryType.SteeringPump));
 			Assert.AreEqual(Constants.Auxiliaries.Names.HeatingVentilationAirCondition,
-				AuxiliaryTypeHelper.ToString(AuxiliaryType.HeatingVentilationAirCondition));
+				AuxiliaryTypeHelper.ToString(AuxiliaryType.HVAC));
 			Assert.AreEqual(Constants.Auxiliaries.Names.PneumaticSystem,
 				AuxiliaryTypeHelper.ToString(AuxiliaryType.PneumaticSystem));
 			Assert.AreEqual(Constants.Auxiliaries.Names.ElectricSystem,
-- 
GitLab