private bool ExtractScanInfoWork( XRawFileIO xcaliburAccessor, clsScanList scanList, clsSpectraCache spectraCache, clsDataOutput dataOutputHandler, clsSICOptions sicOptions, ThermoRawFileReader.clsScanInfo thermoScanInfo) { if (thermoScanInfo.ParentIonMZ > 0 && Math.Abs(mOptions.ParentIonDecoyMassDa) > 0) { thermoScanInfo.ParentIonMZ += mOptions.ParentIonDecoyMassDa; } bool success; // Determine if this was an MS/MS scan // If yes, determine the scan number of the survey scan if (thermoScanInfo.MSLevel <= 1) { // Survey Scan success = ExtractXcaliburSurveyScan(xcaliburAccessor, scanList, spectraCache, dataOutputHandler, sicOptions, thermoScanInfo); } else { // Fragmentation Scan success = ExtractXcaliburFragmentationScan(xcaliburAccessor, scanList, spectraCache, dataOutputHandler, sicOptions, mOptions.BinningOptions, thermoScanInfo); } return(success); }
public bool XMLOutputFileInitialize( string inputFilePathFull, string outputDirectoryPath, clsDataOutput dataOutputHandler, clsScanList scanList, clsSpectraCache spectraCache, clsSICOptions sicOptions, clsBinningOptions binningOptions) { var xmlOutputFilePath = string.Empty; try { xmlOutputFilePath = clsDataOutput.ConstructOutputFilePath(inputFilePathFull, outputDirectoryPath, clsDataOutput.eOutputFileTypeConstants.XMLFile); dataOutputHandler.OutputFileHandles.XMLFileForSICs = new XmlTextWriter(xmlOutputFilePath, System.Text.Encoding.UTF8); var writer = dataOutputHandler.OutputFileHandles.XMLFileForSICs; writer.Formatting = Formatting.Indented; writer.Indentation = 1; writer.WriteStartDocument(true); writer.WriteStartElement("SICData"); writer.WriteStartElement("ProcessingSummary"); writer.WriteElementString("DatasetID", sicOptions.DatasetID.ToString()); writer.WriteElementString("SourceFilePath", inputFilePathFull); string lastModTimeText; string fileSizeBytes; try { var inputFileInfo = new FileInfo(inputFilePathFull); var lastModTime = inputFileInfo.LastWriteTime; lastModTimeText = lastModTime.ToShortDateString() + " " + lastModTime.ToShortTimeString(); fileSizeBytes = inputFileInfo.Length.ToString(); } catch (Exception ex) { lastModTimeText = string.Empty; fileSizeBytes = "0"; } writer.WriteElementString("SourceFileDateTime", lastModTimeText); writer.WriteElementString("SourceFileSizeBytes", fileSizeBytes); writer.WriteElementString("MASICProcessingDate", DateTime.Now.ToString(clsDatasetStatsSummarizer.DATE_TIME_FORMAT_STRING)); writer.WriteElementString("MASICVersion", mOptions.MASICVersion); writer.WriteElementString("MASICPeakFinderDllVersion", mOptions.PeakFinderVersion); writer.WriteElementString("ScanCountTotal", scanList.MasterScanOrderCount.ToString()); writer.WriteElementString("SurveyScanCount", scanList.SurveyScans.Count.ToString()); writer.WriteElementString("FragScanCount", scanList.FragScans.Count.ToString()); writer.WriteElementString("SkipMSMSProcessing", mOptions.SkipMSMSProcessing.ToString()); writer.WriteElementString("ParentIonDecoyMassDa", mOptions.ParentIonDecoyMassDa.ToString("0.0000")); writer.WriteEndElement(); writer.WriteStartElement("MemoryOptions"); writer.WriteElementString("CacheAlwaysDisabled", spectraCache.DiskCachingAlwaysDisabled.ToString()); writer.WriteElementString("CacheSpectraToRetainInMemory", spectraCache.CacheSpectraToRetainInMemory.ToString()); writer.WriteEndElement(); writer.WriteStartElement("SICOptions"); // SIC Options // "SICToleranceDa" is a legacy parameter; If the SIC tolerance is in PPM, then "SICToleranceDa" is the Da tolerance at 1000 m/z writer.WriteElementString("SICToleranceDa", clsParentIonProcessing.GetParentIonToleranceDa(sicOptions, 1000).ToString("0.0000")); writer.WriteElementString("SICTolerance", sicOptions.SICTolerance.ToString("0.0000")); writer.WriteElementString("SICToleranceIsPPM", sicOptions.SICToleranceIsPPM.ToString()); writer.WriteElementString("RefineReportedParentIonMZ", sicOptions.RefineReportedParentIonMZ.ToString()); writer.WriteElementString("ScanRangeStart", sicOptions.ScanRangeStart.ToString()); writer.WriteElementString("ScanRangeEnd", sicOptions.ScanRangeEnd.ToString()); writer.WriteElementString("RTRangeStart", sicOptions.RTRangeStart.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("RTRangeEnd", sicOptions.RTRangeEnd.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("CompressMSSpectraData", sicOptions.CompressMSSpectraData.ToString()); writer.WriteElementString("CompressMSMSSpectraData", sicOptions.CompressMSMSSpectraData.ToString()); writer.WriteElementString("CompressToleranceDivisorForDa", sicOptions.CompressToleranceDivisorForDa.ToString("0.0")); writer.WriteElementString("CompressToleranceDivisorForPPM", sicOptions.CompressToleranceDivisorForPPM.ToString("0.0")); writer.WriteElementString("MaxSICPeakWidthMinutesBackward", sicOptions.MaxSICPeakWidthMinutesBackward.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("MaxSICPeakWidthMinutesForward", sicOptions.MaxSICPeakWidthMinutesForward.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("IntensityThresholdFractionMax", StringUtilities.DblToString(sicOptions.SICPeakFinderOptions.IntensityThresholdFractionMax, 5)); writer.WriteElementString("IntensityThresholdAbsoluteMinimum", sicOptions.SICPeakFinderOptions.IntensityThresholdAbsoluteMinimum.ToString(CultureInfo.InvariantCulture)); // Peak Finding Options var baselineNoiseOptions = sicOptions.SICPeakFinderOptions.SICBaselineNoiseOptions; writer.WriteElementString("SICNoiseThresholdMode", baselineNoiseOptions.BaselineNoiseMode.ToString()); writer.WriteElementString("SICNoiseThresholdIntensity", baselineNoiseOptions.BaselineNoiseLevelAbsolute.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("SICNoiseFractionLowIntensityDataToAverage", StringUtilities.DblToString(baselineNoiseOptions.TrimmedMeanFractionLowIntensityDataToAverage, 5)); writer.WriteElementString("SICNoiseMinimumSignalToNoiseRatio", baselineNoiseOptions.MinimumSignalToNoiseRatio.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("MaxDistanceScansNoOverlap", sicOptions.SICPeakFinderOptions.MaxDistanceScansNoOverlap.ToString()); writer.WriteElementString("MaxAllowedUpwardSpikeFractionMax", StringUtilities.DblToString(sicOptions.SICPeakFinderOptions.MaxAllowedUpwardSpikeFractionMax, 5)); writer.WriteElementString("InitialPeakWidthScansScaler", sicOptions.SICPeakFinderOptions.InitialPeakWidthScansScaler.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("InitialPeakWidthScansMaximum", sicOptions.SICPeakFinderOptions.InitialPeakWidthScansMaximum.ToString()); writer.WriteElementString("FindPeaksOnSmoothedData", sicOptions.SICPeakFinderOptions.FindPeaksOnSmoothedData.ToString()); writer.WriteElementString("SmoothDataRegardlessOfMinimumPeakWidth", sicOptions.SICPeakFinderOptions.SmoothDataRegardlessOfMinimumPeakWidth.ToString()); writer.WriteElementString("UseButterworthSmooth", sicOptions.SICPeakFinderOptions.UseButterworthSmooth.ToString()); writer.WriteElementString("ButterworthSamplingFrequency", StringUtilities.DblToString(sicOptions.SICPeakFinderOptions.ButterworthSamplingFrequency, 5)); writer.WriteElementString("ButterworthSamplingFrequencyDoubledForSIMData", sicOptions.SICPeakFinderOptions.ButterworthSamplingFrequencyDoubledForSIMData.ToString()); writer.WriteElementString("UseSavitzkyGolaySmooth", sicOptions.SICPeakFinderOptions.UseSavitzkyGolaySmooth.ToString()); writer.WriteElementString("SavitzkyGolayFilterOrder", sicOptions.SICPeakFinderOptions.SavitzkyGolayFilterOrder.ToString()); var noiseThresholdOptions = sicOptions.SICPeakFinderOptions.MassSpectraNoiseThresholdOptions; writer.WriteElementString("MassSpectraNoiseThresholdMode", noiseThresholdOptions.BaselineNoiseMode.ToString()); writer.WriteElementString("MassSpectraNoiseThresholdIntensity", noiseThresholdOptions.BaselineNoiseLevelAbsolute.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("MassSpectraNoiseFractionLowIntensityDataToAverage", StringUtilities.DblToString(noiseThresholdOptions.TrimmedMeanFractionLowIntensityDataToAverage, 5)); writer.WriteElementString("MassSpectraNoiseMinimumSignalToNoiseRatio", noiseThresholdOptions.MinimumSignalToNoiseRatio.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("ReplaceSICZeroesWithMinimumPositiveValueFromMSData", sicOptions.ReplaceSICZeroesWithMinimumPositiveValueFromMSData.ToString()); writer.WriteElementString("SaveSmoothedData", sicOptions.SaveSmoothedData.ToString()); // Similarity options writer.WriteElementString("SimilarIonMZToleranceHalfWidth", sicOptions.SimilarIonMZToleranceHalfWidth.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("SimilarIonToleranceHalfWidthMinutes", sicOptions.SimilarIonToleranceHalfWidthMinutes.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("SpectrumSimilarityMinimum", sicOptions.SpectrumSimilarityMinimum.ToString(CultureInfo.InvariantCulture)); writer.WriteEndElement(); writer.WriteStartElement("BinningOptions"); writer.WriteElementString("BinStartX", binningOptions.StartX.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("BinEndX", binningOptions.EndX.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("BinSize", binningOptions.BinSize.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("MaximumBinCount", binningOptions.MaximumBinCount.ToString()); writer.WriteElementString("IntensityPrecisionPercent", binningOptions.IntensityPrecisionPercent.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("Normalize", binningOptions.Normalize.ToString()); writer.WriteElementString("SumAllIntensitiesForBin", binningOptions.SumAllIntensitiesForBin.ToString()); writer.WriteEndElement(); writer.WriteStartElement("CustomSICValues"); writer.WriteElementString("MZList", mOptions.CustomSICList.RawTextMZList); writer.WriteElementString("MZToleranceDaList", CheckForEmptyToleranceList(mOptions.CustomSICList.RawTextMZToleranceDaList)); writer.WriteElementString("ScanCenterList", mOptions.CustomSICList.RawTextScanOrAcqTimeCenterList); writer.WriteElementString("ScanToleranceList", CheckForEmptyToleranceList(mOptions.CustomSICList.RawTextScanOrAcqTimeToleranceList)); writer.WriteElementString("ScanTolerance", mOptions.CustomSICList.ScanOrAcqTimeTolerance.ToString(CultureInfo.InvariantCulture)); writer.WriteElementString("ScanType", mOptions.CustomSICList.ScanToleranceType.ToString()); writer.WriteElementString("LimitSearchToCustomMZList", mOptions.CustomSICList.LimitSearchToCustomMZList.ToString()); writer.WriteEndElement(); } catch (Exception ex) { ReportError("Error initializing the XML output file: " + xmlOutputFilePath, ex, clsMASIC.eMasicErrorCodes.OutputFileWriteError); return(false); } return(true); }
private void WriteSICStatsFlatFileEntry( TextWriter sicStatsWriter, char delimiter, clsSICOptions sicOptions, clsScanList scanList, clsParentIonInfo parentIon, int parentIonIndex, int surveyScanNumber, float surveyScanTime, int fragScanIndex, bool includeScanTimesInSICStatsFile) { var dataValues = new List <string>(40); float fragScanTime = 0; float optimalPeakApexScanTime = 0; dataValues.Add(sicOptions.DatasetID.ToString()); // Dataset ID dataValues.Add(parentIonIndex.ToString()); // Parent Ion Index dataValues.Add(StringUtilities.DblToString(parentIon.MZ, 4)); // MZ dataValues.Add(surveyScanNumber.ToString()); // Survey scan number double interferenceScore; if (fragScanIndex < scanList.FragScans.Count) { var fragScanNumber = scanList.FragScans[parentIon.FragScanIndices[fragScanIndex]].ScanNumber; dataValues.Add(fragScanNumber.ToString()); // Fragmentation scan number interferenceScore = scanList.FragScans[parentIon.FragScanIndices[fragScanIndex]].FragScanInfo.InterferenceScore; } else { dataValues.Add("0"); // Fragmentation scan does not exist interferenceScore = 0; } dataValues.Add(parentIon.OptimalPeakApexScanNumber.ToString()); // Optimal peak apex scan number if (includeScanTimesInSICStatsFile) { if (fragScanIndex < scanList.FragScans.Count) { fragScanTime = scanList.FragScans[parentIon.FragScanIndices[fragScanIndex]].ScanTime; } else { fragScanTime = 0; // Fragmentation scan does not exist } optimalPeakApexScanTime = ScanNumberToScanTime(scanList, parentIon.OptimalPeakApexScanNumber); } dataValues.Add(parentIon.PeakApexOverrideParentIonIndex.ToString()); // Parent Ion Index that supplied the optimal peak apex scan number if (parentIon.CustomSICPeak) { dataValues.Add("1"); // Custom SIC peak, record 1 } else { dataValues.Add("0"); // Not a Custom SIC peak, record 0 } var currentSIC = parentIon.SICStats; if (currentSIC.ScanTypeForPeakIndices == clsScanList.eScanTypeConstants.FragScan) { dataValues.Add(scanList.FragScans[currentSIC.PeakScanIndexStart].ScanNumber.ToString()); // Peak Scan Start dataValues.Add(scanList.FragScans[currentSIC.PeakScanIndexEnd].ScanNumber.ToString()); // Peak Scan End dataValues.Add(scanList.FragScans[currentSIC.PeakScanIndexMax].ScanNumber.ToString()); // Peak Scan Max Intensity } else { dataValues.Add(scanList.SurveyScans[currentSIC.PeakScanIndexStart].ScanNumber.ToString()); // Peak Scan Start dataValues.Add(scanList.SurveyScans[currentSIC.PeakScanIndexEnd].ScanNumber.ToString()); // Peak Scan End dataValues.Add(scanList.SurveyScans[currentSIC.PeakScanIndexMax].ScanNumber.ToString()); // Peak Scan Max Intensity } var currentPeak = currentSIC.Peak; dataValues.Add(StringUtilities.ValueToString(currentPeak.MaxIntensityValue, 5)); // Peak Intensity dataValues.Add(StringUtilities.ValueToString(currentPeak.SignalToNoiseRatio, 4)); // Peak signal to noise ratio dataValues.Add(currentPeak.FWHMScanWidth.ToString()); // Full width at half max (in scans) dataValues.Add(StringUtilities.ValueToString(currentPeak.Area, 5)); // Peak area dataValues.Add(StringUtilities.ValueToString(currentPeak.ParentIonIntensity, 5)); // Intensity of the parent ion (just before the fragmentation scan) dataValues.Add(StringUtilities.ValueToString(currentPeak.BaselineNoiseStats.NoiseLevel, 5)); dataValues.Add(StringUtilities.ValueToString(currentPeak.BaselineNoiseStats.NoiseStDev, 3)); dataValues.Add(currentPeak.BaselineNoiseStats.PointsUsed.ToString()); var statMoments = currentPeak.StatisticalMoments; dataValues.Add(StringUtilities.ValueToString(statMoments.Area, 5)); dataValues.Add(statMoments.CenterOfMassScan.ToString()); dataValues.Add(StringUtilities.ValueToString(statMoments.StDev, 3)); dataValues.Add(StringUtilities.ValueToString(statMoments.Skew, 4)); dataValues.Add(StringUtilities.ValueToString(statMoments.KSStat, 4)); dataValues.Add(statMoments.DataCountUsed.ToString()); dataValues.Add(StringUtilities.ValueToString(interferenceScore, 4)); // Interference Score if (includeScanTimesInSICStatsFile) { dataValues.Add(StringUtilities.DblToString(surveyScanTime, 5)); // SurveyScanTime dataValues.Add(StringUtilities.DblToString(fragScanTime, 5)); // FragScanTime dataValues.Add(StringUtilities.DblToString(optimalPeakApexScanTime, 5)); // OptimalPeakApexScanTime } sicStatsWriter.WriteLine(string.Join(delimiter.ToString(), dataValues)); }
private bool ExtractXcaliburFragmentationScan( XRawFileIO xcaliburAccessor, clsScanList scanList, clsSpectraCache spectraCache, clsDataOutput dataOutputHandler, clsSICOptions sicOptions, clsBinningOptions binningOptions, ThermoRawFileReader.clsScanInfo thermoScanInfo) { // Note that MinimumPositiveIntensity will be determined in LoadSpectraForThermoRawFile var scanInfo = new clsScanInfo(thermoScanInfo.ParentIonMZ) { ScanNumber = thermoScanInfo.ScanNumber, ScanTime = (float)thermoScanInfo.RetentionTime, ScanHeaderText = XRawFileIO.MakeGenericThermoScanFilter(thermoScanInfo.FilterText), ScanTypeName = XRawFileIO.GetScanTypeNameFromThermoScanFilterText(thermoScanInfo.FilterText), BasePeakIonMZ = thermoScanInfo.BasePeakMZ, BasePeakIonIntensity = thermoScanInfo.BasePeakIntensity, TotalIonIntensity = thermoScanInfo.TotalIonCurrent, MinimumPositiveIntensity = 0, ZoomScan = thermoScanInfo.ZoomScan, SIMScan = thermoScanInfo.SIMScan, MRMScanType = thermoScanInfo.MRMScanType }; // Typically .EventNumber is 1 for the parent-ion scan; 2 for 1st frag scan, 3 for 2nd frag scan, etc. // This resets for each new parent-ion scan scanInfo.FragScanInfo.FragScanNumber = thermoScanInfo.EventNumber - 1; // The .EventNumber value is sometimes wrong; need to check for this // For example, if the dataset only has MS2 scans and no parent-ion scan, .EventNumber will be 2 for every MS2 scan if (scanList.FragScans.Count > 0) { var prevFragScan = scanList.FragScans[scanList.FragScans.Count - 1]; if (prevFragScan.ScanNumber == scanInfo.ScanNumber - 1) { if (scanInfo.FragScanInfo.FragScanNumber <= prevFragScan.FragScanInfo.FragScanNumber) { scanInfo.FragScanInfo.FragScanNumber = prevFragScan.FragScanInfo.FragScanNumber + 1; } } } scanInfo.FragScanInfo.MSLevel = thermoScanInfo.MSLevel; if (scanInfo.MRMScanType != MRMScanTypeConstants.NotMRM) { // This is an MRM scan scanList.MRMDataPresent = true; scanInfo.MRMScanInfo = clsMRMProcessing.DuplicateMRMInfo(thermoScanInfo.MRMInfo, thermoScanInfo.ParentIonMZ); if (scanList.SurveyScans.Count == 0) { // Need to add a "fake" survey scan that we can map this parent ion to mLastNonZoomSurveyScanIndex = scanList.AddFakeSurveyScan(); } } else { scanInfo.MRMScanInfo.MRMMassCount = 0; } scanInfo.LowMass = thermoScanInfo.LowMass; scanInfo.HighMass = thermoScanInfo.HighMass; scanInfo.IsFTMS = thermoScanInfo.IsFTMS; // Store the ScanEvent values in .ExtendedHeaderInfo StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, thermoScanInfo.ScanEvents); // Store the collision mode and possibly the scan filter text scanInfo.FragScanInfo.CollisionMode = thermoScanInfo.CollisionMode; StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, clsExtendedStatsWriter.EXTENDED_STATS_HEADER_COLLISION_MODE, thermoScanInfo.CollisionMode); if (mOptions.WriteExtendedStatsIncludeScanFilterText) { StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, clsExtendedStatsWriter.EXTENDED_STATS_HEADER_SCAN_FILTER_TEXT, thermoScanInfo.FilterText); } if (mOptions.WriteExtendedStatsStatusLog) { // Store the StatusLog values in .ExtendedHeaderInfo StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, thermoScanInfo.StatusLog, mOptions.StatusLogKeyNameFilterList); } scanList.FragScans.Add(scanInfo); var fragScanIndex = scanList.FragScans.Count - 1; scanList.AddMasterScanEntry(clsScanList.eScanTypeConstants.FragScan, fragScanIndex); // Note: Even if keepRawSpectra = False, we still need to load the raw data so that we can compute the noise level for the spectrum var msDataResolution = binningOptions.BinSize / sicOptions.CompressToleranceDivisorForDa; var success = LoadSpectraForThermoRawFile( xcaliburAccessor, spectraCache, scanInfo, sicOptions.SICPeakFinderOptions.MassSpectraNoiseThresholdOptions, clsMASIC.DISCARD_LOW_INTENSITY_MSMS_DATA_ON_LOAD, sicOptions.CompressMSMSSpectraData, msDataResolution, mKeepRawSpectra && mKeepMSMSSpectra); if (!success) { return(false); } SaveScanStatEntry(dataOutputHandler.OutputFileHandles.ScanStats, clsScanList.eScanTypeConstants.FragScan, scanInfo, sicOptions.DatasetID); if (thermoScanInfo.MRMScanType == MRMScanTypeConstants.NotMRM) { // This is not an MRM scan mParentIonProcessor.AddUpdateParentIons(scanList, mLastNonZoomSurveyScanIndex, thermoScanInfo.ParentIonMZ, fragScanIndex, spectraCache, sicOptions); } else { // This is an MRM scan mParentIonProcessor.AddUpdateParentIons(scanList, mLastNonZoomSurveyScanIndex, thermoScanInfo.ParentIonMZ, scanInfo.MRMScanInfo, spectraCache, sicOptions); } if (mLastNonZoomSurveyScanIndex >= 0) { var precursorScanNumber = scanList.SurveyScans[mLastNonZoomSurveyScanIndex].ScanNumber; // Compute the interference of the parent ion in the MS1 spectrum for this frag scan scanInfo.FragScanInfo.InterferenceScore = ComputeInterference(xcaliburAccessor, thermoScanInfo, precursorScanNumber); } return(true); }
private bool ExtractXcaliburSurveyScan( XRawFileIO xcaliburAccessor, clsScanList scanList, clsSpectraCache spectraCache, clsDataOutput dataOutputHandler, clsSICOptions sicOptions, ThermoRawFileReader.clsScanInfo thermoScanInfo) { var scanInfo = new clsScanInfo() { ScanNumber = thermoScanInfo.ScanNumber, ScanTime = (float)thermoScanInfo.RetentionTime, ScanHeaderText = XRawFileIO.MakeGenericThermoScanFilter(thermoScanInfo.FilterText), ScanTypeName = XRawFileIO.GetScanTypeNameFromThermoScanFilterText(thermoScanInfo.FilterText), BasePeakIonMZ = thermoScanInfo.BasePeakMZ, BasePeakIonIntensity = thermoScanInfo.BasePeakIntensity, TotalIonIntensity = thermoScanInfo.TotalIonCurrent, MinimumPositiveIntensity = 0, // This will be determined in LoadSpectraForThermoRawFile ZoomScan = thermoScanInfo.ZoomScan, SIMScan = thermoScanInfo.SIMScan, MRMScanType = thermoScanInfo.MRMScanType, LowMass = thermoScanInfo.LowMass, HighMass = thermoScanInfo.HighMass, IsFTMS = thermoScanInfo.IsFTMS }; // Survey scans typically lead to multiple parent ions; we do not record them here scanInfo.FragScanInfo.ParentIonInfoIndex = -1; if (scanInfo.MRMScanType != MRMScanTypeConstants.NotMRM) { // This is an MRM scan scanList.MRMDataPresent = true; } if (scanInfo.SIMScan) { scanList.SIMDataPresent = true; var simKey = scanInfo.LowMass + "_" + scanInfo.HighMass; if (mSIMScanMapping.TryGetValue(simKey, out var simIndex)) { scanInfo.SIMIndex = simIndex; } else { scanInfo.SIMIndex = mSIMScanMapping.Count; mSIMScanMapping.Add(simKey, mSIMScanMapping.Count); } } // Store the ScanEvent values in .ExtendedHeaderInfo StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, thermoScanInfo.ScanEvents); // Store the collision mode and possibly the scan filter text scanInfo.FragScanInfo.CollisionMode = thermoScanInfo.CollisionMode; StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, clsExtendedStatsWriter.EXTENDED_STATS_HEADER_COLLISION_MODE, thermoScanInfo.CollisionMode); if (mOptions.WriteExtendedStatsIncludeScanFilterText) { StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, clsExtendedStatsWriter.EXTENDED_STATS_HEADER_SCAN_FILTER_TEXT, thermoScanInfo.FilterText); } if (mOptions.WriteExtendedStatsStatusLog) { // Store the StatusLog values in .ExtendedHeaderInfo StoreExtendedHeaderInfo(dataOutputHandler, scanInfo, thermoScanInfo.StatusLog, mOptions.StatusLogKeyNameFilterList); } scanList.SurveyScans.Add(scanInfo); if (!scanInfo.ZoomScan) { mLastNonZoomSurveyScanIndex = scanList.SurveyScans.Count - 1; } scanList.AddMasterScanEntry(clsScanList.eScanTypeConstants.SurveyScan, scanList.SurveyScans.Count - 1); double msDataResolution; if (sicOptions.SICToleranceIsPPM) { // Define MSDataResolution based on the tolerance value that will be used at the lowest m/z in this spectrum, divided by sicOptions.CompressToleranceDivisorForPPM // However, if the lowest m/z value is < 100, then use 100 m/z if (thermoScanInfo.LowMass < 100) { msDataResolution = clsParentIonProcessing.GetParentIonToleranceDa(sicOptions, 100) / sicOptions.CompressToleranceDivisorForPPM; } else { msDataResolution = clsParentIonProcessing.GetParentIonToleranceDa(sicOptions, thermoScanInfo.LowMass) / sicOptions.CompressToleranceDivisorForPPM; } } else { msDataResolution = sicOptions.SICTolerance / sicOptions.CompressToleranceDivisorForDa; } // Note: Even if mKeepRawSpectra = False, we still need to load the raw data so that we can compute the noise level for the spectrum var success = LoadSpectraForThermoRawFile( xcaliburAccessor, spectraCache, scanInfo, sicOptions.SICPeakFinderOptions.MassSpectraNoiseThresholdOptions, clsMASIC.DISCARD_LOW_INTENSITY_MS_DATA_ON_LOAD, sicOptions.CompressMSSpectraData, msDataResolution, mKeepRawSpectra); if (!success) { return(false); } SaveScanStatEntry(dataOutputHandler.OutputFileHandles.ScanStats, clsScanList.eScanTypeConstants.SurveyScan, scanInfo, sicOptions.DatasetID); return(true); }