예제 #1
0
        public AreaCVGraphData(SrmDocument document, AreaCVGraphSettings graphSettings, CancellationToken token = default(CancellationToken))
        {
            _graphSettings = graphSettings;

            if (document == null || !document.Settings.HasResults)
            {
                IsValid = false;
                return;
            }

            try
            {
                _refinementData = new AreaCVRefinementData(document, graphSettings, token);
            }
            catch (Exception)
            {
                IsValid = false;
                return;
            }

            CalculateStats();

            if (IsValid)
            {
                MedianCV = _refinementData.CalcMedianCV();
            }
        }
예제 #2
0
 public GraphDataProperties(AreaCVGraphSettings settings)
 {
     Group             = settings.Group;
     NormalizeOption   = settings.NormalizeOption;
     Annotation        = settings.Annotation;
     MinimumDetections = settings.MinimumDetections;
 }
예제 #3
0
 public GraphDataProperties(AreaCVGraphSettings settings)
 {
     Group = settings.Group;
     NormalizationMethod = settings.NormalizationMethod;
     RatioIndex          = settings.RatioIndex;
     Annotation          = settings.Annotation;
     MinimumDetections   = settings.MinimumDetections;
 }
예제 #4
0
 public bool IsValidFor(SrmDocument document, AreaCVGraphSettings settings)
 {
     lock (_cacheInfo)
     {
         return(_cacheInfo.Document != null && _cacheInfo.Settings != null &&
                ReferenceEquals(_cacheInfo.Document.Children, document.Children) &&
                AreaCVGraphSettings.CacheEqual(_cacheInfo.Settings, settings));
     }
 }
예제 #5
0
            public bool TryGet(SrmDocument document, AreaCVGraphSettings settings, Action <AreaCVGraphData> callback, out AreaCVGraphData result)
            {
                var properties = new GraphDataProperties(settings);

                if (!IsValidFor(document, settings))
                {
                    Cancel();

                    lock (_cacheInfo)
                    {
                        _cacheInfo.Clear();
                        _cacheInfo.Document = document;
                        _cacheInfo.Settings = settings;
                    }

                    // Get a list of all properties that we want to cache data for, except for the data that just got requested
                    var propertyList = new List <GraphDataProperties>(GetPropertyVariants(settings).Except(new[] { properties }));
                    _producerConsumer.Add(propertyList, false, false);
                }


                result = Get(properties);
                if (result != null)
                {
                    return(true);
                }

                lock (_requestLock)
                {
                    if (!properties.Equals((object)_requested))
                    {
                        _producerConsumer.Add(properties);

                        _requested = properties;
                        _callback  = callback;
                    }

                    return(false);
                }
            }
예제 #6
0
            private IEnumerable <GraphDataProperties> GetPropertyVariants(AreaCVGraphSettings graphSettings)
            {
                SrmDocument document;

                lock (_cacheInfo)
                {
                    document = _cacheInfo.Document;
                }

                var annotationsArray = AnnotationHelper.GetPossibleAnnotations(document, graphSettings.Group);

                // Add an entry for All
                var annotations = annotationsArray.Concat(new string[] { null }).ToList();

                var normalizationMethods = new List <NormalizeOption>(NormalizeOption.AvailableNormalizeOptions(document).Prepend(NormalizeOption.NONE));

                // First cache the histograms for the current annotation
                if (annotations.Remove(graphSettings.Annotation))
                {
                    annotations.Insert(0, graphSettings.Annotation);
                }

                foreach (var n in normalizationMethods)
                {
                    if (n.IsRatioToLabel && !document.Settings.PeptideSettings.Modifications.HasHeavyModifications)
                    {
                        continue;
                    }

                    foreach (var a in annotations)
                    {
                        var minDetections = GetMinDetectionsForAnnotation(document, graphSettings, a);

                        for (var i = 2; i <= minDetections; ++i)
                        {
                            yield return(new GraphDataProperties(graphSettings.Group, n, a, i));
                        }
                    }
                }
            }
