Next changeset 1:5b2daedf156f (2022-05-20) |
Commit message:
Uploaded |
added:
cpt_gff_add_parent/cpt-macros.xml cpt_gff_add_parent/gff3.py cpt_gff_add_parent/gff3_add_parents_to_cds.py cpt_gff_add_parent/gff3_add_parents_to_cds.xml cpt_gff_add_parent/macros.xml cpt_gff_add_parent/test-data/Miro_AddParentIn.gff3 cpt_gff_add_parent/test-data/T7_AddParentIn.gff3 |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/cpt-macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/cpt-macros.xml Fri May 13 04:54:17 2022 +0000 |
[ |
@@ -0,0 +1,115 @@ +<?xml version="1.0"?> +<macros> + <xml name="gff_requirements"> + <requirements> + <requirement type="package" version="2.7">python</requirement> + <requirement type="package" version="1.65">biopython</requirement> + <requirement type="package" version="2.12.1">requests</requirement> + <yield/> + </requirements> + <version_command> + <![CDATA[ + cd $__tool_directory__ && git rev-parse HEAD + ]]> + </version_command> + </xml> + <xml name="citation/mijalisrasche"> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex">@unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + </xml> + <xml name="citations"> + <citations> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </citations> + </xml> + <xml name="citations-crr"> + <citations> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {C. Ross}, + title = {CPT Galaxy Tools}, + year = {2020-}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </citations> + </xml> + <xml name="citations-2020"> + <citations> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {E. Mijalis, H. Rasche}, + title = {CPT Galaxy Tools}, + year = {2013-2017}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {A. Criscione}, + title = {CPT Galaxy Tools}, + year = {2019-2021}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </citations> + </xml> + <xml name="citations-2020-AJC-solo"> + <citations> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {A. Criscione}, + title = {CPT Galaxy Tools}, + year = {2019-2021}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </citations> + </xml> + <xml name="citations-clm"> + <citations> + <citation type="doi">10.1371/journal.pcbi.1008214</citation> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {C. Maughmer}, + title = {CPT Galaxy Tools}, + year = {2017-2020}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </citations> + </xml> + <xml name="sl-citations-clm"> + <citation type="bibtex"> + @unpublished{galaxyTools, + author = {C. Maughmer}, + title = {CPT Galaxy Tools}, + year = {2017-2020}, + note = {https://github.com/tamu-cpt/galaxy-tools/} + } + </citation> + <yield/> + </xml> +</macros> |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/gff3.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/gff3.py Fri May 13 04:54:17 2022 +0000 |
[ |
b'@@ -0,0 +1,346 @@\n+import copy\n+import logging\n+\n+log = logging.getLogger()\n+log.setLevel(logging.WARN)\n+\n+\n+def feature_lambda(\n+ feature_list,\n+ test,\n+ test_kwargs,\n+ subfeatures=True,\n+ parent=None,\n+ invert=False,\n+ recurse=True,\n+):\n+ """Recursively search through features, testing each with a test function, yielding matches.\n+\n+ GFF3 is a hierachical data structure, so we need to be able to recursively\n+ search through features. E.g. if you\'re looking for a feature with\n+ ID=\'bob.42\', you can\'t just do a simple list comprehension with a test\n+ case. You don\'t know how deeply burried bob.42 will be in the feature tree. This is where feature_lambda steps in.\n+\n+ :type feature_list: list\n+ :param feature_list: an iterable of features\n+\n+ :type test: function reference\n+ :param test: a closure with the method signature (feature, **kwargs) where\n+ the kwargs are those passed in the next argument. This\n+ function should return True or False, True if the feature is\n+ to be yielded as part of the main feature_lambda function, or\n+ False if it is to be ignored. This function CAN mutate the\n+ features passed to it (think "apply").\n+\n+ :type test_kwargs: dictionary\n+ :param test_kwargs: kwargs to pass to your closure when it is called.\n+\n+ :type subfeatures: boolean\n+ :param subfeatures: when a feature is matched, should just that feature be\n+ yielded to the caller, or should the entire sub_feature\n+ tree for that feature be included? subfeatures=True is\n+ useful in cases such as searching for a gene feature,\n+ and wanting to know what RBS/Shine_Dalgarno_sequences\n+ are in the sub_feature tree (which can be accomplished\n+ with two feature_lambda calls). subfeatures=False is\n+ useful in cases when you want to process (and possibly\n+ return) the entire feature tree, such as applying a\n+ qualifier to every single feature.\n+\n+ :type invert: boolean\n+ :param invert: Negate/invert the result of the filter.\n+\n+ :rtype: yielded list\n+ :return: Yields a list of matching features.\n+ """\n+ # Either the top level set of [features] or the subfeature attribute\n+ for feature in feature_list:\n+ feature._parent = parent\n+ if not parent:\n+ # Set to self so we cannot go above root.\n+ feature._parent = feature\n+ test_result = test(feature, **test_kwargs)\n+ # if (not invert and test_result) or (invert and not test_result):\n+ if invert ^ test_result:\n+ if not subfeatures:\n+ feature_copy = copy.deepcopy(feature)\n+ feature_copy.sub_features = list()\n+ yield feature_copy\n+ else:\n+ yield feature\n+\n+ if recurse and hasattr(feature, "sub_features"):\n+ for x in feature_lambda(\n+ feature.sub_features,\n+ test,\n+ test_kwargs,\n+ subfeatures=subfeatures,\n+ parent=feature,\n+ invert=invert,\n+ recurse=recurse,\n+ ):\n+ yield x\n+\n+\n+def fetchParent(feature):\n+ if not hasattr(feature, "_parent") or feature._parent is None:\n+ return feature\n+ else:\n+ return fetchParent(feature._parent)\n+\n+\n+def feature_test_true(feature, **kwargs):\n+ return True\n+\n+\n+def feature_test_type(feature, **kwargs):\n+ if "type" in kwargs:\n+ return str(feature.type).upper() == str(kwargs["type"]).upper()\n+ elif "types" in kwargs:\n+ for x in kwargs["types"]:\n+ if str(feature.type).upper() == str(x).upper():\n+ return True\n+ return False\n+ raise Exception("Incorrect feature_test_type call, ne'..b'feature.location.start,\n+ # feature.location.end,\n+ # feature.location.strand\n+ # )\n+ return result\n+\n+\n+def get_gff3_id(gene):\n+ return gene.qualifiers.get("Name", [gene.id])[0]\n+\n+\n+def ensure_location_in_bounds(start=0, end=0, parent_length=0):\n+ # This prevents frameshift errors\n+ while start < 0:\n+ start += 3\n+ while end < 0:\n+ end += 3\n+ while start > parent_length:\n+ start -= 3\n+ while end > parent_length:\n+ end -= 3\n+ return (start, end)\n+\n+\n+def coding_genes(feature_list):\n+ for x in genes(feature_list):\n+ if (\n+ len(\n+ list(\n+ feature_lambda(\n+ x.sub_features,\n+ feature_test_type,\n+ {"type": "CDS"},\n+ subfeatures=False,\n+ )\n+ )\n+ )\n+ > 0\n+ ):\n+ yield x\n+\n+\n+def genes(feature_list, feature_type="gene", sort=False):\n+ """\n+ Simple filter to extract gene features from the feature set.\n+ """\n+\n+ if not sort:\n+ for x in feature_lambda(\n+ feature_list, feature_test_type, {"type": feature_type}, subfeatures=True\n+ ):\n+ yield x\n+ else:\n+ data = list(genes(feature_list, feature_type=feature_type, sort=False))\n+ data = sorted(data, key=lambda feature: feature.location.start)\n+ for x in data:\n+ yield x\n+\n+\n+def wa_unified_product_name(feature):\n+ """\n+ Try and figure out a name. We gave conflicting instructions, so\n+ this isn\'t as trivial as it should be. Sometimes it will be in\n+ \'product\' or \'Product\', othertimes in \'Name\'\n+ """\n+ # Manually applied tags.\n+ protein_product = feature.qualifiers.get(\n+ "product", feature.qualifiers.get("Product", [None])\n+ )[0]\n+\n+ # If neither of those are available ...\n+ if protein_product is None:\n+ # And there\'s a name...\n+ if "Name" in feature.qualifiers:\n+ if not is_uuid(feature.qualifiers["Name"][0]):\n+ protein_product = feature.qualifiers["Name"][0]\n+\n+ return protein_product\n+\n+\n+def is_uuid(name):\n+ return name.count("-") == 4 and len(name) == 36\n+\n+\n+def get_rbs_from(gene):\n+ # Normal RBS annotation types\n+ rbs_rbs = list(\n+ feature_lambda(\n+ gene.sub_features, feature_test_type, {"type": "RBS"}, subfeatures=False\n+ )\n+ )\n+ rbs_sds = list(\n+ feature_lambda(\n+ gene.sub_features,\n+ feature_test_type,\n+ {"type": "Shine_Dalgarno_sequence"},\n+ subfeatures=False,\n+ )\n+ )\n+ # Fraking apollo\n+ apollo_exons = list(\n+ feature_lambda(\n+ gene.sub_features, feature_test_type, {"type": "exon"}, subfeatures=False\n+ )\n+ )\n+ apollo_exons = [x for x in apollo_exons if len(x) < 10]\n+ # These are more NCBI\'s style\n+ regulatory_elements = list(\n+ feature_lambda(\n+ gene.sub_features,\n+ feature_test_type,\n+ {"type": "regulatory"},\n+ subfeatures=False,\n+ )\n+ )\n+ rbs_regulatory = list(\n+ feature_lambda(\n+ regulatory_elements,\n+ feature_test_quals,\n+ {"regulatory_class": ["ribosome_binding_site"]},\n+ subfeatures=False,\n+ )\n+ )\n+ # Here\'s hoping you find just one ;)\n+ return rbs_rbs + rbs_sds + rbs_regulatory + apollo_exons\n+\n+\n+def nice_name(record):\n+ """\n+ get the real name rather than NCBI IDs and so on. If fails, will return record.id\n+ """\n+ name = record.id\n+ likely_parental_contig = list(genes(record.features, feature_type="contig"))\n+ if len(likely_parental_contig) == 1:\n+ name = likely_parental_contig[0].qualifiers.get("organism", [name])[0]\n+ return name\n+\n+\n+def fsort(it):\n+ for i in sorted(it, key=lambda x: int(x.location.start)):\n+ yield i\n' |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/gff3_add_parents_to_cds.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/gff3_add_parents_to_cds.py Fri May 13 04:54:17 2022 +0000 |
[ |
@@ -0,0 +1,50 @@ +#!/usr/bin/env python +import sys +import logging +import argparse +from CPT_GFFParser import gffParse, gffWrite, gffSeqFeature +#from Bio.SeqFeature import SeqFeature +from gff3 import feature_lambda, feature_test_type + +logging.basicConfig(level=logging.INFO) +log = logging.getLogger(__name__) + + +def fixed_feature(rec): + for feature in feature_lambda( + rec.features, feature_test_type, {"type": "CDS"}, subfeatures=True + ): + import random + + fid = feature.qualifiers["ID"][0] + "_" + str(random.random()) + gene = gffSeqFeature( + location=feature.location, + type="gene", + qualifiers={"ID": [fid], "source": ["cpt.fixModel"]}, + ) + # Below that we have an mRNA + mRNA = gffSeqFeature( + location=feature.location, + type="mRNA", + qualifiers={"source": ["cpt.fixModel"], "ID": ["%s.mRNA" % fid], "Parent": gene.qualifiers["ID"]}, + ) + feature.qualifiers["ID"] = [fid + ".CDS"] + feature.qualifiers["Parent"] = mRNA.qualifiers["ID"] + + mRNA.sub_features = [feature] + gene.sub_features = [mRNA] + yield gene + + +def gff_filter(gff3): + for rec in gffParse(gff3): + rec.features = sorted(list(fixed_feature(rec)), key=lambda x: x.location.start) + rec.annotations = {} + gffWrite([rec], sys.stdout) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="add parent gene features to CDSs") + parser.add_argument("gff3", type=argparse.FileType("r"), help="GFF3 annotations") + args = parser.parse_args() + gff_filter(**vars(args)) |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/gff3_add_parents_to_cds.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/gff3_add_parents_to_cds.xml Fri May 13 04:54:17 2022 +0000 |
[ |
@@ -0,0 +1,50 @@ +<?xml version="1.0"?> +<tool id="edu.tamu.cpt.gff3.cdsParents" name="GFF3 Add Gene to CDS" version="19.1.0.0"> + <description>is one step of fixing a gene model--adding parent gene features to CDSs</description> + <macros> + <import>macros.xml</import> + <import>cpt-macros.xml</import> + </macros> + <expand macro="requirements"/> + <command detect_errors="aggressive"><![CDATA[ +$__tool_directory__/gff3_add_parents_to_cds.py +@INPUT_GFF@ +> $output]]></command> + <inputs> + <expand macro="gff3_input" /> + </inputs> + <outputs> + <data format="gff3" name="output"/> + </outputs> + <tests> + <test> + <param name="gff3_data" value="T7_AddParentIn.gff3" /> + <output name="output"> + <assert_contents> + <has_line line="##gff-version 3"/> + <has_n_lines n="10105" /> + </assert_contents> + </output> + </test> + <test> + <param name="gff3_data" value="Miro_AddParentIn.gff3" /> + <output name="output"> + <assert_contents> + <has_line line="##gff-version 3"/> + <has_n_lines n="829" /> + </assert_contents> + </output> + </test> + </tests> + <help><![CDATA[ +**What it does** + +This tool updates the gene model in a GFF3, useful when a nonstandard gene model +has been applied. It finds all CDS features, **strips their parent features**, +then applies a gene-mRNA-CDS model, compliant with the standard GFF3 format. + +Warning: Use this tool only when it is absolutely necessary to fix a gene model. + + ]]></help> + <expand macro="citations" /> +</tool> |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/macros.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/macros.xml Fri May 13 04:54:17 2022 +0000 |
b |
@@ -0,0 +1,85 @@ +<?xml version="1.0"?> +<macros> + <xml name="requirements"> + <requirements> + <requirement type="package" version="3.6">python</requirement> + <requirement type="package" version="1.77">biopython</requirement> + <requirement type="package" version="1.1.3">cpt_gffparser</requirement> + <yield/> + </requirements> + </xml> + <token name="@BLAST_TSV@"> + "$blast_tsv" + </token> + <xml name="blast_tsv"> + <param label="Blast Results" help="TSV/tabular (25 Column)" + name="blast_tsv" type="data" format="tabular" /> + </xml> + + <token name="@BLAST_XML@"> + "$blast_xml" + </token> + <xml name="blast_xml"> + <param label="Blast Results" help="XML format" + name="blast_xml" type="data" format="blastxml" /> + </xml> + <xml name="gff3_with_fasta"> + <param label="Genome Sequences" name="fasta" type="data" format="fasta" /> + <param label="Genome Annotations" name="gff3" type="data" format="gff3" /> + </xml> + <xml name="genome_selector"> + <conditional name="reference_genome"> + <param name="reference_genome_source" type="select" label="Reference Genome"> + <option value="history" selected="True">From History</option> + <option value="cached">Locally Cached</option> + </param> + <when value="cached"> + <param name="fasta_indexes" type="select" label="Source FASTA Sequence"> + <options from_data_table="all_fasta"/> + </param> + </when> + <when value="history"> + <param name="genome_fasta" type="data" format="fasta" label="Source FASTA Sequence"/> + </when> + </conditional> + </xml> + <xml name="gff3_input"> + <param label="GFF3 Annotations" name="gff3_data" type="data" format="gff3"/> + </xml> + <xml name="input/gff3+fasta"> + <expand macro="gff3_input" /> + <expand macro="genome_selector" /> + </xml> + <token name="@INPUT_GFF@"> + "$gff3_data" + </token> + <token name="@INPUT_FASTA@"> +#if str($reference_genome.reference_genome_source) == 'cached': + "${reference_genome.fasta_indexes.fields.path}" +#else if str($reference_genome.reference_genome_source) == 'history': + genomeref.fa +#end if + </token> + <token name="@GENOME_SELECTOR_PRE@"> +#if $reference_genome.reference_genome_source == 'history': + ln -s $reference_genome.genome_fasta genomeref.fa; +#end if + </token> + <token name="@GENOME_SELECTOR@"> +#if str($reference_genome.reference_genome_source) == 'cached': + "${reference_genome.fasta_indexes.fields.path}" +#else if str($reference_genome.reference_genome_source) == 'history': + genomeref.fa +#end if + </token> + <xml name="input/fasta"> + <param label="Fasta file" name="sequences" type="data" format="fasta"/> + </xml> + + <token name="@SEQUENCE@"> + "$sequences" + </token> + <xml name="input/fasta/protein"> + <param label="Protein fasta file" name="sequences" type="data" format="fasta"/> + </xml> +</macros> |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/test-data/Miro_AddParentIn.gff3 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/test-data/Miro_AddParentIn.gff3 Fri May 13 04:54:17 2022 +0000 |
b |
b'@@ -0,0 +1,827 @@\n+##gff-version 3\n+##sequence-region Miro 1 176055\n+Miro\tfeature\tgene\t7454\t7906\t.\t-\t.\tID=Miro_8\n+Miro\tGenBank\tCDS\t7454\t7894\t.\t-\t1\tID=Miro_8.CDS;Name=Miro_8;Parent=Miro_8;obsolete_name=Miro_156;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t7903\t7906\t.\t-\t1\tAlias=Miro_8;ID=Miro_8.RBS;Name=Miro_8;Parent=Miro_8\n+Miro\tfeature\tgene\t7917\t8512\t.\t-\t.\tID=Miro_9\n+Miro\tGenBank\tCDS\t7917\t8501\t.\t-\t1\tID=Miro_9.CDS;Name=Miro_9;Parent=Miro_9;obsolete_name=Miro_155;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t8509\t8512\t.\t-\t1\tAlias=Miro_9;ID=Miro_9.RBS;Name=Miro_9;Parent=Miro_9\n+Miro\tfeature\tgene\t123276\t124212\t.\t+\t.\tID=Miro_206\n+Miro\tGenBank\tCDS\t123286\t124212\t.\t+\t1\tAlias=Miro_206;ID=Miro_206.CDS;Name=Miro_206;Parent=Miro_206;obsolete_name=Miro_234;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t123276\t123279\t.\t+\t1\tID=Miro_206.rbs;Name=Miro_206;Parent=Miro_206\n+Miro\tfeature\tgene\t68490\t70715\t.\t-\t.\tID=Miro_117\n+Miro\tGenBank\tCDS\t68490\t70706\t.\t-\t1\tID=Miro_117.CDS;Name=Miro_117;Note=contains von Willebrand factor%2C type A;Parent=Miro_117;obsolete_name=Miro_047;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t70713\t70715\t.\t-\t1\tAlias=Miro_117;ID=Miro_117.RBS;Name=Miro_117;Parent=Miro_117\n+Miro\tfeature\tgene\t115729\t116735\t.\t+\t.\tID=Miro_200\n+Miro\tGenBank\tCDS\t115743\t116735\t.\t+\t1\tAlias=Miro_200;ID=Miro_200.CDS;Name=Miro_200;Note=T4 gp6-like;Parent=Miro_200;obsolete_name=Miro_240;product=baseplate structural protein\n+Miro\tGenBank\tShine_Dalgarno_sequence\t115729\t115732\t.\t+\t1\tID=Miro_200.RBS;Name=Miro_200;Parent=Miro_200\n+Miro\tfeature\tgene\t116735\t117608\t.\t+\t.\tID=Miro_201\n+Miro\tGenBank\tCDS\t116745\t117608\t.\t+\t1\tAlias=Miro_201;ID=Miro_201.CDS;Name=Miro_201;Note=T4 gp9/gp10-like;Parent=Miro_201;obsolete_name=Miro_239;product=baseplate structural protein\n+Miro\tGenBank\tShine_Dalgarno_sequence\t116735\t116738\t.\t+\t1\tID=Miro_201.RBS;Name=Miro_201;Parent=Miro_201\n+Miro\tfeature\tgene\t117595\t119422\t.\t+\t.\tID=Miro_202\n+Miro\tGenBank\tCDS\t117605\t119422\t.\t+\t1\tAlias=Miro_202;ID=Miro_202.CDS;Name=Miro_202;Note=T4 gp9/gp10-like;Parent=Miro_202;obsolete_name=Miro_238;product=baseplate structural protein\n+Miro\tGenBank\tShine_Dalgarno_sequence\t117595\t117597\t.\t+\t1\tID=Miro_202.RBS;Name=Miro_202;Parent=Miro_202\n+Miro\tfeature\tgene\t119412\t120090\t.\t+\t.\tID=Miro_203\n+Miro\tGenBank\tCDS\t119422\t120090\t.\t+\t1\tAlias=Miro_203;ID=Miro_203.CDS;Name=Miro_203;Note=T4 gp11-like;Parent=Miro_203;obsolete_name=Miro_237;product=baseplate to short tail fiber connector protein\n+Miro\tGenBank\tShine_Dalgarno_sequence\t119412\t119415\t.\t+\t1\tID=Miro_203.RBS;Name=Miro_203;Parent=Miro_203\n+Miro\tfeature\tgene\t81829\t81940\t.\t-\t.\tID=Miro_142\n+Miro\tGenBank\tCDS\t81829\t81927\t.\t-\t1\tID=Miro_142.CDS;Name=Miro_142;Parent=Miro_142;obsolete_name=Miro_022;product=hypothetical conserved;tmhelix=1 TMD %284-26%29 N out%2C C in\n+Miro\tGenBank\tShine_Dalgarno_sequence\t81938\t81940\t.\t-\t1\tAlias=Miro_142;ID=Miro_142.RBS;Name=Miro_142;Parent=Miro_142\n+Miro\tfeature\tgene\t1\t910\t.\t-\t.\tID=Miro_1\n+Miro\tGenBank\tCDS\t1\t900\t.\t-\t1\tID=Miro_1.CDS;Name=Miro_1;Parent=Miro_1;obsolete_name=Miro_163;product=rIIb\n+Miro\tGenBank\tShine_Dalgarno_sequence\t908\t910\t.\t-\t1\tAlias=Miro_1;ID=Miro_1.RBS;Name=Miro_1;Parent=Miro_1\n+Miro\tfeature\tgene\t900\t3173\t.\t-\t.\tID=Miro_2\n+Miro\tGenBank\tCDS\t900\t3161\t.\t-\t1\tID=Miro_2.CDS;Name=Miro_2;Parent=Miro_2;obsolete_name=Miro_162;product=rIIa\n+Miro\tGenBank\tShine_Dalgarno_sequence\t3171\t3173\t.\t-\t1\tAlias=Miro_2;ID=Miro_2.RBS;Name=Miro_2;Parent=Miro_2\n+Miro\tfeature\tgene\t3172\t3417\t.\t-\t.\tID=Miro_3\n+Miro\tGenBank\tCDS\t3172\t3408\t.\t-\t1\tID=Miro_3.CDS;Name=Miro_3;Parent=Miro_3;obsolete_name=Miro_161;product=hypothetical conserved;tmhelix=1 TMD %2812-34%29 N in%2C C out\n+Miro\tGenBank\tShine_Dalgarno_sequence\t3414\t3417\t.\t-\t1\tAlias=Miro_3;ID=Miro_3.RBS;Name=Miro_3;Parent=Miro_3\n+Miro\tfeature\tgene\t3412\t3979\t.\t-\t.\tID=Miro_4\n+Miro\tGenBank\tCDS\t3412\t3966\t.\t-\t1\tID=Miro_4.CDS;Name=Miro_4;Note=contains SprT domain;Parent=Miro_4;obsolete_name=Miro_160;product=hypothetical'..b't=Miro_98;obsolete_name=Miro_066;product=hypothetical conserved;tmhelix=2TMDs %287-26%2C 31-53%29 N in%2C C in\n+Miro\tGenBank\tShine_Dalgarno_sequence\t57368\t57372\t.\t+\t1\tID=Miro_98.RBS;Name=Miro_98;Parent=Miro_98\n+Miro\tfeature\tgene\t57613\t57914\t.\t+\t.\tID=Miro_99\n+Miro\tGenBank\tCDS\t57624\t57914\t.\t+\t1\tAlias=Miro_99;ID=Miro_99.CDS;Name=Miro_99;Parent=Miro_99;obsolete_name=Miro_065;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t57613\t57616\t.\t+\t1\tID=Miro_99.RBS;Name=Miro_99;Parent=Miro_99\n+Miro\tfeature\tgene\t81924\t82086\t.\t-\t.\tID=Miro_143\n+Miro\tGenBank\tCDS\t81924\t82079\t.\t-\t1\tID=Miro_143.CDS;Name=Miro_143;Parent=Miro_143;obsolete_name=Miro_021;product=hypothetical conserved;tmhelix=1 TMD %2815-37%29 N out%2C C in\n+Miro\tGenBank\tShine_Dalgarno_sequence\t82084\t82086\t.\t-\t1\tAlias=Miro_143;ID=Miro_143.RBS;Name=Miro_143;Parent=Miro_143\n+Miro\tfeature\tgene\t67179\t67658\t.\t-\t.\tID=Miro_114\n+Miro\tGenBank\tCDS\t67179\t67649\t.\t-\t1\tID=Miro_114.CDS;Name=Miro_114;Parent=Miro_114;obsolete_name=Miro_050;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t67656\t67658\t.\t-\t1\tAlias=Miro_114;ID=Miro_114.RBS;Name=Miro_114;Parent=Miro_114\n+Miro\tfeature\tgene\t81366\t81851\t.\t-\t.\tID=Miro_141\n+Miro\tGenBank\tCDS\t81366\t81839\t.\t-\t1\tID=Miro_141.CDS;Name=Miro_141;Note=contains macro domain;Parent=Miro_141;obsolete_name=Miro_023;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t81849\t81851\t.\t-\t1\tAlias=Miro_141;ID=Miro_141.RBS;Name=Miro_141;Parent=Miro_141\n+Miro\tfeature\tgene\t81076\t81376\t.\t-\t.\tID=Miro_140\n+Miro\tGenBank\tCDS\t81076\t81363\t.\t-\t1\tID=Miro_140.CDS;Name=Miro_140;Parent=Miro_140;obsolete_name=Miro_024;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t81374\t81376\t.\t-\t1\tAlias=Miro_140;ID=Miro_140.RBS;Name=Miro_140;Parent=Miro_140\n+Miro\tfeature\tgene\t83223\t83630\t.\t-\t.\tID=Miro_147\n+Miro\tGenBank\tCDS\t83223\t83618\t.\t-\t1\tID=Miro_147.CDS;Name=Miro_147;Parent=Miro_147;obsolete_name=Miro_017;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t83627\t83630\t.\t-\t1\tAlias=Miro_147;ID=Miro_147.RBS;Name=Miro_147;Parent=Miro_147\n+Miro\tfeature\tgene\t83066\t83224\t.\t-\t.\tID=Miro_146\n+Miro\tGenBank\tCDS\t83066\t83212\t.\t-\t1\tID=Miro_146.CDS;Name=Miro_146;Parent=Miro_146;obsolete_name=Miro_018;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t83221\t83224\t.\t-\t1\tAlias=Miro_146;ID=Miro_146.RBS;Name=Miro_146;Parent=Miro_146\n+Miro\tfeature\tgene\t82479\t83083\t.\t-\t.\tID=Miro_145\n+Miro\tGenBank\tCDS\t82479\t83069\t.\t-\t1\tID=Miro_145.CDS;Name=Miro_145;Parent=Miro_145;obsolete_name=Miro_019;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t83080\t83083\t.\t-\t1\tAlias=Miro_145;ID=Miro_145.RBS;Name=Miro_145;Parent=Miro_145\n+Miro\tfeature\tgene\t67646\t67816\t.\t-\t.\tID=Miro_115\n+Miro\tGenBank\tCDS\t67646\t67804\t.\t-\t1\tID=Miro_115.CDS;Name=Miro_115;Parent=Miro_115;obsolete_name=Miro_049;product=hypothetical conserved;tmhelix=2TMDs %282-21%2C 31-50%29 N in%2C C in\n+Miro\tGenBank\tShine_Dalgarno_sequence\t67814\t67816\t.\t-\t1\tAlias=Miro_115;ID=Miro_115.RBS;Name=Miro_115;Parent=Miro_115\n+Miro\tfeature\tgene\t84392\t84959\t.\t-\t.\tID=Miro_149\n+Miro\tGenBank\tCDS\t84392\t84946\t.\t-\t1\tID=Miro_149.CDS;Name=Miro_149;Parent=Miro_149;obsolete_name=Miro_015;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t84955\t84959\t.\t-\t1\tAlias=Miro_149;ID=Miro_149.RBS;Name=Miro_149;Parent=Miro_149\n+Miro\tfeature\tgene\t83686\t84337\t.\t-\t.\tID=Miro_148\n+Miro\tGenBank\tCDS\t83686\t84327\t.\t-\t1\tID=Miro_148.CDS;Name=Miro_148;Note=T4 RegB-like;Parent=Miro_148;obsolete_name=Miro_016;product=endoribonuclease;signal=signal peptidase II cleavage site 12-13\n+Miro\tGenBank\tShine_Dalgarno_sequence\t84334\t84337\t.\t-\t1\tAlias=Miro_148;ID=Miro_148.RBS;Name=Miro_148;Parent=Miro_148\n+Miro\tfeature\tgene\t67801\t68461\t.\t-\t.\tID=Miro_116\n+Miro\tGenBank\tCDS\t67801\t68451\t.\t-\t1\tID=Miro_116.CDS;Name=Miro_116;Parent=Miro_116;obsolete_name=Miro_048;product=hypothetical conserved\n+Miro\tGenBank\tShine_Dalgarno_sequence\t68457\t68461\t.\t-\t1\tAlias=Miro_116;ID=Miro_116.RBS;Name=Miro_116;Parent=Miro_116\n' |
b |
diff -r 000000000000 -r 60651e90119a cpt_gff_add_parent/test-data/T7_AddParentIn.gff3 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpt_gff_add_parent/test-data/T7_AddParentIn.gff3 Fri May 13 04:54:17 2022 +0000 |
b |
b'@@ -0,0 +1,3369 @@\n+##gff-version 3\n+NC_001604\tgetOrfsOrCds\tCDS\t481\t600\t.\t+\t0\tID=ORF.0.1\n+NC_001604\tgetOrfsOrCds\tCDS\t925\t1278\t.\t+\t0\tID=ORF.0.2\n+NC_001604\tgetOrfsOrCds\tCDS\t931\t1278\t.\t+\t0\tID=ORF.0.3\n+NC_001604\tgetOrfsOrCds\tCDS\t940\t1278\t.\t+\t0\tID=ORF.0.4\n+NC_001604\tgetOrfsOrCds\tCDS\t976\t1278\t.\t+\t0\tID=ORF.0.5\n+NC_001604\tgetOrfsOrCds\tCDS\t979\t1278\t.\t+\t0\tID=ORF.0.6\n+NC_001604\tgetOrfsOrCds\tCDS\t991\t1278\t.\t+\t0\tID=ORF.0.7\n+NC_001604\tgetOrfsOrCds\tCDS\t1006\t1278\t.\t+\t0\tID=ORF.0.8\n+NC_001604\tgetOrfsOrCds\tCDS\t1024\t1278\t.\t+\t0\tID=ORF.0.9\n+NC_001604\tgetOrfsOrCds\tCDS\t1036\t1278\t.\t+\t0\tID=ORF.0.10\n+NC_001604\tgetOrfsOrCds\tCDS\t1042\t1278\t.\t+\t0\tID=ORF.0.11\n+NC_001604\tgetOrfsOrCds\tCDS\t1081\t1278\t.\t+\t0\tID=ORF.0.12\n+NC_001604\tgetOrfsOrCds\tCDS\t1093\t1278\t.\t+\t0\tID=ORF.0.13\n+NC_001604\tgetOrfsOrCds\tCDS\t1108\t1278\t.\t+\t0\tID=ORF.0.14\n+NC_001604\tgetOrfsOrCds\tCDS\t1135\t1278\t.\t+\t0\tID=ORF.0.15\n+NC_001604\tgetOrfsOrCds\tCDS\t1138\t1278\t.\t+\t0\tID=ORF.0.16\n+NC_001604\tgetOrfsOrCds\tCDS\t1159\t1278\t.\t+\t0\tID=ORF.0.17\n+NC_001604\tgetOrfsOrCds\tCDS\t1165\t1278\t.\t+\t0\tID=ORF.0.18\n+NC_001604\tgetOrfsOrCds\tCDS\t1168\t1278\t.\t+\t0\tID=ORF.0.19\n+NC_001604\tgetOrfsOrCds\tCDS\t1180\t1278\t.\t+\t0\tID=ORF.0.20\n+NC_001604\tgetOrfsOrCds\tCDS\t1318\t1413\t.\t+\t0\tID=ORF.0.21\n+NC_001604\tgetOrfsOrCds\tCDS\t1549\t1797\t.\t+\t0\tID=ORF.0.22\n+NC_001604\tgetOrfsOrCds\tCDS\t1597\t1797\t.\t+\t0\tID=ORF.0.23\n+NC_001604\tgetOrfsOrCds\tCDS\t1636\t1797\t.\t+\t0\tID=ORF.0.24\n+NC_001604\tgetOrfsOrCds\tCDS\t1639\t1797\t.\t+\t0\tID=ORF.0.25\n+NC_001604\tgetOrfsOrCds\tCDS\t1654\t1797\t.\t+\t0\tID=ORF.0.26\n+NC_001604\tgetOrfsOrCds\tCDS\t1660\t1797\t.\t+\t0\tID=ORF.0.27\n+NC_001604\tgetOrfsOrCds\tCDS\t1708\t1797\t.\t+\t0\tID=ORF.0.28\n+NC_001604\tgetOrfsOrCds\tCDS\t1834\t1998\t.\t+\t0\tID=ORF.0.29\n+NC_001604\tgetOrfsOrCds\tCDS\t1864\t1998\t.\t+\t0\tID=ORF.0.30\n+NC_001604\tgetOrfsOrCds\tCDS\t3286\t3414\t.\t+\t0\tID=ORF.0.31\n+NC_001604\tgetOrfsOrCds\tCDS\t3292\t3414\t.\t+\t0\tID=ORF.0.32\n+NC_001604\tgetOrfsOrCds\tCDS\t3310\t3414\t.\t+\t0\tID=ORF.0.33\n+NC_001604\tgetOrfsOrCds\tCDS\t3604\t3693\t.\t+\t0\tID=ORF.0.34\n+NC_001604\tgetOrfsOrCds\tCDS\t3892\t3987\t.\t+\t0\tID=ORF.0.35\n+NC_001604\tgetOrfsOrCds\tCDS\t4279\t4488\t.\t+\t0\tID=ORF.0.36\n+NC_001604\tgetOrfsOrCds\tCDS\t4282\t4488\t.\t+\t0\tID=ORF.0.37\n+NC_001604\tgetOrfsOrCds\tCDS\t4306\t4488\t.\t+\t0\tID=ORF.0.38\n+NC_001604\tgetOrfsOrCds\tCDS\t4309\t4488\t.\t+\t0\tID=ORF.0.39\n+NC_001604\tgetOrfsOrCds\tCDS\t4315\t4488\t.\t+\t0\tID=ORF.0.40\n+NC_001604\tgetOrfsOrCds\tCDS\t4318\t4488\t.\t+\t0\tID=ORF.0.41\n+NC_001604\tgetOrfsOrCds\tCDS\t4363\t4488\t.\t+\t0\tID=ORF.0.42\n+NC_001604\tgetOrfsOrCds\tCDS\t4375\t4488\t.\t+\t0\tID=ORF.0.43\n+NC_001604\tgetOrfsOrCds\tCDS\t4387\t4488\t.\t+\t0\tID=ORF.0.44\n+NC_001604\tgetOrfsOrCds\tCDS\t4393\t4488\t.\t+\t0\tID=ORF.0.45\n+NC_001604\tgetOrfsOrCds\tCDS\t4561\t4749\t.\t+\t0\tID=ORF.0.46\n+NC_001604\tgetOrfsOrCds\tCDS\t4570\t4749\t.\t+\t0\tID=ORF.0.47\n+NC_001604\tgetOrfsOrCds\tCDS\t4576\t4749\t.\t+\t0\tID=ORF.0.48\n+NC_001604\tgetOrfsOrCds\tCDS\t4582\t4749\t.\t+\t0\tID=ORF.0.49\n+NC_001604\tgetOrfsOrCds\tCDS\t4597\t4749\t.\t+\t0\tID=ORF.0.50\n+NC_001604\tgetOrfsOrCds\tCDS\t4615\t4749\t.\t+\t0\tID=ORF.0.51\n+NC_001604\tgetOrfsOrCds\tCDS\t4834\t4953\t.\t+\t0\tID=ORF.0.52\n+NC_001604\tgetOrfsOrCds\tCDS\t4861\t4953\t.\t+\t0\tID=ORF.0.53\n+NC_001604\tgetOrfsOrCds\tCDS\t4966\t5058\t.\t+\t0\tID=ORF.0.54\n+NC_001604\tgetOrfsOrCds\tCDS\t5467\t5556\t.\t+\t0\tID=ORF.0.55\n+NC_001604\tgetOrfsOrCds\tCDS\t5626\t5781\t.\t+\t0\tID=ORF.0.56\n+NC_001604\tgetOrfsOrCds\tCDS\t5632\t5781\t.\t+\t0\tID=ORF.0.57\n+NC_001604\tgetOrfsOrCds\tCDS\t5668\t5781\t.\t+\t0\tID=ORF.0.58\n+NC_001604\tgetOrfsOrCds\tCDS\t5677\t5781\t.\t+\t0\tID=ORF.0.59\n+NC_001604\tgetOrfsOrCds\tCDS\t5686\t5781\t.\t+\t0\tID=ORF.0.60\n+NC_001604\tgetOrfsOrCds\tCDS\t5689\t5781\t.\t+\t0\tID=ORF.0.61\n+NC_001604\tgetOrfsOrCds\tCDS\t6007\t6135\t.\t+\t0\tID=ORF.0.62\n+NC_001604\tgetOrfsOrCds\tCDS\t6025\t6135\t.\t+\t0\tID=ORF.0.63\n+NC_001604\tgetOrfsOrCds\tCDS\t6466\t7554\t.\t+\t0\tID=ORF.0.64\n+NC_001604\tgetOrfsOrCds\tCDS\t6472\t7554\t.\t+\t0\tID=ORF.0.65\n+NC_001604\tgetOrfsOrCds\tCDS\t6475\t7554\t.\t+\t0\tID=ORF.0.66\n+NC_001604\tgetOrfsOrCds\tCDS\t6478\t7554\t.\t+\t0\tID=ORF.0.67\n+NC_001604\tgetOrfsOrCds\tCDS\t6484\t7554\t.\t+\t0\tID=ORF.0.68\n+NC_001604\tgetOrfsOrCds\tCDS\t6508\t7554\t.\t+\t0\tID=ORF.0.69\n+NC_001604\tgetOrfsOrCds\tCDS\t6529\t7554\t.\t+\t0\tID=ORF.0.70\n+NC_001604\tgetOrfsOrCds\tCDS\t6541\t7554\t.\t+\t0\tID=ORF.0.71\n+NC_'..b'F.0.3299\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5714\t.\t-\t0\tID=ORF.0.3300\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5702\t.\t-\t0\tID=ORF.0.3301\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5690\t.\t-\t0\tID=ORF.0.3302\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5678\t.\t-\t0\tID=ORF.0.3303\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5603\t.\t-\t0\tID=ORF.0.3304\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5567\t.\t-\t0\tID=ORF.0.3305\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5540\t.\t-\t0\tID=ORF.0.3306\n+NC_001604\tgetOrfsOrCds\tCDS\t5439\t5528\t.\t-\t0\tID=ORF.0.3307\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5432\t.\t-\t0\tID=ORF.0.3308\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5402\t.\t-\t0\tID=ORF.0.3309\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5381\t.\t-\t0\tID=ORF.0.3310\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5363\t.\t-\t0\tID=ORF.0.3311\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5348\t.\t-\t0\tID=ORF.0.3312\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5306\t.\t-\t0\tID=ORF.0.3313\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5186\t.\t-\t0\tID=ORF.0.3314\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5183\t.\t-\t0\tID=ORF.0.3315\n+NC_001604\tgetOrfsOrCds\tCDS\t5067\t5177\t.\t-\t0\tID=ORF.0.3316\n+NC_001604\tgetOrfsOrCds\tCDS\t4914\t5027\t.\t-\t0\tID=ORF.0.3317\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4874\t.\t-\t0\tID=ORF.0.3318\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4826\t.\t-\t0\tID=ORF.0.3319\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4805\t.\t-\t0\tID=ORF.0.3320\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4802\t.\t-\t0\tID=ORF.0.3321\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4754\t.\t-\t0\tID=ORF.0.3322\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4742\t.\t-\t0\tID=ORF.0.3323\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4739\t.\t-\t0\tID=ORF.0.3324\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4736\t.\t-\t0\tID=ORF.0.3325\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4688\t.\t-\t0\tID=ORF.0.3326\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4685\t.\t-\t0\tID=ORF.0.3327\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4628\t.\t-\t0\tID=ORF.0.3328\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4583\t.\t-\t0\tID=ORF.0.3329\n+NC_001604\tgetOrfsOrCds\tCDS\t4458\t4559\t.\t-\t0\tID=ORF.0.3330\n+NC_001604\tgetOrfsOrCds\tCDS\t4173\t4403\t.\t-\t0\tID=ORF.0.3331\n+NC_001604\tgetOrfsOrCds\tCDS\t4173\t4388\t.\t-\t0\tID=ORF.0.3332\n+NC_001604\tgetOrfsOrCds\tCDS\t4173\t4382\t.\t-\t0\tID=ORF.0.3333\n+NC_001604\tgetOrfsOrCds\tCDS\t4173\t4280\t.\t-\t0\tID=ORF.0.3334\n+NC_001604\tgetOrfsOrCds\tCDS\t3855\t4142\t.\t-\t0\tID=ORF.0.3335\n+NC_001604\tgetOrfsOrCds\tCDS\t3855\t4070\t.\t-\t0\tID=ORF.0.3336\n+NC_001604\tgetOrfsOrCds\tCDS\t3855\t4028\t.\t-\t0\tID=ORF.0.3337\n+NC_001604\tgetOrfsOrCds\tCDS\t3855\t3977\t.\t-\t0\tID=ORF.0.3338\n+NC_001604\tgetOrfsOrCds\tCDS\t3546\t3722\t.\t-\t0\tID=ORF.0.3339\n+NC_001604\tgetOrfsOrCds\tCDS\t3546\t3698\t.\t-\t0\tID=ORF.0.3340\n+NC_001604\tgetOrfsOrCds\tCDS\t3546\t3677\t.\t-\t0\tID=ORF.0.3341\n+NC_001604\tgetOrfsOrCds\tCDS\t3546\t3653\t.\t-\t0\tID=ORF.0.3342\n+NC_001604\tgetOrfsOrCds\tCDS\t3399\t3491\t.\t-\t0\tID=ORF.0.3343\n+NC_001604\tgetOrfsOrCds\tCDS\t3264\t3368\t.\t-\t0\tID=ORF.0.3344\n+NC_001604\tgetOrfsOrCds\tCDS\t3111\t3251\t.\t-\t0\tID=ORF.0.3345\n+NC_001604\tgetOrfsOrCds\tCDS\t2496\t2600\t.\t-\t0\tID=ORF.0.3346\n+NC_001604\tgetOrfsOrCds\tCDS\t1779\t2021\t.\t-\t0\tID=ORF.0.3347\n+NC_001604\tgetOrfsOrCds\tCDS\t1779\t1991\t.\t-\t0\tID=ORF.0.3348\n+NC_001604\tgetOrfsOrCds\tCDS\t1779\t1979\t.\t-\t0\tID=ORF.0.3349\n+NC_001604\tgetOrfsOrCds\tCDS\t1779\t1976\t.\t-\t0\tID=ORF.0.3350\n+NC_001604\tgetOrfsOrCds\tCDS\t1779\t1943\t.\t-\t0\tID=ORF.0.3351\n+NC_001604\tgetOrfsOrCds\tCDS\t1647\t1769\t.\t-\t0\tID=ORF.0.3352\n+NC_001604\tgetOrfsOrCds\tCDS\t1647\t1766\t.\t-\t0\tID=ORF.0.3353\n+NC_001604\tgetOrfsOrCds\tCDS\t1647\t1760\t.\t-\t0\tID=ORF.0.3354\n+NC_001604\tgetOrfsOrCds\tCDS\t1647\t1757\t.\t-\t0\tID=ORF.0.3355\n+NC_001604\tgetOrfsOrCds\tCDS\t1647\t1748\t.\t-\t0\tID=ORF.0.3356\n+NC_001604\tgetOrfsOrCds\tCDS\t1182\t1331\t.\t-\t0\tID=ORF.0.3357\n+NC_001604\tgetOrfsOrCds\tCDS\t1182\t1316\t.\t-\t0\tID=ORF.0.3358\n+NC_001604\tgetOrfsOrCds\tCDS\t1182\t1298\t.\t-\t0\tID=ORF.0.3359\n+NC_001604\tgetOrfsOrCds\tCDS\t1071\t1181\t.\t-\t0\tID=ORF.0.3360\n+NC_001604\tgetOrfsOrCds\tCDS\t1071\t1166\t.\t-\t0\tID=ORF.0.3361\n+NC_001604\tgetOrfsOrCds\tCDS\t1071\t1160\t.\t-\t0\tID=ORF.0.3362\n+NC_001604\tgetOrfsOrCds\tCDS\t627\t824\t.\t-\t0\tID=ORF.0.3363\n+NC_001604\tgetOrfsOrCds\tCDS\t627\t785\t.\t-\t0\tID=ORF.0.3364\n+NC_001604\tgetOrfsOrCds\tCDS\t627\t761\t.\t-\t0\tID=ORF.0.3365\n+NC_001604\tgetOrfsOrCds\tCDS\t627\t749\t.\t-\t0\tID=ORF.0.3366\n+NC_001604\tgetOrfsOrCds\tCDS\t627\t734\t.\t-\t0\tID=ORF.0.3367\n+NC_001604\tgetOrfsOrCds\tCDS\t474\t608\t.\t-\t0\tID=ORF.0.3368\n' |