From 563ebaef09c309fc1bc7a7c1f60c08f72159e8c1 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Thu, 14 Feb 2019 16:31:37 +0100
Subject: [PATCH] add new fields to sum file

---
 .../VectoCommon/Models/CertificationMethod.cs |   6 +
 .../AbstractSimulationDataAdapter.cs          |   1 +
 .../DeclarationDataAdapter.cs                 |   2 +-
 .../Models/Declaration/ADASCombinations.cs    |   7 +
 .../Models/Simulation/Data/ModalResult.cs     |  68 ++--
 .../Simulation/Data/ModalResultField.cs       |   2 +
 .../Data/CombustionEngineData.cs              |   2 +
 .../SimulationComponent/Data/VehicleData.cs   |   2 +-
 .../Impl/EngineAuxiliary.cs                   |   8 +-
 .../Impl/TorqueConverter.cs                   |   1 +
 .../OutputData/SummaryDataContainer.cs        | 353 ++++++++++++++----
 .../OutputData/XML/XMLCustomerReport.cs       |   2 +-
 .../OutputData/XML/XMLManufacturerReport.cs   |   2 +-
 13 files changed, 338 insertions(+), 118 deletions(-)

diff --git a/VectoCommon/VectoCommon/Models/CertificationMethod.cs b/VectoCommon/VectoCommon/Models/CertificationMethod.cs
index 5c83d6fa21..d72d5ffa04 100644
--- a/VectoCommon/VectoCommon/Models/CertificationMethod.cs
+++ b/VectoCommon/VectoCommon/Models/CertificationMethod.cs
@@ -45,8 +45,14 @@ namespace TUGraz.VectoCommon.Models
 
 	public static class CertificationMethodHelper
 	{
+
+
 		public static string ToXMLFormat(this CertificationMethod method)
 		{
+			return GetName(method);
+		}
+
+		public static string GetName(this CertificationMethod method) { 
 			switch (method) {
 				case CertificationMethod.StandardValues:
 					return "Standard values";
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
index 8399e5d291..fc23ef472f 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs
@@ -129,6 +129,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 				ModelName = data.Model,
 				Date = data.Date,
 				CertificationNumber = data.CertificationNumber,
+				CertificationMethod = CertificationMethod.Measured,
 				DigestValueInput = data.DigestValue != null ? data.DigestValue.DigestValue : "",
 				Displacement = data.Displacement,
 				IdleSpeed = data.IdleSpeed,
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
index 5ce2c344b5..611504f19f 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs
@@ -160,7 +160,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
 		{
 			return new VehicleData.ADASData {
 				EngineStopStart = adas.EngineStopStart,
-				EcoRollWithoutengineStop = adas.EcoRollWitoutEngineStop,
+				EcoRollWithoutEngineStop = adas.EcoRollWitoutEngineStop,
 				EcoRollWithEngineStop = adas.EcoRollWithEngineStop,
 				PredictiveCruiseControl = adas.PredictiveCruiseControl
 			};
diff --git a/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs b/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
index ca27f2c472..6e4d470510 100644
--- a/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
+++ b/VectoCore/VectoCore/Models/Declaration/ADASCombinations.cs
@@ -35,6 +35,7 @@ using System.Data;
 using System.Linq;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Utils;
 
 namespace TUGraz.VectoCore.Models.Declaration
@@ -105,5 +106,11 @@ namespace TUGraz.VectoCore.Models.Declaration
 			return Lookup(
 				adas.EngineStopStart, adas.EcoRollWitoutEngineStop, adas.EcoRollWithEngineStop, adas.PredictiveCruiseControl);
 		}
+
+		internal ADASCombination Lookup(VehicleData.ADASData adas)
+		{
+			return Lookup(
+				adas.EngineStopStart, adas.EcoRollWithoutEngineStop, adas.EcoRollWithEngineStop, adas.PredictiveCruiseControl);
+		}
 	}
 }
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResult.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResult.cs
index 876ebfea81..96d13b1cc6 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResult.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResult.cs
@@ -29,38 +29,38 @@
 *   Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology
 */
 
-using System;
-using System.ComponentModel;
-using System.Data;
-using System.Runtime.Serialization;
-using TUGraz.VectoCommon.Utils;
-
-// ReSharper disable InconsistentNaming
-
-namespace TUGraz.VectoCore.Models.Simulation.Data
-{
-	[DesignerCategory("")] // Full qualified attribute needed to disable design view in VisualStudio
-	[Serializable]
-	public class ModalResults : DataTable
-	{
-		public static class ExtendedPropertyNames
-		{
-			public const string Decimals = "decimals";
-			public const string OutputFactor = "outputFactor";
-			public const string ShowUnit = "showUnit";
-		}
-
-		protected ModalResults(SerializationInfo info, StreamingContext context) : base(info, context) {}
-
-		public ModalResults()
-		{
-			foreach (var value in EnumHelper.GetValues<ModalResultField>()) {
-				var col = new DataColumn(value.GetName(), value.GetAttribute().DataType) { Caption = value.GetCaption() };
-				col.ExtendedProperties[ExtendedPropertyNames.Decimals] = value.GetAttribute().Decimals;
-				col.ExtendedProperties[ExtendedPropertyNames.OutputFactor] = value.GetAttribute().OutputFactor;
-				col.ExtendedProperties[ExtendedPropertyNames.ShowUnit] = value.GetAttribute().ShowUnit;
-				Columns.Add(col);
-			}
-		}
-	}
+using System;
+using System.ComponentModel;
+using System.Data;
+using System.Runtime.Serialization;
+using TUGraz.VectoCommon.Utils;
+
+// ReSharper disable InconsistentNaming
+
+namespace TUGraz.VectoCore.Models.Simulation.Data
+{
+	[DesignerCategory("")] // Full qualified attribute needed to disable design view in VisualStudio
+	[Serializable]
+	public class ModalResults : DataTable
+	{
+		public static class ExtendedPropertyNames
+		{
+			public const string Decimals = "decimals";
+			public const string OutputFactor = "outputFactor";
+			public const string ShowUnit = "showUnit";
+		}
+
+		protected ModalResults(SerializationInfo info, StreamingContext context) : base(info, context) {}
+
+		public ModalResults()
+		{
+			foreach (var value in EnumHelper.GetValues<ModalResultField>()) {
+				var col = new DataColumn(value.GetName(), value.GetAttribute().DataType) { Caption = value.GetCaption() };
+				col.ExtendedProperties[ExtendedPropertyNames.Decimals] = value.GetAttribute().Decimals;
+				col.ExtendedProperties[ExtendedPropertyNames.OutputFactor] = value.GetAttribute().OutputFactor;
+				col.ExtendedProperties[ExtendedPropertyNames.ShowUnit] = value.GetAttribute().ShowUnit;
+				Columns.Add(col);
+			}
+		}
+	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
index a02b090f34..7a8d100553 100644
--- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
+++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs
@@ -268,6 +268,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
 
 		[ModalResultField(typeof(SI), "P_TC_out [kW]", outputFactor: 1e-3)] P_TC_out,
 
+		[ModalResultField(typeof(SI), "P_TC_in [kW]", outputFactor: 1e-3)] P_TC_in,
+
 		/// <summary>
 		///     [kW]	Power loss at the torque converter.
 		/// </summary>
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
index 9f7bbca59f..f740f75e8c 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/CombustionEngineData.cs
@@ -115,6 +115,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 				MaxTorqueDeclared = MaxTorqueDeclared,
 				FuelData = FuelData,
 				ADASCorrectionFactor = ADASCorrectionFactor,
+				CertificationNumber = CertificationNumber,
+				CertificationMethod = CertificationMethod,
 			};
 		}
 
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
index eedec88779..4bdc942f18 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleData.cs
@@ -219,7 +219,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
 		public class ADASData
 		{
 			public bool EngineStopStart { get; internal set; }
-			public bool EcoRollWithoutengineStop { get; internal set; }
+			public bool EcoRollWithoutEngineStop { get; internal set; }
 			public bool EcoRollWithEngineStop { get; internal set; }
 			public PredictiveCruiseControlType PredictiveCruiseControl { get; internal set; }
 		}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs
index 0697faa378..afd1050fac 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs
@@ -76,10 +76,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			Add(auxId, _ => DataBus.CycleData.LeftSample.AdditionalAuxPowerDemand);
 		}
 
-        public void AddCycle(string auxId, Func<DrivingCycleData.DrivingCycleEntry, Watt> powerLossFunc)
-        {
-            Add(auxId, _ => powerLossFunc(DataBus.CycleData.LeftSample));
-        }
+		public void AddCycle(string auxId, Func<DrivingCycleData.DrivingCycleEntry, Watt> powerLossFunc)
+		{
+			Add(auxId, _ => powerLossFunc(DataBus.CycleData.LeftSample));
+		}
 
 		/// <summary>
 		/// Adds an auxiliary which calculates the demand based on a aux-map and the engine speed.
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
index d66de46580..fbca2c4d51 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs
@@ -378,6 +378,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
 			container[ModalResultField.P_TC_out] = CurrentState.OutTorque * avgOutVelocity;
 			container[ModalResultField.P_TC_loss] = CurrentState.InTorque * avgInVelocity -
 													CurrentState.OutTorque * avgOutVelocity;
+			container[ModalResultField.P_TC_in] = CurrentState.InTorque * avgInVelocity;
 		}
 
 		protected override void DoCommitSimulationStep()
diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
index 59b85ffe3c..0efb634007 100644
--- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
+++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs
@@ -30,6 +30,7 @@
 */
 
 using System;
+using System.Collections.Generic;
 using System.Data;
 using System.Linq;
 using System.Runtime.CompilerServices;
@@ -190,6 +191,41 @@ namespace TUGraz.VectoCore.OutputData
 		public const string NUM_AXLES_NON_DRIVEN = "Number axles vehicle non-driven [-]";
 		public const string NUM_AXLES_TRAILER = "Number axles trailer [-]";
 
+		public const string VEHICLE_FUEL_TYPE = "Vehicle fuel type [-]";
+		public const string AIRDRAG_MODEL = "AirDrag model [-]";
+		public const string SLEEPER_CAB = "Sleeper cab [-]";
+		public const string DECLARED_RRC_AXLE1 = "Declared RRC axle 1 [-]";
+		public const string DECLARED_FZISO_AXLE1 = "Declared FzISO axle 1 [N]";
+		public const string DECLARED_RRC_AXLE2 = "Declared RRC axle 2 [-]";
+		public const string DECLARED_FZISO_AXLE2 = "Declared FzISO axle 2 [N]";
+		public const string DECLARED_RRC_AXLE3 = "Declared RRC axle 3 [-]";
+		public const string DECLARED_FZISO_AXLE3 = "Declared FzISO axle 3 [N]";
+		public const string DECLARED_RRC_AXLE4 = "Declared RRC axle 4 [-]";
+		public const string DECLARED_FZISO_AXLE4 = "Declared FzISO axle 4 [N]";
+		public const string ADAS_TECHNOLOGY_COMBINATION = "ADAS technology combination [-]";
+		public const string PTO_TECHNOLOGY = "PTOShaftsGearWheels";
+		//public const string PTO_OTHER_ELEMENTS = "PTOOtherElements";
+
+		public const string ENGINE_CERTIFICATION_NUMBER = "Engine certification number";
+		public const string AVERAGE_ENGINE_EFFICIENCY = "Average engine efficiency [%]";
+		public const string TORQUE_CONVERTER_CERTIFICATION_NUMBER = "TorqueConverter certification number";
+		public const string TORQUE_CONVERTER_CERTIFICATION_METHOD = "Torque converter certification option";
+		public const string AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP = "Average torque converter efficiency with lockup [%]";
+		public const string AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP = "Average torque converter efficiency w/o lockup [%]";
+		public const string GEARBOX_CERTIFICATION_NUMBER = "Gearbox certification number";
+		public const string GEARBOX_CERTIFICATION_METHOD = "Gearbox certification option";
+		public const string AVERAGE_GEARBOX_EFFICIENCY = "Average gearbox efficiency [%]";
+		public const string RETARDER_CERTIFICATION_NUMBER = "Retarder certification number";
+		public const string RETARDER_CERTIFICATION_METHOD = "Retarder certification option";
+		public const string ANGLEDRIVE_CERTIFICATION_NUMBER = "Angledrive certification number";
+		public const string ANGLEDRIVE_CERTIFICATION_METHOD = "Angledrive certification option";
+		public const string AVERAGE_ANGLEDRIVE_EFFICIENCY = "Average angledrive efficiency [%]";
+		public const string AXLEGEAR_CERTIFICATION_NUMBER = "Axlegear certification number";
+		public const string AXLEGEAR_CERTIFICATION_METHOD = "Axlegear certification method";
+		public const string AVERAGE_AXLEGEAR_EFFICIENCY = "Average axlegear efficiency [%]";
+		public const string AIRDRAG_CERTIFICATION_NUMBER = "AirDrag certification number";
+		public const string AIRDRAG_CERTIFICATION_METHOD = "AirDrag certification option";
+
 		// ReSharper restore InconsistentNaming
 
 		internal readonly DataTable Table;