예제 #7
0
 public static bool CacheEqual(AreaCVGraphSettings a, AreaCVGraphSettings b)
 {
     return(a.GraphType == b.GraphType && a.Group == b.Group &&
            a.PointsType == b.PointsType && (a.QValueCutoff == b.QValueCutoff || double.IsNaN(a.QValueCutoff) && double.IsNaN(b.QValueCutoff)) &&
            a.CVCutoff == b.CVCutoff && a.BinWidth == b.BinWidth && a.MsLevel == b.MsLevel && a.Transitions == b.Transitions);
 }
예제 #8
0
        public AreaCVGraphData(SrmDocument document, AreaCVGraphSettings graphSettings, CancellationToken?token = null)
        {
            _graphSettings = graphSettings;

            if (document == null || !document.Settings.HasResults)
            {
                IsValid = false;
                return;
            }

            var annotations = AnnotationHelper.GetPossibleAnnotations(document.Settings, graphSettings.Group, AnnotationDef.AnnotationTarget.replicate);

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

            var    data         = new List <InternalData>();
            double?qvalueCutoff = null;

            if (AreaGraphController.ShouldUseQValues(document))
            {
                qvalueCutoff = _graphSettings.QValueCutoff;
            }
            var hasHeavyMods       = document.Settings.PeptideSettings.Modifications.HasHeavyModifications;
            var hasGlobalStandards = document.Settings.HasGlobalStandardArea;

            var ms1  = _graphSettings.MsLevel == AreaCVMsLevel.precursors;
            var best = _graphSettings.Transitions == AreaCVTransitions.best;

            var replicates = document.MeasuredResults.Chromatograms.Count;
            var areas      = new List <AreaInfo>(replicates);

            MedianInfo medianInfo = null;

            if (graphSettings.NormalizationMethod == AreaCVNormalizationMethod.medians)
            {
                medianInfo = CalculateMedianAreas(document);
            }

            foreach (var peptideGroup in document.MoleculeGroups)
            {
                foreach (var peptide in peptideGroup.Molecules)
                {
                    foreach (var transitionGroupDocNode in peptide.TransitionGroups)
                    {
                        if (graphSettings.PointsType == PointsTypePeakArea.decoys != transitionGroupDocNode.IsDecoy)
                        {
                            continue;
                        }

                        foreach (var a in annotations)
                        {
                            areas.Clear();

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

                            foreach (var i in AnnotationHelper.GetReplicateIndices(document.Settings, _graphSettings.Group, a))
                            {
                                if (token.HasValue && token.Value.IsCancellationRequested)
                                {
                                    IsValid = false;
                                    return;
                                }

                                var groupChromInfo = transitionGroupDocNode.GetSafeChromInfo(i)
                                                     .FirstOrDefault(c => c.OptimizationStep == 0);

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

                                var index   = i;
                                var sumArea = transitionGroupDocNode.Transitions.Where(t =>
                                {
                                    if (ms1 != t.IsMs1 || !t.ExplicitQuantitative)
                                    {
                                        return(false);
                                    }

                                    var chromInfo = t.GetSafeChromInfo(index).FirstOrDefault(c => c.OptimizationStep == 0);
                                    return(chromInfo != null && (!best || chromInfo.RankByLevel == 1));
                                    // ReSharper disable once PossibleNullReferenceException
                                }).Sum(t => (double)t.GetSafeChromInfo(index).FirstOrDefault(c => c.OptimizationStep == 0).Area);

                                if (!groupChromInfo.Area.HasValue)
                                {
                                    continue;
                                }

                                double area           = sumArea;
                                var    normalizedArea = area;
                                if (graphSettings.NormalizationMethod == AreaCVNormalizationMethod.medians)
                                {
                                    normalizedArea /= medianInfo.Medians[i] / medianInfo.MedianMedian;
                                }
                                else if (graphSettings.NormalizationMethod == AreaCVNormalizationMethod.global_standards && hasGlobalStandards)
                                {
                                    normalizedArea = NormalizeToGlobalStandard(document, transitionGroupDocNode, i, area);
                                }
                                else if (graphSettings.NormalizationMethod == AreaCVNormalizationMethod.ratio && hasHeavyMods && graphSettings.RatioIndex >= 0)
                                {
                                    var ci = transitionGroupDocNode.GetSafeChromInfo(i).FirstOrDefault(c => c.OptimizationStep == 0);
                                    if (ci != null)
                                    {
                                        var ratioValue = ci.GetRatio(_graphSettings.RatioIndex);
                                        if (ratioValue != null)
                                        {
                                            normalizedArea /= ratioValue.Ratio;
                                        }
                                    }
                                }

                                areas.Add(new AreaInfo(area, normalizedArea));
                            }

                            if (qvalueCutoff.HasValue && areas.Count < graphSettings.MinimumDetections)
                            {
                                continue;
                            }

                            AddToInternalData(data, areas, peptideGroup, peptide, transitionGroupDocNode, a);
                        }
                    }
                }
            }

            Data = ImmutableList <CVData> .ValueOf(data.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));

            CalculateStats();

            if (IsValid)
            {
                MedianCV = new Statistics(data.Select(d => d.CV)).Median();
            }
        }
