*/
package jalview.ws.sifts;
-import jalview.analysis.AlignSeq;
-import jalview.api.DBRefEntryI;
-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;
-import jalview.xml.binding.sifts.Entry;
-import jalview.xml.binding.sifts.Entry.Entity;
-import jalview.xml.binding.sifts.Entry.Entity.Segment;
-import jalview.xml.binding.sifts.Entry.Entity.Segment.ListMapRegion.MapRegion;
-import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue;
-import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.CrossRefDb;
-import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.ResidueDetail;
-
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.zip.GZIPInputStream;
import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
-import MCview.Atom;
-import MCview.PDBChain;
+import jalview.analysis.AlignSeq;
+import jalview.analysis.scoremodels.ScoreMatrix;
+import jalview.analysis.scoremodels.ScoreModels;
+import jalview.api.DBRefEntryI;
+import jalview.api.SiftsClientI;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.DBRefSource;
+import jalview.datamodel.SequenceI;
+import jalview.io.BackupFiles;
+import jalview.io.StructureFile;
+import jalview.schemes.ResidueProperties;
+import jalview.structure.StructureMapping;
+import jalview.util.Comparison;
+import jalview.util.DBRefUtils;
+import jalview.util.Format;
+import jalview.util.Platform;
+import jalview.xml.binding.sifts.Entry;
+import jalview.xml.binding.sifts.Entry.Entity;
+import jalview.xml.binding.sifts.Entry.Entity.Segment;
+import jalview.xml.binding.sifts.Entry.Entity.Segment.ListMapRegion.MapRegion;
+import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue;
+import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.CrossRefDb;
+import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.ResidueDetail;
+import mc_view.Atom;
+import mc_view.PDBChain;
public class SiftsClient implements SiftsClientI
{
+ /*
+ * for use in mocking out file fetch for tests only
+ * - reset to null after testing!
+ */
+ private static File mockSiftsFile;
+
private Entry siftsEntry;
private StructureFile pdb;
private CoordinateSys seqCoordSys = CoordinateSys.UNIPROT;
+ /**
+ * PDB sequence position to sequence coordinate mapping as derived from SIFTS
+ * record for the identified SeqCoordSys Used for lift-over from sequence
+ * derived from PDB (with first extracted PDBRESNUM as 'start' to the sequence
+ * being annotated with PDB data
+ */
+ private jalview.datamodel.Mapping seqFromPdbMapping;
+
private static final int BUFFER_SIZE = 4096;
- public static final int UNASSIGNED = -1;
+ public static final int UNASSIGNED = Integer.MIN_VALUE;
private static final int PDB_RES_POS = 0;
private static final int PDB_ATOM_POS = 1;
+ private static final int PDBE_POS = 2;
+
private static final String NOT_OBSERVED = "Not_Observed";
private static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
private final static String NEWLINE = System.lineSeparator();
+ private static final boolean GET_STREAM = false;
+ private static final boolean CACHE_FILE = true;
private String curSourceDBRef;
private HashSet<String> curDBRefAccessionIdsString;
+ private boolean doCache = false;
private enum CoordinateSys
{
private enum ResidueDetailType
{
- NAME_SEC_STRUCTURE("nameSecondaryStructure"), CODE_SEC_STRUCTURE(
- "codeSecondaryStructure"), ANNOTATION("Annotation");
+ NAME_SEC_STRUCTURE("nameSecondaryStructure"),
+ CODE_SEC_STRUCTURE("codeSecondaryStructure"), ANNOTATION("Annotation");
private String code;
private ResidueDetailType(String code)
{
this.pdb = pdb;
this.pdbId = pdb.getId();
- File siftsFile = getSiftsFile(pdbId);
- siftsEntry = parseSIFTs(siftsFile);
+ if (doCache) {
+ File siftsFile = getSiftsFile(pdbId);
+ siftsEntry = parseSIFTs(siftsFile);
+ } else {
+ siftsEntry = parseSIFTSStreamFor(pdbId);
+ }
}
+ /**
+ * A more streamlined version of SIFT reading that allows for streaming of the data.
+ *
+ * @param pdbId
+ * @return
+ * @throws SiftsException
+ */
+ private static Entry parseSIFTSStreamFor(String pdbId) throws SiftsException
+ {
+ try
+ {
+ InputStream is = (InputStream) downloadSifts(pdbId, GET_STREAM);
+ return parseSIFTs(is);
+ } catch (Exception e)
+ {
+ throw new SiftsException(e.getMessage());
+ }
+ }
/**
* Parse the given SIFTs File and return a JAXB POJO of parsed data
*/
private Entry parseSIFTs(File siftFile) throws SiftsException
{
- try (InputStream in = new FileInputStream(siftFile);
- GZIPInputStream gzis = new GZIPInputStream(in);)
+ try (InputStream in = new FileInputStream(siftFile)) {
+ return parseSIFTs(in);
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ throw new SiftsException(e.getMessage());
+ }
+ }
+
+ private static Entry parseSIFTs(InputStream in) throws Exception {
+ try (GZIPInputStream gzis = new GZIPInputStream(in);)
{
// System.out.println("File : " + siftFile.getAbsolutePath());
JAXBContext jc = JAXBContext.newInstance("jalview.xml.binding.sifts");
XMLStreamReader streamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(gzis);
Unmarshaller um = jc.createUnmarshaller();
- return (Entry) um.unmarshal(streamReader);
- } catch (Exception e)
- {
- e.printStackTrace();
- throw new SiftsException(e.getMessage());
+ JAXBElement<Entry> jbe = um.unmarshal(streamReader, Entry.class);
+ return jbe.getValue();
}
}
*/
public static File getSiftsFile(String pdbId) throws SiftsException
{
+ /*
+ * return mocked file if it has been set
+ */
+ if (mockSiftsFile != null)
+ {
+ return mockSiftsFile;
+ }
+
String siftsFileName = SiftsSettings.getSiftDownloadDirectory()
- + pdbId.toLowerCase() + ".xml.gz";
+ + pdbId.toLowerCase(Locale.ROOT) + ".xml.gz";
File siftsFile = new File(siftsFileName);
if (siftsFile.exists())
{
// The line below is required for unit testing... don't comment it out!!!
System.out.println(">>> SIFTS File already downloaded for " + pdbId);
- if (isFileOlderThanThreshold(siftsFile,
+ if (Platform.isFileOlderThanThreshold(siftsFile,
SiftsSettings.getCacheThresholdInDays()))
{
File oldSiftsFile = new File(siftsFileName + "_old");
- siftsFile.renameTo(oldSiftsFile);
+ BackupFiles.moveFileToFile(siftsFile, oldSiftsFile);
try
{
- siftsFile = downloadSiftsFile(pdbId.toLowerCase());
+ siftsFile = downloadSiftsFile(pdbId.toLowerCase(Locale.ROOT));
oldSiftsFile.delete();
return siftsFile;
} catch (IOException e)
{
e.printStackTrace();
- oldSiftsFile.renameTo(siftsFile);
+ BackupFiles.moveFileToFile(oldSiftsFile, siftsFile);
return new File(siftsFileName);
}
}
+ else
+ {
+ return siftsFile;
+ }
}
try
{
- siftsFile = downloadSiftsFile(pdbId.toLowerCase());
+ siftsFile = downloadSiftsFile(pdbId.toLowerCase(Locale.ROOT));
} catch (IOException e)
{
throw new SiftsException(e.getMessage());
}
/**
- * This method enables checking if a cached file has exceeded a certain
- * threshold(in days)
+ * Download a SIFTs XML file for a given PDB Id from an FTP repository
*
- * @param file
- * the cached file
- * @param noOfDays
- * the threshold in days
- * @return
+ * @param pdbId
+ * @return downloaded SIFTs XML file
+ * @throws SiftsException
+ * @throws IOException
*/
- public static boolean isFileOlderThanThreshold(File file, int noOfDays)
- {
- Path filePath = file.toPath();
- BasicFileAttributes attr;
- int diffInDays = 0;
- try
- {
- attr = Files.readAttributes(filePath, BasicFileAttributes.class);
- diffInDays = (int) ((new Date().getTime() - attr.lastModifiedTime()
- .toMillis()) / (1000 * 60 * 60 * 24));
- // System.out.println("Diff in days : " + diffInDays);
- } catch (IOException e)
- {
- e.printStackTrace();
- }
- return noOfDays <= diffInDays;
+ public static File downloadSiftsFile(String pdbId)
+ throws SiftsException, IOException
+ {
+ return (File) downloadSifts(pdbId, CACHE_FILE);
}
/**
- * Download a SIFTs XML file for a given PDB Id from an FTP repository
+ * Download SIFTs XML with the option to cache a file or to get a stream.
*
* @param pdbId
- * @return downloaded SIFTs XML file
- * @throws SiftsException
+ * @param asFile
+ * @return
* @throws IOException
*/
- public static File downloadSiftsFile(String pdbId) throws SiftsException,
- IOException
+ private static Object downloadSifts(String pdbId, boolean asFile) throws IOException
{
+ pdbId = pdbId.toLowerCase(Locale.ROOT);
if (pdbId.contains(".cif"))
{
pdbId = pdbId.replace(".cif", "");
}
String siftFile = pdbId + ".xml.gz";
- String siftsFileFTPURL = SIFTS_FTP_BASE_URL + siftFile;
- String downloadedSiftsFile = SiftsSettings.getSiftDownloadDirectory()
- + siftFile;
- File siftsDownloadDir = new File(
- SiftsSettings.getSiftDownloadDirectory());
- if (!siftsDownloadDir.exists())
+ File downloadTo = null;
+ if (asFile)
{
- siftsDownloadDir.mkdirs();
- }
- // System.out.println(">> Download ftp url : " + siftsFileFTPURL);
- URL url = new URL(siftsFileFTPURL);
- URLConnection conn = url.openConnection();
- InputStream inputStream = conn.getInputStream();
- FileOutputStream outputStream = new FileOutputStream(
- downloadedSiftsFile);
- byte[] buffer = new byte[BUFFER_SIZE];
- int bytesRead = -1;
- while ((bytesRead = inputStream.read(buffer)) != -1)
+ downloadTo = new File(
+ SiftsSettings.getSiftDownloadDirectory() + siftFile);
+ File siftsDownloadDir = new File(SiftsSettings.getSiftDownloadDirectory());
+ if (!siftsDownloadDir.exists())
{
- outputStream.write(buffer, 0, bytesRead);
+ siftsDownloadDir.mkdirs();
}
- outputStream.close();
- inputStream.close();
- // System.out.println(">>> File downloaded : " + downloadedSiftsFile);
- return new File(downloadedSiftsFile);
+ }
+
+ String siftsFileFTPURL = SIFTS_FTP_BASE_URL + siftFile;
+ URL url = new URL(siftsFileFTPURL);
+ URLConnection conn = url.openConnection();
+ InputStream is = conn.getInputStream();
+ if (!asFile)
+ return is;
+ // This is MUCH more efficent in JavaScript, as we already have the bytes
+ Platform.streamToFile(is, downloadTo);
+ is.close();
+ return downloadTo;
}
/**
public static boolean deleteSiftsFileByPDBId(String pdbId)
{
File siftsFile = new File(SiftsSettings.getSiftDownloadDirectory()
- + pdbId.toLowerCase() + ".xml.gz");
+ + pdbId.toLowerCase(Locale.ROOT) + ".xml.gz");
if (siftsFile.exists())
{
return siftsFile.delete();
public DBRefEntryI getValidSourceDBRef(SequenceI seq)
throws SiftsException
{
- DBRefEntryI sourceDBRef = null;
- sourceDBRef = seq.getSourceDBRef();
- if (sourceDBRef != null && isValidDBRefEntry(sourceDBRef))
+ List<DBRefEntry> dbRefs = seq.getPrimaryDBRefs();
+ if (dbRefs == null || dbRefs.size() < 1)
{
- return sourceDBRef;
+ throw new SiftsException(
+ "Source DBRef could not be determined. DBRefs might not have been retrieved.");
}
- else
+
+ for (DBRefEntry 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)
+ String canonicalSource = DBRefUtils
+ .getCanonicalName(dbRef.getSource());
+ if (isValidDBRefEntry(dbRef)
+ && (canonicalSource.equalsIgnoreCase(DBRefSource.UNIPROT)
+ || canonicalSource.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");
}
.getMapRegion();
for (MapRegion mapRegion : mapRegions)
{
- accessions
- .add(mapRegion.getDb().getDbAccessionId().toLowerCase());
+ accessions.add(mapRegion.getDb().getDbAccessionId()
+ .toLowerCase(Locale.ROOT));
}
}
}
public StructureMapping getSiftsStructureMapping(SequenceI seq,
String pdbFile, String chain) throws SiftsException
{
+ SequenceI aseq = seq;
+ while (seq.getDatasetSequence() != null)
+ {
+ seq = seq.getDatasetSequence();
+ }
structId = (chain == null) ? pdbId : pdbId + "|" + chain;
- System.out.println("Getting mapping for: " + pdbId + "|" + chain
- + " : seq- " + seq.getName());
+ System.out.println("Getting SIFTS mapping for " + structId + ": seq "
+ + seq.getName());
final StringBuilder mappingDetails = new StringBuilder(128);
PrintStream ps = new PrintStream(System.out)
HashMap<Integer, int[]> mapping = getGreedyMapping(chain, seq, ps);
String mappingOutput = mappingDetails.toString();
- StructureMapping siftsMapping = new StructureMapping(seq, pdbFile,
- pdbId, chain, mapping, mappingOutput);
+ StructureMapping siftsMapping = new StructureMapping(aseq, pdbFile,
+ pdbId, chain, mapping, mappingOutput, seqFromPdbMapping);
+
return siftsMapping;
}
public HashMap<Integer, int[]> getGreedyMapping(String entityId,
SequenceI seq, java.io.PrintStream os) throws SiftsException
{
- List<Integer> omitNonObserved = new ArrayList<Integer>();
- int nonObservedShiftIndex = 0;
+ List<Integer> omitNonObserved = new ArrayList<>();
+ int nonObservedShiftIndex = 0,pdbeNonObserved=0;
// System.out.println("Generating mappings for : " + entityId);
Entity entity = null;
entity = getEntityById(entityId);
String originalSeq = AlignSeq.extractGaps(
jalview.util.Comparison.GapChars, seq.getSequenceAsString());
HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
- 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
HashSet<String> dbRefAccessionIdsString = new HashSet<String>();
for (DBRefEntry dbref : seq.getDBRefs())
{
- dbRefAccessionIdsString.add(dbref.getAccessionId().toLowerCase());
+ dbRefAccessionIdsString
+ .add(dbref.getAccessionId().toLowerCase(Locale.ROOT));
}
- dbRefAccessionIdsString.add(sourceDBRef.getAccessionId().toLowerCase());
+ dbRefAccessionIdsString
+ .add(sourceDBRef.getAccessionId().toLowerCase(Locale.ROOT));
curDBRefAccessionIdsString = dbRefAccessionIdsString;
curSourceDBRef = sourceDBRef.getAccessionId();
TreeMap<Integer, String> resNumMap = new TreeMap<Integer, String>();
List<Segment> segments = entity.getSegment();
SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap,
- omitNonObserved, nonObservedShiftIndex);
+ omitNonObserved, nonObservedShiftIndex,pdbeNonObserved);
processSegments(segments, shp);
try
{
int pdbStart = UNASSIGNED;
int pdbEnd = UNASSIGNED;
- Integer[] keys = mapping.keySet().toArray(new Integer[0]);
- Arrays.sort(keys);
- if (keys.length < 1)
+ if (mapping.isEmpty())
{
- throw new SiftsException(">>> Empty SIFTS mapping generated!!");
+ throw new SiftsException("SIFTS mapping failed");
}
+ // also construct a mapping object between the seq-coord sys and the PDB seq's coord sys
+
+ Integer[] keys = mapping.keySet().toArray(new Integer[0]);
+ Arrays.sort(keys);
seqStart = keys[0];
seqEnd = keys[keys.length - 1];
-
+ List<int[]> from=new ArrayList<>(),to=new ArrayList<>();
+ int[]_cfrom=null,_cto=null;
String matchedSeq = originalSeq;
- if (seqStart != UNASSIGNED)
+ if (seqStart != UNASSIGNED) // fixme! seqStart can map to -1 for a pdb sequence that starts <-1
{
+ for (int seqps:keys)
+ {
+ int pdbpos = mapping.get(seqps)[PDBE_POS];
+ if (pdbpos == UNASSIGNED)
+ {
+ // not correct - pdbpos might be -1, but leave it for now
+ continue;
+ }
+ if (_cfrom==null || seqps!=_cfrom[1]+1)
+ {
+ _cfrom = new int[] { seqps,seqps};
+ from.add(_cfrom);
+ _cto = null; // discontinuity
+ } else {
+ _cfrom[1]= seqps;
+ }
+ if (_cto==null || pdbpos!=1+_cto[1])
+ {
+ _cto = new int[] { pdbpos,pdbpos};
+ to.add(_cto);
+ } else {
+ _cto[1] = pdbpos;
+ }
+ }
+ _cfrom = new int[from.size() * 2];
+ _cto = new int[to.size() * 2];
+ int p = 0;
+ for (int[] range : from)
+ {
+ _cfrom[p++] = range[0];
+ _cfrom[p++] = range[1];
+ }
+ ;
+ p = 0;
+ for (int[] range : to)
+ {
+ _cto[p++] = range[0];
+ _cto[p++] = range[1];
+ }
+ ;
+
+ seqFromPdbMapping = new jalview.datamodel.Mapping(null, _cto, _cfrom,
+ 1,
+ 1);
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 subSeqStart = (seqStart >= orignalSeqStart)
+ ? seqStart - orignalSeqStart
+ : 0;
int subSeqEnd = seqEnd - (orignalSeqStart - 1);
subSeqEnd = originalSeq.length() < subSeqEnd ? originalSeq.length()
: subSeqEnd;
if (os != null)
{
MappingOutputPojo mop = new MappingOutputPojo();
- mop.setSeqStart(pdbStart);
- mop.setSeqEnd(pdbEnd);
+ mop.setSeqStart(seqStart);
+ mop.setSeqEnd(seqEnd);
mop.setSeqName(seq.getName());
mop.setSeqResidue(matchedSeq);
- mop.setStrStart(seqStart);
- mop.setStrEnd(seqEnd);
+ mop.setStrStart(pdbStart);
+ mop.setStrEnd(pdbEnd);
mop.setStrName(structId);
mop.setStrResidue(targetStrucSeqs.toString());
TreeMap<Integer, String> resNumMap = shp.getResNumMap();
List<Integer> omitNonObserved = shp.getOmitNonObserved();
int nonObservedShiftIndex = shp.getNonObservedShiftIndex();
+ int pdbeNonObservedCount = shp.getPdbeNonObserved();
+ int firstPDBResNum = UNASSIGNED;
for (Segment segment : segments)
{
// System.out.println("Mapping segments : " + segment.getSegId() + "\\"s
List<Residue> residues = segment.getListResidue().getResidue();
for (Residue residue : residues)
{
+ boolean isObserved = isResidueObserved(residue);
+ int pdbeIndex = Platform.getLeadingIntegerValue(residue.getDbResNum(),
+ UNASSIGNED);
int currSeqIndex = UNASSIGNED;
List<CrossRefDb> cRefDbs = residue.getCrossRefDb();
CrossRefDb pdbRefDb = null;
if (cRefDb.getDbSource().equalsIgnoreCase(DBRefSource.PDB))
{
pdbRefDb = cRefDb;
- }
- if (cRefDb.getDbCoordSys()
- .equalsIgnoreCase(seqCoordSys.getName())
- && isAccessionMatched(cRefDb.getDbAccessionId()))
- {
- String resNumIndexString = cRefDb.getDbResNum()
- .equalsIgnoreCase("None") ? String.valueOf(UNASSIGNED)
- : cRefDb.getDbResNum();
- try
+ if (firstPDBResNum == UNASSIGNED)
{
- currSeqIndex = Integer.valueOf(resNumIndexString);
- } catch (NumberFormatException nfe)
+ firstPDBResNum = Platform.getLeadingIntegerValue(cRefDb.getDbResNum(),
+ UNASSIGNED);
+ }
+ else
{
- currSeqIndex = Integer.valueOf(resNumIndexString
- .split("[a-zA-Z]")[0]);
- continue;
+ if (isObserved)
+ {
+ // after we find the first observed residue we just increment
+ firstPDBResNum++;
+ }
}
+ }
+ if (cRefDb.getDbCoordSys().equalsIgnoreCase(seqCoordSys.getName())
+ && isAccessionMatched(cRefDb.getDbAccessionId()))
+ {
+ currSeqIndex = Platform.getLeadingIntegerValue(cRefDb.getDbResNum(),
+ UNASSIGNED);
if (pdbRefDb != null)
{
break;// exit loop if pdb and uniprot are already found
}
}
}
- if (currSeqIndex == UNASSIGNED)
+ if (!isObserved)
{
- continue;
+ ++pdbeNonObservedCount;
}
- if (currSeqIndex >= seq.getStart() && currSeqIndex <= seq.getEnd())
+ if (seqCoordSys == seqCoordSys.PDB) // FIXME: is seqCoordSys ever PDBe
+ // ???
{
- int resNum;
- try
- {
- resNum = (pdbRefDb == null) ? Integer.valueOf(residue
- .getDbResNum()) : Integer.valueOf(pdbRefDb
- .getDbResNum());
- } catch (NumberFormatException nfe)
+ // if the sequence has a primary reference to the PDB, then we are
+ // dealing with a sequence extracted directly from the PDB. In that
+ // case, numbering is PDBe - non-observed residues
+ currSeqIndex = seq.getStart() - 1 + pdbeIndex;
+ }
+ if (!isObserved)
+ {
+ if (seqCoordSys != CoordinateSys.UNIPROT) // FIXME: PDB or PDBe only
+ // here
{
- resNum = (pdbRefDb == null) ? Integer.valueOf(residue
- .getDbResNum()) : Integer.valueOf(pdbRefDb
- .getDbResNum().split("[a-zA-Z]")[0]);
- continue;
+ // mapping to PDB or PDBe so we need to bookkeep for the
+ // non-observed
+ // SEQRES positions
+ omitNonObserved.add(currSeqIndex);
+ ++nonObservedShiftIndex;
}
+ }
+ if (currSeqIndex == UNASSIGNED)
+ {
+ // change in logic - unobserved residues with no currSeqIndex
+ // corresponding are still counted in both nonObservedShiftIndex and
+ // pdbeIndex...
+ continue;
+ }
+ // if (currSeqIndex >= seq.getStart() && currSeqIndex <= seqlength) //
+ // true
+ // numbering
+ // is
+ // not
+ // up
+ // to
+ // seq.getEnd()
+ {
+
+ int resNum = (pdbRefDb == null)
+ ? Platform.getLeadingIntegerValue(residue.getDbResNum(),
+ UNASSIGNED)
+ : Platform.getLeadingIntegerValue(pdbRefDb.getDbResNum(),
+ UNASSIGNED);
- if (isResidueObserved(residue)
- || seqCoordSys == CoordinateSys.UNIPROT)
+ if (isObserved)
{
char resCharCode = ResidueProperties
.getSingleCharacterCode(ResidueProperties
.getCanonicalAminoAcid(residue.getDbResName()));
resNumMap.put(currSeqIndex, String.valueOf(resCharCode));
+
+ int[] mappingcols = new int[] { Integer.valueOf(resNum),
+ UNASSIGNED, isObserved ? firstPDBResNum : UNASSIGNED };
+
+ mapping.put(currSeqIndex - nonObservedShiftIndex, mappingcols);
}
- else
- {
- omitNonObserved.add(currSeqIndex);
- ++nonObservedShiftIndex;
- }
- mapping.put(currSeqIndex - nonObservedShiftIndex, new int[] {
- Integer.valueOf(resNum), UNASSIGNED });
}
}
}
}
+
/**
*
* @param chainId
{
boolean isStrictMatch = true;
return isStrictMatch ? curSourceDBRef.equalsIgnoreCase(accession)
- : curDBRefAccessionIdsString.contains(accession.toLowerCase());
+ : curDBRefAccessionIdsString
+ .contains(accession.toLowerCase(Locale.ROOT));
}
private boolean isFoundInSiftsEntry(String accessionId)
{
Set<String> siftsDBRefs = getAllMappingAccession();
return accessionId != null
- && siftsDBRefs.contains(accessionId.toLowerCase());
+ && siftsDBRefs.contains(accessionId.toLowerCase(Locale.ROOT));
}
/**
}
}
-
-
@Override
public Entity getEntityById(String id) throws SiftsException
{
*/
public Entity getEntityByMostOptimalMatchedId(String chainId)
{
- // System.out.println("---> advanced greedy entityId matching block entered..");
+ // System.out.println("---> advanced greedy entityId matching block
+ // entered..");
List<Entity> entities = siftsEntry.getEntity();
SiftsEntitySortPojo[] sPojo = new SiftsEntitySortPojo[entities.size()];
int count = 0;
}
}
}
- 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());
if (sPojo[0].entityId != null)
{
+ if (sPojo[0].pid < 1)
+ {
+ return null;
+ }
for (Entity entity : entities)
{
if (!entity.getEntityId().equalsIgnoreCase(sPojo[0].entityId))
return null;
}
- private class SiftsEntitySortPojo implements
- Comparable<SiftsEntitySortPojo>
+ private class SiftsEntitySortPojo
+ implements Comparable<SiftsEntitySortPojo>
{
public String entityId;
private int nonObservedShiftIndex;
- public SegmentHelperPojo(SequenceI seq,
- HashMap<Integer, int[]> mapping,
+ /**
+ * count of number of 'not observed' positions in the PDB record's SEQRES
+ * (total number of residues with coordinates == length(SEQRES) -
+ * pdbeNonObserved
+ */
+ private int pdbeNonObserved;
+
+ public SegmentHelperPojo(SequenceI seq, HashMap<Integer, int[]> mapping,
TreeMap<Integer, String> resNumMap,
- List<Integer> omitNonObserved, int nonObservedShiftIndex)
+ List<Integer> omitNonObserved, int nonObservedShiftIndex,
+ int pdbeNonObserved)
{
setSeq(seq);
setMapping(mapping);
setResNumMap(resNumMap);
setOmitNonObserved(omitNonObserved);
setNonObservedShiftIndex(nonObservedShiftIndex);
+ setPdbeNonObserved(pdbeNonObserved);
+
}
+ public void setPdbeNonObserved(int pdbeNonObserved2)
+ {
+ this.pdbeNonObserved = pdbeNonObserved2;
+ }
+
+ public int getPdbeNonObserved()
+ {
+ return pdbeNonObserved;
+ }
public SequenceI getSeq()
{
return seq;
{
this.nonObservedShiftIndex = nonObservedShiftIndex;
}
+
}
@Override
- public StringBuffer getMappingOutput(MappingOutputPojo mp)
+ public StringBuilder getMappingOutput(MappingOutputPojo mp)
throws SiftsException
{
String seqRes = mp.getSeqResidue();
int nochunks = ((seqRes.length()) / len)
+ ((seqRes.length()) % len > 0 ? 1 : 0);
// output mappings
- StringBuffer output = new StringBuffer();
+ StringBuilder output = new StringBuilder(512);
output.append(NEWLINE);
- output.append("Sequence \u27f7 Structure mapping details").append(
- NEWLINE);
+ output.append("Sequence \u27f7 Structure mapping details")
+ .append(NEWLINE);
output.append("Method: SIFTS");
output.append(NEWLINE).append(NEWLINE);
output.append(String.valueOf(pdbEnd));
output.append(NEWLINE).append(NEWLINE);
+ ScoreMatrix pam250 = ScoreModels.getInstance().getPam250();
int matchedSeqCount = 0;
for (int j = 0; j < nochunks; j++)
{
// Print the first aligned sequence
- output.append(new Format("%" + (maxid) + "s").form(seqName)).append(
- " ");
+ output.append(new Format("%" + (maxid) + "s").form(seqName))
+ .append(" ");
for (int i = 0; i < len; i++)
{
output.append(NEWLINE);
output.append(new Format("%" + (maxid) + "s").form(" ")).append(" ");
- // Print out the matching chars
+ /*
+ * Print out the match symbols:
+ * | for exact match (ignoring case)
+ * . if PAM250 score is positive
+ * else a space
+ */
for (int i = 0; i < len; i++)
{
try
{
if ((i + (j * len)) < seqRes.length())
{
- if (seqRes.charAt(i + (j * len)) == strRes
- .charAt(i + (j * len))
- && !jalview.util.Comparison.isGap(seqRes.charAt(i
- + (j * len))))
+ char c1 = seqRes.charAt(i + (j * len));
+ char c2 = strRes.charAt(i + (j * len));
+ boolean sameChar = Comparison.isSameResidue(c1, c2, false);
+ if (sameChar && !Comparison.isGap(c1))
{
matchedSeqCount++;
output.append("|");
}
else if (type.equals("pep"))
{
- if (ResidueProperties.getPAM250(seqRes.charAt(i + (j * len)),
- strRes.charAt(i + (j * len))) > 0)
+ if (pam250.getPairwiseScore(c1, c2) > 0)
{
output.append(".");
}
{
throw new SiftsException(">>> Low PID detected for SIFTs mapping...");
}
- output.append("Length of alignment = " + seqRes.length()).append(
- NEWLINE);
+ output.append("Length of alignment = " + seqRes.length())
+ .append(NEWLINE);
output.append(new Format("Percentage ID = %2.2f").form(pid));
return output;
}
return siftsEntry.getDbVersion();
}
+ public static void setMockSiftsFile(File file)
+ {
+ mockSiftsFile = file;
+ }
+
}