예제 #1
0
        public override XYData GetMassSpectrum(ScanSet scanset, double minMZ, double maxMZ)
        {
            Check.Require(scanset != null, "Can't get mass spectrum; inputted set of scans is null");
            Check.Require(scanset.IndexValues.Count > 0, "Can't get mass spectrum; no scan numbers inputted");

            var totScans = this.GetNumMSScans();

            var xvals = new double[0];
            var yvals = new double[0];

            if (scanset.IndexValues.Count == 1)            //this is the case of only wanting one MS spectrum
            {
                //TODO:  Old DeconTools reference!!
                this.RawData.GetSpectrum(scanset.IndexValues[0], ref xvals, ref yvals, false);
            }
            else
            {
                throw new NotImplementedException("Summing is not yet supported for ICR2LS_MS Data files.");
                //this.rawData.GetSummedSpectra(scanset.getLowestScanNumber(), scanset.getHighestScanNumber(), minMZ, maxMZ, ref xvals, ref yvals);
            }

            var xydata = new XYData();

            xydata.Xvalues = xvals;
            xydata.Yvalues = yvals;

            xydata = xydata.TrimData(minMZ, maxMZ);
            return(xydata);
        }
예제 #2
0
        /// <summary>
        /// Returns the mass spectrum for a specified LC ScanSet and a IMS ScanSet.
        /// </summary>
        /// <param name="lcScanSet"></param>
        /// <param name="imsScanSet"></param>
        /// <param name="minMZ"></param>
        /// <param name="maxMZ"></param>
        public override XYData GetMassSpectrum(ScanSet lcScanSet, ScanSet imsScanSet, double minMZ, double maxMZ)
        {
            Check.Require(imsScanSet.GetScanCount() > 0, string.Format(
                              "Cannot get spectrum. Number of scans in ScanSet ({0}) is 0", nameof(imsScanSet)));

            Check.Require(lcScanSet.GetScanCount() > 0, string.Format(
                              "Cannot get spectrum. Number of frames in FrameSet ({0}) is 0", nameof(lcScanSet)));

            var startFrameNumber = lcScanSet.GetLowestScanNumber();
            var endFrameNumber   = lcScanSet.GetHighestScanNumber();
            var startScanNumber  = imsScanSet.GetLowestScanNumber();
            var endScanNumber    = imsScanSet.GetHighestScanNumber();

            // TODO: If lowest and highest scan numbers are both 0, should we be summing the mass spectrum?

            var frameType = (UIMFData.FrameType)GetMSLevel(lcScanSet.PrimaryScanNumber);

            try
            {
                // Prior to January 2015 the SpectrumCache class in the UIMFReader used Dictionary<int, int> for ListOfIntensityDictionaries
                // This caused some datasets, e.g. EXP-Mix5_1um_pos_19Jan15_Columbia_DI, to run out of memory when caching 10 spectra
                // The UIMFLibrary now uses List<int, int>, which takes up less memory (at the expense having slower lookups by BinNumber, though this does not affect DeconTools' use of the UIMFLibrary)

                mReader.SpectraToCache           = 10;
                mReader.MaxSpectrumCacheMemoryMB = 750;

                mReader.GetSpectrum(
                    startFrameNumber, endFrameNumber, frameType,
                    startScanNumber, endScanNumber,
                    minMZ, maxMZ,
                    out var xVals, out var yVals);

                var xyData = new XYData();

                if (xVals == null || xVals.Length == 0)
                {
                    xyData.Xvalues = null;
                    xyData.Yvalues = null;
                    return(xyData);
                }

                xyData.Xvalues = xVals;
                xyData.Yvalues = yVals.Select <int, double>(i => i).ToArray();

                if (xyData.Xvalues[0] < minMZ || xyData.Xvalues[xyData.Xvalues.Length - 1] > maxMZ)
                {
                    xyData = xyData.TrimData(minMZ, maxMZ);
                }

                return(xyData);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error in UIMF GetMassSpectrum: " + ex.Message);
                throw;
            }
        }
