package org.gmod.schema.bulk; import java.util.Collection; import java.util.HashSet; import java.util.SortedSet; import java.util.TreeSet; public class TranscriptInfo { public int transcriptFeatureId; public String transcriptUniqueName; public String transcriptName; public String transcriptType; public Collection<Synonym> transcriptSynonyms; public int geneFeatureId; public String geneUniqueName; public String geneName; public String geneType; public Collection<Synonym> geneSynonyms; public int fmin; public int fmax; public int strand; public int srcFeatureId; public String srcFeatureUniqueName; public int srcFeatureSeqLen; public SortedSet<Exon> exons = new TreeSet<Exon>(); public Polypeptide polypeptide; @Override public String toString() { return String.format("'%s' (ID=%d)", transcriptUniqueName, transcriptFeatureId); } /** * Dump all the details in human-readable form. * * @return a string containing all the details */ public String dump() { StringBuilder s = new StringBuilder(); s.append(String.format("transcript: ID=%d, uniquename='%s', name='%s', type='%s'\n", transcriptFeatureId, transcriptUniqueName, transcriptName, transcriptType)); if (transcriptSynonyms != null && !transcriptSynonyms.isEmpty()) { String transcriptSynonymsString = commasep(transcriptSynonyms); if (transcriptSynonymsString.length() > 0) { s.append(String.format("\t- synonyms: %s\n", transcriptSynonymsString)); } } s.append(String.format("gene: ID=%d, uniquename='%s', name='%s', type='%s'\n", geneFeatureId, geneUniqueName, geneName, geneType)); if (geneSynonyms != null && !geneSynonyms.isEmpty()) { String geneSynonymsString = commasep(geneSynonyms); if (geneSynonymsString.length() > 0) { s.append(String.format("\t- synonyms: %s\n", geneSynonymsString)); } } s.append("exons: "); for (Exon exon: exons) { s.append("{" + exon + "}"); } s.append('\n'); s.append(String.format("location: fmin=%d, fmax=%d, strand=%d\n", fmin, fmax, strand)); s.append(String.format("source: uniquename='%s', ID=%d, length=%d", srcFeatureUniqueName, srcFeatureId, srcFeatureSeqLen)); s.append("polypeptide: " + polypeptide.dump()); return s.toString(); } private static String commasep(Iterable<?> os) { StringBuilder s = new StringBuilder(); for(Object o: os) { if (s.length() > 0) { s.append(", "); } s.append(o); } return s.toString(); } public static class Synonym { public String name; public String type; @Override public String toString() { return String.format("name='%s', type='%s'", name, type); } } public static class Exon implements Comparable<Exon> { public int featureId; public String uniqueName; public String type; public int fmin; public int fmax; @Override public int compareTo(Exon other) { return this.fmin - other.fmin; } @Override public String toString() { return String.format("%s(%d..%d)", type, fmin+1, fmax); } } public static class Polypeptide { public int featureId; public String uniqueName; public int seqLen; public Collection<Prop> props = new HashSet<Prop>(); public Collection<Term> terms = new HashSet<Term>(); public String dump() { StringBuilder s = new StringBuilder(); s.append(String.format("uniquename='%s', ID=%d, seqlen=%d\n", uniqueName, featureId, seqLen)); if (props != null && !props.isEmpty()) { s.append("\tprops: " + commasep(props) + '\n'); } if (terms != null && !terms.isEmpty()) { s.append("\tterms: " + commasep(terms) + '\n'); } return s.toString(); } } public static class Prop { public String typeCV; public String type; public String value; @Override public String toString() { return String.format("%s:%s=%s", typeCV, type, value); } } public static class Term { public String cv; public String term; public Collection<Prop> props; @Override public String toString() { StringBuilder s = new StringBuilder(); s.append(String.format("%s:%s", cv, term)); if (props != null && !props.isEmpty()) { s.append( "[" + commasep(props) + "]" ); } return s.toString(); } } }