public double GetTracerPercent(TracerPercentFormula tracerPercentFormula) { if (_traceeSymbols.Count == 0) { return(0); } return(tracerPercentFormula.Dictionary.Values.Sum() / _traceeSymbols.Count); }
public TracerPercentFormula ComputePrecursorEnrichmentAndTurnover(IDictionary <TracerFormula, double> peptideDistribution, out double turnover, out double turnoverScore, out IDictionary <TracerFormula, double> bestMatch) { if (peptideDistribution.Count < 3) { turnover = 0; turnoverScore = 0; bestMatch = null; return(null); } var tracerFormulaIndexes = new Dictionary <TracerFormula, int>(); var observedPercentages = new DenseVector(peptideDistribution.Count); foreach (var entry in peptideDistribution) { var tracerFormula = entry.Key; observedPercentages[tracerFormulaIndexes.Count] = entry.Value; tracerFormulaIndexes.Add(tracerFormula, tracerFormulaIndexes.Count); } var initialVector = DistributionToVector(GetDistribution(GetInitialTracerPercents()), tracerFormulaIndexes); bestMatch = null; TracerPercentFormula bestFormula = null; double bestScore = 0; double bestTurnover = 0; var tracerPercentEnumerator = new TracerPercentEnumerator(_tracerDefs.Values); while (tracerPercentEnumerator.MoveNext()) { var tracerPercents = tracerPercentEnumerator.Current; var distribution = GetDistribution(tracerPercents); var newlySynthesizedVector = DistributionToVector(distribution, tracerFormulaIndexes); var combination = FindBestCombination(observedPercentages, initialVector, newlySynthesizedVector); if (combination == null) { continue; } if (combination[0] < 0 || combination[1] < 0 || combination.Sum() <= 0) { continue; } if (combination.Sum() <= 0) { continue; } var resultVector = initialVector.Multiply(combination[0]).Add(newlySynthesizedVector.Multiply(combination[1])); var score = Score(observedPercentages, resultVector); if (bestFormula == null || score > bestScore) { bestFormula = tracerPercents; bestScore = score; bestTurnover = combination[1] / (combination[0] + combination[1]); bestMatch = tracerFormulaIndexes.ToDictionary(kv => kv.Key, kv => resultVector[kv.Value]); } } turnover = bestTurnover; turnoverScore = bestScore; return(bestFormula); }
public Dictionary <TracerFormula, double> GetDistribution(TracerPercentFormula tracerPercents) { var tracerFormulaEnumerator = new TracerFormulaEnumerator(Sequence, _tracerDefs.Values); var result = new Dictionary <TracerFormula, double>(); while (tracerFormulaEnumerator.MoveNext()) { result.Add(tracerFormulaEnumerator.Current, ComputeProbability(tracerFormulaEnumerator, tracerPercents)); } return(result); }
public AminoAcidFormulas GetAminoAcidFormulas(TracerPercentFormula tracerPercents) { var result = _aminoAcidFormulas; foreach (var entry in tracerPercents) { var tracerDef = _tracerDefs[entry.Key]; var isotopeAbundances = result.IsotopeAbundances; var massDistribution = isotopeAbundances[tracerDef.TraceeSymbol]; massDistribution = massDistribution.Average(tracerDef.TracerMasses, entry.Value / 100.0); isotopeAbundances = isotopeAbundances.SetAbundances(tracerDef.TraceeSymbol, massDistribution); result = result.SetIsotopeAbundances(isotopeAbundances); } return(result); }
private double ComputeProbability(TracerFormulaEnumerator tracerFormulaEnumerator, TracerPercentFormula tracerPercents) { var tracerFormula = tracerFormulaEnumerator.Current; var tracerSymbolCounts = tracerFormulaEnumerator.GetTracerSymbolCounts(); var traceePercents = tracerSymbolCounts.Keys.ToDictionary(s => s, s => 1.0); var result = 1.0; foreach (var tracerDef in _tracerDefs.Values) { int tracerTraceeCount = tracerSymbolCounts[tracerDef.TraceeSymbol]; int tracerCount = tracerFormula.GetElementCount(tracerDef.Name); double probability = Math.Pow(tracerPercents.GetElementCount(tracerDef.Name) / 100, tracerCount) * Choose(tracerTraceeCount, tracerCount); result *= probability; tracerSymbolCounts[tracerDef.TraceeSymbol] = tracerTraceeCount - tracerCount; traceePercents[tracerDef.TraceeSymbol] = traceePercents[tracerDef.TraceeSymbol] - tracerPercents.GetElementCount(tracerDef.Name) / 100; } foreach (var entry in tracerSymbolCounts) { result *= Math.Pow(traceePercents[entry.Key], entry.Value); } return(result); }