From 7b2ee971aa53424b1796e983c68b3b9e59e6ba81 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <markus.quaritsch@tugraz.at>
Date: Mon, 4 May 2020 17:34:27 +0200
Subject: [PATCH] adapt vtp report generation for buses, adapt testdata (fc
 column), adapt testcase: # missions is only 1, no longer simulating default
 vehicle

---
 .../InputData/FileIO/JSON/JSONInputData.cs    |  8 ++--
 .../VectoCore/OutputData/XML/XMLVTPReport.cs  | 43 ++++++++++++++-----
 .../VectoCoreTest/Integration/VTP/VTPTest.cs  |  2 +-
 .../Models/Simulation/DrivingCycleTests.cs    |  2 +-
 .../VTPMode/GenericVehicle/VTP_rural_2Hz.vdri |  2 +-
 .../GenericVehicle/VTP_rural_2Hz_noGear.vdri  |  2 +-
 .../vtp_cycle_citybus_atser.vdri              |  2 +-
 7 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
index e286d83689..02829c84b0 100644
--- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs
@@ -929,7 +929,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 				var entry = new Result {
 					ResultStatus = node.Attributes.GetNamedItem("status").InnerText,
 					Mission = node.SelectSingleNode("./*[local-name()='Mission']").InnerText.ParseEnum<MissionType>(),
-					SimulationParameter = GetSimulationParameter(node.SelectSingleNode("//*[local-name()='SimulationParametersCompletedVehicle']")),
+					SimulationParameter = GetSimulationParameter(node.SelectSingleNode("//*[local-name() = 'SimulationParameters' or local-name() = 'SimulationParametersCompletedVehicle']")),
 					EnergyConsumption = node.SelectSingleNode("//*[local-name()='Fuel' and FuelConsumption/@unit='MJ/km']")?
 											.Cast<XmlNode>().Select(
 												x => new KeyValuePair<FuelType, JoulePerMeter>(
@@ -951,9 +951,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON
 		private ISimulationParameter GetSimulationParameter(XmlNode node)
 		{
 			return new SimulationParameter {
-				TotalVehicleMass = node.SelectSingleNode($"./*[local-name()='{XMLNames.Report_ResultEntry_TotalVehicleMass}']").InnerText.ToDouble().SI<Kilogram>(),
-				Payload = node.SelectSingleNode($"./*[local-name()='{XMLNames.Report_Result_Payload}']").InnerText.ToDouble().SI<Kilogram>(),
-				PassengerCount = node.SelectSingleNode($"./*[local-name()='{XMLNames.Bus_PassengerCount}']").InnerText.ToDouble(),
+				TotalVehicleMass = (node.SelectSingleNode($"./*[local-name()='{XMLNames.Report_ResultEntry_TotalVehicleMass}']")?.InnerText.ToDouble() ?? 0).SI<Kilogram>(),
+				Payload = (node.SelectSingleNode($"./*[local-name()='{XMLNames.Report_Result_Payload}']")?.InnerText.ToDouble() ?? 0).SI<Kilogram>(),
+				PassengerCount = node.SelectSingleNode($"./*[local-name()='{XMLNames.Bus_PassengerCount}']")?.InnerText.ToDouble() ?? 0,
 				FuelMode = "" //node.SelectSingleNode($"./*[local-name()='{XMLNames.Report_Result_FuelMode}']").InnerText
 			};
 		}
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
index 646c7c3449..a1e0360677 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLVTPReport.cs
@@ -51,6 +51,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.Utils;
 using TUGraz.VectoHashing;
 using NLog;
+using TUGraz.VectoCommon.BusAuxiliaries;
 using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using LogManager = NLog.LogManager;
@@ -77,6 +78,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 		private static List<string> LogList = new List<string>();
 		private LoggingRule cycleChecksRule;
 
+		protected VehicleClass VehicleClass = VehicleClass.Unknown;
+		protected VehicleCode VehicleCode = VehicleCode.NOT_APPLICABLE;
+
 		//protected XNamespace di;
 		//private bool allSuccess = true;
 
@@ -216,11 +220,21 @@ namespace TUGraz.VectoCore.OutputData.XML
 				throw new VectoException("no vtp result found for generating vtp report");
 			}
 
-			var selectedMission = vtpResult.VehicleClass.IsMediumLorry()
-				? DeclarationData.VTPMode.SelectedMissionMediumLorry
-				: DeclarationData.VTPMode.SelectedMissionHeavyLorry;
+			var selectedMission = VehicleClass.IsBus()
+				? (VehicleCode.GetFloorType() == FloorType.LowFloor
+					? DeclarationData.VTPMode.SelectedMissionLowFloorBus
+					: DeclarationData.VTPMode.SelectedMissionHighFloorBus)
+				: (vtpResult.VehicleClass.IsMediumLorry()
+					? DeclarationData.VTPMode.SelectedMissionMediumLorry
+					: DeclarationData.VTPMode.SelectedMissionHeavyLorry);
 			const LoadingType selectedLoading = DeclarationData.VTPMode.SelectedLoading;
-			var result = Results.OrderBy(x => x.FuelMode).FirstOrDefault(x => x.Mission == selectedMission && x.LoadingType == selectedLoading);
+			//var result = Results.OrderBy(x => x.FuelMode).FirstOrDefault(x => x.Mission == selectedMission && x.LoadingType == selectedLoading);
+
+
+			var result = ManufacturerRecord.Results.Results.Where(x => x.Mission == selectedMission)
+											.MaxBy(x => x.SimulationParameter.Payload);
+			var key = VehicleClass.IsBus() ? "g/p-km" : "g/t-km";
+			var declaredCO2 = result.CO2[key];
 
 			if (result == null) {
 				throw new VectoException("no corresponding simulation result found for generating vtp report");
@@ -232,9 +246,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 			var fuels = DeclarationData.FuelData;
 			var cVtp = vtpFcMeasuredCorr.Sum(e => e.Value * fuels.Lookup(e.Key, vtpResult.TankSystem).CO2PerFuelWeightVTP) / vtpFcSimulated.Sum(e => e.Value * fuels.Lookup(e.Key, vtpResult.TankSystem).CO2PerFuelWeightVTP);
 
-			var declaredCO2 =
-				result.FuelConsumptionFinal.Sum(x => x.Value * fuels.Lookup(x.Key, vtpResult.TankSystem).CO2PerFuelWeightVTP) /
-				result.Distance / result.Payload;
+			//var declaredCO2 =
+			//	result.FuelConsumptionFinal.Sum(x => x.Value * fuels.Lookup(x.Key, vtpResult.TankSystem).CO2PerFuelWeightVTP) /
+			//	result.Distance / result.Payload;
 			var verifiedCO2 = declaredCO2 * cVtp.Value();
 
 			ResultsPart.Add(
@@ -273,12 +287,12 @@ namespace TUGraz.VectoCore.OutputData.XML
 						string.Format("{0}, {1}", selectedMission.ToXMLFormat(), selectedLoading.ToString())
 					),
 					new XElement(
-						tns + "Declared", new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-						declaredCO2.ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)
+						tns + "Declared", new XAttribute(XMLNames.Report_Results_Unit_Attr, key),
+						declaredCO2.ToMinSignificantDigits(3, 1)
 					),
 					new XElement(
-						tns + "Verified", new XAttribute(XMLNames.Report_Results_Unit_Attr, "g/t-km"),
-						verifiedCO2.ConvertToGrammPerTonKilometer().ToMinSignificantDigits(3, 1)
+						tns + "Verified", new XAttribute(XMLNames.Report_Results_Unit_Attr, key),
+						verifiedCO2.ToMinSignificantDigits(3, 1)
 					)
 				),
 				new XElement(tns + "C_VTP", cVtp.ToXMLFormat(4)));
