コード例 #1
0
        public static string GetResultsText(DisplaySettings displaySettings, TransitionGroupDocNode nodeGroup)
        {
            float?     libraryProduct = nodeGroup.GetLibraryDotProduct(displaySettings.ResultsIndex);
            float?     isotopeProduct = nodeGroup.GetIsotopeDotProduct(displaySettings.ResultsIndex);
            RatioValue ratio          = null;

            if (displaySettings.NormalizationMethod is NormalizationMethod.RatioToLabel ratioToLabel)
            {
                ratio = displaySettings.NormalizedValueCalculator.GetTransitionGroupRatioValue(ratioToLabel,
                                                                                               displaySettings.NodePep, nodeGroup, nodeGroup.GetChromInfoEntry(displaySettings.ResultsIndex));
            }
            if (null == ratio && !isotopeProduct.HasValue && !libraryProduct.HasValue)
            {
                return(string.Empty);
            }
            StringBuilder sb  = new StringBuilder(@" (");
            int           len = sb.Length;

            if (isotopeProduct.HasValue)
            {
                sb.Append(string.Format(@"idotp {0}", isotopeProduct.Value.ToString(DOTP_FORMAT)));
            }
            if (libraryProduct.HasValue)
            {
                if (sb.Length > len)
                {
                    sb.Append(CS_SEPARATOR);
                }
                sb.Append(string.Format(@"dotp {0}", libraryProduct.Value.ToString(DOTP_FORMAT)));
            }
            if (ratio != null)
            {
                if (sb.Length > len)
                {
                    sb.Append(CS_SEPARATOR);
                }
                if (!double.IsNaN(ratio.StdDev))
                {
                    sb.Append(string.Format(@"rdotp {0}", ratio.DotProduct.ToString(DOTP_FORMAT)));
                    sb.Append(CS_SEPARATOR);
                }

                sb.Append(string.Format(Resources.TransitionGroupTreeNode_GetResultsText_total_ratio__0__,
                                        MathEx.RoundAboveZero(ratio.Ratio, 2, 4)));
            }
            sb.Append(@")");
            return(sb.ToString());
        }
コード例 #2
0
        public static string GetResultsText(TransitionGroupDocNode nodeGroup,
                                            PeptideDocNode nodePep, int indexResult, int indexRatio)
        {
            float?     libraryProduct = nodeGroup.GetLibraryDotProduct(indexResult);
            float?     isotopeProduct = nodeGroup.GetIsotopeDotProduct(indexResult);
            RatioValue ratio          = nodeGroup.GetPeakAreaRatio(indexResult, indexRatio);

            if (null == ratio && !isotopeProduct.HasValue && !libraryProduct.HasValue)
            {
                return(string.Empty);
            }
            StringBuilder sb  = new StringBuilder(@" (");
            int           len = sb.Length;

            if (isotopeProduct.HasValue)
            {
                sb.Append(string.Format(@"idotp {0}", isotopeProduct.Value.ToString(DOTP_FORMAT)));
            }
            if (libraryProduct.HasValue)
            {
                if (sb.Length > len)
                {
                    sb.Append(CS_SEPARATOR);
                }
                sb.Append(string.Format(@"dotp {0}", libraryProduct.Value.ToString(DOTP_FORMAT)));
            }
            if (ratio != null)
            {
                if (sb.Length > len)
                {
                    sb.Append(CS_SEPARATOR);
                }
                if (!double.IsNaN(ratio.StdDev))
                {
                    sb.Append(string.Format(@"rdotp {0}", ratio.DotProduct.ToString(DOTP_FORMAT)));
                    sb.Append(CS_SEPARATOR);
                }

                sb.Append(string.Format(Resources.TransitionGroupTreeNode_GetResultsText_total_ratio__0__,
                                        MathEx.RoundAboveZero(ratio.Ratio, 2, 4)));
            }
            sb.Append(@")");
            return(sb.ToString());
        }
