/// <summary> /// Construct PeakFitter from initialpeakguess, histogam edges+values, /// </summary> /// <param name="guess">Initial peak guess.</param> /// <param name="edges">edges of the truncated histogram</param> /// <param name="y">histogram value</param> /// <param name="sigma">Uncertainty on Y</param> /// <returns>PeakFitter</returns> public static PeakFitter FromGuess(InitialPeakGuess guess, double[] edges, double[] y, double[] sigma = null) { PeakingPDF pdf = PeakingPDF.OfInitialPeakGuess(guess); BinChi2 x2 = new BinChi2(pdf.Compute, edges, y, sigma); string[] paramnames = pdf.ParamNames(); //full paramname with x string[] pname = new string[paramnames.Length - 1]; //Dock off x for (int i = 0; i < pname.Length; i++) { pname[i] = paramnames[i + 1]; } Minuit minuit = new Minuit((FCN)(x2.Compute), pname); minuit.SetInitialValue("mu", guess.mu); minuit.SetInitialValue("sigma", guess.sigma); minuit.SetInitialValue("nsig", guess.nsig); minuit.SetInitialValue("m", guess.m); minuit.SetInitialValue("c", guess.c); minuit.SetInitialValue("nbkg", guess.nbkg); PeakFitter ret = new PeakFitter() { pdf = pdf, minuit = minuit, edges=edges}; return ret; }
/// <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); } }