X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fsifts%2FSiftsClient.java;h=10e14f40d4cd0bdd306015517d3072e47da05796;hb=49f0437d385ee4c6dbe701180a4ba704da76b5f8;hp=e054b297c6b4a07fb1e3675b17b8bbc50bfb27fd;hpb=14c840a69bcdc5d9709fde571d62c1add051e4f6;p=jalview.git diff --git a/src/jalview/ws/sifts/SiftsClient.java b/src/jalview/ws/sifts/SiftsClient.java index e054b29..10e14f4 100644 --- a/src/jalview/ws/sifts/SiftsClient.java +++ b/src/jalview/ws/sifts/SiftsClient.java @@ -78,11 +78,7 @@ public class SiftsClient implements SiftsClientI private String segStartEnd; - private static final String UNIPROT_COORDINATE_SYS = "UniProt"; - - private static final String PDB_COORDINATE_SYS = "PDBresnum"; - - private String seqCoordSys = UNIPROT_COORDINATE_SYS; + private CoordinateSys seqCoordSys = CoordinateSys.UNIPROT; private static final int BUFFER_SIZE = 4096; @@ -104,45 +100,55 @@ public class SiftsClient implements SiftsClientI private final static String NEWLINE = System.lineSeparator(); + private String curSourceDBRef; + + private HashSet curDBRefAccessionIdsString; + + public enum CoordinateSys + { + UNIPROT("UniProt"), PDB("PDBresnum"), PDBe("PDBe"); + private String name; + + private CoordinateSys(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } + }; + /** * Fetch SIFTs file for the given PDB Id and construct an instance of * SiftsClient * * @param pdbId + * @throws SiftsException */ - public SiftsClient(PDBfile pdb) + public SiftsClient(PDBfile pdb) throws SiftsException { this.pdb = pdb; this.pdbId = pdb.id; - try - { - File siftsFile = getSiftsFile(pdbId); - siftsEntry = parseSIFTs(siftsFile); - } catch (Exception e) - { - e.printStackTrace(); - } + File siftsFile = getSiftsFile(pdbId); + siftsEntry = parseSIFTs(siftsFile); } /** - * Construct an instance of SiftsClient using the supplied SIFTs file - - * the SIFTs file should correspond to the given PDB Id + * Construct an instance of SiftsClient using the supplied SIFTs file - the + * SIFTs file should correspond to the given PDB Id * * @param pdbId * @param siftsFile + * @throws SiftsException + * @throws Exception */ - public SiftsClient(PDBfile pdb, File siftsFile) + public SiftsClient(PDBfile pdb, File siftsFile) throws SiftsException { this.pdb = pdb; this.pdbId = pdb.id; - try - { - siftsEntry = parseSIFTs(siftsFile); - } catch (Exception e) - { - e.printStackTrace(); - } - + siftsEntry = parseSIFTs(siftsFile); } /** @@ -154,7 +160,7 @@ public class SiftsClient implements SiftsClientI * @throws Exception * if a problem occurs while parsing the SIFTs XML */ - private Entry parseSIFTs(File siftFile) throws Exception + private Entry parseSIFTs(File siftFile) throws SiftsException { try { @@ -182,7 +188,7 @@ public class SiftsClient implements SiftsClientI { e.printStackTrace(); } - throw new Exception("Error parsing siftFile"); + throw new SiftsException("Error parsing siftFile"); } /** @@ -308,8 +314,8 @@ public class SiftsClient implements SiftsClientI continue; } if (isFoundInSiftsEntry(dbRef.getAccessionId()) - && (dbRef.getSource().equalsIgnoreCase("uniprot") || dbRef - .getSource().equalsIgnoreCase("pdb"))) + && (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) || dbRef + .getSource().equalsIgnoreCase(DBRefSource.PDB))) { return dbRef; } @@ -414,14 +420,18 @@ public class SiftsClient implements SiftsClientI // set sequence coordinate system - default value is UniProt if (sourceDBRef.getSource().equalsIgnoreCase(DBRefSource.PDB)) { - seqCoordSys = PDB_COORDINATE_SYS; + seqCoordSys = CoordinateSys.PDB; } - ArrayList dbRefAccessionIdsString = new ArrayList(); + HashSet dbRefAccessionIdsString = new HashSet(); for (DBRefEntry dbref : seq.getDBRefs()) { - dbRefAccessionIdsString.add(dbref.getAccessionId()); + dbRefAccessionIdsString.add(dbref.getAccessionId().toLowerCase()); } + dbRefAccessionIdsString.add(sourceDBRef.getAccessionId().toLowerCase()); + + curDBRefAccessionIdsString = dbRefAccessionIdsString; + curSourceDBRef = sourceDBRef.getAccessionId(); // initialise all mapping positions to unassigned for (int residuePos[] : mapping) @@ -442,17 +452,25 @@ public class SiftsClient implements SiftsClientI { int currSeqIndex = UNASSIGNED; List cRefDbs = residue.getCrossRefDb(); + CrossRefDb pdbRefDb = null; for (CrossRefDb cRefDb : cRefDbs) { - if (cRefDb.getDbCoordSys().equalsIgnoreCase(seqCoordSys) - && dbRefAccessionIdsString.contains(cRefDb - .getDbAccessionId())) + if (cRefDb.getDbSource().equalsIgnoreCase(DBRefSource.PDB)) + { + pdbRefDb = cRefDb; + } + if (cRefDb.getDbCoordSys() + .equalsIgnoreCase(seqCoordSys.getName()) + && hasAccessionId(cRefDb.getDbAccessionId())) { String resNumIndexString = cRefDb.getDbResNum() .equalsIgnoreCase("None") ? String.valueOf(UNASSIGNED) : cRefDb.getDbResNum(); currSeqIndex = Integer.valueOf(resNumIndexString); - break; + if (pdbRefDb != null) + { + break;// exit loop if pdb and uniprot are already found + } } } if (currSeqIndex == UNASSIGNED) @@ -461,8 +479,24 @@ public class SiftsClient implements SiftsClientI } if (currSeqIndex > seq.getStart() && currSeqIndex <= seq.getEnd()) { - int resNum = Integer.valueOf(residue.getDbResNum()); - mapping[currSeqIndex][PDB_RES_POS] = Integer.valueOf(resNum); + int resNum; + try + { + resNum = (pdbRefDb == null) ? Integer.valueOf(residue + .getDbResNum()) : Integer.valueOf(pdbRefDb.getDbResNum()); + } catch (NumberFormatException nfe) + { + resNum = (pdbRefDb == null) ? Integer.valueOf(residue + .getDbResNum()) : Integer.valueOf(pdbRefDb + .getDbResNum().split("[a-zA-Z]")[0]); + } + try + { + mapping[currSeqIndex][PDB_RES_POS] = Integer.valueOf(resNum); + } catch (ArrayIndexOutOfBoundsException e) + { + // do nothing.. + } char resCharCode = ResidueProperties .getSingleCharacterCode(residue.getDbResName()); resNumMap.put(currSeqIndex, String.valueOf(resCharCode)); @@ -478,10 +512,10 @@ public class SiftsClient implements SiftsClientI } padWithGaps(resNumMap); int counter = 0; - int seqStart = 0; - int seqEnd = 0; - int pdbStart = 0; - int pdbEnd = 0; + int seqStart = UNASSIGNED; + int seqEnd = UNASSIGNED; + int pdbStart = UNASSIGNED; + int pdbEnd = UNASSIGNED; boolean startDetected = false; for (int[] x : mapping) { @@ -520,31 +554,32 @@ public class SiftsClient implements SiftsClientI targetStrucSeqs.append(res); } - try + if (os != null) { - if (os != null) - { - MappingOutputPojo mop = new MappingOutputPojo(); - mop.setSeqStart(seqStart); - mop.setSeqEnd(seqEnd); - mop.setSeqName(seq.getName()); - mop.setSeqResidue(matchedSeq); - - mop.setStrStart(pdbStart); - mop.setStrEnd(pdbEnd); - mop.setStrName(structId); - mop.setStrResidue(targetStrucSeqs.toString()); - - mop.setType("pep"); - os.print(getMappingOutput(mop).toString()); - } - } catch (Exception ex) - { - ex.printStackTrace(); + MappingOutputPojo mop = new MappingOutputPojo(); + mop.setSeqStart(seqStart); + mop.setSeqEnd(seqEnd); + mop.setSeqName(seq.getName()); + mop.setSeqResidue(matchedSeq); + + mop.setStrStart(pdbStart); + mop.setStrEnd(pdbEnd); + mop.setStrName(structId); + mop.setStrResidue(targetStrucSeqs.toString()); + + mop.setType("pep"); + os.print(getMappingOutput(mop).toString()); } return mapping; } + private boolean hasAccessionId(String accession) + { + boolean isStrictMatch = true; + return isStrictMatch ? curSourceDBRef.equalsIgnoreCase(accession) + : curDBRefAccessionIdsString.contains(accession.toLowerCase()); + } + @Override public boolean isFoundInSiftsEntry(String accessionId) { @@ -559,6 +594,10 @@ public class SiftsClient implements SiftsClientI */ void padWithGaps(TreeMap resNumMap) { + if (resNumMap == null || resNumMap.isEmpty()) + { + return; + } Integer[] keys = resNumMap.keySet().toArray(new Integer[0]); Arrays.sort(keys); int firstIndex = keys[0]; @@ -766,6 +805,10 @@ public class SiftsClient implements SiftsClientI output.append(NEWLINE).append(NEWLINE); } float pid = (float) matchedSeqCount / seqRes.length() * 100; + if (pid < 2) + { + throw new SiftsException("Low PID detected for SIFTs mapping..."); + } output.append("Length of alignment = " + seqRes.length()) .append(NEWLINE); output.append(new Format("Percentage ID = %2.2f").form(pid));