public double RateSpectrDataView(Spectr sp, SpectrDataView sig, SpectrDataView nul)
        {
            if (Enabled == false)
            {
                return(-1);
            }
            List <GLogRecord>     log   = new List <GLogRecord>();
            List <SpectrDataView> sig_l = new List <SpectrDataView>();

            sig_l.Add(sig);
            List <SpectrDataView> nul_l = new List <SpectrDataView>();

            nul_l.Add(nul);
            List <double> analit = new List <double>();
            List <double> aq     = new List <double>();
            //bool is_too_low = false;
            CalcLineAtrib attr = new CalcLineAtrib();
            bool          rez  = Params.Calc(log, LogSectionName, "",
                                             //null,
                                             sig_l, nul_l, sp,
                                             analit, aq, ref attr, false);

            if (rez == false)
            {
                return(-1);
            }
            if (analit[0] == 0 ||
                serv.IsValid(analit[0]) == false)
            {
                return(-1);
            }
            double lim;

            if (analit[0] > AnalitEver)
            {
                lim = AnalitTo;
            }
            else
            {
                lim = AnalitFrom;
            }
            return(Math.Abs(analit[0] - AnalitEver) /
                   Math.Abs(AnalitEver - lim));
        }
Ejemplo n.º 2
0
        public bool Calc(List <GLogRecord> log,
                         string log_section, string log_prefix,
                         SpectrDataView sig,
                         SpectrDataView nul,
                         Spectr spectr,
                         out double analit,
                         out double aq,
                         ref CalcLineAtrib attrib,
                         bool is_calibr)
        {
            if (nmLy.Value < 10)
            {
                nmLy.Value = 0;
                analit     = 1;
                aq         = 0;
                return(true);
            }
            analit = 0;
            aq     = 0;

            int sn;

            if (GetSnNum(log, log_section, spectr.GetCommonDispers(),
                         sig.MaxLinarLevel, out sn) == false)
            {
                return(false);
            }

            Dispers disp         = spectr.GetCommonDispers();//sig.GetDispersRO();
            int     ss           = disp.GetSensorSizes()[sn];
            float   base_pixel_f = (float)disp.GetLocalPixelByLy(sn, (double)nmLy.Value);
            int     base_pixel   = (int)base_pixel_f;

            int pixel_from = base_pixel - PixelDlt;

            if (pixel_from < 0)
            {
                pixel_from = 0;
            }
            int pixel_to = base_pixel + PixelDlt;

            if (pixel_to > ss - 1)
            {
                pixel_to = ss - 1;
            }
            float[] sig_data         = sig.GetSensorDataWithCorrection(sn);
            float[] nul_data         = nul.GetSensorDataWithCorrection(sn);
            int     start_pixel      = (int)((base_pixel_f - pixel_from) * Common.Conf.MultFactor);
            int     start_pixel_orig = start_pixel;

            //float max_val = sig.MaxLinarLevel;
            float max_val = Common.Conf.MaxLevel;

            float[] sig_nul = new float[pixel_to - pixel_from + 1];
            OpticFk ofk     = spectr.OFk;

            //float[][] sensK = ofk.GetSensK();
            for (int i = 0; i < sig_nul.Length; i++)
            {
                sig_nul[i] = ofk.GetCorrectedValue(sn, i + pixel_from, sig_data, nul_data, max_val);// sig_data[i + pixel_from] - nul_data[i + pixel_from];
                //sig_nul[i] *= sensK[sn][i+pixel_from];
            }

            int max_pix = base_pixel;

            for (; max_pix < sig_data.Length - 1 &&
                 sig_data[max_pix] - nul_data[max_pix] < sig_data[max_pix + 1] - nul_data[max_pix + 1];
                 max_pix++)
            {
                ;
            }
            for (; max_pix > 1 &&
                 sig_data[max_pix] - nul_data[max_pix] < sig_data[max_pix - 1] - nul_data[max_pix - 1];
                 max_pix--)
            {
                ;
            }

            int sig_val = (int)(sig_data[max_pix] - nul_data[max_pix]);

            if (sig_val < MinSignalAmpl)
            {
                MinSignalAmpl = sig_val;
            }
            if (sig_val > MaxSignalAmpl)
            {
                MaxSignalAmpl = sig_val;
            }

            double[] working_data = PrepareData(sig_data, sig_nul, sn, pixel_from, spectr, max_val, Common.Conf.MultFactor);

            if (LySpectrEtalon != null)
            {
                if (LySpectrEtalonCalc == null)
                {
                    LySpectrEtalonCalc = PrepareData(sig_data, LySpectrEtalon, sn, 0, spectr, max_val, Common.Conf.MultFactor);
                }

                double min_etalon = double.MaxValue;
                double min_sig    = double.MaxValue;
                int    shift      = (int)(LySpectrLocalPixel - LySpectrEtalonPixelFrom) * Common.Conf.MultFactor - start_pixel;

                double crit = Corel(LySpectrEtalonCalc, working_data,
                                    shift, start_pixel, spectr.OverloadLevel,
                                    ref min_etalon, ref min_sig);
                for (int i = 0; i < 4 * Common.Conf.MultFactor; i++)
                {
                    double cand_crit = Corel(LySpectrEtalonCalc, working_data,
                                             shift + 1, start_pixel, spectr.OverloadLevel,
                                             ref min_etalon, ref min_sig);
                    if (cand_crit > crit)
                    {
                        shift++;
                        start_pixel--;
                        crit = cand_crit;
                    }
                    else
                    {
                        break;
                    }
                }
                for (int i = 0; i < 4 * Common.Conf.MultFactor; i++)
                {
                    double cand_crit = Corel(LySpectrEtalonCalc, working_data,
                                             shift - 1, start_pixel, spectr.OverloadLevel,
                                             ref min_etalon, ref min_sig);
                    if (cand_crit > crit)
                    {
                        shift--;
                        start_pixel++;
                        crit = cand_crit;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            else
            {
                log.Add(new GLogMsg(log_section,
                                    log_prefix + Common.MLS.Get(MLSConst, "Нет профиля линии. Для устаноки Ly используйте 'Устан.'") + nmLy.Value,
                                    Color.Orange));
            }


            if (cbMaximumType.SelectedIndex == 0 || cbMaximumType.SelectedIndex == 1)
            {
                int steps;
                if (cbMaximumType.SelectedIndex == 0)
                {
                    steps = 5;
                }
                else
                {
                    steps = 30;
                }
                if (working_data[start_pixel] < working_data[start_pixel + 1])
                {
                    for (int i = 0; i < steps &&
                         working_data[start_pixel] < working_data[start_pixel + 1];
                         i++, start_pixel++)
                    {
                        start_pixel++;
                    }
                    start_pixel--;
                }
                if (working_data[start_pixel] < working_data[start_pixel - 1])
                {
                    for (int i = 0; i < steps &&
                         working_data[start_pixel] < working_data[start_pixel - 1];
                         i++, start_pixel--)
                    {
                        start_pixel--;
                    }
                    start_pixel++;
                }
            }

            analit = working_data[start_pixel];
            if (cbExtraCalcType.SelectedIndex == 1)
            {
                double bkg_analit, bkg_aq;
                CalcBackGround(log, log_section, log_prefix + "bkg", sig, nul, spectr, out bkg_analit, out bkg_aq);
                analit /= bkg_analit;
            }
            //double min = working_data[0];//1 = working_data[start_pixel - 10];
            //double min2 = working_data[start_pixel + 10];
            //for (int i = start_pixel - 10; i > 0 && working_data[i] < working_data[i + 1]; i--)
            //if (working_data[i] < min1)
            //min1 = working_data[i];
            //for (int i = start_pixel + 10; i < working_data.Length-1 && working_data[i] < working_data[i - 1]; i++)
            //if (working_data[i] < min2)
            //min2 = working_data[i];
            double ampl = analit;// - (min1+min2)/2;

            if (is_calibr)
            {
                if (ampl < MinAnalitValue)
                {
                    MinAnalitValue = (float)ampl;
                }
                if (ampl > MaxAnalitValue)
                {
                    MaxAnalitValue = (float)ampl;
                }
            }
            else
            {
                //double dlt = (MinAnalitValue-MinAnalitValue)
                float extr_val = MinAnalitValue * (1 - Common.Env.MaxAmplDlt);
                if (ampl < extr_val)
                {
                    attrib.IsTooLow = true;
                    log.Add(new GLogMsg(log_section,
                                        log_prefix + Common.MLS.Get(MLSConst, "Линия слишком слабая: ") + nmLy.Value + "   " + (int)ampl + "<" + (int)extr_val,
                                        Color.Red));
                }
                extr_val = MaxAnalitValue * (1 + Common.Env.MaxAmplDlt);
                if (ampl > extr_val)
                {
                    attrib.IsTooHi = true;
                    log.Add(new GLogMsg(log_section,
                                        log_prefix + Common.MLS.Get(MLSConst, "Линия слишком сильная: ") + nmLy.Value + "   " + (int)ampl + ">" + (int)extr_val,
                                        Color.Red));
                }
                int pix = (int)(pixel_from + start_pixel / Common.Conf.MultFactor);
                if (sig_data[pix] > max_val ||
                    sig_data[pix + 1] > max_val ||
                    sig_data[pix + 2] > max_val ||
                    sig_data[pix + 3] > max_val ||
                    sig_data[pix - 1] > max_val ||
                    sig_data[pix - 2] > max_val ||
                    sig_data[pix - 3] > max_val)
                {
                    attrib.IsNonLinar = true;
                    log.Add(new GLogMsg(log_section,
                                        log_prefix + Common.MLS.Get(MLSConst, "Линия превысила допустимое значение: ") + nmLy.Value,
                                        Color.Red));
                }
            }
            log.Add(new GLogMsg(log_section,
                                log_prefix + "A(" + nmLy.Value + ")=" + serv.GetGoodValue(analit, 3) + " [" + serv.GetGoodValue(ampl, 2) + "]",// + " min_analit_val=" + MinAnalitValue,
                                Color.Black));
            log.Add(new GLogSpData(log_section,
                                   log_prefix + "Ly(" + nmLy.Value + ")",
                                   working_data, start_pixel, start_pixel,
                                   start_pixel_orig, (double)nmLy.Value, Color.Blue, Color.Red));

            if (LySpectrEtalonCalc != null)
            {
                int center = LySpectrEtalonCalc.Length / 2;
                log.Add(new GLogSpData(log_section,
                                       log_prefix + "Ly(" + nmLy.Value + ")",
                                       formatEtalon(working_data, LySpectrEtalonCalc), center, center,
                                       center - 10, (double)nmLy.Value, Color.LightGray, Color.Black));
            }

            return(true);
        }
        public void Calc(MethodSimple method)
        {
            int pr_count = method.GetProbCount();

            Params.ResetMinLineValues();
            List <double> div = new List <double>();

            for (int pri = 0; pri < pr_count; pri++)
            {
                MethodSimpleProb pr = method.GetProbHeader(pri);
                int sp_count        = pr.MeasuredSpectrs.Count;
                for (int spri = 0; spri < sp_count; spri++)
                {
                    MethodSimpleProbMeasuring prm = pr.MeasuredSpectrs[spri];
                    int[] shot_index          = prm.Sp.GetShotIndexes();
                    List <SpectrDataView> spv = prm.Sp.GetViewsSet();
                    for (int spi = 0; spi < shot_index.Length; spi++)
                    {
                        SpectrDataView sig = spv[shot_index[spi]];
                        SpectrDataView nul = prm.Sp.GetNullFor(shot_index[spi]);

                        List <SpectrDataView> sig_l = new List <SpectrDataView>();
                        sig_l.Add(sig);
                        List <SpectrDataView> nul_l = new List <SpectrDataView>();
                        nul_l.Add(nul);

                        List <double> analit1 = new List <double>();
                        List <double> aq1     = new List <double>();
                        //bool is_too_low = false;
                        CalcLineAtrib attr = new CalcLineAtrib();
                        bool          rez  = Params.Calc(Log, LogSectionName, "",
                                                         //null,
                                                         sig_l, nul_l, prm.Sp,
                                                         analit1, aq1, ref attr, true);
                        if (rez == false)
                        {
                            continue;
                        }
                        if (analit1[0] == 0 ||
                            serv.IsValid(analit1[0]) == false)
                        {
                            continue;
                        }

                        div.Add(analit1[0]);
                    }
                }
            }
            AnalitEver = (float)analit.Stat.GetEver(div);
            if (analit.Stat.LastGoodSKO == 0)
            {
                Sko = (float)analit.Stat.LastSKO;
            }
            else
            {
                Sko = (float)analit.Stat.LastGoodSKO;
            }
            float k = (float)Math.Sqrt(2);

            AnalitFrom = AnalitEver - Sko * k;
            AnalitTo   = AnalitEver + Sko * k;
        }
Ejemplo n.º 4
0
        public bool Calc(List <GLogRecord> log, string log_section,
                         string log_prefix,
                         //Spectr ly_spectr,
                         List <SpectrDataView> sig,
                         List <SpectrDataView> nul,
                         Spectr spectr,
                         List <double> analit,
                         List <double> aq,
                         ref CalcLineAtrib attrib,
                         bool is_calibr)
        {
            double a1, a2;
            double aq1, aq2;

            for (int sp = 0; sp < sig.Count; sp++)
            {
                switch (cbDivType.SelectedIndex)
                {
                case 0:     //По отношению двух линий
                    if (methodLineCalc1.Calc(log, log_section, log_prefix + "A",
                                             sig[sp], nul[sp], spectr,
                                             out a1, out aq1, ref attrib, is_calibr) == false)
                    {
                        return(false);
                    }
                    if (methodLineCalc2.Calc(log, log_section, log_prefix + "C",
                                             sig[sp], nul[sp], spectr,
                                             out a2, out aq2, ref attrib, is_calibr) == false)
                    {
                        return(false);
                    }
                    analit.Add(a1 / a2);
                    aq.Add(aq1 * aq2);
                    log.Add(new GLogMsg(log_section, "#" + (sp + 1) + Common.MLS.Get(MLSConst, "Analit: ") + "s(" + Math.Round(a1, 3) + ")/s(" +
                                        Math.Round(a2, 3) + ")=" + Math.Round(a1 / a2, 3) // +
                                                                                          //Common.MLS.Get(MLSConst, " aquracy=") + Math.Round(aq1 * aq2,3)
                                        , Color.Blue));
                    break;

                case 1:     //По отношению линии к фону
                    if (methodLineCalc1.Calc(log, log_section, log_prefix + "A",
                                             sig[sp], nul[sp], spectr,
                                             out a1, out aq1, ref attrib, is_calibr) == false)
                    {
                        return(false);
                    }
                    if (methodLineCalc2.CalcBackGround(log, log_section, log_prefix + "B",
                                                       //ly_spectr,
                                                       sig[sp], nul[sp], spectr,
                                                       out a2, out aq2) == false)
                    {
                        return(false);
                    }
                    analit.Add(a1 / a2);
                    aq.Add(aq1 * aq2);
                    log.Add(new GLogMsg(log_section, "#" + (sp + 1) + Common.MLS.Get(MLSConst, "Analit: ") + "s(" + Math.Round(a1, 3) +
                                        ")/bg(" + Math.Round(a2, 3) + ")=" + Math.Round(a1 / a2, 3) //+
                                                                                                    //Common.MLS.Get(MLSConst, " aquracy=") + Math.Round(aq1 * aq2,3)
                                        , Color.Blue));
                    break;

                case 2:     //По абсолютному значению
                    if (methodLineCalc1.Calc(log, log_section, log_prefix + "A",
                                             sig[sp], nul[sp], spectr,
                                             out a1, out aq1, ref attrib, is_calibr) == false)
                    {
                        return(false);
                    }
                    analit.Add(a1);
                    aq.Add(aq1);
                    log.Add(new GLogMsg(log_section, "#" + (sp + 1) + Common.MLS.Get(MLSConst, "Analit: ") + Math.Round(a1, 3) // + ' ' +
                                                                                                                               //Common.MLS.Get(MLSConst, " aquracy=") + Math.Round(aq1,3)
                                        , Color.Blue));
                    break;

                case 3:
                    break;
                }
            }
            return(true);
        }