public override void Execute(ResultCollection resultList) { Check.Require(resultList.Run.CurrentMassTag != null, this.Name + " failed. MassTag was not defined."); var currentResult = resultList.GetTargetedResult(resultList.Run.CurrentMassTag); if (msgen == null) { msgen = MSGeneratorFactory.CreateMSGenerator(resultList.Run.MSFileType); msgen.IsTICRequested = false; } var currentTarget = resultList.Run.CurrentMassTag; // Set the MS Generator to use a window around the target so that we do not grab a lot of unecessary data from the UIMF file msgen.MinMZ = currentTarget.MZ - 10; msgen.MaxMZ = currentTarget.MZ + 10; float normalizedElutionTime; if (currentResult.Run.CurrentMassTag.ElutionTimeUnit == DeconTools.Backend.Globals.ElutionTimeUnit.ScanNum) { normalizedElutionTime = resultList.Run.CurrentMassTag.ScanLCTarget / (float)currentResult.Run.GetNumMSScans(); } else { normalizedElutionTime = resultList.Run.CurrentMassTag.NormalizedElutionTime; } //collect Chrom peaks that fall within the NET tolerance var peaksWithinTol = new List <ChromPeak>(); // foreach (ChromPeak peak in resultList.Run.PeakList) { if (Math.Abs(peak.NETValue - normalizedElutionTime) <= Parameters.NETTolerance) //peak.NETValue was determined by the ChromPeakDetector or a future ChromAligner Task { peaksWithinTol.Add(peak); } } var peakQualityList = new List <ChromPeakQualityData>(); //iterate over peaks within tolerance and score each peak according to MSFeature quality #if DEBUG var tempMinScanWithinTol = (int)resultList.Run.NetAlignmentInfo.GetScanForNet(normalizedElutionTime - Parameters.NETTolerance); var tempMaxScanWithinTol = (int)resultList.Run.NetAlignmentInfo.GetScanForNet(normalizedElutionTime + Parameters.NETTolerance); var tempCenterTol = (int)resultList.Run.NetAlignmentInfo.GetScanForNet(normalizedElutionTime); Console.WriteLine("SmartPeakSelector --> NETTolerance= " + Parameters.NETTolerance + "; chromMinCenterMax= " + tempMinScanWithinTol + "\t" + tempCenterTol + "" + "\t" + tempMaxScanWithinTol); Console.WriteLine("MT= " + currentResult.Target.ID + ";z= " + currentResult.Target.ChargeState + "; mz= " + currentResult.Target.MZ.ToString("0.000") + "; ------------------------- PeaksWithinTol = " + peaksWithinTol.Count); #endif currentResult.NumChromPeaksWithinTolerance = peaksWithinTol.Count; currentResult.NumQualityChromPeaks = -1; ChromPeak bestChromPeak; if (currentResult.NumChromPeaksWithinTolerance > _parameters.NumChromPeaksAllowed) { bestChromPeak = null; } else { foreach (var chromPeak in peaksWithinTol) { var pq = new ChromPeakQualityData(chromPeak); peakQualityList.Add(pq); // TODO: Currently hard-coded to sum only 1 scan resultList.Run.CurrentScanSet = ChromPeakUtilities.GetLCScanSetForChromPeakUIMF(chromPeak, resultList.Run, 1); //This resets the flags and the scores on a given result currentResult.ResetResult(); //generate a mass spectrum msgen.Execute(resultList); //find isotopic profile TargetedMSFeatureFinder.Execute(resultList); //get fit score fitScoreCalc.Execute(resultList); //get i_score resultValidator.Execute(resultList); //collect the results together AddScoresToPeakQualityData(pq, currentResult); #if DEBUG pq.Display(); #endif } //run a algorithm that decides, based on fit score mostly. bestChromPeak = determineBestChromPeak(peakQualityList, currentResult); } currentResult.ChromPeakQualityList = peakQualityList; resultList.Run.CurrentScanSet = ChromPeakUtilities.GetLCScanSetForChromPeakUIMF(bestChromPeak, resultList.Run, Parameters.NumScansToSum); UpdateResultWithChromPeakAndLCScanInfo(currentResult, bestChromPeak); }
/// <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."); } var lcscanset = _chromPeakUtilities.GetLCScanSetForChromPeak(target.ChromPeak, Run, WorkflowParameters.SmartChromPeakSelectorNumMSSummed); //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); //Default Worst Scores double iscore = 1; //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 O16 profile var observedIsoList = result.ObservedIsotopicProfile.Peaklist.Cast <Peak>().Take(4).ToList(); //first 4 peaks excludes the O18 double label peak (fifth peak) var theorPeakList = target.TheorIsotopicProfile.Peaklist.Select(p => (Peak)p).Take(4).ToList(); result.FitScore = PeakFitter.GetFit(theorPeakList, observedIsoList, 0.05, WorkflowParameters.MSToleranceInPPM); // fit score O18 profile var o18Iso = ((O16O18IqResult)result).ConvertO16ProfileToO18(target.TheorIsotopicProfile, 4); theorPeakList = o18Iso.Peaklist.Select(p => (Peak)p).ToList(); observedIsoList = result.ObservedIsotopicProfile.Peaklist.Cast <Peak>().Skip(4).ToList(); //skips the first 4 peaks and thus includes the O18 double label isotopic profile ((O16O18IqResult)result).FitScoreO18Profile = PeakFitter.GetFit(theorPeakList, observedIsoList, 0.05, WorkflowParameters.MSToleranceInPPM); //get i_score 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; var sigma = target.ChromPeak.Width / 2.35; var chromScanWindowWidth = 4 * sigma; //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.InterferenceScore = iscore; result.IsIsotopicProfileFlagged = hasPeakTotheLeft; result.NETError = netError; result.MassErrorBefore = ppmError; result.IqResultDetail.MassSpectrum = massSpectrumXYData; result.Abundance = GetAbundance(result); } }