From 26d73e49039c1872362037a1ab82686da12d6a54 Mon Sep 17 00:00:00 2001
From: Markus Quaritsch <quaritsch@ivt.tugraz.at>
Date: Wed, 29 Mar 2023 17:56:23 +0200
Subject: [PATCH] refactoring lorry rundata factory: do not store comonent data
 in fields, introduce property for driver data (only create once, avoid
 reading multiple times from the .vacc stream) IEPC-E Testcase runs
 successfully

---
 ...MLDeclarationBusAuxiliariesDataProvider.cs |   1 +
 ...eclarationPrimaryBusVehicleDataProvider.cs |   2 +-
 .../DeclarationDataAdapterPrimaryBus.cs       |   1 +
 .../AuxiliaryDataAdapter.cs                   |   5 +-
 .../AbstractDeclarationVectoRunDataFactory.cs |  39 +--
 ...DeclarationModeHeavyLorryRunDataFactory.cs |  79 ++----
 ...tionModeHeavyLorryRunDataFactory_Hybrid.cs |  61 +----
 ...DeclarationModePrimaryBusRunDataFactory.cs | 224 ++++++------------
 8 files changed, 112 insertions(+), 300 deletions(-)

diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
index baa232d92c..82825ff2d4 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationBusAuxiliariesDataProvider.cs
@@ -327,6 +327,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 
 		public override ConsumerTechnology AdBlueDosing => ConsumerTechnology.Unknown;
 
+		public override bool EngineWasteGasHeatExchanger => false;
 	}
 
 	// ---------------------------------------------------------------------------------------
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationPrimaryBusVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationPrimaryBusVehicleDataProvider.cs
index b462b469f6..f517b07fe6 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationPrimaryBusVehicleDataProvider.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationPrimaryBusVehicleDataProvider.cs
@@ -192,7 +192,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider.v24
 
 		public override bool Articulated => GetBool(XMLNames.Vehicle_Articulated);
 
-		public override VectoSimulationJobType VehicleType => VectoSimulationJobType.BatteryElectricVehicle;
+		public override VectoSimulationJobType VehicleType => VectoSimulationJobType.IEPC_E;
 
 		#endregion
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
index 811ae09d2d..896e4c56e3 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs
@@ -316,6 +316,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus
 
 		public class PEV_E_IEPC : BatteryElectric
 		{
+			protected override IGearboxDataAdapter GearboxDataAdapter { get; } = new IEPCGearboxDataAdapter();
 
 		}
 
diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
index c79ae26219..e074e745db 100644
--- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
+++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs
@@ -806,7 +806,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
 
 			var electricUserInputs =
 				GetElectricalUserConfig(mission, primaryVehicle, actuations, runData.VehicleData.VehicleClass);