コード例 #3
0
        public static RatioPropertyDescriptor GetProperty(SrmDocument document, Type componentType, string propertyName)
        {
            string         prefix;
            IList <string> parts;

            if (!TryParseProperty(propertyName, out prefix, out parts))
            {
                return(null);
            }
            var modifications = document.Settings.PeptideSettings.Modifications;

            if (componentType == typeof(PeptideResult))
            {
                string displayName;
                Func <PeptideResult, double?> getterFunc;
                if (parts.Count == 0)
                {
                    return(null);
                }
                string format;
                string labelColumnPart = parts[0];
                var    labelType       = FindLabel(modifications.GetModificationTypes(), labelColumnPart);
                if (parts.Count == 1)
                {
                    getterFunc = peptideResult =>
                                 RatioValue.GetRatio(FindPeptideLabelRatio(peptideResult, labelType, null).Ratio);
                    displayName = string.Format("Ratio{0}ToGlobalStandards", labelColumnPart); // Not L10N
                    format      = Formats.GLOBAL_STANDARD_RATIO;
                }
                else if (parts.Count != 2)
                {
                    return(null);
                }
                else
                {
                    string standardColumnPart = parts[1];
                    var    standardType       = FindLabel(modifications.RatioInternalStandardTypes, standardColumnPart);
                    if (prefix == RATIO_PREFIX)
                    {
                        getterFunc = peptideResult =>
                                     RatioValue.GetRatio(FindPeptideLabelRatio(peptideResult, labelType, standardType).Ratio);
                        displayName = string.Format("Ratio{0}To{1}", labelColumnPart, standardColumnPart); // Not L10N
                        format      = Formats.STANDARD_RATIO;
                    }
                    else if (prefix == RDOTP_PREFIX)
                    {
                        getterFunc = peptideResult =>
                                     RatioValue.GetDotProduct(FindPeptideLabelRatio(peptideResult, labelType, standardType).Ratio);
                        displayName = string.Format("DotProduct{0}To{1}", labelColumnPart, standardColumnPart); // Not L10N
                        format      = Formats.STANDARD_RATIO;
                    }
                    else
                    {
                        return(null);
                    }
                }
                return(MakeRatioProperty(propertyName, displayName, format, getterFunc));
            }
            if (componentType == typeof(PrecursorResult))
            {
                string format;
                Func <PrecursorResult, double?> getterFunc;
                string displayName;
                if (parts.Count == 0)
                {
                    if (prefix != RATIO_GS_PREFIX)
                    {
                        return(null);
                    }
                    getterFunc  = precursorResult => RatioValue.GetRatio(precursorResult.ChromInfo.Ratios[precursorResult.ChromInfo.Ratios.Count - 1]);
                    displayName = "TotalAreaRatioToGlobalStandards"; // Not L10N
                    format      = Formats.GLOBAL_STANDARD_RATIO;
                }
                else if (parts.Count != 1)
                {
                    return(null);
                }
                else
                {
                    format = Formats.STANDARD_RATIO;
                    string labelColumnPart = parts[0];
                    int    ratioIndex      = IndexOf(modifications.RatioInternalStandardTypes, labelColumnPart);
                    if (prefix == RATIO_PREFIX)
                    {
                        getterFunc = precursorResult =>
                        {
                            if (ratioIndex < 0 || ratioIndex >= precursorResult.ChromInfo.Ratios.Count)
                            {
                                return(null);
                            }
                            return(RatioValue.GetRatio(precursorResult.ChromInfo.Ratios[ratioIndex]));
                        };
                        displayName = string.Format("TotalAreaRatioTo{0}", labelColumnPart); // Not L10N
                    }
                    else if (prefix == RDOTP_PREFIX)
                    {
                        getterFunc = precursorResult =>
                        {
                            if (ratioIndex < 0 || ratioIndex >= precursorResult.ChromInfo.Ratios.Count)
                            {
                                return(null);
                            }
                            return(RatioValue.GetDotProduct(precursorResult.ChromInfo.Ratios[ratioIndex]));
                        };
                        displayName = string.Format("DotProductTo{0}", labelColumnPart); // Not L10N
                    }
                    else
                    {
                        return(null);
                    }
                }
                return(MakeRatioProperty(propertyName, displayName, format, getterFunc));
            }
            if (componentType == typeof(TransitionResult))
            {
                string format;
                Func <TransitionResult, double?> getterFunc;
                string displayName;
                if (parts.Count == 0)
                {
                    if (prefix != RATIO_GS_PREFIX)
                    {
                        return(null);
                    }

                    getterFunc  = transitionResult => transitionResult.ChromInfo.Ratios[transitionResult.ChromInfo.Ratios.Count - 1];
                    displayName = "AreaRatioToGlobalStandards"; // Not L10N
                    format      = Formats.GLOBAL_STANDARD_RATIO;
                }
                else if (prefix != RATIO_PREFIX || parts.Count != 1)
                {
                    return(null);
                }
                else
                {
                    format = Formats.STANDARD_RATIO;
                    string labelColumnPart = parts[0];
                    int    ratioIndex      = IndexOf(modifications.RatioInternalStandardTypes, labelColumnPart);
                    getterFunc = transitionResult =>
                    {
                        if (ratioIndex < 0 || ratioIndex >= transitionResult.ChromInfo.Ratios.Count)
                        {
                            return(null);
                        }
                        return(transitionResult.ChromInfo.Ratios[ratioIndex]);
                    };
                    displayName = string.Format("AreaRatioTo{0}", labelColumnPart); // Not L10N
                }
                return(MakeRatioProperty(propertyName, displayName, format, getterFunc));
            }
            return(null);
        }
