示例#1
0
        public static Spectra Import(string filenameMSMS, string filenameTracks, DBOptions dbOptions)
        {
            Spectra spectra = new Spectra();
            vsCSV   csv     = new vsCSV(filenameMSMS);

            if (csv.LINES_LIST.Count == 0 || csv.LINES_LIST[0].CompareTo(ProductSpectrum.TITLE) != 0)
            {
                return(null);
            }
            for (int i = 1; i < csv.LINES_LIST.Count; i++)
            {
                string[] splits  = csv.LINES_LIST[i].Split(vsCSV._Generic_Separator);
                double   mz      = double.Parse(splits[3]);
                int      charge  = int.Parse(splits[5]);
                int      nbPeaks = int.Parse(splits[9]);
                GraphML_List <MsMsPeak> peaks = new GraphML_List <MsMsPeak>(nbPeaks);
                i++;
                for (int j = 0; j < nbPeaks; i++, j++)
                {
                    try
                    {
                        string[] splitPeaks = csv.LINES_LIST[i].Split('\t');
                        if (splitPeaks.Length > 2)
                        {
                            peaks.Add(new MsMsPeak(double.Parse(splitPeaks[0]), double.Parse(splitPeaks[1]), int.Parse(splitPeaks[2])));
                        }
                        else
                        {
                            peaks.Add(new MsMsPeak(double.Parse(splitPeaks[0]), double.Parse(splitPeaks[1]), 0));
                        }
                    }
                    catch (Exception)
                    {
                        dbOptions.ConSole.WriteLine("Error parsing line : " + csv.LINES_LIST[i]);
                    }
                }
                spectra.AddMSMS(new ProductSpectrum(int.Parse(splits[0]), double.Parse(splits[1]), splits[2], mz, double.Parse(splits[4]), charge, Proteomics.Utilities.Numerics.MassFromMZ(mz, charge), peaks, double.Parse(splits[8]), double.Parse(splits[10]), double.Parse(splits[11])));
            }
            if (!string.IsNullOrEmpty(filenameTracks))
            {
                spectra.tracks = Tracks.Import(filenameTracks, dbOptions);
            }
            return(spectra);
        }
示例#2
0
        private static Tracks ComputeSpectraTracks(Spectra spectra, DBOptions options, string outputFilename, int missingScan, int centroid, int minPeaks, double valleyFactor, MaxQuant.CentroidPosition centroidMethod)
        {
            //Trail.RemoveFinished(ref trails, spectra, -1);
            double[] centerMassArray;
            float[]  centerMassErrorArray;
            float[]  intensityArray;
            float[]  minTimeArray;
            float[]  maxTimeArray;
            long[]   filePosArray;
            //TODO Cycle values to optimize missing scans and centroid values

            string file = null;

            if (options.WriteMaxQuantPeakFile)
            {
                file = options.OutputFolder + vsCSV.GetFileName_NoExtension(outputFilename) + "_Peaks.txt";
            }
            MaxQuant.PeakDetection.Detect(file,
                                          missingScan,                                    //*1-2-3-4-5
                                          centroid,                                       //*1-2-3-4-5-6-7-8-9-10
                                          centroidMethod,                                 //*
                                          false, 0, options.precursorMassTolerance.Value, //TODO ensure its always in ppm
                                          minPeaks,                                       //*1-2-3-4-5-6-7-8-9-10
                                          valleyFactor,                                   //*0.1-0.2-0.3-...-3.0
                                          true,
                                          0,
                                          new Trinity.MaxQuant.RawFileWrapper(spectra),
                                          true,
                                          null, out centerMassArray, out centerMassErrorArray, out intensityArray, out minTimeArray, out maxTimeArray, out filePosArray);

            Tracks tracks = new Tracks();

            for (int i = 0; i < centerMassArray.Length; i++)
            {
                tracks.AddTrack(centerMassArray[i], (minTimeArray[i] + maxTimeArray[i]) * 0.5, minTimeArray[i], maxTimeArray[i], intensityArray[i]);
            }
            return(tracks);
        }
