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); }
static double[] AddSpectr(int sn, float[] bas, float[] sig, float[] nul, OpticFk ofk, float max_level_in, double[] k, int call_level) { bool[] trusted = new bool[bas.Length]; float[] new_sp = new float[bas.Length]; int good_count = 0; float max_level = max_level_in * 2 / 3; for (int i = 0; i < bas.Length; i++) { if (sig[i] < max_level) { good_count++; trusted[i] = true; } else { trusted[i] = false; } new_sp[i] = ofk.GetCorrectedValue(sn, i, sig, nul, max_level_in);//(sig[i] - nul[i]) * ok[i]; } if (good_count > 20)//sig.Length / 200) { double[] x = new double[good_count]; double[] y = new double[good_count]; int gv = 0; for (int i = 0; i < bas.Length; i++) { if (sig[i] < max_level) { x[gv] = bas[i]; y[gv] = new_sp[i]; gv++; } } k = fk.Interpolation.mInterpol1(x, y); } else { if (call_level == 0) { return(AddSpectr(sn, bas, sig, nul, ofk, Common.Dev.Reg.GetMaxValue(), k, 1)); } else { double[] ret = new double[bas.Length]; for (int i = 0; i < ret.Length; i++) { ret[i] = bas[i]; } return(ret); } } for (int i = 0; i < bas.Length; i++) { bool trust = trusted[i]; if (i > 0) { trust &= trusted[i - 1]; } if (i < bas.Length - 1) { trust &= trusted[i + 1]; } if (i > 1) { trust &= trusted[i - 2]; } if (i < bas.Length - 2) { trust &= trusted[i + 2]; } if (trust == false || good_count < sig.Length / 100) { //bas[i] = (float)(k[0] + k[1] * bas[i]); bas[i] = (float)(k[1] + k[0] * bas[i]); } else { bas[i] = new_sp[i]; } } return(k); }