private PeptideDocNode Refine(PeptideDocNode nodePep, SrmDocument document, int bestResultIndex, List<int> acceptedCharges) { int minTrans = MinTransitionsPepPrecursor ?? 0; bool addedGroups = false; var listGroups = new List<TransitionGroupDocNode>(); foreach (TransitionGroupDocNode nodeGroup in nodePep.Children) { if (acceptedCharges != null && !acceptedCharges.Contains(nodeGroup.TransitionGroup.PrecursorCharge)) continue; if (!AddLabelType && RefineLabelType != null && Equals(RefineLabelType, nodeGroup.TransitionGroup.LabelType)) continue; double? peakFoundRatio = nodeGroup.GetPeakCountRatio(bestResultIndex); if (!peakFoundRatio.HasValue) { if (RemoveMissingResults) continue; } else { if (MinPeakFoundRatio.HasValue) { if (peakFoundRatio < MinPeakFoundRatio.Value) continue; } if (MaxPeakFoundRatio.HasValue) { if (peakFoundRatio > MaxPeakFoundRatio.Value) continue; } } TransitionGroupDocNode nodeGroupRefined = nodeGroup; if (AutoPickTransitionsAll && nodeGroup.AutoManageChildren == AutoPickChildrenOff) { nodeGroupRefined = (TransitionGroupDocNode) nodeGroupRefined.ChangeAutoManageChildren(!AutoPickChildrenOff); var settings = document.Settings; if (!settings.TransitionSettings.Filter.AutoSelect && !AutoPickChildrenOff) settings = settings.ChangeTransitionFilter(filter => filter.ChangeAutoSelect(!AutoPickChildrenOff)); nodeGroupRefined = nodeGroupRefined.ChangeSettings(settings, nodePep, nodePep.ExplicitMods, new SrmSettingsDiff(false, false, false, false, true, false)); } nodeGroupRefined = Refine(nodeGroupRefined, bestResultIndex); if (nodeGroupRefined.Children.Count < minTrans) continue; if (peakFoundRatio.HasValue) { if (DotProductThreshold.HasValue) { float? dotProduct = nodeGroupRefined.GetLibraryDotProduct(bestResultIndex); if (dotProduct.HasValue && dotProduct.Value < DotProductThreshold.Value) continue; } if (IdotProductThreshold.HasValue) { float? idotProduct = nodeGroupRefined.GetIsotopeDotProduct(bestResultIndex); if (idotProduct.HasValue && idotProduct.Value < IdotProductThreshold.Value) continue; } } // If this precursor node is going to be added, check to see if it // should be added with another matching isotope label type. var explicitMods = nodePep.ExplicitMods; if (IsLabelTypeRequired(nodePep, nodeGroup, listGroups) && document.Settings.TryGetPrecursorCalc(RefineLabelType, explicitMods) != null) { // CONSIDER: This is a lot like some code in PeptideDocNode.ChangeSettings Debug.Assert(RefineLabelType != null); // Keep ReSharper from warning var tranGroup = new TransitionGroup(nodePep.Peptide, nodeGroup.TransitionGroup.PrecursorCharge, RefineLabelType, false, nodeGroup.TransitionGroup.DecoyMassShift); var settings = document.Settings; // string sequence = nodePep.Peptide.Sequence; TransitionDocNode[] transitions = nodePep.GetMatchingTransitions( tranGroup, settings, explicitMods); var nodeGroupMatch = new TransitionGroupDocNode(tranGroup, Annotations.EMPTY, settings, explicitMods, nodeGroup.LibInfo, nodeGroup.ExplicitValues, null, // results transitions, transitions == null); nodeGroupMatch = nodeGroupMatch.ChangeSettings(settings, nodePep, explicitMods, SrmSettingsDiff.ALL); // Make sure it is measurable before adding it if (settings.TransitionSettings.IsMeasurablePrecursor(nodeGroupMatch.PrecursorMz)) { listGroups.Add(nodeGroupMatch); addedGroups = true; } } listGroups.Add(nodeGroupRefined); } // If groups were added, make sure everything is in the right order. if (addedGroups) listGroups.Sort(Peptide.CompareGroups); // Change the children, but only change auto-management, if the child // identities have changed, not if their contents changed. var childrenNew = listGroups.ToArray(); bool updateAutoManage = !PeptideDocNode.AreEquivalentChildren(nodePep.Children, childrenNew); return (PeptideDocNode) nodePep.ChangeChildrenChecked(childrenNew, updateAutoManage); }
public PeptideDocNode UpdateResults(PeptideDocNode nodePeptide) { var listChromInfoList = _listResultCalcs.ConvertAll(calc => calc.CalcChromInfoList(TransitionGroupCount)); var results = Results<PeptideChromInfo>.Merge(nodePeptide.Results, listChromInfoList); if (!ReferenceEquals(results, nodePeptide.Results)) nodePeptide = nodePeptide.ChangeResults(results); var listGroupsNew = new List<DocNode>(); foreach (TransitionGroupDocNode nodeGroup in nodePeptide.Children) { // Update transition group ratios var nodeGroupConvert = nodeGroup; bool isMatching = nodeGroup.RelativeRT == RelativeRT.Matching; var listGroupInfoList = _listResultCalcs.ConvertAll( calc => calc.UpdateTransitonGroupRatios(nodeGroupConvert, nodeGroupConvert.HasResults ? nodeGroupConvert.Results[calc.ResultsIndex] : null, isMatching)); var resultsGroup = Results<TransitionGroupChromInfo>.Merge(nodeGroup.Results, listGroupInfoList); var nodeGroupNew = nodeGroup; if (!ReferenceEquals(resultsGroup, nodeGroup.Results)) nodeGroupNew = nodeGroup.ChangeResults(resultsGroup); var listTransNew = new List<DocNode>(); foreach (TransitionDocNode nodeTran in nodeGroup.Children) { // Update transition ratios var nodeTranConvert = nodeTran; var listTranInfoList = _listResultCalcs.ConvertAll( calc => calc.UpdateTransitionRatios(nodeGroup, nodeTranConvert, nodeTranConvert.Results[calc.ResultsIndex], isMatching)); var resultsTran = Results<TransitionChromInfo>.Merge(nodeTran.Results, listTranInfoList); listTransNew.Add(ReferenceEquals(resultsTran, nodeTran.Results) ? nodeTran : nodeTran.ChangeResults(resultsTran)); } listGroupsNew.Add(nodeGroupNew.ChangeChildrenChecked(listTransNew)); } return (PeptideDocNode) nodePeptide.ChangeChildrenChecked(listGroupsNew); }