示例#3
0
        public static Tracks Import(string filename, DBOptions dbOptions)
        {
            vsCSV csv = new vsCSV(filename);

            if (csv.LINES_LIST.Count == 0 || csv.LINES_LIST[0].CompareTo(Track.TITLE) != 0)
            {
                return(null);
            }
            Tracks tracks = new Tracks();

            for (int i = 1; i < csv.LINES_LIST.Count; i++)
            {
                try
                {
                    string[] splits = csv.LINES_LIST[i].Split(vsCSV._Generic_Separator);
                    tracks.AddTrack(double.Parse(splits[0]), double.Parse(splits[1]), double.Parse(splits[3]), double.Parse(splits[4]), double.Parse(splits[2]));
                }
                catch (Exception)
                {
                    dbOptions.ConSole.WriteLine("Error parsing line : " + csv.LINES_LIST[i]);
                }
            }
            return(tracks);
        }
示例#4
0
        public void GenerateQueries(Sample entry, Spectra spectra, Tracks tracks)//, double mz, double rt, double intensity)
        {
            Dictionary <Track, Precursor> Tracks   = new Dictionary <Track, Precursor>();
            Dictionary <Track, Precursor> Isotopes = new Dictionary <Track, Precursor>();

            //Create one query per Spectrum-Precursor duo, including Isotopes in the process to ease search
            //For further analysis, maintain a list of precursors (excluding isotopes)
            int nbMissedTrack = 0;

            //vsSDF sdf = entry.GetSDF();// Samples.LoadSDF(entry);
            //tracks.PrepareRtSort();
            //sdf.TRACKS_LIST.PrepareRtSort();
            spectra.Sort(ProductSpectrum.AscendingPrecursorMassComparison);

            foreach (ProductSpectrum spectrum in spectra)
            {
                NbSpectrum++;
                double intensityCumul = 0.0;
                bool   foundCharge    = false;
                Track  closestTrack   = null;

                List <Query> newQueries = new List <Query>();

                //TODO No threshold on sdf files, and preferably a C# routine that does what MassSense do
                foreach (Track track in tracks.GetTracksInMzRange(spectrum.PrecursorMZ, spectrum.IsolationWindow * dbOptions.EffectiveIsolationWindowRatio))//TODO Optimize this value
                {
                    Precursor prec = null;

                    if (track.RT_Min <= spectrum.RetentionTimeInMin &&
                        track.RT_Max >= spectrum.RetentionTimeInMin)
                    {
                        if (closestTrack == null || Math.Abs(track.MZ - spectrum.PrecursorMZ) < Math.Abs(closestTrack.MZ - spectrum.PrecursorMZ))
                        {
                            closestTrack = track;
                        }

                        if (Isotopes.ContainsKey(track))
                        {
                            break;
                        }

                        if (Tracks.ContainsKey(track))
                        {
                            prec = Tracks[track];
                        }
                        else
                        {
                            GraphML_List <Precursor> isotopes = GetIsotopes(track, dbOptions, tracks, entry);
                            if (isotopes.Count > 0)
                            {
                                prec = new Precursor(track, isotopes[0].Charge, entry, 0.0, isotopes);
                                Tracks.Add(track, prec);
                                prec.OtherCharges = GetOtherCharges(prec, dbOptions, tracks, entry);

                                foreach (Precursor isotope in prec.Isotopes)
                                {
                                    if (!Isotopes.ContainsKey(isotope.Track))
                                    {
                                        Isotopes.Add(isotope.Track, isotope);
                                    }
                                }
                            }
                        }
                        if (prec != null)
                        {
                            intensityCumul += track.INTENSITY;
                            newQueries.Add(new Query(dbOptions, entry, spectrum, prec, NbSpectrum));

                            if (prec.Charge == spectrum.PrecursorCharge)
                            {
                                foundCharge = true;
                            }
                        }
                    }
                }

                if (!foundCharge)
                {
                    /*if (closestTrack != null && Tracks.ContainsKey(closestTrack) && Math.Abs(Numerics.CalculateMassError(closestTrack.MZ, spectrum.PrecursorMZ, dbOptions.precursorMassTolerance.Units)) < dbOptions.precursorMassTolerance.Value)
                     * {
                     *  if(closestTrack.RT_Min > (float)(spectrum.RetentionTimeInMin - dbOptions.ComputedRetentionTimeDiff))
                     *      closestTrack.RT_Min = (float)(spectrum.RetentionTimeInMin - dbOptions.ComputedRetentionTimeDiff);
                     *  if (closestTrack.RT_Max < (float)(spectrum.RetentionTimeInMin + dbOptions.ComputedRetentionTimeDiff))
                     *      closestTrack.RT_Max = (float)(spectrum.RetentionTimeInMin + dbOptions.ComputedRetentionTimeDiff);
                     *  if (closestTrack.INTENSITY < spectrum.PrecursorIntensity)
                     *      closestTrack.INTENSITY = spectrum.PrecursorIntensity;
                     *
                     *  Precursor prec = Tracks[closestTrack];
                     *  if (prec.Charge == spectrum.PrecursorCharge)
                     *  {
                     *      Add(new Query(dbOptions, entry, spectrum, prec, NbSpectrum));
                     *  }
                     *  else
                     *  {
                     *      Precursor newPrec = new Precursor(closestTrack, spectrum.PrecursorCharge, entry);
                     *      Add(new Query(dbOptions, entry, spectrum, newPrec, NbSpectrum));
                     *  }
                     * }
                     * else//*/
                    {
                        nbMissedTrack++;
                        closestTrack = new Track((float)spectrum.PrecursorMZ, (float)spectrum.RetentionTimeInMin, spectrum.PrecursorIntensity,
                                                 (float)(spectrum.RetentionTimeInMin - dbOptions.ComputedRetentionTimeDiff), (float)(spectrum.RetentionTimeInMin + dbOptions.ComputedRetentionTimeDiff),
                                                 true);

                        Precursor prec = new Precursor(closestTrack, spectrum.PrecursorCharge, entry);
                        Tracks.Add(closestTrack, prec);
                        Add(new Query(dbOptions, entry, spectrum, prec, NbSpectrum));
                    }
                }//*/

                if (newQueries.Count > 0)
                {
                    //Remove precursors if estimated fragment intensities are too low (based on precursor intensity ratios and isolation window placement)
                    foreach (Query q in newQueries)
                    {
                        //if (q.precursor.Track.INTENSITY > intensityCumul * dbOptions.MinimumPrecursorIntensityRatioInIsolationWindow)//Need to be 5% of all intensity
                        //{
                        this.Add(q);
                        //}
                    }
                }
                Console.Write("\r{0}%   ", ((100 * NbSpectrum) / spectra.Count));
            }
            Console.Write("\r{0}%   ", 100);

            //Sort queries to ease search
            this.Sort(AscendingPrecursorMassComparison);
            foreach (Track track in Tracks.Keys)
            {
                if (!Isotopes.ContainsKey(track))
                {
                    Precursors.Add(Tracks[track]);
                }
            }

            //TODO Validate this approach
            //REMOVE QUERIES RELATED TO AN ISOTOPE and Compute the average CoElution
            Dictionary <ProductSpectrum, double> DicOfSpectrumIntensities = new Dictionary <ProductSpectrum, double>();

            for (int i = 0; i < this.Count;)
            {
                Query query = this[i];
                if (!Isotopes.ContainsKey(query.precursor.Track))
                {
                    if (!DicOfSpectrumIntensities.ContainsKey(query.spectrum))
                    {
                        DicOfSpectrumIntensities.Add(query.spectrum, query.precursor.Track.INTENSITY);
                    }
                    else
                    {
                        DicOfSpectrumIntensities[query.spectrum] += query.precursor.Track.INTENSITY;
                    }
                    i++;
                }
                else
                {
                    this.RemoveAt(i);
                }
            }

            //REMOVE Queries with Precursor intensities too low
            for (int i = 0; i < this.Count;)
            {
                Query query = this[i];
                if (query.precursor.Track.INTENSITY < DicOfSpectrumIntensities[query.spectrum] * dbOptions.MinimumPrecursorIntensityRatioInIsolationWindow)
                {
                    this.RemoveAt(i);
                }
                else
                {
                    i++;
                }
            }//*/

            Dictionary <ProductSpectrum, int> DicOfSpectrumTracks = new Dictionary <ProductSpectrum, int>();

            for (int i = 0; i < this.Count;)
            {
                Query query = this[i];
                if (!Isotopes.ContainsKey(query.precursor.Track))
                {
                    if (!DicOfSpectrumTracks.ContainsKey(query.spectrum))
                    {
                        DicOfSpectrumTracks.Add(query.spectrum, 1);
                    }
                    else
                    {
                        DicOfSpectrumTracks[query.spectrum]++;
                    }
                    i++;
                }
                else
                {
                    this.RemoveAt(i);
                }
            }

            double averageNbPrecursorPerSpectrum = 0;
            int    nbSpectrumMatchedToTrack      = 0;

            foreach (ProductSpectrum spectrum in DicOfSpectrumTracks.Keys)
            {
                nbSpectrumMatchedToTrack++;
                averageNbPrecursorPerSpectrum += DicOfSpectrumTracks[spectrum];
            }
            dbOptions.ConSole.WriteLine(entry.sSDF + " :" + Precursors.Count + " precursors [" + Isotopes.Count + " isotopes] spreaded in " + Count + " queries [" + nbMissedTrack + " trackless precursors]");
            dbOptions.ConSole.WriteLine("Average Precursors per Spectrum : " + averageNbPrecursorPerSpectrum / (double)nbSpectrumMatchedToTrack);
        }