@@ -324,6 +338,10 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 		public override void InitializeReport(VectoRunData modelData, List<List<FuelData.Entry>> fuelModes)
 		{
+			VehicleClass = modelData.VehicleData.VehicleClass;
+			if (VehicleClass.IsBus()) {
+				VehicleCode = modelData.VehicleData.VehicleCode;
+			}
 			GeneralPart.Add(
 				new XElement(tns + XMLNames.Component_Manufacturer, modelData.VehicleData.Manufacturer),
 				new XElement(tns + XMLNames.Component_ManufacturerAddress, modelData.VehicleData.ManufacturerAddress));
@@ -660,6 +678,9 @@ namespace TUGraz.VectoCore.OutputData.XML
 			};
 			var retVal = new XElement(tns + XMLNames.Component_Auxiliaries);
 			foreach (var auxId in auxList) {
+				if (!auxData.ContainsKey(auxId.Key())) {
+					continue;
+				}
 				foreach (var entry in auxData[auxId.Key()].Technology) {
 					retVal.Add(new XElement(tns + GetTagName(auxId), entry));
 				}
diff --git a/VectoCore/VectoCoreTest/Integration/VTP/VTPTest.cs b/VectoCore/VectoCoreTest/Integration/VTP/VTPTest.cs
index a6d82e0584..ded5c0d9cf 100644
--- a/VectoCore/VectoCoreTest/Integration/VTP/VTPTest.cs
+++ b/VectoCore/VectoCoreTest/Integration/VTP/VTPTest.cs
@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.Tests.Integration.VTP
 
 			jobContainer.AddRuns(runsFactory);
 
-			Assert.AreEqual(2, jobContainer.Runs.Count);
+			Assert.AreEqual(1, jobContainer.Runs.Count);
 			var i = 0;
 			jobContainer.Runs[i].Run.Run();
 			Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors);
