Beispiel #1
0
        private static void TestScanFilterParsing()
        {
            // Note: See also the unit test classes in the ThermoRawFileReaderUnitTests project

            var filterList = new List <string>
            {
                "ITMS + c ESI Full ms [300.00-2000.00]",
                "FTMS + p NSI Full ms [400.00-2000.00]",
                "ITMS + p ESI d Z ms [579.00-589.00]",
                "ITMS + c ESI d Full ms2 [email protected] [150.00-1180.00]",
                "ITMS + c NSI d Full ms2 [email protected] [50.00-2000.00]",
                "FTMS + c NSI d Full ms2 [email protected] [100.00-2000.00]",
                "ITMS + c NSI d sa Full ms2 [email protected] [50.00-2000.00]",
                "+ c d Full ms2 [email protected] [ 350.00-2000.00]",
                "+ c d Full ms3 [email protected] [email protected] [ 350.00-2000.00]",
                "ITMS + c NSI d Full ms10 [email protected]",
                "+ p ms2 [email protected] [210.00-1200.00]",
                "+ c NSI SRM ms2 [email protected] [507.259-507.261, 635-319-635.32]",
                "+ c NSI SRM ms2 748.371 [701.368-701.370, 773.402-773.404, 887.484-887.486, 975.513-975.515]",
                "+ p NSI Q1MS [179.652-184.582, 505.778-510.708, 994.968-999.898]",
                "+ p NSI Q3MS [150.070-1500.000]",
                "c NSI Full cnl 162.053 [300.000-1200.000]",
                "- p NSI Full ms2 168.070 [300.000-1500.00]",
                "+ c NSI Full ms2 1083.000 [300.000-1500.00]",
                "- p NSI Full ms2 247.060 [300.000-1500.00]",
                "- c NSI d Full ms2 921.597 [300.000-1500.00]",
                "+ c NSI SRM ms2 965.958 [300.000-1500.00]",
                "+ p NSI SRM ms2 1025.250 [300.000-1500.00]",
                "+ c EI SRM ms2 247.000 [300.000-1500.00]",
                "+ p NSI Full ms2 589.840 [300.070-1200.000]",
                "+ p NSI ms [0.316-316.000]",
                "ITMS + p NSI SIM ms",
                "ITMS + c NSI d SIM ms",
                "FTMS + p NSI SIM ms",
                "FTMS + p NSI d SIM ms"
            };

            foreach (var filterItem in filterList)
            {
                var genericFilter = XRawFileIO.MakeGenericFinniganScanFilter(filterItem);
                var scanType      = XRawFileIO.GetScanTypeNameFromFinniganScanFilterText(filterItem);

                Console.WriteLine(filterItem);
                Console.WriteLine("  {0,-12} {1}", scanType, genericFilter);

                var validMS1Scan = XRawFileIO.ValidateMSScan(filterItem, out var msLevel, out var simScan, out var mrmScanType, out var zoomScan);

                if (validMS1Scan)
                {
                    if (mrmScanType == MRMScanTypeConstants.NotMRM)
                    {
                        Console.Write("  MSLevel={0}", msLevel);
                    }
                    else
                    {
                        Console.Write("  MSLevel={0}, MRMScanType={1}", msLevel, mrmScanType);
                    }

                    if (simScan)
                    {
                        Console.Write(", SIM Scan");
                    }

                    if (zoomScan)
                    {
                        Console.Write(", Zoom Scan");
                    }

                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine("  Not an MS1, SRM, MRM, or SIM scan");
                }

                Console.WriteLine();
            }

            Console.WriteLine();
        }
Beispiel #2
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);
        }
Beispiel #3
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();
        }