Beispiel #1
0
        private void LoadData(string path, FileType fileType)
        {
            if (fileType == FileType.DeconvolutionTSV)
            {
                System.IO.StreamReader reader = new System.IO.StreamReader(path);
                string line;
                int    lineNum = 1;

                while (reader.Peek() > 0)
                {
                    line = reader.ReadLine();
                    List <IsotopicEnvelope> envs = new List <IsotopicEnvelope>();

                    if (lineNum != 1)
                    {
                        var parsedLine = line.Split('\t');
                        var mass       = double.Parse(parsedLine[0]);
                        var apexRt     = double.Parse(parsedLine[10]);

                        var envelopes = parsedLine[17].Split(new string[] { "[", "]" }, StringSplitOptions.RemoveEmptyEntries);
                        foreach (var envelope in envelopes)
                        {
                            var    split  = envelope.Split(new string[] { "|", "(", ")" }, StringSplitOptions.RemoveEmptyEntries);
                            int    charge = int.Parse(split[0]);
                            double rt     = double.Parse(split[1]);
                            int    scan   = int.Parse(split[2]);
                            List <MassSpectralPeak> peaks = new List <MassSpectralPeak>();

                            for (int i = 3; i < split.Length; i++)
                            {
                                string[]         sp   = split[i].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                                MassSpectralPeak peak = new MassSpectralPeak(double.Parse(sp[0]), double.Parse(sp[1]));
                                peaks.Add(peak);
                            }

                            IsotopicEnvelope env = new IsotopicEnvelope(rt, charge, peaks);
                            envs.Add(env);
                        }

                        var gsdf = envs.GroupBy(p => p.charge).Where(v => v.Count() > 1);

                        if (gsdf.Any())
                        {
                            var deconvolutedFeature = new ChromatographicPeak(envs, mass, apexRt);
                            if (deconvolutedFeature.GetSignalToBaseline() > 2.0)
                            {
                                DeconvolutedFeatures.Add(deconvolutedFeature);
                            }
                        }
                    }

                    lineNum++;
                }

                reader.Close();
            }
            else if (fileType == FileType.MetaMorpheusPsmTsv)
            {
                System.IO.StreamReader reader = new System.IO.StreamReader(path);
                string line;
                int    lineNum = 1;

                while (reader.Peek() > 0)
                {
                    line = reader.ReadLine();
                    List <IsotopicEnvelope> envs = new List <IsotopicEnvelope>();

                    if (lineNum != 1)
                    {
                        var parsedLine = line.Split('\t');
                    }
                }
            }
            else if (fileType == FileType.RawFile)
            {
                string ext = System.IO.Path.GetExtension(path).ToUpperInvariant();

                if (ext.Equals(".RAW"))
                {
                    rawFile = ThermoStaticData.LoadAllStaticData(path);
                }
                if (ext.Equals(".MZML"))
                {
                    rawFile = Mzml.LoadAllStaticData(path);
                }
                else
                {
                    throw new Exception("Cannot read file format: " + ext);
                }
            }
            else
            {
                throw new Exception("Cannot read file " + path);
            }
        }