コード例 #4
0
ファイル: MediaQueryParser.cs プロジェクト: modulexcite/More
        private static MediaQuery ParseMediaClause(string media, IPosition forPosition)
        {
            if (!media.StartsWith("(") || !media.EndsWith(")"))
            {
                Current.RecordError(ErrorType.Parser, forPosition, "Media features must be enclosed in paranthesis, found '" + media + "'");
                throw new StoppedParsingException();
            }

            // Trim leading ( and trailing )
            media = media.Substring(1, media.Length - 2).Trim();

            var i = media.IndexOf(':');

            if (i == -1)
            {
                if (!IsValidFeatureName(media))
                {
                    Current.RecordError(ErrorType.Parser, forPosition, "Media feature not recognized, found '" + media + "'");
                    throw new StoppedParsingException();
                }

                return(new FeatureMedia(media, forPosition));
            }

            var feature  = media.Substring(0, i).Trim();
            var valueStr = media.Substring(i + 1).Trim();
            var value    = MoreValueParser.Parse(valueStr, forPosition);

            var math = value as MathValue;

            if (math != null)
            {
                // Ratio check
                if (math.Operator == Operator.Div && IsRatioFeature(feature))
                {
                    var ratio = new RatioValue(math.LeftHand, math.RightHand);
                    ratio.Start    = value.Start;
                    ratio.Stop     = value.Stop;
                    ratio.FilePath = value.FilePath;

                    value = ratio;
                }
            }

            if (feature.StartsWith("min-", StringComparison.InvariantCultureIgnoreCase))
            {
                feature = feature.Substring("min-".Length);
                if (!IsValidMinMaxFeatureName(feature))
                {
                    Current.RecordError(ErrorType.Parser, forPosition, "Media feature not recognized in min clause, found '" + feature + "'");
                    throw new StoppedParsingException();
                }

                return(new MinFeatureMedia(feature, value, forPosition));
            }

            if (feature.StartsWith("max-", StringComparison.InvariantCultureIgnoreCase))
            {
                feature = feature.Substring("max-".Length);
                if (!IsValidMinMaxFeatureName(feature))
                {
                    Current.RecordError(ErrorType.Parser, forPosition, "Media feature not recognized in max clause, found '" + feature + "'");
                    throw new StoppedParsingException();
                }

                return(new MaxFeatureMedia(feature, value, forPosition));
            }

            return(new EqualFeatureMedia(feature, value, forPosition));
        }
