X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fsifts%2FSiftsClient.java;h=e04bbb7b3a80dc4c6c25265e72208091a8c1cb89;hb=fd81731a3e96d74a14c114d8808b44ee9673f9ef;hp=cd132df0ad989e8af9b565b51d9ab7e4e0cb17f8;hpb=85fe40df41ed696ed5ca8128221a3a51c1047f2d;p=jalview.git diff --git a/src/jalview/ws/sifts/SiftsClient.java b/src/jalview/ws/sifts/SiftsClient.java index cd132df..e04bbb7 100644 --- a/src/jalview/ws/sifts/SiftsClient.java +++ b/src/jalview/ws/sifts/SiftsClient.java @@ -26,6 +26,7 @@ import jalview.api.SiftsClientI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.SequenceI; +import jalview.io.StructureFile; import jalview.schemes.ResidueProperties; import jalview.structure.StructureMapping; import jalview.util.Format; @@ -77,7 +78,7 @@ public class SiftsClient implements SiftsClientI { private Entry siftsEntry; - private PDBfile pdb; + private StructureFile pdb; private String pdbId; @@ -103,10 +104,6 @@ public class SiftsClient implements SiftsClientI private final static String NEWLINE = System.lineSeparator(); - // private final static int CACHE_THRESHOLD_IN_DAYS = 2; - // - // private final static int FAIL_SAFE_PID_THRESHOLD = 30; - private String curSourceDBRef; private HashSet curDBRefAccessionIdsString; @@ -151,10 +148,10 @@ public class SiftsClient implements SiftsClientI * @param pdbId * @throws SiftsException */ - public SiftsClient(PDBfile pdb) throws SiftsException + public SiftsClient(StructureFile pdb) throws SiftsException { this.pdb = pdb; - this.pdbId = pdb.id; + this.pdbId = pdb.getId(); File siftsFile = getSiftsFile(pdbId); siftsEntry = parseSIFTs(siftsFile); } @@ -171,7 +168,7 @@ public class SiftsClient implements SiftsClientI public SiftsClient(PDBfile pdb, File siftsFile) throws SiftsException { this.pdb = pdb; - this.pdbId = pdb.id; + this.pdbId = pdb.getId(); siftsEntry = parseSIFTs(siftsFile); } @@ -460,7 +457,7 @@ public class SiftsClient implements SiftsClientI { ArrayList omitNonObserved = new ArrayList(); int nonObservedShiftIndex = 0; - System.out.println("Generating mappings for : " + entityId); + // System.out.println("Generating mappings for : " + entityId); Entity entity = null; entity = getEntityById(entityId); String originalSeq = AlignSeq.extractGaps( @@ -495,8 +492,8 @@ public class SiftsClient implements SiftsClientI for (Segment segment : segments) { segStartEnd = segment.getStart() + " - " + segment.getEnd(); - System.out.println("Mappging segments : " + segment.getSegId() + "\\" - + segStartEnd); + // System.out.println("Mapping segments : " + segment.getSegId() + "\\" + // + segStartEnd); List residues = segment.getListResidue().getResidue(); for (Residue residue : residues) { @@ -523,6 +520,7 @@ public class SiftsClient implements SiftsClientI { currSeqIndex = Integer.valueOf(resNumIndexString .split("[a-zA-Z]")[0]); + continue; } if (pdbRefDb != null) { @@ -534,7 +532,7 @@ public class SiftsClient implements SiftsClientI { continue; } - if (currSeqIndex > seq.getStart() && currSeqIndex <= seq.getEnd()) + if (currSeqIndex >= seq.getStart() && currSeqIndex <= seq.getEnd()) { int resNum; try @@ -547,6 +545,7 @@ public class SiftsClient implements SiftsClientI resNum = (pdbRefDb == null) ? Integer.valueOf(residue .getDbResNum()) : Integer.valueOf(pdbRefDb .getDbResNum().split("[a-zA-Z]")[0]); + continue; } if (isResidueObserved(residue) @@ -600,12 +599,17 @@ public class SiftsClient implements SiftsClientI int orignalSeqStart = seq.getStart(); if (orignalSeqStart >= 1) { - int subSeqStart = seqStart - orignalSeqStart; + int subSeqStart = (seqStart >= orignalSeqStart) ? seqStart + - orignalSeqStart : 0; int subSeqEnd = seqEnd - (orignalSeqStart - 1); subSeqEnd = originalSeq.length() < subSeqEnd ? originalSeq.length() : subSeqEnd; matchedSeq = originalSeq.substring(subSeqStart, subSeqEnd); } + else + { + matchedSeq = originalSeq.substring(1, originalSeq.length()); + } } StringBuilder targetStrucSeqs = new StringBuilder(); @@ -617,13 +621,13 @@ public class SiftsClient implements SiftsClientI if (os != null) { MappingOutputPojo mop = new MappingOutputPojo(); - mop.setSeqStart(seqStart); - mop.setSeqEnd(seqEnd); + mop.setSeqStart(pdbStart); + mop.setSeqEnd(pdbEnd); mop.setSeqName(seq.getName()); mop.setSeqResidue(matchedSeq); - mop.setStrStart(pdbStart); - mop.setStrEnd(pdbEnd); + mop.setStrStart(seqStart); + mop.setStrEnd(seqEnd); mop.setStrName(structId); mop.setStrResidue(targetStrucSeqs.toString()); @@ -645,18 +649,25 @@ public class SiftsClient implements SiftsClientI void populateAtomPositions(String chainId, HashMap mapping) throws IllegalArgumentException { - PDBChain chain = pdb.findChain(chainId); - if (chain == null || mapping == null) - { - throw new IllegalArgumentException( - "Chain id or mapping must not be null."); - } - for (int[] map : mapping.values()) + try { - if (map[PDB_RES_POS] != UNASSIGNED) + PDBChain chain = pdb.findChain(chainId); + + if (chain == null || mapping == null) + { + throw new IllegalArgumentException( + "Chain id or mapping must not be null."); + } + for (int[] map : mapping.values()) { - map[PDB_ATOM_POS] = getAtomIndex(map[PDB_RES_POS], chain.atoms); + if (map[PDB_RES_POS] != UNASSIGNED) + { + map[PDB_ATOM_POS] = getAtomIndex(map[PDB_RES_POS], chain.atoms); + } } + } catch (Exception e) + { + e.printStackTrace(); } } @@ -761,8 +772,8 @@ public class SiftsClient implements SiftsClientI Arrays.sort(keys); int firstIndex = keys[0]; int lastIndex = keys[keys.length - 1]; - System.out.println("Min value " + firstIndex); - System.out.println("Max value " + lastIndex); + // System.out.println("Min value " + firstIndex); + // System.out.println("Max value " + lastIndex); for (int x = firstIndex; x <= lastIndex; x++) { if (!resNumMap.containsKey(x) && !omitNonObserved.contains(x)) @@ -777,14 +788,27 @@ public class SiftsClient implements SiftsClientI @Override public Entity getEntityById(String id) throws SiftsException { - List entities = siftsEntry.getEntity(); - for (Entity entity : entities) + // Sometimes SIFTS mappings are wrongly swapped between different chains of + // a PDB entry. This results to wrong mappings being generated. The boolean + // flag 'isGetEntityIdDirectly, determines whether an entity to process is + // determined by a greedy heuristic search or by just matching the Chain Id + // directly against the entity Id tag. Setting the default value to 'false' + // utilise the heuristic search which always produces correct mappings but + // less optimised processing, where as changing the value to 'true' + // optimises performance but might result to incorrect mapping in some cases + // where SIFTS mappings are wrongly swapped between different chains. + boolean isGetEntityIdDirectly = false; + if (isGetEntityIdDirectly) { - if (!entity.getEntityId().equalsIgnoreCase(id)) + List entities = siftsEntry.getEntity(); + for (Entity entity : entities) { - continue; + if (!entity.getEntityId().equalsIgnoreCase(id)) + { + continue; + } + return entity; } - return entity; } Entity entity = getEntityByMostOptimalMatchedId(id); if (entity != null) @@ -804,8 +828,7 @@ public class SiftsClient implements SiftsClientI */ public Entity getEntityByMostOptimalMatchedId(String chainId) { - System.out - .println("--------------> advanced greedy entityId matching block entered.."); + // System.out.println("---> advanced greedy entityId matching block entered.."); List entities = siftsEntry.getEntity(); SiftsEntitySortPojo[] sPojo = new SiftsEntitySortPojo[entities.size()]; int count = 0; @@ -839,8 +862,8 @@ public class SiftsClient implements SiftsClientI ++count; } Arrays.sort(sPojo, Collections.reverseOrder()); - System.out.println("highest matched entity : " + sPojo[0].entityId); - System.out.println("highest matched pid : " + sPojo[0].pid); + // System.out.println("highest matched entity : " + sPojo[0].entityId); + // System.out.println("highest matched pid : " + sPojo[0].pid); if (sPojo[0].entityId != null) { @@ -913,7 +936,8 @@ public class SiftsClient implements SiftsClientI // output mappings StringBuffer output = new StringBuffer(); output.append(NEWLINE); - output.append("Sequence ⟷ Structure mapping details").append(NEWLINE); + output.append("Sequence \u27f7 Structure mapping details").append( + NEWLINE); output.append("Method: SIFTS"); output.append(NEWLINE).append(NEWLINE); @@ -1002,8 +1026,7 @@ public class SiftsClient implements SiftsClientI float pid = (float) matchedSeqCount / seqRes.length() * 100; if (pid < SiftsSettings.getFailSafePIDThreshold()) { - throw new SiftsException( -">>> Low PID detected for SIFTs mapping..."); + throw new SiftsException(">>> Low PID detected for SIFTs mapping..."); } output.append("Length of alignment = " + seqRes.length()).append( NEWLINE);