From 71f25a7bfa103a0d73ead98956201983edd57e77 Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Mon, 28 Jan 2008 15:27:33 +0000 Subject: [PATCH] Fixes for bed_to_gff_converter. --- .../converters/bed_to_gff_converter.py | 37 +++++++++++++++---- test-data/9.bed | 1 + tools/filters/bed2gff.xml | 22 +++++++---- tools/filters/bed_to_gff_converter.py | 37 +++++++++++++++---- 4 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 test-data/9.bed diff --git a/lib/galaxy/datatypes/converters/bed_to_gff_converter.py b/lib/galaxy/datatypes/converters/bed_to_gff_converter.py index 62769809156..b7963e165b3 100644 --- a/lib/galaxy/datatypes/converters/bed_to_gff_converter.py +++ b/lib/galaxy/datatypes/converters/bed_to_gff_converter.py @@ -11,16 +11,23 @@ def __main__(): out.write( "##gff-version 2\n" ) out.write( "##bed_to_gff_converter.py\n\n" ) for i, line in enumerate( file( input_name ) ): + complete_bed = False line = line.rstrip( '\r\n' ) if line and not line.startswith( '#' ) and not line.startswith( 'track' ) and not line.startswith( 'browser' ): try: elems = line.split( '\t' ) + if len( elems ) == 12: + complete_bed = True chrom = elems[0] - start = str( int( elems[1] ) + 1 ) - try: - name = elems[3] - except: - name = 'feature_%d' % ( i + 1 ) + if complete_bed: + feature = "mRNA" + else: + try: + feature = elems[3] + except: + feature = 'feature%d' % ( i + 1 ) + start = int( elems[1] ) + 1 + end = int( elems[2] ) try: score = elems[4] except: @@ -29,9 +36,23 @@ def __main__(): strand = elems[5] except: strand = '+' - # Bed format: chrom, chromStart, chromEnd, name, score, strand - # GFF format: chrom->seqname source, feature, chromStart->start, chromEnd,->end score, strand, ., group=match name - out.write( '%s\tbed2gff\tmatch\t%s\t%s\t%s\t%s\t.\tmatch %s;\n' % ( chrom, start, elems[2], score, strand, name ) ) + try: + group = elems[3] + except: + group = 'group%d' % ( i + 1 ) + if complete_bed: + out.write( '%s\tbed2gff\t%s\t%d\t%d\t%s\t%s\t.\t%s %s;\n' % ( chrom, feature, start, end, score, strand, feature, group ) ) + else: + out.write( '%s\tbed2gff\t%s\t%d\t%d\t%s\t%s\t.\t%s;\n' % ( chrom, feature, start, end, score, strand, group ) ) + if complete_bed: + # We have all the info necessary to annotate exons for genes and mRNAs + block_count = int( elems[9] ) + block_sizes = elems[10].split( ',' ) + block_starts = elems[11].split( ',' ) + for j in range( block_count ): + exon_start = int( start ) + int( block_starts[j] ) + exon_end = exon_start + int( block_sizes[j] ) - 1 + out.write( '%s\tbed2gff\texon\t%d\t%d\t%s\t%s\t.\texon %s;\n' % ( chrom, exon_start, exon_end, score, strand, group ) ) except: skipped_lines += 1 if not first_skipped_line: diff --git a/test-data/9.bed b/test-data/9.bed new file mode 100644 index 00000000000..1d67053670c --- /dev/null +++ b/test-data/9.bed @@ -0,0 +1 @@ +chr28 346187 388197 BC114771 0 + 346187 388197 0 9 144,81,115,63,155,96,134,105,112, 0,24095,26190,31006,32131,33534,36994,41793,41898, \ No newline at end of file diff --git a/tools/filters/bed2gff.xml b/tools/filters/bed2gff.xml index 08e28594899..fcc9c08a61f 100644 --- a/tools/filters/bed2gff.xml +++ b/tools/filters/bed2gff.xml @@ -9,7 +9,7 @@ - + @@ -25,16 +25,24 @@ This tool converts data from BED format to GFF format (scroll down for format de The following data in BED format:: - chr3 214671 265280 Hs.517745 300 + - chrX 156881 157496 Hs.530320 300 + + chr28 346187 388197 BC114771 0 + 346187 388197 0 9 144,81,115,63,155,96,134,105,112, 0,24095,26190,31006,32131,33534,36994,41793,41898, Will be converted to GFF (**note** that the start coordinate is incremented by 1):: - ##gff-version 2 - ##bed_to_gff_converter.py + ##gff-version 2 + ##bed_to_gff_converter.py + + chr28 bed2gff mRNA 346188 388197 0 + . mRNA BC114771; + chr28 bed2gff exon 346188 346331 0 + . exon BC114771; + chr28 bed2gff exon 370283 370363 0 + . exon BC114771; + chr28 bed2gff exon 372378 372492 0 + . exon BC114771; + chr28 bed2gff exon 377194 377256 0 + . exon BC114771; + chr28 bed2gff exon 378319 378473 0 + . exon BC114771; + chr28 bed2gff exon 379722 379817 0 + . exon BC114771; + chr28 bed2gff exon 383182 383315 0 + . exon BC114771; + chr28 bed2gff exon 387981 388085 0 + . exon BC114771; + chr28 bed2gff exon 388086 388197 0 + . exon BC114771; - chr3 bed2gff match 214672 265280 300 + . match Hs.517745; - chrX bed2gff match 156882 157496 300 + . match Hs.530320; ------ diff --git a/tools/filters/bed_to_gff_converter.py b/tools/filters/bed_to_gff_converter.py index 62769809156..b7963e165b3 100644 --- a/tools/filters/bed_to_gff_converter.py +++ b/tools/filters/bed_to_gff_converter.py @@ -11,16 +11,23 @@ def __main__(): out.write( "##gff-version 2\n" ) out.write( "##bed_to_gff_converter.py\n\n" ) for i, line in enumerate( file( input_name ) ): + complete_bed = False line = line.rstrip( '\r\n' ) if line and not line.startswith( '#' ) and not line.startswith( 'track' ) and not line.startswith( 'browser' ): try: elems = line.split( '\t' ) + if len( elems ) == 12: + complete_bed = True chrom = elems[0] - start = str( int( elems[1] ) + 1 ) - try: - name = elems[3] - except: - name = 'feature_%d' % ( i + 1 ) + if complete_bed: + feature = "mRNA" + else: + try: + feature = elems[3] + except: + feature = 'feature%d' % ( i + 1 ) + start = int( elems[1] ) + 1 + end = int( elems[2] ) try: score = elems[4] except: @@ -29,9 +36,23 @@ def __main__(): strand = elems[5] except: strand = '+' - # Bed format: chrom, chromStart, chromEnd, name, score, strand - # GFF format: chrom->seqname source, feature, chromStart->start, chromEnd,->end score, strand, ., group=match name - out.write( '%s\tbed2gff\tmatch\t%s\t%s\t%s\t%s\t.\tmatch %s;\n' % ( chrom, start, elems[2], score, strand, name ) ) + try: + group = elems[3] + except: + group = 'group%d' % ( i + 1 ) + if complete_bed: + out.write( '%s\tbed2gff\t%s\t%d\t%d\t%s\t%s\t.\t%s %s;\n' % ( chrom, feature, start, end, score, strand, feature, group ) ) + else: + out.write( '%s\tbed2gff\t%s\t%d\t%d\t%s\t%s\t.\t%s;\n' % ( chrom, feature, start, end, score, strand, group ) ) + if complete_bed: + # We have all the info necessary to annotate exons for genes and mRNAs + block_count = int( elems[9] ) + block_sizes = elems[10].split( ',' ) + block_starts = elems[11].split( ',' ) + for j in range( block_count ): + exon_start = int( start ) + int( block_starts[j] ) + exon_end = exon_start + int( block_sizes[j] ) - 1 + out.write( '%s\tbed2gff\texon\t%d\t%d\t%s\t%s\t.\texon %s;\n' % ( chrom, exon_start, exon_end, score, strand, group ) ) except: skipped_lines += 1 if not first_skipped_line: