Пример #1
0
        private List <udtScansDataType> LoadScansFile(string strScansFilePath)
        {
            const string FILTERED_SCANS_SUFFIX = "_filtered_scans.csv";

            var dctColumnInfo = new Dictionary <string, int>
            {
                { "type", -1 },
                { "bpi", -1 },
                { "bpi_mz", -1 },
                { "tic", -1 },
                { "num_peaks", -1 },
                { "num_deisotoped", -1 }
            };

            var intColIndexScanOrFrameNum  = -1;
            var intColIndexScanOrFrameTime = -1;

            var lstScanData         = new List <udtScansDataType>();
            var intRowNumber        = 0;
            var intColIndexScanInfo = -1;

            if (!File.Exists(strScansFilePath) && strScansFilePath.ToLower().EndsWith(FILTERED_SCANS_SUFFIX))
            {
                strScansFilePath = strScansFilePath.Substring(0, strScansFilePath.Length - FILTERED_SCANS_SUFFIX.Length) + "_scans.csv";
            }

            if (!File.Exists(strScansFilePath))
            {
                OnWarningEvent("Warning: _scans.csv file is missing; will plot vs. scan number instead of vs. elution time");
                return(lstScanData);
            }

            Console.WriteLine("  Reading the _scans.csv file");

            using (var srIsosFile = new StreamReader(new FileStream(strScansFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
            {
                while (!srIsosFile.EndOfStream)
                {
                    intRowNumber += 1;
                    var strLineIn = srIsosFile.ReadLine();
                    if (strLineIn == null)
                    {
                        continue;
                    }

                    var lstData = strLineIn.Split(',').ToList();

                    if (intRowNumber == 1)
                    {
                        // Parse the header row
                        ParseColumnHeaders(dctColumnInfo, lstData, "_scans.csv");

                        intColIndexScanOrFrameNum = GetScanOrFrameColIndex(lstData, "_scans.csv");

                        intColIndexScanOrFrameTime = lstData.IndexOf("frame_time");
                        if (intColIndexScanOrFrameTime < 0)
                        {
                            intColIndexScanOrFrameTime = lstData.IndexOf("scan_time");
                        }

                        // The info column will have data of the form "FTMS + p NSI Full ms [400.00-2000.00]" for Thermo datasets
                        // For .mzXML files, this fill will simply have an integer (and thus isn't useful)
                        // It may not be present in older _scancs.csv files and is thus optional
                        intColIndexScanInfo = lstData.IndexOf("info");

                        continue;
                    }

                    try
                    {
                        var udtScanData = new udtScansDataType();

                        int.TryParse(lstData[intColIndexScanOrFrameNum], out udtScanData.Scan);
                        float.TryParse(lstData[intColIndexScanOrFrameTime], out udtScanData.ElutionTime);
                        int.TryParse(lstData[dctColumnInfo["type"]], out udtScanData.MSLevel);
                        double.TryParse(lstData[dctColumnInfo["bpi"]], out udtScanData.BasePeakIntensity);
                        double.TryParse(lstData[dctColumnInfo["bpi_mz"]], out udtScanData.BasePeakMZ);
                        double.TryParse(lstData[dctColumnInfo["tic"]], out udtScanData.TotalIonCurrent);
                        int.TryParse(lstData[dctColumnInfo["num_peaks"]], out udtScanData.NumPeaks);
                        int.TryParse(lstData[dctColumnInfo["num_deisotoped"]], out udtScanData.NumDeisotoped);

                        if (intColIndexScanInfo > 0)
                        {
                            var infoText = lstData[intColIndexScanInfo];

                            // Only store infoText in .FilterText if infoText is not simply an integer
                            if (!int.TryParse(infoText, out _))
                            {
                                udtScanData.FilterText = infoText;
                            }
                        }

                        lstScanData.Add(udtScanData);

                        if (mSaveTICAndBPI)
                        {
                            mTICandBPIPlot.AddData(udtScanData.Scan, udtScanData.MSLevel, udtScanData.ElutionTime, udtScanData.BasePeakIntensity, udtScanData.TotalIonCurrent);
                        }

                        string scanTypeName;
                        if (string.IsNullOrWhiteSpace(udtScanData.FilterText))
                        {
                            udtScanData.FilterText = udtScanData.MSLevel > 1 ? "HMSn" : "HMS";
                            scanTypeName           = udtScanData.FilterText;
                        }
                        else
                        {
                            scanTypeName = XRawFileIO.GetScanTypeNameFromFinniganScanFilterText(udtScanData.FilterText);
                        }

                        var objScanStatsEntry = new clsScanStatsEntry
                        {
                            ScanNumber                 = udtScanData.Scan,
                            ScanType                   = udtScanData.MSLevel,
                            ScanTypeName               = scanTypeName,
                            ScanFilterText             = XRawFileIO.MakeGenericFinniganScanFilter(udtScanData.FilterText),
                            ElutionTime                = udtScanData.ElutionTime.ToString("0.0###"),
                            TotalIonIntensity          = StringUtilities.ValueToString(udtScanData.TotalIonCurrent, 5),
                            BasePeakIntensity          = StringUtilities.ValueToString(udtScanData.BasePeakIntensity, 5),
                            BasePeakMZ                 = udtScanData.BasePeakMZ.ToString("0.0###"),
                            BasePeakSignalToNoiseRatio = "0",
                            IonCount                   = udtScanData.NumDeisotoped,
                            IonCountRaw                = udtScanData.NumPeaks,
                            ExtendedScanInfo           =
                            {
                                CollisionMode  = string.Empty,
                                ScanFilterText = udtScanData.FilterText
                            }
                        };

                        mDatasetStatsSummarizer.AddDatasetScan(objScanStatsEntry);
                    }
                    catch (Exception ex)
                    {
                        OnWarningEvent("Warning: Ignoring scan " + lstData[dctColumnInfo["scan_num"]] + " since data conversion error: " + ex.Message);
                    }
                }
            }

            return(lstScanData);
        }
Пример #2
0
        private void LoadFrameDetails(
            DataReader objUIMFReader,
            IReadOnlyDictionary <int, DataReader.FrameType> dctMasterFrameList,
            IReadOnlyList <int> intMasterFrameNumList)
        {
            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, then the StartTime will reset to zero

            if (mSaveTICAndBPI)
            {
                // Initialize the TIC and BPI arrays
                InitializeTICAndBPI();
                mTICandBPIPlot.BPIXAxisLabel = "Frame number";
                mTICandBPIPlot.TICXAxisLabel = "Frame number";

                mInstrumentSpecificPlots.BPIXAxisLabel = "Frame number";
                mInstrumentSpecificPlots.TICXAxisLabel = "Frame number";

                mInstrumentSpecificPlots.TICYAxisLabel = "Pressure";
                mInstrumentSpecificPlots.TICYAxisExponentialNotation = false;

                mInstrumentSpecificPlots.TICPlotAbbrev        = "Pressure";
                mInstrumentSpecificPlots.TICAutoMinMaxY       = true;
                mInstrumentSpecificPlots.RemoveZeroesFromEnds = true;
            }

            if (mSaveLCMS2DPlots)
            {
                InitializeLCMS2DPlot();
            }

            var dtLastProgressTime = DateTime.UtcNow;

            var objGlobalParams = objUIMFReader.GetGlobalParams();

            var intGlobalMaxBins = objGlobalParams.Bins;

            var dblMZList        = new double[intGlobalMaxBins + 1];
            var intIntensityList = new int[intGlobalMaxBins + 1];
            var dblIonsIntensity = new double[intGlobalMaxBins + 1];

            // Call .GetStartAndEndScans to get the start and end Frames
            GetStartAndEndScans(objGlobalParams.NumFrames, out var intFrameStart, out var intFrameEnd);

            // Construct the TIC and BPI (of all frames)
            ConstructTICandBPI(objUIMFReader, intFrameStart, intFrameEnd, out var dctTIC, out var dctBPI);

            Console.Write("  Loading frame details");

            // Initialize the frame starttime variables
            double dblFrameStartTimeInitial = -1;
            double dblFrameStartTimeAddon   = 0;

            double dblFrameStartTimePrevious = -1;
            double dblFrameStartTimeCurrent  = 0;

            for (var intMasterFrameNumIndex = 0; intMasterFrameNumIndex <= intMasterFrameNumList.Count - 1; intMasterFrameNumIndex++)
            {
                var intFrameNumber = intMasterFrameNumList[intMasterFrameNumIndex];

                if (!dctMasterFrameList.TryGetValue(intFrameNumber, out var eFrameType))
                {
                    OnWarningEvent(string.Format(
                                       "Frametype {0} not found in dictionary dctMasterFrameList; ignoring frame {1} in LoadFrameDetails",
                                       eFrameType, intFrameNumber));

                    continue;
                }

                // Check whether the frame number is within the desired range
                if (intFrameNumber < intFrameStart || intFrameNumber > intFrameEnd)
                {
                    continue;
                }

                try
                {
                    FrameParams objFrameParams;

                    try
                    {
                        objFrameParams = objUIMFReader.GetFrameParams(intFrameNumber);
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Exception obtaining frame parameters for frame " + intFrameNumber + "; will skip this frame");
                        objFrameParams = null;
                    }

                    if (objFrameParams == null || eFrameType == DataReader.FrameType.Calibration)
                    {
                        continue;
                    }

                    var intNonZeroPointsInFrame = objUIMFReader.GetCountPerFrame(intFrameNumber);

                    int intMSLevel;
                    if (objFrameParams.FrameType == DataReader.FrameType.MS2)
                    {
                        intMSLevel = 2;
                    }
                    else
                    {
                        intMSLevel = 1;
                    }

                    // Read the frame StartTime
                    // This will be zero in older .UIMF files, or in files converted from Agilent .D folders
                    // In newer files, it is the number of minutes since 12:00 am
                    dblFrameStartTimeCurrent = objFrameParams.GetValueDouble(FrameParamKeyType.StartTimeMinutes);
                    if (intMasterFrameNumIndex == 0 || dblFrameStartTimeInitial < -0.9)
                    {
                        dblFrameStartTimeInitial = dblFrameStartTimeCurrent;
                    }

                    if (dblFrameStartTimePrevious > 1400 && dblFrameStartTimePrevious > dblFrameStartTimeCurrent)
                    {
                        // We likely rolled over midnight; bump up dblFrameStartTimeAddon by 1440 minutes
                        dblFrameStartTimeAddon += 60 * 24;
                    }

                    // Compute the elution time (in minutes) of this frame
                    var dblElutionTime = dblFrameStartTimeCurrent + dblFrameStartTimeAddon - dblFrameStartTimeInitial;

                    if (!dctBPI.TryGetValue(intFrameNumber, out var dblBPI))
                    {
                        dblBPI = BAD_TIC_OR_BPI;
                    }

                    if (!dctTIC.TryGetValue(intFrameNumber, out var dblTIC))
                    {
                        dblTIC = BAD_TIC_OR_BPI;
                    }

                    if (mSaveTICAndBPI)
                    {
                        if (dblTIC > BAD_TIC_OR_BPI && dblTIC > BAD_TIC_OR_BPI)
                        {
                            mTICandBPIPlot.AddData(intFrameNumber, intMSLevel, (float)dblElutionTime, dblBPI, dblTIC);
                        }

                        var dblPressure = objFrameParams.GetValueDouble(FrameParamKeyType.PressureBack);
                        if (Math.Abs(dblPressure) < float.Epsilon)
                        {
                            dblPressure = objFrameParams.GetValueDouble(FrameParamKeyType.RearIonFunnelPressure);
                        }
                        if (Math.Abs(dblPressure) < float.Epsilon)
                        {
                            dblPressure = objFrameParams.GetValueDouble(FrameParamKeyType.IonFunnelTrapPressure);
                        }
                        if (Math.Abs(dblPressure) < float.Epsilon)
                        {
                            dblPressure = objFrameParams.GetValueDouble(FrameParamKeyType.PressureFront);
                        }

                        mInstrumentSpecificPlots.AddDataTICOnly(intFrameNumber, intMSLevel, (float)dblElutionTime, dblPressure);
                    }

                    var objScanStatsEntry = new clsScanStatsEntry
                    {
                        ScanNumber = intFrameNumber,
                        ScanType   = intMSLevel
                    };

                    if (intMSLevel <= 1)
                    {
                        objScanStatsEntry.ScanTypeName = "HMS";
                    }
                    else
                    {
                        objScanStatsEntry.ScanTypeName = "HMSn";
                    }

                    objScanStatsEntry.ScanFilterText = "";

                    objScanStatsEntry.ElutionTime = dblElutionTime.ToString("0.0###");
                    if (dblTIC > BAD_TIC_OR_BPI)
                    {
                        objScanStatsEntry.TotalIonIntensity = StringUtilities.ValueToString(dblTIC, 5);
                    }
                    else
                    {
                        objScanStatsEntry.TotalIonIntensity = "0";
                    }

                    if (dblBPI > BAD_TIC_OR_BPI)
                    {
                        objScanStatsEntry.BasePeakIntensity = StringUtilities.ValueToString(dblBPI, 5);
                    }
                    else
                    {
                        objScanStatsEntry.BasePeakIntensity = "0";
                    }

                    objScanStatsEntry.BasePeakMZ = "0";

                    // Base peak signal to noise ratio
                    objScanStatsEntry.BasePeakSignalToNoiseRatio = "0";

                    objScanStatsEntry.IonCount    = intNonZeroPointsInFrame;
                    objScanStatsEntry.IonCountRaw = intNonZeroPointsInFrame;

                    mDatasetStatsSummarizer.AddDatasetScan(objScanStatsEntry);

                    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(dblMZList, 0, dblMZList.Length);
                            Array.Clear(intIntensityList, 0, intIntensityList.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 then Frame_Scans will have scans 0 through 359
                            // In UIMF files from IMS08, prior to December 1, 2014, if Frame_Parameters.Scans = 374 then Frame_Scans will have scans 0 through 373
                            // in UIMF files from IMS08, after December 1, 2014     if Frame_Parameters.Scans = 374 then Frame_Scans will have scans 1 through 374

                            var intIonCount = objUIMFReader.GetSpectrum(intFrameNumber, intFrameNumber, eFrameType, 0, objFrameParams.Scans, out dblMZList, out intIntensityList);

                            if (intIonCount > 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 intIntensityList() into dblIonsIntensity()

                                if (intIonCount > dblMZList.Length)
                                {
                                    intIonCount = dblMZList.Length;
                                }

                                if (dblIonsIntensity.Length < intIonCount)
                                {
                                    Array.Resize(ref dblIonsIntensity, intIonCount);
                                }

                                var intTargetIndex = 0;
                                for (var intIonIndex = 0; intIonIndex <= intIonCount - 1; intIonIndex++)
                                {
                                    if (dblMZList[intIonIndex] > 0)
                                    {
                                        dblMZList[intTargetIndex]        = dblMZList[intIonIndex];
                                        dblIonsIntensity[intTargetIndex] = intIntensityList[intIonIndex];
                                        intTargetIndex += 1;
                                    }
                                }

                                intIonCount = intTargetIndex;

                                if (intIonCount > 0)
                                {
                                    if (dblIonsIntensity.Length > intIonCount)
                                    {
                                        Array.Resize(ref dblIonsIntensity, intIonCount);
                                    }

                                    if (mSaveLCMS2DPlots)
                                    {
                                        mLCMS2DPlot.AddScan(intFrameNumber, intMSLevel, (float)dblElutionTime, intIonCount, dblMZList, dblIonsIntensity);
                                    }

                                    if (mCheckCentroidingStatus)
                                    {
                                        mDatasetStatsSummarizer.ClassifySpectrum(intIonCount, dblMZList, intMSLevel);
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            OnWarningEvent("Error loading m/z and intensity values for frame " + intFrameNumber + ": " + ex.Message);
                        }
                    }
                }
                catch (Exception ex)
                {
                    OnWarningEvent("Error loading header info for frame " + intFrameNumber + ": " + ex.Message);
                }

                var percentComplete = intMasterFrameNumIndex / (float)intMasterFrameNumList.Count * 100;
                OnProgressUpdate("Frames processed: " + intMasterFrameNumIndex, percentComplete);

                ShowProgress(intMasterFrameNumIndex, intMasterFrameNumList.Count, ref dtLastProgressTime);

                dblFrameStartTimePrevious = dblFrameStartTimeCurrent;
            }

            Console.WriteLine();
        }
Пример #3
0
        private bool ProcessChemstationMSDataFile(string strDatafilePath, clsDatasetFileInfo datasetFileInfo)
        {
            bool blnSuccess;
            var  intCurrentIndex = 0;

            try {
                using (var oReader = new ChemstationMSFileReader.clsChemstationDataMSFileReader(strDatafilePath)) {
                    datasetFileInfo.AcqTimeStart = oReader.Header.AcqDate;
                    datasetFileInfo.AcqTimeEnd   = datasetFileInfo.AcqTimeStart.AddMinutes(oReader.Header.RetentionTimeMinutesEnd);

                    datasetFileInfo.ScanCount = oReader.Header.SpectraCount;

                    for (var intSpectrumIndex = 0; intSpectrumIndex <= datasetFileInfo.ScanCount - 1; intSpectrumIndex++)
                    {
                        intCurrentIndex = intSpectrumIndex;

                        ChemstationMSFileReader.clsSpectralRecord oSpectrum = null;
                        List <float> lstMZs         = null;
                        List <Int32> lstIntensities = null;
                        const int    intMSLevel     = 1;

                        bool blnValidSpectrum;
                        try {
                            oReader.GetSpectrum(intSpectrumIndex, ref oSpectrum);
                            lstMZs           = oSpectrum.Mzs;
                            lstIntensities   = oSpectrum.Intensities;
                            blnValidSpectrum = true;
                        } catch (Exception ex) {
                            OnWarningEvent("Exception obtaining data from the MS file for spectrum index " + intCurrentIndex + ": " + ex.Message);
                            blnValidSpectrum = false;
                        }

                        if (blnValidSpectrum)
                        {
                            var objScanStatsEntry = new clsScanStatsEntry
                            {
                                ScanNumber                 = intSpectrumIndex + 1,
                                ScanType                   = intMSLevel,
                                ScanTypeName               = "GC-MS",
                                ScanFilterText             = "",
                                ElutionTime                = oSpectrum.RetentionTimeMinutes.ToString("0.0###"),
                                TotalIonIntensity          = StringUtilities.ValueToString(oSpectrum.TIC, 1),
                                BasePeakIntensity          = StringUtilities.ValueToString(oSpectrum.BasePeakAbundance, 1),
                                BasePeakMZ                 = oSpectrum.BasePeakMZ.ToString("0.0###"),
                                BasePeakSignalToNoiseRatio = "0",
                                IonCount                   = lstMZs.Count
                            };

                            objScanStatsEntry.IonCountRaw = objScanStatsEntry.IonCount;

                            mDatasetStatsSummarizer.AddDatasetScan(objScanStatsEntry);

                            if (mSaveTICAndBPI)
                            {
                                mTICandBPIPlot.AddData(objScanStatsEntry.ScanNumber, intMSLevel, oSpectrum.RetentionTimeMinutes, oSpectrum.BasePeakAbundance, oSpectrum.TIC);

                                if (lstMZs.Count > 0)
                                {
                                    var dblIonsMZ        = new double[lstMZs.Count];
                                    var dblIonsIntensity = new double[lstMZs.Count];

                                    for (var intIndex = 0; intIndex <= lstMZs.Count - 1; intIndex++)
                                    {
                                        dblIonsMZ[intIndex]        = lstMZs[intIndex];
                                        dblIonsIntensity[intIndex] = lstIntensities[intIndex];
                                    }

                                    mLCMS2DPlot.AddScan(objScanStatsEntry.ScanNumber, intMSLevel, oSpectrum.RetentionTimeMinutes, dblIonsMZ.Length, dblIonsMZ, dblIonsIntensity);
                                }
                            }

                            if (mCheckCentroidingStatus)
                            {
                                var lstMzDoubles = new List <double>(lstMZs.Count);
                                lstMzDoubles.AddRange(lstMZs.Select(ion => (double)ion));
                                mDatasetStatsSummarizer.ClassifySpectrum(lstMzDoubles, intMSLevel);
                            }
                        }
                    }
                }

                blnSuccess = true;
            } catch (Exception ex) {
                // Exception reading file
                OnWarningEvent("Exception reading data from the MS file at spectrum index " + intCurrentIndex + ": " + ex.Message);
                blnSuccess = false;
            }

            return(blnSuccess);
        }
Пример #4
0
        private void LoadScanDetails(XRawFileIO objXcaliburAccessor)
        {
            OnStatusEvent("  Loading scan details");

            if (mSaveTICAndBPI)
            {
                // Initialize the TIC and BPI arrays
                InitializeTICAndBPI();
            }

            if (mSaveLCMS2DPlots)
            {
                InitializeLCMS2DPlot();
            }

            var dtLastProgressTime = DateTime.UtcNow;

            var scanCount = objXcaliburAccessor.GetNumScans();

            GetStartAndEndScans(scanCount, out var scanStart, out var scanEnd);

            for (var scanNumber = scanStart; scanNumber <= scanEnd; scanNumber++)
            {
                clsScanInfo scanInfo;

                try
                {
                    var blnSuccess = objXcaliburAccessor.GetScanInfo(scanNumber, out scanInfo);

                    if (blnSuccess)
                    {
                        if (mSaveTICAndBPI)
                        {
                            mTICandBPIPlot.AddData(
                                scanNumber,
                                scanInfo.MSLevel,
                                (float)scanInfo.RetentionTime,
                                scanInfo.BasePeakIntensity,
                                scanInfo.TotalIonCurrent);
                        }

                        var objScanStatsEntry = new clsScanStatsEntry
                        {
                            ScanNumber                 = scanNumber,
                            ScanType                   = scanInfo.MSLevel,
                            ScanTypeName               = XRawFileIO.GetScanTypeNameFromFinniganScanFilterText(scanInfo.FilterText),
                            ScanFilterText             = XRawFileIO.MakeGenericFinniganScanFilter(scanInfo.FilterText),
                            ElutionTime                = scanInfo.RetentionTime.ToString("0.0###"),
                            TotalIonIntensity          = StringUtilities.ValueToString(scanInfo.TotalIonCurrent, 5),
                            BasePeakIntensity          = StringUtilities.ValueToString(scanInfo.BasePeakIntensity, 5),
                            BasePeakMZ                 = scanInfo.BasePeakMZ.ToString("0.0###"),
                            BasePeakSignalToNoiseRatio = "0",
                            IonCount                   = scanInfo.NumPeaks,
                            IonCountRaw                = scanInfo.NumPeaks
                        };

                        // Store the ScanEvent values in .ExtendedScanInfo
                        StoreExtendedScanInfo(ref objScanStatsEntry.ExtendedScanInfo, scanInfo.ScanEvents);

                        // Store the collision mode and the scan filter text
                        objScanStatsEntry.ExtendedScanInfo.CollisionMode  = scanInfo.CollisionMode;
                        objScanStatsEntry.ExtendedScanInfo.ScanFilterText = scanInfo.FilterText;

                        mDatasetStatsSummarizer.AddDatasetScan(objScanStatsEntry);
                    }
                }
                catch (Exception ex)
                {
                    OnErrorEvent("Error loading header info for scan " + scanNumber + ": " + ex.Message);
                    continue;
                }

                try
                {
                    if (mSaveLCMS2DPlots | mCheckCentroidingStatus)
                    {
                        // Also need to load the raw data

                        // Load the ions for this scan
                        var intIonCount = objXcaliburAccessor.GetScanData2D(scanNumber, out var dblMassIntensityPairs);

                        if (intIonCount > 0)
                        {
                            if (mSaveLCMS2DPlots)
                            {
                                mLCMS2DPlot.AddScan2D(scanNumber, scanInfo.MSLevel, (float)scanInfo.RetentionTime, intIonCount, dblMassIntensityPairs);
                            }

                            if (mCheckCentroidingStatus)
                            {
                                var mzCount = dblMassIntensityPairs.GetLength(1);

                                var lstMZs = new List <double>(mzCount);

                                for (var i = 0; i <= mzCount - 1; i++)
                                {
                                    lstMZs.Add(dblMassIntensityPairs[0, i]);
                                }

                                var centroidingStatus = GetCentroidStatus(scanNumber, scanInfo);

                                mDatasetStatsSummarizer.ClassifySpectrum(lstMZs, scanInfo.MSLevel, centroidingStatus);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    OnErrorEvent("Error loading m/z and intensity values for scan " + scanNumber + ": " + ex.Message);
                }

                var percentComplete = scanNumber / (float)scanCount * 100;
                OnProgressUpdate("Scans processed: " + scanNumber, percentComplete);

                ShowProgress(scanNumber, scanCount, ref dtLastProgressTime);
            }

            Console.WriteLine();
        }
Пример #5
0
        /// <summary>
        /// Examines the subdirectories in the specified zip file
        /// Determines the oldest and newest modified analysis.baf files (or apexAcquisition.method file if analysis.baf files are not found)
        /// Presumes this is the AcqStartTime and AcqEndTime
        /// </summary>
        /// <param name="fiZipFile"></param>
        /// <param name="datasetFileInfo"></param>
        /// <returns>True if at least one valid file is found; otherwise false</returns>
        /// <remarks></remarks>
        private void DetermineAcqStartEndTime(FileInfo fiZipFile, clsDatasetFileInfo datasetFileInfo)
        {
            var blnSuccess = false;

            try
            {
                // Bump up the file size
                datasetFileInfo.FileSizeBytes += fiZipFile.Length;

                var lstFileNamesToFind = new List <string> {
                    "analysis.baf",
                    "apexAcquisition.method",
                    "submethods.xml"
                };

                var oZipFile = new Ionic.Zip.ZipFile(fiZipFile.FullName);

                foreach (var strFileNameToFind in lstFileNamesToFind)
                {
                    using (var oZipEntry = oZipFile.GetEnumerator())
                    {
                        while (oZipEntry.MoveNext())
                        {
                            if (oZipEntry.Current == null)
                            {
                                continue;
                            }

                            if (oZipEntry.Current.IsDirectory)
                            {
                                continue;
                            }

                            // Split the filename on the forward slash character
                            var strNameParts = oZipEntry.Current.FileName.Split('/');

                            if (strNameParts.Length <= 0)
                            {
                                continue;
                            }

                            if (!string.Equals(strNameParts[strNameParts.Length - 1], strFileNameToFind, StringComparison.CurrentCultureIgnoreCase))
                            {
                                continue;
                            }

                            if (oZipEntry.Current.LastModified < datasetFileInfo.AcqTimeStart)
                            {
                                datasetFileInfo.AcqTimeStart = oZipEntry.Current.LastModified;
                            }

                            if (oZipEntry.Current.LastModified > datasetFileInfo.AcqTimeEnd)
                            {
                                datasetFileInfo.AcqTimeEnd = oZipEntry.Current.LastModified;
                            }

                            // Bump up the scan count
                            datasetFileInfo.ScanCount += 1;

                            // Add a Scan Stats entry
                            var objScanStatsEntry = new clsScanStatsEntry
                            {
                                ScanNumber                 = datasetFileInfo.ScanCount,
                                ScanType                   = 1,
                                ScanTypeName               = "MALDI-HMS",
                                ScanFilterText             = "",
                                ElutionTime                = "0",
                                TotalIonIntensity          = "0",
                                BasePeakIntensity          = "0",
                                BasePeakMZ                 = "0",
                                BasePeakSignalToNoiseRatio = "0",
                                IonCount                   = 0,
                                IonCountRaw                = 0
                            };

                            // Base peak signal to noise ratio

                            mDatasetStatsSummarizer.AddDatasetScan(objScanStatsEntry);

                            blnSuccess = true;
                        }
                    }

                    if (blnSuccess)
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                OnErrorEvent("Error in DetermineAcqStartEndTime: " + ex.Message);
            }
        }