-			electricUserInputs.ConnectESToREESS = true;
+			if (primaryVehicle.VehicleType.IsOneOf(VectoSimulationJobType.BatteryElectricVehicle,
+					VectoSimulationJobType.IEPC_E)) {
+				electricUserInputs.ConnectESToREESS = true;
+			}
 
 			var retVal = new AuxiliaryConfig
 			{
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs
index aba2cdc51e..5588d6dfb9 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs
@@ -23,23 +23,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl {
 		protected readonly IDeclarationInputDataProvider InputDataProvider;
 
 		protected IDeclarationReport Report;
-		//protected abstract IDeclarationDataAdapter DataAdapter { get; }
-
+		
 		protected Segment _segment;
 
-		protected bool _allowVocational;
-
-		protected DriverData _driverdata;
-		protected AirdragData _airdragData;
-		protected AxleGearData _axlegearData;
-		protected AngledriveData _angledriveData;
-		protected GearboxData _gearboxData;
-		protected RetarderData _retarderData;
-		protected PTOData _ptoTransmissionData;
-		protected PTOData _municipalPtoTransmissionData;
-		//protected Exception InitException;
-		protected ShiftStrategyParameters _gearshiftData;
+        protected bool _allowVocational;
 
+        private DriverData _driverdata;
+		
 		protected AbstractDeclarationVectoRunDataFactory(
 			IDeclarationInputDataProvider dataProvider, IDeclarationReport report, bool checkJobType = true)
 		{
@@ -55,16 +45,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl {
             Report = report;
 
 			_allowVocational = true;
-			//try {
-			//	Initialize();
-			//	if (Report != null) {
-			//		InitializeReport();
-			//	}
-			//} catch (Exception e) {
-			//	InitException = e;
-			//}
 		}
 
+		protected DriverData DriverData => _driverdata ?? (_driverdata = CreateDriverData(_segment));
+		protected abstract DriverData CreateDriverData(Segment segment);
+
 		public virtual IEnumerable<VectoRunData> NextRun()
 		{
 		
@@ -93,15 +78,5 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl {
 
 		protected abstract VectoRunData GetPowertrainConfigForReportInit();
 
-		//protected virtual PTOData CreateDefaultPTOData()
-		//{
-		//	return new PTOData() {
-		//		TransmissionType = DeclarationData.PTO.DefaultPTOTechnology,
-		//		LossMap = PTOIdleLossMapReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOIdleLosses)),
-		//		PTOCycle =
-		//			DrivingCycleDataReader.ReadFromStream(RessourceHelper.ReadStream(DeclarationData.PTO.DefaultPTOActivationCycle),
-		//												CycleType.PTO, "PTO", false)
-		//	};
-		//}
 	}
 }
\ No newline at end of file
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
index 8f818e38b8..f7d7ab10c7 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs
@@ -27,18 +27,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			public IDeclarationInputDataProvider InputDataProvider { get; }
 			public IDeclarationReport Report { get; }
 
-			protected DriverData _driverdata;
-			protected AirdragData _airdragData;
-			protected AxleGearData _axlegearData;
-			protected AngledriveData _angledriveData;
-			protected GearboxData _gearboxData;
-			protected RetarderData _retarderData;
-			protected PTOData _ptoTransmissionData;
-			protected PTOData _municipalPtoTransmissionData;
-			protected ShiftStrategyParameters _gearshiftData;
-			private bool _allowVocational;
-
-
 			protected LorryBase(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, false)
 			{
@@ -47,6 +35,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				Report = report;
 			}
 
+			#region Overrides of AbstractDeclarationVectoRunDataFactory
+
+			protected override DriverData CreateDriverData(Segment segment)
+			{
+				return DataAdapter.CreateDriverData(segment);
+			}
+
+			#endregion
+
 			/// <summary>
 			/// Sets <see cref="VectoRunData.Loading"/>
 			///  ,<see cref="VectoRunData.JobName"/>
@@ -140,27 +137,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				}
 
 				_segment = GetSegment(vehicle);
-				_driverdata = DataAdapter.CreateDriverData(_segment);
-
-				_airdragData = DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData,
-													_segment.Missions.First(), _segment);
-				if (InputDataProvider.JobInputData.Vehicle.AxleConfiguration.AxlegearIncludedInGearbox())
-				{
-					_axlegearData = DataAdapter.CreateDummyAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.GearboxInputData);
-				}
-				else
-				{
-					_axlegearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData);
-				}
-				_angledriveData = DataAdapter.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.Components.AngledriveInputData);
 				
-				_retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
-
-				_ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
-
-				_municipalPtoTransmissionData = DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData);
-
-
 			}
 
 			protected abstract void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle,
@@ -183,12 +160,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 			protected override VectoRunData GetPowertrainConfigForReportInit()
 			{
-				var vehicle = InputDataProvider.JobInputData.Vehicle;
 				return GetNextRun().First(x => x != null);
-				//return _segment.Missions.Select(
-				//		mission => CreateVectoRunData(
-				//			vehicle, mission, mission.Loadings.First(), 0))
-				//	.FirstOrDefault(x => x != null);
 			}
 
 			#endregion
@@ -238,11 +210,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			public Conventional(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			protected override void Initialize()
-			{
-				base.Initialize();
-			}
-
 			#region Overrides of LorryBase
 			protected override IEnumerable<VectoRunData> GetNextRun()
 			{
@@ -283,8 +250,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 				var simulationRunData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value);
 
-
-
 				simulationRunData.VehicleData =
 				DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
 
@@ -297,25 +262,21 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 				simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>();
 
-
                 CreateGearboxAndGearshiftData(vehicle, simulationRunData);
 
-
-                simulationRunData.AngledriveData = _angledriveData;
+                simulationRunData.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData);
 				simulationRunData.Aux = DataAdapter.CreateAuxiliaryData(
 					vehicle.Components.AuxiliaryInputData,
 					vehicle.Components.BusAuxiliaries, mission.MissionType,
 					_segment.VehicleClass, vehicle.Length,
 					vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType);
 
