X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fsifts%2FSiftsClient.java;h=0ab6e7de801b0160d6c65e816b886cc54803137c;hb=d2164f857e0729b86b1e0ffa4c858487f0a3298f;hp=13e52cdcf92e9eb58f7e847ce5c3daac79eb9a7d;hpb=37bc56d23032f26c0da11b0532902d1f629a2080;p=jalview.git diff --git a/src/jalview/ws/sifts/SiftsClient.java b/src/jalview/ws/sifts/SiftsClient.java index 13e52cd..0ab6e7d 100644 --- a/src/jalview/ws/sifts/SiftsClient.java +++ b/src/jalview/ws/sifts/SiftsClient.java @@ -80,8 +80,6 @@ public class SiftsClient implements SiftsClientI private String structId; - // private String segStartEnd; - private CoordinateSys seqCoordSys = CoordinateSys.UNIPROT; private static final int BUFFER_SIZE = 4096; @@ -102,7 +100,7 @@ public class SiftsClient implements SiftsClientI private HashSet curDBRefAccessionIdsString; - public enum CoordinateSys + private enum CoordinateSys { UNIPROT("UniProt"), PDB("PDBresnum"), PDBe("PDBe"); private String name; @@ -118,7 +116,7 @@ public class SiftsClient implements SiftsClientI } }; - public enum ResidueDetailType + private enum ResidueDetailType { NAME_SEC_STRUCTURE("nameSecondaryStructure"), CODE_SEC_STRUCTURE( "codeSecondaryStructure"), ANNOTATION("Annotation"); @@ -325,41 +323,28 @@ public class SiftsClient implements SiftsClientI public DBRefEntryI getValidSourceDBRef(SequenceI seq) throws SiftsException { - DBRefEntryI sourceDBRef = null; - sourceDBRef = seq.getSourceDBRef(); - if (sourceDBRef != null && isValidDBRefEntry(sourceDBRef)) + DBRefEntry[] dbRefs = seq.getDBRefs(); + if (dbRefs == null || dbRefs.length < 1) { - return sourceDBRef; + throw new SiftsException( + "Source DBRef could not be determined. DBRefs might not have been retrieved."); } - else + + for (DBRefEntryI dbRef : dbRefs) { - DBRefEntry[] dbRefs = seq.getDBRefs(); - if (dbRefs == null || dbRefs.length < 1) + if (dbRef == null || dbRef.getAccessionId() == null + || dbRef.getSource() == null) { - throw new SiftsException( - "Source DBRef could not be determined. DBRefs might not have been retrieved."); + continue; } - - for (DBRefEntryI dbRef : dbRefs) + if (isValidDBRefEntry(dbRef) + && dbRef.isPrimary() + && (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) || dbRef + .getSource().equalsIgnoreCase(DBRefSource.PDB))) { - if (dbRef == null || dbRef.getAccessionId() == null - || dbRef.getSource() == null) - { - continue; - } - if (isFoundInSiftsEntry(dbRef.getAccessionId()) - && (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) || dbRef - .getSource().equalsIgnoreCase(DBRefSource.PDB))) - { - seq.setSourceDBRef(dbRef); - return dbRef; - } + return dbRef; } } - if (sourceDBRef != null && isValidDBRefEntry(sourceDBRef)) - { - return sourceDBRef; - } throw new SiftsException("Could not get source DB Ref"); } @@ -442,7 +427,7 @@ public class SiftsClient implements SiftsClientI String originalSeq = AlignSeq.extractGaps( jalview.util.Comparison.GapChars, seq.getSequenceAsString()); HashMap mapping = new HashMap(); - DBRefEntryI sourceDBRef = seq.getSourceDBRef(); + DBRefEntryI sourceDBRef; sourceDBRef = getValidSourceDBRef(seq); // TODO ensure sequence start/end is in the same coordinate system and // consistent with the choosen sourceDBRef @@ -465,10 +450,91 @@ public class SiftsClient implements SiftsClientI TreeMap resNumMap = new TreeMap(); List segments = entity.getSegment(); + SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap, + omitNonObserved, nonObservedShiftIndex); + processSegments(segments, shp); + try + { + populateAtomPositions(entityId, mapping); + } catch (Exception e) + { + e.printStackTrace(); + } + if (seqCoordSys == CoordinateSys.UNIPROT) + { + padWithGaps(resNumMap, omitNonObserved); + } + int seqStart = UNASSIGNED; + int seqEnd = UNASSIGNED; + int pdbStart = UNASSIGNED; + int pdbEnd = UNASSIGNED; + + Integer[] keys = mapping.keySet().toArray(new Integer[0]); + Arrays.sort(keys); + if (keys.length < 1) + { + throw new SiftsException(">>> Empty SIFTS mapping generated!!"); + } + seqStart = keys[0]; + seqEnd = keys[keys.length - 1]; + + String matchedSeq = originalSeq; + if (seqStart != UNASSIGNED) + { + pdbStart = mapping.get(seqStart)[PDB_RES_POS]; + pdbEnd = mapping.get(seqEnd)[PDB_RES_POS]; + int orignalSeqStart = seq.getStart(); + if (orignalSeqStart >= 1) + { + 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(); + for (String res : resNumMap.values()) + { + targetStrucSeqs.append(res); + } + + if (os != null) + { + MappingOutputPojo mop = new MappingOutputPojo(); + mop.setSeqStart(pdbStart); + mop.setSeqEnd(pdbEnd); + mop.setSeqName(seq.getName()); + mop.setSeqResidue(matchedSeq); + + mop.setStrStart(seqStart); + mop.setStrEnd(seqEnd); + mop.setStrName(structId); + mop.setStrResidue(targetStrucSeqs.toString()); + + mop.setType("pep"); + os.print(getMappingOutput(mop).toString()); + os.println(); + } + return mapping; + } + + void processSegments(List segments, SegmentHelperPojo shp) + { + SequenceI seq = shp.getSeq(); + HashMap mapping = shp.getMapping(); + TreeMap resNumMap = shp.getResNumMap(); + List omitNonObserved = shp.getOmitNonObserved(); + int nonObservedShiftIndex = shp.getNonObservedShiftIndex(); for (Segment segment : segments) { - // segStartEnd = segment.getStart() + " - " + segment.getEnd(); - // System.out.println("Mapping segments : " + segment.getSegId() + "\\" + // System.out.println("Mapping segments : " + segment.getSegId() + "\\"s // + segStartEnd); List residues = segment.getListResidue().getResidue(); for (Residue residue : residues) @@ -542,78 +608,7 @@ public class SiftsClient implements SiftsClientI } } } - try - { - populateAtomPositions(entityId, mapping); - } catch (Exception e) - { - e.printStackTrace(); - } - if (seqCoordSys == CoordinateSys.UNIPROT) - { - padWithGaps(resNumMap, omitNonObserved); - } - int seqStart = UNASSIGNED; - int seqEnd = UNASSIGNED; - int pdbStart = UNASSIGNED; - int pdbEnd = UNASSIGNED; - - Integer[] keys = mapping.keySet().toArray(new Integer[0]); - Arrays.sort(keys); - if (keys.length < 1) - { - throw new SiftsException(">>> Empty SIFTS mapping generated!!"); - } - seqStart = keys[0]; - seqEnd = keys[keys.length - 1]; - - String matchedSeq = originalSeq; - if (seqStart != UNASSIGNED) - { - pdbStart = mapping.get(seqStart)[PDB_RES_POS]; - pdbEnd = mapping.get(seqEnd)[PDB_RES_POS]; - int orignalSeqStart = seq.getStart(); - if (orignalSeqStart >= 1) - { - 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(); - for (String res : resNumMap.values()) - { - targetStrucSeqs.append(res); - } - - if (os != null) - { - MappingOutputPojo mop = new MappingOutputPojo(); - mop.setSeqStart(pdbStart); - mop.setSeqEnd(pdbEnd); - mop.setSeqName(seq.getName()); - mop.setSeqResidue(matchedSeq); - - mop.setStrStart(seqStart); - mop.setStrEnd(seqEnd); - mop.setStrName(structId); - mop.setStrResidue(targetStrucSeqs.toString()); - - mop.setType("pep"); - os.print(getMappingOutput(mop).toString()); - os.println(); - } - return mapping; } - /** * * @param chainId @@ -751,7 +746,7 @@ public class SiftsClient implements SiftsClientI return; } Integer[] keys = resNumMap.keySet().toArray(new Integer[0]); - Arrays.sort(keys); + // Arrays.sort(keys); int firstIndex = keys[0]; int lastIndex = keys[keys.length - 1]; // System.out.println("Min value " + firstIndex); @@ -770,28 +765,8 @@ public class SiftsClient implements SiftsClientI @Override public Entity getEntityById(String id) throws SiftsException { - // 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) - // { - // List entities = siftsEntry.getEntity(); - // for (Entity entity : entities) - // { - // if (!entity.getEntityId().equalsIgnoreCase(id)) - // { - // continue; - // } - // return entity; - // } - // } + // Determines an entity to process by performing a heuristic matching of all + // Entities with the given chainId and choosing the best matching Entity Entity entity = getEntityByMostOptimalMatchedId(id); if (entity != null) { @@ -840,7 +815,8 @@ public class SiftsClient implements SiftsClientI } } } - sPojo[count].pid = 100 * (sPojo[count].chainIdFreq / sPojo[count].resCount); + sPojo[count].pid = (100 * sPojo[count].chainIdFreq) + / sPojo[count].resCount; ++count; } Arrays.sort(sPojo, Collections.reverseOrder()); @@ -861,7 +837,7 @@ public class SiftsClient implements SiftsClientI return null; } - public class SiftsEntitySortPojo implements + private class SiftsEntitySortPojo implements Comparable { public String entityId; @@ -879,6 +855,80 @@ public class SiftsClient implements SiftsClientI } } + private class SegmentHelperPojo + { + private SequenceI seq; + + private HashMap mapping; + + private TreeMap resNumMap; + + private List omitNonObserved; + + private int nonObservedShiftIndex; + + public SegmentHelperPojo(SequenceI seq, + HashMap mapping, + TreeMap resNumMap, + List omitNonObserved, int nonObservedShiftIndex) + { + setSeq(seq); + setMapping(mapping); + setResNumMap(resNumMap); + setOmitNonObserved(omitNonObserved); + setNonObservedShiftIndex(nonObservedShiftIndex); + } + + public SequenceI getSeq() + { + return seq; + } + + public void setSeq(SequenceI seq) + { + this.seq = seq; + } + + public HashMap getMapping() + { + return mapping; + } + + public void setMapping(HashMap mapping) + { + this.mapping = mapping; + } + + public TreeMap getResNumMap() + { + return resNumMap; + } + + public void setResNumMap(TreeMap resNumMap) + { + this.resNumMap = resNumMap; + } + + public List getOmitNonObserved() + { + return omitNonObserved; + } + + public void setOmitNonObserved(List omitNonObserved) + { + this.omitNonObserved = omitNonObserved; + } + + public int getNonObservedShiftIndex() + { + return nonObservedShiftIndex; + } + + public void setNonObservedShiftIndex(int nonObservedShiftIndex) + { + this.nonObservedShiftIndex = nonObservedShiftIndex; + } + } @Override public StringBuffer getMappingOutput(MappingOutputPojo mp)