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)