From 459051776514aed0b0675dd6b3b8febf742edb40 Mon Sep 17 00:00:00 2001
From: Michael Krisper <michael.krisper@tugraz.at>
Date: Thu, 21 Jan 2016 21:42:15 +0100
Subject: [PATCH] added some checks for null in the sumwriter for pwheel mode

---
 .../Models/Simulation/Impl/JobContainer.cs    |   2 +-
 .../Simulation/Impl/PowertrainBuilder.cs      |   7 +-
 .../SimulationComponent/Impl/Gearbox.cs       |   3 +
 .../Impl/PowertrainDrivingCycle.cs            |  44 +++++--
 VectoCore/OutputData/IModalDataContainer.cs   | 108 ++++++++++++++----
 VectoCore/OutputData/SummaryDataContainer.cs  |  54 ++++++---
 .../Models/Simulation/PwheelModeTests.cs      |   2 +-
 7 files changed, 166 insertions(+), 54 deletions(-)

diff --git a/VectoCore/Models/Simulation/Impl/JobContainer.cs b/VectoCore/Models/Simulation/Impl/JobContainer.cs
index b1ec85897a..7b7ea1959a 100644
--- a/VectoCore/Models/Simulation/Impl/JobContainer.cs
+++ b/VectoCore/Models/Simulation/Impl/JobContainer.cs
@@ -190,7 +190,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 			{
 				var stopWatch = Stopwatch.StartNew();
 				try {
-					Run.Run(_worker, (x => Progress = x));
+					Run.Run(_worker, x => Progress = x);
 				} catch (Exception ex) {
 					Log.Error(ex, "Error during simulation run!");
 					ExecException = ex;
diff --git a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
index b8977e050a..d410b982de 100644
--- a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
+++ b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs
@@ -15,6 +15,8 @@
 */
 
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using TUGraz.VectoCore.Exceptions;
 using TUGraz.VectoCore.Models.Connector.Ports;
 using TUGraz.VectoCore.Models.Simulation.Data;
@@ -58,7 +60,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 			var directAux = new Auxiliary(_container);
 			directAux.AddDirect(cycle);
-			
+
 			cycle.InPort().Connect(directAux.OutPort());
 
 			var engine = new EngineOnlyCombustionEngine(_container, data.EngineData);
@@ -69,7 +71,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
 
 		private VehicleContainer BuildPWheel(VectoRunData data)
 		{
-			var cycle = new PowertrainDrivingCycle(_container, data.Cycle);
+			var cycle = new PWheelCycle(_container, data.Cycle, data.AxleGearData.Ratio,
+				data.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio));
 
 			var tmp = AddComponent(cycle, new AxleGear(_container, data.AxleGearData));
 
diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
index dd0a8f2aad..3c972ec4d9 100644
--- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs
@@ -90,6 +90,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		#region ITnInProvider
 
+		[DebuggerHidden]
 		public ITnInPort InPort()
 		{
 			return this;
@@ -280,6 +281,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), null);
 			response.GearboxPowerRequest = outTorque * outAngularVelocity;
 
+			PreviousInAngularSpeed = DataBus.EngineIdleSpeed;
+
 			return response;
 		}
 
diff --git a/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs b/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
index 5eaef5b111..8a34c552ae 100644
--- a/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
+++ b/VectoCore/Models/SimulationComponent/Impl/PowertrainDrivingCycle.cs
@@ -21,9 +21,8 @@ using TUGraz.VectoCore.Exceptions;
 using TUGraz.VectoCore.Models.Connector.Ports;
 using TUGraz.VectoCore.Models.Connector.Ports.Impl;
 using TUGraz.VectoCore.Models.Simulation;
-using TUGraz.VectoCore.Models.Simulation.Impl;
+using TUGraz.VectoCore.Models.Simulation.DataBus;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.OutputData;
 using TUGraz.VectoCore.Utils;
 
@@ -37,11 +36,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 	{
 		protected DrivingCycleData Data;
 		protected ITnOutPort NextComponent;
-		private IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; }
-		private IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; }
+		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> RightSample { get; set; }
+		protected IEnumerator<DrivingCycleData.DrivingCycleEntry> LeftSample { get; set; }
 
 		protected Second AbsTime { get; set; }
 
