private static GraphML_List <MsMsPeak> AssignChargeStatesbkp(GraphML_List <MsMsPeak> peaks, int maxCharge, MassTolerance isotopicMzTolerance) { GraphML_List <MsMsPeak> new_peaks = new GraphML_List <MsMsPeak>(); for (int i = 0; i < peaks.Count - 1; i++) { int j = i + 1; List <int> charges = new List <int>(); while (j < peaks.Count) { if (peaks[j].MZ > (peaks[i].MZ + Constants.C12_C13_MASS_DIFFERENCE) + isotopicMzTolerance) { break; } for (int c = maxCharge; c >= 1; c--) { if (Math.Abs(Numerics.CalculateMassError(peaks[j].MZ, peaks[i].MZ + Constants.C12_C13_MASS_DIFFERENCE / (double)c, isotopicMzTolerance.Units)) <= isotopicMzTolerance.Value) { new_peaks.Add(new MsMsPeak(peaks[i].MZ, peaks[i].Intensity, c)); charges.Add(c); } } j++; } if (charges.Count == 0) { new_peaks.Add(new MsMsPeak(peaks[i].MZ, peaks[i].Intensity, 0)); } } return(new_peaks); }
}//*/ public IEnumerable <ProductMatch> GetProductMZs(DBOptions options, GraphML_List <MsMsPeak> peaks)//, List<double> theoretical_product_mzs = null) { // speed optimizations //double[] experimental_masses = Query.spectrum.Masses; //GraphML_List<MSPeak> peaks = Query.spectrum.Peaks; int num_experimental_peaks = peaks.Count; TotalTheoreticalProducts = 0; TotalWeightedProducts = 0; //New version that should include charged ions //foreach (ProductMatch matchTheo in AllFragmentSearch.ComputeAllFragments(Peptide, Query.precursor.Charge, options)) foreach (ProductMatch matchTheo in options.fragments.ComputeFragmentsFast(Peptide.GetMasses(), Query.precursor.Charge, options)) //foreach (ProductMatch matchTheo in options.fragments.ComputeFragments(Peptide, Query.precursor.Charge, options)) { TotalTheoreticalProducts++; TotalWeightedProducts += matchTheo.weight;//++; //TODO test what is most common between charged ions, and uncharged ions //for (int charge = 1; charge <= Query.precursor.Charge; charge++) //for (int charge = Query.precursor.Charge; charge >= 1; charge--) //{ double massDiff = options.productMassTolerance.Value; double bestMz = -1; double bestInt = 0; foreach (int index in Query.spectrum.GetIndexOfMZInRange(matchTheo.theoMz, options.productMassTolerance)) { if (peaks[index].Charge <= 0 || peaks[index].Charge == matchTheo.charge) { double diff = Numerics.CalculateMassError(peaks[index].MZ, matchTheo.theoMz, options.productMassTolerance.Units); //double diff = matchTheo.theoMz - peaks[index].MZ;// experimental_masses[index];//TODO DALTON ONLY : add product mass tolerance unit test if (Math.Abs(diff) < options.productMassTolerance.Value) { if (Math.Abs(diff) < Math.Abs(massDiff))//TODO Priority to intensity, or precision? { massDiff = diff; bestMz = peaks[index].MZ; } //if (peaks[index].Intensity > bestInt) bestInt += peaks[index].Intensity; } } } if (bestMz >= 0) { ProductMatch pMatch = new ProductMatch(); pMatch.weight = matchTheo.weight; pMatch.theoMz = matchTheo.theoMz; // Utilities.MZFromMzSingleCharge(theoMass, charge); pMatch.obsMz = bestMz; // experimental_masses[bestIndex]; pMatch.mass_diff = massDiff; pMatch.obsIntensity = bestInt; // Intensities[bestIndex]; pMatch.charge = matchTheo.charge; // peaks[bestIndex].Charge; pMatch.Fragment = matchTheo.Fragment; pMatch.fragmentPos = matchTheo.fragmentPos; pMatch.normalizedIntensity = pMatch.obsIntensity / (Query.spectrum.InjectionTime * Query.spectrum.PrecursorIntensityPerMilliSecond); yield return(pMatch); //break; } } }
private static GraphML_List <MsMsPeak> Deisotopebkp(GraphML_List <MsMsPeak> peaks, int maxCharge, MassTolerance isotopicMzTolerance) { GraphML_List <MsMsPeak> new_peaks = new GraphML_List <MsMsPeak>(peaks); peaks.Sort(MsMsPeak.AscendingMzComparison); for (int lowMassIndex = 0; lowMassIndex < new_peaks.Count - 1; lowMassIndex++) { if (new_peaks[lowMassIndex].Charge > 0) { int toRemove = -1; double bestMassError = isotopicMzTolerance.Value; double aim = Numerics.IsotopicMassShift(1, new_peaks[lowMassIndex].Charge) + new_peaks[lowMassIndex].MZ; int potentialIsotopeIndex = lowMassIndex + 1; while (potentialIsotopeIndex < new_peaks.Count && new_peaks[potentialIsotopeIndex].MZ < aim + bestMassError) { if (new_peaks[lowMassIndex].Intensity > new_peaks[potentialIsotopeIndex].Intensity) { double massError = Math.Abs(Numerics.CalculateMassError(new_peaks[potentialIsotopeIndex].MZ, aim, isotopicMzTolerance.Units)); if (massError < bestMassError) { bestMassError = massError; toRemove = potentialIsotopeIndex; } } potentialIsotopeIndex++; } if (toRemove > 0) { new_peaks[lowMassIndex].Intensity += new_peaks[toRemove].Intensity; new_peaks.RemoveAt(toRemove); } } } return(new_peaks); }
private static GraphML_List <MsMsPeak> AssignChargeStatesAndDeisotope(GraphML_List <MsMsPeak> peaks, int maxCharge, MassTolerance isotopicMzTolerance) { GraphML_List <MsMsPeak> new_peaks = new GraphML_List <MsMsPeak>(peaks); //peaks.Sort(MSPeak.AscendingMzComparison); int[] bestIsotopes = new int[4]; int[] currentIsotopes = new int[4]; for (int lowMassIndex = 0; lowMassIndex < new_peaks.Count - 1; lowMassIndex++) { double bestChargeScore = 0; int bestCharge = 0; bestIsotopes[0] = 0; bestIsotopes[1] = 0; bestIsotopes[2] = 0; bestIsotopes[3] = 0; for (int charge = maxCharge; charge > 0; charge--) { currentIsotopes[0] = 0; currentIsotopes[1] = 0; currentIsotopes[2] = 0; currentIsotopes[3] = 0; double score = 0; int potentialIsotopeIndex = lowMassIndex + 1; for (int isotope = 1; isotope <= 4; isotope++) { double bestMassError = isotopicMzTolerance.Value; double aim = Numerics.IsotopicMassShift(isotope, charge) + new_peaks[lowMassIndex].MZ; while (potentialIsotopeIndex < new_peaks.Count && new_peaks[potentialIsotopeIndex].MZ < aim + bestMassError) { if (new_peaks[lowMassIndex].Intensity > new_peaks[potentialIsotopeIndex].Intensity) { double massError = Math.Abs(Numerics.CalculateMassError(new_peaks[potentialIsotopeIndex].MZ, aim, isotopicMzTolerance.Units)); if (massError < bestMassError) { bestMassError = massError; currentIsotopes[isotope - 1] = potentialIsotopeIndex; } } potentialIsotopeIndex++; } score += isotopicMzTolerance.Value - bestMassError; if (score == 0) { break; } ; } if (score > bestChargeScore) { bestIsotopes[0] = currentIsotopes[0]; bestIsotopes[1] = currentIsotopes[1]; bestIsotopes[2] = currentIsotopes[2]; bestIsotopes[3] = currentIsotopes[3]; bestChargeScore = score; bestCharge = charge; } } new_peaks[lowMassIndex].Charge = bestCharge; for (int i = 3; i >= 0; i--) { if (bestIsotopes[i] > 0) { new_peaks[lowMassIndex].Intensity += new_peaks[bestIsotopes[i]].Intensity; new_peaks.RemoveAt(bestIsotopes[i]); } } } return(new_peaks); }