Beispiel #2
0
        private void DrawChromatogram(ChromatographicPeak peak, Canvas canvas)
        {
            if (chargeToColor == null)
            {
                var converter = new BrushConverter();
                chargeToColor = new Dictionary <int, SolidColorBrush>();
                chargeToColor.Add(0, Brushes.Maroon);

                chargeToColor.Add(1, Brushes.DeepPink);
                chargeToColor.Add(2, Brushes.Purple);
                chargeToColor.Add(3, Brushes.Blue);
                chargeToColor.Add(4, Brushes.Green);
                chargeToColor.Add(5, Brushes.Gold);
                chargeToColor.Add(6, Brushes.Orange);
                //chargeToColor.Add(7, Brushes.DarkCyan);
                //chargeToColor.Add(8, Brushes.DimGray);
                //chargeToColor.Add(9, Brushes.Firebrick);
                //chargeToColor.Add(10, Brushes.LimeGreen);

                chargeToColor.Add(int.MinValue, Brushes.Black);
            }

            List <Tuple <double, double> >[] dataPointsForEachCharge = new List <Tuple <double, double> > [peak.isotopicEnvelopes.Max(p => p.charge)];

            double xAxisLowerbound = double.MaxValue;
            double xAxisUpperbound = 0;
            double yAxisLowerbound = 0;
            double yAxisUpperbound = 0;

            for (int zIndex = 0; zIndex < dataPointsForEachCharge.Length; zIndex++)
            {
                int z = zIndex + 1;

                dataPointsForEachCharge[zIndex] = new List <Tuple <double, double> >();
                var g = peak.isotopicEnvelopes.Where(p => p.charge == z).OrderBy(p => p.retentionTime).ToList();

                if (g.Any())
                {
                    double rt = g.Min(p => p.retentionTime);
                    if (rt < xAxisLowerbound)
                    {
                        xAxisLowerbound = rt;
                    }
                    rt = g.Max(p => p.retentionTime);
                    if (rt > xAxisUpperbound)
                    {
                        xAxisUpperbound = rt;
                    }

                    double inten = g.Max(p => p.intensity);
                    if (inten > yAxisUpperbound)
                    {
                        yAxisUpperbound = inten;
                    }
                }

                foreach (var env in g)
                {
                    dataPointsForEachCharge[zIndex].Add(new Tuple <double, double>(env.retentionTime, env.intensity));
                }
            }

            canvas.Children.Clear();

            if (xAxisUpperbound - xAxisLowerbound == 0)
            {
                return;
            }

            double xAxisStep = (xAxisUpperbound - xAxisLowerbound) / 5;
            double yAxisStep = (yAxisUpperbound - yAxisLowerbound) / 5;

            DrawGraphAxes(canvas, xAxisLowerbound, xAxisUpperbound, xAxisStep, yAxisLowerbound, yAxisUpperbound, yAxisStep, 20, "{0:0.00}", "0.0E0");

            int offset = 0;
            // Make some data sets.
            bool observedSomethingYet = false;

            for (int j = 0; j < dataPointsForEachCharge.Length; j++)
            {
                PointCollection points = new PointCollection();

                var dataPoints = dataPointsForEachCharge[j];
                if (dataPoints.Any())
                {
                    observedSomethingYet = true;
                }

                if (observedSomethingYet)
                {
                    for (int i = 0; i < dataPoints.Count; i++)
                    {
                        Point p = new Point(dataPoints[i].Item1, dataPoints[i].Item2);
                        var   transformedPoint = WtoD(p);
                        points.Add(transformedPoint);
                    }

                    Polyline polyline = new Polyline();
                    polyline.StrokeThickness = lineStroke;
                    SolidColorBrush brushColor;
                    if (chargeToColor.TryGetValue(j + 1, out brushColor))
                    {
                    }
                    else
                    {
                        brushColor = chargeToColor[int.MinValue];
                    }

                    polyline.Stroke = brushColor;
                    polyline.Points = points;

                    canvas.Children.Add(polyline);

                    var rectangle = new Rectangle();
                    rectangle.Stroke = brushColor;
                    rectangle.Fill   = brushColor;
                    rectangle.Height = 4;
                    rectangle.Width  = 4;
                    Canvas.SetTop(rectangle, offset + 5);
                    Canvas.SetLeft(rectangle, canvas.ActualWidth - 45);

                    TextBlock textBlock = new TextBlock();
                    textBlock.FontSize = fontSize;
                    textBlock.Text     = "z=" + (j + 1) + "; " + dataPoints.Count;
                    Canvas.SetTop(textBlock, offset + 1);
                    Canvas.SetLeft(textBlock, canvas.ActualWidth - 39);

                    offset += 12;

                    canvas.Children.Add(rectangle);
                    canvas.Children.Add(textBlock);
                }
            }

            TextBlock sbr = new TextBlock();

            sbr.Text = peak.GetSignalToBaseline().ToString("F1");
            Canvas.SetTop(sbr, 0);
            Canvas.SetLeft(sbr, 0);
            canvas.Children.Add(sbr);

            TextBlock peakcount = new TextBlock();

            peakcount.Text = DeconvolutedFeatures.Count.ToString();
            Canvas.SetTop(peakcount, 20);
            Canvas.SetLeft(peakcount, 0);
            canvas.Children.Add(peakcount);
        }
