import jalview.datamodel.ColumnSelection;
import jalview.datamodel.GraphLine;
import jalview.datamodel.HiddenSequences;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.PDBEntry.Type;
import jalview.datamodel.SequenceGroup;
import jalview.datamodel.SequenceI;
import jalview.schemes.ColourSchemeI;
import jalview.schemes.UserColourScheme;
import java.io.BufferedReader;
+import java.io.File;
import java.io.FileReader;
+import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
public boolean readAnnotationFile(AlignmentI al, ColumnSelection colSel,
String file, String protocol)
{
+ baseUri = "";
BufferedReader in = null;
try
{
if (protocol.equals(AppletFormatAdapter.FILE))
{
in = new BufferedReader(new FileReader(file));
+ baseUri = new File(file).getParent();
+ if (baseUri == null)
+ {
+ baseUri = "";
+ }
+ else
+ {
+ baseUri += "/";
+ }
}
else if (protocol.equals(AppletFormatAdapter.URL))
{
URL url = new URL(file);
in = new BufferedReader(new InputStreamReader(url.openStream()));
+ String bs = url.toExternalForm();
+ baseUri = bs.substring(0, bs.indexOf(url.getHost())
+ + url.getHost().length());
+ baseUri += url.toURI().getPath();
+ if (baseUri.lastIndexOf("/") > -1)
+ {
+ baseUri = baseUri.substring(0, baseUri.lastIndexOf("/")) + "/";
+ }
}
else if (protocol.equals(AppletFormatAdapter.PASTE))
{
in = new BufferedReader(new StringReader(file));
+ // TODO - support mimencoded PDBs for a paste.. ?
+ baseUri = "";
}
else if (protocol.equals(AppletFormatAdapter.CLASSLOADER))
{
if (is != null)
{
in = new BufferedReader(new java.io.InputStreamReader(is));
+ // TODO: this probably doesn't work for classloader - needs a test
+ baseUri = new File("/" + file).getParent() + "/";
}
}
if (in != null)
String lastread = "";
- private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE";
+ /**
+ * used for resolving absolute references to resources relative to
+ * annotationFile location
+ */
+ String baseUri = "";
+
+ private static String GRAPHLINE = "GRAPHLINE", COMBINE = "COMBINE",
+ STRUCTMODEL = "STRUCTMODEL";
public boolean parseAnnotationFrom(AlignmentI al, ColumnSelection colSel,
BufferedReader in) throws Exception
modified = true;
continue;
}
-
+ else if (token.equalsIgnoreCase(STRUCTMODEL))
+ {
+ boolean failedtoadd = true;
+ // expect
+ // STRUCTMODEL <QUERYID> <TemplateID> <URL to model> <URL to
+ // alignment>
+ if (st.hasMoreTokens()) {
+ refSeq = al.findName(refSeqId = st.nextToken());
+ if (refSeq == null)
+ {
+ System.err.println("Couldn't locate " + refSeqId
+ + " in the alignment for STRUCTMODEL");
+ refSeqId = null;
+ }
+ else
+ {
+ String tempId = st.nextToken();
+ String urlToModel = st.nextToken();
+ String urlToPairwise = st.hasMoreTokens() ? st.nextToken()
+ : "";
+ if (add_structmodel(al, refSeq, tempId, urlToModel,
+ urlToPairwise))
+ {
+ failedtoadd = false;
+ }
+ }
+ }
+ if (failedtoadd)
+ {
+ System.err
+ .println("Need <QueryId> <TemplateId> <URL to Model> [<URL to pairwise alignment>] as tab separated fields after "
+ + STRUCTMODEL);
+ } else {
+ modified = true;
+ }
+ continue;
+ }
// Parse out the annotation row
graphStyle = AlignmentAnnotation.getGraphValueFromString(token);
label = st.nextToken();
return modified;
}
+ /**
+ * resolve a structural model and generate and add an alignment sequence for
+ * it
+ *
+ * @param refSeq2
+ * @param tempId
+ * @param urlToModel
+ * @param urlToPairwise
+ * @return true if model and sequence was added
+ */
+ private boolean add_structmodel(AlignmentI al, SequenceI refSeq2, String tempId,
+ String urlToModel, String urlToPairwise)
+ {
+ String warningMessage = null, modelPath = null, modelProt = null, aliPath = null, aliProt = null;
+ boolean added = false;
+ try {
+ // locate tempId. if it exists, will need to merge, otherwise:
+ SequenceI templateSeq = al.findName(tempId);
+ // 1. load urlToModel
+ modelPath = resolveAbsolute(urlToModel);
+ modelProt = AppletFormatAdapter.checkProtocol(modelPath);
+ // need to transfer to local temp file ?
+ PDBEntry modelpe = new PDBEntry(tempId, null, Type.FILE, modelPath);
+ PDBEntry templpe = new PDBEntry(tempId, null, Type.FILE, modelPath);
+ refSeq2.addPDBId(modelpe);
+ aliPath = resolveAbsolute(urlToPairwise);
+ aliProt = AppletFormatAdapter.checkProtocol(aliPath);
+ // 2. load urlToPairwise
+ AlignmentI pwa = new AppletFormatAdapter().readFile(aliPath, aliProt,
+ "FASTA");
+ SequenceI qPw = null, tPw = null;
+ if (pwa != null)
+ {
+ // resolve query/template sequences in provided alignment
+ qPw = pwa.findName(refSeqId);
+ tPw = pwa.findName(tempId);
+ }
+ if (false)
+ // (qPw != null && tPw != null)
+ {
+ // not yet complete
+ // refalQ vvva--addrvvvtttddd
+ // refalT ---aaaa---sss---ddd
+ // profalQ ---v-v-v-a.-.-a---dd--r--vvvtt--td--dd
+ // profalT ---.-.-.-aa-a-a---..--.--sss..--.d--dd
+ // Pragmatic solution here:
+ // Map templpe onto refalT only where refalT and refalQ are both
+ // non-gaps
+
+ // columns for start..end in refSeq2
+ int[] gapMap = refSeq2.gapMap();
+ // insert gaps in tPw
+ int curi = 0, width = refSeq2.getLength();
+ // TBC
+ }
+ else
+ {
+ // assume 1:1 - so synthesise sequences to use to construct mapping ?
+ refSeq2.getDatasetSequence().addPDBId(modelpe);
+ if (templateSeq == null && tPw != null)
+ {
+ tPw.createDatasetSequence();
+ tPw.getDatasetSequence().addPDBId(templpe); // needs to set mapping based on model yet...
+ al.addSequence(tPw);
+ added = true;
+ }
+ }
+ // 3. pad/insert gaps in urlToPairwise according to gaps already present in
+ // refSeq2
+ // 4. add padded tempId sequence to alignment
+ // 4. associate urlToModel with refSeq2 based on position map provided by
+ // urlToPairwise
+ // 5. associate urlToModel with tempId based on position map provided by
+ // urlToPairwise
+ // start a thread to load urlToModel and process/annotate sequences.
+ } catch (IOException x)
+ {
+ warningMessage = x.toString();
+ } finally {
+ if (warningMessage !=null)
+ {
+ System.err.println("Warnings whilst processing STRUCTMODEL: "+warningMessage);
+ }
+ return added;
+ }
+ }
+
+ private String resolveAbsolute(String relURI)
+ {
+ if (relURI.indexOf(":/") > -1 || relURI.startsWith("/")
+ || "".equals(baseUri) || relURI.startsWith(baseUri))
+ {
+ return relURI;
+ }
+ return baseUri + relURI;
+ }
+
private void parseHideCols(ColumnSelection colSel, String nextToken)
{
StringTokenizer inval = new StringTokenizer(nextToken, ",");
*/
public String printCSVAnnotations(AlignmentAnnotation[] annotations)
{
+ if (annotations == null)
+ {
+ return "";
+ }
StringBuffer sp = new StringBuffer();
for (int i = 0; i < annotations.length; i++)
{