示例#1
0
        public void UpdatePsmInformation(MSDataFile dataFile, bool is2dFDR = true, bool useMedian = true, double evalueThreshold = 1e-3)
        {
            List <double> errors = new List <double>();

            MaximumPrecursorMassError = 0;
            int           count          = 0;
            int           msms           = 0;
            int           ms             = 0;
            int           localMSMS      = -1;
            List <int>    msmsBetweenMS  = new List <int>();
            List <double> injectionTimes = new List <double>();

            for (int sn = dataFile.FirstSpectrumNumber; sn <= dataFile.LastSpectrumNumber; sn++)
            {
                int order = dataFile.GetMsnOrder(sn);
                if (order == 1)
                {
                    ms++;
                    if (localMSMS >= 0)
                    {
                        msmsBetweenMS.Add(localMSMS);
                    }
                    localMSMS = 0;
                }
                else
                {
                    localMSMS++;
                    msms++;
                    injectionTimes.Add(dataFile.GetInjectionTime(sn));
                }
            }
            MaxMSMSScansBetweenMS     = msmsBetweenMS.Max();
            AverageMSMSSCansBetweenMS = msmsBetweenMS.Average();
            TotalMSMSscans            = msms;
            TotalMSscans             = ms;
            AverageMSMSInjectionTime = injectionTimes.Average();
            MaxMSMSInjectionTime     = injectionTimes.Max();

            foreach (KeyValuePair <int, SortedMaxSizedContainer <PSM> > kvp in _data)
            {
                int scanNumber = kvp.Key;
                SortedMaxSizedContainer <PSM> psms = kvp.Value;

                double   isolationMZ = dataFile.GetPrecusorMz(scanNumber);
                Polarity polarity    = dataFile.GetPolarity(scanNumber);

                foreach (PSM psm in psms)
                {
                    psm.Charge     *= (int)polarity; // For negative mode ions
                    psm.IsolationMz = isolationMZ;
                    double    isolationMass   = Mass.MassFromMz(isolationMZ, psm.Charge);
                    double    theoreticalMass = psm.MonoisotopicMass;
                    int       nominalMassOffset;
                    double    adjustedIsolationMass;
                    Tolerance tolerancePPM = Tolerance.CalculatePrecursorMassError(theoreticalMass,
                                                                                   isolationMass, out nominalMassOffset, out adjustedIsolationMass);
                    psm.AdjustedIsolationMass = adjustedIsolationMass;
                    psm.IsotopeSelected       = nominalMassOffset;
                    if (!HasPPMInfo)
                    {
                        psm.PrecursorMassError = tolerancePPM.Value;
                    }

                    double positive = Math.Abs(psm.PrecursorMassError);
                    if (positive > MaximumPrecursorMassError)
                    {
                        MaximumPrecursorMassError = positive;
                    }

                    if (psm.FdrScoreMetric <= evalueThreshold)
                    {
                        errors.Add(psm.PrecursorMassError);
                    }

                    count++;
                }
            }

            SystematicPrecursorMassError = useMedian ? GetMedianValue(errors) : errors.Average();

            // Adjust all psms to
            foreach (PSM psm in PeptideSpectralMatches)
            {
                psm.CorrectedPrecursorMassError = psm.PrecursorMassError - SystematicPrecursorMassError;
            }
        }