public static RawMetricsDataDDA GetMetricsDataDDA(ScanMetaDataCollectionDDA metaData, MethodDataContainer methodData, string rawFileName, RetentionTimeCollection retentionTimes, ScanIndex index, PrecursorPeakCollection peakData, PrecursorScanCollection precursorScans, QuantDataCollection quantData = null) { RawMetricsDataDDA metricsData = new RawMetricsDataDDA(); metricsData.DateAcquired = methodData.CreationDate; metricsData.Instrument = methodData.Instrument; Console.WriteLine("Calculating metrics"); metricsData.RawFileName = rawFileName; metricsData.Instrument = methodData.Instrument; metricsData.MS1Analyzer = methodData.MassAnalyzers[MSOrderType.Ms]; metricsData.MS2Analyzer = methodData.MassAnalyzers[MSOrderType.Ms2]; metricsData.TotalAnalysisTime = retentionTimes[index.ScanEnumerators[MSOrderType.Any].Last()] - retentionTimes[index.ScanEnumerators[MSOrderType.Any].First()]; metricsData.NumberOfEsiFlags = MetricsCalculations.NumberOfEsiFlags(metaData, index); metricsData.TotalScans = index.TotalScans; metricsData.MS1Scans = index.ScanEnumerators[MSOrderType.Ms].Length; metricsData.MS2Scans = index.ScanEnumerators[MSOrderType.Ms2].Length; if (methodData.AnalysisOrder == MSOrderType.Ms3) { metricsData.MS3Analyzer = methodData.MassAnalyzers[MSOrderType.Ms3]; metricsData.MS3Scans = index.ScanEnumerators[MSOrderType.Ms3].Length; } else { metricsData.MS3Analyzer = MassAnalyzerType.Any; metricsData.MS3Scans = 0; } var pickedMs1 = new HashSet <int>((from x in index.ScanEnumerators[methodData.AnalysisOrder] select precursorScans[x].MasterScan)).ToList(); metricsData.MSOrder = methodData.AnalysisOrder; metricsData.MedianSummedMS1Intensity = MetricsCalculations.GetMedianSummedMSIntensity(metaData.SummedIntensity, index, MSOrderType.Ms); metricsData.MedianSummedMS2Intensity = MetricsCalculations.GetMedianSummedMSIntensity(metaData.SummedIntensity, index, MSOrderType.Ms2); metricsData.MedianPrecursorIntensity = (from x in peakData.Keys select peakData[x].ParentIntensity).ToArray().Percentile(50); metricsData.MedianMS1FillTime = MetricsCalculations.GetMedianMSFillTime(metaData.FillTime, index, MSOrderType.Ms); metricsData.MedianMS2FillTime = MetricsCalculations.GetMedianMSFillTime(metaData.FillTime, index, MSOrderType.Ms2); if (methodData.AnalysisOrder == MSOrderType.Ms3) { metricsData.MedianMS3FillTime = MetricsCalculations.GetMedianMSFillTime(metaData.FillTime, index, MSOrderType.Ms3); } metricsData.MeanTopN = MetricsCalculations.GetMeanMs2ScansPerCycle(metaData.MS2ScansPerCycle); metricsData.MeanDutyCycle = MetricsCalculations.GetMedianDutyCycle(metaData.DutyCycle, index); metricsData.MedianMs2FractionConsumingTop80PercentTotalIntensity = MetricsCalculations.GetMedianMs2FractionConsumingTop80PercentTotalIntensity( metaData.FractionConsumingTop80PercentTotalIntensity, index); metricsData.MS1ScanRate = metricsData.MS1Scans / metricsData.TotalAnalysisTime; metricsData.MS2ScanRate = metricsData.MS2Scans / metricsData.TotalAnalysisTime; if (methodData.AnalysisOrder == MSOrderType.Ms3) { metricsData.MS3ScanRate = metricsData.MS3Scans / metricsData.TotalAnalysisTime; } metricsData.MedianBaselinePeakWidth = peakData.PeakShapeMedians.Width.P10; metricsData.MedianHalfHeightPeakWidth = peakData.PeakShapeMedians.Width.P50; // we can't access the instrument method in Linux, so we will assume the gradient length is the length of the MS acquisition metricsData.Gradient = retentionTimes[index.allScans.Keys.Max()]; metricsData.PeakCapacity = metricsData.Gradient / metricsData.MedianHalfHeightPeakWidth; metricsData.MedianAsymmetryFactor = peakData.PeakShapeMedians.Asymmetry.P10; // add isolation interference metricsData.MedianMs1IsolationInterference = (from scan in index.ScanEnumerators[methodData.AnalysisOrder] select metaData.Ms1IsolationInterference[scan]).ToArray().Percentile(50); (double timeBefore, double timeAfter, double fracAbove) = MetricsCalculations.ChromIntensityMetrics(metaData, retentionTimes, index); metricsData.TimeBeforeFirstScanToExceedPoint1MaxIntensity = timeBefore; metricsData.TimeAfterLastScanToExceedPoint1MaxIntensity = timeAfter; metricsData.FractionOfRunAbovePoint1MaxIntensity = fracAbove; metricsData.Ms1FillTimeDistribution = new Distribution((from x in index.ScanEnumerators[MSOrderType.Ms] select metaData.FillTime[x]).ToArray()); metricsData.Ms2FillTimeDistribution = new Distribution((from x in index.ScanEnumerators[MSOrderType.Ms2] select metaData.FillTime[x]).ToArray()); if (methodData.AnalysisOrder == MSOrderType.Ms3) { metricsData.Ms3FillTimeDistribution = new Distribution((from x in index.ScanEnumerators[MSOrderType.Ms3] select metaData.FillTime[x]).ToArray()); } metricsData.PeakShape.Asymmetry.P10 = peakData.PeakShapeMedians.Asymmetry.P10; metricsData.PeakShape.Asymmetry.P50 = peakData.PeakShapeMedians.Asymmetry.P50; metricsData.PeakShape.Width.P10 = peakData.PeakShapeMedians.Width.P10; metricsData.PeakShape.Width.P50 = peakData.PeakShapeMedians.Width.P50; // now add the quant meta data, if quant was performed double medianReporterIntensity = 0; QuantMetaData quantMetaData = new QuantMetaData(); SerializableDictionary <string, double> medianReporterIntensityByChannel = new SerializableDictionary <string, double>(); if (quantData != null) { string reagent = quantData.LabelingReagents; string[] allTags = new LabelingReagents().Reagents[reagent].Labels; List <double> allChannels = new List <double>(); Dictionary <string, List <double> > byChannel = new Dictionary <string, List <double> >(); foreach (string tag in allTags) { byChannel.Add(tag, new List <double>()); } foreach (int scan in index.ScanEnumerators[methodData.AnalysisOrder]) { foreach (string tag in allTags) { byChannel[tag].Add(quantData[scan][tag].Intensity); allChannels.Add(quantData[scan][tag].Intensity); } } medianReporterIntensity = allChannels.ToArray().Percentile(50); foreach (string tag in allTags) { medianReporterIntensityByChannel[tag] = byChannel[tag].ToArray().Percentile(50); } quantMetaData.medianReporterIntensity = medianReporterIntensity; quantMetaData.medianReporterIntensityByChannel = medianReporterIntensityByChannel; quantMetaData.quantTags = allTags; metricsData.QuantMeta = quantMetaData; metricsData.IncludesQuant = true; } return(metricsData); }
public static void UniversalDDA(IRawFileThreadManager rawFileThreadManager, WorkflowParameters parameters, QcDataCollection qcDataCollection) { MethodDataContainer methodData; CentroidStreamCollection centroidStreams; SegmentScanCollection segmentScans; TrailerExtraCollection trailerExtras; PrecursorMassCollection precursorMasses; RetentionTimeCollection retentionTimes; ScanEventReactionCollection reactions; ScanMetaDataCollectionDDA metaData = null; PrecursorPeakCollection peakData = null; int nScans; var staticRawFile = rawFileThreadManager.CreateThreadAccessor(); staticRawFile.SelectInstrument(Device.MS, 1); var err = staticRawFile.FileError; if (err.HasError) { Console.WriteLine("ERROR: {0} reports error code: {1}. The associated message is: {2}", Path.GetFileName(staticRawFile.FileName), err.ErrorCode, err.ErrorMessage); Console.WriteLine("Skipping this file"); Log.Error("{FILE} reports error code: {ERRORCODE}. The associated message is: {ERRORMESSAGE}", Path.GetFileName(staticRawFile.FileName), err.ErrorCode, err.ErrorMessage); return; } //staticRawFile.CheckIfBoxcar(); (ScanIndex Index, PrecursorScanCollection precursorScans, ScanDependentsCollections scanDependents) = Extract.ScanIndicesPrecursorsDependents(rawFileThreadManager, MaxProcesses: parameters.MaxProcesses); nScans = Index.ScanEnumerators[MSOrderType.Ms2].Length; using (var rawFile = rawFileThreadManager.CreateThreadAccessor()) { reactions = Extract.ScanEvents(rawFile, Index); methodData = Extract.MethodData(rawFile, Index); (centroidStreams, segmentScans) = Extract.MsData(rawFile: rawFile, index: Index); trailerExtras = Extract.TrailerExtras(rawFile, Index); precursorMasses = Extract.PrecursorMasses(rawFile, precursorScans, trailerExtras, Index); retentionTimes = Extract.RetentionTimes(rawFile, Index); } if (parameters.ParseParams.Parse | parameters.ParseParams.Quant | parameters.ParseParams.Metrics | parameters.RefineMassCharge | parameters.QcParams.QcDirectory != null) { peakData = AnalyzePeaks.AnalyzeAllPeaks(centroidStreams, retentionTimes, precursorMasses, precursorScans, Index, parameters.MaxProcesses); if (parameters.RefineMassCharge) { MonoIsoPredictor.RefineMonoIsoMassChargeValues(parameters, centroidStreams, precursorMasses, trailerExtras, peakData, precursorScans); } metaData = MetaDataProcessingDDA.AggregateMetaDataDDA(centroidStreams, segmentScans, methodData, precursorScans, trailerExtras, precursorMasses, retentionTimes, scanDependents, reactions, Index, parameters.MaxProcesses); } QuantDataCollection quantData = null; if (parameters.ParseParams.Quant) { quantData = Quantification.Quantify(centroidStreams, segmentScans, parameters, methodData, Index); } RawMetricsDataDDA rawMetrics = null; if (parameters.ParseParams.Metrics | parameters.QcParams.QcDirectory != null) { rawMetrics = MetaDataProcessingDDA.GetMetricsDataDDA(metaData, methodData, staticRawFile.FileName, retentionTimes, Index, peakData, precursorScans, quantData); } if (parameters.ParseParams.Metrics) { MetricsWriter.WriteMatrix(rawMetrics, null, staticRawFile.FileName, parameters.ParseParams.OutputDirectory); } if (parameters.ParseParams.Parse | parameters.ParseParams.Quant) { string matrixFileName = ReadWrite.GetPathToFile(parameters.ParseParams.OutputDirectory, staticRawFile.FileName, "_Matrix.txt"); /* * ParseWriter writerDDA = new ParseWriter(matrixFileName, centroidStreams, segmentScans, metaData, retentionTimes, * precursorMasses, precursorScans, peakData, trailerExtras, Index, quantData); * writerDDA.WriteMatrixDDA(methodData.AnalysisOrder); */ MatrixWriter.ParseQuantDDA(matrixFileName, centroidStreams, segmentScans, metaData, retentionTimes, precursorMasses, precursorScans, peakData, trailerExtras, Index, quantData); } if (parameters.ParseParams.WriteMgf) { //ParseWriter writerMGF = new ParseWriter(centroidStreams, segmentScans, parameters, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index); //writerMGF.WriteMGF(staticRawFile.FileName); MgfWriter.WriteMGF(staticRawFile.FileName, centroidStreams, segmentScans, parameters, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index); } if (parameters.ParseParams.Chromatogram != null) { ChromatogramWriter.WriteChromatogram(centroidStreams, segmentScans, retentionTimes, methodData, Index, parameters, staticRawFile.FileName); } if (parameters.QcParams.QcDirectory != null) { qcDataCollection = QC.QcWorkflow.LoadOrCreateQcCollection(parameters); SearchMetricsContainer searchMetrics = new SearchMetricsContainer(staticRawFile.FileName, staticRawFile.CreationDate, methodData); // check if the raw file already exists in the QC data with a different name if (QcWorkflow.CheckIfFilePresentInQcCollection(staticRawFile.FileName, qcDataCollection)) { Log.Information("A file with the same creation date and time as {File} already exists in the QC data", staticRawFile.FileName); Console.WriteLine("A file with the same creation date and time as {File} already exists in the QC data. Skipping to next file.", staticRawFile.FileName); } else { if (parameters.QcParams.PerformSearch) { Search.WriteSearchMGF(parameters, centroidStreams, segmentScans, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index, staticRawFile.FileName, parameters.QcParams.FixedScans); Search.RunSearch(parameters, methodData, staticRawFile.FileName); searchMetrics = SearchQC.ParseSearchResults(searchMetrics, parameters, staticRawFile.FileName, nScans); } QcDataContainer qcData = new QcDataContainer(); qcData.DDA = rawMetrics; qcData.SearchMetrics = searchMetrics; QC.QcWorkflow.UpdateQcCollection(qcDataCollection, qcData, methodData, staticRawFile.FileName); } } }
public static PrecursorPeakCollection AnalyzeAllPeaks(CentroidStreamCollection centroids, RetentionTimeCollection retentionTimes, PrecursorMassCollection precursorMasses, PrecursorScanCollection precursorScans, ScanIndex index, int MaxProcesses) { ConcurrentDictionary <int, PrecursorPeakData> peaks = new ConcurrentDictionary <int, PrecursorPeakData>(); DistributionMultiple allPeaksAsymmetry = new DistributionMultiple(); DistributionMultiple allPeaksWidths = new DistributionMultiple(); var lockTarget = new object(); // this is so we can keep track of progress in the parallel loop int chunkSize = Constants.MultiThreading.ChunkSize(index.ScanEnumerators[MSOrderType.Ms2].Count()); var batches = index.ScanEnumerators[MSOrderType.Ms2].Chunk(chunkSize); ProgressIndicator P = new ProgressIndicator(total: index.ScanEnumerators[MSOrderType.Ms2].Length, message: "Analyzing precursor peaks"); P.Start(); Parallel.ForEach(batches, Constants.MultiThreading.Options(MaxProcesses), batch => { PrecursorPeakData peak; foreach (int scan in batch) { // [2018-12-04] changing to use picked mass and not monoisomass. The monoisomass might be low in intensity and would not represent the whole elution profile peak = OnePeak(centroids, retentionTimes, precursorMasses[scan].ParentMZ, precursorScans[scan].MasterScan, ddScan: scan, index: index); if (peak.NScans < 5 | peak.PeakFound == false | peak.ContainsFirstMS1Scan | peak.ContainsLastMS1Scan) { peak.PeakShape = null; } else { var newShape = GetPeakShape(peak); peak.PeakShape = newShape; allPeaksAsymmetry.Add(newShape.Asymmetry); allPeaksWidths.Add(newShape.Width); } peak.Area = CalculatePeakArea(peak); peaks.AddOrUpdate(scan, peak, (a, b) => b); lock (lockTarget) { P.Update(); } } }); P.Done(); var peaksOut = new PrecursorPeakCollection(); foreach (var item in peaks) { peaksOut.Add(item.Key, item.Value); } if (allPeaksWidths.P50.Count() == 0) { peaksOut.PeakShapeMedians = new Data.Containers.PeakShape(width: new Width(), asymmetry: new Asymmetry(), peakMax: 0); } else { peaksOut.PeakShapeMedians = new Data.Containers.PeakShape(width: allPeaksWidths.GetMedians(), asymmetry: allPeaksAsymmetry.GetMedians(), peakMax: 0); } return(peaksOut); }
public static void ParseDDA(IRawFileThreadManager rawFileThreadManager, WorkflowParameters parameters) { MethodDataContainer methodData; CentroidStreamCollection centroidStreams; SegmentScanCollection segmentScans; TrailerExtraCollection trailerExtras; PrecursorMassCollection precursorMasses; RetentionTimeCollection retentionTimes; ScanEventReactionCollection reactions; ScanMetaDataCollectionDDA metaData = null; PrecursorPeakCollection peakData = null; RawMetricsDataDDA rawMetrics = null; QuantDataCollection quantData = null; var staticRawFile = rawFileThreadManager.CreateThreadAccessor(); staticRawFile.SelectInstrument(Device.MS, 1); //staticRawFile.CheckIfBoxcar(); (ScanIndex Index, PrecursorScanCollection precursorScans, ScanDependentsCollections scanDependents) = Extract.ScanIndicesPrecursorsDependents(rawFileThreadManager); using (var rawFile = rawFileThreadManager.CreateThreadAccessor()) { reactions = Extract.ScanEvents(rawFile, Index); methodData = Extract.MethodData(rawFile, Index); (centroidStreams, segmentScans) = Extract.MsData(rawFile: rawFile, index: Index); trailerExtras = Extract.TrailerExtras(rawFile, Index); precursorMasses = Extract.PrecursorMasses(rawFile, precursorScans, trailerExtras, Index); retentionTimes = Extract.RetentionTimes(rawFile, Index); } if (parameters.ParseParams.Parse | parameters.ParseParams.Quant | parameters.ParseParams.Metrics | parameters.RefineMassCharge) { peakData = AnalyzePeaks.AnalyzeAllPeaks(centroidStreams, retentionTimes, precursorMasses, precursorScans, Index); if (parameters.RefineMassCharge) { MonoIsoPredictor.RefineMonoIsoMassChargeValues(centroidStreams, precursorMasses, trailerExtras, peakData, precursorScans); } metaData = MetaDataProcessingDDA.AggregateMetaDataDDA(centroidStreams, segmentScans, methodData, precursorScans, trailerExtras, precursorMasses, retentionTimes, scanDependents, reactions, Index); } if (parameters.ParseParams.Quant) { quantData = Quantification.Quantify(centroidStreams, segmentScans, parameters, methodData, Index); } if (parameters.ParseParams.Metrics) { rawMetrics = MetaDataProcessingDDA.GetMetricsDataDDA(metaData, methodData, staticRawFile.FileName, retentionTimes, Index, peakData, precursorScans, quantData); MetricsWriter.WriteMatrix(rawMetrics, null, staticRawFile.FileName, parameters.ParseParams.OutputDirectory); } if (parameters.ParseParams.Parse | parameters.ParseParams.Quant) { string matrixFileName = ReadWrite.GetPathToFile(parameters.ParseParams.OutputDirectory, staticRawFile.FileName, "_Matrix.txt"); /* * ParseWriter writerDDA = new ParseWriter(matrixFileName, centroidStreams, segmentScans, metaData, retentionTimes, * precursorMasses, precursorScans, peakData, trailerExtras, Index, quantData); * writerDDA.WriteMatrixDDA(methodData.AnalysisOrder); */ MatrixWriter.ParseQuantDDA(matrixFileName, centroidStreams, segmentScans, metaData, retentionTimes, precursorMasses, precursorScans, peakData, trailerExtras, Index, quantData); } if (parameters.ParseParams.WriteMgf) { //ParseWriter writerMGF = new ParseWriter(centroidStreams, segmentScans, parameters, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index); //writerMGF.WriteMGF(staticRawFile.FileName); MgfWriter.WriteMGF(staticRawFile.FileName, centroidStreams, segmentScans, parameters, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index); } if (parameters.ParseParams.Chromatogram != null) { ChromatogramWriter.WriteChromatogram(centroidStreams, segmentScans, retentionTimes, methodData, Index, parameters, staticRawFile.FileName); } }
public static void QcDDA(IRawFileThreadManager rawFileThreadManager, WorkflowParameters parameters) { MethodDataContainer methodData; CentroidStreamCollection centroidStreams; SegmentScanCollection segmentScans; TrailerExtraCollection trailerExtras; PrecursorMassCollection precursorMasses; RetentionTimeCollection retentionTimes; ScanEventReactionCollection reactions; var staticRawFile = rawFileThreadManager.CreateThreadAccessor(); staticRawFile.SelectInstrument(Device.MS, 1); staticRawFile.CheckIfBoxcar(); (ScanIndex Index, PrecursorScanCollection precursorScans, ScanDependentsCollections scanDependents) = Extract.ScanIndicesPrecursorsDependents(rawFileThreadManager); using (var rawFile = rawFileThreadManager.CreateThreadAccessor()) { methodData = Extract.MethodData(rawFile, Index); reactions = Extract.ScanEvents(rawFile, Index); (centroidStreams, segmentScans) = Extract.MsData(rawFile: rawFile, index: Index); trailerExtras = Extract.TrailerExtras(rawFile, Index); precursorMasses = Extract.PrecursorMasses(rawFile, precursorScans, trailerExtras, Index); retentionTimes = Extract.RetentionTimes(rawFile, Index); } PrecursorPeakCollection peakData = AnalyzePeaks.AnalyzeAllPeaks(centroidStreams, retentionTimes, precursorMasses, precursorScans, Index); if (parameters.RefineMassCharge) { MonoIsoPredictor.RefineMonoIsoMassChargeValues(centroidStreams, precursorMasses, trailerExtras, peakData, precursorScans); } ScanMetaDataCollectionDDA metaData = MetaDataProcessingDDA.AggregateMetaDataDDA(centroidStreams, segmentScans, methodData, precursorScans, trailerExtras, precursorMasses, retentionTimes, scanDependents, reactions, Index); RawMetricsDataDDA rawMetrics = MetaDataProcessingDDA.GetMetricsDataDDA(metaData, methodData, staticRawFile.FileName, retentionTimes, Index, peakData, precursorScans); QcDataCollection qcDataCollection = QC.QcWorkflow.LoadOrCreateQcCollection(parameters); SearchMetricsContainer searchMetrics = new SearchMetricsContainer(staticRawFile.FileName, staticRawFile.CreationDate, methodData); if (parameters.QcParams.PerformSearch) { Search.WriteSearchMGF(parameters, centroidStreams, segmentScans, retentionTimes, precursorMasses, precursorScans, trailerExtras, methodData, Index, staticRawFile.FileName, parameters.QcParams.FixedScans); Search.RunSearch(parameters, methodData, staticRawFile.FileName); searchMetrics = SearchQC.ParseSearchResults(searchMetrics, parameters, staticRawFile.FileName); } QcDataContainer qcData = new QcDataContainer(); qcData.DDA = rawMetrics; qcData.SearchMetrics = searchMetrics; QC.QcWorkflow.UpdateQcCollection(qcDataCollection, qcData, methodData, staticRawFile.FileName); staticRawFile.Dispose(); }
public static void RefineMonoIsoMassChargeValues(WorkFlows.WorkflowParameters parameters, CentroidStreamCollection centroids, PrecursorMassCollection precursorMasses, TrailerExtraCollection trailerExtras, PrecursorPeakCollection precursorPeaks, PrecursorScanCollection precursorScans) { int ms2Scan, ms1Scan, refinedCharge; double refinedMass; ProgressIndicator P = new ProgressIndicator(precursorPeaks.Count(), "Refining precursor charge and monoisotopic mass"); P.Start(); foreach (var peak in precursorPeaks) { ms2Scan = peak.Value.Ms2Scan; if (peak.Value.PeakFound) { ms1Scan = peak.Value.MaxScan; } else { ms1Scan = precursorScans[ms2Scan].MasterScan; } (refinedCharge, refinedMass) = GetMonoIsotopicMassCharge(centroids[ms1Scan], precursorMasses[ms2Scan].ParentMZ, trailerExtras[ms2Scan].ChargeState, parameters.ConsideredChargeStates.Min, parameters.ConsideredChargeStates.Max); precursorMasses[ms2Scan].MonoisotopicMZ = refinedMass; trailerExtras[ms2Scan].MonoisotopicMZ = refinedMass; trailerExtras[ms2Scan].ChargeState = refinedCharge; P.Update(); } P.Done(); }