コード例 #5
0
        private void TestRatioFilter()
        {
            const double filterValue = 5.0;

            RunUI(() =>
            {
                SkylineWindow.OpenFile(TestFilesDir.GetTestPath("MultiLabel.sky"));
                SkylineWindow.ShowDocumentGrid(true);
            });
            DocumentGridForm documentGrid = FindOpenForm <DocumentGridForm>();

            RunUI(() => documentGrid.ChooseView(Resources.SkylineViewContext_GetDocumentGridRowSources_Precursors));
            var modifications = SkylineWindow.Document.Settings.PeptideSettings.Modifications;
            var isotopeLabel  = modifications.InternalStandardTypes.First(
                label => label.Name == "heavy 15N");

            AddFilter(documentGrid, PropertyPath.Parse("Proteins!*.Peptides!*.Precursors!*.Results!*.Value")
                      .Property(RatioPropertyDescriptor.MakePropertyName(RatioPropertyDescriptor.RATIO_PREFIX, isotopeLabel)),
                      FilterOperations.OP_IS_GREATER_THAN_OR_EQUAL,
                      filterValue.ToString(CultureInfo.CurrentCulture));
            RunUI(() =>
            {
                var colPeptide       = documentGrid.FindColumn(PropertyPath.Parse("Peptide"));
                var filteredPeptides = Enumerable.Range(0, documentGrid.RowCount).Select(
                    rowIndex => (Peptide)documentGrid.DataGridView.Rows[rowIndex].Cells[colPeptide.Index].Value)
                                       .ToArray();
                CollectionAssert.AreEqual(new [] { "AEVAALAAENK", "AIDYVEATANSHSR" },
                                          filteredPeptides.Select(peptide => peptide.ToString()).ToArray());
                var allPeptides = new Peptides(new SkylineDataSchema(SkylineWindow, DataSchemaLocalizer.INVARIANT), new [] { IdentityPath.ROOT });
                var ratioIndex  = modifications.InternalStandardTypes.IndexOf(isotopeLabel);
                Assert.IsTrue(ratioIndex >= 0);
                foreach (var peptide in allPeptides.GetItems().OfType <Peptide>())
                {
                    var peptidePath = peptide.IdentityPath;
                    bool hasMatchingPrecursorResult =
                        peptide.Precursors.Any(
                            precursor =>
                            precursor.Results.Values.Any(
                                precursorResult =>
                                RatioValue.GetRatio(precursorResult.ChromInfo.Ratios[ratioIndex]) >= filterValue));
                    Assert.AreEqual(hasMatchingPrecursorResult, filteredPeptides.Any(filteredPeptide => filteredPeptide.IdentityPath.Equals(peptidePath)));
                }
            }
                  );
            RunUI(() => documentGrid.ChooseView(Resources.SkylineViewContext_GetDocumentGridRowSources_Precursors));
            WaitForConditionUI(() => documentGrid.IsComplete);
            Assert.AreEqual(12, documentGrid.RowCount);
            {
                var quickFilterForm = ShowDialog <QuickFilterForm>(() =>
                {
                    var precursorMzColumn = documentGrid.FindColumn(PropertyPath.Root.Property("Mz"));
                    documentGrid.QuickFilter(precursorMzColumn);
                });
                RunUI(() =>
                {
                    quickFilterForm.SetFilterOperation(0, FilterOperations.OP_IS_GREATER_THAN);
                    quickFilterForm.SetFilterOperand(0, 500.5.ToString(CultureInfo.CurrentCulture));
                    quickFilterForm.SetFilterOperation(1, FilterOperations.OP_IS_LESS_THAN);
                    quickFilterForm.SetFilterOperand(1, 600.5.ToString(CultureInfo.CurrentCulture));
                });
                OkDialog(quickFilterForm, quickFilterForm.OkDialog);
            }
            WaitForConditionUI(() => documentGrid.IsComplete);
            Assert.AreEqual(8, documentGrid.RowCount);
            {
                var quickFilterForm = ShowDialog <QuickFilterForm>(() =>
                {
                    var precursorMzColumn = documentGrid.FindColumn(PropertyPath.Root.Property("Mz"));
                    documentGrid.QuickFilter(precursorMzColumn);
                });
                RunUI(() =>
                {
                    quickFilterForm.SetFilterOperand(0, "invalidnumber");
                });
                var messageDlg = ShowDialog <AlertDlg>(quickFilterForm.OkDialog);
                OkDialog(messageDlg, messageDlg.OkDialog);
                OkDialog(quickFilterForm, quickFilterForm.CancelButton.PerformClick);
            }
        }