+		/// <summary>
+		/// Initializes a new instance of the <see cref="PowertrainDrivingCycle"/> class.
+		/// </summary>
+		/// <param name="container">The container.</param>
+		/// <param name="cycle">The cycle.</param>
 		public PowertrainDrivingCycle(IVehicleContainer container, DrivingCycleData cycle) : base(container)
 		{
 			Data = cycle;
@@ -80,8 +84,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		IResponse ISimulationOutPort.Request(Second absTime, Second dt)
 		{
-			//todo: change to variable time steps
-			var index = (int)Math.Floor(absTime.Value());
+			var index = (int)absTime.Value();
 			if (index >= Data.Entries.Count) {
 				return new ResponseCycleFinished();
 			}
@@ -91,8 +94,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		public IResponse Initialize()
 		{
-			var index = 0;
-			return NextComponent.Initialize(Data.Entries[index].Torque, Data.Entries[index].AngularVelocity);
+			AbsTime = Data.Entries.First().Time;
+			return NextComponent.Initialize(Data.Entries.First().Torque, Data.Entries.First().AngularVelocity);
 		}
 
 		public string CycleName
@@ -128,8 +131,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 
 		protected override void DoCommitSimulationStep()
 		{
-			LeftSample.MoveNext();
-			RightSample.MoveNext();
+			if (RightSample.MoveNext()) {
+				LeftSample.MoveNext();
+			}
 		}
 
 		#endregion
@@ -145,14 +149,30 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 		}
 	}
 
