diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 3d6f6e0e1e4..b2bd21c1533 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -423,11 +423,12 @@ class Bam( Binary ): Binary.register_sniffable_binary_format("bam", "bam", Bam) - class Bcf( Binary): """Class describing a BCF file""" file_ext = "bcf" + MetadataElement( name="bcf_index", desc="BCF Index File", param=metadata.FileParameter, file_ext="csi", readonly=True, no_value=None, visible=False, optional=True ) + def sniff( self, filename ): # BCF is compressed in the BGZF format, and must not be uncompressed in Galaxy. # The first 3 bytes of any bcf file is 'BCF', and the file is binary. @@ -439,6 +440,37 @@ class Bcf( Binary): except: return False + def set_meta( self, dataset, overwrite = True, **kwd ): + """ Creates the index for the BCF file. """ + # These metadata values are not accessible by users, always overwrite + index_file = dataset.metadata.bcf_index + if not index_file: + index_file = dataset.metadata.spec['bcf_index'].param.new_file( dataset = dataset ) + # Create the bcf index + ##$ bcftools index + ##Usage: bcftools index + + dataset_symlink = os.path.join( os.path.dirname( index_file.file_name ), + '__dataset_%d_%s' % ( dataset.id, os.path.basename( index_file.file_name ) ) ) + os.symlink( dataset.file_name, dataset_symlink ) + + stderr_name = tempfile.NamedTemporaryFile( prefix = "bcf_index_stderr" ).name + command = [ 'bcftools', 'index', dataset_symlink ] + proc = subprocess.Popen( args=command, stderr=open( stderr_name, 'wb' ) ) + exit_code = proc.wait() + shutil.move( dataset_symlink + '.csi', index_file.file_name ) + + stderr = open( stderr_name ).read().strip() + if stderr: + if exit_code != 0: + os.unlink( stderr_name ) #clean up + raise Exception, "Error Setting BCF Metadata: %s" % stderr + else: + print stderr + dataset.metadata.bcf_index = index_file + # Remove temp file + os.unlink( stderr_name ) + Binary.register_sniffable_binary_format("bcf", "bcf", Bcf) diff --git a/test-data/bcf_index_metadata_test.bcf b/test-data/bcf_index_metadata_test.bcf new file mode 100644 index 00000000000..244518810e7 Binary files /dev/null and b/test-data/bcf_index_metadata_test.bcf differ diff --git a/test-data/bcf_index_metadata_test.txt b/test-data/bcf_index_metadata_test.txt new file mode 100644 index 00000000000..b5313184d43 --- /dev/null +++ b/test-data/bcf_index_metadata_test.txt @@ -0,0 +1 @@ +gzip compressed data, extra field diff --git a/test/functional/tools/metadata_bcf.xml b/test/functional/tools/metadata_bcf.xml new file mode 100644 index 00000000000..396a8bd7abd --- /dev/null +++ b/test/functional/tools/metadata_bcf.xml @@ -0,0 +1,16 @@ + + file "${input_bcf.metadata.bcf_index}" > "${output_of_input_metadata}" + + + + + + + + + + + + + + diff --git a/test/functional/tools/sample_datatypes_conf.xml b/test/functional/tools/sample_datatypes_conf.xml index ffde6ae5be9..28cb5ff2df7 100644 --- a/test/functional/tools/sample_datatypes_conf.xml +++ b/test/functional/tools/sample_datatypes_conf.xml @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/test/functional/tools/samples_tool_conf.xml b/test/functional/tools/samples_tool_conf.xml index c4c86f5272f..143e9043a3f 100644 --- a/test/functional/tools/samples_tool_conf.xml +++ b/test/functional/tools/samples_tool_conf.xml @@ -16,6 +16,7 @@ +