예제 #3
0
        //NOTE: code duplication here... see BrukerRun too
        public override XYData GetMassSpectrum(DeconTools.Backend.Core.ScanSet scanSet, double minMZ, double maxMZ)
        {
            Check.Require(scanSet != null, "Can't get mass spectrum; inputted set of scans is null");
            Check.Require(scanSet.IndexValues.Count > 0, "Can't get mass spectrum; no scan numbers inputted");

            var totScans = this.GetNumMSScans();

            var xvals = new double[0];
            var yvals = new double[0];

            if (scanSet.IndexValues.Count == 1)            //this is the case of only wanting one MS spectrum
            {
                this.RawData.GetSpectrum(scanSet.IndexValues[0], ref xvals, ref yvals, false);
            }
            else    // need to sum spectra
            {
                //assume:  each scan has exactly same x values

                //get first spectrum
                this.RawData.GetSpectrum(scanSet.IndexValues[0], ref xvals, ref yvals, false);

                //
                var summedYvals = new double[xvals.Length];
                yvals.CopyTo(summedYvals, 0);

                for (var i = 1; i < scanSet.IndexValues.Count; i++)
                {
                    this.RawData.GetSpectrum(scanSet.IndexValues[i], ref xvals, ref yvals, false);

                    for (var n = 0; n < xvals.Length; n++)
                    {
                        summedYvals[n] += yvals[n];
                    }
                }

                yvals = summedYvals;
            }

            var xydata = new XYData();

            xydata.Xvalues = xvals;
            xydata.Yvalues = yvals;

            xydata = xydata.TrimData(minMZ, maxMZ);

            return(xydata);
        }
예제 #4
0
        public override XYData GetMassSpectrum(DeconTools.Backend.Core.ScanSet scanset, double minMZ, double maxMZ)
        {
            var xydata = new XYData();

            try
            {
                xydata = loadDataFromFile(this.Filename);
            }
            catch (Exception ex)
            {
                throw new System.IO.IOException("There was an error reading file " + Utilities.DiagnosticUtilities.GetFullPathSafe(this.Filename) + "\n\n" + ex.Message);
            }

            xydata = xydata.TrimData(minMZ, maxMZ);

            return(xydata);
        }
예제 #5
0
        protected virtual XYData TrimData(XYData xyData, double targetVal, double leftTrimAmount, double rightTrimAmount)
        {
            if (xyData == null)
            {
                return(xyData);
            }

            if (xyData.Xvalues == null || xyData.Xvalues.Length == 0)
            {
                return(xyData);
            }


            var leftTrimValue  = targetVal - leftTrimAmount;
            var rightTrimValue = targetVal + rightTrimAmount;


            return(xyData.TrimData(leftTrimValue, rightTrimValue, 0.1));
        }
        private void CreateObservedIsotopicProfilePlot()
        {
            XYData xydata = new XYData();

            if (Workflow.MassSpectrumXYData == null)
            {
                xydata.Xvalues = Workflow.MassSpectrumXYData == null ? new double[] { 400, 1500 } : Workflow.MassSpectrumXYData.Xvalues;
                xydata.Yvalues = Workflow.MassSpectrumXYData == null ? new double[] { 0, 0 } : Workflow.MassSpectrumXYData.Yvalues;
            }
            else
            {
                xydata.Xvalues = Workflow.MassSpectrumXYData.Xvalues;
                xydata.Yvalues = Workflow.MassSpectrumXYData.Yvalues;

                xydata = xydata.TrimData(Workflow.Result.Target.MZ - 100, Workflow.Result.Target.MZ + 100);
            }

            if (Workflow.Result.IsotopicProfile != null)
            {
                MsGraphMaxY = Workflow.Result.IsotopicProfile.getMostIntensePeak().Height;
            }
            else
            {
                MsGraphMaxY = (float)xydata.getMaxY();
            }

            string msGraphTitle = Workflow.Result.Target.Code + "; m/z " +
                                  Workflow.Result.Target.MZ.ToString("0.0000") + "; z=" +
                                  Workflow.Result.Target.ChargeState;

            PlotModel plotModel = new PlotModel(msGraphTitle);
            plotModel.TitleFontSize = 11;
            plotModel.Padding = new OxyThickness(0);
            plotModel.PlotMargins = new OxyThickness(0);
            plotModel.PlotAreaBorderThickness = 0;

            var series = new OxyPlot.Series.LineSeries();
            series.MarkerSize = 1;
            series.Color = OxyColors.Black;
            for (int i = 0; i < xydata.Xvalues.Length; i++)
            {
                series.Points.Add(new DataPoint(xydata.Xvalues[i], xydata.Yvalues[i]));
            }

            var xAxis = new LinearAxis(AxisPosition.Bottom, "m/z");
            xAxis.Minimum = MsGraphMinX;
            xAxis.Maximum = MsGraphMaxX;

            var yAxis = new LinearAxis(AxisPosition.Left, "Intensity");
            yAxis.Minimum = 0;
            yAxis.AbsoluteMinimum = 0;
            yAxis.Maximum = MsGraphMaxY + MsGraphMaxY * 0.05;
            yAxis.StringFormat = "0.0E0";
            //yAxis.Maximum = maxIntensity + (maxIntensity * .05);
            //yAxis.AbsoluteMaximum = maxIntensity + (maxIntensity * .05);
            yAxis.AxisChanged += OnYAxisChange;

            xAxis.AxislineStyle = LineStyle.Solid;
            xAxis.AxislineThickness = 1;
            yAxis.AxislineStyle = LineStyle.Solid;
            yAxis.AxislineThickness = 1;

            plotModel.Series.Add(series);

            plotModel.Axes.Add(xAxis);
            plotModel.Axes.Add(yAxis);

            ObservedIsoPlot = plotModel;
        }
