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); }
/// <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; } }
//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); }
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); }
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; }
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); }