-				simulationRunData.Retarder = _retarderData;
-				simulationRunData.DriverData = _driverdata;
+				simulationRunData.Retarder = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
+				simulationRunData.DriverData = DriverData;
 				simulationRunData.PTO = mission.MissionType == MissionType.MunicipalUtility
-					? _municipalPtoTransmissionData
-					: _ptoTransmissionData;
-				
-				
-			
+					? DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData)
+					: DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
+
 				simulationRunData.EngineData.FuelMode = modeIdx.Value;
 				simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
 				simulationRunData.VehicleData.InputData = vehicle;
@@ -342,7 +303,11 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				var shiftStrategyName =
 					PowertrainBuilder.GetShiftStrategyName(vehicle.Components.GearboxInputData.Type,
 						vehicle.VehicleType);
-				runData.AxleGearData = _axlegearData;
+                if (InputDataProvider.JobInputData.Vehicle.AxleConfiguration.AxlegearIncludedInGearbox()) {
+					runData.AxleGearData = DataAdapter.CreateDummyAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.GearboxInputData);
+                } else {
+					runData.AxleGearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData);
+                }
 				runData.GearboxData = DataAdapter.CreateGearboxData(vehicle, runData,
 					ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters));
 			}
@@ -404,11 +369,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				int? modeIdx = null,
 				VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
 			{
-				//_segment = GetSegment(vehicle);
 				var result = CreateCommonRunData(vehicle, mission, loading, _segment);
 				result.AirdragData =
 					DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment);
-				result.DriverData = DataAdapter.CreateDriverData(_segment);
+				result.DriverData = DriverData;
 
 				DataAdapter.CreateREESSData(
 					componentsElectricStorage: vehicle.Components.ElectricStorage,
@@ -478,7 +442,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 						InputDataProvider.JobInputData.Vehicle.LegislativeClass.ToString());
 				}
 				_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, true);
-
 			}
 
 			#endregion
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
index ee51df2a98..6c0d528f7a 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs
@@ -12,8 +12,6 @@ using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent;
-using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
 using TUGraz.VectoCore.OutputData;
 
@@ -103,7 +101,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				int? modeIdx,
 				VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
 			{
-				//_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false);
 				CheckMaxChargingPowerPresent(vehicle);
 				
 				var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
@@ -112,7 +109,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				var runData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value);
 
 
-				runData.DriverData = DataAdapter.CreateDriverData(_segment);
+				runData.DriverData = DriverData;
 				runData.AirdragData =
 					DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment);
 				runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
@@ -124,15 +121,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					((batteryData) => runData.BatteryData = batteryData),
 					((sCdata => runData.SuperCapData = sCdata)));
 
-				
 				runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(
 					vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits,
 					runData.BatteryData.CalculateAverageVoltage());
 
-				
-
-
-
 				if (vehicle.VehicleType == VectoSimulationJobType.IEPC_S) {
 					var iepcData = DataAdapter.CreateIEPCElectricMachines(vehicle.Components.IEPC,
 						runData.BatteryData.CalculateAverageVoltage());
@@ -149,10 +141,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					_segment.VehicleClass, vehicle.Length, vehicle.Components.AxleWheels.NumSteeredAxles,
 					VectoSimulationJobType.SerialHybridVehicle);
 
-				
 				CreateGearboxAndGearshiftData(vehicle, runData);
 
-
 				runData.HybridStrategyParameters =
 					DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData, runData.VehicleData.TotalVehicleMass, ovcMode, loading.Key, runData.VehicleData.VehicleClass, mission.MissionType);
 
@@ -166,16 +156,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					}
 				}
 
-
-
-
-				var ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
-
-				var municipalPtoData = DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData);
-
 				runData.PTO = mission.MissionType == MissionType.MunicipalUtility
-					? municipalPtoData
-					: ptoTransmissionData;
+					? DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData)
+					: DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
 
 
 				if (ovcMode != VectoRunData.OvcHevMode.NotApplicable && runData.InputData.JobInputData.Vehicle.OvcHev) {
@@ -204,16 +187,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 
 			#endregion
 
-			#region Overrides of LorryBase
-
-			protected override void Initialize()
-			{
-				_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false);
-			}
-
-			
-
-			#endregion
 		}
 
 		public class ParallelHybrid : Hybrid