diff --git a/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs b/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
index 24c4e69236..50fef424dd 100644
--- a/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
+++ b/VectoCore/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs
@@ -207,7 +207,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation
 			// Verification test simulation
 			TestCase("<t>,<v>,<n_eng>,<n_fan>,<tq_left>,<tq_right>,<n_wh_left>,<n_wh_right>", CycleType.VTP),
 			TestCase("<t>,<v>,<n_eng>,<n_fan>,<tq_left>,<tq_right>,<n_wh_left>,<n_wh_right>,<gear>", CycleType.VTP),
-			TestCase("<t>,<v>,<n_eng>,<n_fan>,<tq_left>,<tq_right>,<n_wh_left>,<n_wh_right>,<fc>,<gear>", CycleType.VTP),
+			TestCase("<t>,<v>,<n_eng>,<n_fan>,<tq_left>,<tq_right>,<n_wh_left>,<n_wh_right>,<fc_Diesel CI>,<gear>", CycleType.VTP),
 		]
 		public void DrivingCycle_AutoDetect(string cycle, CycleType type)
 		{
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz.vdri b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz.vdri
index b2c145bda5..e2203ccbab 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz.vdri
+++ b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz.vdri
@@ -1,4 +1,4 @@
-<t> [s],<v> [km/h],<n_eng> [rpm],<n_fan> [rpm],<tq_left> [Nm],<tq_right> [Nm],<n_wh_left> [rpm],<n_wh_right> [rpm],<fc> [g/h],<gear>
+<t> [s],<v> [km/h],<n_eng> [rpm],<n_fan> [rpm],<tq_left> [Nm],<tq_right> [Nm],<n_wh_left> [rpm],<n_wh_right> [rpm],<fc_Diesel CI> [g/h],<gear>
 0,0,599.72,727.3,319.1147826,429.8065217,0.78,0.78,836,3
 0.5,0,600.29,727.3,316.7856522,430.0626087,0.7832,0.78,836,3
 1,0,600.1,726.912,319.9513043,430.8052174,0.78,0.78,836,3
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz_noGear.vdri b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz_noGear.vdri
index 54acf3120c..29cdc116a0 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz_noGear.vdri
+++ b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/VTP_rural_2Hz_noGear.vdri
@@ -1,4 +1,4 @@
-<t> [s],<v> [km/h],<n_eng> [rpm],<n_fan> [rpm],<tq_left> [Nm],<tq_right> [Nm],<n_wh_left> [rpm],<n_wh_right> [rpm],<fc> [g/h]
+<t> [s],<v> [km/h],<n_eng> [rpm],<n_fan> [rpm],<tq_left> [Nm],<tq_right> [Nm],<n_wh_left> [rpm],<n_wh_right> [rpm],<fc_Diesel CI> [g/h]
 0,0,599.72,727.3,319.1147826,429.8065217,0.78,0.78,836
 0.5,0,600.29,727.3,316.7856522,430.0626087,0.7832,0.78,836
 1,0,600.1,726.912,319.9513043,430.8052174,0.78,0.78,836
diff --git a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/vtp_cycle_citybus_atser.vdri b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/vtp_cycle_citybus_atser.vdri
index 2d457a7611..276c379d90 100644
--- a/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/vtp_cycle_citybus_atser.vdri
+++ b/VectoCore/VectoCoreTest/TestData/Integration/VTPMode/GenericVehicle/vtp_cycle_citybus_atser.vdri
@@ -1,4 +1,4 @@
-t,v,gear,tc_active,n_eng,n_fan,fc,n_wh_left,n_wh_right,tq_left,tq_right
+t,v,gear,tc_active,n_eng,n_fan,fc_Diesel CI,n_wh_left,n_wh_right,tq_left,tq_right
 0.25,0,0,1,600,1000,1278.2425,0,0,0,0
 1,0,0,1,600,1000,1278.2425,0,0,0,0
 1.75,0,0,1,600,1000,1278.2425,0,0,0,0
-- 
GitLab