| 15 | 1 #!/usr/bin/env python3 | 
|  | 2 import argparse | 
|  | 3 import tempfile | 
|  | 4 import shutil | 
|  | 5 import sys | 
|  | 6 | 
|  | 7 def parse_args(): | 
|  | 8     '''Argument parsin''' | 
|  | 9     description = """ | 
|  | 10     parsing cap3 assembly aln output | 
|  | 11     """ | 
|  | 12 | 
|  | 13     parser = argparse.ArgumentParser( | 
|  | 14         description=description, | 
|  | 15         formatter_class=argparse.RawTextHelpFormatter) | 
|  | 16     parser.add_argument( | 
|  | 17         '-g', | 
|  | 18         '--gff_file', | 
|  | 19         default=None, | 
|  | 20         required=True, | 
|  | 21         help="input gff3 file for appending coverage information", | 
|  | 22         type=str, | 
|  | 23         action='store') | 
|  | 24     parser.add_argument( | 
|  | 25         '-p', | 
|  | 26         '--profile', | 
|  | 27         default=None, | 
|  | 28         required=True, | 
|  | 29         help="output file for coverage profile", | 
|  | 30         type=str, | 
|  | 31         action="store") | 
|  | 32     return parser.parse_args() | 
|  | 33 | 
|  | 34 def read_coverage(profile): | 
|  | 35     with open(profile) as p: | 
|  | 36         d = {} | 
|  | 37         for name, prof in zip(p, p): | 
|  | 38             d[name[1:].strip()] = [int(i) for i in prof.split()] | 
|  | 39     print(d, file=sys.stderr) | 
|  | 40     return d | 
|  | 41 | 
|  | 42 | 
|  | 43 def main(): | 
|  | 44     args = parse_args() | 
|  | 45     coverage_hash = read_coverage(args.profile) | 
|  | 46     gff_tmp = tempfile.NamedTemporaryFile() | 
|  | 47     with open(args.gff_file) as f, open(gff_tmp.name, 'w') as out: | 
|  | 48         for line in f: | 
|  | 49             if line[0] == "#": | 
|  | 50                 out.write(line) | 
|  | 51             else: | 
|  | 52                 line_parts = line.split() | 
|  | 53                 start = int(line_parts[3]) | 
|  | 54                 end = int(line_parts[4]) | 
|  | 55                 coverage = round( sum(coverage_hash[line_parts[0]][( | 
|  | 56                     start - 1):end]) / (end - start + 1), 3) | 
|  | 57                 new_line = "{};Coverage={}\n".format(line.strip(), coverage) | 
|  | 58                 out.write(new_line) | 
|  | 59 | 
|  | 60     shutil.copyfile(gff_tmp.name, args.gff_file) | 
|  | 61 | 
|  | 62 | 
|  | 63 if __name__ == "__main__": | 
|  | 64 | 
|  | 65     main() |