Mercurial > repos > artbio > mircounts
diff mature_mir_gff_translation.py @ 3:6b8adacd4750 draft
planemo upload for repository https://github.com/ARTbio/tools-artbio/tree/master/tools/mircounts commit fa65a844f9041a83767f5305ab360abfdf68f59f
author | artbio |
---|---|
date | Wed, 26 Jul 2017 19:15:08 -0400 |
parents | da29af78a960 |
children | 9ea96a02c416 |
line wrap: on
line diff
--- a/mature_mir_gff_translation.py Tue Jul 25 11:04:28 2017 -0400 +++ b/mature_mir_gff_translation.py Wed Jul 26 19:15:08 2017 -0400 @@ -1,6 +1,5 @@ #!/usr/bin/env python -import sys import argparse @@ -9,24 +8,27 @@ the_parser.add_argument( '--input', action="store", type=str, help="input miRBase GFF3 file") the_parser.add_argument( - '--output', action="store", type=str, help="output GFF3 file with converted mature mir coordinates") + '--output', action="store", type=str, + help="output GFF3 file with converted mature mir coordinates") args = the_parser.parse_args() return args -GFF3_header= '''##gff-version 3 + +GFF3_header = '''##gff-version 3 ##generated by mature_mir_gff_translation.py # # Chromosomal coordinates of microRNAs ** relative to the hairpin precursors ** # microRNAs: miRBase current_version # genome-build-id: check http://mirbase.org/ # -# Hairpin precursor sequences have type "miRNA_primary_transcript". -# Note, these sequences do not represent the full primary transcript, -# rather a predicted stem-loop portion that includes the precursor +# Hairpin precursor sequences have type "miRNA_primary_transcript". +# Note, these sequences do not represent the full primary transcript, +# rather a predicted stem-loop portion that includes the precursor # miRNA. Mature sequences have type "miRNA". # ''' + def load_gff_in_dict(gff_input_file): ''' Reads the gff3 file and return a dictionary of dictionaries @@ -35,26 +37,29 @@ ''' gff_dict = {} for line in open(gff_input_file, "r"): - if line[0]=="#": + if line[0] == "#": continue - gff_fields=line[:-1].split("\t") - ID=gff_fields[8].split("ID=")[1].split(";")[0] + gff_fields = line[:-1].split("\t") + ID = gff_fields[8].split("ID=")[1].split(";")[0] gff_dict[ID] = {} - gff_dict[ID]["seqid"]=gff_fields[0] - gff_dict[ID]["source"]=gff_fields[1] - gff_dict[ID]["type"]=gff_fields[2] - gff_dict[ID]["start"]=gff_fields[3] - gff_dict[ID]["end"]=gff_fields[4] - gff_dict[ID]["score"]=gff_fields[5] - gff_dict[ID]["strand"]=gff_fields[6] - gff_dict[ID]["phase"]=gff_fields[7] - gff_dict[ID]["attributes"]=gff_fields[8] + gff_dict[ID]["seqid"] = gff_fields[0] + gff_dict[ID]["source"] = gff_fields[1] + gff_dict[ID]["type"] = gff_fields[2] + gff_dict[ID]["start"] = gff_fields[3] + gff_dict[ID]["end"] = gff_fields[4] + gff_dict[ID]["score"] = gff_fields[5] + gff_dict[ID]["strand"] = gff_fields[6] + gff_dict[ID]["phase"] = gff_fields[7] + gff_dict[ID]["attributes"] = gff_fields[8] if "Derives_from" in gff_dict[ID]["attributes"]: - parent_primary_transcript=gff_dict[ID]["attributes"].split("Derives_from=")[1] - parent_primary_transcript=gff_dict[parent_primary_transcript]["attributes"].split("Name=")[1] - gff_dict[ID]["attributes"]="%s;Parent_mir_Name=%s" % (gff_dict[ID]["attributes"], parent_primary_transcript) + parent_primary_transcript = gff_dict[ID]["attributes"].split( + "Derives_from=")[1] + parent_primary_transcript = gff_dict[parent_primary_transcript][ + "attributes"].split("Name=")[1] + gff_dict[ID]["attributes"] = "%s;Parent_mir_Name=%s" % ( + gff_dict[ID]["attributes"], parent_primary_transcript) return gff_dict - + def genome_to_mir_gff(gff_dict, output): ''' @@ -63,36 +68,50 @@ Note that GFF files are 1-based coordinates ''' for key in gff_dict: - name=gff_dict[key]["attributes"].split("Name=")[1].split(";")[0] - gff_dict[key]["seqid"]=name + name = gff_dict[key]["attributes"].split("Name=")[1].split(";")[0] + gff_dict[key]["seqid"] = name if "Derives_from=" in gff_dict[key]["attributes"]: - parent_ID=gff_dict[key]["attributes"].split("Derives_from=")[1].split(";")[0] - gff_dict[key]["start"]=str(int(gff_dict[key]["start"]) - int(gff_dict[parent_ID]["start"]) + 1) - gff_dict[key]["end"]=str(int(gff_dict[key]["end"]) - int(gff_dict[parent_ID]["start"]) + 1) - hairpins={} - matures={} - for key in gff_dict: ## treats miRNA_primary_transcript coordinates in a second loop to avoid errors in conversion - if gff_dict[key]["type"]=="miRNA_primary_transcript": - gff_dict[key]["end"]=str(int(gff_dict[key]["end"]) - int(gff_dict[key]["start"]) + 1) - gff_dict[key]["start"]="1" + parent_ID = gff_dict[key]["attributes"].split( + "Derives_from=")[1].split(";")[0] + gff_dict[key]["start"] = str(int(gff_dict[key]["start"])-int( + gff_dict[parent_ID]["start"])+1) + gff_dict[key]["end"] = str(int(gff_dict[key]["end"])-int( + gff_dict[parent_ID]["start"])+1) + hairpins = {} + matures = {} + # treats miRNA_primary_transcript coordinates + # in a second loop to avoid errors in conversion + for key in gff_dict: + if gff_dict[key]["type"] == "miRNA_primary_transcript": + gff_dict[key]["end"] = str(int(gff_dict[key]["end"])-int( + gff_dict[key]["start"]) + 1) + gff_dict[key]["start"] = '1' # now, do a dict[ID]=Name but only for miRNA_primary_transcript - hairpins[key]=gff_dict[key]["attributes"].split("Name=")[1].split(";")[0] + hairpins[key] = gff_dict[key]["attributes"].split( + "Name=")[1].split( + ";")[0] else: - matures[key]=gff_dict[key]["attributes"].split("Name=")[1].split(";")[0] + matures[key] = gff_dict[key]["attributes"].split( + "Name=")[1].split( + ";")[0] with open(output, "w") as output: output.write(GFF3_header) for ID in sorted(hairpins, key=hairpins.get): - output.write("\t".join([gff_dict[ID]["seqid"], gff_dict[ID]["source"], - gff_dict[ID]["type"], gff_dict[ID]["start"], gff_dict[ID]["end"], - gff_dict[ID]["score"], gff_dict[ID]["strand"], gff_dict[ID]["phase"], - gff_dict[ID]["attributes"]])) + output.write("\t".join([gff_dict[ID]["seqid"], + gff_dict[ID]["source"], gff_dict[ID]["type"], + gff_dict[ID]["start"], gff_dict[ID]["end"], + gff_dict[ID]["score"], gff_dict[ID]["strand"], + gff_dict[ID]["phase"], gff_dict[ID]["attributes"]])) output.write("\n") for id in sorted(matures, key=matures.get, reverse=True): if ID in gff_dict[id]["attributes"]: - output.write("\t".join([gff_dict[id]["seqid"], gff_dict[id]["source"], - gff_dict[id]["type"], gff_dict[id]["start"], gff_dict[id]["end"], - gff_dict[id]["score"], gff_dict[id]["strand"], - gff_dict[id]["phase"], gff_dict[id]["attributes"]])) + output.write("\t".join([gff_dict[id]["seqid"], + gff_dict[id]["source"], gff_dict[id]["type"], + gff_dict[id]["start"], gff_dict[id]["end"], + gff_dict[id]["score"], + gff_dict[id]["strand"], + gff_dict[id]["phase"], + gff_dict[id]["attributes"]])) output.write("\n") @@ -103,4 +122,4 @@ if __name__ == "__main__": args = Parser() - main(args.input, args.output) \ No newline at end of file + main(args.input, args.output)