From 96f10f96255b4e9bb88601ce01adbf5faf16544c Mon Sep 17 00:00:00 2001 From: Jim Procter Date: Mon, 9 Jun 2014 10:42:00 +0100 Subject: [PATCH] JAL-1260 source formatting according to utils/eclipse/JalviewCodeStyle.xml --- src/jalview/datamodel/DBRefSource.java | 2 + src/jalview/io/DnaUtils.java | 123 +- src/jalview/io/GenBankFile.java | 1916 +++++++++++--------- src/jalview/io/xdb/genbank/GenBankFeature.java | 151 +- src/jalview/io/xdb/genbank/GenBankLocation.java | 63 +- .../io/xdb/genbank/GenBankLocationPoint.java | 304 ++-- .../io/xdb/genbank/GenBankLocationRange.java | 155 +- src/jalview/io/xdb/genbank/GenBankLocations.java | 187 +- src/jalview/io/xdb/genbank/GenBankLocus.java | 302 +-- src/jalview/io/xdb/genbank/GenBankReference.java | 305 ++-- src/jalview/io/xdb/genbank/GenBankSequence.java | 108 +- src/jalview/io/xdb/genbank/GenBankSource.java | 161 +- src/jalview/io/xdb/genbank/GenBankVersion.java | 180 +- test/jalview/io/GenBankTest.java | 531 +++--- 14 files changed, 2541 insertions(+), 1947 deletions(-) diff --git a/src/jalview/datamodel/DBRefSource.java b/src/jalview/datamodel/DBRefSource.java index b3b3b64..a888abc 100644 --- a/src/jalview/datamodel/DBRefSource.java +++ b/src/jalview/datamodel/DBRefSource.java @@ -74,10 +74,12 @@ public class DBRefSource * GeneDB ID */ public static final String GENEDB = "GeneDB"; + /** * GeneBank */ public static final String GENBANK = "GenBank"; + /** * List of databases whose sequences might have coding regions annotated */ diff --git a/src/jalview/io/DnaUtils.java b/src/jalview/io/DnaUtils.java index acd0bb9..5d5a603 100644 --- a/src/jalview/io/DnaUtils.java +++ b/src/jalview/io/DnaUtils.java @@ -7,55 +7,78 @@ import java.util.ArrayList; import java.util.List; import java.util.Vector; -public class DnaUtils { - - /** - * @param gbf CDS feature data - * @param sequences ORIGIN data - * @return Nucleotid String (sequence) of CDS - */ - public static String getSequence(GenBankFeature gbf, Vector sequences){ - if (!gbf.getType().equals(GenBankFeature.CDS)){ - //If the feature is not a CDS, no sequence is returned - return null; - }else{ - String range = gbf.getQualifier("range"); - if (range.startsWith("join")){ - //TODO - //It's a composed sequence - }else{ - //It's a simple range - String[] positions = range.split(".."); - int initRange = Integer.parseInt(positions[0]); - int endRange = Integer.parseInt(positions[1]); - String sourceSequence = getNucleotidesFromSequenceVector(sequences); - return sourceSequence.substring(initRange, endRange); - } - } - return null; - - } - private static boolean isSequenceInRange(int initRange, int endRange, GenBankSequence gbs){ - return ((initRange>=gbs.getId()) && (endRange>=gbs.getId())); - } - private static String getNucleotidesInRangeFromSequence(int initRange, int endRange, GenBankSequence gbs){ - return ""; - } - public static String getNucleotidesFromSequenceVector(Vector v){ - StringBuffer sb = new StringBuffer(); - for (GenBankSequence gbs:v){ - Vector seqs = gbs.getSequences(); - for (String s:seqs) - sb.append(s); - } - return sb.toString(); - } - /** - * @param args - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - - } +public class DnaUtils +{ + + /** + * @param gbf + * CDS feature data + * @param sequences + * ORIGIN data + * @return Nucleotid String (sequence) of CDS + */ + public static String getSequence(GenBankFeature gbf, + Vector sequences) + { + if (!gbf.getType().equals(GenBankFeature.CDS)) + { + // If the feature is not a CDS, no sequence is returned + return null; + } + else + { + String range = gbf.getQualifier("range"); + if (range.startsWith("join")) + { + // TODO + // It's a composed sequence + } + else + { + // It's a simple range + String[] positions = range.split(".."); + int initRange = Integer.parseInt(positions[0]); + int endRange = Integer.parseInt(positions[1]); + String sourceSequence = getNucleotidesFromSequenceVector(sequences); + return sourceSequence.substring(initRange, endRange); + } + } + return null; + + } + + private static boolean isSequenceInRange(int initRange, int endRange, + GenBankSequence gbs) + { + return ((initRange >= gbs.getId()) && (endRange >= gbs.getId())); + } + + private static String getNucleotidesInRangeFromSequence(int initRange, + int endRange, GenBankSequence gbs) + { + return ""; + } + + public static String getNucleotidesFromSequenceVector( + Vector v) + { + StringBuffer sb = new StringBuffer(); + for (GenBankSequence gbs : v) + { + Vector seqs = gbs.getSequences(); + for (String s : seqs) + sb.append(s); + } + return sb.toString(); + } + + /** + * @param args + */ + public static void main(String[] args) + { + // TODO Auto-generated method stub + + } } diff --git a/src/jalview/io/GenBankFile.java b/src/jalview/io/GenBankFile.java index 4715095..1c17c05 100644 --- a/src/jalview/io/GenBankFile.java +++ b/src/jalview/io/GenBankFile.java @@ -32,842 +32,1108 @@ import java.util.regex.Pattern; import org.apache.james.mime4j.field.ParsedField; -public class GenBankFile extends AlignFile { - private static final Logger log = Logger.getLogger(GenBankFile.class.getName()); - private GenBankVersion version = new GenBankVersion(); - private GenBankLocus locus = new GenBankLocus(); - private GenBankSource source = new GenBankSource(); - private static final Pattern patLocation = Pattern.compile("(\\d+)\\.\\.(\\d+)"); - private static final Pattern patLocationComp = Pattern.compile("(complement)\\((\\d+)\\.\\.(\\d+)\\)"); - private static final Pattern patLocus = Pattern.compile("^LOCUS +([a-z|A-Z|0-9|_]+) +([0-9]+) bp ( {3}|ss\\-|ds\\-|ms\\-)([a-z|A-Z|-|\\s]+) ([a-z| ]{8}) ([A-Z| ]{3}) ([0-9]+-[A-Z]+-[0-9]+)"); - private static final Pattern patQualifierKey = Pattern.compile("/(.*?)="); - private static final Pattern patFeatureKey = Pattern.compile("^\\s{5}([A-Za-z0-9\\_\\']+)\\s+"); - - private String definition; - private String accession; - private String keywords; - private String dblink; - private String baseCount; - - private Vector features; - private Vector comments; - //Items under origin - private Vector sequences; - private Vector references; - - private SequenceI genBankSequence; - - public GenBankFile() { - } - - public GenBankFile(String inFile, String type) throws IOException { - super(inFile, type); - } - - public GenBankFile(FileParse source) throws IOException { - super(source); - } - - public void initData() { - super.initData(); - features = new Vector(); - comments = new Vector(); - sequences = new Vector(); - references = new Vector(); - } - - public void parse() throws IOException { - String line; - boolean featureMode = false; //FEATURES found - boolean seqMode = false; //Parsing Sequences from SOURCE - boolean referenceMode = false; //REFERENCE found - boolean sourceMode = false; //SOURCE found - boolean commentMode = false; //COMMENT found - boolean parsingAuthors = false; //Parsing authors (multiline) - boolean parsingDefinition = false; //Parsing definition (multiline) - boolean parsingKeywords = false; //Parsing keywords (multiline) - boolean parsingDbLink = false; //Parsing DBLINK (multiline) - boolean parsingTitle = false; //Parsing title (multiline) - boolean parsingQualifier = false; //Parsing feature qualifier (multine) - String currentQualifierName = ""; - GenBankReference reference = null; - GenBankFeature feature = null; - List sourceLines = new ArrayList(); - - if (this.isValid()){ - - while ((line = nextLine()) != null) { - // We only process lines if they have contents within - if (line.length() == 0) - continue; - - if (line.startsWith("FEATURES")){ - featureMode = true; - seqMode = false; - referenceMode = false; - sourceMode = false; - commentMode = false; - feature = new GenBankFeature(); - source = parseSource(sourceLines); - } - - - if (seqMode) { - if (!line.startsWith("//")){ - GenBankSequence seq = processSequenceLine(line); - sequences.add(seq); - } - featureMode = false; - referenceMode = false; - sourceMode = false; - } - - if (line.startsWith("ORIGIN")){ - if (feature.getType()!=null) - features.add(feature); - featureMode = false; - referenceMode = false; - sourceMode = false; - seqMode = true; - } - - if (featureMode){ - // Process feature line - if (!line.startsWith("FEATURES") && !line.startsWith("BASE COUNT")){ - //Parse type - if (!line.trim().startsWith("/")){ - Matcher featuresMatch = patFeatureKey.matcher(line); - if (featuresMatch.find()){ - if (feature.getType()!=null) - features.add(feature); //Hay que añadirlo sólo si no se está a mitad de un qualif o una feature - //It's a feature - String type = featuresMatch.group(0); - feature = new GenBankFeature(); - feature.setType(type); - GenBankLocation loc = parserFeatureLocation(feature, line.replace(type,"")); - feature.setLocation(loc); - parsingQualifier = false; - continue; - }else if (parsingQualifier) { //If not a feature, it's another part of a qualifier - String qValue = feature.getQualifier(currentQualifierName); - StringBuffer sb = new StringBuffer().append(qValue).append(ltrim(line)); - feature.updateQualifier(currentQualifierName, sb.toString()); - continue; - } - }else{ - //It's the begining of a qualifier line - Matcher matcher = patQualifierKey.matcher(line); - if (matcher.find()){ - String qName = matcher.group(1); - currentQualifierName = qName.replace("/",""); - line = line.replace(qName,"").replace("/", "").replace("=",""); - feature.addQualifier(currentQualifierName, ltrim(line)); - parsingQualifier = true; - continue; - } - } - } - } - // Process REFERENCE line - if (line.startsWith("REFERENCE")) { - if (!referenceMode){ - //This is line is the REFERENCE line - referenceMode = true; - featureMode = false; - sourceMode = false; - seqMode = false; - }else{ - //We were at referenceMode, then add current reference to the list and create a new one - references.add(reference); - } - reference = new GenBankReference(); - String desc = processReferenceLine(line,"REFERENCE"); - int[] ranges = parseReferenceDescriptor(desc); - reference.setDescriptor(desc); - reference.setOrder(ranges[0]); - reference.setBegin(ranges[1]); - reference.setEnd(ranges[2]); - parsingAuthors = false; - parsingTitle = false; - continue; - } - - if (line.startsWith(" AUTHORS")){ - if (referenceMode){ - reference.setAuthors(processReferenceLine(line,"AUTHORS")); - parsingAuthors = true; - parsingTitle = false; - } - continue; - } - if (line.startsWith(" TITLE")){ - if (referenceMode){ - reference.setTitle(processReferenceLine(line,"TITLE")); - parsingAuthors = false; - parsingTitle = true; - } - continue; - } - if (line.startsWith(" JOURNAL")){ - if (referenceMode){ - reference.setJournal(processReferenceLine(line,"JOURNAL")); - parsingTitle = false; - parsingAuthors = false; - } - continue; - } - if (line.startsWith(" PUBMED")){ - if (referenceMode){ - reference.setPubmed(processReferenceLine(line,"PUBMED")); - parsingTitle = false; - parsingAuthors = false; - } - continue; - } - - if (line.startsWith(" MEDLINE")){ - if (referenceMode){ - reference.setMedline(processReferenceLine(line,"MEDLINE")); - parsingTitle = false; - parsingAuthors = false; - } - continue; - } - if (line.startsWith(" REMARK")){ - if (referenceMode){ - reference.setRemark(processReferenceLine(line,"REMARK")); - parsingTitle = false; - parsingAuthors = false; - } - continue; - } - if (line.startsWith(" CONSRTM")){ - if (referenceMode){ - reference.setConsortia(processReferenceLine(line,"CONSRTM")); - parsingTitle = false; - parsingAuthors = false; - } - continue; - } - - - if (line.startsWith("SOURCE")) { - parsingKeywords = false; - sourceMode = true; - commentMode = false; - if (sourceMode){ - sourceLines.add(line); - } - continue; - } - if (line.indexOf("ORGANISM")!=-1) { - if (sourceMode){ - sourceLines.add(line); - continue; - } - } - - if (line.startsWith("COMMENT")){ - if (reference!=null) - references.add(reference); - commentMode = true; - sourceMode = false; - referenceMode = false; - sourceMode = false; - seqMode = false; - comments.add(processCommentLine(line)); - continue; - } - // Process LOCUS line - if (line.startsWith("LOCUS")) { - locus = parseLocus(line); - continue; - } - // Process BASE COUNT line - if (line.startsWith("BASE COUNT")) { - baseCount = processHeaderLine(line,"BASE COUNT"); - featureMode = false; - continue; - } - // Process DEFINITION line - if (line.startsWith("DEFINITION")) { - definition = processHeaderLine(line,"DEFINITION"); - parsingDefinition = true; - continue; - } - // Process ACCESSION line - if (line.startsWith("ACCESSION")) { - accession = processHeaderLine(line,"ACCESSION"); - parsingDefinition = false; - continue; - } - // Process VERSION line - if (line.startsWith("VERSION")) { - version = parseVersion(line); - //headers.put("VERSION", processHeaderLine(line,"VERSION")); - continue; - } - // Process DBLINK line - if (line.startsWith("DBLINK")) { - dblink = processHeaderLine(line,"DBLINK"); - parsingDbLink = true; - continue; - } - // Process KEYWORDS line - if (line.startsWith("KEYWORDS")) { - keywords = processHeaderLine(line,"KEYWORDS"); - parsingKeywords = true; - parsingDbLink = false; - continue; - } - if (sourceMode){ - sourceLines.add(line); - continue; - } - if (parsingDefinition){ - StringBuffer sb = new StringBuffer().append(definition).append(line); - definition = sb.toString(); - continue; - } - if (referenceMode && parsingAuthors){ - if (reference!=null){ - StringBuffer authors = new StringBuffer().append(reference.getAuthors()).append(line); - reference.setAuthors(authors.toString()); - } - continue; - } - if (referenceMode && parsingTitle){ - if (reference!=null){ - StringBuffer title = new StringBuffer().append(reference.getTitle()).append(line); - reference.setTitle(title.toString()); - } - continue; - } - if (parsingKeywords){ - StringBuffer sb = new StringBuffer().append(keywords).append(line); - keywords = sb.toString(); - continue; - } - if (parsingDbLink){ - StringBuffer sb = new StringBuffer().append(dblink).append(line); - dblink = sb.toString(); - continue; - } - if (commentMode){ - comments.add(line); - } - } - setEntries(); - }else{ - //File is not valid - throw new IOException("GenBankFile is not valid."); - } - } - - protected void setEntries(){ - StringBuffer result = new StringBuffer(); - //Mapping GenBank info into Jalview data model - genBankSequence = new Sequence(accession,DnaUtils.getNucleotidesFromSequenceVector(sequences)); - //Mapping DBRefEntry - DBRefEntry dbRef = new DBRefEntry(); - dbRef.setSource(DBRefSource.GENBANK); - dbRef.setVersion(version == null ? "" : version.toString()); - dbRef.setAccessionId(accession); - // add map to indicate the sequence is a valid coordinate frame for the dbref - dbRef.setMap(new Mapping(null, new int[] - { 1, genBankSequence.getLength() }, new int[] - { 1, genBankSequence.getLength() }, 1, 1)); - genBankSequence.addDBRef(dbRef); - - //add header info as non-positional features - //add LOCUS - SequenceFeature locusF = new SequenceFeature("LOCUS", (locus == null ? "" : locus.toString()), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(locusF); - //add DEFNITION - SequenceFeature defF = new SequenceFeature("DEFINITION", definition, null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(defF); - //add ACCESSION - SequenceFeature accessionF = new SequenceFeature("ACCESSION", accession, null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(accessionF); - //add VERSION - SequenceFeature versionF = new SequenceFeature("VERSION", (version == null ? "" : version.toString()), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(versionF); - //add DBLINK - SequenceFeature dblinkF = new SequenceFeature("DBLINK", (dblink == null ? "" : dblink.toString()), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(dblinkF); - //add KEYWORDS - SequenceFeature keywordsF = new SequenceFeature("KEYWORDS", keywords, null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(keywordsF); - //add SOURCE - SequenceFeature sourceF = new SequenceFeature("SOURCE", (source == null ? "" : source.toString()), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(sourceF); - //add BASE COUNT - SequenceFeature baseCountF = new SequenceFeature("BASE COUNT", (baseCount == null ? "" : baseCount.toString()), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(baseCountF); - - // add literature and database cross references in the file - for (GenBankReference gbRef:references){ - //They are non-positional features - SequenceFeature refFeature = new SequenceFeature("REFERENCE", gbRef.toString(),null,gbRef.getBegin(),gbRef.getEnd(),DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(refFeature); - } - //add COMMENTS - if (comments.size()>0){ - StringBuffer sb = new StringBuffer(); - for (String comment: comments){ - sb.append(comment).append(newline); - } - SequenceFeature commentF = new SequenceFeature("COMMENT", sb.toString(), null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); - genBankSequence.addSequenceFeature(commentF); - } - //Mapping FEATURES - for (GenBankFeature feature:features){ - if (feature.getType()!=null){ - SequenceFeature sf = new SequenceFeature(); - sf.setType(feature.getType()); - sf.setDescription(feature.getType()); - - sf.setBegin(feature.getLocation()==null ? 0 : feature.getLocation().getMinor()); - sf.setEnd(feature.getLocation()==null ? 0 : feature.getLocation().getMajor()); - Enumeration names = feature.getQualifiersNames(); - while (names.hasMoreElements()){ - String qName = names.nextElement(); - String qValue = feature.getQualifier(qName); - sf.setValue(qName, qValue); - } - genBankSequence.addSequenceFeature(sf); - } - } - SequenceI[] parsedSeqs = new SequenceI[1]; - parsedSeqs[0] = genBankSequence; - this.setSeqs(parsedSeqs); - } - private GenBankVersion parseVersion(String line) { - //VERSION U00096.2 GI:48994873 - if (line.trim().equalsIgnoreCase("VERSION")){ - return null; - }else{ - GenBankVersion ver = new GenBankVersion(); - String v = line.substring(11, line.indexOf(" ", 12)).trim(); - ver.setVersion(v); - int posGI = line.indexOf("GI:", 11 + v.length()); - if (posGI > -1) { - ver.setGI(line.substring(posGI)); - } - return ver; - } +public class GenBankFile extends AlignFile +{ + private static final Logger log = Logger.getLogger(GenBankFile.class + .getName()); + + private GenBankVersion version = new GenBankVersion(); + + private GenBankLocus locus = new GenBankLocus(); + + private GenBankSource source = new GenBankSource(); + + private static final Pattern patLocation = Pattern + .compile("(\\d+)\\.\\.(\\d+)"); + + private static final Pattern patLocationComp = Pattern + .compile("(complement)\\((\\d+)\\.\\.(\\d+)\\)"); + + private static final Pattern patLocus = Pattern + .compile("^LOCUS +([a-z|A-Z|0-9|_]+) +([0-9]+) bp ( {3}|ss\\-|ds\\-|ms\\-)([a-z|A-Z|-|\\s]+) ([a-z| ]{8}) ([A-Z| ]{3}) ([0-9]+-[A-Z]+-[0-9]+)"); + + private static final Pattern patQualifierKey = Pattern.compile("/(.*?)="); + + private static final Pattern patFeatureKey = Pattern + .compile("^\\s{5}([A-Za-z0-9\\_\\']+)\\s+"); + + private String definition; + + private String accession; + + private String keywords; + + private String dblink; + + private String baseCount; + + private Vector features; + + private Vector comments; + + // Items under origin + private Vector sequences; + + private Vector references; + + private SequenceI genBankSequence; + + public GenBankFile() + { + } + + public GenBankFile(String inFile, String type) throws IOException + { + super(inFile, type); + } + + public GenBankFile(FileParse source) throws IOException + { + super(source); + } + + public void initData() + { + super.initData(); + features = new Vector(); + comments = new Vector(); + sequences = new Vector(); + references = new Vector(); + } + + public void parse() throws IOException + { + String line; + boolean featureMode = false; // FEATURES found + boolean seqMode = false; // Parsing Sequences from SOURCE + boolean referenceMode = false; // REFERENCE found + boolean sourceMode = false; // SOURCE found + boolean commentMode = false; // COMMENT found + boolean parsingAuthors = false; // Parsing authors (multiline) + boolean parsingDefinition = false; // Parsing definition (multiline) + boolean parsingKeywords = false; // Parsing keywords (multiline) + boolean parsingDbLink = false; // Parsing DBLINK (multiline) + boolean parsingTitle = false; // Parsing title (multiline) + boolean parsingQualifier = false; // Parsing feature qualifier (multine) + String currentQualifierName = ""; + GenBankReference reference = null; + GenBankFeature feature = null; + List sourceLines = new ArrayList(); + + if (this.isValid()) + { + + while ((line = nextLine()) != null) + { + // We only process lines if they have contents within + if (line.length() == 0) + continue; + + if (line.startsWith("FEATURES")) + { + featureMode = true; + seqMode = false; + referenceMode = false; + sourceMode = false; + commentMode = false; + feature = new GenBankFeature(); + source = parseSource(sourceLines); + } + + if (seqMode) + { + if (!line.startsWith("//")) + { + GenBankSequence seq = processSequenceLine(line); + sequences.add(seq); + } + featureMode = false; + referenceMode = false; + sourceMode = false; + } + + if (line.startsWith("ORIGIN")) + { + if (feature.getType() != null) + features.add(feature); + featureMode = false; + referenceMode = false; + sourceMode = false; + seqMode = true; + } + + if (featureMode) + { + // Process feature line + if (!line.startsWith("FEATURES") + && !line.startsWith("BASE COUNT")) + { + // Parse type + if (!line.trim().startsWith("/")) + { + Matcher featuresMatch = patFeatureKey.matcher(line); + if (featuresMatch.find()) + { + if (feature.getType() != null) + features.add(feature); // Hay que a�adirlo s�lo si no se est� + // a mitad de un qualif o una feature + // It's a feature + String type = featuresMatch.group(0); + feature = new GenBankFeature(); + feature.setType(type); + GenBankLocation loc = parserFeatureLocation(feature, + line.replace(type, "")); + feature.setLocation(loc); + parsingQualifier = false; + continue; + } + else if (parsingQualifier) + { // If not a feature, it's another part of a qualifier + String qValue = feature.getQualifier(currentQualifierName); + StringBuffer sb = new StringBuffer().append(qValue).append( + ltrim(line)); + feature.updateQualifier(currentQualifierName, sb.toString()); + continue; + } + } + else + { + // It's the begining of a qualifier line + Matcher matcher = patQualifierKey.matcher(line); + if (matcher.find()) + { + String qName = matcher.group(1); + currentQualifierName = qName.replace("/", ""); + line = line.replace(qName, "").replace("/", "") + .replace("=", ""); + feature.addQualifier(currentQualifierName, ltrim(line)); + parsingQualifier = true; + continue; + } + } + } + } + // Process REFERENCE line + if (line.startsWith("REFERENCE")) + { + if (!referenceMode) + { + // This is line is the REFERENCE line + referenceMode = true; + featureMode = false; + sourceMode = false; + seqMode = false; + } + else + { + // We were at referenceMode, then add current reference to the list + // and create a new one + references.add(reference); + } + reference = new GenBankReference(); + String desc = processReferenceLine(line, "REFERENCE"); + int[] ranges = parseReferenceDescriptor(desc); + reference.setDescriptor(desc); + reference.setOrder(ranges[0]); + reference.setBegin(ranges[1]); + reference.setEnd(ranges[2]); + parsingAuthors = false; + parsingTitle = false; + continue; + } + + if (line.startsWith(" AUTHORS")) + { + if (referenceMode) + { + reference.setAuthors(processReferenceLine(line, "AUTHORS")); + parsingAuthors = true; + parsingTitle = false; + } + continue; + } + if (line.startsWith(" TITLE")) + { + if (referenceMode) + { + reference.setTitle(processReferenceLine(line, "TITLE")); + parsingAuthors = false; + parsingTitle = true; + } + continue; + } + if (line.startsWith(" JOURNAL")) + { + if (referenceMode) + { + reference.setJournal(processReferenceLine(line, "JOURNAL")); + parsingTitle = false; + parsingAuthors = false; + } + continue; + } + if (line.startsWith(" PUBMED")) + { + if (referenceMode) + { + reference.setPubmed(processReferenceLine(line, "PUBMED")); + parsingTitle = false; + parsingAuthors = false; + } + continue; + } + + if (line.startsWith(" MEDLINE")) + { + if (referenceMode) + { + reference.setMedline(processReferenceLine(line, "MEDLINE")); + parsingTitle = false; + parsingAuthors = false; + } + continue; + } + if (line.startsWith(" REMARK")) + { + if (referenceMode) + { + reference.setRemark(processReferenceLine(line, "REMARK")); + parsingTitle = false; + parsingAuthors = false; + } + continue; + } + if (line.startsWith(" CONSRTM")) + { + if (referenceMode) + { + reference.setConsortia(processReferenceLine(line, "CONSRTM")); + parsingTitle = false; + parsingAuthors = false; + } + continue; + } + + if (line.startsWith("SOURCE")) + { + parsingKeywords = false; + sourceMode = true; + commentMode = false; + if (sourceMode) + { + sourceLines.add(line); + } + continue; + } + if (line.indexOf("ORGANISM") != -1) + { + if (sourceMode) + { + sourceLines.add(line); + continue; + } + } + + if (line.startsWith("COMMENT")) + { + if (reference != null) + references.add(reference); + commentMode = true; + sourceMode = false; + referenceMode = false; + sourceMode = false; + seqMode = false; + comments.add(processCommentLine(line)); + continue; + } + // Process LOCUS line + if (line.startsWith("LOCUS")) + { + locus = parseLocus(line); + continue; + } + // Process BASE COUNT line + if (line.startsWith("BASE COUNT")) + { + baseCount = processHeaderLine(line, "BASE COUNT"); + featureMode = false; + continue; + } + // Process DEFINITION line + if (line.startsWith("DEFINITION")) + { + definition = processHeaderLine(line, "DEFINITION"); + parsingDefinition = true; + continue; + } + // Process ACCESSION line + if (line.startsWith("ACCESSION")) + { + accession = processHeaderLine(line, "ACCESSION"); + parsingDefinition = false; + continue; + } + // Process VERSION line + if (line.startsWith("VERSION")) + { + version = parseVersion(line); + // headers.put("VERSION", processHeaderLine(line,"VERSION")); + continue; + } + // Process DBLINK line + if (line.startsWith("DBLINK")) + { + dblink = processHeaderLine(line, "DBLINK"); + parsingDbLink = true; + continue; + } + // Process KEYWORDS line + if (line.startsWith("KEYWORDS")) + { + keywords = processHeaderLine(line, "KEYWORDS"); + parsingKeywords = true; + parsingDbLink = false; + continue; + } + if (sourceMode) + { + sourceLines.add(line); + continue; + } + if (parsingDefinition) + { + StringBuffer sb = new StringBuffer().append(definition).append( + line); + definition = sb.toString(); + continue; + } + if (referenceMode && parsingAuthors) + { + if (reference != null) + { + StringBuffer authors = new StringBuffer().append( + reference.getAuthors()).append(line); + reference.setAuthors(authors.toString()); + } + continue; + } + if (referenceMode && parsingTitle) + { + if (reference != null) + { + StringBuffer title = new StringBuffer().append( + reference.getTitle()).append(line); + reference.setTitle(title.toString()); + } + continue; + } + if (parsingKeywords) + { + StringBuffer sb = new StringBuffer().append(keywords) + .append(line); + keywords = sb.toString(); + continue; + } + if (parsingDbLink) + { + StringBuffer sb = new StringBuffer().append(dblink).append(line); + dblink = sb.toString(); + continue; + } + if (commentMode) + { + comments.add(line); + } + } + setEntries(); } - - private GenBankLocus parseLocus(String line){ - GenBankLocus loc = new GenBankLocus(); - Matcher mat = patLocus.matcher(line); - if (mat.find()) { - String name = mat.group(1); - String len = mat.group(2); - String strand = mat.group(3); - String mtype = mat.group(4); - String linear = mat.group(5); - String division = mat.group(6); - String date = mat.group(7); - - loc.setName(name == null ? "" : name.trim()); - loc.setSequenceLength(len == null ? 0 : Integer.parseInt(len)); - loc.setStrand(strand == null ? "" : strand); - loc.setMoleculeType(mtype == null ? "" : mtype); - loc.setLinearSequence("linear".equals(linear)); - loc.setDivision(division == null ? "" : division); - loc.setModificationDate(date == null ? "" :date); - } - return loc; + else + { + // File is not valid + throw new IOException("GenBankFile is not valid."); } - private GenBankSource parseSource(List lines){ - StringBuffer sb = new StringBuffer(); - for(String line:lines){ - sb.append(line).append(newline); - } - // Source section - GenBankSource sou = new GenBankSource(); - String aux = sb.toString().substring(11); - int fim1 = aux.indexOf("\n"); - if (fim1 > -1) { - sou.setSource(aux.substring(0, fim1)); - int ini2 = aux.indexOf("ORGANISM"); - if (ini2 > -1) { - fim1 = aux.indexOf("\n", ini2 + 10); - if (fim1 > -1) { - sou.setOrganism(aux.substring(ini2 + 10, fim1)); - sou.setTaxonomic(aux.substring(fim1).replaceAll(" ", "").replaceAll("\\s+", "")); - } else { - sou.setOrganism(aux); - } - } - } else { - sou.setSource(aux); - } - return sou; - } - - /** - * Possible situations: - * - * 467 Points to a single base in the presented sequence 340..565 Points to - * a continuous range of bases bounded by and including the starting and - * ending bases <345..500 Indicates that the exact lower boundary point - * of a feature is unknown. The location begins at some base previous to the - * first base specified (which need not be contained in the presented - * sequence) and continues to and includes the ending base <1..888 The - * feature starts before the first sequenced base and continues to and - * includes base 888 1..>888 The feature starts at the first sequenced - * base and continues beyond base 888 102.110 Indicates that the exact - * location is unknown but that it is one of the bases between bases 102 and - * 110, inclusive 123^124 Points to a site between bases 123 and 124 - * join(12..78,134..202) Regions 12 to 78 and 134 to 202 should be joined to - * form one contiguous sequence complement(34..126) Start at the base - * complementary to 126 and finish at the base complementary to base 34 (the - * feature is on the strand complementary to the presented strand) - * complement(join(2691..4571,4918..5163)) Joins regions 2691 to 4571 and - * 4918 to 5163, then complements the joined segments (the feature is on the - * strand complementary to the presented strand) - * join(complement(4918..5163),complement(2691..4571)) Complements regions - * 4918 to 5163 and 2691 to 4571, then joins the complemented segments (the - * feature is on the strand complementary to the presented strand) - * J00194.1:100..202 Points to bases 100 to 202, inclusive, in the entry (in - * this database) with primary accession number 'J00194' - * join(1..100,J00194.1:100..202) Joins region 1..100 of the existing entry - * with the region 100..202 of remote entry J00194 - * - * @param fea - * @param localiza - */ - private GenBankLocation parserFeatureLocation(GenBankFeature fea, String localiza) { - // remove os espaços, quebra de linhas etc - String buf = localiza.replaceAll("\\s", ""); - - // checks if there is a comma present between ranges - // complement(100..110),complement(90..100) - char[] buf2 = buf.toCharArray(); - int abertos = 0; - java.util.List lista = new java.util.ArrayList(); - int pinicial = 0; - for (int i = 0; i < buf2.length; i++) { - if (buf2[i] == '(') { - abertos++; - } else if (buf2[i] == ')') { - abertos--; - } else if (buf2[i] == ',' && abertos == 0) { - lista.add(buf.substring(pinicial, i)); - pinicial = i + 1; + } + + protected void setEntries() + { + StringBuffer result = new StringBuffer(); + // Mapping GenBank info into Jalview data model + genBankSequence = new Sequence(accession, + DnaUtils.getNucleotidesFromSequenceVector(sequences)); + // Mapping DBRefEntry + DBRefEntry dbRef = new DBRefEntry(); + dbRef.setSource(DBRefSource.GENBANK); + dbRef.setVersion(version == null ? "" : version.toString()); + dbRef.setAccessionId(accession); + // add map to indicate the sequence is a valid coordinate frame for the + // dbref + dbRef.setMap(new Mapping(null, new int[] + { 1, genBankSequence.getLength() }, new int[] + { 1, genBankSequence.getLength() }, 1, 1)); + genBankSequence.addDBRef(dbRef); + + // add header info as non-positional features + // add LOCUS + SequenceFeature locusF = new SequenceFeature("LOCUS", + (locus == null ? "" : locus.toString()), null, 1, + genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(locusF); + // add DEFNITION + SequenceFeature defF = new SequenceFeature("DEFINITION", definition, + null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(defF); + // add ACCESSION + SequenceFeature accessionF = new SequenceFeature("ACCESSION", + accession, null, 1, genBankSequence.getLength(), + DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(accessionF); + // add VERSION + SequenceFeature versionF = new SequenceFeature("VERSION", + (version == null ? "" : version.toString()), null, 1, + genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(versionF); + // add DBLINK + SequenceFeature dblinkF = new SequenceFeature("DBLINK", + (dblink == null ? "" : dblink.toString()), null, 1, + genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(dblinkF); + // add KEYWORDS + SequenceFeature keywordsF = new SequenceFeature("KEYWORDS", keywords, + null, 1, genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(keywordsF); + // add SOURCE + SequenceFeature sourceF = new SequenceFeature("SOURCE", + (source == null ? "" : source.toString()), null, 1, + genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(sourceF); + // add BASE COUNT + SequenceFeature baseCountF = new SequenceFeature("BASE COUNT", + (baseCount == null ? "" : baseCount.toString()), null, 1, + genBankSequence.getLength(), DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(baseCountF); + + // add literature and database cross references in the file + for (GenBankReference gbRef : references) + { + // They are non-positional features + SequenceFeature refFeature = new SequenceFeature("REFERENCE", + gbRef.toString(), null, gbRef.getBegin(), gbRef.getEnd(), + DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(refFeature); + } + // add COMMENTS + if (comments.size() > 0) + { + StringBuffer sb = new StringBuffer(); + for (String comment : comments) + { + sb.append(comment).append(newline); + } + SequenceFeature commentF = new SequenceFeature("COMMENT", + sb.toString(), null, 1, genBankSequence.getLength(), + DBRefSource.GENBANK); + genBankSequence.addSequenceFeature(commentF); + } + // Mapping FEATURES + for (GenBankFeature feature : features) + { + if (feature.getType() != null) + { + SequenceFeature sf = new SequenceFeature(); + sf.setType(feature.getType()); + sf.setDescription(feature.getType()); + + sf.setBegin(feature.getLocation() == null ? 0 : feature + .getLocation().getMinor()); + sf.setEnd(feature.getLocation() == null ? 0 : feature.getLocation() + .getMajor()); + Enumeration names = feature.getQualifiersNames(); + while (names.hasMoreElements()) + { + String qName = names.nextElement(); + String qValue = feature.getQualifier(qName); + sf.setValue(qName, qValue); + } + genBankSequence.addSequenceFeature(sf); + } + } + SequenceI[] parsedSeqs = new SequenceI[1]; + parsedSeqs[0] = genBankSequence; + this.setSeqs(parsedSeqs); + } + + private GenBankVersion parseVersion(String line) + { + // VERSION U00096.2 GI:48994873 + if (line.trim().equalsIgnoreCase("VERSION")) + { + return null; + } + else + { + GenBankVersion ver = new GenBankVersion(); + String v = line.substring(11, line.indexOf(" ", 12)).trim(); + ver.setVersion(v); + int posGI = line.indexOf("GI:", 11 + v.length()); + if (posGI > -1) + { + ver.setGI(line.substring(posGI)); + } + return ver; + } + } + + private GenBankLocus parseLocus(String line) + { + GenBankLocus loc = new GenBankLocus(); + Matcher mat = patLocus.matcher(line); + if (mat.find()) + { + String name = mat.group(1); + String len = mat.group(2); + String strand = mat.group(3); + String mtype = mat.group(4); + String linear = mat.group(5); + String division = mat.group(6); + String date = mat.group(7); + + loc.setName(name == null ? "" : name.trim()); + loc.setSequenceLength(len == null ? 0 : Integer.parseInt(len)); + loc.setStrand(strand == null ? "" : strand); + loc.setMoleculeType(mtype == null ? "" : mtype); + loc.setLinearSequence("linear".equals(linear)); + loc.setDivision(division == null ? "" : division); + loc.setModificationDate(date == null ? "" : date); + } + return loc; + } + + private GenBankSource parseSource(List lines) + { + StringBuffer sb = new StringBuffer(); + for (String line : lines) + { + sb.append(line).append(newline); + } + // Source section + GenBankSource sou = new GenBankSource(); + String aux = sb.toString().substring(11); + int fim1 = aux.indexOf("\n"); + if (fim1 > -1) + { + sou.setSource(aux.substring(0, fim1)); + int ini2 = aux.indexOf("ORGANISM"); + if (ini2 > -1) + { + fim1 = aux.indexOf("\n", ini2 + 10); + if (fim1 > -1) + { + sou.setOrganism(aux.substring(ini2 + 10, fim1)); + sou.setTaxonomic(aux.substring(fim1) + .replaceAll(" ", "").replaceAll("\\s+", "")); + } + else + { + sou.setOrganism(aux); + } + } + } + else + { + sou.setSource(aux); + } + return sou; + } + + /** + * Possible situations: + * + * 467 Points to a single base in the presented sequence 340..565 Points to a + * continuous range of bases bounded by and including the starting and ending + * bases <345..500 Indicates that the exact lower boundary point of a + * feature is unknown. The location begins at some base previous to the first + * base specified (which need not be contained in the presented sequence) and + * continues to and includes the ending base <1..888 The feature starts + * before the first sequenced base and continues to and includes base 888 + * 1..>888 The feature starts at the first sequenced base and continues + * beyond base 888 102.110 Indicates that the exact location is unknown but + * that it is one of the bases between bases 102 and 110, inclusive 123^124 + * Points to a site between bases 123 and 124 join(12..78,134..202) Regions 12 + * to 78 and 134 to 202 should be joined to form one contiguous sequence + * complement(34..126) Start at the base complementary to 126 and finish at + * the base complementary to base 34 (the feature is on the strand + * complementary to the presented strand) + * complement(join(2691..4571,4918..5163)) Joins regions 2691 to 4571 and 4918 + * to 5163, then complements the joined segments (the feature is on the strand + * complementary to the presented strand) + * join(complement(4918..5163),complement(2691..4571)) Complements regions + * 4918 to 5163 and 2691 to 4571, then joins the complemented segments (the + * feature is on the strand complementary to the presented strand) + * J00194.1:100..202 Points to bases 100 to 202, inclusive, in the entry (in + * this database) with primary accession number 'J00194' + * join(1..100,J00194.1:100..202) Joins region 1..100 of the existing entry + * with the region 100..202 of remote entry J00194 + * + * @param fea + * @param localiza + */ + private GenBankLocation parserFeatureLocation(GenBankFeature fea, + String localiza) + { + // remove os espaços, quebra de linhas etc + String buf = localiza.replaceAll("\\s", ""); + + // checks if there is a comma present between ranges + // complement(100..110),complement(90..100) + char[] buf2 = buf.toCharArray(); + int abertos = 0; + java.util.List lista = new java.util.ArrayList(); + int pinicial = 0; + for (int i = 0; i < buf2.length; i++) + { + if (buf2[i] == '(') + { + abertos++; + } + else if (buf2[i] == ')') + { + abertos--; + } + else if (buf2[i] == ',' && abertos == 0) + { + lista.add(buf.substring(pinicial, i)); + pinicial = i + 1; + } + } + if (lista.size() > 0) + { + lista.add(buf.substring(pinicial)); + GenBankLocations um = new GenBankLocations(); + um.setOperator(GenBankLocations.NONE); + for (String s : lista) + { + um.getUnits().add(parserFeatureLocation(fea, s)); + } + fea.setLocation(um); + return um; + } + + // trata as funcoes: complement(location,location...), + // join(location,location...), order(location,location...) + if (buf.contains("(")) + { + GenBankLocations um = new GenBankLocations(); + int ini = buf.indexOf("("); + int fim = buf.lastIndexOf(")"); + String token = buf.substring(0, ini); + if ("complement".equalsIgnoreCase(token)) + { + String inter = buf.substring(ini + 1, fim); + GenBankLocation interno = parserFeatureLocation(fea, inter); + interno.setComplement(true); + um.setOperator(GenBankLocations.COMPLEMENT); + um.getUnits().add(interno); + fea.setLocation(um); + } + else if ("join".equalsIgnoreCase(token)) + { + String inter = buf.substring(ini + 1, fim); + GenBankLocation interno = parserFeatureLocation(fea, inter); + um.setOperator(GenBankLocations.JOIN); + um.getUnits().add(interno); + fea.setLocation(um); + } + else if ("order".equalsIgnoreCase(token)) + { + String inter = buf.substring(ini + 1, fim); + GenBankLocation interno = parserFeatureLocation(fea, inter); + um.setOperator(GenBankLocations.ORDER); + um.getUnits().add(interno); + fea.setLocation(um); + } + else + { + log.log(Level.WARNING, + "Token desconhecido em location/features - {0}", token); + String inter = buf.substring(ini + 1, fim); + fea.setLocation(parserFeatureLocation(fea, inter)); + } + return fea.getLocation(); + } + else + { + // trata quando tiver uma lista de location + if (buf.contains(",")) + { + String[] partes = buf.split(","); + GenBankLocations um = new GenBankLocations(); + for (String p : partes) + { + um.getUnits().add(parserFeatureLocation(fea, p)); + } + fea.setLocation(um); + return um; + } + else + { + // trata quando tiver range + if (buf.contains("..")) + { + String[] partes = buf.split("\\.\\."); + GenBankLocationRange range = new GenBankLocationRange(); + if (buf.contains(":")) + { + for (int i = 0; i < partes.length; i++) + { + int pos = partes[i].indexOf(":"); + if (pos > 0) + { + String entry = partes[i].substring(0, pos); + partes[i] = partes[i].substring(pos + 1); + range.setEntry(entry); + } } + } + GenBankLocationPoint gp0 = (GenBankLocationPoint) parserFeatureLocation( + fea, partes[0]); + range.setStart(gp0); + GenBankLocationPoint gp1 = (GenBankLocationPoint) parserFeatureLocation( + fea, partes[1]); + range.setEnd(gp1); + fea.setLocation(range); + return range; } - if (lista.size() > 0) { - lista.add(buf.substring(pinicial)); - GenBankLocations um = new GenBankLocations(); - um.setOperator(GenBankLocations.NONE); - for (String s : lista) { - um.getUnits().add(parserFeatureLocation(fea, s)); + else + { + // trata um ponto + // possibilidades consideradas: + // 467 + // 102.110 + // 123^124 + // <345 + // >400 + // 345> + // 400< + // ou uma combinacao dessas + GenBankLocationPoint gp = new GenBankLocationPoint(); + if (buf.contains(":")) + { + int pos = buf.indexOf(":"); + if (pos > 0) + { + String entry = buf.substring(0, pos); + buf = buf.substring(pos + 1); + gp.setEntry(entry); } - fea.setLocation(um); - return um; - } - - // trata as funcoes: complement(location,location...), - // join(location,location...), order(location,location...) - if (buf.contains("(")) { - GenBankLocations um = new GenBankLocations(); - int ini = buf.indexOf("("); - int fim = buf.lastIndexOf(")"); - String token = buf.substring(0, ini); - if ("complement".equalsIgnoreCase(token)) { - String inter = buf.substring(ini + 1, fim); - GenBankLocation interno = parserFeatureLocation(fea, inter); - interno.setComplement(true); - um.setOperator(GenBankLocations.COMPLEMENT); - um.getUnits().add(interno); - fea.setLocation(um); - } else if ("join".equalsIgnoreCase(token)) { - String inter = buf.substring(ini + 1, fim); - GenBankLocation interno = parserFeatureLocation(fea, inter); - um.setOperator(GenBankLocations.JOIN); - um.getUnits().add(interno); - fea.setLocation(um); - } else if ("order".equalsIgnoreCase(token)) { - String inter = buf.substring(ini + 1, fim); - GenBankLocation interno = parserFeatureLocation(fea, inter); - um.setOperator(GenBankLocations.ORDER); - um.getUnits().add(interno); - fea.setLocation(um); - } else { - log.log(Level.WARNING, "Token desconhecido em location/features - {0}", token); - String inter = buf.substring(ini + 1, fim); - fea.setLocation(parserFeatureLocation(fea, inter)); + } + int pos = 0; + // verifica os simb < e > antes do primeiro numero + if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') + { + gp.setPrefix(buf.charAt(pos)); + pos++; + } + // pega o primeiro numero + int ini = pos; + while (pos < buf.length() && buf.charAt(pos) >= '0' + && buf.charAt(pos) <= '9') + { + pos++; + } + if (buf.subSequence(ini, pos).length() < 1) + { + System.out.println(localiza); + } + int num = Integer.parseInt(buf.substring(ini, pos)); + int num2 = num; + // o primeiro numero pode ser o unico numero + if (pos < buf.length()) + { + // verifica se tem os sinais < e > apos o primeiro numero + if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') + { + if (buf.contains(".") || buf.contains("^")) + { + gp.setPrefix(buf.charAt(pos)); + } + else + { + gp.setSufix(buf.charAt(pos)); + } + pos++; } - return fea.getLocation(); - } else { - // trata quando tiver uma lista de location - if (buf.contains(",")) { - String[] partes = buf.split(","); - GenBankLocations um = new GenBankLocations(); - for (String p : partes) { - um.getUnits().add( - parserFeatureLocation(fea, p)); - } - fea.setLocation(um); - return um; - } else { - // trata quando tiver range - if (buf.contains("..")) { - String[] partes = buf.split("\\.\\."); - GenBankLocationRange range = new GenBankLocationRange(); - if (buf.contains(":")) { - for (int i = 0; i < partes.length; i++) { - int pos = partes[i].indexOf(":"); - if (pos > 0) { - String entry = partes[i].substring(0, pos); - partes[i] = partes[i].substring(pos + 1); - range.setEntry(entry); - } - } - } - GenBankLocationPoint gp0 = (GenBankLocationPoint) parserFeatureLocation(fea, partes[0]); - range.setStart(gp0); - GenBankLocationPoint gp1 = (GenBankLocationPoint) parserFeatureLocation(fea, partes[1]); - range.setEnd(gp1); - fea.setLocation(range); - return range; - } else { - // trata um ponto - // possibilidades consideradas: - // 467 - // 102.110 - // 123^124 - // <345 - // >400 - // 345> - // 400< - // ou uma combinacao dessas - GenBankLocationPoint gp = new GenBankLocationPoint(); - if (buf.contains(":")) { - int pos = buf.indexOf(":"); - if (pos > 0) { - String entry = buf.substring(0, pos); - buf = buf.substring(pos + 1); - gp.setEntry(entry); - } - } - int pos = 0; - // verifica os simb < e > antes do primeiro numero - if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') { - gp.setPrefix(buf.charAt(pos)); - pos++; - } - // pega o primeiro numero - int ini = pos; - while (pos < buf.length() && buf.charAt(pos) >= '0' - && buf.charAt(pos) <= '9') { - pos++; - } - if (buf.subSequence(ini, pos).length() < 1) { - System.out.println(localiza); - } - int num = Integer.parseInt(buf.substring(ini, pos)); - int num2 = num; - // o primeiro numero pode ser o unico numero - if (pos < buf.length()) { - // verifica se tem os sinais < e > apos o primeiro numero - if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') { - if (buf.contains(".") || buf.contains("^")) { - gp.setPrefix(buf.charAt(pos)); - } else { - gp.setSufix(buf.charAt(pos)); - } - pos++; - } - - // verifica a separacao dos numeros . ou ^ - if (pos < buf.length() - && (buf.charAt(pos) == '.' || buf.charAt(pos) == '^')) { - // separação localizada, possibilidade de mais numero - gp.setSymbol(buf.charAt(pos)); - pos++; - - // verifica os simb < e > antes do segundo numero - if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') { - gp.setSufix(buf.charAt(pos)); - pos++; - } - - // pega o segundo numero - ini = pos; - while (pos < buf.length() && buf.charAt(pos) >= '0' - && buf.charAt(pos) <= '9') { - pos++; - } - num2 = Integer.parseInt(buf.substring(ini, pos)); - - // verifica os simb < e > após o segundo numero - if (pos < buf.length() && (buf.charAt(pos) == '<' || buf.charAt(pos) == '>')) { - gp.setSufix(buf.charAt(pos)); - pos++; - } - } - } - gp.setMin(num); - gp.setMax(num2); - fea.setLocation(gp); - return gp; - } + + // verifica a separacao dos numeros . ou ^ + if (pos < buf.length() + && (buf.charAt(pos) == '.' || buf.charAt(pos) == '^')) + { + // separação localizada, possibilidade de mais numero + gp.setSymbol(buf.charAt(pos)); + pos++; + + // verifica os simb < e > antes do segundo numero + if (buf.charAt(pos) == '<' || buf.charAt(pos) == '>') + { + gp.setSufix(buf.charAt(pos)); + pos++; + } + + // pega o segundo numero + ini = pos; + while (pos < buf.length() && buf.charAt(pos) >= '0' + && buf.charAt(pos) <= '9') + { + pos++; + } + num2 = Integer.parseInt(buf.substring(ini, pos)); + + // verifica os simb < e > após o segundo numero + if (pos < buf.length() + && (buf.charAt(pos) == '<' || buf.charAt(pos) == '>')) + { + gp.setSufix(buf.charAt(pos)); + pos++; + } } + } + gp.setMin(num); + gp.setMax(num2); + fea.setLocation(gp); + return gp; } + } + } + } + + private int[] parseReferenceDescriptor(String descriptor) + { + // 1 (bases 1 to 1609) + int[] resultado = new int[3]; + descriptor = descriptor.replace("(bases", ",").replace("to", ",") + .replace(")", ""); + String[] args = descriptor.split(","); + resultado[0] = Integer.parseInt(args[0].trim()); + resultado[1] = Integer.parseInt(args[1].trim()); + resultado[2] = Integer.parseInt(args[2].trim()); + return resultado; + } + + private String processReferenceLine(String line, String component) + { + int init = line.indexOf(component); + if (init != -1) + { + line = line.replace(component, ""); + } + return line; + } + + private String processHeaderLine(String line, String header) + { + int init = line.indexOf(header); + if (init != -1) + { + line = line.replace(header, ""); } - - private int[] parseReferenceDescriptor(String descriptor){ - // 1 (bases 1 to 1609) - int[] resultado = new int[3]; - descriptor = descriptor.replace("(bases", ",").replace("to", ",").replace(")", ""); - String[] args = descriptor.split(","); - resultado[0] = Integer.parseInt(args[0].trim()); - resultado[1] = Integer.parseInt(args[1].trim()); - resultado[2] = Integer.parseInt(args[2].trim()); - return resultado; + return line; + } + + private GenBankSequence processSequenceLine(String line) + { + GenBankSequence gbs = new GenBankSequence(); + line = ltrim(line); + String[] args = line.split(" "); + gbs.setId(Integer.parseInt(args[0])); + int len = args.length - 1; + Vector seqs = new Vector(); + for (int i = 0; i < len; i++) + seqs.add(args[i + 1]); + gbs.setSequences(seqs); + return gbs; + } + + private String processCommentLine(String line) + { + int init = line.indexOf("COMMENT"); + if (init != -1) + { + line = line.replace("COMMENT", ""); + } + return line; + } + + public String rtrim(String s) + { + int i = s.length() - 1; + while (i >= 0 && Character.isWhitespace(s.charAt(i))) + { + i--; } - private String processReferenceLine(String line, String component){ - int init = line.indexOf(component); - if (init!=-1){ - line = line.replace(component,""); - } - return line; - } - private String processHeaderLine(String line, String header){ - int init = line.indexOf(header); - if (init!=-1){ - line = line.replace(header,""); - } - return line; - } - - private GenBankSequence processSequenceLine(String line) { - GenBankSequence gbs = new GenBankSequence(); - line = ltrim(line); - String[] args = line.split(" "); - gbs.setId(Integer.parseInt(args[0])); - int len = args.length-1; - Vector seqs = new Vector(); - for (int i=0;i= 0 && Character.isWhitespace(s.charAt(i))) { - i--; - } - return s.substring(0,i+1); + return s.substring(0, i + 1); + } + + public String ltrim(String s) + { + int i = 0; + while (i < s.length() && Character.isWhitespace(s.charAt(i))) + { + i++; } + return s.substring(i); + } - public String ltrim(String s) { - int i = 0; - while (i < s.length() && Character.isWhitespace(s.charAt(i))) { - i++; - } - return s.substring(i); - } - - public String print(){ - StringBuffer out = new StringBuffer(); - for (SequenceI seq: this.getSeqs()){ - SequenceFeature[] seqFeatures = seq.getSequenceFeatures(); - boolean featureLinePrinted = false; - for(SequenceFeature sf:seqFeatures){ - if(sf.getType().equals("LOCUS")){ - out.append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("DEFINITION")){ - out.append("DEFINITION ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("VERSION")){ - out.append("VERSION ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("ACCESSION")){ - out.append("ACCESSION ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("DBLINK")){ - out.append("DBLINK ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("KEYWORDS")){ - out.append("KEYWORDS ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("SOURCE")){ - out.append("SOURCE ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("REFERENCE")){ - out.append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("COMMENT")){ - out.append("COMMENT ").append(sf.getDescription()).append(newline); - }else if (sf.getType().equals("BASE COUNT")){ - out.append("BASE COUNT ").append(sf.getDescription()).append(newline); - }else{ - if (!featureLinePrinted){ - out.append("FEATURES Location/Qualifiers").append(newline); - featureLinePrinted = true; - } - out.append(" ").append(sf.getType()).append(" ").append(sf.getBegin()).append("..").append(sf.getEnd()).append(newline); - Hashtable qualifiers = sf.otherDetails; - if (qualifiers!=null){ - Enumeration keys = qualifiers.keys(); - while (keys.hasMoreElements()){ - String key = keys.nextElement(); - String value = qualifiers.get(key); - if (value!=null){ - out.append(" /").append(key).append("=").append(value).append(newline); - } - } - } - } - } - out.append("ORIGIN").append(newline); - //We have to divide sequence in groups of 6x10 chars - String sequenceString = seq.getSequenceAsString(); - int howManyGroups = (int) Math.floor(sequenceString.length()/60); - for (int i=0;i<=howManyGroups;i++){ - String sequenceSegment = sequenceString.substring(i*60,Math.min((i+1)*60, sequenceString.length())); - if ((!"".equals(sequenceSegment) && (sequenceSegment!=null) && (sequenceSegment.length()>0))){ - out.append(" ").append(60*i+1).append(" "); - } - int segmentLength = sequenceSegment.length(); - if (segmentLength>=10){ - out.append(sequenceSegment.substring(0,10)).append(" "); - if (segmentLength>=20){ - out.append(sequenceSegment.substring(10,20)).append(" "); - if (segmentLength>=30){ - out.append(sequenceSegment.substring(20,30)).append(" "); - if (segmentLength>=40){ - out.append(sequenceSegment.substring(30,40)).append(" "); - if (segmentLength>=50){ - out.append(sequenceSegment.substring(40,50)).append(" "); - if (segmentLength<=60){ - out.append(sequenceSegment.substring(50,sequenceSegment.length())); - } - }else{ - out.append(sequenceSegment.substring(40,sequenceSegment.length())); - } - }else{ - out.append(sequenceSegment.substring(30,sequenceSegment.length())); - } - }else{ - out.append(sequenceSegment.substring(20,sequenceSegment.length())); - } - }else{ - out.append(sequenceSegment.substring(10,sequenceSegment.length())); - } - } else if ((!"".equals(sequenceSegment) && (sequenceSegment!=null) && (sequenceSegment.length()>0))){ - out.append(sequenceSegment); - } - out.append(newline); - } - out.append("//"); - } - return out.toString(); + public String print() + { + StringBuffer out = new StringBuffer(); + for (SequenceI seq : this.getSeqs()) + { + SequenceFeature[] seqFeatures = seq.getSequenceFeatures(); + boolean featureLinePrinted = false; + for (SequenceFeature sf : seqFeatures) + { + if (sf.getType().equals("LOCUS")) + { + out.append(sf.getDescription()).append(newline); + } + else if (sf.getType().equals("DEFINITION")) + { + out.append("DEFINITION ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("VERSION")) + { + out.append("VERSION ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("ACCESSION")) + { + out.append("ACCESSION ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("DBLINK")) + { + out.append("DBLINK ").append(sf.getDescription()).append(newline); + } + else if (sf.getType().equals("KEYWORDS")) + { + out.append("KEYWORDS ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("SOURCE")) + { + out.append("SOURCE ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("REFERENCE")) + { + out.append(sf.getDescription()).append(newline); + } + else if (sf.getType().equals("COMMENT")) + { + out.append("COMMENT ").append(sf.getDescription()) + .append(newline); + } + else if (sf.getType().equals("BASE COUNT")) + { + out.append("BASE COUNT ").append(sf.getDescription()) + .append(newline); + } + else + { + if (!featureLinePrinted) + { + out.append("FEATURES Location/Qualifiers").append( + newline); + featureLinePrinted = true; + } + out.append(" ").append(sf.getType()).append(" ") + .append(sf.getBegin()).append("..").append(sf.getEnd()) + .append(newline); + Hashtable qualifiers = sf.otherDetails; + if (qualifiers != null) + { + Enumeration keys = qualifiers.keys(); + while (keys.hasMoreElements()) + { + String key = keys.nextElement(); + String value = qualifiers.get(key); + if (value != null) + { + out.append(" /").append(key) + .append("=").append(value).append(newline); + } + } + } + } + } + out.append("ORIGIN").append(newline); + // We have to divide sequence in groups of 6x10 chars + String sequenceString = seq.getSequenceAsString(); + int howManyGroups = (int) Math.floor(sequenceString.length() / 60); + for (int i = 0; i <= howManyGroups; i++) + { + String sequenceSegment = sequenceString.substring(i * 60, + Math.min((i + 1) * 60, sequenceString.length())); + if ((!"".equals(sequenceSegment) && (sequenceSegment != null) && (sequenceSegment + .length() > 0))) + { + out.append(" ").append(60 * i + 1).append(" "); + } + int segmentLength = sequenceSegment.length(); + if (segmentLength >= 10) + { + out.append(sequenceSegment.substring(0, 10)).append(" "); + if (segmentLength >= 20) + { + out.append(sequenceSegment.substring(10, 20)).append(" "); + if (segmentLength >= 30) + { + out.append(sequenceSegment.substring(20, 30)).append(" "); + if (segmentLength >= 40) + { + out.append(sequenceSegment.substring(30, 40)).append(" "); + if (segmentLength >= 50) + { + out.append(sequenceSegment.substring(40, 50)).append(" "); + if (segmentLength <= 60) + { + out.append(sequenceSegment.substring(50, + sequenceSegment.length())); + } + } + else + { + out.append(sequenceSegment.substring(40, + sequenceSegment.length())); + } + } + else + { + out.append(sequenceSegment.substring(30, + sequenceSegment.length())); + } + } + else + { + out.append(sequenceSegment.substring(20, + sequenceSegment.length())); + } + } + else + { + out.append(sequenceSegment.substring(10, + sequenceSegment.length())); + } + } + else if ((!"".equals(sequenceSegment) && (sequenceSegment != null) && (sequenceSegment + .length() > 0))) + { + out.append(sequenceSegment); + } + out.append(newline); + } + out.append("//"); } + return out.toString(); + } } diff --git a/src/jalview/io/xdb/genbank/GenBankFeature.java b/src/jalview/io/xdb/genbank/GenBankFeature.java index 0de2e65..ca169af 100644 --- a/src/jalview/io/xdb/genbank/GenBankFeature.java +++ b/src/jalview/io/xdb/genbank/GenBankFeature.java @@ -3,66 +3,93 @@ package jalview.io.xdb.genbank; import java.util.Enumeration; import java.util.Hashtable; -public class GenBankFeature { - public static final String MISC_TYPE = "misc_feature"; - public static final String SOURCE = "source"; - public static final String CDS = "CDS"; - public static final String GENE = "gene"; - public static final String EXON = "exon"; - public static final String INTRON = "intron"; - public static final String PRIM_TRANSCRIPT = "prim_transcript"; - public static final String mRNA = "mRNA"; - public static final String MOBILE_ELEMENT = "mobile_element"; - public static final String VARIATION = "variation"; - - private String type; - private Hashtable qualifiers = new Hashtable(); - private GenBankLocation location = null; - - public GenBankFeature() { - super(); - } - - public GenBankFeature(String type) { - super(); - this.type = type; - } - - public void addQualifier(String key, String value){ - this.qualifiers.put(key, value); - } - public void updateQualifier(String key, String newValue){ - this.qualifiers.remove(key); - this.qualifiers.put(key, newValue); - } - - public String getQualifier(String key){ - return this.qualifiers.get(key); - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - public Enumeration getQualifiersNames(){ - return this.qualifiers.keys(); - } - public int getQualifiersSize(){ - return this.qualifiers.size(); - } - - public Hashtable getFields() { - return qualifiers; - } - - public GenBankLocation getLocation() { - return location; - } - - public void setLocation(GenBankLocation location) { - this.location = location; - } +public class GenBankFeature +{ + public static final String MISC_TYPE = "misc_feature"; + + public static final String SOURCE = "source"; + + public static final String CDS = "CDS"; + + public static final String GENE = "gene"; + + public static final String EXON = "exon"; + + public static final String INTRON = "intron"; + + public static final String PRIM_TRANSCRIPT = "prim_transcript"; + + public static final String mRNA = "mRNA"; + + public static final String MOBILE_ELEMENT = "mobile_element"; + + public static final String VARIATION = "variation"; + + private String type; + + private Hashtable qualifiers = new Hashtable(); + + private GenBankLocation location = null; + + public GenBankFeature() + { + super(); + } + + public GenBankFeature(String type) + { + super(); + this.type = type; + } + + public void addQualifier(String key, String value) + { + this.qualifiers.put(key, value); + } + + public void updateQualifier(String key, String newValue) + { + this.qualifiers.remove(key); + this.qualifiers.put(key, newValue); + } + + public String getQualifier(String key) + { + return this.qualifiers.get(key); + } + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public Enumeration getQualifiersNames() + { + return this.qualifiers.keys(); + } + + public int getQualifiersSize() + { + return this.qualifiers.size(); + } + + public Hashtable getFields() + { + return qualifiers; + } + + public GenBankLocation getLocation() + { + return location; + } + + public void setLocation(GenBankLocation location) + { + this.location = location; + } } diff --git a/src/jalview/io/xdb/genbank/GenBankLocation.java b/src/jalview/io/xdb/genbank/GenBankLocation.java index 5d0db6c..da82171 100644 --- a/src/jalview/io/xdb/genbank/GenBankLocation.java +++ b/src/jalview/io/xdb/genbank/GenBankLocation.java @@ -113,38 +113,43 @@ package jalview.io.xdb.genbank; * * */ -public abstract class GenBankLocation { - // the location is complement strand? - private boolean complement = false; +public abstract class GenBankLocation +{ + // the location is complement strand? + private boolean complement = false; - public GenBankLocation() { - } + public GenBankLocation() + { + } - /** - * The minor location in genome sequence - * - * @return position - */ - public abstract int getMinor(); + /** + * The minor location in genome sequence + * + * @return position + */ + public abstract int getMinor(); - /** - * The major location in genome sequence - * - * @return position - */ - public abstract int getMajor(); + /** + * The major location in genome sequence + * + * @return position + */ + public abstract int getMajor(); - /** - * @return the complement - */ - public boolean isComplement() { - return complement; - } + /** + * @return the complement + */ + public boolean isComplement() + { + return complement; + } - /** - * @param complement the complement to set - */ - public void setComplement(boolean complement) { - this.complement = complement; - } + /** + * @param complement + * the complement to set + */ + public void setComplement(boolean complement) + { + this.complement = complement; + } } \ No newline at end of file diff --git a/src/jalview/io/xdb/genbank/GenBankLocationPoint.java b/src/jalview/io/xdb/genbank/GenBankLocationPoint.java index 6d3a475..f15528a 100644 --- a/src/jalview/io/xdb/genbank/GenBankLocationPoint.java +++ b/src/jalview/io/xdb/genbank/GenBankLocationPoint.java @@ -3,138 +3,176 @@ package jalview.io.xdb.genbank; /** * */ -public class GenBankLocationPoint extends GenBankLocation { - private String entry; - private char prefix = 0; - private int min = 0; - private char symbol = 0; - private int max = 0; - private char sufix = 0; - - public GenBankLocationPoint() { - } - - public GenBankLocationPoint(int point) { - this.min = point; - this.max = point; - } - - public GenBankLocationPoint(int min, int max) { - this.min = min; - this.max = max; - } - - public int getMinor() { - return this.min; - } - - public int getMajor() { - return this.max; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if( prefix != 0 && prefix != ' ' ) { - sb.append(prefix); - } - if( symbol == '.' || symbol == '^' ) { - sb.append( String.format("%d%c%d",min,symbol,max) ); - } else { - if( min != max ) { - sb.append( String.format("%d.%d",min,max) ); - } else { - sb.append( min ); - } - } - if( sufix != 0 && sufix != ' ' ) { - sb.append(sufix); - } - return sb.toString(); - } - - /** - * @return the prefix - */ - public char getPrefix() { - return prefix; - } - - /** - * @param prefix the prefix to set - */ - public void setPrefix(char prefix) { - this.prefix = prefix; - } - - /** - * @return the min - */ - public int getMin() { - return min; - } - - /** - * @param min the min to set - */ - public void setMin(int min) { - this.min = min; - } - - /** - * @return the symbol - */ - public char getSymbol() { - return symbol; - } - - /** - * @param symbol the symbol to set - */ - public void setSymbol(char symbol) { - this.symbol = symbol; - } - - /** - * @return the max - */ - public int getMax() { - return max; - } - - /** - * @param max the max to set - */ - public void setMax(int max) { - this.max = max; - } - - /** - * @return the sufix - */ - public char getSufix() { - return sufix; - } - - /** - * @param sufix the sufix to set - */ - public void setSufix(char sufix) { - this.sufix = sufix; - } - - /** - * @return the entry - */ - public String getEntry() { - return entry; - } - - /** - * @param entry the entry to set - */ - public void setEntry(String entry) { - this.entry = entry; - } +public class GenBankLocationPoint extends GenBankLocation +{ + private String entry; + + private char prefix = 0; + + private int min = 0; + + private char symbol = 0; + + private int max = 0; + + private char sufix = 0; + + public GenBankLocationPoint() + { + } + + public GenBankLocationPoint(int point) + { + this.min = point; + this.max = point; + } + + public GenBankLocationPoint(int min, int max) + { + this.min = min; + this.max = max; + } + + public int getMinor() + { + return this.min; + } + + public int getMajor() + { + return this.max; + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + if (prefix != 0 && prefix != ' ') + { + sb.append(prefix); + } + if (symbol == '.' || symbol == '^') + { + sb.append(String.format("%d%c%d", min, symbol, max)); + } + else + { + if (min != max) + { + sb.append(String.format("%d.%d", min, max)); + } + else + { + sb.append(min); + } + } + if (sufix != 0 && sufix != ' ') + { + sb.append(sufix); + } + return sb.toString(); + } + + /** + * @return the prefix + */ + public char getPrefix() + { + return prefix; + } + + /** + * @param prefix + * the prefix to set + */ + public void setPrefix(char prefix) + { + this.prefix = prefix; + } + + /** + * @return the min + */ + public int getMin() + { + return min; + } + + /** + * @param min + * the min to set + */ + public void setMin(int min) + { + this.min = min; + } + + /** + * @return the symbol + */ + public char getSymbol() + { + return symbol; + } + + /** + * @param symbol + * the symbol to set + */ + public void setSymbol(char symbol) + { + this.symbol = symbol; + } + + /** + * @return the max + */ + public int getMax() + { + return max; + } + + /** + * @param max + * the max to set + */ + public void setMax(int max) + { + this.max = max; + } + + /** + * @return the sufix + */ + public char getSufix() + { + return sufix; + } + + /** + * @param sufix + * the sufix to set + */ + public void setSufix(char sufix) + { + this.sufix = sufix; + } + + /** + * @return the entry + */ + public String getEntry() + { + return entry; + } + + /** + * @param entry + * the entry to set + */ + public void setEntry(String entry) + { + this.entry = entry; + } } diff --git a/src/jalview/io/xdb/genbank/GenBankLocationRange.java b/src/jalview/io/xdb/genbank/GenBankLocationRange.java index 552d1f9..c8926ae 100644 --- a/src/jalview/io/xdb/genbank/GenBankLocationRange.java +++ b/src/jalview/io/xdb/genbank/GenBankLocationRange.java @@ -3,84 +3,103 @@ package jalview.io.xdb.genbank; /** * */ -public class GenBankLocationRange extends GenBankLocation { - private String entry = null; - private GenBankLocationPoint start = null; - private GenBankLocationPoint end = null; +public class GenBankLocationRange extends GenBankLocation +{ + private String entry = null; - public GenBankLocationRange() { - } + private GenBankLocationPoint start = null; - @Override - public int getMinor() { - return start == null ? 0 : start.getMinor(); - } + private GenBankLocationPoint end = null; - @Override - public int getMajor() { - return end == null ? 0 : end.getMajor(); - } + public GenBankLocationRange() + { + } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); -// if( getDirecao() != '5' ) { -// sb.append("complement("); -// } - if( entry != null ) { - sb.append(entry); - sb.append(":"); - } - if( getStart() != null ) { - sb.append( getStart().toString() ); - } - if( getEnd() != null && getStart() != getEnd() && !start.equals(end) ) { - sb.append(".."); - sb.append( getEnd().toString() ); - } - return sb.toString(); - } + @Override + public int getMinor() + { + return start == null ? 0 : start.getMinor(); + } - /** - * @return the entry - */ - public String getEntry() { - return entry; - } + @Override + public int getMajor() + { + return end == null ? 0 : end.getMajor(); + } - /** - * @param entry the entry to set - */ - public void setEntry(String entry) { - this.entry = entry; + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + // if( getDirecao() != '5' ) { + // sb.append("complement("); + // } + if (entry != null) + { + sb.append(entry); + sb.append(":"); } - - /** - * @return the start - */ - public GenBankLocationPoint getStart() { - return start; + if (getStart() != null) + { + sb.append(getStart().toString()); } - - /** - * @param start the start to set - */ - public void setStart(GenBankLocationPoint start) { - this.start = start; + if (getEnd() != null && getStart() != getEnd() && !start.equals(end)) + { + sb.append(".."); + sb.append(getEnd().toString()); } + return sb.toString(); + } - /** - * @return the end - */ - public GenBankLocationPoint getEnd() { - return end; - } + /** + * @return the entry + */ + public String getEntry() + { + return entry; + } - /** - * @param end the end to set - */ - public void setEnd(GenBankLocationPoint end) { - this.end = end; - } + /** + * @param entry + * the entry to set + */ + public void setEntry(String entry) + { + this.entry = entry; + } + + /** + * @return the start + */ + public GenBankLocationPoint getStart() + { + return start; + } + + /** + * @param start + * the start to set + */ + public void setStart(GenBankLocationPoint start) + { + this.start = start; + } + + /** + * @return the end + */ + public GenBankLocationPoint getEnd() + { + return end; + } + + /** + * @param end + * the end to set + */ + public void setEnd(GenBankLocationPoint end) + { + this.end = end; + } } diff --git a/src/jalview/io/xdb/genbank/GenBankLocations.java b/src/jalview/io/xdb/genbank/GenBankLocations.java index ae3e47b..7281703 100644 --- a/src/jalview/io/xdb/genbank/GenBankLocations.java +++ b/src/jalview/io/xdb/genbank/GenBankLocations.java @@ -1,98 +1,127 @@ package jalview.io.xdb.genbank; /** - * + * * @author Dieval Guizelini */ -public class GenBankLocations extends GenBankLocation { - public static final int NONE = 1; // default - public static final int COMPLEMENT = 2; - public static final int JOIN = 3; - public static final int ORDER = 4; // conj com ordem desconhecida - private int operator = NONE; - private java.util.List units; - - public GenBankLocations() { - units = new java.util.ArrayList(); - } +public class GenBankLocations extends GenBankLocation +{ + public static final int NONE = 1; // default - @Override - public void setComplement(boolean complement){ - super.setComplement(complement); - this.operator = COMPLEMENT; - if (units != null) { - for (GenBankLocation o : units) { - o.setComplement(complement); - } - } - } + public static final int COMPLEMENT = 2; - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (getOperator() == COMPLEMENT) { - sb.append("complement("); - } else if (getOperator() == JOIN) { - sb.append("join("); - } else if (getOperator() == ORDER) { - sb.append("order("); - } - if (units.size() > 0) { - sb.append(units.get(0).toString()); - for (int i = 1; i < units.size(); i++) { - sb.append(","); - sb.append(units.get(i).toString()); - } - } - if (getOperator() != NONE) { - sb.append(")"); - } - return sb.toString(); - } + public static final int JOIN = 3; - /** - * @return the units - */ - public java.util.List getUnits() { - return units; - } + public static final int ORDER = 4; // conj com ordem desconhecida - /** - * @param units the units to set - */ - public void setUnits(java.util.List units) { - this.units = units; - } + private int operator = NONE; + + private java.util.List units; - @Override - public int getMinor() { - if( units.size() > 0 ) { - return units.get(0).getMinor(); - } - return 0; + public GenBankLocations() + { + units = new java.util.ArrayList(); + } + + @Override + public void setComplement(boolean complement) + { + super.setComplement(complement); + this.operator = COMPLEMENT; + if (units != null) + { + for (GenBankLocation o : units) + { + o.setComplement(complement); + } } + } - @Override - public int getMajor() { - int ind = units.size(); - if( ind > 0 ) { - return units.get(ind-1).getMajor(); - } - return 0; + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + if (getOperator() == COMPLEMENT) + { + sb.append("complement("); + } + else if (getOperator() == JOIN) + { + sb.append("join("); } + else if (getOperator() == ORDER) + { + sb.append("order("); + } + if (units.size() > 0) + { + sb.append(units.get(0).toString()); + for (int i = 1; i < units.size(); i++) + { + sb.append(","); + sb.append(units.get(i).toString()); + } + } + if (getOperator() != NONE) + { + sb.append(")"); + } + return sb.toString(); + } + + /** + * @return the units + */ + public java.util.List getUnits() + { + return units; + } - /** - * @return the operator - */ - public int getOperator() { - return operator; + /** + * @param units + * the units to set + */ + public void setUnits(java.util.List units) + { + this.units = units; + } + + @Override + public int getMinor() + { + if (units.size() > 0) + { + return units.get(0).getMinor(); } + return 0; + } - /** - * @param operator the operator to set - */ - public void setOperator(int operator) { - this.operator = operator; + @Override + public int getMajor() + { + int ind = units.size(); + if (ind > 0) + { + return units.get(ind - 1).getMajor(); } + return 0; + } + + /** + * @return the operator + */ + public int getOperator() + { + return operator; + } + + /** + * @param operator + * the operator to set + */ + public void setOperator(int operator) + { + this.operator = operator; + } } diff --git a/src/jalview/io/xdb/genbank/GenBankLocus.java b/src/jalview/io/xdb/genbank/GenBankLocus.java index cf6289e..8a44222 100644 --- a/src/jalview/io/xdb/genbank/GenBankLocus.java +++ b/src/jalview/io/xdb/genbank/GenBankLocus.java @@ -1,138 +1,176 @@ package jalview.io.xdb.genbank; /** - * A short mnemonic name for the entry, chosen to suggest the - * sequence's definition. Mandatory keyword/exactly one record. - * - *

The LOCUS field contains a number of different data elements, including locus name, - * sequence length, molecule type, GenBank division, and modification date. Each element - * is described below.

- * + * A short mnemonic name for the entry, chosen to suggest the sequence's + * definition. Mandatory keyword/exactly one record. + * + *

+ * The LOCUS field contains a number of different data elements, including locus + * name, sequence length, molecule type, GenBank division, and modification + * date. Each element is described below. + *

+ * */ -public class GenBankLocus { - private String name; - private int sequenceLength; - private String strand; - private String moleculeType; - private boolean linearSequence; - private String division; - private String modificationDate; - - public GenBankLocus() { - } - - public GenBankLocus(String name, int sequenceLength) { - this.name = name; - this.sequenceLength = sequenceLength; - } - - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @return the sequenceLength - */ - public int getSequenceLength() { - return sequenceLength; - } - - /** - * @param sequenceLength the sequenceLength to set - */ - public void setSequenceLength(int sequenceLength) { - this.sequenceLength = sequenceLength; - } - - /** - * @return the strand - */ - public String getStrand() { - return strand; - } - - /** - * @param strand the strand to set - */ - public void setStrand(String strand) { - this.strand = strand; - } - - /** - * @return the moleculeType - */ - public String getMoleculeType() { - return moleculeType; - } - - /** - * @param moleculeType the moleculeType to set - */ - public void setMoleculeType(String moleculeType) { - this.moleculeType = moleculeType; - } - - /** - * @return the linearSequence - */ - public boolean isLinearSequence() { - return linearSequence; - } - - /** - * @param linearSequence the linearSequence to set - */ - public void setLinearSequence(boolean linearSequence) { - this.linearSequence = linearSequence; - } - - /** - * @return the division - */ - public String getDivision() { - return division; - } - - /** - * @param division the division to set - */ - public void setDivision(String division) { - this.division = division; - } - - /** - * @return the modificationDate - */ - public String getModificationDate() { - return modificationDate; - } - - /** - * @param modificationDate the modificationDate to set - */ - public void setModificationDate(String modificationDate) { - this.modificationDate = modificationDate; - } - - @Override - public String toString() { - - return String.format("LOCUS %-16s %11d bp %3s %6s %-8s %3s %s", - this.name, this.sequenceLength, this.strand, - this.moleculeType, linearSequence?"linear ":"circular", - this.division, ((modificationDate == null) || (modificationDate.equals("")) ? "" : modificationDate.toUpperCase()) - ); - } +public class GenBankLocus +{ + private String name; + + private int sequenceLength; + + private String strand; + + private String moleculeType; + + private boolean linearSequence; + + private String division; + + private String modificationDate; + + public GenBankLocus() + { + } + + public GenBankLocus(String name, int sequenceLength) + { + this.name = name; + this.sequenceLength = sequenceLength; + } + + /** + * @return the name + */ + public String getName() + { + return name; + } + + /** + * @param name + * the name to set + */ + public void setName(String name) + { + this.name = name; + } + + /** + * @return the sequenceLength + */ + public int getSequenceLength() + { + return sequenceLength; + } + + /** + * @param sequenceLength + * the sequenceLength to set + */ + public void setSequenceLength(int sequenceLength) + { + this.sequenceLength = sequenceLength; + } + + /** + * @return the strand + */ + public String getStrand() + { + return strand; + } + + /** + * @param strand + * the strand to set + */ + public void setStrand(String strand) + { + this.strand = strand; + } + + /** + * @return the moleculeType + */ + public String getMoleculeType() + { + return moleculeType; + } + + /** + * @param moleculeType + * the moleculeType to set + */ + public void setMoleculeType(String moleculeType) + { + this.moleculeType = moleculeType; + } + + /** + * @return the linearSequence + */ + public boolean isLinearSequence() + { + return linearSequence; + } + + /** + * @param linearSequence + * the linearSequence to set + */ + public void setLinearSequence(boolean linearSequence) + { + this.linearSequence = linearSequence; + } + + /** + * @return the division + */ + public String getDivision() + { + return division; + } + + /** + * @param division + * the division to set + */ + public void setDivision(String division) + { + this.division = division; + } + + /** + * @return the modificationDate + */ + public String getModificationDate() + { + return modificationDate; + } + + /** + * @param modificationDate + * the modificationDate to set + */ + public void setModificationDate(String modificationDate) + { + this.modificationDate = modificationDate; + } + + @Override + public String toString() + { + + return String + .format("LOCUS %-16s %11d bp %3s %6s %-8s %3s %s", + this.name, + this.sequenceLength, + this.strand, + this.moleculeType, + linearSequence ? "linear " : "circular", + this.division, + ((modificationDate == null) + || (modificationDate.equals("")) ? "" + : modificationDate.toUpperCase())); + } } diff --git a/src/jalview/io/xdb/genbank/GenBankReference.java b/src/jalview/io/xdb/genbank/GenBankReference.java index 74f0080..17ad8b4 100644 --- a/src/jalview/io/xdb/genbank/GenBankReference.java +++ b/src/jalview/io/xdb/genbank/GenBankReference.java @@ -1,135 +1,176 @@ package jalview.io.xdb.genbank; -public class GenBankReference { - private int order; - private int begin; - private int end; - private String descriptor; - private String authors; - private String title; - private String journal; - private String pubmed; - private String medline; - private String consortia; - private String remark; - - public GenBankReference() { - super(); - } - - public String getDescriptor() { - return descriptor; - } - - public void setDescriptor(String descriptor) { - this.descriptor = descriptor; - } - - public String getAuthors() { - return authors; - } - - public void setAuthors(String authors) { - this.authors = authors; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getJournal() { - return journal; - } - - public void setJournal(String journal) { - this.journal = journal; - } - - public String getPubmed() { - return pubmed; - } - - public void setPubmed(String pubmed) { - this.pubmed = pubmed; - } - - public int getOrder() { - return order; - } - - public void setOrder(int order) { - this.order = order; - } - public int getBegin() { - return begin; - } - - public void setBegin(int begin) { - this.begin = begin; - } - - public int getEnd() { - return end; - } - - public void setEnd(int end) { - this.end = end; - } - - - public String getMedline() { - return medline; - } - - public void setMedline(String medline) { - this.medline = medline; - } - - public String getConsortia() { - return consortia; - } - - public void setConsortia(String consortia) { - this.consortia = consortia; - } - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - public String toString(){ -// References has the following format -// REFERENCE 1 (bases 1 to 1976) -// AUTHORS Spritz,R.A., DeRiel,J.K., Forget,B.G. and Weissman,S.M. -// TITLE Complete nucleotide sequence of the human delta-globin gene -// JOURNAL Cell 21 (3), 639-646 (1980) -// PUBMED 7438204 - - StringBuffer buf = new StringBuffer(); - buf.append("REFERENCE ").append(this.getOrder()).append(" (bases ").append(this.getBegin()).append(" to ").append(this.getEnd()).append(")\n"); - if (this.getAuthors()!=null) - buf.append(" AUTHORS ").append(this.getAuthors()).append("\n"); - if (this.getTitle()!=null) - buf.append(" TITLE ").append(this.getTitle()).append("\n"); - if (this.getJournal()!=null) - buf.append(" JOURNAL ").append(this.getJournal()).append("\n"); - if (this.getPubmed()!=null) - buf.append(" PUBMED ").append(this.getPubmed()).append("\n");; - if (this.getMedline()!=null) - buf.append(" MEDLINE ").append(this.getMedline()).append("\n");; - if (this.getRemark()!=null) - buf.append(" REMARK ").append(this.getRemark()).append("\n");; - if (this.getConsortia()!=null) - buf.append(" CONSRTM ").append(this.getConsortia()).append("\n");; - return buf.toString(); - } - +public class GenBankReference +{ + private int order; + + private int begin; + + private int end; + + private String descriptor; + + private String authors; + + private String title; + + private String journal; + + private String pubmed; + + private String medline; + + private String consortia; + + private String remark; + + public GenBankReference() + { + super(); + } + + public String getDescriptor() + { + return descriptor; + } + + public void setDescriptor(String descriptor) + { + this.descriptor = descriptor; + } + + public String getAuthors() + { + return authors; + } + + public void setAuthors(String authors) + { + this.authors = authors; + } + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getJournal() + { + return journal; + } + + public void setJournal(String journal) + { + this.journal = journal; + } + + public String getPubmed() + { + return pubmed; + } + + public void setPubmed(String pubmed) + { + this.pubmed = pubmed; + } + + public int getOrder() + { + return order; + } + + public void setOrder(int order) + { + this.order = order; + } + + public int getBegin() + { + return begin; + } + + public void setBegin(int begin) + { + this.begin = begin; + } + + public int getEnd() + { + return end; + } + + public void setEnd(int end) + { + this.end = end; + } + + public String getMedline() + { + return medline; + } + + public void setMedline(String medline) + { + this.medline = medline; + } + + public String getConsortia() + { + return consortia; + } + + public void setConsortia(String consortia) + { + this.consortia = consortia; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public String toString() + { + // References has the following format + // REFERENCE 1 (bases 1 to 1976) + // AUTHORS Spritz,R.A., DeRiel,J.K., Forget,B.G. and Weissman,S.M. + // TITLE Complete nucleotide sequence of the human delta-globin gene + // JOURNAL Cell 21 (3), 639-646 (1980) + // PUBMED 7438204 + + StringBuffer buf = new StringBuffer(); + buf.append("REFERENCE ").append(this.getOrder()).append(" (bases ") + .append(this.getBegin()).append(" to ").append(this.getEnd()) + .append(")\n"); + if (this.getAuthors() != null) + buf.append(" AUTHORS ").append(this.getAuthors()).append("\n"); + if (this.getTitle() != null) + buf.append(" TITLE ").append(this.getTitle()).append("\n"); + if (this.getJournal() != null) + buf.append(" JOURNAL ").append(this.getJournal()).append("\n"); + if (this.getPubmed() != null) + buf.append(" PUBMED ").append(this.getPubmed()).append("\n"); + ; + if (this.getMedline() != null) + buf.append(" MEDLINE ").append(this.getMedline()).append("\n"); + ; + if (this.getRemark() != null) + buf.append(" REMARK ").append(this.getRemark()).append("\n"); + ; + if (this.getConsortia() != null) + buf.append(" CONSRTM ").append(this.getConsortia()).append("\n"); + ; + return buf.toString(); + } + } diff --git a/src/jalview/io/xdb/genbank/GenBankSequence.java b/src/jalview/io/xdb/genbank/GenBankSequence.java index 279601c..6e0797c 100644 --- a/src/jalview/io/xdb/genbank/GenBankSequence.java +++ b/src/jalview/io/xdb/genbank/GenBankSequence.java @@ -1,57 +1,65 @@ package jalview.io.xdb.genbank; import java.util.Vector; + /** - * A line like the following: - * 1 aatgaaggtt catttttcat tctcacaaac taatgaaacc ctgcttatct taaaccaacc - * will be mapped as: - * id: 1 - * sequences: {"aatgaaggtt", "catttttcat", "tctcacaaac", "taatgaaacc", "ctgcttatct", "taaaccaacc"} - * Each sequence has 8 nucleotides long + * A line like the following: 1 aatgaaggtt catttttcat tctcacaaac taatgaaacc + * ctgcttatct taaaccaacc will be mapped as: id: 1 sequences: {"aatgaaggtt", + * "catttttcat", "tctcacaaac", "taatgaaacc", "ctgcttatct", "taaaccaacc"} Each + * sequence has 8 nucleotides long + * * @author darolmar - * + * */ -public class GenBankSequence { - //Initial position - private int id; - //Sequences in that line - private Vector sequences; - - public GenBankSequence() { - super(); - sequences = new Vector(); - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public Vector getSequences() { - return sequences; - } - - public void setSequences(Vector sequences) { - this.sequences = sequences; - } - - public String getSequencesAsString(){ - StringBuffer sb = new StringBuffer(); - for (String seq:sequences) - sb.append(seq).append(" "); - return sb.toString(); - } - - public String toString(){ - StringBuffer sb = new StringBuffer() - .append(" ").append(this.id); - for (String seq:sequences) - sb.append(" ").append(seq); - sb.append("\n"); - return sb.toString(); - } - +public class GenBankSequence +{ + // Initial position + private int id; + + // Sequences in that line + private Vector sequences; + + public GenBankSequence() + { + super(); + sequences = new Vector(); + } + + public int getId() + { + return id; + } + + public void setId(int id) + { + this.id = id; + } + + public Vector getSequences() + { + return sequences; + } + + public void setSequences(Vector sequences) + { + this.sequences = sequences; + } + + public String getSequencesAsString() + { + StringBuffer sb = new StringBuffer(); + for (String seq : sequences) + sb.append(seq).append(" "); + return sb.toString(); + } + + public String toString() + { + StringBuffer sb = new StringBuffer().append(" ").append(this.id); + for (String seq : sequences) + sb.append(" ").append(seq); + sb.append("\n"); + return sb.toString(); + } + } diff --git a/src/jalview/io/xdb/genbank/GenBankSource.java b/src/jalview/io/xdb/genbank/GenBankSource.java index c5ef3c2..dbdba9f 100644 --- a/src/jalview/io/xdb/genbank/GenBankSource.java +++ b/src/jalview/io/xdb/genbank/GenBankSource.java @@ -1,85 +1,112 @@ package jalview.io.xdb.genbank; /** - *

Free-format information including an abbreviated form of the organism - * name, sometimes followed by a molecule type. (See section 3.4.10 of the - * GenBank release notes for more info.)

- *

Entrez Search Field: Organism [ORGN]

- *

Search Tip: For some organisms that have well-established common names, - * such as baker's yeast, mouse, and human, a search for the common name will - * yield the same results as a search for the scientific name, e.g., a search - * for "baker's yeast" in the organism field retrieves the same number of - * documents as "Saccharomyces cerevisiae". This is true because the Organism - * field is connected to the NCBI Taxonomy Database, which contains - * cross-references between common names, scientific names, and synonyms for - * organisms represented in the Sequence databases.

+ *

+ * Free-format information including an abbreviated form of the organism name, + * sometimes followed by a molecule type. (See section 3.4.10 of the GenBank + * release notes for more info.) + *

+ *

+ * Entrez Search Field: Organism [ORGN] + *

+ *

+ * Search Tip: For some organisms that have well-established common names, such + * as baker's yeast, mouse, and human, a search for the common name will yield + * the same results as a search for the scientific name, e.g., a search for + * "baker's yeast" in the organism field retrieves the same number of documents + * as "Saccharomyces cerevisiae". This is true because the Organism field is + * connected to the NCBI Taxonomy Database, which contains cross-references + * between common names, scientific names, and synonyms for organisms + * represented in the Sequence databases. + *

*

Organism

- *

The formal scientific name for the source organism (genus and species, - * where appropriate) and its lineage, based on the phylogenetic classification - * scheme used in the NCBI Taxonomy Database. If the complete lineage of an - * organism is very long, an abbreviated lineage will be shown in the GenBank - * record and the complete lineage will be available in the Taxonomy Database. - * (See also the /db_xref=taxon:nnnn Feature qualifer, below.)

- *

Entrez Search Field: Organism [ORGN]

- *

Search Tip: You can search the Organism field by any node in the taxonomic + *

+ * The formal scientific name for the source organism (genus and species, where + * appropriate) and its lineage, based on the phylogenetic classification scheme + * used in the NCBI Taxonomy Database. If the complete lineage of an organism is + * very long, an abbreviated lineage will be shown in the GenBank record and the + * complete lineage will be available in the Taxonomy Database. (See also the + * /db_xref=taxon:nnnn Feature qualifer, below.) + *

+ *

+ * Entrez Search Field: Organism [ORGN] + *

+ *

+ * Search Tip: You can search the Organism field by any node in the taxonomic * hierarchy, e.g., you can search for the term "Saccharomyces cerevisiae", * "Saccharomycetales", "Ascomycota", etc. to retrieve all the sequences from - * organisms in a particular taxon.

+ * organisms in a particular taxon. + *

* */ -public class GenBankSource { - private String source=""; - private String organism=""; - private String taxonomic=""; +public class GenBankSource +{ + private String source = ""; - public GenBankSource() { - } + private String organism = ""; - @Override - public String toString() { - return String.format("%s\n\t%s\n\t%s", getSource(), getOrganism(), getTaxonomic()); - } + private String taxonomic = ""; - /** - * @return the source - */ - public String getSource() { - return source; - } + public GenBankSource() + { + } - /** - * @param source the source to set - */ - public void setSource(String source) { - this.source = source; - } + @Override + public String toString() + { + return String.format("%s\n\t%s\n\t%s", getSource(), getOrganism(), + getTaxonomic()); + } - /** - * @return the organism - */ - public String getOrganism() { - return organism; - } + /** + * @return the source + */ + public String getSource() + { + return source; + } - /** - * @param organism the organism to set - */ - public void setOrganism(String organism) { - this.organism = organism; - } + /** + * @param source + * the source to set + */ + public void setSource(String source) + { + this.source = source; + } - /** - * @return the taxonomic - */ - public String getTaxonomic() { - return taxonomic; - } + /** + * @return the organism + */ + public String getOrganism() + { + return organism; + } - /** - * @param taxonomic the taxonomic to set - */ - public void setTaxonomic(String taxonomic) { - this.taxonomic = taxonomic; - } + /** + * @param organism + * the organism to set + */ + public void setOrganism(String organism) + { + this.organism = organism; + } + + /** + * @return the taxonomic + */ + public String getTaxonomic() + { + return taxonomic; + } + + /** + * @param taxonomic + * the taxonomic to set + */ + public void setTaxonomic(String taxonomic) + { + this.taxonomic = taxonomic; + } } diff --git a/src/jalview/io/xdb/genbank/GenBankVersion.java b/src/jalview/io/xdb/genbank/GenBankVersion.java index 85a2fd1..2deb5ee 100644 --- a/src/jalview/io/xdb/genbank/GenBankVersion.java +++ b/src/jalview/io/xdb/genbank/GenBankVersion.java @@ -1,89 +1,125 @@ package jalview.io.xdb.genbank; /** - *

A nucleotide sequence identification number that represents a single, + *

+ * A nucleotide sequence identification number that represents a single, * specific sequence in the GenBank database. This identification number uses - * the accession.version format implemented by GenBank/EMBL/DDBJ in - * February 1999.

- *

If there is any change to the sequence data (even a single base), the - * version number will be increased, e.g., U12345.1 → U12345.2, but the - * accession portion will remain stable.

- *

The accession.version system of sequence identifiers runs parallel to - * the GI number system, i.e., when any change is made to a sequence, it - * receives a new GI number AND an increase to its version number.

- *

For more information, see section 1.3.2 of the GenBank 111.0 release - * notes, and section 3.4.7 of the current GenBank release notes.

- *

A Sequence Revision History tool is available to track the various GI - * numbers, version numbers, and update dates for sequences that appeared in - * a specific GenBank record (more information and example).

- *

More details about sequence identification numbers and the difference - * between GI number and version are provided in Sequence Identifiers: - * A Historical Note.

- *

Entrez Search Field: use the default setting of "All Fields"

+ * the accession.version format implemented by GenBank/EMBL/DDBJ in February + * 1999. + *

+ *

+ * If there is any change to the sequence data (even a single base), the version + * number will be increased, e.g., U12345.1 → U12345.2, but the accession + * portion will remain stable. + *

+ *

+ * The accession.version system of sequence identifiers runs parallel to the GI + * number system, i.e., when any change is made to a sequence, it receives a new + * GI number AND an increase to its version number. + *

+ *

+ * For more information, see section 1.3.2 of the GenBank 111.0 release notes, + * and section 3.4.7 of the current GenBank release notes. + *

+ *

+ * A Sequence Revision History tool is available to track the various GI + * numbers, version numbers, and update dates for sequences that appeared in a + * specific GenBank record (more information and example). + *

+ *

+ * More details about sequence identification numbers and the difference between + * GI number and version are provided in Sequence Identifiers: A Historical + * Note. + *

+ *

+ * Entrez Search Field: use the default setting of "All Fields" + *

*

GI

- *

"GenInfo Identifier" sequence identification number, in this case, for - * the nucleotide sequence. If a sequence changes in any way, a new GI number - * will be assigned.

- *

A separate GI number is also assigned to each protein translation within - * a nucleotide sequence record, and a new GI is assigned if the protein - * translation changes in any way (see below).

- *

GI sequence identifiers run parallel to the new accession.version system - * of sequence identifiers. For more information, see the description of Version, - * above, and section 3.4.7 of the current GenBank release notes.

- *

A Sequence Revision History tool is available to track the various GI + *

+ * "GenInfo Identifier" sequence identification number, in this case, for the + * nucleotide sequence. If a sequence changes in any way, a new GI number will + * be assigned. + *

+ *

+ * A separate GI number is also assigned to each protein translation within a + * nucleotide sequence record, and a new GI is assigned if the protein + * translation changes in any way (see below). + *

+ *

+ * GI sequence identifiers run parallel to the new accession.version system of + * sequence identifiers. For more information, see the description of Version, + * above, and section 3.4.7 of the current GenBank release notes. + *

+ *

+ * A Sequence Revision History tool is available to track the various GI * numbers, version numbers, and update dates for sequences that appeared in a - * specific GenBank record (more information and example).

- *

More details about sequence identification numbers and the difference - * between GI number and version are provided in Sequence Identifiers: A - * Historical Note.

- *

Entrez Search Field: use the default setting of "All Fields"

+ * specific GenBank record (more information and example). + *

+ *

+ * More details about sequence identification numbers and the difference between + * GI number and version are provided in Sequence Identifiers: A Historical + * Note. + *

+ *

+ * Entrez Search Field: use the default setting of "All Fields" + *

+ * * @author Dieval Guizelini * @see Entry */ -public class GenBankVersion { - private String version = ""; - private String gi = ""; - - public GenBankVersion() { - } +public class GenBankVersion +{ + private String version = ""; + private String gi = ""; - /** - * @return the version - */ - public String getVersion() { - return version; - } + public GenBankVersion() + { + } - /** - * @param version the version to set - */ - public void setVersion(String version) { - this.version = version; - } + /** + * @return the version + */ + public String getVersion() + { + return version; + } - /** - * @return the gi - */ - public String getGI() { - return gi; - } + /** + * @param version + * the version to set + */ + public void setVersion(String version) + { + this.version = version; + } - /** - * @param gi the gi to set - */ - public void setGI(String gi) { - this.gi = gi; - } + /** + * @return the gi + */ + public String getGI() + { + return gi; + } + /** + * @param gi + * the gi to set + */ + public void setGI(String gi) + { + this.gi = gi; + } - /** - * Version section in GenBank File Format is text with two fields (version and GI). - * - * @return version+" "+gi - */ - @Override - public String toString() { - return String.format("%s %s",version,gi); - } + /** + * Version section in GenBank File Format is text with two fields (version and + * GI). + * + * @return version+" "+gi + */ + @Override + public String toString() + { + return String.format("%s %s", version, gi); + } } diff --git a/test/jalview/io/GenBankTest.java b/test/jalview/io/GenBankTest.java index d3c41da..d2c9705 100644 --- a/test/jalview/io/GenBankTest.java +++ b/test/jalview/io/GenBankTest.java @@ -17,266 +17,301 @@ import java.util.Map; import org.junit.Test; -public class GenBankTest { -// private final static File GENBANK_FILE = new File("test/jalview/io/V00505.gb"); -// private final static File GENBANK_FILE = new File("test/jalview/io/NC_000011.10.gb"); - private final static File GENBANK_FILE = new File("test/jalview/io/M92650.1.gb"); +public class GenBankTest +{ + // private final static File GENBANK_FILE = new + // File("test/jalview/io/V00505.gb"); + // private final static File GENBANK_FILE = new + // File("test/jalview/io/NC_000011.10.gb"); + private final static File GENBANK_FILE = new File( + "test/jalview/io/M92650.1.gb"); - @Test - public void testParsing(){ - testFileIOwithFormat(GENBANK_FILE, "GENBANK"); - } - /** - * test alignment data in given file can be imported, exported and reimported - * with no dataloss - * - * @param f - * - source datafile (IdentifyFile.identify() should work with it) - * @param ioformat - * - label for IO class used to write and read back in the data from - * f - */ - public static void testFileIOwithFormat(File f, String ioformat) - { - System.out.println("Reading file: " + f); - String ff = f.getPath(); - try - { - AppletFormatAdapter rf = new AppletFormatAdapter(); + @Test + public void testParsing() + { + testFileIOwithFormat(GENBANK_FILE, "GENBANK"); + } - Alignment al = rf.readFile(ff, AppletFormatAdapter.FILE, - new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE)); + /** + * test alignment data in given file can be imported, exported and reimported + * with no dataloss + * + * @param f + * - source datafile (IdentifyFile.identify() should work with it) + * @param ioformat + * - label for IO class used to write and read back in the data from + * f + */ + public static void testFileIOwithFormat(File f, String ioformat) + { + System.out.println("Reading file: " + f); + String ff = f.getPath(); + try + { + AppletFormatAdapter rf = new AppletFormatAdapter(); - assertNotNull("Couldn't read supplied alignment data.", al); + Alignment al = rf.readFile(ff, AppletFormatAdapter.FILE, + new IdentifyFile().Identify(ff, AppletFormatAdapter.FILE)); - // make sure dataset is initialised ? not sure about this - for (int i = 0; i < al.getSequencesArray().length; ++i) - { - al.getSequenceAt(i).setDatasetSequence(al.getSequenceAt(i)); - } - String outputfile = rf.formatSequences(ioformat, al, true); - System.out.println("Output file in '"+ioformat+"':\n"+outputfile+"\n< orig_groups=new HashMap(),new_groups=new HashMap(); + assertTrue( + "Alignment dimension mismatch: original contains " + + al.getHeight() + " and generated has " + + al_input.getHeight() + " sequences; original has " + + al.getWidth() + " and generated has " + + al_input.getWidth() + " columns.", + al.getHeight() == al_input.getHeight() + && al.getWidth() == al_input.getWidth()); - if (aa_new != null && aa_original != null) - { - for (int i = 0; i < aa_original.length; i++) - { - if (aa_new.length>i) { - assertTrue("Different alignment annotation at position "+i, - equalss(aa_original[i], aa_new[i])); - // compare graphGroup or graph properties - needed to verify JAL-1299 - assertTrue("Graph type not identical.",aa_original[i].graph==aa_new[i].graph); - assertTrue("Visibility not identical.", aa_original[i].visible==aa_new[i].visible); - assertTrue( - "Threshold line not identical.", - aa_original[i].threshold == null ? aa_new[i].threshold == null - : aa_original[i].threshold - .equals(aa_new[i].threshold)); - // graphGroup may differ, but pattern should be the same - Integer o_ggrp=new Integer(aa_original[i].graphGroup+2),n_ggrp=new Integer(aa_new[i].graphGroup+2); - BitSet orig_g=orig_groups.get(o_ggrp),new_g=new_groups.get(n_ggrp); - if (orig_g==null) { - orig_groups.put(o_ggrp,orig_g= new BitSet()); - } - if (new_g==null) { - new_groups.put(n_ggrp, new_g=new BitSet()); - } - assertTrue("Graph Group pattern differs at annotation "+i, orig_g.equals(new_g)); - orig_g.set(i); new_g.set(i); - } else { - System.err.println("No matching annotation row for "+aa_original[i].toString()); - } - } - } - assertTrue( - "Generated and imported alignment have different annotation sets (" - + aa_new_size + " != " + aa_original_size + ")", - aa_new_size == aa_original_size); + // check Alignment annotation + AlignmentAnnotation[] aa_new = al_input.getAlignmentAnnotation(); + AlignmentAnnotation[] aa_original = al.getAlignmentAnnotation(); - // check sequences, annotation and features - SequenceI[] seq_original = new SequenceI[al.getSequencesArray().length]; - seq_original = al.getSequencesArray(); - SequenceI[] seq_new = new SequenceI[al_input.getSequencesArray().length]; - seq_new = al_input.getSequencesArray(); - SequenceFeature[] sequenceFeatures_original, sequenceFeatures_new; - AlignmentAnnotation annot_original, annot_new; - // - for (int i = 0; i < al.getSequencesArray().length; i++) - { - String name = seq_original[i].getName(); - int start = seq_original[i].getStart(); - int end = seq_original[i].getEnd(); - System.out.println("Check sequence: " + name + "/" + start + "-" - + end); + // note - at moment we do not distinguish between alignment without any + // annotation rows and alignment with no annotation row vector + // we might want to revise this in future + int aa_new_size = (aa_new == null ? 0 : aa_new.length), aa_original_size = (aa_original == null ? 0 + : aa_original.length); + Map orig_groups = new HashMap(), new_groups = new HashMap(); - // search equal sequence - for (int in = 0; in < al_input.getSequencesArray().length; in++) - { - if (name.equals(seq_new[in].getName()) - && start == seq_new[in].getStart() - && end == seq_new[in].getEnd()) - { - String ss_original = seq_original[i].getSequenceAsString(); - String ss_new = seq_new[in].getSequenceAsString(); - assertTrue("The sequences " + name + "/" + start + "-" + end - + " are not equal", ss_original.equals(ss_new)); + if (aa_new != null && aa_original != null) + { + for (int i = 0; i < aa_original.length; i++) + { + if (aa_new.length > i) + { + assertTrue("Different alignment annotation at position " + i, + equalss(aa_original[i], aa_new[i])); + // compare graphGroup or graph properties - needed to verify JAL-1299 + assertTrue("Graph type not identical.", + aa_original[i].graph == aa_new[i].graph); + assertTrue("Visibility not identical.", + aa_original[i].visible == aa_new[i].visible); + assertTrue( + "Threshold line not identical.", + aa_original[i].threshold == null ? aa_new[i].threshold == null + : aa_original[i].threshold + .equals(aa_new[i].threshold)); + // graphGroup may differ, but pattern should be the same + Integer o_ggrp = new Integer(aa_original[i].graphGroup + 2), n_ggrp = new Integer( + aa_new[i].graphGroup + 2); + BitSet orig_g = orig_groups.get(o_ggrp), new_g = new_groups + .get(n_ggrp); + if (orig_g == null) + { + orig_groups.put(o_ggrp, orig_g = new BitSet()); + } + if (new_g == null) + { + new_groups.put(n_ggrp, new_g = new BitSet()); + } + assertTrue("Graph Group pattern differs at annotation " + i, + orig_g.equals(new_g)); + orig_g.set(i); + new_g.set(i); + } + else + { + System.err.println("No matching annotation row for " + + aa_original[i].toString()); + } + } + } + assertTrue( + "Generated and imported alignment have different annotation sets (" + + aa_new_size + " != " + aa_original_size + ")", + aa_new_size == aa_original_size); - assertTrue( - "Sequence Features were not equivalent", - (seq_original[i].getSequenceFeatures() == null && seq_new[in] - .getSequenceFeatures() == null) - || (seq_original[i].getSequenceFeatures() != null && seq_new[in] - .getSequenceFeatures() != null)); - // compare sequence features - if (seq_original[i].getSequenceFeatures() != null - && seq_new[in].getSequenceFeatures() != null) - { - System.out.println("There are feature!!!"); - sequenceFeatures_original = new SequenceFeature[seq_original[i] - .getSequenceFeatures().length]; - sequenceFeatures_original = seq_original[i] - .getSequenceFeatures(); - sequenceFeatures_new = new SequenceFeature[seq_new[in] - .getSequenceFeatures().length]; - sequenceFeatures_new = seq_new[in].getSequenceFeatures(); + // check sequences, annotation and features + SequenceI[] seq_original = new SequenceI[al.getSequencesArray().length]; + seq_original = al.getSequencesArray(); + SequenceI[] seq_new = new SequenceI[al_input.getSequencesArray().length]; + seq_new = al_input.getSequencesArray(); + SequenceFeature[] sequenceFeatures_original, sequenceFeatures_new; + AlignmentAnnotation annot_original, annot_new; + // + for (int i = 0; i < al.getSequencesArray().length; i++) + { + String name = seq_original[i].getName(); + int start = seq_original[i].getStart(); + int end = seq_original[i].getEnd(); + System.out.println("Check sequence: " + name + "/" + start + "-" + + end); - assertTrue("different number of features", seq_original[i] - .getSequenceFeatures().length == seq_new[in] - .getSequenceFeatures().length); + // search equal sequence + for (int in = 0; in < al_input.getSequencesArray().length; in++) + { + if (name.equals(seq_new[in].getName()) + && start == seq_new[in].getStart() + && end == seq_new[in].getEnd()) + { + String ss_original = seq_original[i].getSequenceAsString(); + String ss_new = seq_new[in].getSequenceAsString(); + assertTrue("The sequences " + name + "/" + start + "-" + end + + " are not equal", ss_original.equals(ss_new)); - for (int feat = 0; feat < seq_original[i].getSequenceFeatures().length; feat++) - { - assertTrue("Different features", - sequenceFeatures_original[feat] - .equals(sequenceFeatures_new[feat])); - } - } - // compare alignment annotation - if (al.getSequenceAt(i).getAnnotation() != null - && al_input.getSequenceAt(in).getAnnotation() != null) - { - for (int j = 0; j < al.getSequenceAt(i).getAnnotation().length; j++) - { - if (al.getSequenceAt(i).getAnnotation()[j] != null - && al_input.getSequenceAt(in).getAnnotation()[j] != null) - { - annot_original = al.getSequenceAt(i).getAnnotation()[j]; - annot_new = al_input.getSequenceAt(in).getAnnotation()[j]; - assertTrue("Different annotation elements", - equalss(annot_original, annot_new)); - } - } - } - else if (al.getSequenceAt(i).getAnnotation() == null - && al_input.getSequenceAt(in).getAnnotation() == null) - { - System.out.println("No annotations"); - } - else if (al.getSequenceAt(i).getAnnotation() != null - && al_input.getSequenceAt(in).getAnnotation() == null) - { - assertTrue("Annotations differed between sequences (" - + al.getSequenceAt(i).getName() + ") and (" - + al_input.getSequenceAt(i).getName() + ")", false); - } - break; - } - } - } - } - /* - * compare annotations - */ - private static boolean equalss(AlignmentAnnotation annot_or, - AlignmentAnnotation annot_new) - { - if (annot_or.annotations.length != annot_new.annotations.length) - { - System.err.println("Different lengths for annotation row elements: "+annot_or.annotations.length +"!="+ annot_new.annotations.length); - return false; - } - for (int i = 0; i < annot_or.annotations.length; i++) - { - Annotation an_or=annot_or.annotations[i],an_new=annot_new.annotations[i]; - if (an_or != null - && an_new!= null) - { - if (!an_or.displayCharacter.trim() - .equals(an_new.displayCharacter.trim()) - || !(""+an_or.secondaryStructure).trim().equals((""+an_new.secondaryStructure).trim()) - || ((!an_or.description.equals(an_new.description)) && (an_or.description == null - || an_new.description == null || !an_or.description - .equals(an_new.description)))) - { - System.err.println("Annotation Element Mismatch\nElement "+i+" in original: "+annot_or.annotations[i].toString()+"\nElement "+i+" in new: "+annot_new.annotations[i].toString()); - return false; - } - } - else if (annot_or.annotations[i] == null - && annot_new.annotations[i] == null) - { - continue; - } - else - { - System.err.println("Annotation Element Mismatch\nElement "+i+" in original: "+(annot_or.annotations[i]==null ? "is null" : annot_or.annotations[i].toString())+"\nElement "+i+" in new: "+(annot_new.annotations[i] == null ? "is null" : annot_new.annotations[i].toString())); - return false; - } - } - return true; - } + assertTrue( + "Sequence Features were not equivalent", + (seq_original[i].getSequenceFeatures() == null && seq_new[in] + .getSequenceFeatures() == null) + || (seq_original[i].getSequenceFeatures() != null && seq_new[in] + .getSequenceFeatures() != null)); + // compare sequence features + if (seq_original[i].getSequenceFeatures() != null + && seq_new[in].getSequenceFeatures() != null) + { + System.out.println("There are feature!!!"); + sequenceFeatures_original = new SequenceFeature[seq_original[i] + .getSequenceFeatures().length]; + sequenceFeatures_original = seq_original[i] + .getSequenceFeatures(); + sequenceFeatures_new = new SequenceFeature[seq_new[in] + .getSequenceFeatures().length]; + sequenceFeatures_new = seq_new[in].getSequenceFeatures(); + + assertTrue("different number of features", seq_original[i] + .getSequenceFeatures().length == seq_new[in] + .getSequenceFeatures().length); + + for (int feat = 0; feat < seq_original[i].getSequenceFeatures().length; feat++) + { + assertTrue("Different features", + sequenceFeatures_original[feat] + .equals(sequenceFeatures_new[feat])); + } + } + // compare alignment annotation + if (al.getSequenceAt(i).getAnnotation() != null + && al_input.getSequenceAt(in).getAnnotation() != null) + { + for (int j = 0; j < al.getSequenceAt(i).getAnnotation().length; j++) + { + if (al.getSequenceAt(i).getAnnotation()[j] != null + && al_input.getSequenceAt(in).getAnnotation()[j] != null) + { + annot_original = al.getSequenceAt(i).getAnnotation()[j]; + annot_new = al_input.getSequenceAt(in).getAnnotation()[j]; + assertTrue("Different annotation elements", + equalss(annot_original, annot_new)); + } + } + } + else if (al.getSequenceAt(i).getAnnotation() == null + && al_input.getSequenceAt(in).getAnnotation() == null) + { + System.out.println("No annotations"); + } + else if (al.getSequenceAt(i).getAnnotation() != null + && al_input.getSequenceAt(in).getAnnotation() == null) + { + assertTrue("Annotations differed between sequences (" + + al.getSequenceAt(i).getName() + ") and (" + + al_input.getSequenceAt(i).getName() + ")", false); + } + break; + } + } + } + } + + /* + * compare annotations + */ + private static boolean equalss(AlignmentAnnotation annot_or, + AlignmentAnnotation annot_new) + { + if (annot_or.annotations.length != annot_new.annotations.length) + { + System.err.println("Different lengths for annotation row elements: " + + annot_or.annotations.length + "!=" + + annot_new.annotations.length); + return false; + } + for (int i = 0; i < annot_or.annotations.length; i++) + { + Annotation an_or = annot_or.annotations[i], an_new = annot_new.annotations[i]; + if (an_or != null && an_new != null) + { + if (!an_or.displayCharacter.trim().equals( + an_new.displayCharacter.trim()) + || !("" + an_or.secondaryStructure).trim().equals( + ("" + an_new.secondaryStructure).trim()) + || ((!an_or.description.equals(an_new.description)) && (an_or.description == null + || an_new.description == null || !an_or.description + .equals(an_new.description)))) + { + System.err.println("Annotation Element Mismatch\nElement " + i + + " in original: " + annot_or.annotations[i].toString() + + "\nElement " + i + " in new: " + + annot_new.annotations[i].toString()); + return false; + } + } + else if (annot_or.annotations[i] == null + && annot_new.annotations[i] == null) + { + continue; + } + else + { + System.err.println("Annotation Element Mismatch\nElement " + + i + + " in original: " + + (annot_or.annotations[i] == null ? "is null" + : annot_or.annotations[i].toString()) + + "\nElement " + + i + + " in new: " + + (annot_new.annotations[i] == null ? "is null" + : annot_new.annotations[i].toString())); + return false; + } + } + return true; + } } -- 1.7.10.2