예제 #7
0
        public double GetFit(XYData theorXYData, XYData observedXYData, double minIntensityForScore, out int ionCountUsed, double offset = 0)
        {
            Check.Require(theorXYData != null && theorXYData.Xvalues != null && theorXYData.Yvalues != null,
                          "AreaFitter failed. Theoretical XY data is null");

            Check.Require(observedXYData != null & observedXYData.Xvalues != null && observedXYData.Yvalues != null,
                          "AreaFitter failed. Observed XY data is null");
            //Check.Require(minIntensityForScore >= 0 && minIntensityForScore <= 100, "MinIntensityForScore should be between 0 and 100");


            ionCountUsed = 0;

            double sumOfSquaredDiff        = 0;
            double sumOfSquaredTheorIntens = 0;
            var    xmin = theorXYData.Xvalues[0] + offset;
            var    xmax = theorXYData.Xvalues.Max() + offset;


            var trimmedObservedXYData = observedXYData.TrimData(xmin, xmax);
            //XYData trimmedObservedXYData = observedXYData;

            //trimmedObservedXYData.Display();
            //theorXYData.Display();

            var interpolatedValues = new List <double>();
            var theoreticalValues  = new List <double>();


            for (var i = 0; i < theorXYData.Xvalues.Length; i++)
            {
                if (theorXYData.Yvalues[i] >= minIntensityForScore)
                {
                    var currentTheorMZ = theorXYData.Xvalues[i] + offset;

                    var indexOfClosest = MathUtils.GetClosest(trimmedObservedXYData.Xvalues, currentTheorMZ, 0.1);

                    if (indexOfClosest == -1)
                    {
                        //Console.WriteLine(i + "\t" + currentTheorMZ);
                        return(1);
                    }

                    //findout if closest is above or below
                    var closestIsBelow = (trimmedObservedXYData.Xvalues[indexOfClosest] < currentTheorMZ);

                    double mz1        = 0;
                    double mz2        = 0;
                    double intensity1 = 0;
                    double intensity2 = 0;

                    if (closestIsBelow)
                    {
                        mz1        = trimmedObservedXYData.Xvalues[indexOfClosest];
                        intensity1 = trimmedObservedXYData.Yvalues[indexOfClosest];
                        if (indexOfClosest == trimmedObservedXYData.Xvalues.Length - 1)   //if at the end of the XY array; this should be very rare
                        {
                            mz2        = mz1;
                            intensity2 = intensity1;
                        }
                        else
                        {
                            mz2        = trimmedObservedXYData.Xvalues[indexOfClosest + 1];
                            intensity2 = trimmedObservedXYData.Yvalues[indexOfClosest + 1];
                        }
                    }
                    else  // closest point is above the targetMZ; so get the mz of the point below
                    {
                        mz2        = trimmedObservedXYData.Xvalues[indexOfClosest];
                        intensity2 = trimmedObservedXYData.Yvalues[indexOfClosest];
                        if (indexOfClosest == 0)        //if at the beginning of the XY array  (rare)
                        {
                            mz1        = mz2;
                            intensity1 = intensity2;
                        }
                        else
                        {
                            mz1        = trimmedObservedXYData.Xvalues[indexOfClosest - 1];
                            intensity1 = trimmedObservedXYData.Yvalues[indexOfClosest - 1];
                        }
                    }


                    var interopolatedIntensity = MathUtils.getInterpolatedValue(mz1, mz2, intensity1, intensity2, currentTheorMZ);

                    interpolatedValues.Add(interopolatedIntensity);
                    theoreticalValues.Add(theorXYData.Yvalues[i]);

                    //double normalizedObservedIntensity = interopolatedIntensity / maxIntensity;

                    //double normalizedTheorIntensity = theorXYData.Yvalues[i]/maxTheorIntensity;

                    //double diff = normalizedTheorIntensity - normalizedObservedIntensity;

                    //sumOfSquaredDiff += diff * diff;

                    //sumOfSquaredTheorIntens += normalizedTheorIntensity * normalizedTheorIntensity;
                }
            }

            var maxTheoreticalIntens = getMax(theoreticalValues);
            var maxObservIntens      = getMax(interpolatedValues);


            for (var i = 0; i < theoreticalValues.Count; i++)
            {
                var normalizedObservedIntensity = interpolatedValues[i] / maxObservIntens;

                var normalizedTheorIntensity = theoreticalValues[i] / maxTheoreticalIntens;

                var diff = normalizedTheorIntensity - normalizedObservedIntensity;

                sumOfSquaredDiff += diff * diff;

                sumOfSquaredTheorIntens += normalizedTheorIntensity * normalizedTheorIntensity;
            }

            if (theoreticalValues.Count == 0 || Math.Abs(sumOfSquaredTheorIntens) < double.Epsilon)
            {
                return(-1);
            }

            //StringBuilder sb = new StringBuilder();
            //TestUtilities.GetXYValuesToStringBuilder(sb, theoreticalValues.ToArray(), interpolatedValues.ToArray());
            //Console.Write(sb.ToString());

            var fitScore = sumOfSquaredDiff / sumOfSquaredTheorIntens;

            ionCountUsed = theoreticalValues.Count;

            // Future possibility (considered in January 2014):
            // Normalize the fit score by the number of theoretical ions
            // fitScore /= ionCountUsed;

            return(fitScore);
        }
        private void GetMassSpectrumForCurrentResult()
        {
            if (ObservedIsoPlot==null)
            {
                ObservedIsoPlot=  CreateObservedIsoPlot();
            }

            XYData xydata = new XYData();

            if (CurrentResultInfo.MassSpectrumXYData == null)
            {
                xydata.Xvalues = CurrentResultInfo.MassSpectrumXYData == null ? new double[] { 400, 1500 } : CurrentResultInfo.MassSpectrumXYData.Xvalues;
                xydata.Yvalues = CurrentResultInfo.MassSpectrumXYData == null ? new double[] { 0, 0 } : CurrentResultInfo.MassSpectrumXYData.Yvalues;
            }
            else
            {
                xydata.Xvalues = CurrentResultInfo.MassSpectrumXYData.Xvalues;
                xydata.Yvalues = CurrentResultInfo.MassSpectrumXYData.Yvalues;

                xydata = xydata.TrimData(CurrentResultInfo.Result.Target.MZ - 2, CurrentResultInfo.Result.Target.MZ + 8);
            }

            double msGraphMaxY;
            if (CurrentResultInfo.Result.IsotopicProfile != null)
            {
                msGraphMaxY = CurrentResultInfo.Result.IsotopicProfile.getMostIntensePeak().Height;
            }
            else
            {
                msGraphMaxY = (float)xydata.getMaxY();
            }

            string msGraphTitle = "TargetID= " + CurrentResultInfo.Result.Target.ID +   "; m/z " + CurrentResultInfo.Result.Target.MZ.ToString("0.0000") + "; z=" +
                                  CurrentResultInfo.Result.Target.ChargeState + "; Scan= " + CurrentResultInfo.Result.ScanSet??"[No scan selected]";

            ObservedIsoPlot.Series.Clear();

            var series = new OxyPlot.Series.LineSeries();
            series.MarkerSize = 1;
            series.Color = OxyColors.Black;
            for (int i = 0; i < xydata.Xvalues.Length; i++)
            {
                series.Points.Add(new DataPoint(xydata.Xvalues[i], xydata.Yvalues[i]));
            }

            ObservedIsoPlot.Axes[1].Maximum = msGraphMaxY + msGraphMaxY * 0.05;
            ObservedIsoPlot.Series.Add(series);
        }