@@ -234,8 +270,19 @@ namespace TUGraz.VectoCore.OutputData
 				Tuple.Create(ENGINE_BF_COLD_HOT, typeof(double)),
 				Tuple.Create(ENGINE_CF_REG_PER, typeof(double)),
 				Tuple.Create(ENGINE_ACTUAL_CORRECTION_FACTOR, typeof(double)),
+				Tuple.Create(VEHICLE_FUEL_TYPE, typeof(string)),
+				Tuple.Create(AIRDRAG_MODEL, typeof(string)),
 				Tuple.Create(CD_x_A_DECLARED, typeof(ConvertedSI)),
 				Tuple.Create(CD_x_A, typeof(ConvertedSI)),
+				Tuple.Create(SLEEPER_CAB, typeof(string)),
+				Tuple.Create(DECLARED_RRC_AXLE1, typeof(double)),
+				Tuple.Create(DECLARED_FZISO_AXLE1, typeof(ConvertedSI)),
+				Tuple.Create(DECLARED_RRC_AXLE2, typeof(double)),
+				Tuple.Create(DECLARED_FZISO_AXLE2, typeof(ConvertedSI)),
+				Tuple.Create(DECLARED_RRC_AXLE3, typeof(double)),
+				Tuple.Create(DECLARED_FZISO_AXLE3, typeof(ConvertedSI)),
+				Tuple.Create(DECLARED_RRC_AXLE4, typeof(double)),
+				Tuple.Create(DECLARED_FZISO_AXLE4, typeof(ConvertedSI)),
 				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER, typeof(double)),
 				Tuple.Create(ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER, typeof(double)),
 				Tuple.Create(R_DYN, typeof(ConvertedSI)),