示例#5
0
        public static GraphML_List <Precursor> GetOtherCharges(Precursor precursor, DBOptions dbOptions, Tracks listTracks, Sample entry)
        {
            GraphML_List <Precursor> otherPrecursor = new GraphML_List <Precursor>();

            for (int charge = dbOptions.MaximumPrecursorChargeState; charge >= 1; charge--)
            {
                if (charge != precursor.Charge)
                {
                    double aimedMZ = Numerics.MZFromMass(precursor.Mass, charge);

                    double chargeMzTolerance = dbOptions.precursorMassTolerance.Value * 0.5;
                    if (dbOptions.precursorMassTolerance.Units == MassToleranceUnits.ppm)
                    {
                        chargeMzTolerance = (chargeMzTolerance / 1e6) * aimedMZ;
                    }

                    double bestDeltaMz = chargeMzTolerance;
                    Track  bestTrack   = null;
                    foreach (Track trackToTest in listTracks.GetTracksInMzRange(aimedMZ, chargeMzTolerance))
                    {
                        if (trackToTest.RT >= precursor.Track.RT_Min &&
                            trackToTest.RT <= precursor.Track.RT_Max)
                        {
                            double mzDiff = Math.Abs(aimedMZ - trackToTest.MZ);
                            if (mzDiff < bestDeltaMz)//TODO Is the best isotope the most precise one or the closest in intensity?? Use a scoring function to get both!
                            {
                                bestDeltaMz = mzDiff;
                                bestTrack   = trackToTest;
                            }
                        }
                    }
                    if (bestTrack != null)
                    {
                        otherPrecursor.Add(new Precursor(bestTrack, charge, precursor.sample, 0, GetIsotopes(bestTrack, dbOptions, listTracks, entry)));
                    }
                }
            }
            return(otherPrecursor);
        }