-	public class PWheelCycle : PowertrainDrivingCycle
+	public class PWheelCycle : PowertrainDrivingCycle, IDriverInfo
 	{
+		/// <summary>
+		/// True if the angularVelocity at the wheels is 0.
+		/// </summary>
+		public bool VehicleStopped
+		{
+			get { return LeftSample.Current.AngularVelocity.IsEqual(0); }
+		}
+
+		/// <summary>
+		/// Always Driving.
+		/// </summary>
+		public DrivingBehavior DrivingBehavior
+		{
+			get { return DrivingBehavior.Driving; }
+		}
+
 		public PWheelCycle(IVehicleContainer container, DrivingCycleData cycle, double axleRatio,
 			IDictionary<uint, double> gears) : base(container, cycle)
 		{
 			gears[0] = 1;
 			foreach (var entry in Data.Entries) {
-				entry.AngularVelocity *= axleRatio * gears[entry.Gear];
+				entry.AngularVelocity = entry.AngularVelocity / (axleRatio * gears[entry.Gear]);
 				entry.Torque = entry.PWheel / entry.AngularVelocity;
 			}
 		}
diff --git a/VectoCore/OutputData/IModalDataContainer.cs b/VectoCore/OutputData/IModalDataContainer.cs
index db2e1cd52a..42494dec60 100644
--- a/VectoCore/OutputData/IModalDataContainer.cs
+++ b/VectoCore/OutputData/IModalDataContainer.cs
@@ -127,41 +127,65 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static MeterPerSquareSecond AccelerationsPositive3SecondAverage(this IModalDataContainer data)
 		{
-			var acceleration3SecondAverage = AccelerationPer3Seconds(data);
-			return acceleration3SecondAverage.Where(x => x > 0.125).Average();
+			try {
+				var acceleration3SecondAverage = AccelerationPer3Seconds(data);
+				return acceleration3SecondAverage.Where(x => x > 0.125).Average();
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static MeterPerSquareSecond AccelerationNoise(this IModalDataContainer data)
 		{
-			var avg = data.AccelerationAverage();
-			var accelerationAverages = AccelerationPerSecond(data).ToList();
-			var sqareAvg = accelerationAverages.Select(x => (x - avg) * (x - avg)).Sum() / accelerationAverages.Count;
-			return sqareAvg.Sqrt().Cast<MeterPerSquareSecond>();
+			try {
+				var avg = data.AccelerationAverage();
+				var accelerationAverages = AccelerationPerSecond(data).ToList();
+				var sqareAvg = accelerationAverages.Select(x => (x - avg) * (x - avg)).Sum() / accelerationAverages.Count;
+				return sqareAvg.Sqrt().Cast<MeterPerSquareSecond>();
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static MeterPerSquareSecond AverageAccelerations3SecondNegative(this IModalDataContainer data)
 		{
-			var acceleration3SecondAverage = AccelerationPer3Seconds(data);
-			return acceleration3SecondAverage.Where(x => x < -0.125).Average();
+			try {
+				var acceleration3SecondAverage = AccelerationPer3Seconds(data);
+				return acceleration3SecondAverage.Where(x => x < -0.125).Average();
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static Scalar PercentAccelerationTime(this IModalDataContainer data)
 		{
-			var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
-			return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count;
+			try {
+				var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
+				return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x > 0.125) / acceleration3SecondAverage.Count;
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static Scalar PercentDecelerationTime(this IModalDataContainer data)
 		{
-			var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
-			return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count;
+			try {
+				var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
+				return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x < -0.125) / acceleration3SecondAverage.Count;
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static Scalar PercentCruiseTime(this IModalDataContainer data)
 		{
-			var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
-			return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x.IsBetween(-0.125, -0.125)) /
-					acceleration3SecondAverage.Count;
+			try {
+				var acceleration3SecondAverage = AccelerationPer3Seconds(data).ToList();
+				return 100.SI<Scalar>() * acceleration3SecondAverage.Count(x => x.IsBetween(-0.125, -0.125)) /
+						acceleration3SecondAverage.Count;
+			} catch (NullReferenceException) {
+				return null;
+			}
 		}
 
 		public static Scalar PercentStopTime(this IModalDataContainer data)
@@ -184,8 +208,10 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static Meter AltitudeDelta(this IModalDataContainer data)
 		{
-			return data.GetValues<Meter>(ModalResultField.altitude).Last() -
-					data.GetValues<Meter>(ModalResultField.altitude).First();
+			var altitudes = data.GetValues<Meter>(ModalResultField.altitude).ToList();
+			var first = altitudes.First();
+			var last = altitudes.Last();
+			return first == null || last == null ? null : last - first;
 		}
 
 		public static WattSecond PowerAccelerations(this IModalDataContainer data)
@@ -220,7 +246,9 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static Meter Distance(this IModalDataContainer data)
 		{
-			return (data.Max(ModalResultField.dist) - data.Min(ModalResultField.dist)).Cast<Meter>();
+			var max = data.Max(ModalResultField.dist);
+			var min = data.Min(ModalResultField.dist);
+			return max == null || min == null ? null : (max - min).Cast<Meter>();
 		}
 
 		public static WattSecond WorkTotalMechanicalBrake(this IModalDataContainer data)
@@ -270,7 +298,11 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static KilogramPerMeter FuelConsumptionWHTCCorrected(this IModalDataContainer data)
 		{
-			return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / data.Distance();
+			var distance = data.Distance();
+			if (distance == null) {
+				return null;
+			}
+			return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / distance;
 		}
 
 		public static KilogramPerSecond FuelConsumptionWHTCCorrectedPerSecond(this IModalDataContainer data)
@@ -280,7 +312,11 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static KilogramPerMeter FuelConsumptionAuxStartStopCorrected(this IModalDataContainer data)
 		{
-			return data.TimeIntegral<Kilogram>(ModalResultField.FCAUXc) / data.Distance();
+			var distance = data.Distance();
+			if (distance == null) {
+				return null;
+			}
+			return data.TimeIntegral<Kilogram>(ModalResultField.FCAUXc) / distance;
 		}
 
 		public static KilogramPerSecond FuelConsumptionAuxStartStopCorrectedPerSecond(this IModalDataContainer data)
@@ -290,18 +326,31 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static KilogramPerMeter FuelConsumptionFinal(this IModalDataContainer data)
 		{
-			return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / data.Distance();
+			var distance = data.Distance();
+			if (distance == null) {
+				return null;
+			}
+			return data.TimeIntegral<Kilogram>(ModalResultField.FCWHTCc) / distance;
 		}
 
 		public static SI FuelConsumptionFinalLiterPer100Kilometer(this IModalDataContainer data)
 		{
-			var fcVolumePerMeter = data.FuelConsumptionFinal() / Physics.FuelDensity;
+			var fuelConsumptionFinal = data.FuelConsumptionFinal();
+			if (fuelConsumptionFinal == null) {
+				return null;
+			}
+
+			var fcVolumePerMeter = fuelConsumptionFinal / Physics.FuelDensity;
 			return fcVolumePerMeter.ConvertTo().Cubic.Dezi.Meter * 100.SI().Kilo.Meter;
 		}
 
 		public static KilogramPerMeter CO2PerMeter(this IModalDataContainer data)
 		{
-			return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) * Physics.CO2PerFuelWeight / data.Distance();
+			var distance = data.Distance();
+			if (distance == null) {
+				return null;
+			}
+			return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) * Physics.CO2PerFuelWeight / distance;
 		}
 
 		public static SI FuelConsumptionLiterPer100Kilometer(this IModalDataContainer data)
@@ -317,7 +366,11 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static KilogramPerMeter FuelConsumptionPerMeter(this IModalDataContainer data)
 		{
-			return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) / data.Distance();
+			var distance = data.Distance();
+			if (distance == null) {
+				return null;
+			}
+			return data.TimeIntegral<Kilogram>(ModalResultField.FCMap) / distance;
 		}
 
 		public static Watt EnginePowerNegativeAverage(this IModalDataContainer data)
@@ -346,7 +399,12 @@ namespace TUGraz.VectoCore.OutputData
 
 		public static MeterPerSecond Speed(this IModalDataContainer data)
 		{
-			return Distance(data) / Duration(data);
+			var distance = Distance(data);
+			var duration = Duration(data);
+			if (distance == null || duration == null) {
+				return null;
+			}
+			return distance / duration;
 		}
 
 		public static WattSecond AuxiliaryWork(this IModalDataContainer data, DataColumn auxCol)
diff --git a/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/OutputData/SummaryDataContainer.cs
index 8627d371fa..7c936ff929 100644
--- a/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/OutputData/SummaryDataContainer.cs
@@ -84,8 +84,8 @@ namespace TUGraz.VectoCore.OutputData
 		private bool _engineOnly = true;
 
 		protected SummaryDataContainer() {}
-		
-		
+
+
 		private readonly IList<string> _auxColumns = new List<string>();
 
 		/// <summary>
@@ -111,8 +111,7 @@ namespace TUGraz.VectoCore.OutputData
 		}
 
 		public virtual void Write(bool isEngineOnly, IModalDataContainer data, string jobFileName, string jobName,
-			string cycleFileName,
-			Kilogram vehicleMass, Kilogram vehicleLoading)
+			string cycleFileName, Kilogram vehicleMass, Kilogram vehicleLoading)
 		{
 			if (isEngineOnly) {
 				WriteEngineOnly(data, jobFileName, jobName, cycleFileName);
@@ -154,26 +153,55 @@ namespace TUGraz.VectoCore.OutputData
 			row[CYCLE] = cycleFileName;
 			row[STATUS] = data.RunStatus;
 			row[TIME] = data.Duration();
-			row[DISTANCE] = data.Distance().ConvertTo().Kilo.Meter;
-			row[SPEED] = data.Speed().ConvertTo().Kilo.Meter.Per.Hour;
+
+			var distance = data.Distance();
+			if (distance != null) {
+				row[DISTANCE] = distance.ConvertTo().Kilo.Meter;
+			}
+
+			var speed = data.Speed();
+			if (speed != null) {
+				row[SPEED] = speed.ConvertTo().Kilo.Meter.Per.Hour;
+			}
+
 			row[ALTITUDE] = data.AltitudeDelta();
 			row[PPOS] = data.EnginePowerPositiveAverage().ConvertTo().Kilo.Watt;
 			row[PNEG] = data.EnginePowerNegativeAverage().ConvertTo().Kilo.Watt;
-			row[FCFINAL] = data.FuelConsumptionFinal().ConvertTo().Gramm.Per.Kilo.Meter;
+
+			var fcfinal = data.FuelConsumptionFinal();
+			if (fcfinal != null) {
+				row[FCFINAL] = fcfinal.ConvertTo().Gramm.Per.Kilo.Meter;
+			}
 			row[FCFINAL_LITERPER100KM] = data.FuelConsumptionFinalLiterPer100Kilometer();
 			if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
 				row[FCFINAL_LITERPER100TKM] = data.FuelConsumptionFinalLiterPer100Kilometer() / vehicleLoading.ConvertTo().Ton;
 			}
 			row[FCMAP] = data.FuelConsumptionPerSecond().ConvertTo().Gramm.Per.Hour;
-			row[FCMAPKM] = data.FuelConsumptionPerMeter().ConvertTo().Gramm.Per.Kilo.Meter;
+
+
+			var fuelConsumptionPerMeter = data.FuelConsumptionPerMeter();
+			if (fuelConsumptionPerMeter != null) {
+				row[FCMAPKM] = fuelConsumptionPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
+			}
 			row[FCAUXC] = data.FuelConsumptionAuxStartStopCorrectedPerSecond().ConvertTo().Gramm.Per.Hour;
-			row[FCAUXCKM] = data.FuelConsumptionAuxStartStopCorrected().ConvertTo().Gramm.Per.Kilo.Meter;
+			var fuelConsumptionAuxStartStopCorrected = data.FuelConsumptionAuxStartStopCorrected();
+			if (fuelConsumptionAuxStartStopCorrected != null) {
+				row[FCAUXCKM] = fuelConsumptionAuxStartStopCorrected.ConvertTo().Gramm.Per.Kilo.Meter;
+			}
 			row[FCWHTCC] = data.FuelConsumptionWHTCCorrectedPerSecond().ConvertTo().Gramm.Per.Hour;
-			row[FCWHTCCKM] = data.FuelConsumptionWHTCCorrected().ConvertTo().Gramm.Per.Kilo.Meter;
-			row[CO2KM] = data.CO2PerMeter().ConvertTo().Gramm.Per.Kilo.Meter;
-			if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
-				row[CO2TKM] = data.CO2PerMeter().ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton;
+			var fuelConsumptionWHTCCorrected = data.FuelConsumptionWHTCCorrected();
+			if (fuelConsumptionWHTCCorrected != null) {
+				row[FCWHTCCKM] = fuelConsumptionWHTCCorrected.ConvertTo().Gramm.Per.Kilo.Meter;
 			}
+
+			var kilogramPerMeter = data.CO2PerMeter();
+			if (kilogramPerMeter != null) {
+				row[CO2KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter;
+				if (vehicleLoading != null && !vehicleLoading.IsEqual(0)) {
+					row[CO2TKM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter / vehicleLoading.ConvertTo().Ton;
+				}
+			}
+
 			row[PWHEELPOS] = data.PowerWheelPositive().ConvertTo().Kilo.Watt;
 			row[PBRAKE] = data.PowerBrake().ConvertTo().Kilo.Watt;
 			row[EPOSICE] = data.EngineWorkPositive().ConvertTo().Kilo.Watt.Hour;
diff --git a/VectoCoreTest/Models/Simulation/PwheelModeTests.cs b/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
index 367cab60e4..8ee9fb2796 100644
--- a/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
+++ b/VectoCoreTest/Models/Simulation/PwheelModeTests.cs
@@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			jobContainer.WaitFinished();
 
 			//todo MK-2016-01-20: add sumdata file for pwheel mode tests.
-			ResultFileHelper.TestSumFile(@"TestData\Results\Pwheel\Atego_ges.v2.vsum", @"Pwheel.vsum");
+			ResultFileHelper.TestSumFile(@"TestData\Results\Pwheel\Atego_ges.v2.vsum", @"TestData\Jobs\Pwheel.vsum");
 
 			//todo MK-2016-01-20: add moddata file for pwheel mode tests.
 			ResultFileHelper.TestModFile(@"TestData\Results\Pwheel\Atego_ges_Gear2_pt1_rep1_actual.vmod",
-- 
GitLab