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);
        }
Exemplo n.º 5
0
        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;
        }