private void ExtractForInjector(PsaParametersSet set, AnalyticStatisticsItem result, int injectorNumber, DateTime sourceDataCaptureDateTime) { PsaParameterData forThisInjector = set.GetCertainInjectorCorrections(injectorNumber); if (forThisInjector == null) { return; } PsaParameterData rpmData = set.GetParameterOfType(PsaParameterType.EngineRpm); CorrelatedMedianExtractor extractor = new CorrelatedMedianExtractor( rpmData.GetDoubles(), forThisInjector.GetDoubles(), RpmCorrelationThresholdPercentage); double res = extractor.GetForBaseValue((int)RuleTypeToRpm.Map(type)); if (double.IsNaN(res)) { return; } // becuse we need correction's absolute value, it can be negative double abs = Math.Abs(res); result.Values.Add(new AnalyticStatisticsValue( abs, info.Vin, set.Id, sourceDataCaptureDateTime)); }
public AnalyticStatisticsItem Get(PsaParametersSet set, DateTime sourceDataCaptureDateTime) { AnalyticStatisticsItem result = new AnalyticStatisticsItem(Type, VehicleInfo.Engine.Family.Type, VehicleInfo.Engine.Type); PsaParameterData rpmData = set.GetParameterOfType(PsaParameterType.EngineRpm); PsaParameterData voltageData = GetRequiredDependentData(set); if (rpmData == null || voltageData == null) { throw new Exception("set does not fit."); } CorrelatedMedianExtractor extractor = new CorrelatedMedianExtractor( rpmData.GetDoubles(), voltageData.GetDoubles(), RpmCorrelationThresholdPercentage); double doubleValue = extractor.GetForBaseValue(Convert.ToDouble(TargetRpm)); if (!double.IsNaN(doubleValue)) { AnalyticStatisticsValue value = new AnalyticStatisticsValue(doubleValue, info.Vin, set.Id, sourceDataCaptureDateTime); result.Values.Add(value); } return(result); }
private void PickDataFromSet(PsaParametersSet set, DateTime date) { PsaParameterData rpmData = set.GetParameterOfType(PsaParameterType.EngineRpm); PsaParameterData pressureData = set.GetParameterOfType(PsaParameterType.FuelSystemPressure); IList <int> idleIndexes = IdleRpmValueExtractor. ExtractIdleIndexes(rpmData.GetDoubles()); if (idleIndexes.Count < idleRpmValuesCountLowerThreshold) { return; } IList <double> idlePressureValues = ExtractIdlePressureValues(idleIndexes, pressureData.GetDoubles()); result.Values.Add( new KeyValuePair <DateTime, double>( date, idlePressureValues.Average())); // Let's get OcrToIdleRpmRatio PsaParameterData ocrData = set.GetParameterOfType(PsaParameterType. DieselPressureRegulatorRatio); if (ocrData != null) { IList <double> ocrValues = ocrData.ExtractByIndexes(idleIndexes).ToList(); IList <double> rpmValues = rpmData.ExtractByIndexes(idleIndexes).ToList(); if (ocrValues.Count != rpmValues.Count) { throw new Exception("Counts should be equal!"); } IList <double> ratioValues = new List <double>(); for (int i = 0; i < rpmValues.Count; i++) { double ratio = ocrValues[i] / rpmValues[i]; if (double.IsInfinity(ratio)) { continue; } ratioValues.Add(RatioMultiplier * ocrValues[i] / rpmValues[i]); } result.OcrToRpmRatio[date] = ratioValues.Average(); } }
private IList <double> ExtractStartupVoltageValues(PsaParameterData rpm, PsaParameterData voltage) { IList <double> result = new List <double>(); EngineStartupDetector detector = new EngineStartupDetector(rpm.GetDoubles()); if (detector.EngineStartupDetected()) { IList <int> startupIndexes = detector.GetEngineStartupPointIndexes(); IList <double> voltageValues = voltage.GetDoubles(); foreach (int index in startupIndexes) { result.Add(voltageValues[index]); } } return(result); }
protected override void PickFromPsaParametersSet( DateTime date, PsaParametersSet set) { // 1. get our target rpm from settings PsaParameterData rpmParameter = set.GetParameterOfType(PsaParameterType.EngineRpm); // 2. find data in the dataset PsaParameterData oxygenSensorVoltageParameter = set.GetParameterOfType(GetOxygenSensorParameter()); // 3. get base line (rpm) IList <double> baseLine = rpmParameter.GetDoubles(); // 4. get dependant line (probe voltage) IList <double> dependantLine = oxygenSensorVoltageParameter.GetDoubles(); // 5. extract correlated median for base RPM value CorrelatedMedianExtractor extractor = new CorrelatedMedianExtractor(baseLine, dependantLine, BaseValuesDifferencePercentageThreshold); CheckpointRpm rpm = GetTargetRpm(); double corellatedMedian = extractor.GetForBaseValue(Convert.ToDouble(rpm)); if (double.IsNaN(corellatedMedian)) { return; } // 6. apply atom settings SettingsAtomApplier applier = new SettingsAtomApplier( Settings.SettingsMolecule.GetPriorityAtom()); double mark = Math.Round(applier.GetMarkForValue(corellatedMedian), 1); // 7. save to marks history MarksHistory[date] = mark; }