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