コード例 #6
0
        public AreaCVRefinementData(SrmDocument document, AreaCVRefinementSettings settings,
                                    CancellationToken token, SrmSettingsChangeMonitor progressMonitor = null)
        {
            _settings = settings;
            if (document == null || !document.Settings.HasResults)
            {
                return;
            }

            var replicates  = document.MeasuredResults.Chromatograms.Count;
            var areas       = new List <AreaInfo>(replicates);
            var annotations = AnnotationHelper.GetPossibleAnnotations(document, settings.Group).ToArray();

            if (!annotations.Any() && settings.Group == null)
            {
                annotations = new string[] { null }
            }
            ;

            _internalData = new List <InternalData>();
            var hasHeavyMods       = document.Settings.PeptideSettings.Modifications.HasHeavyModifications;
            var hasGlobalStandards = document.Settings.HasGlobalStandardArea;
            var ms1 = settings.MsLevel == AreaCVMsLevel.precursors;

            // Avoid using not-MS1 with a document that is only MS1
            if (!ms1 && document.MoleculeTransitions.All(t => t.IsMs1))
            {
                ms1 = true;
            }
            double?qvalueCutoff = null;

            if (ShouldUseQValues(document))
            {
                qvalueCutoff = _settings.QValueCutoff;
            }

            int?minDetections = null;

            if (_settings.MinimumDetections != -1)
            {
                minDetections = _settings.MinimumDetections;
            }

            MedianInfo medianInfo = null;
            int?       ratioIndex = null;

            if (settings.NormalizeOption.IsRatioToLabel)
            {
                var isotopeLabelTypeName = (settings.NormalizeOption.NormalizationMethod as NormalizationMethod.RatioToLabel)
                                           ?.IsotopeLabelTypeName;
                ratioIndex =
                    document.Settings.PeptideSettings.Modifications.RatioInternalStandardTypes.IndexOf(type =>
                                                                                                       type.Name == isotopeLabelTypeName);
            }
            if (_settings.NormalizeOption.Is(NormalizationMethod.EQUALIZE_MEDIANS))
            {
                medianInfo = CalculateMedianAreas(document);
            }
            NormalizationData normalizationData = null;

            foreach (var peptideGroup in document.MoleculeGroups)
            {
                foreach (var peptide in peptideGroup.Molecules)
                {
                    if (progressMonitor != null)
                    {
                        progressMonitor.ProcessMolecule(peptide);
                    }

                    if (_settings.PointsType == PointsTypePeakArea.decoys != peptide.IsDecoy)
                    {
                        continue;
                    }

                    CalibrationCurveFitter calibrationCurveFitter = null;
                    CalibrationCurve       calibrationCurve       = null;
                    IEnumerable <TransitionGroupDocNode> transitionGroups;
                    if (_settings.NormalizeOption == NormalizeOption.CALIBRATED ||
                        _settings.NormalizeOption == NormalizeOption.DEFAULT)
                    {
                        if (!peptide.TransitionGroups.Any())
                        {
                            continue;
                        }
                        var peptideQuantifier = PeptideQuantifier.GetPeptideQuantifier(() =>
                        {
                            return(normalizationData = normalizationData ?? NormalizationData.GetNormalizationData(document, false, null));
                        }, document.Settings, peptideGroup, peptide);
                        calibrationCurveFitter = new CalibrationCurveFitter(peptideQuantifier, document.Settings);
                        transitionGroups       = new[] { peptide.TransitionGroups.First() };
                        if (_settings.NormalizeOption == NormalizeOption.CALIBRATED)
                        {
                            calibrationCurve = calibrationCurveFitter.GetCalibrationCurve();
                            if (calibrationCurve == null)
                            {
                                continue;
                            }
                        }
                    }
                    else
                    {
                        transitionGroups = peptide.TransitionGroups;
                    }
                    foreach (var transitionGroupDocNode in transitionGroups)
                    {
                        foreach (var a in annotations)
                        {
                            areas.Clear();

                            if (!Equals(a, _settings.Annotation) && (_settings.Group == null || _settings.Annotation != null))
                            {
                                continue;
                            }

                            foreach (var replicateIndex in AnnotationHelper.GetReplicateIndices(document,
                                                                                                _settings.Group, a))
                            {
                                if (progressMonitor != null && progressMonitor.IsCanceled())
                                {
                                    throw new OperationCanceledException();
                                }

                                token.ThrowIfCancellationRequested();
                                var groupChromInfo = transitionGroupDocNode.GetSafeChromInfo(replicateIndex)
                                                     .FirstOrDefault(c => c.OptimizationStep == 0);
                                if (groupChromInfo == null)
                                {
                                    continue;
                                }

                                if (qvalueCutoff.HasValue)
                                {
                                    if (!(groupChromInfo.QValue.HasValue &&
                                          groupChromInfo.QValue.Value < qvalueCutoff.Value))
                                    {
                                        continue;
                                    }
                                }

                                double sumArea, normalizedArea;
                                if (calibrationCurveFitter != null)
                                {
                                    double?value;
                                    if (calibrationCurve != null)
                                    {
                                        value = calibrationCurveFitter.GetCalculatedConcentration(calibrationCurve,
                                                                                                  replicateIndex);
                                    }
                                    else
                                    {
                                        value = calibrationCurveFitter.GetNormalizedPeakArea(
                                            new CalibrationPoint(replicateIndex, null));
                                    }
                                    if (!value.HasValue)
                                    {
                                        continue;
                                    }

                                    sumArea        = value.Value;
                                    normalizedArea = value.Value;
                                }
                                else
                                {
                                    if (!groupChromInfo.Area.HasValue)
                                    {
                                        continue;
                                    }
                                    var index = replicateIndex;
                                    sumArea = transitionGroupDocNode.Transitions.Where(t =>
                                    {
                                        if (ms1 != t.IsMs1 || !t.ExplicitQuantitative)
                                        {
                                            return(false);
                                        }

                                        var chromInfo = t.GetSafeChromInfo(index)
                                                        .FirstOrDefault(c => c.OptimizationStep == 0);
                                        if (chromInfo == null)
                                        {
                                            return(false);
                                        }
                                        if (_settings.Transitions == AreaCVTransitions.best)
                                        {
                                            return(chromInfo.RankByLevel == 1);
                                        }
                                        if (_settings.Transitions == AreaCVTransitions.all)
                                        {
                                            return(true);
                                        }

                                        return(chromInfo.RankByLevel <= _settings.CountTransitions);
                                        // ReSharper disable once PossibleNullReferenceException
                                    }).Sum(t => (double)t.GetSafeChromInfo(index)
                                           .FirstOrDefault(c => c.OptimizationStep == 0).Area);

                                    normalizedArea = sumArea;
                                    if (_settings.NormalizeOption.Is(NormalizationMethod.EQUALIZE_MEDIANS))
                                    {
                                        normalizedArea /= medianInfo.Medians[replicateIndex] / medianInfo.MedianMedian;
                                    }
                                    else if (_settings.NormalizeOption.Is(NormalizationMethod.GLOBAL_STANDARDS) &&
                                             hasGlobalStandards)
                                    {
                                        normalizedArea =
                                            NormalizeToGlobalStandard(document, transitionGroupDocNode, replicateIndex,
                                                                      sumArea);
                                    }
                                    else if (_settings.NormalizeOption.Is(NormalizationMethod.TIC))
                                    {
                                        var denominator = document.Settings.GetTicNormalizationDenominator(
                                            replicateIndex, groupChromInfo.FileId);
                                        if (!denominator.HasValue)
                                        {
                                            continue;
                                        }

                                        normalizedArea /= denominator.Value;
                                    }
                                    else if (hasHeavyMods &&
                                             _settings.NormalizeOption.NormalizationMethod is NormalizationMethod
                                             .RatioToLabel)
                                    {
                                        var ci = transitionGroupDocNode.GetSafeChromInfo(replicateIndex)
                                                 .FirstOrDefault(c => c.OptimizationStep == 0);
                                        RatioValue ratioValue = null;
                                        if (ratioIndex.HasValue && ratioIndex.Value >= 0 &&
                                            ratioIndex.Value < ci.Ratios.Count)
                                        {
                                            ratioValue = ci.Ratios[ratioIndex.Value];
                                        }

                                        if (ratioValue == null)
                                        {
                                            continue;
                                        }

                                        normalizedArea = ratioValue.Ratio;
                                    }
                                }
                                areas.Add(new AreaInfo(sumArea, normalizedArea));
                            }

                            if (qvalueCutoff.HasValue && minDetections.HasValue && areas.Count < minDetections.Value)
                            {
                                continue;
                            }

                            _settings.AddToInternalData(_internalData, areas, peptideGroup, peptide, transitionGroupDocNode, a);
                        }
                    }
                }
            }
            Data = ImmutableList <CVData> .ValueOf(_internalData.GroupBy(i => i, (key, grouped) =>
            {
                var groupedArray = grouped.ToArray();
                return(new CVData(
                           groupedArray.Select(idata => new PeptideAnnotationPair(idata.PeptideGroup, idata.Peptide, idata.TransitionGroup, idata.Annotation, idata.CV)),
                           key.CVBucketed, key.Area, groupedArray.Length));
            }).OrderBy(d => d.CV));
        }