private List <ScanNETPair> PrepareNetAlignmentDataForLoessSmoothing()
        {
            var scanNetDictionary = new SortedDictionary <decimal, double>();

            foreach (var iqResult in IqResultsForNetAlignment)
            {
                decimal lcScan;
                if (iqResult.ChromPeakSelected == null)
                {
                    lcScan = iqResult.LcScanObs;
                }
                else
                {
                    lcScan = (decimal)Math.Round(iqResult.ChromPeakSelected.XValue, 2);
                }

                var yval = iqResult.Target.ElutionTimeTheor;

                if (!scanNetDictionary.ContainsKey(lcScan))
                {
                    scanNetDictionary.Add(lcScan, yval);
                }
            }


            var scanNETPairs = new List <ScanNETPair>();

            foreach (var pair in scanNetDictionary)
            {
                var scanNETPair = new ScanNETPair((double)pair.Key, pair.Value);
                scanNETPairs.Add(scanNETPair);
            }

            return(scanNETPairs);
        }
        public NetAlignmentInfo DoNetAlignment(bool recollectResultsIfAlreadyPresent = false)
        {
            var needToProcessResults = (recollectResultsIfAlreadyPresent ||
                                        (IqResultsForAlignment == null || IqResultsForAlignment.Count == 0));

            if (needToProcessResults)
            {
                Execute(Targets);
                IqResultsForAlignment = FilterAlignmentResults();
            }

            IqResultsForNetAlignment = UpdateMsgfTargetsWithDatabaseNetValues(IqResultsForAlignment);

            IqLogger.Log.Info("Applying Loess smoothing to NET alignment data. LoessBandwidth= " + LoessBandwidthNetAlignment);

            var netAlignmentDataForLoess = PrepareNetAlignmentDataForLoessSmoothing();



            var iterationsForNetAlignment = 2;

            var loessInterpolatorForNetAlignment = new LoessInterpolator(LoessBandwidthNetAlignment, iterationsForNetAlignment);
            var loessSmoothedData = new XYData();

            loessSmoothedData.Xvalues = netAlignmentDataForLoess.Select(p => p.Scan).ToArray();
            loessSmoothedData.Yvalues = loessInterpolatorForNetAlignment.Smooth(netAlignmentDataForLoess.Select(p => p.Scan).ToArray(),
                                                                                netAlignmentDataForLoess.Select(p => p.NET).ToArray());

            var scanToNetVals = new List <ScanNETPair>();

            for (var i = 0; i < loessSmoothedData.Xvalues.Length; i++)
            {
                var xval = loessSmoothedData.Xvalues[i];
                var yval = loessSmoothedData.Yvalues[i];

                if (!double.IsNaN(yval))
                {
                    var scanNETPair = new ScanNETPair(xval, yval);
                    scanToNetVals.Add(scanNETPair);
                }
            }

            var netAlignmentInfo = new NetAlignmentInfoBasic(Run.MinLCScan, Run.MaxLCScan);

            netAlignmentInfo.SetScanToNETAlignmentData(scanToNetVals);


            IqLogger.Log.Info("NET alignment complete using " + scanToNetVals.Count + " data points.");

            NetAlignmentInfo = netAlignmentInfo;

            return(netAlignmentInfo);
        }