@@ -223,20 +196,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				declarationDataAdapter) { }
 
 
-			#region Overrides of AbstractDeclarationVectoRunDataFactory
-
 			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
 				int? modeIdx = null, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
 			{
-				//_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false);
 				CheckMaxChargingPowerPresent(vehicle);
 				var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
 				var engineModes = engine.EngineModes;
 				var engineMode = engineModes[modeIdx.Value];
 				var runData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value);
 
-				runData.DriverData = DataAdapter.CreateDriverData(_segment);
-
+				runData.DriverData = DriverData;
 
 				runData.AirdragData =
 					DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment);
@@ -295,16 +264,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 					runData.IterativeRunStrategy = new OVCHevIterativeRunStrategy();
 				}
 
-
-
-
-				var ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
-
-				var municipalPtoTransmissionData = DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData);
-
 				runData.PTO = mission.MissionType == MissionType.MunicipalUtility
-					? municipalPtoTransmissionData
-					: ptoTransmissionData;
+					? DataAdapter.CreatePTOCycleData(vehicle.Components.GearboxInputData, vehicle.Components.PTOTransmissionInputData)
+					: DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData, vehicle.Components.GearboxInputData);
 
 
 				if (ovcMode != VectoRunData.OvcHevMode.NotApplicable && runData.InputData.JobInputData.Vehicle.OvcHev)
@@ -315,14 +277,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 				return runData;
 			}
 
-			#region Overrides of LorryBase
-
-			protected override void Initialize()
-			{
-				//throw new NotImplementedException("ParallelHybrid not implemented");
-				_segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false);
-			}
+			
 
+			
 			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
 			{
 				runData.GearshiftParameters =
@@ -343,9 +300,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
 			{
 				return true;
 			}
-			#endregion
 
-			#endregion
 		}
 
 		public class HEV_S2 : SerialHybrid
diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
index 01a7c6c394..5aee15fbd5 100644
--- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
+++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs
@@ -11,9 +11,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
 using TUGraz.VectoCore.Models.Simulation.Impl;
-using TUGraz.VectoCore.Models.SimulationComponent;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
-using TUGraz.VectoCore.Models.SimulationComponent.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
 using TUGraz.VectoCore.OutputData;
 
@@ -38,13 +36,17 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				Report = report;
 			}
 
+			#region Overrides of AbstractDeclarationVectoRunDataFactory
+
+			protected override DriverData CreateDriverData(Segment segment)
+			{
+				return DataAdapter.CreateDriverData(segment);
+			}
+
+			#endregion
+
 			protected override VectoRunData GetPowertrainConfigForReportInit()
 			{
-				var vehicle = InputDataProvider.JobInputData.Vehicle;
-				//return _segment.Missions.Select(
-				//		mission => CreateVectoRunData(
-				//			vehicle, mission, mission.Loadings.First(), 0))
-				//	.FirstOrDefault(x => x != null);
 				return GetNextRun().First(x => x != null);
 			}
 
@@ -78,23 +80,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				}
 
 				_segment = GetSegment(vehicle);
-				_driverdata = DataAdapter.CreateDriverData(_segment);
-				var tempVehicle = DataAdapter.CreateVehicleData(vehicle, _segment, _segment.Missions.First(),
-														_segment.Missions.First().Loadings.First(), _allowVocational);
-				_airdragData = DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData,
-													_segment.Missions.First(), _segment);
-				if (InputDataProvider.JobInputData.Vehicle.AxleConfiguration.AxlegearIncludedInGearbox())
-				{
-					_axlegearData = DataAdapter.CreateDummyAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.GearboxInputData);
-				}
-				else
-				{
-					_axlegearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData);
-				}
-				_angledriveData = DataAdapter.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.Components.AngledriveInputData);
-
-				_retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
-
+				
 			}
 
 			#endregion
@@ -123,22 +109,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 					VehicleDesignSpeed = segment.DesignSpeed,
 					Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()),
 					ExecutionMode = ExecutionMode.Declaration,