@@ -264,6 +311,9 @@ namespace TUGraz.VectoCore.OutputData
 					typeof(string)),
 				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.PneumaticSystem), typeof(string)),
 				Tuple.Create(string.Format(AUX_TECH_FORMAT, Constants.Auxiliaries.IDs.ElectricSystem), typeof(string)),
+				Tuple.Create(ADAS_TECHNOLOGY_COMBINATION, typeof(string)),
+				Tuple.Create(PTO_TECHNOLOGY, typeof(string)),
+				//Tuple.Create(PTO_OTHER_ELEMENTS, typeof(string)),
 			}.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray());
 
 			Table.Columns.AddRange(new[] {
@@ -286,6 +336,28 @@ namespace TUGraz.VectoCore.OutputData
 				MAX_SPEED, MAX_ACCELERATION, MAX_DECELERATION, AVG_ENGINE_SPEED, MAX_ENGINE_SPEED, NUM_GEARSHIFTS,
 				STOP_TIMESHARE, ENGINE_FULL_LOAD_TIME_SHARE, COASTING_TIME_SHARE, BRAKING_TIME_SHARE
 			}.Select(x => new DataColumn(x, typeof(ConvertedSI))).ToArray());
+
+			Table.Columns.AddRange(new[] {
+				Tuple.Create(ENGINE_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AVERAGE_ENGINE_EFFICIENCY, typeof(double)),
+				Tuple.Create(TORQUE_CONVERTER_CERTIFICATION_METHOD, typeof(string)),
+				Tuple.Create(TORQUE_CONVERTER_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP, typeof(double)),
+				Tuple.Create(AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP, typeof(double)),
+				Tuple.Create(GEARBOX_CERTIFICATION_METHOD, typeof(string)),
+				Tuple.Create(GEARBOX_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AVERAGE_GEARBOX_EFFICIENCY, typeof(double)),
+				Tuple.Create(RETARDER_CERTIFICATION_METHOD, typeof(string)),
+				Tuple.Create(RETARDER_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(ANGLEDRIVE_CERTIFICATION_METHOD, typeof(string)),
+				Tuple.Create(ANGLEDRIVE_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AVERAGE_ANGLEDRIVE_EFFICIENCY, typeof(double)),
+				Tuple.Create(AXLEGEAR_CERTIFICATION_METHOD, typeof(string)),
+				Tuple.Create(AXLEGEAR_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AVERAGE_AXLEGEAR_EFFICIENCY, typeof(double)),
+				Tuple.Create(AIRDRAG_CERTIFICATION_NUMBER, typeof(string)),
+				Tuple.Create(AIRDRAG_CERTIFICATION_METHOD, typeof(string)),
+			}.Select(x => new DataColumn(x.Item1, x.Item2)).ToArray());
 		}
 
 		/// <summary>
@@ -338,6 +410,7 @@ namespace TUGraz.VectoCore.OutputData
 				gearCount = (uint)runData.GearboxData.Gears.Count;
 			}
 
+			row[VEHICLE_FUEL_TYPE] = modData.FuelData.GetLabel();
 
 			var totalTime = modData.Duration();
 			row[TIME] = (ConvertedSI)totalTime;
@@ -375,7 +448,7 @@ namespace TUGraz.VectoCore.OutputData
 
 			WriteWorkEntries(modData, row, runData.Cycle.CycleType == CycleType.VTP);
 
-			WritePerformanceEntries(modData, row);
+			WritePerformanceEntries(runData, modData, row);
 
 			row[ENGINE_FULL_LOAD_TIME_SHARE] = (ConvertedSI)modData.EngineMaxLoadTimeShare();
 			row[COASTING_TIME_SHARE] = (ConvertedSI)modData.CoastingTimeShare();
@@ -467,7 +540,7 @@ namespace TUGraz.VectoCore.OutputData
 			}
 		}
 
