Mercurial > repos > cpt > cpt_promote_qualifier
comparison cpt_promote_qualifiers/promote_qualifier.py @ 0:6f4c46313117 draft default tip
Uploaded
| author | cpt |
|---|---|
| date | Fri, 17 Jun 2022 13:05:11 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:6f4c46313117 |
|---|---|
| 1 #!/usr/bin/env python | |
| 2 import argparse | |
| 3 import sys | |
| 4 import logging | |
| 5 from CPT_GFFParser import gffParse, gffWrite | |
| 6 from gff3 import feature_lambda, feature_test_type | |
| 7 | |
| 8 logging.basicConfig(level=logging.INFO) | |
| 9 log = logging.getLogger(__name__) | |
| 10 | |
| 11 | |
| 12 def promote_qualifier(qualifier, parent, child, gff3): | |
| 13 for record in gffParse(gff3): | |
| 14 for parent_feature in feature_lambda( | |
| 15 record.features, feature_test_type, {"type": parent}, subfeatures=True | |
| 16 ): | |
| 17 # for each feature of the parent type, get the first subfeature of the child type | |
| 18 try: | |
| 19 first_child = sorted( | |
| 20 list( | |
| 21 feature_lambda( | |
| 22 parent_feature.sub_features, | |
| 23 feature_test_type, | |
| 24 {"type": child}, | |
| 25 subfeatures=False, | |
| 26 ) | |
| 27 ), | |
| 28 key=lambda x: x.location.start | |
| 29 if parent_feature.strand > 0 | |
| 30 else x.location.end, | |
| 31 reverse=False if parent_feature.strand > 0 else True, | |
| 32 )[0] | |
| 33 except IndexError: | |
| 34 logging.warning("Child type %s not found under parent %s" % (child, parent_feature.qualifiers["ID"])) | |
| 35 continue | |
| 36 try: | |
| 37 parent_feature.qualifiers[qualifier] = first_child.qualifiers[qualifier] | |
| 38 logging.info( | |
| 39 "Promoted %s=%s in child %s to parent %s" | |
| 40 % ( | |
| 41 qualifier, | |
| 42 first_child.qualifiers[qualifier], | |
| 43 first_child.qualifiers["ID"], | |
| 44 parent_feature.qualifiers["ID"], | |
| 45 ) | |
| 46 ) | |
| 47 except KeyError: | |
| 48 logging.warning( | |
| 49 "Qualifier %s not found in child feature %s" | |
| 50 % (qualifier, first_child.qualifiers["ID"]) | |
| 51 ) | |
| 52 gffWrite([record], sys.stdout) | |
| 53 | |
| 54 | |
| 55 if __name__ == "__main__": | |
| 56 parser = argparse.ArgumentParser( | |
| 57 description="Promote a child feature's qualifer to the parent feature's qualifier", | |
| 58 epilog="", | |
| 59 ) | |
| 60 parser.add_argument("gff3", type=argparse.FileType("r"), help="GFF3 File") | |
| 61 parser.add_argument( | |
| 62 "parent", | |
| 63 type=str, | |
| 64 help="Feature type of the target parent feature (ex: gene, mrna, exon", | |
| 65 ) | |
| 66 parser.add_argument( | |
| 67 "child", | |
| 68 type=str, | |
| 69 help="Feature type of the target child feature (ex: mrna, exon, CDS", | |
| 70 ) | |
| 71 parser.add_argument( | |
| 72 "qualifier", help="Sepcific qualifier to promote (ex: Name, product, notes" | |
| 73 ) | |
| 74 args = parser.parse_args() | |
| 75 promote_qualifier(**vars(args)) |
