Mercurial > repos > artbio > small_rna_map
comparison small_rna_map.py @ 0:1ad5d040f85f draft
planemo upload for repository https://github.com/ARTbio/tools-artbio/tree/master/tools/small_rna_map commit fa452d860cf550c7524df59e77b36fd39e3e2a45
author | artbio |
---|---|
date | Mon, 10 Jul 2017 10:31:49 -0400 |
parents | |
children | 2e0dc6032a98 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1ad5d040f85f |
---|---|
1 import os | |
2 from os.path import basename | |
3 import pysam | |
4 import argparse | |
5 import numpy | |
6 import collections | |
7 | |
8 | |
9 def Parser(): | |
10 the_parser = argparse.ArgumentParser() | |
11 the_parser.add_argument('--input', dest="input", required=True, nargs='+', help='input BAM files') | |
12 the_parser.add_argument('--output', action="store", type=str, help="output tabular file") | |
13 args = the_parser.parse_args() | |
14 return args | |
15 | |
16 | |
17 def Ref_length(bamfile): | |
18 """ | |
19 bamfile.references: list of reference names, and bamfile.lengths is list of their lengths | |
20 """ | |
21 ref_length={} | |
22 for e1, e2 in zip(bamfile.references, bamfile.lengths): | |
23 ref_length[e1]=e2 | |
24 return ref_length | |
25 | |
26 | |
27 def Ref_coord_pol(bamfile): | |
28 ref_coord ={} | |
29 rnames =list(bamfile.references) | |
30 for read in bamfile: | |
31 if not read.is_unmapped: | |
32 polarity = "F" if (not read.is_reverse) else "R" | |
33 read_rname = read.reference_name | |
34 read_position = read.pos + 1 | |
35 the_key = (read_rname, read_position,polarity) | |
36 read_length = read.qlen | |
37 try: | |
38 ref_coord[the_key][0] = ref_coord[the_key][0]+1 | |
39 ref_coord[the_key][1].append(read_length) | |
40 except: | |
41 ref_coord[the_key] = [1,[read_length]] | |
42 if read_rname in rnames: | |
43 rnames.remove(read_rname) | |
44 for rname in rnames: | |
45 ref_coord[(rname, 0, "F")]=[0,[0]] | |
46 return collections.OrderedDict(sorted(ref_coord.items())) #dictionary {(read_rname,read_position,polarity):[nmbr_read,list_of_alignment_length]} | |
47 | |
48 | |
49 def calcul_stat(dictionary,ref): | |
50 dico = {} | |
51 for keys in dictionary: | |
52 key = keys[0] #reference name | |
53 value = dictionary[keys][0] # position | |
54 try: | |
55 dico[key].append(value) | |
56 except: | |
57 dico[key] = [] | |
58 dico[key].append(value) | |
59 the_max = max(dico[ref]) | |
60 return the_max | |
61 | |
62 | |
63 def filename(infile): | |
64 filename = basename(infile.filename) | |
65 the_name = filename.split('.') | |
66 return the_name[0] | |
67 | |
68 | |
69 def main(infile, output): | |
70 with open(output,"w") as outfile: | |
71 outfile.write("Dataset" + "\t" + "Chromosome"+ "\t" + "Chrom_length" + "\t" + "Coordinate" + "\t" + "Nbr_reads" + "\t" + "Polarity" + "\t" + "Max" + "\t" + "Mean" + "\t" + "Median" + "\n") | |
72 for bamfile in infile: | |
73 with pysam.AlignmentFile(bamfile,"rb") as bamfile: | |
74 ref_coord = Ref_coord_pol(bamfile) | |
75 ref_length = Ref_length(bamfile) | |
76 tabulation = "\t" | |
77 for read in ref_coord: | |
78 table = (str(filename(bamfile)), str(read[0]), str(ref_length[str(read[0])]), str(read[1]), str(ref_coord[read][0]), str(read[2]), str(calcul_stat(ref_coord,read[0])), str(round(numpy.mean(ref_coord[read][1]),1)), str(numpy.median(ref_coord[read][1]))) | |
79 outfile.write(tabulation.join(table) + "\n") | |
80 | |
81 | |
82 if __name__ == "__main__": | |
83 args= Parser() | |
84 main(args.input, args.output) |