/// <summary> /// Calculates Metrics based on ChromPeakIqTarget /// NET Error, Mass Error, Isotopic Fit, & Isotope Correlation /// </summary> protected override void ExecuteWorkflow(IqResult result) { result.IsExported = false; if (MSGenerator == null) { MSGenerator = MSGeneratorFactory.CreateMSGenerator(Run.MSFileType); MSGenerator.IsTICRequested = false; } var target = result.Target as ChromPeakIqTarget; if (target == null) { throw new NullReferenceException("The ChromPeakAnalyzerIqWorkflow only works with the ChromPeakIqTarget."); } MSGenerator.MinMZ = target.MZTheor - 2; MSGenerator.MaxMZ = target.MZTheor + 5; //Sums Scan var lcscanset = _chromPeakUtilities.GetLCScanSetForChromPeak(target.ChromPeak, Run, WorkflowParameters.NumMSScansToSum); //Generate a mass spectrum var massSpectrumXYData = MSGenerator.GenerateMS(Run, lcscanset); //massSpectrumXYData = massSpectrumXYData.TrimData(result.Target.MZTheor - 5, result.Target.MZTheor + 15); //Find isotopic profile List <Peak> mspeakList; result.ObservedIsotopicProfile = TargetedMSFeatureFinder.IterativelyFindMSFeature(massSpectrumXYData, target.TheorIsotopicProfile, out mspeakList); //Get NET Error var netError = target.ChromPeak.NETValue - target.ElutionTimeTheor; var leftOfMonoPeakLooker = new LeftOfMonoPeakLooker(); var peakToTheLeft = leftOfMonoPeakLooker.LookforPeakToTheLeftOfMonoPeak(target.TheorIsotopicProfile.getMonoPeak(), target.ChargeState, mspeakList); var hasPeakTotheLeft = peakToTheLeft != null; if (result.ObservedIsotopicProfile == null) { result.IsotopicProfileFound = false; result.FitScore = 1; } else { //Get fit score var observedIsoList = result.ObservedIsotopicProfile.Peaklist.Cast <Peak>().ToList(); var minIntensityForScore = 0.05; var fitScore = PeakFitter.GetFit(target.TheorIsotopicProfile.Peaklist.Select(p => (Peak)p).ToList(), observedIsoList, minIntensityForScore, WorkflowParameters.MSToleranceInPPM); //get i_score var iscore = InterferenceScorer.GetInterferenceScore(result.ObservedIsotopicProfile, mspeakList); //get ppm error var massErrorInDaltons = TheorMostIntensePeakMassError(target.TheorIsotopicProfile, result.ObservedIsotopicProfile, target.ChargeState); var ppmError = (massErrorInDaltons / target.MonoMassTheor) * 1e6; //Get Isotope Correlation var scan = lcscanset.PrimaryScanNumber; double chromScanWindowWidth = target.ChromPeak.Width * 2; //Determines where to start and stop chromatogram correlation var startScan = scan - (int)Math.Round(chromScanWindowWidth / 2, 0); var stopScan = scan + (int)Math.Round(chromScanWindowWidth / 2, 0); result.CorrelationData = ChromatogramCorrelator.CorrelateData(Run, result, startScan, stopScan); result.LcScanObs = lcscanset.PrimaryScanNumber; result.ChromPeakSelected = target.ChromPeak; result.LCScanSetSelected = new ScanSet(lcscanset.PrimaryScanNumber); result.IsotopicProfileFound = true; result.FitScore = fitScore; result.InterferenceScore = iscore; result.IsIsotopicProfileFlagged = hasPeakTotheLeft; result.NETError = netError; result.MassErrorBefore = ppmError; result.IqResultDetail.MassSpectrum = massSpectrumXYData; result.Abundance = GetAbundance(result); } Display(result); }
public IsotopicProfileComponent FindBestLabeledProfile(TargetBase target, List <Peak> massSpectrumPeakList, XYData massSpectrumXYData = null) { IsotopicProfile bestIso = null; var bestFitScore = 1.0; double bestLabelAmount = -1; Check.Require(target != null, "Target is null. You need a valid target in order to quantify it."); Check.Require(target.IsotopicProfile != null, "Target's theoretical isotopic profile is null. You need to create it first."); //create theor profiles to iterate over and use in fitting _theorLabeledProfiles.Clear(); FitScoreData.Clear(); for (var labelAmount = MinLabelAmount; labelAmount < MaxLabelAmount; labelAmount = labelAmount + StepAmountForIterator) { var theorIso = _isoCreator.CreateIsotopicProfileFromEmpiricalFormula(target.EmpiricalFormula, _elementLabeled, _lightIsotope, _heavyIsotope, labelAmount, target.ChargeState); var indexOfMostAbundantTheorPeak = theorIso.GetIndexOfMostIntensePeak(); var indexOfCorrespondingObservedPeak = PeakUtilities.getIndexOfClosestValue(massSpectrumPeakList, theorIso.getMostIntensePeak().XValue, 0, massSpectrumPeakList.Count - 1, 0.1); double fitScore; var obsPeakListForFitter = new List <Peak>(); if (indexOfCorrespondingObservedPeak < 0) // most abundant peak isn't present in the actual theoretical profile... problem! { fitScore = 1; } else { //double mzOffset = massSpectrumPeakList[indexOfCorrespondingObservedPeak].XValue - theorIso.Peaklist[indexOfMostAbundantTheorPeak].XValue; var minIntensityForFitting = 0.02; var theorPeakListForFitter = new List <Peak>(theorIso.Peaklist).Where(p => p.Height > minIntensityForFitting).ToList(); obsPeakListForFitter = FilterPeaksBasedOnBasePeakList(theorPeakListForFitter, massSpectrumPeakList); AddLeftZeroPads(obsPeakListForFitter, NumLeftZeroPads, theorIso.ChargeState); AddRightZeroPads(obsPeakListForFitter, NumRightZeroPads, theorIso.ChargeState); if (IsTheoreticalTrimmedDownToObserved) { theorPeakListForFitter = FilterPeaksBasedOnBasePeakList(obsPeakListForFitter, theorPeakListForFitter); } //foreach (var peak in obsPeakListForFitter) //{ // Console.WriteLine(peak.XValue + "\t" + peak.Height); //} //foreach (var peak in theorPeakListForFitter) //{ // Console.WriteLine(peak.XValue + "\t" + peak.Height); //} const int numPeaksToTheLeftForScoring = 0; fitScore = _leastSquaresFitter.GetFit(theorPeakListForFitter, obsPeakListForFitter, 0, 30, numPeaksToTheLeftForScoring, out var ionCountUsed); //if (double.IsNaN(fitScore) || fitScore > 1) fitScore = 1; } if (fitScore < bestFitScore) { bestFitScore = fitScore; if (massSpectrumXYData == null) { bestIso = new IsotopicProfile { Peaklist = new List <MSPeak>() }; foreach (var peak in obsPeakListForFitter) { bestIso.Peaklist.Add(new MSPeak(peak.XValue, peak.Height, peak.Width, 0)); } bestIso.ChargeState = theorIso.ChargeState; } else { bestIso = _iterativeTff.IterativelyFindMSFeature(massSpectrumXYData, theorIso); } if (bestIso != null) { bestIso.Score = fitScore; } bestLabelAmount = labelAmount; } FitScoreData.Add((decimal)labelAmount, fitScore); _theorLabeledProfiles.Add(theorIso); } var isoComponent = new IsotopicProfileComponent(bestIso, 0, bestLabelAmount); return(isoComponent); }
public List <ChromPeakQualityData> GetChromPeakQualityData(Run run, IqTarget target, List <Peak> chromPeakList) { var peakQualityList = new List <ChromPeakQualityData>(); if (MSGenerator == null) { MSGenerator = MSGeneratorFactory.CreateMSGenerator(run.MSFileType); MSGenerator.IsTICRequested = false; } //iterate over peaks within tolerance and score each peak according to MSFeature quality #if DEBUG var tempMinScanWithinTol = (int)run.NetAlignmentInfo.GetScanForNet(target.ElutionTimeTheor - Parameters.ChromNETTolerance); var tempMaxScanWithinTol = (int)run.NetAlignmentInfo.GetScanForNet(target.ElutionTimeTheor + Parameters.ChromNETTolerance); var tempCenterTol = (int)run.NetAlignmentInfo.GetScanForNet(target.ElutionTimeTheor); Console.WriteLine("SmartPeakSelector --> NETTolerance= " + Parameters.ChromNETTolerance + "; chromMinCenterMax= " + tempMinScanWithinTol + "\t" + tempCenterTol + "" + "\t" + tempMaxScanWithinTol); Console.WriteLine("MT= " + target.ID + ";z= " + target.ChargeState + "; mz= " + target.MZTheor.ToString("0.000") + "; ------------------------- PeaksWithinTol = " + chromPeakList.Count); #endif //target.NumChromPeaksWithinTolerance = peaksWithinTol.Count; foreach (ChromPeak chromPeak in chromPeakList) { // TODO: Currently hard-coded to sum only 1 scan var lcscanset = _chromPeakUtilities.GetLCScanSetForChromPeak(chromPeak, run, 1); //generate a mass spectrum var massSpectrumXYData = MSGenerator.GenerateMS(run, lcscanset); //find isotopic profile var mspeakList = new List <Peak>(); var observedIso = TargetedMSFeatureFinder.IterativelyFindMSFeature(massSpectrumXYData, target.TheorIsotopicProfile, out mspeakList); double fitScore = 1; double iscore = 1; //get fit score fitScore = FitScoreCalc.CalculateFitScore(target.TheorIsotopicProfile, observedIso, massSpectrumXYData); //get i_score iscore = InterferenceScorer.GetInterferenceScore(target.TheorIsotopicProfile, mspeakList); var leftOfMonoPeakLooker = new LeftOfMonoPeakLooker(); var peakToTheLeft = leftOfMonoPeakLooker.LookforPeakToTheLeftOfMonoPeak(target.TheorIsotopicProfile.getMonoPeak(), target.ChargeState, mspeakList); var hasPeakTotheLeft = peakToTheLeft != null; //collect the results together var pq = new ChromPeakQualityData(chromPeak); if (observedIso == null) { pq.IsotopicProfileFound = false; } else { pq.IsotopicProfileFound = true; pq.Abundance = observedIso.IntensityMostAbundant; pq.FitScore = fitScore; pq.InterferenceScore = iscore; pq.IsotopicProfile = observedIso; pq.IsIsotopicProfileFlagged = hasPeakTotheLeft; pq.ScanLc = lcscanset.PrimaryScanNumber; } peakQualityList.Add(pq); #if DEBUG pq.Display(); #endif } return(peakQualityList); }
protected virtual void ExecuteWorkflow(IqResult result) { result.Target.TheorIsotopicProfile = TheorFeatureGen.GenerateTheorProfile(result.Target.EmpiricalFormula, result.Target.ChargeState); result.IqResultDetail.Chromatogram = ChromGen.GenerateChromatogram(Run, result.Target.TheorIsotopicProfile, result.Target.ElutionTimeTheor); result.IqResultDetail.Chromatogram = ChromSmoother.Smooth(result.IqResultDetail.Chromatogram); result.ChromPeakList = ChromPeakDetector.FindPeaks(result.IqResultDetail.Chromatogram); ChromPeakDetector.CalculateElutionTimes(Run, result.ChromPeakList); ChromPeakDetector.FilterPeaksOnNET(WorkflowParameters.ChromNETTolerance, result.Target.ElutionTimeTheor, result.ChromPeakList); result.IqResultDetail.ChromPeakQualityData = ChromPeakAnalyzer.GetChromPeakQualityData(Run, result.Target, result.ChromPeakList); var filterOutFlagged = result.Target.TheorIsotopicProfile.GetIndexOfMostIntensePeak() == 0; result.ChromPeakSelected = ChromPeakSelector.SelectBestPeak(result.IqResultDetail.ChromPeakQualityData, filterOutFlagged); result.LCScanSetSelected = ChromPeakUtilities.GetLCScanSetForChromPeak(result.ChromPeakSelected, Run, WorkflowParameters.NumMSScansToSum); result.LcScanObs = result.LCScanSetSelected == null ? -1 : result.LCScanSetSelected.PrimaryScanNumber; result.IqResultDetail.MassSpectrum = MSGenerator.GenerateMS(Run, result.LCScanSetSelected); TrimData(result.IqResultDetail.MassSpectrum, result.Target.MZTheor, MsLeftTrimAmount, MsRightTrimAmount); List <Peak> mspeakList; result.ObservedIsotopicProfile = MsfeatureFinder.IterativelyFindMSFeature(result.IqResultDetail.MassSpectrum, result.Target.TheorIsotopicProfile, out mspeakList); result.FitScore = FitScoreCalc.CalculateFitScore(result.Target.TheorIsotopicProfile, result.ObservedIsotopicProfile, result.IqResultDetail.MassSpectrum); result.InterferenceScore = InterferenceScorer.GetInterferenceScore(result.ObservedIsotopicProfile, mspeakList); //if (_workflowParameters.ChromatogramCorrelationIsPerformed) //{ // ExecuteTask(_chromatogramCorrelator); //} result.MonoMassObs = result.ObservedIsotopicProfile == null ? 0 : result.ObservedIsotopicProfile.MonoIsotopicMass; result.MZObs = result.ObservedIsotopicProfile == null ? 0 : result.ObservedIsotopicProfile.MonoPeakMZ; result.MZObsCalibrated = result.ObservedIsotopicProfile == null ? 0 : Run.GetAlignedMZ(result.ObservedIsotopicProfile.MonoPeakMZ, result.LcScanObs); result.MonoMassObsCalibrated = result.ObservedIsotopicProfile == null ? 0 : (result.MZObsCalibrated - DeconTools.Backend.Globals.PROTON_MASS) * result.Target.ChargeState; var elutionTime = result.ChromPeakSelected == null ? 0d : ((ChromPeak)result.ChromPeakSelected).NETValue; result.ElutionTimeObs = elutionTime; result.Abundance = GetAbundance(result); }