import jalview.datamodel.SequenceI;
import jalview.ext.jmol.JmolParser;
import jalview.gui.IProgressIndicator;
-import jalview.io.AppletFormatAdapter;
+import jalview.io.DataSourceType;
import jalview.io.StructureFile;
import jalview.util.MappingUtils;
import jalview.util.MessageManager;
+import jalview.ws.phyre2.Phyre2Client;
import jalview.ws.sifts.SiftsClient;
import jalview.ws.sifts.SiftsException;
import jalview.ws.sifts.SiftsSettings;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
+import java.util.Hashtable;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
private long progressSessionId;
+
/*
* Set of any registered mappings between (dataset) sequences.
*/
private List<SelectionListener> sel_listeners = new ArrayList<SelectionListener>();
+ private Map<String, String> phyre2ModelTemplates = new Hashtable<String, String>();
+
/**
* @return true if will try to use external services for processing secondary
* structure
* @return null or the structure data parsed as a pdb file
*/
synchronized public StructureFile setMapping(SequenceI[] sequence,
- String[] targetChains, String pdbFile, String protocol)
+ String[] targetChains, String pdbFile, DataSourceType protocol,
+ IProgressIndicator progress)
{
- return setMapping(true, sequence, targetChains, pdbFile, protocol);
+ return computeMapping(true, sequence, targetChains, pdbFile, protocol,
+ progress);
}
+
/**
* create sequence structure mappings between each sequence and the given
* pdbFile (retrieved via the given protocol).
* - one or more sequences to be mapped to pdbFile
* @param targetChainIds
* - optional chain specification for mapping each sequence to pdb
- * (may be nill, individual elements may be nill)
+ * (may be null, individual elements may be null)
* @param pdbFile
* - structure data resource
* @param protocol
*/
synchronized public StructureFile setMapping(boolean forStructureView,
SequenceI[] sequenceArray, String[] targetChainIds,
- String pdbFile, String protocol)
+ String pdbFile, DataSourceType protocol)
+ {
+ return computeMapping(forStructureView, sequenceArray, targetChainIds,
+ pdbFile, protocol, null);
+ }
+
+ synchronized public StructureFile computeMapping(
+ boolean forStructureView, SequenceI[] sequenceArray,
+ String[] targetChainIds, String pdbFile, DataSourceType protocol,
+ IProgressIndicator progress)
{
+ long progressSessionId = System.currentTimeMillis() * 3;
/*
* There will be better ways of doing this in the future, for now we'll use
* the tried and tested MCview pdb mapping
pdb = new JmolParser(pdbFile, protocol);
if (pdb.getId() != null && pdb.getId().trim().length() > 0
- && AppletFormatAdapter.FILE.equals(protocol))
+ && DataSourceType.FILE == protocol)
{
registerPDBFile(pdb.getId().trim(), pdbFile);
}
{
if (targetChainId.trim().length() == 0)
{
- targetChainId = " ";
+ targetChainId = StructureMapping.NO_CHAIN;
}
else
{
*/
int max = -10;
AlignSeq maxAlignseq = null;
- String maxChainId = " ";
+ String maxChainId = StructureMapping.NO_CHAIN; // space
PDBChain maxChain = null;
boolean first = true;
for (PDBChain chain : pdb.getChains())
continue;
}
- if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE))
+ if (protocol.equals(DataSourceType.PASTE))
{
pdbFile = "INLINE" + pdb.getId();
}
-
- ArrayList<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
- if (isMapUsingSIFTs && seq.isProtein())
+ boolean phyre2Template = isPhyre2Template(pdbFile);
+ List<StructureMapping> seqToStrucMapping = new ArrayList<StructureMapping>();
+ if (!phyre2Template && isMapUsingSIFTs && seq.isProtein())
{
- setProgressBar(null);
- setProgressBar(MessageManager
- .getString("status.obtaining_mapping_with_sifts"));
+ if (progress!=null) {
+ progress.setProgressBar(MessageManager
+ .getString("status.obtaining_mapping_with_sifts"),
+ progressSessionId);
+ }
jalview.datamodel.Mapping sqmpping = maxAlignseq
.getMappingFromS1(false);
if (targetChainId != null && !targetChainId.trim().isEmpty())
// "IEA:Jalview" ?
maxChain.transferResidueAnnotation(nwMapping, sqmpping);
ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+ } catch (Exception e)
+ {
+ e.printStackTrace();
}
}
else
{
- ArrayList<StructureMapping> foundSiftsMappings = new ArrayList<StructureMapping>();
+ List<StructureMapping> foundSiftsMappings = new ArrayList<StructureMapping>();
for (PDBChain chain : pdb.getChains())
{
try
} catch (SiftsException e)
{
System.err.println(e.getMessage());
+ } catch (Exception e)
+ {
+ e.printStackTrace();
}
}
if (!foundSiftsMappings.isEmpty())
}
}
}
- else
+ else if (phyre2Template)
{
setProgressBar(null);
setProgressBar(MessageManager
- .getString("status.obtaining_mapping_with_nw_alignment"));
+ .getString("status.obtaining_mapping_with_phyre2_template_alignment"));
+ String fastaFile = getPhyre2FastaFileFor(pdbFile);
+ StructureMapping phyre2ModelMapping = new Phyre2Client(pdb)
+ .getStructureMapping(seq, pdbFile, fastaFile,
+ StructureMapping.NO_CHAIN);
+ seqToStrucMapping.add(phyre2ModelMapping);
+ maxChain.makeExactMapping(maxAlignseq, seq);
+ maxChain.transferRESNUMFeatures(seq, null);
+ jalview.datamodel.Mapping sqmpping = maxAlignseq
+ .getMappingFromS1(false);
+ maxChain.transferResidueAnnotation(phyre2ModelMapping, sqmpping);
+ ds.addPDBId(maxChain.sequence.getAllPDBEntries().get(0));
+ }
+ else
+ {
+ if (progress != null)
+ {
+ progress.setProgressBar(MessageManager
+ .getString("status.obtaining_mapping_with_nw_alignment"),
+ progressSessionId);
+ }
StructureMapping nwMapping = getNWMappings(seq, pdbFile,
maxChainId, maxChain, pdb, maxAlignseq);
seqToStrucMapping.add(nwMapping);
return pdb;
}
- private boolean isCIFFile(String filename)
+ public void registerPhyre2Template(String phyre2Template,
+ String fastaMappingFile)
{
- String fileExt = filename.substring(filename.lastIndexOf(".") + 1,
- filename.length());
- return "cif".equalsIgnoreCase(fileExt);
+ phyre2ModelTemplates.put(phyre2Template, fastaMappingFile);
}
/**
private StructureMapping getStructureMapping(SequenceI seq,
String pdbFile, String targetChainId, StructureFile pdb,
PDBChain maxChain, jalview.datamodel.Mapping sqmpping,
- AlignSeq maxAlignseq) throws SiftsException
+ AlignSeq maxAlignseq) throws Exception
{
StructureMapping curChainMapping = siftsClient
- .getSiftsStructureMapping(seq, pdbFile, targetChainId);
+ .getStructureMapping(seq, pdbFile, targetChainId);
try
{
PDBChain chain = pdb.findChain(targetChainId);
if (listeners.elementAt(i) instanceof StructureListener)
{
sl = (StructureListener) listeners.elementAt(i);
- for (String pdbfile : sl.getPdbFile())
+ for (String pdbfile : sl.getStructureFiles())
{
pdbs.remove(pdbfile);
}
* @param atoms
* @return
*/
- public SearchResults findAlignmentPositionsForStructurePositions(
+ public SearchResultsI findAlignmentPositionsForStructurePositions(
List<AtomSpec> atoms)
{
- SearchResults results = new SearchResults();
+ SearchResultsI results = new SearchResults();
for (AtomSpec atom : atoms)
{
SequenceI lastseq = null;
&& sm.pdbchain.equals(atom.getChain()))
{
int indexpos = sm.getSeqPos(atom.getPdbResNum());
- if (lastipos != indexpos && lastseq != sm.sequence)
+ if (lastipos != indexpos || lastseq != sm.sequence)
{
results.addResult(sm.sequence, indexpos, indexpos);
lastipos = indexpos;
return seqmappings;
}
+ public boolean isPhyre2Template(String structureFile)
+ {
+ if (structureFile == null || phyre2ModelTemplates == null
+ || phyre2ModelTemplates.isEmpty())
+ {
+ return false;
+ }
+ return phyre2ModelTemplates.get(structureFile) != null
+ && !phyre2ModelTemplates.get(structureFile).isEmpty();
+ }
+
+ public String getPhyre2FastaFileFor(String structureFile)
+ {
+ return phyre2ModelTemplates.get(structureFile);
+ }
+
+
+ public static StructureSelectionManager getStructureSelectionManager()
+ {
+ return instances.values().iterator().next();
+ }
+
+ public void addStructureMapping(StructureMapping smapping)
+ {
+ mappings.add(smapping);
+ }
+
}