-		private void WritePerformanceEntries(IModalDataContainer modData, DataRow row)
+		private void WritePerformanceEntries(VectoRunData runData, IModalDataContainer modData, DataRow row)
 		{
 			row[ACC] = (ConvertedSI)modData.AccelerationAverage();
 			row[ACC_POS] = (ConvertedSI)modData.AccelerationsPositive();
@@ -496,6 +569,50 @@ namespace TUGraz.VectoCore.OutputData
 						shareSum.ToOutputFormat(1, null, false));
 				}
 			}
+
+			var eFC = modData.TimeIntegral<Kilogram>(ModalResultField.FCFinal) * modData.FuelData.LowerHeatingValueVecto;
+			var eIcePos = modData.TimeIntegral<WattSecond>(ModalResultField.P_eng_fcmap, x => x > 0);
+			row[AVERAGE_ENGINE_EFFICIENCY] = (eIcePos / eFC).Value();
+
+			var gbxOutSignal = runData.Retarder.Type == RetarderType.TransmissionOutputRetarder
+				? ModalResultField.P_retarder_in
+				: (runData.AngledriveData == null ? ModalResultField.P_axle_in : ModalResultField.P_angle_in);
+			var eGbxIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_gbx_in, x => x > 0);
+			var eGbxOut = modData.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0);
+			row[AVERAGE_GEARBOX_EFFICIENCY] = (eGbxOut / eGbxIn).Value();
+
+			if (runData.GearboxData.Type.AutomaticTransmission()) {
+				var eTcIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0);
+				var eTcOut = eGbxIn;
+				row[AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP] = (eTcOut / eTcIn).Value();
+
+				var tcData = modData.GetValues(
+					x => new {
+						dt = x.Field<Second>((int)ModalResultField.simulationInterval),
+						locked = x.Field<int>((int)ModalResultField.TC_Locked),
+						P_TCin = x.Field<Watt>((int)ModalResultField.P_TC_in),
+						P_TCout = x.Field<Watt>((int)ModalResultField.P_TC_out)
+					});
+				eTcIn = 0.SI<WattSecond>();
+				eTcOut = 0.SI<WattSecond>();
+				foreach (var entry in tcData.Where(x => x.locked == 0)) {
+					eTcIn += entry.dt * entry.P_TCin;
+					eTcOut += entry.dt * entry.P_TCout;
+				}
+
+				row[AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITH_LOCKUP] = (eTcOut / eTcIn).Value();
+			}
+
+			if (runData.AngledriveData != null) {
+				var eAnglIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_angle_in, x => x > 0);
+				var eAnglOut = modData.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0);
+
+				row[AVERAGE_ANGLEDRIVE_EFFICIENCY] = (eAnglOut / eAnglIn).Value();
+			}
+
+			var eAxlIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_axle_in, x => x > 0);
+			var eAxlOut = modData.TimeIntegral<WattSecond>(ModalResultField.P_brake_in, x => x > 0);
+			row[AVERAGE_AXLEGEAR_EFFICIENCY] = (eAxlOut / eAxlIn).Value();
 		}
 
 		private static void WriteWorkEntries(IModalDataContainer modData, DataRow row, bool vtpMode)
@@ -523,70 +640,126 @@ namespace TUGraz.VectoCore.OutputData
 
 		private void WriteFullPowertrain(VectoRunData runData, DataRow row)
 		{
-			row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer;
-			row[VIN_NUMBER] = runData.VehicleData.VIN;
-			row[VEHICLE_MODEL] = runData.VehicleData.ModelName;
-
-			row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber();
-			row[CURB_MASS] = (ConvertedSI)runData.VehicleData.CurbWeight;
-			// - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>());
-			row[LOADING] = (ConvertedSI)runData.VehicleData.Loading;
-			row[CARGO_VOLUME] = (ConvertedSI)runData.VehicleData.CargoVolume;
-
-			row[TOTAL_VEHICLE_MASS] = (ConvertedSI)runData.VehicleData.TotalVehicleWeight;
-			row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer;
-			row[ENGINE_MODEL] = runData.EngineData.ModelName;
-			row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelData.GetLabel();
-			row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null && runData.EngineData.RatedPowerDeclared > 0
-				? runData.EngineData.RatedPowerDeclared.ConvertToKiloWatt()
-				: runData.EngineData.FullLoadCurves[0].MaxPower.ConvertToKiloWatt();
-			row[ENGINE_IDLING_SPEED] = (ConvertedSI)runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>();
-			row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null && runData.EngineData.RatedSpeedDeclared > 0
-				? (ConvertedSI)runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>()
-				: (ConvertedSI)runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
-			row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertToCubicCentiMeter();
-
-			row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban;
-			row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural;
-			row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway;
-			row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor;
-			row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer;
-			row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor;
-
-			row[CD_x_A_DECLARED] = (ConvertedSI)runData.AirdragData.DeclaredAirdragArea;
-			row[CD_x_A] = (ConvertedSI)runData.AirdragData.CrossWindCorrectionCurve.AirDragArea;
+			WriteVehicleData(runData.VehicleData, row);
+
+			row[PTO_TECHNOLOGY] = runData.PTO?.TransmissionType ?? "";
+			
+
+			WriteEngineData(runData.EngineData, row);
+
+			WriteGearboxData(runData.GearboxData, row);
+			
+			WriteRetarderData(runData.Retarder, row);
+
+			WriteAngledriveData(runData.AngledriveData, row);
+
+			WriteAxlegearData(runData.AxleGearData, row);
+
+			WriteAuxTechnologies(runData.Aux, row);
+
+			WriteAxleWheelsData(runData.VehicleData.AxleData, row);
+
+			WriteAirdragData(runData.AirdragData, row);
+
+		}
+
+		private static void WriteVehicleData(VehicleData data, DataRow row)
+		{
+			row[VEHICLE_MANUFACTURER] = data.Manufacturer;
+			row[VIN_NUMBER] = data.VIN;
+			row[VEHICLE_MODEL] = data.ModelName;
+
+			row[HDV_CO2_VEHICLE_CLASS] = data.VehicleClass.GetClassNumber();
+			row[CURB_MASS] = (ConvertedSI)data.CurbWeight;
+
+			// - (data.BodyAndTrailerWeight ?? 0.SI<Kilogram>());
+			row[LOADING] = (ConvertedSI)data.Loading;
+			row[CARGO_VOLUME] = (ConvertedSI)data.CargoVolume;
+
+			row[TOTAL_VEHICLE_MASS] = (ConvertedSI)data.TotalVehicleWeight;
+
+			row[SLEEPER_CAB] = data.SleeperCab ? "yes" : "no";
 
 			row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] =
