From a212c13660a5d463200d6e91352b412080b90870 Mon Sep 17 00:00:00 2001 From: Fengchao Date: Tue, 30 Jan 2018 21:33:51 +0800 Subject: [PATCH] Improve the procedure of generating theoretical fragment ions and calculating XCorr. --- src/main/java/proteomics/Search/Search.java | 7 ++---- .../java/proteomics/TheoSeq/MassTool.java | 25 ++++++++++--------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/java/proteomics/Search/Search.java b/src/main/java/proteomics/Search/Search.java index 41bc837..3c2b581 100644 --- a/src/main/java/proteomics/Search/Search.java +++ b/src/main/java/proteomics/Search/Search.java @@ -279,11 +279,8 @@ public FinalResultEntry convertResultEntry(int scanNum, ResultEntry result_entry private void linearScan(SpectrumEntry spectrumEntry, SparseVector xcorrPL, ChainEntry chainEntry, int binInx, TreeMap binChainMap, List debugEntryList, Map devChainScoreMap) { for (short link_site_1 : chainEntry.link_site_set) { - int precursor_charge = spectrumEntry.precursor_charge; - SparseBooleanVector theo_mz = mass_tool_obj.buildTheoVector(chainEntry.seq, link_site_1, spectrumEntry.precursor_mass - chainEntry.chain_mass, precursor_charge); - - // Calculate dot produce - double dot_product = theo_mz.dot(xcorrPL) * 0.005; + // generate theoretical fragment ion bins and calculate XCorr. + double dot_product = mass_tool_obj.generateTheoFragmentAndCalXCorr(chainEntry.seq, link_site_1, spectrumEntry.precursor_mass - chainEntry.chain_mass, spectrumEntry.precursor_charge, xcorrPL); if (ECL2.debug) { debugEntryList.add(new DebugEntry(chainEntry.seq, link_site_1, chainEntry.chain_mass, dot_product)); diff --git a/src/main/java/proteomics/TheoSeq/MassTool.java b/src/main/java/proteomics/TheoSeq/MassTool.java index c545bb0..3ba83ec 100644 --- a/src/main/java/proteomics/TheoSeq/MassTool.java +++ b/src/main/java/proteomics/TheoSeq/MassTool.java @@ -2,6 +2,7 @@ import proteomics.Types.AA; import proteomics.Types.SparseBooleanVector; +import proteomics.Types.SparseVector; import java.util.*; import java.util.regex.*; @@ -109,7 +110,7 @@ public Map getMassTable() { return mass_table; } - public SparseBooleanVector buildTheoVector(String seq, short linkSite, float additional_mass, int precursor_charge) { + public double generateTheoFragmentAndCalXCorr(String seq, short linkSite, float additional_mass, int precursor_charge, SparseVector xcorrPL) { linkSite = (short) Math.max(1, linkSite); int localMaxCharge = Math.min(max_charge, Math.max(precursor_charge - 1, 1)); @@ -118,45 +119,45 @@ public SparseBooleanVector buildTheoVector(String seq, short linkSite, float add inverseChargeArray[charge - 1] = (double) 1 / (double) charge; } - SparseBooleanVector outputVector = new SparseBooleanVector(); - AA[] aaArray = seqToAAList(seq); + double xcorr = 0; + // traverse the sequence to get b-ion double bIonMass = mass_table.get(aaArray[0].aa) + aaArray[0].delta_mass; // add N-term modification for (int i = 1; i < aaArray.length - 2; ++i) { bIonMass += mass_table.get(aaArray[i].aa) + aaArray[i].delta_mass; if (i < linkSite) { for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin(bIonMass * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin(bIonMass * inverseCharge + 1.00727646688)); } } else { for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin((bIonMass + additional_mass) * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin((bIonMass + additional_mass) * inverseCharge + 1.00727646688)); } } } // calculate the last b-ion with C-term modification bIonMass += mass_table.get(aaArray[aaArray.length - 2].aa) + aaArray[aaArray.length - 2].delta_mass + mass_table.get(aaArray[aaArray.length - 1].aa) + aaArray[aaArray.length - 1].delta_mass; for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin((bIonMass + additional_mass) * inverseCharge + 1.00727646688)); // for the fragment containing all amino acids, the additional mass is always included. + xcorr += xcorrPL.get(mzToBin((bIonMass + additional_mass) * inverseCharge + 1.00727646688)); // for the fragment containing all amino acids, the additional mass is always included. } // traverse the sequence with reversed order to get y-ion // the whole sequence double yIonMass = bIonMass + H2O; for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); // for the fragment containing all amino acids, the additional mass is always included. + xcorr += xcorrPL.get(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); // for the fragment containing all amino acids, the additional mass is always included. } // delete the first amino acid and N-term modification yIonMass -= mass_table.get(aaArray[0].aa) + aaArray[0].delta_mass + mass_table.get(aaArray[1].aa) + aaArray[1].delta_mass; if (1 >= linkSite) { for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin(yIonMass * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin(yIonMass * inverseCharge + 1.00727646688)); } } else { for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); } } // rest of the sequence @@ -164,16 +165,16 @@ public SparseBooleanVector buildTheoVector(String seq, short linkSite, float add yIonMass -= mass_table.get(aaArray[i].aa) + aaArray[i].delta_mass; if (i >= linkSite) { // caution: here, it is different from b-ion for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin(yIonMass * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin(yIonMass * inverseCharge + 1.00727646688)); } } else { for (double inverseCharge : inverseChargeArray) { - outputVector.put(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); + xcorr += xcorrPL.get(mzToBin((yIonMass + additional_mass) * inverseCharge + 1.00727646688)); } } } - return outputVector; + return xcorr * 0.005; } public static AA[] seqToAAList(String seq) {