/*
         * public PeptideSpectrumMatch OptimizedBestPsm(Peptide peptide, bool checkMods)
         * {
         *  PeptideSpectrumMatch bestPsm = null;
         *  foreach (clCondition condition in conditions)
         *      foreach (clReplicate replicate in condition.replicates)
         *          foreach (Precursor precursor in replicate.precursors)
         *          {
         *              PeptideSpectrumMatch match = precursor.OptimizedBestPsm(peptide, checkMods);
         *              if(bestPsm == null || bestPsm.OptimizedScore() < match.OptimizedScore())
         *                  bestPsm = match;
         *          }
         *  return bestPsm;
         * }//*/

        public Precursor OptimizedBestPrecursor(Peptide peptide, bool checkMods = false)
        {
            double    score = 0;
            Precursor best  = null;

            foreach (clCondition condition in conditions)
            {
                if (condition != null)
                {
                    foreach (clReplicate replicate in condition.replicates)
                    {
                        foreach (Precursor precursor in replicate.precursors)
                        {
                            double tmpScore = precursor.ProbabilityScore(peptide, checkMods);
                            if (tmpScore > score)
                            {
                                score = tmpScore;
                                best  = precursor;
                            }
                        }
                    }
                }
            }
            return(best);
        }
 public void Add(Precursor precursor)
 {
     if (replicates[precursor.sample.PROJECT.REPLICATE - 1] == null)
     {
         replicates[precursor.sample.PROJECT.REPLICATE - 1] = new clReplicate();
     }
     replicates[precursor.sample.PROJECT.REPLICATE - 1].Add(precursor);
 }
        }//*/

        public void Add(Precursor precursor)
        {
            if (conditions[precursor.sample.PROJECT.CONDITION - 1] == null)
            {
                conditions[precursor.sample.PROJECT.CONDITION - 1] = new clCondition(samples[precursor.sample.PROJECT.CONDITION].Count);
            }
            conditions[precursor.sample.PROJECT.CONDITION - 1].Add(precursor);
            //score = -1;
        }
Exemple #4
0
 /// <summary>
 /// Constructor used for Unit tests
 /// </summary>
 /// <param name="masses"></param>
 public Queries(DBOptions options, double[] masses)
 {
     Precursors = new Precursors();
     foreach (double mass in masses)
     {
         Precursor precursor = new Precursor();
         precursor.Mass = mass;
         Add(new Query(options, null, null, precursor));
         Precursors.Add(precursor);
     }
 }
Exemple #5
0
 public Query(DBOptions dbOptions, Sample entry, ProductSpectrum spectrum, Precursor precursor, int spectraIndex = -1)
 {
     this.options       = dbOptions;
     this.sample        = entry;
     this.psms          = new PeptideSpectrumMatches();
     this.spectrum      = spectrum;
     this.precursor     = precursor;
     this.spectrumIndex = spectraIndex;
     if (spectrum != null && precursor != null)
     {
         this.TrapDistance = Math.Abs(spectrum.PrecursorMZ - precursor.Track.MZ);
     }
 }
        public Precursor BestPrecursor(bool checkMods = false)
        {
            double    score = 0;
            Precursor best  = null;

            foreach (Cluster cluster in clusters)
            {
                Precursor tmp = cluster.OptimizedBestPrecursor(peptide, checkMods);
                if (tmp != null)
                {
                    double tmpScore = tmp.ProbabilityScore(peptide, checkMods);
                    if (tmpScore > score)
                    {
                        score = tmpScore;
                        best  = tmp;
                    }
                }
            }
            return(best);
        }
