Ejemplo n.º 1
0
        public async Task FitSingleProfile(FittingProfile profile)
        {
            var d_data = WideScan.GetRestrictedData(profile.RangeBegin, profile.RangeEnd).Differentiate(_differentialWindow);

            var fitting_results = new FittingProfile.FittingResult();

            // キーはサイクル数.
            EqualIntervalData target_data = new EqualIntervalData();

            // 1.まず,フィッティングの計算を行う.
            {
                #region  固定参照スペクトルを取得する。(一時的にコメントアウト中)

                /*
                 * List<decimal> fixed_data = new List<decimal>();
                 * if (FixedSpectra.Count > 0)
                 * {
                 *      var v_data = await FixedSpectra.ForEachAsync(
                 *              async sp => await sp.GetShiftedDataAsync(d_data.Parameter, 3), 10);
                 *
                 *      for (int j = 0; j < v_data.First().Count; j++)
                 *      {
                 *              fixed_data.Add(v_data.Sum(one => one[j]));
                 *      }
                 * }
                 */
                #endregion

                /// フィッティング対象となるデータ。すなわち、もとのデータからFixされた分を差し引いたデータ。
                //var target_data = fixed_data.Count > 0 ? data.Substract(fixed_data) : data;
                // なんだけど、とりあえずはFixedを考慮しない。
                target_data = d_data.Data;

                //fitting_tasks.Add(i, profile.FitOneCycle(i, target_data[i], d_data.Parameter));
                fitting_results = profile.FitOneCycle(-1, target_data, d_data.Parameter);
            }

            // 2.その後に,チャート出力を行う?

            Gnuplot charts = await Output(d_data.Parameter, profile, target_data, fitting_results);


            // pltファイルも出力してみる。
            using (var writer = new StreamWriter(GetCsvFileName(profile.Name, -1) + ".plt"))
            {
                await charts.OutputPltFileAsync(writer);
            }
            // チャートを描画する。
            await charts.Draw();
        }
Ejemplo n.º 2
0
        // (0.1.0)1つのProfileについてのみフィッティングを行う.
        #region *1つのProfileに対してフィッティングを行う(FitSingleProfile)
        public async Task FitSingleProfile(FittingProfile profile)
        {
            // profileがBaseROIを持つのではなく,ここでBaseとなるROIを決定するようにしてみた.

            // ★一応,範囲から推測するのをベースにするけど,
            // ★ROIの名前からでも指定できるようにするのがいいのでは?

            // ProfileのRangeを包含するROIを探す.
            var baseROI = FindROI(profile);

            var d_data = baseROI.Restrict(profile.RangeBegin, profile.RangeEnd)
                         .Differentiate(3);

            //var fitting_tasks = new Dictionary<int, Task<FittingProfile.FittingResult>>();
            var fitting_results = new Dictionary <int, FittingProfile.FittingResult>();

            // キーはサイクル数.
            Dictionary <int, EqualIntervalData> target_data = new Dictionary <int, EqualIntervalData>();

            // 1.まず,フィッティングの計算を行う.
            foreach (int i in FittingCondition.TargetCycles)
            {
                #region  固定参照スペクトルを取得する。(一時的にコメントアウト中)

                /*
                 * List<decimal> fixed_data = new List<decimal>();
                 * if (FixedSpectra.Count > 0)
                 * {
                 *      var v_data = await FixedSpectra.ForEachAsync(
                 *              async sp => await sp.GetShiftedDataAsync(d_data.Parameter, 3), 10);
                 *
                 *      for (int j = 0; j < v_data.First().Count; j++)
                 *      {
                 *              fixed_data.Add(v_data.Sum(one => one[j]));
                 *      }
                 * }
                 */
                #endregion

                /// フィッティング対象となるデータ。すなわち、もとのデータからFixされた分を差し引いたデータ。
                //var target_data = fixed_data.Count > 0 ? data.Substract(fixed_data) : data;
                // なんだけど、とりあえずはFixedを考慮しない。
                target_data[i] = d_data.Data[i];

                fitting_results.Add(i, profile.FitOneCycle(i, target_data[i], d_data.Parameter));
            }

            // 2.その後に,チャート出力を行う?

            //Dictionary<int, Gnuplot> charts = new Dictionary<int, Gnuplot>();
            Dictionary <int, Task <Gnuplot> > gnuplot_tasks = new Dictionary <int, Task <Gnuplot> >();
            foreach (int i in FittingCondition.TargetCycles)
            {
                gnuplot_tasks[i] = Output(i, d_data.Parameter, profile, target_data[i], fitting_results[i]);
            }
            await Task.WhenAll(gnuplot_tasks.Values.ToArray());

            Dictionary <int, Gnuplot> charts = new Dictionary <int, Gnuplot>();
            foreach (var task in gnuplot_tasks)
            {
                charts[task.Key] = task.Value.Result;
            }

            // 全てのchartで共通の軸範囲を使用する.
            Range x_range = Range.Union(charts.Select(gnuplot => gnuplot.Value.XAxis.Range).ToArray());
            Range y_range = Range.Union(charts.Select(gnuplot => gnuplot.Value.YAxis.Range).ToArray());
            //Range x_range = Range.Union(charts.Select(gnuplot => gnuplot.Value.Result.XAxis.Range).ToArray());
            //Range y_range = Range.Union(charts.Select(gnuplot => gnuplot.Value.Result.YAxis.Range).ToArray());

            Parallel.ForEach(charts.Keys,
                             async(i) =>
            {
                charts[i].DefineXAxis(x_range);
                charts[i].DefineYAxis(y_range);
                //charts[i].Result.SetXAxis(x_range);
                //charts[i].Result.SetYAxis(y_range);

                // pltファイルも出力してみる。
                using (var writer = new StreamWriter(GetCsvFileName(i, profile.Name) + ".plt"))
                {
                    await charts[i].OutputPltFileAsync(writer);
                    //await charts[i].Result.OutputPltFileAsync(writer);
                }
                // チャートを描画する。
                await charts[i].Draw();
                //await charts[i].Result.Draw();
            }
                             );
        }