private float CompareFragSpectraForParentIons( clsScanList scanList, clsSpectraCache spectraCache, int parentIonIndex1, int parentIonIndex2, clsBinningOptions binningOptions, MASICPeakFinder.clsBaselineNoiseOptions noiseThresholdOptions, DataInput.clsDataImport dataImportUtilities) { // Compare the fragmentation spectra for the two parent ions // Returns the highest similarity score (ranging from 0 to 1) // Returns 0 if no similarity or no spectra to compare // Returns -1 if an error float highestSimilarityScore; try { if (scanList.ParentIons[parentIonIndex1].CustomSICPeak || scanList.ParentIons[parentIonIndex2].CustomSICPeak) { // Custom SIC values do not have fragmentation spectra; nothing to compare highestSimilarityScore = 0; } else if (scanList.ParentIons[parentIonIndex1].MRMDaughterMZ > 0 || scanList.ParentIons[parentIonIndex2].MRMDaughterMZ > 0) { // MRM Spectra should not be compared highestSimilarityScore = 0; } else { highestSimilarityScore = 0; foreach (var fragSpectrumIndex1 in scanList.ParentIons[parentIonIndex1].FragScanIndices) { if (!spectraCache.GetSpectrum(scanList.FragScans[fragSpectrumIndex1].ScanNumber, out var spectrum1, false)) { SetLocalErrorCode(clsMASIC.eMasicErrorCodes.ErrorUncachingSpectrum); return(-1); } // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (!clsMASIC.DISCARD_LOW_INTENSITY_MSMS_DATA_ON_LOAD) #pragma warning disable 162 // ReSharper disable HeuristicUnreachableCode { dataImportUtilities.DiscardDataBelowNoiseThreshold(spectrum1, scanList.FragScans[fragSpectrumIndex1].BaselineNoiseStats.NoiseLevel, 0, 0, noiseThresholdOptions); } // ReSharper restore HeuristicUnreachableCode #pragma warning restore 162 foreach (var fragSpectrumIndex2 in scanList.ParentIons[parentIonIndex2].FragScanIndices) { if (!spectraCache.GetSpectrum(scanList.FragScans[fragSpectrumIndex2].ScanNumber, out var spectrum2, false)) { SetLocalErrorCode(clsMASIC.eMasicErrorCodes.ErrorUncachingSpectrum); return(-1); } // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (!clsMASIC.DISCARD_LOW_INTENSITY_MSMS_DATA_ON_LOAD) #pragma warning disable 162 // ReSharper disable HeuristicUnreachableCode { dataImportUtilities.DiscardDataBelowNoiseThreshold(spectrum2, scanList.FragScans[fragSpectrumIndex2].BaselineNoiseStats.NoiseLevel, 0, 0, noiseThresholdOptions); } // ReSharper restore HeuristicUnreachableCode #pragma warning restore 162 var similarityScore = CompareSpectra(spectrum1, spectrum2, binningOptions); if (similarityScore > highestSimilarityScore) { highestSimilarityScore = similarityScore; } } } } } catch (Exception ex) { ReportError("Error in CompareFragSpectraForParentIons", ex); return(-1); } return(highestSimilarityScore); }
public bool ProcessAndStoreSpectrum( clsScanInfo scanInfo, DataInput.clsDataImport dataImportUtilities, clsSpectraCache spectraCache, clsMSSpectrum msSpectrum, clsBaselineNoiseOptions noiseThresholdOptions, bool discardLowIntensityData, bool compressData, double msDataResolution, bool keepRawSpectrum) { var lastKnownLocation = "Start"; try { // Determine the noise threshold intensity for this spectrum // Stored in scanInfo.BaselineNoiseStats lastKnownLocation = "Call ComputeNoiseLevelForMassSpectrum"; ComputeNoiseLevelForMassSpectrum(scanInfo, msSpectrum, noiseThresholdOptions); if (!keepRawSpectrum) { return(true); } // Discard low intensity data, but not for MRM scans if (discardLowIntensityData && scanInfo.MRMScanType == ThermoRawFileReader.MRMScanTypeConstants.NotMRM) { // Discard data below the noise level or below the minimum S/N level // If we are searching for Reporter ions, then it is important to not discard any of the ions in the region of the reporter ion m/z values lastKnownLocation = "Call DiscardDataBelowNoiseThreshold"; dataImportUtilities.DiscardDataBelowNoiseThreshold(msSpectrum, scanInfo.BaselineNoiseStats.NoiseLevel, mReporterIons.MZIntensityFilterIgnoreRangeStart, mReporterIons.MZIntensityFilterIgnoreRangeEnd, noiseThresholdOptions); scanInfo.IonCount = msSpectrum.IonCount; } if (compressData) { lastKnownLocation = "Call CompressSpectraData"; // Again, if we are searching for Reporter ions, then it is important to not discard any of the ions in the region of the reporter ion m/z values CompressSpectraData(msSpectrum, msDataResolution, mReporterIons.MZIntensityFilterIgnoreRangeStart, mReporterIons.MZIntensityFilterIgnoreRangeEnd); } if (msSpectrum.IonCount > MAX_ALLOWABLE_ION_COUNT) { // Do not keep more than 50,000 ions lastKnownLocation = "Call DiscardDataToLimitIonCount"; mSpectraFoundExceedingMaxIonCount += 1; // Display a message at the console the first 10 times we encounter spectra with over MAX_ALLOWABLE_ION_COUNT ions // In addition, display a new message every time a new max value is encountered if (mSpectraFoundExceedingMaxIonCount <= 10 || msSpectrum.IonCount > mMaxIonCountReported) { Console.WriteLine(); Console.WriteLine( "Note: Scan " + scanInfo.ScanNumber + " has " + msSpectrum.IonCount + " ions; " + "will only retain " + MAX_ALLOWABLE_ION_COUNT + " (trimmed " + mSpectraFoundExceedingMaxIonCount.ToString() + " spectra)"); mMaxIonCountReported = msSpectrum.IonCount; } dataImportUtilities.DiscardDataToLimitIonCount(msSpectrum, mReporterIons.MZIntensityFilterIgnoreRangeStart, mReporterIons.MZIntensityFilterIgnoreRangeEnd, MAX_ALLOWABLE_ION_COUNT); scanInfo.IonCount = msSpectrum.IonCount; } lastKnownLocation = "Call AddSpectrumToPool"; var success = spectraCache.AddSpectrumToPool(msSpectrum, scanInfo.ScanNumber); return(success); } catch (Exception ex) { ReportError("Error in ProcessAndStoreSpectrum (LastKnownLocation: " + lastKnownLocation + ")", ex, clsMASIC.eMasicErrorCodes.InputFileDataReadError); return(false); } }