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)); }
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; }
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); }