private bool YAxisCorrect()
        {
            try
            {
                //找到共享文档下的Y轴文件,Win7中是:C:\Users\Public\Documents\EFTIR\metage_raman\nistR.spc
                SettingFile.Y_Correction_Parameter yPara = Common.SettingData.settingData.y_Correction;
                string nistRFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
                if (SettingData.settingData.y_Correction.isStandard)     //使用标准物质的校正像素光谱
                {
                    nistRFile = System.IO.Path.Combine(nistRFile, "eftir", "metage_raman", yPara.nistR_file);
                }
                else        //用户指定校正物质的像素光谱(经过CorrectParameterPanel处理过了)
                {
                    nistRFile = System.IO.Path.Combine(nistRFile, "eftir", "metage_raman", yPara.user_nistR_file);
                }

                if (!System.IO.File.Exists(nistRFile))
                {
                    throw new Exception("找不到Y轴校正文件:" + nistRFile + ", 请在系统设置中重新设置校正参数");
                }

                /*测试用
                 * nistRFile = @"F:\软件开发\RFDA\往来资料\校正研究\20120911广东省所\nistR_Pixel.spc";
                 * SettingData.settingData.x_Correction.C0 = 88.6993612527;
                 * SettingData.settingData.x_Correction.C1 = 2.74298980447;
                 * SettingData.settingData.x_Correction.C2 = -0.000672483023999;
                 * SettingData.settingData.x_Correction.C3 = 9.51962220393e-08;
                 */

                Ai.Hong.CommonLibrary.SpecFileFormat nirstRData = new Ai.Hong.CommonLibrary.SpecFileFormat();
                if (nirstRData.ReadFile(nistRFile) == false || nirstRData.XDatas.Length != nirstRData.YDatas.Length)   //确保X和Y的数量相同
                {
                    throw new Exception("不能识别的文件格式:" + nistRFile);
                }
                if (nirstRData.XDatas.Length >= 2000 || nirstRData.XDatas[0] != 0)
                {
                    throw new Exception("不是像素光谱文件:" + nistRFile);
                }

                int xLen = nirstRData.XDatas.Length;
                //先使用X校正后的系数将nirstRData中的X轴转换到波数
                double[] nirstRX = new double[xLen];
                double[] nirstRY = new double[xLen];
                for (int i = 0; i < xLen; i++)
                {
                    nirstRX[i] = ConvertRamanX(nirstRData.XDatas[i]);
                    nirstRY[i] = nirstRData.YDatas[i];
                }

                //对转换为波数的nirstR.spc进行三次样条曲线拟合
                alglib.spline1dinterpolant c;
                alglib.spline1dbuildcubic(nirstRX, nirstRY, out c);

                //对X轴进行插值
                double stepX       = nirstRX[xLen - 1] - nirstRX[xLen - 2];                           //波数间隔
                int    ramanPoints = (int)Math.Ceiling((nirstRX[xLen - 1] - nirstRX[0]) / stepX) + 1; //Raman谱的X轴点数

                //按照当前X轴校正后的坐标对Y轴重新插值
                double[] newNirstRX = new double[ramanPoints];
                double[] newNirstRY = new double[ramanPoints];
                for (int i = 0; i < newNirstRX.Length; i++)
                {
                    newNirstRX[i] = nirstRX[0] + i * stepX;
                    newNirstRY[i] = alglib.spline1dcalc(c, newNirstRX[i]);
                }

                //使用NIST2241证书中的多项式计算ycal = nistPoly/nistR, X轴的值为新计算得到的newNirstRX
                //double[] coe = new double[] { 9.71937E-02, 2.28325E-04, -5.86762E-08, 2.16023E-10, -9.77171E-14, 1.15596E-17 };
                double[] coe = yPara.coefficient;
                if (coe.Length != 6)
                {
                    throw new Exception("Y轴校正coefficient参数设置错误");
                }

                //计算多项式结果并除以当前Y值, 结果保存在newNirstRY中
                for (int i = 0; i < newNirstRY.Length; i++)
                {
                    newNirstRY[i] = (coe[0] + coe[1] * newNirstRX[i] + coe[2] * Math.Pow(newNirstRX[i], 2) +
                                     coe[3] * Math.Pow(newNirstRX[i], 3) + coe[4] * Math.Pow(newNirstRX[i], 4) + coe[5] * Math.Pow(newNirstRX[i], 5)) / newNirstRY[i];
                }

                //取ycal中y轴的最小值,将全部Y轴除以最小值,得到新的ycal光谱
                double minNirstRY = newNirstRY.Min();
                for (int i = 0; i < newNirstRY.Length; i++)
                {
                    newNirstRY[i] = newNirstRY[i] / minNirstRY;
                }

                //将计算得到的newNirstRX和newNirstRY写入光谱YCal.SPC
                nirstRData.XDatas = new float[newNirstRY.Length];
                nirstRData.YDatas = new float[newNirstRY.Length];
                for (int i = 0; i < newNirstRY.Length; i++)
                {
                    nirstRData.XDatas[i] = (float)newNirstRX[i];
                    nirstRData.YDatas[i] = (float)newNirstRY[i];
                }
                nirstRData.Parameter.firstX    = newNirstRX[0];
                nirstRData.Parameter.lastX     = newNirstRX[newNirstRX.Length - 1];
                nirstRData.Parameter.maxYValue = (float)newNirstRY.Max();
                nirstRData.Parameter.minYValue = (float)newNirstRY.Min();
                nirstRData.Parameter.dataCount = (uint)newNirstRX.Length;
                nirstRData.Parameter.time      = DateTime.Now;

                //将结果保存到共享文档下,Win7中是:C:\Users\Public\Documents\EFTIR\metage_raman\ycal.spc
                string yCalFile = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
                yCalFile = System.IO.Path.Combine(yCalFile, "eftir", "metage_raman", yPara.ycal_file);
                //yCalFile = "f:\\temp\\ycal.spc";
                if (Ai.Hong.CommonLibrary.SPCFile.SaveFile(yCalFile, nirstRData.YDatas, nirstRData.Parameter) == false)
                {
                    throw new Exception("保存文件出现错误:" + yCalFile);
                }

                WriteRamanSetting("YCalibration", "done", "1");
                yPara.Done = true;

                return(true);
            }
            catch (Exception ex)
            {
                CommonMethod.ErrorMsgBox(ex.Message);
                return(false);
            }
        }
        private void btnProcess_Click(object sender, RoutedEventArgs e)
        {
            if (curSelButton == btnOffsetCorrect || curSelButton == btnXCorrect)
            {
                SampleResultData data = new SampleResultData();
                Common.SettingFile.scanParameter para;
                if (curSelButton == btnOffsetCorrect)
                {
                    data.file = System.IO.Path.Combine(fileSavePath, "Offset" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".spc");
                    para      = Common.SettingData.settingData.offset_Correction.scanPara;
                }
                else
                {
                    data.file = System.IO.Path.Combine(fileSavePath, "xAxis" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".spc");
                    para      = Common.SettingData.settingData.x_Correction.scanPara;
                }

                para.saveRamanData = false;     //设置为Pixel扫描
                data.drugInfo      = null;      //设置为NULL,以便在扫描时不用分析
                Detect.ScanWindow dlg = new Detect.ScanWindow(data, para);
                dlg.Owner = App.Current.MainWindow;
                if (dlg.ShowDialog() == false)
                {
                    CommonMethod.ErrorMsgBox(dlg.ErrorString);
                    return;
                }

                //显示光谱(扫描得到的是_counts.spc)
                curScanedFile = new Ai.Hong.CommonLibrary.SpecFileFormat();
                if (curScanedFile.ReadFile(data.file) == false)
                {
                    CommonMethod.ErrorMsgBox("不能识别的文件格式:" + data.file);
                    return;
                }

                imgPrompt.Visibility = Visibility.Collapsed;

                if (curSelButton == btnOffsetCorrect)   //Offset校正
                {
                    graphicChart.Visibility = Visibility.Visible;
                    graphicChart.DrawGraphic(curScanedFile, System.Drawing.Color.Red);
                }
                else    //X轴校正
                {
                    imgXCalStandard.Visibility = Visibility.Visible;

                    //显示峰位图形
                    xCalgraphicChart.Visibility = Visibility.Visible;
                    xCalgraphicChart.DrawGraphic(curScanedFile, System.Drawing.Color.Red);

                    System.Windows.Point[] pt = new System.Windows.Point[SettingData.settingData.x_Correction.pixelPoint.Count];
                    for (int i = 0; i < SettingData.settingData.x_Correction.pixelPoint.Count; i++)
                    {
                        double newy;
                        pt[i].X = Common.SpectrumAlgorithm.PickPeak(curScanedFile.XDatas, curScanedFile.YDatas, SettingData.settingData.x_Correction.pixelPoint[i], 3, out newy);
                        pt[i].Y = newy;
                    }

                    xCalgraphicChart.DrawPeaks(pt, null, PickOnePeak);
                }
                stackXCalButton.Visibility    = Visibility.Visible;
                stackProcessButton.Visibility = Visibility.Collapsed;
            }
            else if (curSelButton == btnAllCal)
            {
                Calibration calDlg = new Calibration();
                calDlg.Owner = App.Current.MainWindow;
                calDlg.ShowDialog();
                btnCancel_Click(null, null);
            }
        }