-				runData.VehicleData.RollResistanceCoefficientWithoutTrailer;
+				data.RollResistanceCoefficientWithoutTrailer;
 			row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] =
-				runData.VehicleData.TotalRollResistanceCoefficient;
+				data.TotalRollResistanceCoefficient;
 
-			row[R_DYN] = (ConvertedSI)runData.VehicleData.DynamicTyreRadius;
+			row[R_DYN] = (ConvertedSI)data.DynamicTyreRadius;
 
-			row[NUM_AXLES_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleDriven);
-			row[NUM_AXLES_NON_DRIVEN] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.VehicleNonDriven);
-			row[NUM_AXLES_TRAILER] = runData.VehicleData.AxleData.Count(x => x.AxleType == AxleType.Trailer);
+			row[ADAS_TECHNOLOGY_COMBINATION] = DeclarationData.ADASCombinations.Lookup(data.ADAS).ID;
+		}
 
-			row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer;
-			row[GEARBOX_MODEL] = runData.GearboxData.ModelName;
-			row[GEARBOX_TYPE] = runData.GearboxData.Type;
-			WriteGearboxData(runData, row);
+		private static void WriteAirdragData(AirdragData data, DataRow row)
+		{
+			row[AIRDRAG_MODEL] = data.ModelName;
+			row[AIRDRAG_CERTIFICATION_METHOD] = data.CertificationMethod.GetName();
+			row[AIRDRAG_CERTIFICATION_NUMBER] =
+				data.CertificationMethod == CertificationMethod.StandardValues ? "" : data.CertificationNumber;
+			row[CD_x_A_DECLARED] = (ConvertedSI)data.DeclaredAirdragArea;
+			row[CD_x_A] = (ConvertedSI)data.CrossWindCorrectionCurve.AirDragArea;
+		}
 
