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) |