-
-					//VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational),
-					//AirdragData = DataAdapter.CreateAirdragData(null, mission, new Segment()),
-					////EngineData = DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, mission),
-					//ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(),
-					//GearboxData = _gearboxData,
-					//AxleGearData = _axlegearData,
-					//AngledriveData = _angledriveData,
-					//Aux = DataAdapter.CreateAuxiliaryData(
-					//	vehicle.Components.AuxiliaryInputData,
-					//	vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass,
-					//	vehicle.Length ?? mission.BusParameter.VehicleLength,
-					//	vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType),
-					//Retarder = _retarderData,
-					//DriverData = _driverdata,
-					//GearshiftParameters = _gearshiftData,
 				};
 
 				return simulationRunData;
@@ -212,25 +182,22 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				var engineModes = engine.EngineModes;
 				var engineMode = engineModes[modeIdx.Value];
 
-				var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false));
-
 				var simulationRunData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value);
 
 				simulationRunData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
 				simulationRunData.AirdragData = DataAdapter.CreateAirdragData(null, mission, new Segment());
 				simulationRunData.EngineData = DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, mission);
 				simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>();
-				simulationRunData.GearboxData = _gearboxData;
-				simulationRunData.AxleGearData = _axlegearData;
-				simulationRunData.AngledriveData = _angledriveData;
-				simulationRunData.Aux = DataAdapter.CreateAuxiliaryData(
+				simulationRunData.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData);
+                simulationRunData.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData);
+                simulationRunData.Aux = DataAdapter.CreateAuxiliaryData(
 					vehicle.Components.AuxiliaryInputData,
 					vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass,
 					vehicle.Length ?? mission.BusParameter.VehicleLength,
 					vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType);
-				simulationRunData.Retarder = _retarderData;
-				simulationRunData.DriverData = _driverdata;
-				simulationRunData.GearshiftParameters = _gearshiftData;
+				simulationRunData.Retarder = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
+				simulationRunData.DriverData = DriverData;
+				
 
                 simulationRunData.EngineData.FuelMode = modeIdx.Value;
 				simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass;
@@ -325,15 +292,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			//#region Overrides of PrimaryBusBase
-
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
-			//#endregion
-
 			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
 			{
 				if (vehicle.ArchitectureID != ArchitectureID.E2) {
@@ -362,20 +320,12 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 			public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
 				IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
 		}
 
 		public class HEV_S4 : SerialHybrid
 		{
 			public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
 		}
 
 		public class HEV_S_IEPC : SerialHybrid
@@ -409,15 +359,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 		{
 			protected ParallelHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
-			#endregion
-
 			protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission,
 				KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
 				int? modeIdx = null, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
@@ -447,54 +388,31 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 		{
 			public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
 		}
 
 		public class HEV_P2 : ParallelHybrid
 		{
 			public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
 		}
 
 		public class HEV_P2_5 : ParallelHybrid
 		{
 			public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
+			
 		}
 
 		public class HEV_P3 : ParallelHybrid
 		{
 			public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-
-			#endregion
 		}
 
 		public class HEV_P4 : ParallelHybrid
 		{
 			public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
-			#endregion
 		}
 
 		public abstract class BatteryElectric : PrimaryBusBase
@@ -503,11 +421,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 
 			#region Overrides of PrimaryBusBase
 
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
 			protected override IEnumerable<VectoRunData> GetNextRun()
 			{
 				var vehicle = InputDataProvider.JobInputData.Vehicle;
@@ -535,30 +448,29 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 					(bs) => result.BatteryData = bs,
 					(sc) => result.SuperCapData = sc);
 
-				result.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, 
-					vehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null);
+				
 				if (vehicle.VehicleType == VectoSimulationJobType.IEPC_E) {
 					result.ElectricMachinesData = DataAdapter.CreateIEPCElectricMachines(vehicle.Components.IEPC,
 						result.BatteryData.CalculateAverageVoltage());
+				} else {
+					result.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines,
+						vehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null);
 				}
 
 				result.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
 				result.AirdragData = DataAdapter.CreateAirdragData(null, mission, new Segment());
-				result.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null);
-				result.GearboxData = _gearboxData;
 				if (AxleGearRequired() || vehicle.Components.AxleGearInputData != null) {
-					result.AxleGearData = _axlegearData;
+					result.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData);
 				}
 
-				result.AngledriveData = _angledriveData;
+				result.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData);
 				result.Aux = DataAdapter.CreateAuxiliaryData(
 					vehicle.Components.AuxiliaryInputData,
 					vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass,
 					vehicle.Length ?? mission.BusParameter.VehicleLength,
 					vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType);
