/// <summary> /// Constructor /// </summary> protected clsMSFileInfoProcessorBaseClass() { mTICandBPIPlot = new clsTICandBPIPlotter("TICandBPIPlot", true); RegisterEvents(mTICandBPIPlot); mInstrumentSpecificPlots = new clsTICandBPIPlotter("InstrumentSpecificPlots", true); RegisterEvents(mInstrumentSpecificPlots); mDatasetStatsSummarizer = new clsDatasetStatsSummarizer(); RegisterEvents(mDatasetStatsSummarizer); mLCMS2DPlot = new clsLCMSDataPlotter(); RegisterEvents(mLCMS2DPlot); mLCMS2DPlotOverview = new clsLCMSDataPlotter(); RegisterEvents(mLCMS2DPlotOverview); InitializeLocalVariables(); }
/// <summary> /// Constructor /// </summary> /// <param name="pWiz"></param> /// <param name="datasetStatsSummarizer"></param> /// <param name="ticAndBPIPlot"></param> /// <param name="lcms2DPlot"></param> /// <param name="saveLCMS2DPlots"></param> /// <param name="saveTICAndBPI"></param> /// <param name="checkCentroidingStatus"></param> public clsProteoWizardDataParser( MSDataFileReader pWiz, DatasetStatsSummarizer datasetStatsSummarizer, clsTICandBPIPlotter ticAndBPIPlot, clsLCMSDataPlotter lcms2DPlot, bool saveLCMS2DPlots, bool saveTICAndBPI, bool checkCentroidingStatus) { mPWiz = pWiz; mDatasetStatsSummarizer = datasetStatsSummarizer; mTICAndBPIPlot = ticAndBPIPlot; mLCMS2DPlot = lcms2DPlot; mSaveLCMS2DPlots = saveLCMS2DPlots; mSaveTICAndBPI = saveTICAndBPI; mCheckCentroidingStatus = checkCentroidingStatus; mGetQ1MZ = new Regex("Q[0-9]=([0-9.]+)", RegexOptions.Compiled); mGetQ3MZ = new Regex("Q1=[0-9.]+ Q3=([0-9.]+)", RegexOptions.Compiled); mWarnedAccessViolationException = false; }
private void LoadFrameDetails( DataReader uimfReader, IReadOnlyDictionary <int, UIMFData.FrameType> dctMasterFrameList, IReadOnlyList <int> masterFrameNumList) { const int BAD_TIC_OR_BPI = int.MinValue; // The StartTime value for each frame is the number of minutes since 12:00 am // If acquiring data from 11:59 pm through 12:00 am, the StartTime will reset to zero clsTICandBPIPlotter pressurePlot; if (mSaveTICAndBPI) { // Initialize the TIC and BPI arrays InitializeTICAndBPI(); mTICAndBPIPlot.BPIXAxisLabel = "Frame number"; mTICAndBPIPlot.TICXAxisLabel = "Frame number"; if (mInstrumentSpecificPlots.Count == 0) { AddInstrumentSpecificPlot("Drift tube Pressure"); } // Track drift tube pressures using mTIC in pressurePlot pressurePlot = mInstrumentSpecificPlots.First(); pressurePlot.DeviceType = Device.Analog; pressurePlot.BPIXAxisLabel = "Frame number"; pressurePlot.TICXAxisLabel = "Frame number"; pressurePlot.TICYAxisLabel = "Pressure"; pressurePlot.TICYAxisExponentialNotation = false; pressurePlot.TICPlotAbbrev = "Pressure"; pressurePlot.TICAutoMinMaxY = true; pressurePlot.RemoveZeroesFromEnds = true; } else { pressurePlot = new clsTICandBPIPlotter(); } if (mSaveLCMS2DPlots) { InitializeLCMS2DPlot(); } var lastProgressTime = DateTime.UtcNow; // Note that this starts at 2 seconds, but is extended after each progress message is shown (maxing out at 30 seconds) var progressThresholdSeconds = 2; var globalParams = uimfReader.GetGlobalParams(); var globalMaxBins = globalParams.Bins; var mzList = new double[globalMaxBins + 1]; var intensityList = new int[globalMaxBins + 1]; var ionsIntensity = new double[globalMaxBins + 1]; // Call .GetStartAndEndScans to get the start and end Frames GetStartAndEndScans(globalParams.NumFrames, out var frameStart, out var frameEnd); // Construct the TIC and BPI (of all frames) ConstructTICAndBPI(uimfReader, frameStart, frameEnd, out var dctTIC, out var dctBPI); Console.Write(" Loading frame details"); // Initialize the frame StartTime variables double frameStartTimeInitial = -1; double frameStartTimeAddon = 0; double frameStartTimePrevious = -1; double frameStartTimeCurrent = 0; for (var masterFrameNumIndex = 0; masterFrameNumIndex <= masterFrameNumList.Count - 1; masterFrameNumIndex++) { var frameNumber = masterFrameNumList[masterFrameNumIndex]; if (!dctMasterFrameList.TryGetValue(frameNumber, out var eFrameType)) { OnWarningEvent(string.Format( "Frametype {0} not found in dictionary dctMasterFrameList; ignoring frame {1} in LoadFrameDetails", eFrameType, frameNumber)); continue; } // Check whether the frame number is within the desired range if (frameNumber < frameStart || frameNumber > frameEnd) { continue; } try { FrameParams frameParams; try { frameParams = uimfReader.GetFrameParams(frameNumber); } catch (Exception) { Console.WriteLine("Exception obtaining frame parameters for frame " + frameNumber + "; will skip this frame"); frameParams = null; } if (frameParams == null || eFrameType == UIMFData.FrameType.Calibration) { continue; } var nonZeroPointsInFrame = uimfReader.GetCountPerFrame(frameNumber); int msLevel; if (frameParams.FrameType == UIMFData.FrameType.MS2) { msLevel = 2; } else { msLevel = 1; } // Read the frame StartTime // This will be zero in older .UIMF files, or in files converted from Agilent .D directories // In newer files, it is the number of minutes since 12:00 am frameStartTimeCurrent = frameParams.GetValueDouble(FrameParamKeyType.StartTimeMinutes); if (masterFrameNumIndex == 0 || frameStartTimeInitial < -0.9) { frameStartTimeInitial = frameStartTimeCurrent; } if (frameStartTimePrevious > 1400 && frameStartTimePrevious > frameStartTimeCurrent) { // We likely rolled over midnight; bump up frameStartTimeAddon by 1440 minutes frameStartTimeAddon += 60 * 24; } // Compute the elution time (in minutes) of this frame var elutionTime = frameStartTimeCurrent + frameStartTimeAddon - frameStartTimeInitial; if (!dctBPI.TryGetValue(frameNumber, out var bpi)) { bpi = BAD_TIC_OR_BPI; } if (!dctTIC.TryGetValue(frameNumber, out var tic)) { tic = BAD_TIC_OR_BPI; } if (mSaveTICAndBPI) { if (bpi > BAD_TIC_OR_BPI && tic > BAD_TIC_OR_BPI) { mTICAndBPIPlot.AddData(frameNumber, msLevel, (float)elutionTime, bpi, tic); } var pressure = frameParams.GetValueDouble(FrameParamKeyType.PressureBack); if (Math.Abs(pressure) < float.Epsilon) { pressure = frameParams.GetValueDouble(FrameParamKeyType.RearIonFunnelPressure); } if (Math.Abs(pressure) < float.Epsilon) { pressure = frameParams.GetValueDouble(FrameParamKeyType.IonFunnelTrapPressure); } if (Math.Abs(pressure) < float.Epsilon) { pressure = frameParams.GetValueDouble(FrameParamKeyType.PressureFront); } pressurePlot.AddDataTICOnly(frameNumber, msLevel, (float)elutionTime, pressure); } var scanStatsEntry = new ScanStatsEntry { ScanNumber = frameNumber, ScanType = msLevel }; if (msLevel <= 1) { scanStatsEntry.ScanTypeName = "HMS"; } else { scanStatsEntry.ScanTypeName = "HMSn"; } scanStatsEntry.ScanFilterText = "IMS"; scanStatsEntry.ExtendedScanInfo.ScanFilterText = scanStatsEntry.ScanFilterText; scanStatsEntry.ElutionTime = elutionTime.ToString("0.0###"); if (tic > BAD_TIC_OR_BPI) { scanStatsEntry.TotalIonIntensity = StringUtilities.ValueToString(tic, 5); } else { scanStatsEntry.TotalIonIntensity = "0"; } if (bpi > BAD_TIC_OR_BPI) { scanStatsEntry.BasePeakIntensity = StringUtilities.ValueToString(bpi, 5); } else { scanStatsEntry.BasePeakIntensity = "0"; } scanStatsEntry.BasePeakMZ = "0"; // Base peak signal to noise ratio scanStatsEntry.BasePeakSignalToNoiseRatio = "0"; scanStatsEntry.IonCount = nonZeroPointsInFrame; scanStatsEntry.IonCountRaw = nonZeroPointsInFrame; // For UIMF files, we only store one entry per frame // Use the median drift time as the representative drift time var medianScanNum = frameParams.Scans / 2; var driftTimeMsec = uimfReader.GetDriftTime(frameNumber, medianScanNum, true); scanStatsEntry.DriftTimeMsec = driftTimeMsec.ToString("0.0###"); mDatasetStatsSummarizer.AddDatasetScan(scanStatsEntry); if (mSaveLCMS2DPlots || mCheckCentroidingStatus) { try { // Also need to load the raw data // We have to clear the m/z and intensity arrays before calling GetSpectrum Array.Clear(mzList, 0, mzList.Length); Array.Clear(intensityList, 0, intensityList.Length); // Process all of the IMS scans in this Frame to compute a summed spectrum representative of the frame // In UIMF files from IMS04, if Frame_Parameters.Scans = 360, Frame_Scans will have scans 0 through 359 // In UIMF files from IMS08, prior to December 1, 2014, if Frame_Parameters.Scans = 374, Frame_Scans will have scans 0 through 373 // in UIMF files from IMS08, after December 1, 2014 if Frame_Parameters.Scans = 374, Frame_Scans will have scans 1 through 374 var ionCount = uimfReader.GetSpectrum(frameNumber, frameNumber, eFrameType, 0, frameParams.Scans, out mzList, out intensityList); if (ionCount > 0) { // The m/z and intensity arrays might contain entries with m/z values of 0; // need to copy the data in place to get the data in the correct format. // In addition, we'll copy the intensity values from intensityList() into ionsIntensity() if (ionCount > mzList.Length) { ionCount = mzList.Length; } if (ionsIntensity.Length < ionCount) { Array.Resize(ref ionsIntensity, ionCount); } var targetIndex = 0; for (var ionIndex = 0; ionIndex <= ionCount - 1; ionIndex++) { if (mzList[ionIndex] > 0) { mzList[targetIndex] = mzList[ionIndex]; ionsIntensity[targetIndex] = intensityList[ionIndex]; targetIndex += 1; } } ionCount = targetIndex; if (ionCount > 0) { if (ionsIntensity.Length > ionCount) { Array.Resize(ref ionsIntensity, ionCount); } if (mSaveLCMS2DPlots) { mLCMS2DPlot.AddScan(frameNumber, msLevel, (float)elutionTime, ionCount, mzList, ionsIntensity); } if (mCheckCentroidingStatus) { mDatasetStatsSummarizer.ClassifySpectrum(ionCount, mzList, msLevel, "Frame " + frameNumber); } } } } catch (Exception ex) { OnWarningEvent("Error loading m/z and intensity values for frame " + frameNumber + ": " + ex.Message); } } } catch (Exception ex) { OnWarningEvent("Error loading header info for frame " + frameNumber + ": " + ex.Message); } frameStartTimePrevious = frameStartTimeCurrent; if (DateTime.UtcNow.Subtract(lastProgressTime).TotalSeconds < progressThresholdSeconds) { continue; } lastProgressTime = DateTime.UtcNow; if (progressThresholdSeconds < 30) { progressThresholdSeconds += 2; } var percentComplete = masterFrameNumIndex / (float)masterFrameNumList.Count * 100; OnProgressUpdate(string.Format("Frames processed: {0:N0}", masterFrameNumIndex), percentComplete); } Console.WriteLine(); }