Mercurial > repos > iuc > jbrowse
comparison jbrowse.py @ 33:0ae74c70b267 draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse commit 369a727966d697c56633b27ad2757db40fef0dc3"
| author | iuc |
|---|---|
| date | Fri, 30 Aug 2019 03:36:39 -0400 |
| parents | 2bb2e07a7a21 |
| children | 9de82b4963e6 |
comparison
equal
deleted
inserted
replaced
| 32:6b774e9d6387 | 33:0ae74c70b267 |
|---|---|
| 329 | 329 |
| 330 | 330 |
| 331 class JbrowseConnector(object): | 331 class JbrowseConnector(object): |
| 332 | 332 |
| 333 def __init__(self, jbrowse, outdir, genomes, standalone=False, gencode=1): | 333 def __init__(self, jbrowse, outdir, genomes, standalone=False, gencode=1): |
| 334 self.TN_TABLE = { | |
| 335 'gff3': '--gff', | |
| 336 'gff': '--gff', | |
| 337 'bed': '--bed', | |
| 338 'genbank': '--gbk', | |
| 339 } | |
| 340 | |
| 341 self.cs = ColorScaling() | 334 self.cs = ColorScaling() |
| 342 self.jbrowse = jbrowse | 335 self.jbrowse = jbrowse |
| 343 self.outdir = outdir | 336 self.outdir = outdir |
| 344 self.genome_paths = genomes | 337 self.genome_paths = genomes |
| 345 self.standalone = standalone | 338 self.standalone = standalone |
| 377 }) | 370 }) |
| 378 | 371 |
| 379 with open(trackList, 'w') as handle: | 372 with open(trackList, 'w') as handle: |
| 380 json.dump(trackListData, handle, indent=2) | 373 json.dump(trackListData, handle, indent=2) |
| 381 | 374 |
| 382 def subprocess_check_call(self, command): | 375 def subprocess_check_call(self, command, output=None): |
| 383 log.debug('cd %s && %s', self.outdir, ' '.join(command)) | 376 if output: |
| 384 subprocess.check_call(command, cwd=self.outdir) | 377 log.debug('cd %s && %s > %s', self.outdir, ' '.join(command), output) |
| 378 subprocess.check_call(command, cwd=self.outdir, stdout=output) | |
| 379 else: | |
| 380 log.debug('cd %s && %s', self.outdir, ' '.join(command)) | |
| 381 subprocess.check_call(command, cwd=self.outdir) | |
| 385 | 382 |
| 386 def subprocess_popen(self, command): | 383 def subprocess_popen(self, command): |
| 387 log.debug('cd %s && %s', self.outdir, command) | 384 log.debug('cd %s && %s', self.outdir, command) |
| 388 p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 385 p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| 389 output, err = p.communicate() | 386 output, err = p.communicate() |
| 556 | 553 |
| 557 trackData['scale'] = wiggleOpts['scale'] | 554 trackData['scale'] = wiggleOpts['scale'] |
| 558 | 555 |
| 559 self._add_track_json(trackData) | 556 self._add_track_json(trackData) |
| 560 | 557 |
| 558 def add_maf(self, data, trackData, mafOpts, **kwargs): | |
| 559 script = os.path.realpath(os.path.join(self.jbrowse, 'plugins', 'MAFViewer', 'bin', 'maf2bed.pl')) | |
| 560 dest = os.path.join('data', 'raw', trackData['label'] + '.txt') | |
| 561 | |
| 562 tmp1 = tempfile.NamedTemporaryFile(delete=False) | |
| 563 tmp1.close() | |
| 564 | |
| 565 # Process MAF to bed-like | |
| 566 cmd = [script, data] | |
| 567 self.subprocess_check_call(cmd, output=tmp1.path) | |
| 568 | |
| 569 # Sort / Index it | |
| 570 self._sort_bed(tmp1.path, dest) | |
| 571 # Cleanup | |
| 572 try: | |
| 573 os.remove(tmp1.path) | |
| 574 except OSError: | |
| 575 pass | |
| 576 | |
| 577 # Construct samples list | |
| 578 # We could get this from galaxy metadata, not sure how easily. | |
| 579 ps = subprocess.Popen(['grep', '^s [^ ]*', '-o', data], stdout=subprocess.PIPE) | |
| 580 output = subprocess.check_output(('sort', '-u'), stdin=ps.stdout) | |
| 581 ps.wait() | |
| 582 samples = [x[2:] for x in output] | |
| 583 | |
| 584 trackData.update({ | |
| 585 "storeClass": "MAFViewer/Store/SeqFeature/MAFTabix", | |
| 586 "type": "MAFViewer/View/Track/MAF", | |
| 587 "urlTemplate": trackData['label'] + '.txt.gz', | |
| 588 "samples": samples, | |
| 589 }) | |
| 590 | |
| 591 self._add_track_json(trackData) | |
| 592 | |
| 561 def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs): | 593 def add_bam(self, data, trackData, bamOpts, bam_index=None, **kwargs): |
| 562 dest = os.path.join('data', 'raw', trackData['label'] + '.bam') | 594 dest = os.path.join('data', 'raw', trackData['label'] + '.bam') |
| 563 cmd = ['ln', '-s', os.path.realpath(data), dest] | 595 cmd = ['ln', '-s', os.path.realpath(data), dest] |
| 564 self.subprocess_check_call(cmd) | 596 self.subprocess_check_call(cmd) |
| 565 | 597 |
| 608 "storeClass": "JBrowse/Store/SeqFeature/VCFTabix", | 640 "storeClass": "JBrowse/Store/SeqFeature/VCFTabix", |
| 609 }) | 641 }) |
| 610 self._add_track_json(trackData) | 642 self._add_track_json(trackData) |
| 611 | 643 |
| 612 def _sort_gff(self, data, dest): | 644 def _sort_gff(self, data, dest): |
| 613 | 645 # Only index if not already done |
| 614 if not os.path.exists(dest): | 646 if not os.path.exists(dest): |
| 615 # Only index if not already done | |
| 616 cmd = "gff3sort.pl --precise '%s' | grep -v \"^$\" > '%s'" % (data, dest) | 647 cmd = "gff3sort.pl --precise '%s' | grep -v \"^$\" > '%s'" % (data, dest) |
| 617 self.subprocess_popen(cmd) | 648 self.subprocess_popen(cmd) |
| 618 | 649 |
| 619 cmd = ['bgzip', '-f', dest] | 650 self.subprocess_check_call(['bgzip', '-f', dest]) |
| 620 self.subprocess_popen(' '.join(cmd)) | 651 self.subprocess_check_call(['tabix', '-f', '-p', 'gff', dest + '.gz']) |
| 621 cmd = ['tabix', '-f', '-p', 'gff', dest + '.gz'] | 652 |
| 622 self.subprocess_popen(' '.join(cmd)) | 653 def _sort_bed(self, data, dest): |
| 623 | 654 # Only index if not already done |
| 624 def add_features(self, data, format, trackData, gffOpts, **kwargs): | 655 if not os.path.exists(dest): |
| 625 | 656 cmd = ['sort', '-k1,1', '-k2,2n', data] |
| 657 self.subprocess_check_call(cmd, output=dest) | |
| 658 | |
| 659 self.subprocess_check_call(['bgzip', '-f', dest]) | |
| 660 self.subprocess_check_call(['tabix', '-f', '-p', 'bed', dest + '.gz']) | |
| 661 | |
| 662 def add_gff(self, data, format, trackData, gffOpts, **kwargs): | |
| 626 dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff') | 663 dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.gff') |
| 627 | 664 |
| 628 self._sort_gff(data, dest) | 665 self._sort_gff(data, dest) |
| 629 | 666 |
| 630 url = os.path.join('raw', trackData['label'] + '.gff.gz') | 667 url = os.path.join('raw', trackData['label'] + '.gff.gz') |
| 652 elif trackType in ['JBrowse/View/Track/HTMLFeatures', 'NeatHTMLFeatures/View/Track/NeatFeatures']: | 689 elif trackType in ['JBrowse/View/Track/HTMLFeatures', 'NeatHTMLFeatures/View/Track/NeatFeatures']: |
| 653 if 'topLevelFeatures' in gffOpts and gffOpts['topLevelFeatures']: | 690 if 'topLevelFeatures' in gffOpts and gffOpts['topLevelFeatures']: |
| 654 trackData['topLevelFeatures'] = gffOpts['topLevelFeatures'] | 691 trackData['topLevelFeatures'] = gffOpts['topLevelFeatures'] |
| 655 | 692 |
| 656 self._add_track_json(trackData) | 693 self._add_track_json(trackData) |
| 694 | |
| 695 if gffOpts.get('index', 'false') == 'true': | |
| 696 self.tracksToIndex.append("%s" % trackData['label']) | |
| 697 | |
| 698 def add_bed(self, data, format, trackData, gffOpts, **kwargs): | |
| 699 dest = os.path.join(self.outdir, 'data', 'raw', trackData['label'] + '.bed') | |
| 700 | |
| 701 self._sort_bed(data, dest) | |
| 702 | |
| 703 url = os.path.join('raw', trackData['label'] + '.bed.gz') | |
| 704 trackData.update({ | |
| 705 "urlTemplate": url, | |
| 706 "storeClass": "JBrowse/Store/SeqFeature/BEDTabix", | |
| 707 }) | |
| 708 | |
| 709 if 'match' in gffOpts: | |
| 710 trackData['glyph'] = 'JBrowse/View/FeatureGlyph/Segments' | |
| 711 | |
| 712 trackType = gffOpts.get('trackType', 'JBrowse/View/Track/CanvasFeatures') | |
| 713 trackData['type'] = trackType | |
| 714 | |
| 715 if trackType in ['JBrowse/View/Track/CanvasFeatures', 'NeatCanvasFeatures/View/Track/NeatFeatures']: | |
| 716 if 'transcriptType' in gffOpts and gffOpts['transcriptType']: | |
| 717 trackData['transcriptType'] = gffOpts['transcriptType'] | |
| 718 if 'subParts' in gffOpts and gffOpts['subParts']: | |
| 719 trackData['subParts'] = gffOpts['subParts'] | |
| 720 if 'impliedUTRs' in gffOpts and gffOpts['impliedUTRs']: | |
| 721 trackData['impliedUTRs'] = gffOpts['impliedUTRs'] | |
| 722 elif trackType in ['JBrowse/View/Track/HTMLFeatures', 'NeatHTMLFeatures/View/Track/NeatFeatures']: | |
| 723 if 'topLevelFeatures' in gffOpts and gffOpts['topLevelFeatures']: | |
| 724 trackData['topLevelFeatures'] = gffOpts['topLevelFeatures'] | |
| 725 | |
| 726 self._add_track_json(trackData) | |
| 727 | |
| 728 if gffOpts.get('index', 'false') == 'true': | |
| 729 self.tracksToIndex.append("%s" % trackData['label']) | |
| 730 | |
| 731 def add_genbank(self, data, format, trackData, gffOpts, **kwargs): | |
| 732 cmd = [ | |
| 733 'perl', self._jbrowse_bin('flatfile-to-json.pl'), | |
| 734 '--genbank', data, | |
| 735 '--trackLabel', trackData['label'], | |
| 736 '--key', trackData['key'] | |
| 737 ] | |
| 738 | |
| 739 # className in --clientConfig is ignored, it needs to be set with --className | |
| 740 if 'className' in trackData['style']: | |
| 741 cmd += ['--className', trackData['style']['className']] | |
| 742 | |
| 743 config = copy.copy(trackData) | |
| 744 clientConfig = trackData['style'] | |
| 745 del config['style'] | |
| 746 | |
| 747 if 'match' in gffOpts: | |
| 748 config['glyph'] = 'JBrowse/View/FeatureGlyph/Segments' | |
| 749 if bool(gffOpts['match']): | |
| 750 # Can be empty for CanvasFeatures = will take all by default | |
| 751 cmd += ['--type', gffOpts['match']] | |
| 752 | |
| 753 cmd += ['--clientConfig', json.dumps(clientConfig)] | |
| 754 | |
| 755 trackType = 'JBrowse/View/Track/CanvasFeatures' | |
| 756 if 'trackType' in gffOpts: | |
| 757 trackType = gffOpts['trackType'] | |
| 758 | |
| 759 if trackType == 'JBrowse/View/Track/CanvasFeatures': | |
| 760 if 'transcriptType' in gffOpts and gffOpts['transcriptType']: | |
| 761 config['transcriptType'] = gffOpts['transcriptType'] | |
| 762 if 'subParts' in gffOpts and gffOpts['subParts']: | |
| 763 config['subParts'] = gffOpts['subParts'] | |
| 764 if 'impliedUTRs' in gffOpts and gffOpts['impliedUTRs']: | |
| 765 config['impliedUTRs'] = gffOpts['impliedUTRs'] | |
| 766 elif trackType == 'JBrowse/View/Track/HTMLFeatures': | |
| 767 if 'transcriptType' in gffOpts and gffOpts['transcriptType']: | |
| 768 cmd += ['--type', gffOpts['transcriptType']] | |
| 769 | |
| 770 cmd += [ | |
| 771 '--trackType', gffOpts['trackType'] | |
| 772 ] | |
| 773 | |
| 774 cmd.extend(['--config', json.dumps(config)]) | |
| 775 | |
| 776 self.subprocess_check_call(cmd) | |
| 657 | 777 |
| 658 if gffOpts.get('index', 'false') == 'true': | 778 if gffOpts.get('index', 'false') == 'true': |
| 659 self.tracksToIndex.append("%s" % trackData['label']) | 779 self.tracksToIndex.append("%s" % trackData['label']) |
| 660 | 780 |
| 661 def add_rest(self, url, trackData): | 781 def add_rest(self, url, trackData): |
| 780 if customTrackConfig: | 900 if customTrackConfig: |
| 781 self.set_custom_track_options(customTrackConfig, outputTrackConfig, mapped_chars) | 901 self.set_custom_track_options(customTrackConfig, outputTrackConfig, mapped_chars) |
| 782 | 902 |
| 783 # import pprint; pprint.pprint(track) | 903 # import pprint; pprint.pprint(track) |
| 784 # import sys; sys.exit() | 904 # import sys; sys.exit() |
| 785 if dataset_ext in ('gff', 'gff3', 'bed'): | 905 if dataset_ext in ('gff', 'gff3'): |
| 786 self.add_features(dataset_path, dataset_ext, outputTrackConfig, | 906 self.add_gff(dataset_path, dataset_ext, outputTrackConfig, |
| 787 track['conf']['options']['gff']) | 907 track['conf']['options']['gff']) |
| 908 elif dataset_ext in ('bed', ): | |
| 909 self.add_bed(dataset_path, dataset_ext, outputTrackConfig, | |
| 910 track['conf']['options']['gff']) | |
| 911 elif dataset_ext in ('genbank', ): | |
| 912 self.add_genbank(dataset_path, dataset_ext, outputTrackConfig, | |
| 913 track['conf']['options']['gff']) | |
| 788 elif dataset_ext == 'bigwig': | 914 elif dataset_ext == 'bigwig': |
| 789 self.add_bigwig(dataset_path, outputTrackConfig, | 915 self.add_bigwig(dataset_path, outputTrackConfig, |
| 790 track['conf']['options']['wiggle']) | 916 track['conf']['options']['wiggle']) |
| 791 elif dataset_ext == 'bigwig_multiple': | 917 elif dataset_ext == 'bigwig_multiple': |
| 792 self.add_bigwig_multiple(dataset_path, outputTrackConfig, | 918 self.add_bigwig_multiple(dataset_path, outputTrackConfig, |
| 793 track['conf']['options']['wiggle']) | 919 track['conf']['options']['wiggle']) |
| 920 elif dataset_ext == 'maf': | |
| 921 self.add_maf(dataset_path, outputTrackConfig, | |
| 922 track['conf']['options']['maf']) | |
| 794 elif dataset_ext == 'bam': | 923 elif dataset_ext == 'bam': |
| 795 real_indexes = track['conf']['options']['pileup']['bam_indices']['bam_index'] | 924 real_indexes = track['conf']['options']['pileup']['bam_indices']['bam_index'] |
| 796 if not isinstance(real_indexes, list): | 925 if not isinstance(real_indexes, list): |
| 797 # <bam_indices> | 926 # <bam_indices> |
| 798 # <bam_index>/path/to/a.bam.bai</bam_index> | 927 # <bam_index>/path/to/a.bam.bai</bam_index> |
