Exemple #1
0
        /// <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();
        }