-			row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel();
-			WriteRetarderData(runData, row);
+		private static void WriteEngineData(CombustionEngineData data, DataRow row)
+		{
+			row[ENGINE_MANUFACTURER] = data.Manufacturer;
+			row[ENGINE_MODEL] = data.ModelName;
+			row[ENGINE_CERTIFICATION_NUMBER] = data.CertificationNumber;
+			row[ENGINE_FUEL_TYPE] = data.FuelData.GetLabel();
+			row[ENGINE_RATED_POWER] = data.RatedPowerDeclared != null && data.RatedPowerDeclared > 0
+				? data.RatedPowerDeclared.ConvertToKiloWatt()
+				: data.FullLoadCurves[0].MaxPower.ConvertToKiloWatt();
+			row[ENGINE_IDLING_SPEED] = (ConvertedSI)data.IdleSpeed.AsRPM.SI<Scalar>();
+			row[ENGINE_RATED_SPEED] = data.RatedSpeedDeclared != null && data.RatedSpeedDeclared > 0
+				? (ConvertedSI)data.RatedSpeedDeclared.AsRPM.SI<Scalar>()
+				: (ConvertedSI)data.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>();
+			row[ENGINE_DISPLACEMENT] = data.Displacement.ConvertToCubicCentiMeter();
+
+			row[ENGINE_WHTC_URBAN] = data.WHTCUrban;
+			row[ENGINE_WHTC_RURAL] = data.WHTCRural;
+			row[ENGINE_WHTC_MOTORWAY] = data.WHTCMotorway;
+			row[ENGINE_BF_COLD_HOT] = data.ColdHotCorrectionFactor;
+			row[ENGINE_CF_REG_PER] = data.CorrectionFactorRegPer;
+			row[ENGINE_ACTUAL_CORRECTION_FACTOR] = data.FuelConsumptionCorrectionFactor;
+		}
+
+		private static void WriteAxleWheelsData(List<Axle> data, DataRow row)
+		{
+			var fields = new[] {
+				Tuple.Create(DECLARED_RRC_AXLE1, DECLARED_FZISO_AXLE1),
+				Tuple.Create(DECLARED_RRC_AXLE2, DECLARED_FZISO_AXLE2),
+				Tuple.Create(DECLARED_RRC_AXLE3, DECLARED_FZISO_AXLE3),
+				Tuple.Create(DECLARED_RRC_AXLE4, DECLARED_FZISO_AXLE4),
+			};
+			for (var i = 0; i < Math.Min(fields.Length, data.Count); i++) {
+				if (data[i].AxleType == AxleType.Trailer) {
+					continue;
+				}
+
+				row[fields[i].Item1] = data[i].RollResistanceCoefficient;
+				row[fields[i].Item2] = (ConvertedSI)data[i].TyreTestLoad;
+			}
 
-			WriteAngledriveData(runData, row);
+			row[NUM_AXLES_DRIVEN] = data.Count(x => x.AxleType == AxleType.VehicleDriven);
+			row[NUM_AXLES_NON_DRIVEN] = data.Count(x => x.AxleType == AxleType.VehicleNonDriven);
+			row[NUM_AXLES_TRAILER] = data.Count(x => x.AxleType == AxleType.Trailer);
 
-			row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer;
-			row[AXLE_MODEL] = runData.AxleGearData.ModelName;
-			row[AXLE_RATIO] = (ConvertedSI)runData.AxleGearData.AxleGear.Ratio.SI<Scalar>();
+		}
 