-				result.Retarder = _retarderData;
-				result.DriverData = _driverdata;
-				result.GearshiftParameters = _gearshiftData;
+				result.Retarder = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
+				result.DriverData = DriverData;
 
 				result.VehicleData.VehicleClass = _segment.VehicleClass;
 				result.BusAuxiliaries = DataAdapter.CreateBusAuxiliariesData(
@@ -591,11 +503,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 
 			#region Overrides of PrimaryBusBase
 
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
 			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
 			{
 				if (vehicle.ArchitectureID != ArchitectureID.E2) {
@@ -624,42 +531,64 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 		{
 			public PEV_E3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
-			#endregion
 		}
 
 		public class PEV_E4 : BatteryElectric
 		{
 			public PEV_E4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
-
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
-
-			#endregion
 		}
 
 		public class PEV_E_IEPC : BatteryElectric
 		{
 			public PEV_E_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
 
-			#region Overrides of PrimaryBusBase
 
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	throw new NotImplementedException();
-			//}
+			protected override bool AxleGearRequired()
+			{
+				var vehicle = InputDataProvider.JobInputData.Vehicle;
+				var iepcInput = vehicle.Components.IEPC;
+				var axleGearRequired = !iepcInput.DifferentialIncluded && !iepcInput.DesignTypeWheelMotor;
+				if (axleGearRequired && vehicle.Components.AxleGearInputData == null) {
+					throw new VectoException(
+						$"Axlegear reqhired for selected type of IEPC! DifferentialIncluded: {iepcInput.DifferentialIncluded}, DesignTypeWheelMotor: {iepcInput.DesignTypeWheelMotor}");
+				}
+
+				var numGearsPowermap =
+					iepcInput.VoltageLevels.Select(x => Tuple.Create(x.VoltageLevel, x.PowerMap.Count)).ToArray();
+				var gearCount = iepcInput.Gears.Count;
+				var numGearsDrag = iepcInput.DragCurves.Count;
 
-			#endregion
+				if (numGearsPowermap.Any(x => x.Item2 != gearCount)) {
+					throw new VectoException(
+						$"Number of gears for voltage levels does not match! PowerMaps: {numGearsPowermap.Select(x => $"{x.Item1}: {x.Item2}").Join()}; Gear count: {gearCount}");
+				}
+
+				if (numGearsDrag > 1 && numGearsDrag != gearCount) {
+					throw new VectoException(
+						$"Number of gears drag curve does not match gear count! DragCurve {numGearsDrag}; Gear count: {gearCount}");
+				}
+
+				return axleGearRequired || vehicle.Components.AxleGearInputData != null;
+
+			}
+
+			protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData)
+			{
+				runData.GearshiftParameters =
+					DataAdapter.CreateGearshiftData(
+						runData.AxleGearData?.AxleGear.Ratio ?? 1.0,
+						null,
+						GearboxType.APTN,
+						vehicle.Components.IEPC.Gears.Count
+					);
+				var shiftStrategyName =
+					PowertrainBuilder.GetShiftStrategyName(GearboxType.APTN,
+						vehicle.VehicleType);
+				runData.GearboxData = DataAdapter.CreateGearboxData(vehicle, runData,
+					ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters));
+
+			}
 		}
 
 		public class Exempted : PrimaryBusBase
@@ -679,21 +608,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
 				throw new NotImplementedException();
 			}
 
-			//protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary()
-			//{
-			//	yield return new VectoRunData {
-			//		InputData = DataProvider,
-			//		Exempted = true,
-			//		Report = Report,
-			//		Mission = new Mission { MissionType = MissionType.ExemptedMission },
-			//		VehicleData = DataAdapter.CreateVehicleData(InputDataProvider.JobInputData.Vehicle, new Segment(),
-			//			null,
-			//			new KeyValuePair<LoadingType, Tuple<Kilogram, double?>>(LoadingType.ReferenceLoad,
-			//				Tuple.Create<Kilogram, double?>(0.SI<Kilogram>(), null)), _allowVocational),
-			//		InputDataHash = InputDataProvider.XMLHash
-			//	};
-			//}
-
 			protected override IEnumerable<VectoRunData> GetNextRun()
 			{
 				var vehicle = InputDataProvider.JobInputData.Vehicle;
-- 
GitLab