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