Beispiel #3
0
        private void DrawHeatmapThing(ChromatographicPeak peak, Canvas canvas)
        {
            var allPeaks = peak.isotopicEnvelopes.SelectMany(p => p.peaks).ToList();
            List <Tuple <double, int, double> > datapoints = new List <Tuple <double, int, double> >();

            double xAxisLowerbound = peak.isotopicEnvelopes.Min(p => p.retentionTime);
            double xAxisUpperbound = peak.isotopicEnvelopes.Max(p => p.retentionTime);
            double yAxisLowerbound = -1;
            double yAxisUpperbound = 20;
            double xAxisStep       = (xAxisUpperbound - xAxisLowerbound) / 5;
            double yAxisStep       = 1;

            if (xAxisLowerbound == xAxisUpperbound)
            {
                xAxisLowerbound--;
                xAxisUpperbound++;
            }

            canvas.Children.Clear();
            DrawGraphAxes(canvas, xAxisLowerbound, xAxisUpperbound, xAxisStep, yAxisLowerbound, yAxisUpperbound, yAxisStep, 20, "{0:0.00}", "F0");


            foreach (var env in peak.isotopicEnvelopes)
            {
                foreach (var msPeak in env.peaks)
                {
                    double peakMass = ClassExtensions.ToMass(msPeak.mz, env.charge);
                    int    massDiff = (int)Math.Round(peakMass - peak.mass, 0);

                    datapoints.Add(new Tuple <double, int, double>(env.retentionTime, massDiff, msPeak.intensity / env.charge));
                }
            }

            if (intensityToColor == null)
            {
                intensityToColor = new Dictionary <double, SolidColorBrush>();
                intensityToColor.Add(0.0, Brushes.Blue);
                intensityToColor.Add(0.2, Brushes.Violet);
                intensityToColor.Add(0.4, Brushes.Green);
                intensityToColor.Add(0.6, Brushes.Gold);
                intensityToColor.Add(0.8, Brushes.Orange);
                intensityToColor.Add(1.0, Brushes.Red);
            }

            // Make some data sets.
            PointCollection points = new PointCollection();
            List <Tuple <double, double, double> > xyz = new List <Tuple <double, double, double> >();

            var dataGroupedByMassDiff = datapoints.GroupBy(p => p.Item2);

            foreach (var massDiff in dataGroupedByMassDiff)
            {
                var group = massDiff.ToList().GroupBy(v => v.Item1);

                foreach (var g in group)
                {
                    var h = g.ToList();

                    double intensityHere = h.Sum(v => v.Item3);

                    xyz.Add(new Tuple <double, double, double>(h.First().Item1, h.First().Item2, intensityHere));
                }
            }

            double maxIntensity = xyz.Max(p => p.Item3);

            var timepoints = xyz.GroupBy(p => p.Item1).OrderBy(v => v.Key);

            double diff                    = (timepoints.Last().First().Item1 - timepoints.First().First().Item1);
            int    numtimepoints           = timepoints.Count();
            Point  tick1W                  = WtoD(new Point(0, 0));
            Point  tick2W                  = WtoD(new Point(diff / numtimepoints, 0));
            double widthOfHeatmapRectangle = tick2W.X - tick1W.X;

            double summedMaxColumn = timepoints.Max(p => p.Sum(v => v.Item3));

            foreach (var timepointIsotopes in timepoints)
            {
                var list = timepointIsotopes.ToList();

                double maxOfColumn = list.Max(p => p.Item3);

                foreach (var point in timepointIsotopes)
                {
                    Point p = new Point(point.Item1, point.Item2);
                    var   transformedPoint = WtoD(p);
                    points.Add(transformedPoint);

                    var rectangle = new Rectangle();

                    var dfg = GetHeatmapColor(point.Item3 / maxOfColumn);
                    //double opacity = (byte)(255 * (list.Sum(g => g.Item3) / summedMaxColumn));

                    SolidColorBrush brush = new SolidColorBrush(Color.FromArgb(255, (byte)dfg.Item1, (byte)dfg.Item2, (byte)dfg.Item3));

                    rectangle.Stroke = brush;
                    rectangle.Fill   = brush;
                    rectangle.Height = 4;
                    rectangle.Width  = widthOfHeatmapRectangle;
                    Canvas.SetLeft(rectangle, transformedPoint.X - rectangle.Width / 2);
                    Canvas.SetTop(rectangle, transformedPoint.Y - rectangle.Height / 2);
                    canvas.Children.Add(rectangle);

                    //TextBlock ratio = new TextBlock();
                    //ratio.Text = ((point.Item3 / maxOfColumn) * 100).ToString("F0");
                    //ratio.FontSize = 8;
                    //Canvas.SetLeft(ratio, transformedPoint.X - rectangle.Width / 2);
                    //Canvas.SetTop(ratio, transformedPoint.Y - rectangle.Height / 2 - 2);
                    //canvas.Children.Add(ratio);
                }
            }
        }