Exemple #7
0
        /*
         * public List<PeptideSpectrumMatch> GetPSMs(double fdr, double decoyOverTargetRatio = 1, int nbMaxPsm = 1)
         * {
         *  return FDR.PSMs(clusters, fdr, decoyOverTargetRatio, nbMaxPsm);
         * }//*/
        /*
         * public List<PeptideMatch> GetPeptides(double fdr)
         * {
         *  if (peptides != null)
         *      return FDR.Peptides(peptides, fdr);
         *  else
         *      return null;
         * }
         *
         * public List<ProteinGroupMatch> GetProteins(double fdr)
         * {
         *  if (proteins != null)
         *      return FDR.Proteins(proteins, fdr);
         *  else
         *      return null;
         * }//*/

        public static int DescendingProteinScoreComparison(Precursor left, Precursor right)
        {
            PeptideSpectrumMatch psmLeft = left.OptimizedBestPsm();

            if (psmLeft != null)
            {
                PeptideSpectrumMatch psmRight = right.OptimizedBestPsm();
                if (psmRight != null)
                {
                    return(-(psmLeft.ProteinScore.CompareTo(psmRight.ProteinScore)));
                }
                else
                {
                    return(-1);
                }
            }
            else
            {
                return(1);
            }
        }
 private double Score(Precursor a, Precursor b)
 {
     if (a.sample != b.sample && NbCommonSequences(a, b) > 0)
     {
         //Zero based score
         //double tmp = Math.Abs(MassTolerance.CalculateMassError(a.Track.MZ, b.Track.MZ, MassToleranceUnits.ppm) / options.MzTol);
         double tmp = Math.Abs(Numerics.MzDifference(a.Track.MZ, b.Track.MZ, options.precursorMassTolerance.Units)) / options.precursorMassTolerance.Value;
         if (tmp < 1)
         {
             tmp = 0.2 * (2 * tmp +
                          Math.Abs(a.Track.RT - b.Track.RT) / options.ComputedRetentionTimeDiff + //TODO check if it is in seconds?
                          (a.Charge == b.Charge ? 0 : 1) +
                          0.1 * Math.Abs(Math.Log10(a.Track.INTENSITY) - Math.Log10(b.Track.INTENSITY)));
             if (tmp < 1)
             {
                 return(1 - tmp);
             }
         }
     }
     return(0);
 }
Exemple #9
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);
        }
        private int NbCommonSequences(Precursor a, Precursor b)
        {
            int common = 0;

            foreach (PeptideSpectrumMatch psmA in a.psms)
            {
                bool seen = true;
                foreach (PeptideSpectrumMatch psmB in b.psms)
                {
                    if (psmA.Peptide.IsSamePeptide(psmB.Peptide, true))
                    {
                        seen = true;
                        break;
                    }
                }
                if (seen)
                {
                    common++;
                }
            }
            return(common);
        }
 public static int CompareNbChargedPrecursor(Precursor left, Precursor right)
 {
     return(-left.OtherCharges.Count.CompareTo(right.OtherCharges.Count));
 }
 public static int ComparePeptideScore(Precursor left, Precursor right)
 {
     return(-left.BestPSMPeptideScore().CompareTo(right.BestPSMPeptideScore()));
 }
 public static int CompareProbabilityScore(Precursor left, Precursor right)
 {
     return(-left.ProbabilityScore().CompareTo(right.ProbabilityScore()));
 }
 public static int CompareProteinScore(Precursor left, Precursor right)
 {
     return(-left.OptimizedBestPsm().ProteinScore.CompareTo(right.OptimizedBestPsm().ProteinScore));
 }
 public static int CompareMatchingProducts(Precursor left, Precursor right)
 {
     return(-left.OptimizedBestPsm().MatchingProducts.CompareTo(right.OptimizedBestPsm().MatchingProducts));
 }
 public static int CompareMatchingProductsFraction(Precursor left, Precursor right)
 {
     return(-left.BestPSMMatchingProductsFraction().CompareTo(right.BestPSMMatchingProductsFraction()));
 }
        public IEnumerable <ProductMatch> EnumerateAllProductMz(IEnumerable <ProductType> productTypes, Precursor precursor)
        {
            ProductMatch match = new ProductMatch();

            for (int r = 1; r < Length; r++)
            {
                foreach (ProductType product_type in productTypes)
                {
                    double product_mass = CalculateProductMass(product_type, r);

                    for (int c = precursor.Charge; c > 0; c--)
                    {
                        match.theoMz = Numerics.MZFromMass(product_mass, c);
                        match.charge = c;

                        //for (int iso = 0; iso < precursor.Isotopes.Count + 1; iso++)
                        yield return(match);// product_mz;// +Utilities.IsotopicMassShift(iso, c);
                    }
                }
            }
        }
 public void Add(Precursor precursor)
 {
     precursors.Add(precursor);
 }
 public static int OptimizedBestPSMComparison(Precursor left, Precursor right)
 {
     return(-left.OptimizedBestPsmScore().CompareTo(right.OptimizedBestPsmScore()));
 }
Exemple #20
0
 public static int DescendingIntensityFractionComparison(Precursor left, Precursor right)
 {
     return(-(left.OptimizedBestPsm().MatchingIntensityFraction.CompareTo(right.OptimizedBestPsm().MatchingIntensityFraction)));
 }
 public static int OptimizedScoreComparison(Precursor left, Precursor right)
 {
     return(-left.ProbabilityScore().CompareTo(right.ProbabilityScore()));
 }
Exemple #22
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);
        }