Mercurial > repos > yating-l > snap
comparison Group.py @ 0:57299471d6c1 draft default tip
planemo upload commit 402a746f69e9f1dbb57007536fc36dc6ce3180de
| author | yating-l |
|---|---|
| date | Wed, 12 Apr 2017 17:37:47 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:57299471d6c1 |
|---|---|
| 1 from operator import itemgetter | |
| 2 | |
| 3 # Input: A group: a list that contains lines belonging to the same gene | |
| 4 class Group: | |
| 5 # Modify "type" column and "attributes" colunm, initialize id, gene, source, stream | |
| 6 def __init__(self, group): | |
| 7 self.group = group | |
| 8 self.id = str(group[0][0]) | |
| 9 self.source = str(group[0][1]) | |
| 10 self.stream = str(group[0][6]) | |
| 11 self.gene = str(group[0][8]) | |
| 12 for x in range(0, len(group)): | |
| 13 self.group[x][2] = "CDS" | |
| 14 self.group[x][8] = "Parent=mRNA_" + self.gene | |
| 15 self.group[x][3] = int(self.group[x][3]) | |
| 16 self.group[x][4] = int(self.group[x][4]) | |
| 17 | |
| 18 # Order the group elements accoriding to Stream, +: ascanding order, -: descanding order | |
| 19 def order(self): | |
| 20 self.num = len(self.group) | |
| 21 if self.stream == "+": | |
| 22 self.group = sorted(self.group, key=itemgetter(3)) | |
| 23 self.min_item = self.group[0][3] | |
| 24 self.max_item = self.group[self.num-1][4] | |
| 25 elif self.stream == "-": | |
| 26 self.group = sorted(self.group, key=itemgetter(3), reverse=True) | |
| 27 self.min_item = self.group[self.num-1][3] | |
| 28 self.max_item = self.group[0][4] | |
| 29 else: | |
| 30 print("Stream in invalid!\n") | |
| 31 | |
| 32 def phaseCalculator(self, i, donor = 0): | |
| 33 if i >= self.num: | |
| 34 pass | |
| 35 else: | |
| 36 self.type = self.group[i][2] | |
| 37 self.size = self.group[i][4] - self.group[i][3] + 1 | |
| 38 if self.num == 1: | |
| 39 if self.type == "Eterm": | |
| 40 self.group[i][7] = str(self.size % 3) | |
| 41 else: | |
| 42 self.group[i][7] = "0" | |
| 43 elif self.num > 1 and i < self.num: | |
| 44 accept = (3 - donor) % 3 | |
| 45 self.group[i][7] = str(accept) | |
| 46 donor = (self.size - accept) % 3 | |
| 47 i = i + 1 | |
| 48 self.phaseCalculator(i, donor) | |
| 49 | |
| 50 | |
| 51 def writer(self, gff3): | |
| 52 self.order() | |
| 53 self.phaseCalculator(0) | |
| 54 gff3.write(self.id + "\t" + self.source + "\tgene\t" + str(self.min_item) + "\t" + str(self.max_item) + "\t.\t" + self.stream + "\t.\t" + "ID=" + self.gene + "\n") | |
| 55 gff3.write(self.id + "\t" + self.source + "\tmRNA\t" + str(self.min_item) + "\t" + str(self.max_item) + "\t.\t" + self.stream + "\t.\t" + "ID=mRNA_" + self.gene + ";Parent=" + self.gene + "\n") | |
| 56 for x in range(0, len(self.group)): | |
| 57 self.group[x][3] = str(self.group[x][3]) | |
| 58 self.group[x][4] = str(self.group[x][4]) | |
| 59 gff3.write("\t".join(self.group[x]) + "\n") |
