- in++;
- }
- maxid += 9;
- int i = 0;
-
- // output database type
- if (al.getProperties() != null)
- {
- if (!al.getProperties().isEmpty())
- {
- Enumeration key = al.getProperties().keys();
- Enumeration val = al.getProperties().elements();
- while (key.hasMoreElements())
- {
- out.append("#=GF " + key.nextElement() + " " + val.nextElement());
- out.append(newline);
- }
- }
- }
-
- // output database accessions
- if (dataRef != null)
- {
- Enumeration en = dataRef.keys();
- while (en.hasMoreElements())
- {
- Object idd = en.nextElement();
- String type = (String) dataRef.remove(idd);
- out.append(new Format("%-" + (maxid - 2) + "s").form("#=GS " +idd.toString() + " "));
- if (type.contains("PFAM") || type.contains("RFAM") )
- {
-
- out.append(" AC " + type.substring(type.indexOf(";") + 1));
- } else
- {
- out.append(" DR " + type + " ");
- }
- out.append(newline);
- }
- }
-
- // output annotations
- while (i < s.length && s[i] != null)
- {
- if (s[i].getDatasetSequence() != null)
- {
- SequenceI ds = s[i].getDatasetSequence();
- AlignmentAnnotation[] alAnot;
- Annotation[] ann;
- Annotation annot;
- alAnot = s[i].getAnnotation();
- String feature = "";
- if (alAnot != null)
- {
- for (int j = 0; j < alAnot.length; j++)
- {
- if (ds.getSequenceFeatures() != null)
- {
- feature = ds.getSequenceFeatures()[0].type;
- }
- String key = type2id(feature);
-
-
- if (key == null)
- continue;
-
- // out.append("#=GR ");
- out.append(new Format("%-" + maxid + "s").form("#=GR " + printId(s[i]) + " " + key + " "));
- ann = alAnot[j].annotations;
- String seq = "";
- for (int k = 0; k < ann.length; k++)
- {
- annot = ann[k];
- String ch = (annot == null) ? Character.toString(s[i].getCharAt(k)) : annot.displayCharacter;
- if (ch.length() == 0)
- {
- if (key.equals("SS")) {
- char ll = annot.secondaryStructure;
- seq = (Character.toString(ll).equals(" ")) ? seq + "C" : seq + ll;
- } else {
- seq += ".";
- }
- } else if (ch.length() == 1) {
- seq += ch;
- } else if (ch.length() > 1) {
- seq += ch.charAt(1) ;
- }
- }
- out.append(seq);
- out.append(newline);
- }
- }
- }
-
- out.append(new Format("%-" + maxid + "s").form(printId(s[i])+" "));
- out.append(s[i].getSequenceAsString());
- out.append(newline);
- i++;
- }
-
- // alignment annotation
- AlignmentAnnotation aa;
- if (al.getAlignmentAnnotation() != null)
- {
- for (int ia = 0; ia < al.getAlignmentAnnotation().length; ia++)
- {
- aa = al.getAlignmentAnnotation()[ia];
- if (aa.autoCalculated || !aa.visible)
- {
- continue;
- }
- String seq = "";
- String label;
-
- if (aa.label.equals("seq"))
- label = "seq_cons";
- else
- label = type2id(aa.label.toLowerCase())+"_cons";
-
- if (label == null)
- label = aa.label;
-
- out.append(new Format("%-" + maxid + "s").form("#=GC " + label+" "));
- for (int j = 0; j < aa.annotations.length; j++)
- {
- String ch = (aa.annotations[j] == null) ? "-" : aa.annotations[j].displayCharacter ;
- if (ch.length() == 0)
- {
- char ll = aa.annotations[j].secondaryStructure;
- if (Character.toString(ll).equals(" "))
- seq += "C";
- else
- seq += ll;
- } else if (ch.length() == 1) {
- seq += ch;
- } else if (ch.length() > 1) {
- seq += ch.charAt(1) ;
- }
- }
- out.append(seq);
- out.append(newline);
- }
- }
- return out.toString();
+ }
+ }
+ in++;
+ }
+ maxid += 9;
+ int i = 0;
+
+ // output database type
+ if (al.getProperties() != null)
+ {
+ if (!al.getProperties().isEmpty())
+ {
+ Enumeration key = al.getProperties().keys();
+ Enumeration val = al.getProperties().elements();
+ while (key.hasMoreElements())
+ {
+ out.append("#=GF " + key.nextElement() + " " + val.nextElement());
+ out.append(newline);
+ }
+ }
+ }
+
+ // output database accessions
+ if (dataRef != null)
+ {
+ Enumeration<String> en = dataRef.keys();
+ while (en.hasMoreElements())
+ {
+ Object idd = en.nextElement();
+ String type = dataRef.remove(idd);
+ out.append(new Format("%-" + (maxid - 2) + "s")
+ .form("#=GS " + idd.toString() + " "));
+ if (isAA && type.contains("UNIPROT")
+ || (!isAA && type.contains("EMBL")))
+ {
+
+ out.append(" AC " + type.substring(type.indexOf(";") + 1));
+ }
+ else
+ {
+ out.append(" DR " + type + " ");
+ }
+ out.append(newline);
+ }
+ }
+
+ // output annotations
+ while (i < slen && (seq = s[i]) != null)
+ {
+ AlignmentAnnotation[] alAnot = seq.getAnnotation();
+ if (alAnot != null)
+ {
+ Annotation[] ann;
+ for (int j = 0, nj = alAnot.length; j < nj; j++)
+ {
+
+ String key = type2id(alAnot[j].label);
+ boolean isrna = alAnot[j].isValidStruc();
+
+ if (isrna)
+ {
+ // hardwire to secondary structure if there is RNA secondary
+ // structure on the annotation
+ key = "SS";
+ }
+ if (key == null)
+ {
+
+ continue;
+ }
+
+ // out.append("#=GR ");
+ out.append(new Format("%-" + maxid + "s").form(
+ "#=GR " + printId(seq, jvSuffix) + " " + key + " "));
+ ann = alAnot[j].annotations;
+ String sseq = "";
+ for (int k = 0, nk = ann.length; k < nk; k++)
+ {
+ sseq += outputCharacter(key, k, isrna, ann, seq);
+ }
+ out.append(sseq);
+ out.append(newline);
+ }
+ }
+
+ out.append(new Format("%-" + maxid + "s")
+ .form(printId(seq, jvSuffix) + " "));
+ out.append(seq.getSequenceAsString());
+ out.append(newline);
+ i++;
+ }
+
+ // alignment annotation
+ AlignmentAnnotation aa;
+ AlignmentAnnotation[] an = al.getAlignmentAnnotation();
+ if (an != null)
+ {
+ for (int ia = 0, na = an.length; ia < na; ia++)
+ {
+ aa = an[ia];
+ if (aa.autoCalculated || !aa.visible || aa.sequenceRef != null)
+ {
+ continue;
+ }
+ String sseq = "";
+ String label;
+ String key = "";
+ if (aa.label.equals("seq"))
+ {
+ label = "seq_cons";
+ }
+ else
+ {
+ key = type2id(aa.label.toLowerCase(Locale.ROOT));
+ if (key == null)
+ {
+ label = aa.label;
+ }
+ else
+ {
+ label = key + "_cons";
+ }
+ }
+ if (label == null)
+ {
+ label = aa.label;
+ }
+ label = label.replace(" ", "_");
+
+ out.append(
+ new Format("%-" + maxid + "s").form("#=GC " + label + " "));
+ boolean isrna = aa.isValidStruc();
+ for (int j = 0, nj = aa.annotations.length; j < nj; j++)
+ {
+ sseq += outputCharacter(key, j, isrna, aa.annotations, null);
+ }
+ out.append(sseq);
+ out.append(newline);
+ }
+ }
+
+ out.append("//");
+ out.append(newline);
+
+ return out.toString();
+ }
+
+ /**
+ * add an annotation character to the output row
+ *
+ * @param seq
+ * @param key
+ * @param k
+ * @param isrna
+ * @param ann
+ * @param sequenceI
+ */
+ private char outputCharacter(String key, int k, boolean isrna,
+ Annotation[] ann, SequenceI sequenceI)
+ {
+ char seq = ' ';
+ Annotation annot = ann[k];
+ String ch = (annot == null)
+ ? ((sequenceI == null) ? "-"
+ : Character.toString(sequenceI.getCharAt(k)))
+ : (annot.displayCharacter == null
+ ? String.valueOf(annot.secondaryStructure)
+ : annot.displayCharacter);
+ if (ch == null)
+ {
+ ch = " ";
+ }
+ if (key != null && key.equals("SS"))
+ {
+ char ssannotchar = ' ';
+ boolean charset = false;
+ if (annot == null)
+ {
+ // sensible gap character
+ ssannotchar = ' ';
+ charset = true;
+ }
+ else
+ {
+ // valid secondary structure AND no alternative label (e.g. ' B')
+ if (annot.secondaryStructure > ' ' && ch.length() < 2)
+ {
+ ssannotchar = annot.secondaryStructure;
+ charset = true;
+ }
+ }
+ if (charset)
+ {
+ return (ssannotchar == ' ' && isrna) ? '.' : ssannotchar;
+ }
+ }
+
+ if (ch.length() == 0)
+ {
+ seq = '.';
+ }
+ else if (ch.length() == 1)
+ {
+ seq = ch.charAt(0);
+ }
+ else if (ch.length() > 1)
+ {
+ seq = ch.charAt(1);
+ }
+
+ return (seq == ' ' && key != null && key.equals("SS") && isrna) ? '.'
+ : seq;