Skip to content

Commit

Permalink
Improve the procedure of generating theoretical fragment ions and cal…
Browse files Browse the repository at this point in the history
…culating XCorr.
  • Loading branch information
fcyu committed Jan 30, 2018
1 parent 82cd63f commit a212c13
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 17 deletions.
7 changes: 2 additions & 5 deletions src/main/java/proteomics/Search/Search.java
Original file line number Diff line number Diff line change
Expand Up @@ -279,11 +279,8 @@ public FinalResultEntry convertResultEntry(int scanNum, ResultEntry result_entry

private void linearScan(SpectrumEntry spectrumEntry, SparseVector xcorrPL, ChainEntry chainEntry, int binInx, TreeMap<Integer, ChainResultEntry> binChainMap, List<DebugEntry> debugEntryList, Map<String, Double> 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));
Expand Down
25 changes: 13 additions & 12 deletions src/main/java/proteomics/TheoSeq/MassTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import proteomics.Types.AA;
import proteomics.Types.SparseBooleanVector;
import proteomics.Types.SparseVector;

import java.util.*;
import java.util.regex.*;
Expand Down Expand Up @@ -109,7 +110,7 @@ public Map<Character, Float> 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));
Expand All @@ -118,62 +119,62 @@ 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
for (int i = 2; i < aaArray.length - 2; ++i) {
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) {
Expand Down

0 comments on commit a212c13

Please sign in to comment.