Previous changeset 2:89be6bd55b4c (2015-02-21) Next changeset 4:47d1b27466ee (2015-02-21) |
Commit message:
Uploaded |
added:
gbk2rdf/gbktordf.py gbk2rdf/gbktordf.xml gbk2rdf/test-data/NC_010067.gbk |
removed:
gbk2rdf.zip |
b |
diff -r 89be6bd55b4c -r db04e12b8779 gbk2rdf.zip |
b |
Binary file gbk2rdf.zip has changed |
b |
diff -r 89be6bd55b4c -r db04e12b8779 gbk2rdf/gbktordf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gbk2rdf/gbktordf.py Sat Feb 21 07:28:39 2015 -0500 |
[ |
b'@@ -0,0 +1,371 @@\n+#!/usr/bin/env python3.4\n+# Author: Jasper Jan Koehorst\n+# Date created: Feb 21 2015\n+# Function: generation of a RDF file from Genbank/EMBL\n+\n+import warnings\n+warnings.filterwarnings("ignore")\n+\n+def delete_galaxy():\n+\timport sys\n+\tfor index, path in enumerate(sys.path):\n+\t\tif "galaxy-dist/" in path:\n+\t\t\tsys.path[index] = \'\'\n+\n+#Some modules that are required by RDFLIB are also in galaxy, this messes up the RDF import function. This is not an elegant solution but it works for now.\n+delete_galaxy()\n+\n+from Bio import SeqIO\n+# Import RDFLib\'s default Graph implementation.\n+import os, sys\n+from Bio.Seq import Seq\n+\n+from rdflib import Graph, URIRef, Literal,Namespace,RDF,RDFS,OWL, plugin\n+from rdflib.store import Store\n+import hashlib\n+store = plugin.get(\'IOMemory\', Store)()\n+\n+global URI\n+URI = "http://csb.wur.nl/genome/"\n+global seeAlso\n+seeAlso = "rdfs:seeAlso"\n+global coreURI\n+coreURI = Namespace(URI)\n+\n+global SubClassOfDict\n+SubClassOfDict = {}\n+global SubClassOfDictRna\n+SubClassOfDictRna = {}\n+\n+def createClass(uri, root=True):\n+\tgenomeGraph.add((uri,RDF.type,OWL.Class))\n+\tif root:\n+\t\tgenomeGraph.add((uri,RDFS.subClassOf,OWL.Thing))\n+\treturn uri\n+\n+def tmp():\n+\timport time\n+\tglobal tmpFolder\n+\ttmpFolder = "/tmp/"+str(time.time())+"/"\n+\tos.mkdir(tmpFolder)\n+\n+def cleantmp():\n+\tos.system("ls "+tmpFolder)\n+\tos.system("rm -rf "+tmpFolder)\n+\n+def crawler():\n+\t#From input folder it looks for GBK file (gz files are in progress)\n+\tinput_file = sys.argv[sys.argv.index("-input")+1]\n+\tgbk_parser(input_file)\n+\n+def gbk_parser():\n+\tprevObjStart = -1\n+\tprevObjStop = -1\t\n+\tstore = plugin.get(\'IOMemory\', Store)()\n+\tglobal genomeGraph\n+\tgenomeGraph = Graph(store,URIRef(URI))\n+\tgenomeGraph.bind("ssb",coreURI)\n+\tinput_file = sys.argv[sys.argv.index("-input")+1]\n+\n+\t#CLASS definitions\n+\tgenomeClass = createClass(coreURI["Genome"], root=True)\n+\ttypeClass = createClass(coreURI["DnaObject"], root=True)\n+\tcreateClass(coreURI["Protein"], root=True)\n+\tpubmedClass = createClass(coreURI["Pubmed"], root=True)\n+\tmiscClass = createClass(coreURI["MiscFeature"], root=False)\n+\tcreateClass(coreURI["Feature"], root=True)\n+\tSubClassOfDict["MiscFeature"] = 1\n+\tSubClassOfDictRna["Trna"] = 1\n+\tSubClassOfDictRna["Rrna"] = 1\n+\tSubClassOfDictRna["Tmrna"] = 1\n+\tSubClassOfDictRna["Ncrna"] = 1\n+\n+# \tcodon = "11" #Default initialization if no CDS are present\n+\t##################\n+\tweird_chars = list(\'\'\',./?<>:;"\'|\\}]{[+=_-)(*&^%$#@!\xc2\xb1\xc2\xa7~` \'\'\')\n+\tscaf_value = 0\n+\t#Which files are already done\n+\t########\n+\tformatGBK = sys.argv[sys.argv.index("-format")+1]\n+\tfor record in SeqIO.parse(input_file, formatGBK):\n+\t\t#Read first feature for genome name and information...\n+\t\t#Ignore the empty GBK file due to the lack of features?\n+\n+\t\tfor index, feature in enumerate(record.features):\n+\t\t\tif index == 0:\n+\t\t\t\tif "-identifier" in sys.argv:\n+\t\t\t\t\tgenome = sys.argv[sys.argv.index("-identifier")+1]\n+\t\t\t\telse:\n+\t\t\t\t\ttry:\n+\t\t\t\t\t\tgenome = feature.qualifiers["organism"][0].replace(" ","_")\n+\t\t\t\t\texcept:\n+\t\t\t\t\t\t#BUG: THIS IS A TEMP FIX, USE GALAXY -IDENTIFIER TO CAPTURE THIS\n+\t\t\t\t\t\tgenome = "XNoneX"\n+\t\t\t\tfor char in weird_chars:\n+\t\t\t\t\tgenome = genome.replace(char,"_")\n+\n+\t\t\t\ttry:\n+\t\t\t\t\tgi = record.annotations["gi"]\n+\t\t\t\t\ttyp = str(gi)\n+\t\t\t\texcept:\n+\t\t\t\t\tscaf_value += 1\n+\t\t\t\t\ttyp = "scaffold_"+str(scaf_value)\n+\t\t\t\tgenomeURI = coreURI[genome]\n+\t\t\t\tgbkURI = coreURI[genome + "/" + typ]\n+\t\t\t\t#To contig connection to connect all data to it\n+\t\t\t\tgenomeGraph.add((genomeURI, coreURI["dnaobject"] , gbkURI))\n+\n+\t\t\t\t#General genome features also stored in the class...\n+\t\t\t\tif "genome" in feature.qualifiers:\n+\t\t\t\t\tgenomeGraph.add((genomeURI, coreURI["organism"],Literal(feature.qualifiers["organism"][0])))\n+\t\t\t\tif "strain" in feature.qualifiers:\n+\t\t\t\t\tgenomeGraph.add((genomeURI, coreURI["strain"],Literal(feature.qualifiers["strain"][0])))\n+\t\t\t\tif "taxonomy" in record.annotations:\n+\t\t\t\t\tfor taxon in record.annotations["taxonomy"]:\n+\t\t\t\t\t\tgenomeGraph.add((genomeURI, coreURI["taxonomy"'..b'eature.qualifiers[key]\n+\t\tif key == "translation":\n+\t\t\tpass\n+\t\telif type(values) == list:\n+\t\t\tfor v in values:\n+\t\t\t\tint_add(generalURI,coreURI[key.lower()],v)\n+\t\telse:\n+\t\t\tint_add(generalURI,coreURI[key.lower()],values)\n+\tif feature.type == "CDS":\n+\t\ttry:\n+\t\t\t#Feature is normally submitted to this function\n+\t\t\t#IF a subfeature is submitted it is submitted as a feature\n+\t\t\t#And subfeature variable will contain the superfeature\n+\t\t\tif superfeature:\n+\t\t\t\tcodon = superfeature.qualifiers["transl_table"][0]\n+# \t\t\telse:\n+# \t\t\t\tcodon = subfeature.qualifiers["transl_table"][0]\n+\t\texcept:\n+\t\t\t#Default codon table 11\n+\t\t\tcodon = "11"\n+\t\t#Protein linkage\n+\t\ttranslation = ""\n+\t\ttry:\n+\t\t\ttranslation = feature.qualifiers["translation"][0].strip("*")\n+\t\texcept KeyError:\n+\t\t\t#When protein sequence is not given...\n+\t\t\tif len(feature.location.parts) > 1:\n+\t\t\t\t#Exon boundaries?\n+\t\t\t\tseq = \'\'\n+\t\t\t\tfor loc in feature.location:\n+\t\t\t\t\tseq += record.seq[loc]\n+\t\t\t\tif int(feature.location.strand) == -1:\n+\t\t\t\t\tseq = Seq(seq).complement()\n+\t\t\t\telse:\n+\t\t\t\t\tseq = Seq(seq)\n+\t\t\t\ttranslation = str(seq.translate(feature.qualifiers["transl_table"][0]))\n+\t\t\telif int(feature.location.strand) == -1:\n+\t\t\t\tif str(record.seq[feature.location.nofuzzy_start:feature.location.nofuzzy_end].reverse_complement().translate(codon)).strip("*") != translation:\n+\t\t\t\t\tif len(str(record.seq[feature.location.nofuzzy_start:feature.location.nofuzzy_end])) % 3 == 0:\n+\t\t\t\t\t\ttranslation = str(record.seq[feature.location.nofuzzy_start:feature.location.nofuzzy_end].reverse_complement().translate(codon))\n+\t\t\t\t\telse:\n+\t\t\t\t\t\ttranslation = \'\'\n+\t\t\telif int(feature.location.strand) == +1:\n+\t\t\t\t\tif len(str(record.seq[feature.location.nofuzzy_start:feature.location.nofuzzy_end])) % 3 == 0:\n+\t\t\t\t\t\ttranslation = str(record.seq[feature.location.nofuzzy_start:feature.location.nofuzzy_end].translate(codon))\n+\t\t\t\t\telse:\n+\t\t\t\t\t\ttranslation = \'\'\n+\t\t\t\n+\t\t\tif translation:\n+\t\t\t\ttranslation = list(translation)\n+\t\t\t\ttranslation[0] = "M"\n+\t\t\t\ttranslation = \'\'.join(translation).strip("*")\n+\t\t\t\tif "*" in translation:\n+\t\t\t\t\tpass\t\t\n+\n+\t\ttranslation = translation.encode(\'utf-8\')\n+\t\tmd5_protein = hashlib.md5(translation).hexdigest()\n+\t\tproteinURI = coreURI["protein/"+md5_protein]\n+\t\tgenomeGraph.add((generalURI,coreURI["protein"],proteinURI))\n+\t\tfor key in feature.qualifiers:\n+\t\t\tfor v in feature.qualifiers[key]:\n+\t\t\t\tif key == "translation":\n+\t\t\t\t\tgenomeGraph.add((proteinURI,coreURI["md5"],Literal(md5_protein)))\n+\t\t\t\t\tgenomeGraph.add((proteinURI,coreURI["sequence"],Literal(translation)))\n+\t\t\t\t\tgenomeGraph.add((proteinURI,RDF.type,proteinClass))\n+\t\t\t\telse:\n+\t\t\t\t\tfor v in feature.qualifiers[key]:\n+\t\t\t\t\t\tint_add(generalURI,coreURI[key.lower()],v)\n+\t\n+def int_add(subject, predicate, obj):\n+\ttry:\n+\t\tobject_float = float(obj.replace(\'"\',\'\'))\n+\t\tobject_int = int(obj.replace(\'"\',\'\'))\n+\t\tif object_int == object_float:\n+\t\t\tgenomeGraph.add((subject,predicate,Literal(object_int)))\n+\t\telse:\n+\t\t\tgenomeGraph.add((subject,predicate,Literal(object_float)))\n+\texcept:\n+\t\tgenomeGraph.add((subject,predicate,Literal(obj.replace(\'"\',\'\'))))\n+\t\t\t\t\n+def save():\n+\tdata = genomeGraph.serialize(format=\'turtle\')\n+\topen(sys.argv[sys.argv.index("-output")+1],"wb").write(data)\n+\n+def subClassOfBuilder():\n+\tfor subclass in SubClassOfDict:\n+\t\tgenomeGraph.add((coreURI["Feature"],RDFS.subClassOf,OWL.Thing))\n+\t\tgenomeGraph.add((coreURI[subclass],RDFS.subClassOf,coreURI["Feature"]))\n+\n+def subClassOfBuilderRna():\n+\tfor subclass in SubClassOfDictRna:\n+\t\tgenomeGraph.add((coreURI["Feature"],RDFS.subClassOf,OWL.Thing))\n+\t\tgenomeGraph.add((coreURI["Rna"],RDFS.subClassOf,coreURI["Feature"]))\n+\t\tgenomeGraph.add((coreURI[subclass],RDFS.subClassOf,coreURI["Rna"]))\n+\t\tgenomeGraph.add((coreURI[subclass],RDFS.subClassOf,coreURI["Rna"]))\n+\t\tgenomeGraph.add((coreURI[subclass],RDF.type,OWL.Class))\n+\n+def main():\n+\ttmp()\n+\tgbk_parser()\n+\tsubClassOfBuilder()\n+\tsubClassOfBuilderRna()\n+\tsave()\n+\tcleantmp()\n+\n+if __name__ == "__main__":\n+\tmain()\n\\ No newline at end of file\n' |
b |
diff -r 89be6bd55b4c -r db04e12b8779 gbk2rdf/gbktordf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gbk2rdf/gbktordf.xml Sat Feb 21 07:28:39 2015 -0500 |
b |
@@ -0,0 +1,32 @@ +<tool id="SAPP_genbank_to_ttl" name="EMBL/GBK to RDF" version="0.1"> + <requirements> + <requirement type='package' version="3.4">python</requirement> + <requirement type='package' version="1.0">rdflib</requirement> + </requirements> + <description>Genbank to RDF conversion</description> + <command interpreter="python3.4">gbktordf.py '-input' '$input' -output '$output' -sourcedb "$format" -format "$format"</command> + <inputs> + <param name="input" type="data" format="gbk,gb,genbank" label="Genbank file"/> + <param name="format" type="select" label="EMBL/GBK"> + <option value="genbank" selected="true"> Genbank</option> + <option value="embl"> EMBL </option> + </param> + </inputs> + + <outputs> + <data format="rdf" name="output" label="GBKttl: ${input.name}" /> + </outputs> + + <tests> + <test> + <param name="input" value="test-data/NC_010067.gbk"/> + <output name="$output" file="NC_010067.rdf"/> + <output name="$format" value="genbank"/> + <output name="$sourcedb" value="genbank"/> + </test> + </tests> + + <help> + Genbank or EMBL to RDF conversion + </help> +</tool> |
b |
diff -r 89be6bd55b4c -r db04e12b8779 gbk2rdf/test-data/NC_010067.gbk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gbk2rdf/test-data/NC_010067.gbk Sat Feb 21 07:28:39 2015 -0500 |
b |
b"@@ -0,0 +1,259779 @@\n+LOCUS NC_010067 4600800 bp DNA circular CON 20-AUG-2013\n+DEFINITION Salmonella enterica subsp. arizonae serovar 62:z4,z23:- str.\n+ RSK2980 chromosome, complete genome.\n+ACCESSION NC_010067\n+VERSION NC_010067.1 GI:161501984\n+DBLINK Project: 58191\n+ BioProject: PRJNA58191\n+KEYWORDS .\n+SOURCE Salmonella enterica subsp. arizonae serovar 62:z4,z23:- str.\n+ RSK2980\n+ ORGANISM Salmonella enterica subsp. arizonae serovar 62:z4,z23:- str.\n+ RSK2980\n+ Bacteria; Proteobacteria; Gammaproteobacteria; Enterobacteriales;\n+ Enterobacteriaceae; Salmonella.\n+REFERENCE 1 (bases 1 to 4600800)\n+ CONSRTM NCBI Genome Project\n+ TITLE Direct Submission\n+ JOURNAL Submitted (03-DEC-2007) National Center for Biotechnology\n+ Information, NIH, Bethesda, MD 20894, USA\n+REFERENCE 2 (bases 1 to 4600800)\n+ AUTHORS McClelland,M., Sanderson,E.K., Porwollik,S., Spieth,J.,\n+ Clifton,W.S., Fulton,R., Chunyan,W., Wollam,A., Shah,N., Pepin,K.,\n+ Bhonagiri,V., Nash,W., Johnson,M., Thiruvilangam,P. and Wilson,R.\n+ CONSRTM The Salmonella enterica serovar Arizonae Genome Sequencing Project\n+ TITLE Direct Submission\n+ JOURNAL Submitted (02-NOV-2007) Genetics, Genome Sequencing Center, 4444\n+ Forest Park Parkway, St. Louis, MO 63108, USA\n+COMMENT PROVISIONAL REFSEQ: This record has not yet been subject to final\n+ NCBI review. The reference sequence was derived from CP000880.\n+ Salmonella enterica subspecies IIIa (Arizonae) serovar\n+ 62:z4,z23:--Most bacteria in the species S. enterica belong to one\n+ of seven subspecies; all but subspecies I normally grow only in\n+ cold-blooded animals. Subspecies IIIa (S. Arizonae) is naturally\n+ found in reptiles, but also causes outbreaks of salmonellosis in\n+ turkeys and sheep and can occasionally produce both gastroenteritis\n+ and serious disseminated disease in humans. Many human infections\n+ can be traced to contact with reptiles or ingestion of various\n+ reptile products, particularly from rattlesnakes. Fewer than ten\n+ cases in humans are typically reported in the US each year.\n+ \n+ The strain of S. Arizonae (62:z4,z23:-) being sequenced is\n+ CDC346-86; it was named RSK2980 by R.K. Selander and is strain\n+ SARC5 of the Salmonella Reference C set. This serovar is of\n+ interest because of its taxonomic position. It appears to be the\n+ most divergent subspecies among the S. enterica. It can be obtained\n+ from the American Type Culture Collection as ATCC BAA-731, or the\n+ Salmonella Genetic Stock Centre as SGSC4693. The genome was\n+ sequenced to 8X coverage, using plasmid and fosmid libraries and\n+ was finished to an error rate of less than 1 per 10,000 bases.\n+ Automated annotation was performed and manual annotation will\n+ continue in the labs of Michael McClelland and Kenneth Sanderson.\n+ The National Institute of Allergy and Infectious Diseases (NIAID),\n+ National Institutes of Health (NIH) has funded this project.\n+ \n+ Coding sequences below are predicted using GeneMark v3.3 and\n+ Glimmer2 v2.13.Intergenic regions not spanned by GeneMark and\n+ Glimmer2 were blasted against NCBI's non-redundant (NR) database\n+ and predictions generated based on protein alignments. RNA genes\n+ were determined using tRNAscan-SE 1.23 or Rfam v8.0. This sequence\n+ was finished as follows unless otherwise noted: all regions were\n+ double stranded, sequenced with an alternate chemistries or covered\n+ by high quality data(i.e., phred quality >=30);an attempt was made\n+ "..b'1 acccgtcatc gtatcgtcct tgccgcaacg cttgcggaat ttcttacaca acttaatcct\n+ 4597741 cttctgtaat cgtttgccct gacaggtgtg agagatctct tacaaggtct gtaggagatc\n+ 4597801 gccaggatat cagagaatac ttagctacga ctttctcctg taaatatata taaatcaatc\n+ 4597861 tattaaaata ttatttcgca ctttcatata caaatttact taaggtatcg tctgtaagcg\n+ 4597921 tcttgtaaga caaggtgaaa caggcgattc tatattcatc gacagggagt cgtacaacga\n+ 4597981 agcgaacgtc aggaagatgg cgcttctgca ggacacgcca ggagggcgtt acatggaaag\n+ 4598041 gcttcaggat gaggcaaagt ggaaagcgca ggatgcgtta aaggacacct ccaggacgga\n+ 4598101 gaacgagagc cgattaggat ggtcggcggg tctggatgac cagggacgct tcgggatgaa\n+ 4598161 gctatcacat cggggcgatg tgcgcaggat gcaaacgttc aggatgagca ggccgcaggg\n+ 4598221 tcacaggaaa agttgtcacg gatgagcagg gagcatgaaa agtagctgga atgctgcgaa\n+ 4598281 acgaaccggg agcactgttt atacagtgct cccttttttt gttattcttc gcgccagatt\n+ 4598341 tccattattg aggttcttaa catgacgact catgaccgtg tgcgtcagca gttacatgcg\n+ 4598401 cttgaaacgc tgctgcgtga gcatcatcac tggcggctgg atgcgccgca ggcgcacctg\n+ 4598461 tttaccagca cgcagccgtt ttgtatggat accatggaac cgctggaatg gctgcaatgg\n+ 4598521 gtattgatcc cgcgtatgca taccctgctt gataatgcgc agccgttacc tgaggcgttt\n+ 4598581 gccgtcgccc cttattatga aatggcgctg acggcggatt atccgcagcg ggaagcgatc\n+ 4598641 ctgacggttt tgcaggatct ggatgcgcta tttacccgcg ataaatcctg atgctggaga\n+ 4598701 tcctctatca ggacgcgtgg ctggttgccg ttaataaacc tgcaggctgg cttgttcacc\n+ 4598761 ggagctggct ggatcgcgac gaaaaagttg tggtcatgca aacggtgcgc gaccaaatcg\n+ 4598821 gccagcatgt ttttaccgcc caccgtctcg acagacccac atcgggcgta ctactgatgg\n+ 4598881 ggctgtccag cgaagcggga cgccgcctgg cgcagcagtt cgagcagcac catatccgta\n+ 4598941 aacgttacca tgccatagtg cgcggctggc tgatggatga tgcgctactg gattatcctc\n+ 4599001 tgctggaaga gcgcgataaa attgccgata agttcgcgcg tgaggataaa gcgccccagc\n+ 4599061 cagccgtaac gcagtatcgc gggctggcga cggtcgaaat ggcagtgccg accgggcgtt\n+ 4599121 atcccactac gcgttatggc ctggttgagc tggaaccgaa aacggggcgc aaacaccagc\n+ 4599181 tccgccgtca tctggcgcat ctacgccatc ctatcatcgg cgacagtaaa cacggtgatt\n+ 4599241 tgcggcaaaa ccgtagcgcg gcggaacatt ttgcttgtcg tcgcctgatg cttcatgcca\n+ 4599301 gtcggcttga actgacgcat cccttcaccg gacagccatt aattattcag gccggactgg\n+ 4599361 atgaaacctg gatgcaggcg ctaacacagt ttggctggcg gggacttctc cctgataatg\n+ 4599421 aaagggttga gtttacgacg gcgtcccggc aggatgagtc ttatcagaca taattcaggg\n+ 4599481 agatacgcat aatggcggaa attggtattt ttgtcggtac gatgtatggc aactcactgt\n+ 4599541 tggtggcgga ggaagcggaa gcgatcctgg ccagacaggg ccatagcgcg actgtgtttg\n+ 4599601 aagatcctga actgtccgac tggcggcaat atcaggacaa ggtggcattg gttgtcacct\n+ 4599661 caacgaccgg acagggcgat ctaccggata gtattgcgcc gctctttcac ggtattaaag\n+ 4599721 atacgttagg ttttcaacca aacctgcgtt acggggtgat tgcgttaggt gatagcagct\n+ 4599781 accccaattt ctgtaatggc ggcaagcagt ttgatgccct gttgcaggag caaagcgcgc\n+ 4599841 aacgggtggg ggaaatgtta ctcattgacg ccagcgaaca tccggagccg gagagccaat\n+ 4599901 ccaatccctg ggtagaaaac tggggaacct tactttcctg aggtaaatcc ctccccctac\n+ 4599961 cgggagggta ccttttcgtt tgattgcatt gccagtaagc aaaataacga cctgtatgta\n+ 4600021 gtttaaagaa actgaatcgt gttagctttg tgcatatgcc tgcaaaagca gcagtttttt\n+ 4600081 acgggcgttt tcatgtaatc aagcgacctg tttcacattc ttctcttttt attcctcctg\n+ 4600141 cgtcgacgcc tgacgccttc tgatttcatt tccgtgaagt ggcttccact gtcctgggct\n+ 4600201 tttgccacaa acaggcgtaa ttcattgcca aaatactgtg ttgttgcacg gtgagtgtgc\n+ 4600261 gtgacgcgct ttttatactt ctcctgccag tgaataaaag aatgcagcat gcaaagcaaa\n+ 4600321 cgacctaata aaagctgcaa caaggaaacg ttatctctga ttccctaccg gttgtgcagt\n+ 4600381 tcagagtgag cgtagctaac gcgaaatttc aggagtgcaa caatgagttc attaagtcac\n+ 4600441 gcggcgagta gtgcggagaa tcgcacgaac gcccgctact ggatagtggt gatgctgttt\n+ 4600501 atcgtcacat cctttaacta tggcgatcgc gccacattgt ccattgccgg ctcagaaatg\n+ 4600561 gccaaagata ttggtcttga cccggtaggc atgggctacg ttttctctgc gttttcatgg\n+ 4600621 gcctatgtta tcggacagat ccctggcggc tggctgctgg accgctttgg ttccaaacgc\n+ 4600681 gtctatttct ggtctatttt catctggtcg gtcttcaccc tgttgcaggg ttttgtcgat\n+ 4600741 atttttagcg gtttcggcat tgttgtcgcc ctctttacgc ttcgtttcct ggtcggtctg\n+//\n' |