示例#6
0
        public static GraphML_List <Precursor> GetIsotopes(Track track, DBOptions dbOptions, Tracks listTracks, Sample entry)
        {
            double isotopicMzTolerance = dbOptions.precursorMassTolerance.Value * 0.5;

            if (dbOptions.precursorMassTolerance.Units == MassToleranceUnits.ppm)
            {
                isotopicMzTolerance = (isotopicMzTolerance / 1e6) * track.MZ;
            }

            GraphML_List <Precursor> bestIsotopes = new GraphML_List <Precursor>();

            for (int charge = dbOptions.MaximumPrecursorChargeState; charge >= dbOptions.MinimumPrecursorChargeState; charge--)
            {
                GraphML_List <Precursor> isotopes = new GraphML_List <Precursor>();
                for (int nbIsotope = 1; nbIsotope < 5; nbIsotope++)
                {
                    double bestDeltaMz = isotopicMzTolerance;
                    Track  bestTrack   = null;
                    double massShift   = Numerics.IsotopicMassShift(nbIsotope, charge);
                    double mzIsotope   = track.MZ + massShift;

                    foreach (Track trackToTest in listTracks.GetTracksInMzRange(mzIsotope, isotopicMzTolerance))
                    {
                        if (trackToTest.RT >= track.RT_Min &&
                            trackToTest.RT <= track.RT_Max)
                        {
                            double mzDiff = Math.Abs(mzIsotope - trackToTest.MZ);
                            if (mzDiff < bestDeltaMz)//TODO Is the best isotope the most precise one or the most intense?? Use a scoring function!
                            {
                                bestDeltaMz = mzDiff;
                                bestTrack   = trackToTest;
                            }
                        }
                    }
                    if (bestTrack != null)
                    {
                        isotopes.Add(new Precursor(bestTrack, charge, entry, Constants.C12_C13_MASS_DIFFERENCE * nbIsotope, null));
                    }
                    else
                    {
                        break;
                    }
                }
                if (isotopes.Count > bestIsotopes.Count)//TODO Best way to compare isotope potentials? Number of isotopes? Delta Mass? Intensity ratios?
                {
                    bestIsotopes = isotopes;
                }
            }
            return(bestIsotopes);
        }