Mercurial > repos > greg > draw_amr_matrix
comparison draw_amr_matrix.py @ 1:5c923c77cf5f draft
Uploaded
| author | greg |
|---|---|
| date | Fri, 10 Feb 2023 17:27:13 +0000 |
| parents | 6044ca44e9f6 |
| children | 7d7884f2d921 |
comparison
equal
deleted
inserted
replaced
| 0:6044ca44e9f6 | 1:5c923c77cf5f |
|---|---|
| 7 import numpy | 7 import numpy |
| 8 import pandas | 8 import pandas |
| 9 import matplotlib.pyplot as pyplot | 9 import matplotlib.pyplot as pyplot |
| 10 | 10 |
| 11 | 11 |
| 12 def get_amr_in_feature_hits(feature_hits): | 12 def get_amr_in_feature_hits(amr_feature_hits): |
| 13 for k in feature_hits.keys(): | 13 for k in amr_feature_hits.keys(): |
| 14 if k.lower().find('amr') >= 0: | 14 if k.lower().find('amr') >= 0: |
| 15 return feature_hits[k] | 15 return amr_feature_hits[k] |
| 16 return None | 16 return None |
| 17 | 17 |
| 18 | 18 |
| 19 def draw_amr_matrix(feature_hits_files, amr_gene_drug_file, output_dir): | 19 def draw_amr_matrix(amr_feature_hits_files, amr_deletions_file, amr_mutations_file, amr_gene_drug_file, output_dir): |
| 20 ofh = open('process_log', 'w') | 20 ofh = open('process_log', 'w') |
| 21 | 21 |
| 22 # Read feature_hits_files. | 22 # Read amr_feature_hits_files. |
| 23 feature_hits = pandas.Series(dtype=object) | 23 amr_feature_hits = pandas.Series(dtype=object) |
| 24 for feature_hits_file in feature_hits_files: | 24 for amr_feature_hits_file in amr_feature_hits_files: |
| 25 feature_name = os.path.basename(feature_hits_file) | 25 feature_name = os.path.basename(amr_feature_hits_file) |
| 26 # Make sure the file is not empty. | 26 # Make sure the file is not empty. |
| 27 if os.path.isfile(feature_hits_file) and os.path.getsize(feature_hits_file) > 0: | 27 if os.path.isfile(amr_feature_hits_file) and os.path.getsize(amr_feature_hits_file) > 0: |
| 28 best_hits = pandas.read_csv(filepath_or_buffer=feature_hits_file, sep='\t', header=None) | 28 best_hits = pandas.read_csv(filepath_or_buffer=amr_feature_hits_file, sep='\t', header=None) |
| 29 ofh.write("\nFeature file %s will be processed\n" % os.path.basename(feature_hits_file)) | 29 ofh.write("\nFeature file %s will be processed\n" % os.path.basename(amr_feature_hits_file)) |
| 30 else: | 30 else: |
| 31 ofh.write("\nEmpty feature file %s will NOT be processed\n" % os.path.basename(feature_hits_file)) | 31 ofh.write("\nEmpty feature file %s will NOT be processed\n" % os.path.basename(amr_feature_hits_file)) |
| 32 best_hits = None | 32 best_hits = None |
| 33 feature_hits[feature_name] = best_hits | 33 amr_feature_hits[feature_name] = best_hits |
| 34 | 34 |
| 35 amr_hits = get_amr_in_feature_hits(feature_hits) | 35 amr_hits = get_amr_in_feature_hits(amr_feature_hits) |
| 36 ofh.write("\namr_hits:\n%s\n" % str(amr_hits)) | 36 ofh.write("\namr_hits:\n%s\n" % str(amr_hits)) |
| 37 if amr_hits is not None: | 37 if amr_hits is not None: |
| 38 amr_to_draw = pandas.DataFrame(columns=['gene', 'drug']) | 38 amr_to_draw = pandas.DataFrame(columns=['gene', 'drug']) |
| 39 ofh.write("\namr_to_draw:\n%s\n" % str(amr_to_draw)) | 39 ofh.write("\namr_to_draw:\n%s\n" % str(amr_to_draw)) |
| 40 # Read amr_drug_gene_file. | 40 # Read amr_drug_gene_file. |
| 54 ofh.write("drugs:%s\n" % str(drugs)) | 54 ofh.write("drugs:%s\n" % str(drugs)) |
| 55 for drug in drugs: | 55 for drug in drugs: |
| 56 amr_to_draw = amr_to_draw.append(pandas.Series([gene_name, drug], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) | 56 amr_to_draw = amr_to_draw.append(pandas.Series([gene_name, drug], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) |
| 57 ofh.write("\amr_to_draw:%s\n" % str(amr_to_draw)) | 57 ofh.write("\amr_to_draw:%s\n" % str(amr_to_draw)) |
| 58 | 58 |
| 59 amr_mutations = pandas.Series(dtype=object) | 59 if amr_mutations_file is not None: |
| 60 if amr_mutations.shape[0] > 0: | 60 # TODO: So far, no samples have produced mutations, so we haven't been able |
| 61 # to produce a populated VarScan VCF file of mutations - https://github.com/appliedbinf/pima_md/blob/main/pima.py#L2923. | |
| 62 # The call_amr_mutations Galaxy tool will currently produce this VarScan VCF file, but we need a sample that | |
| 63 # will produce a populated file. After we find one, we'll need to figure out how to implement this loop | |
| 64 # https://github.com/appliedbinf/pima_md/blob/main/pima.py#L2925 in a Galaxy tool so that the VarScan VCF | |
| 65 # file will be converted to the TSV amr_mutations_file that thsi tool expects. | |
| 61 # Roll up potentially resistance conferring mutations. | 66 # Roll up potentially resistance conferring mutations. |
| 62 # TODO: may need to populate this if we need to use call_amr_mutations. | |
| 63 for mutation_region, mutation_hits in amr_mutations.iteritems(): | 67 for mutation_region, mutation_hits in amr_mutations.iteritems(): |
| 64 for mutation_idx, mutation_hit in mutation_hits.iterrows(): | 68 for mutation_idx, mutation_hit in mutation_hits.iterrows(): |
| 65 mutation_name = mutation_region + ' ' + mutation_hit['REF'] + '->' + mutation_hit['ALT'] | 69 mutation_name = mutation_region + ' ' + mutation_hit['REF'] + '->' + mutation_hit['ALT'] |
| 66 amr_to_draw = amr_to_draw.append(pandas.Series([mutation_name, mutation_hit['DRUG']], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) | 70 amr_to_draw = amr_to_draw.append(pandas.Series([mutation_name, mutation_hit['DRUG']], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) |
| 67 | 71 |
| 68 amr_deletions = pandas.DataFrame() | 72 if amr_deletions_file is not None: |
| 69 if amr_deletions.shape[0] > 0: | 73 # TODO: So far, no samples have produced deletions, but we do have all the pices in place |
| 74 # within the workflow to receive the amr_deletions_file here, although it is currently | |
| 75 # always empty... | |
| 70 # Roll up deletions that might confer resistance. | 76 # Roll up deletions that might confer resistance. |
| 71 # TODO: may need to populate this if we need to use call_insertions. | 77 amr_deletions = pandas.read_csv(filepath_or_buffer=amr_deletions_file, sep='\t', header=None) |
| 72 for deletion_idx, deleted_gene in amr_deletions.iterrows(): | 78 if amr_deletions.shape[0] > 0: |
| 73 amr_to_draw = amr_to_draw.append(pandas.Series(['\u0394' + deleted_gene[3], deleted_gene[5]], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) | 79 amr_deletions.columns = ['contig', 'start', 'stop', 'name', 'type', 'drug', 'note'] |
| 80 amr_deletions = amr_deletions.loc[amr_deletions['type'].isin(['large-deletion', 'any']), :] | |
| 81 for deletion_idx, deleted_gene in amr_deletions.iterrows(): | |
| 82 amr_to_draw = amr_to_draw.append(pandas.Series(['\u0394' + deleted_gene[3], deleted_gene[5]], name=amr_to_draw.shape[0], index=amr_to_draw.columns)) | |
| 74 | 83 |
| 75 if amr_to_draw.shape[0] > 1: | 84 if amr_to_draw.shape[0] > 1: |
| 76 ofh.write("\nDrawing AMR matrix...\n") | 85 ofh.write("\nDrawing AMR matrix...\n") |
| 77 present_genes = amr_to_draw['gene'].unique() | 86 present_genes = amr_to_draw['gene'].unique() |
| 78 present_drugs = amr_to_draw['drug'].unique() | 87 present_drugs = amr_to_draw['drug'].unique() |
| 97 | 106 |
| 98 | 107 |
| 99 if __name__ == '__main__': | 108 if __name__ == '__main__': |
| 100 parser = argparse.ArgumentParser() | 109 parser = argparse.ArgumentParser() |
| 101 | 110 |
| 111 parser.add_argument('--amr_feature_hits_dir', action='store', dest='amr_feature_hits_dir', help='Directory of tabular files containing feature hits') | |
| 112 parser.add_argument('--amr_deletions_file', action='store', dest='amr_deletions_file', default=None, help='AMR deletions BED file') | |
| 113 parser.add_argument('--amr_mutations_file', action='store', dest='amr_mutations_file', default=None, help='AMR mutations TSV file') | |
| 102 parser.add_argument('--amr_gene_drug_file', action='store', dest='amr_gene_drug_file', help='AMR_gene_drugs tsv file') | 114 parser.add_argument('--amr_gene_drug_file', action='store', dest='amr_gene_drug_file', help='AMR_gene_drugs tsv file') |
| 103 parser.add_argument('--feature_hits_dir', action='store', dest='feature_hits_dir', help='Directory of tabular files containing feature hits') | |
| 104 parser.add_argument('--output_dir', action='store', dest='output_dir', help='Output directory') | 115 parser.add_argument('--output_dir', action='store', dest='output_dir', help='Output directory') |
| 105 | 116 |
| 106 args = parser.parse_args() | 117 args = parser.parse_args() |
| 107 | 118 |
| 108 # Get thge collection of feature hits files. The collection | 119 # Get thge collection of feature hits files. The collection |
| 109 # will be sorted alphabetically and will contain 2 files | 120 # will be sorted alphabetically and will contain 2 files |
| 110 # named something like AMR_CDS_311_2022_12_20.fasta and | 121 # named something like AMR_CDS_311_2022_12_20.fasta and |
| 111 # Incompatibility_Groups_2023_01_01.fasta. | 122 # Incompatibility_Groups_2023_01_01.fasta. |
| 112 feature_hits_files = [] | 123 amr_feature_hits_files = [] |
| 113 for file_name in sorted(os.listdir(args.feature_hits_dir)): | 124 for file_name in sorted(os.listdir(args.amr_feature_hits_dir)): |
| 114 file_path = os.path.abspath(os.path.join(args.feature_hits_dir, file_name)) | 125 file_path = os.path.abspath(os.path.join(args.amr_feature_hits_dir, file_name)) |
| 115 feature_hits_files.append(file_path) | 126 amr_feature_hits_files.append(file_path) |
| 116 | 127 |
| 117 draw_amr_matrix(feature_hits_files, args.amr_gene_drug_file, args.output_dir) | 128 draw_amr_matrix(amr_feature_hits_files, args.amr_deletions_file, args.amr_mutations_file, args.amr_gene_drug_file, args.output_dir) |