예제 #9
0
 protected bool Equals(AreaCVGraphSettings other)
 {
     return(base.Equals(other) && GraphType == other.GraphType && BinWidth.Equals(other.BinWidth));
 }
예제 #10
0
 public static bool CacheEqual(AreaCVGraphSettings a, AreaCVGraphSettings b)
 {
     return(Equals(a, b));
 }
예제 #11
0
            private IEnumerable <GraphDataProperties> GetPropertyVariants(AreaCVGraphSettings graphSettings)
            {
                SrmDocument document;

                lock (_cacheInfo)
                {
                    document = _cacheInfo.Document;
                }

                var annotationsArray = AnnotationHelper.GetPossibleAnnotations(document.Settings,
                                                                               graphSettings.Group, AnnotationDef.AnnotationTarget.replicate);

                // Add an entry for All
                var annotations = annotationsArray.Concat(new string[] { null }).ToList();

                var normalizationMethods = new List <AreaCVNormalizationMethod> {
                    AreaCVNormalizationMethod.none, AreaCVNormalizationMethod.medians, AreaCVNormalizationMethod.ratio
                };

                if (document.Settings.HasGlobalStandardArea)
                {
                    normalizationMethods.Add(AreaCVNormalizationMethod.global_standards);
                }

                // First cache for current normalization method
                if (normalizationMethods.Remove(graphSettings.NormalizationMethod))
                {
                    normalizationMethods.Insert(0, graphSettings.NormalizationMethod);
                }

                // First cache the histograms for the current annotation
                if (annotations.Remove(graphSettings.Annotation))
                {
                    annotations.Insert(0, graphSettings.Annotation);
                }

                foreach (var n in normalizationMethods)
                {
                    var isRatio = n == AreaCVNormalizationMethod.ratio;
                    // There can be RatioInternalStandardTypes even though HasHeavyModifications is false
                    if (isRatio && !document.Settings.PeptideSettings.Modifications.HasHeavyModifications)
                    {
                        continue;
                    }

                    var ratioIndices = isRatio
                        ? Enumerable.Range(0, document.Settings.PeptideSettings.Modifications.RatioInternalStandardTypes.Count).ToList()
                        : new List <int> {
                        -1
                    };

                    if (graphSettings.RatioIndex != -1)
                    {
                        if (ratioIndices.Remove(graphSettings.RatioIndex))
                        {
                            ratioIndices.Insert(0, graphSettings.RatioIndex);
                        }
                    }

                    foreach (var r in ratioIndices)
                    {
                        foreach (var a in annotations)
                        {
                            var minDetections = GetMinDetectionsForAnnotation(document, graphSettings, a);

                            for (var i = 2; i <= minDetections; ++i)
                            {
                                yield return(new GraphDataProperties(graphSettings.Group, n, r, a, i));
                            }
                        }
                    }
                }
            }
예제 #12
0
 private static int GetMinDetectionsForAnnotation(SrmDocument document, AreaCVGraphSettings graphSettings, string annotationValue)
 {
     return(document.Settings.PeptideSettings.Integration.PeakScoringModel.IsTrained && !double.IsNaN(graphSettings.QValueCutoff)
         ? AnnotationHelper.GetReplicateIndices(document.Settings, graphSettings.Group, annotationValue).Length
         : 2);
 }