DependentsAndPrecursorScansByScanDependents(IRawDataPlus rawFile, ScanIndex index) { rawFile.SelectInstrument(Device.MS, 1); Log.Information("Extracting scan dependents/precursor scans"); PrecursorScanCollection precursorScans = new PrecursorScanCollection(); ScanDependentsCollections dependents = new ScanDependentsCollections(); int ms2Scan = -1; int ms3Scan = -1; IEnumerable <int> scans = index.ScanEnumerators[MSOrderType.Ms]; ProgressIndicator progress = new ProgressIndicator(scans.Count(), "Indexing linked scan events"); foreach (int scan in scans) { var scanDependents = rawFile.GetScanDependents(scan, 4); dependents[scan] = scanDependents; // check if the ms1 scan has dependent scans if (scanDependents == null) { continue; } for (int i = 0; i < scanDependents.ScanDependentDetailArray.Length; i++) { if (index.AnalysisOrder == MSOrderType.Ms2) // it is ms2 { ms2Scan = scanDependents.ScanDependentDetailArray[i].ScanIndex; precursorScans[ms2Scan] = new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan); } else // it is ms3 { ms2Scan = scanDependents.ScanDependentDetailArray[i].ScanIndex; var ms2Dependents = rawFile.GetScanDependents(ms2Scan, 4).ScanDependentDetailArray; if (ms2Dependents.Length != 0) // make sure there is ms3 data { ms3Scan = ms2Dependents[0].ScanIndex; precursorScans[ms2Scan] = new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan); precursorScans[ms3Scan] = new PrecursorScanData(ms3scan: ms3Scan, ms2Scan: ms2Scan, masterScan: scan); } else { // there is no ms3 scan, so we only add the ms2 scan precursorScans[ms2Scan] = new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan); } } } progress.Update(); } progress.Done(); return(precursorScans, dependents); }
public static ScanDependentsCollections ScanDependents(IRawDataPlus rawFile, ScanIndex index) { rawFile.SelectInstrument(Device.MS, 1); ScanDependentsCollections scanDependents = new ScanDependentsCollections(); foreach (int scan in index.ScanEnumerators[MSOrderType.Ms]) { scanDependents[scan] = rawFile.GetScanDependents(scan, 4); } return(scanDependents); }
public static Dictionary <int, int> MS2ScansPerCycle(ScanDependentsCollections scanDependents, ScanIndex index) { Dictionary <int, int> mS2ScansPerCycle = new Dictionary <int, int>(); foreach (int scan in index.ScanEnumerators[MSOrderType.Ms]) { // if the ms1 scan has no scan dependents then topN = 0 if (scanDependents[scan] == null) { mS2ScansPerCycle.Add(scan, 0); } else { mS2ScansPerCycle.Add(scan, scanDependents[scan].ScanDependentDetailArray.Length); } } return(mS2ScansPerCycle); }
DependentsAndPrecursorScansByScanDependentsParallel(IRawFileThreadManager rawFileManager, ScanIndex index) { //rawFile.SelectInstrument(Device.MS, 1); Log.Information("Extracting scan dependents/precursor scans"); ConcurrentDictionary <int, PrecursorScanData> precursorScans = new ConcurrentDictionary <int, PrecursorScanData>(); ConcurrentDictionary <int, IScanDependents> dependents = new ConcurrentDictionary <int, IScanDependents>(); //Dictionary<int, PrecursorScanData> precursorScans = new Dictionary<int, PrecursorScanData>(); //Dictionary<int, IScanDependents> dependents = new Dictionary<int, IScanDependents>(); //ConcurrentBag<(int scan, PrecursorScanData data)> precursorBag = new ConcurrentBag<(int scan, PrecursorScanData data)>(); //ConcurrentBag<(int scan, IScanDependents data)> dependentsBag = new ConcurrentBag<(int scan, IScanDependents data)>(); var updateProgressLock = new object(); var addLockTarget = new object(); IEnumerable <int> scans = index.ScanEnumerators[MSOrderType.Ms]; ProgressIndicator progress = new ProgressIndicator(scans.Count(), "Indexing linked scan events"); var batches = scans.Chunk(Constants.MultiThreading.ChunkSize(scans.Count())); Parallel.ForEach(batches, Constants.MultiThreading.Options(), batch => { int ms2Scan = -1; int ms3Scan = -1; IScanDependents scanDependents; var rawFile = rawFileManager.CreateThreadAccessor(); rawFile.SelectInstrument(Device.MS, 1); foreach (int scan in batch) { scanDependents = rawFile.GetScanDependents(scan, 2); dependents.AddOrUpdate(scan, scanDependents, (a, b) => b); // check if the ms1 scan has dependent scans if (scanDependents == null) { return; } for (int i = 0; i < scanDependents.ScanDependentDetailArray.Length; i++) { if (index.AnalysisOrder == MSOrderType.Ms2) // it is ms2 { ms2Scan = scanDependents.ScanDependentDetailArray[i].ScanIndex; //precursorScans.AddOrUpdate(ms2Scan, new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan), (a, b) => b); precursorScans.TryAdd(ms2Scan, new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan)); } else // it is ms3 { ms2Scan = scanDependents.ScanDependentDetailArray[i].ScanIndex; var ms2Dependents = rawFile.GetScanDependents(ms2Scan, 2).ScanDependentDetailArray; if (ms2Dependents.Length != 0) // make sure there is ms3 data { ms3Scan = ms2Dependents[0].ScanIndex; precursorScans.AddOrUpdate(ms2Scan, new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan), (a, b) => b); precursorScans.AddOrUpdate(ms3Scan, new PrecursorScanData(ms3scan: ms3Scan, ms2Scan: ms2Scan, masterScan: scan), (a, b) => b); } else { // there is no ms3 scan, so we only add the ms2 scan precursorScans.AddOrUpdate(ms2Scan, new PrecursorScanData(ms2scan: ms2Scan, masterScan: scan), (a, b) => b); } } } lock (updateProgressLock) { progress.Update(); } } }); progress.Done(); var outScans = new PrecursorScanCollection(); var outDependents = new ScanDependentsCollections(); foreach (var item in precursorScans) { outScans.Add(item.Key, item.Value); } foreach (var item in dependents) { outDependents.Add(item.Key, item.Value); } // check for missing precursor information /* * foreach (int scan in index.ScanEnumerators[MSOrderType.Ms2]) * { * if (outScans.Keys.Contains(scan)) * { * outScans.HasPrecursorData.Add(scan, true); * } * else * { * outScans.HasPrecursorData.Add(scan, false); * } * }*/ return(outScans, outDependents); }
public static ScanMetaDataCollectionDDA AggregateMetaDataDDA(CentroidStreamCollection centroidStreams, SegmentScanCollection segmentScans, MethodDataContainer methodData, PrecursorScanCollection precursorScans, TrailerExtraCollection trailerExtras, PrecursorMassCollection precursorMasses, RetentionTimeCollection retentionTimes, ScanDependentsCollections scanDependents, ScanEventReactionCollection reactions, ScanIndex index) { //ProgressIndicator progress = new ProgressIndicator(index.ScanEnumerators[MSOrderType.Any].Count(), // "Formatting scan meta data"); ScanMetaDataCollectionDDA metaData = new ScanMetaDataCollectionDDA(); int[] scans = index.ScanEnumerators[MSOrderType.Any]; double isoWindow = MetaDataCalculations.Ms1IsoWindow(methodData); Console.WriteLine("Calculating meta data"); Console.WriteLine(" MS1 isolation interference"); metaData.Ms1IsolationInterference = MetaDataCalculations.Ms1Interference(centroidStreams, precursorMasses, trailerExtras, precursorScans, reactions, index); Console.WriteLine(" MS2 scan cycle density"); metaData.MS2ScansPerCycle = MetaDataCalculations.MS2ScansPerCycle(scanDependents, index); Console.WriteLine(" Ion injection time"); metaData.FillTime = MetaDataCalculations.FillTimes(trailerExtras, index); Console.WriteLine(" Duty cycle"); metaData.DutyCycle = MetaDataCalculations.DutyCycle(retentionTimes, index); Console.WriteLine(" Intensity distribution"); metaData.IntensityDistribution = MetaDataCalculations.IntensityDistributions(centroidStreams, segmentScans, index); Console.WriteLine(" Summed intensities"); metaData.SummedIntensity = MetaDataCalculations.SummedIntensities(centroidStreams, segmentScans, index); metaData.FractionConsumingTop80PercentTotalIntensity = MetaDataCalculations.Top80Frac(centroidStreams, segmentScans, index); //Task.WaitAll(); return(metaData); }