-			WriteAuxTechnologies(runData, row);
+		private static void WriteAxlegearData(AxleGearData data, DataRow row)
+		{
+			row[AXLE_MANUFACTURER] = data.Manufacturer;
+			row[AXLE_MODEL] = data.ModelName;
+			row[AXLE_RATIO] = (ConvertedSI)data.AxleGear.Ratio.SI<Scalar>();
+			row[AXLEGEAR_CERTIFICATION_METHOD] = data.CertificationMethod.GetName();
+			row[AXLEGEAR_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues
+				? ""
+				: data.CertificationNumber;
 		}
 
-		private void WriteAuxTechnologies(VectoRunData runData, DataRow row)
+		private void WriteAuxTechnologies(IEnumerable<VectoRunData.AuxData> auxData, DataRow row)
 		{
-			foreach (var aux in runData.Aux) {
+			foreach (var aux in auxData) {
 				if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) {
 					continue;
 				}
@@ -602,52 +775,80 @@ namespace TUGraz.VectoCore.OutputData
 			}
 		}
 
-		private static void WriteAngledriveData(VectoRunData runData, DataRow row)
+		private static void WriteAngledriveData(AngledriveData data, DataRow row)
 		{
-			if (runData.AngledriveData != null) {
-				row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer;
-				row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName;
-				row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio;
+			if (data != null) {
+				row[ANGLEDRIVE_MANUFACTURER] = data.Manufacturer;
+				row[ANGLEDRIVE_MODEL] = data.ModelName;
+				row[ANGLEDRIVE_RATIO] = data.Angledrive.Ratio;
+				row[ANGLEDRIVE_CERTIFICATION_METHOD] = data.CertificationMethod.GetName();
+				row[ANGLEDRIVE_CERTIFICATION_NUMBER] =
+					data.CertificationMethod == CertificationMethod.StandardValues
+						? ""
+						: data.CertificationNumber;
 			} else {
 				row[ANGLEDRIVE_MANUFACTURER] = "n.a.";
 				row[ANGLEDRIVE_MODEL] = "n.a.";
 				row[ANGLEDRIVE_RATIO] = "n.a.";
+				row[ANGLEDRIVE_CERTIFICATION_METHOD] = "";
 			}
 		}
 
-		private static void WriteRetarderData(VectoRunData runData, DataRow row)
+		private static void WriteRetarderData(RetarderData data, DataRow row)
 		{
-			if (runData.Retarder.Type.IsDedicatedComponent()) {
-				row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer;
-				row[RETARDER_MODEL] = runData.Retarder.ModelName;
+			row[RETARDER_TYPE] = data.Type.GetLabel();
+			if (data.Type.IsDedicatedComponent()) {
+				row[RETARDER_MANUFACTURER] = data.Manufacturer;
+				row[RETARDER_MODEL] = data.ModelName;
+				row[RETARDER_CERTIFICATION_METHOD] = data.CertificationMethod.GetName();
+				row[RETARDER_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues
+					? ""
+					: data.CertificationNumber;
 			} else {
 				row[RETARDER_MANUFACTURER] = "n.a.";
 				row[RETARDER_MODEL] = "n.a.";
+				row[RETARDER_CERTIFICATION_METHOD] = "";
+				row[RETARDER_CERTIFICATION_NUMBER] = "";
 			}
 		}
 
-		private static void WriteGearboxData(VectoRunData runData, DataRow row)
+		private static void WriteGearboxData(GearboxData data, DataRow row)
 		{
-			if (runData.GearboxData.Type.AutomaticTransmission()) {
-				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio)
-						? (ConvertedSI)runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>()
-						: (ConvertedSI)runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>())
+			row[GEARBOX_MANUFACTURER] = data.Manufacturer;
+			row[GEARBOX_MODEL] = data.ModelName;
+			row[GEARBOX_TYPE] = data.Type;
+			row[GEARBOX_CERTIFICATION_NUMBER] = data.CertificationMethod == CertificationMethod.StandardValues
+				? ""
+				: data.CertificationNumber;
+			row[GEARBOX_CERTIFICATION_METHOD] = data.CertificationMethod.GetName();
+			if (data.Type.AutomaticTransmission()) {
+				row[GEAR_RATIO_FIRST_GEAR] = data.Gears.Count > 0
+					? (double.IsNaN(data.Gears.First().Value.Ratio)
+						? (ConvertedSI)data.Gears.First().Value.TorqueConverterRatio.SI<Scalar>()
+						: (ConvertedSI)data.Gears.First().Value.Ratio.SI<Scalar>())
 					: 0.SI<Scalar>();
-				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? (ConvertedSI)runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
+				row[GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0
+					? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>()
 					: (ConvertedSI)0.SI<Scalar>();
-				row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer;
-				row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName;
+				row[TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer;
+				row[TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName;
+				row[TORQUE_CONVERTER_CERTIFICATION_NUMBER] =
+					data.TorqueConverterData.CertificationMethod == CertificationMethod.StandardValues
+						? ""
+						: data.TorqueConverterData.CertificationNumber;
+				row[TORQUE_CONVERTER_CERTIFICATION_METHOD] = data.TorqueConverterData.CertificationMethod.GetName();
+
 			} else {
-				row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? (ConvertedSI)runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()
+				row[GEAR_RATIO_FIRST_GEAR] = data.Gears.Count > 0
+					? (ConvertedSI)data.Gears.First().Value.Ratio.SI<Scalar>()
 					: (ConvertedSI)0.SI<Scalar>();
-				row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0
-					? (ConvertedSI)runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>()
+				row[GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0
+					? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>()
 					: (ConvertedSI)0.SI<Scalar>();
 				row[TORQUECONVERTER_MANUFACTURER] = "n.a.";
 				row[TORQUECONVERTER_MODEL] = "n.a.";
+				row[TORQUE_CONVERTER_CERTIFICATION_METHOD] = "";
+				row[TORQUE_CONVERTER_CERTIFICATION_NUMBER] = "";
 			}
 		}
 
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
index 2bdcf957fb..d3cc68d1c3 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLCustomerReport.cs
@@ -120,7 +120,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			return new XElement(tns + XMLNames.Vehicle_ADAS,
 								new XElement(tns + XMLNames.Vehicle_ADAS_EngineStopStart, adasData.EngineStopStart),
-								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutengineStop),
+								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutEngineStop),
 								new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRollWithEngineStop),
 								new XElement(tns + XMLNames.Vehicle_ADAS_PCC, adasData.PredictiveCruiseControl != PredictiveCruiseControlType.None)
 			);
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
index 973f1da958..1f7f252fdb 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLManufacturerReport.cs
@@ -112,7 +112,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 		{
 			return new XElement(tns + XMLNames.Vehicle_ADAS,
 				new XElement(tns + XMLNames.Vehicle_ADAS_EngineStopStart, adasData.EngineStopStart),
-				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutengineStop),
+				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithoutEngineStop, adasData.EcoRollWithoutEngineStop),
 				new XElement(tns + XMLNames.Vehicle_ADAS_EcoRollWithEngineStopStart, adasData.EcoRollWithEngineStop),
 				new XElement(tns + XMLNames.Vehicle_ADAS_PCC, adasData.PredictiveCruiseControl != PredictiveCruiseControlType.None)
 			);
-- 
GitLab