def compute(self): # TODO: this will at some point have to be a state machine running = True paused = False while running: # TODO: figure out what to do with framerates self.clock.tick(60) # TODO: unfuck calculation, draw, and update # react to user input single_frame = False for e in pygame.event.get(): if e.type == pygame.QUIT: running = False if e.type == pygame.KEYDOWN: if e.key == pygame.K_ESCAPE: running = False elif e.key == pygame.K_SPACE: self.players[0].act() elif e.key == pygame.K_LEFT: paused = not paused elif e.key == pygame.K_RIGHT: single_frame = True if paused: if single_frame: single_frame = False else: continue # check collisions for player in self.players: player.check_wall_collisions() player.update() pairs = combinations(range(len(self.players)), 2) for i, j in pairs: if utils.overlaps(self.players[i], self.players[j]): utils.change_velocities(self.players[i], self.players[j]) # move players and Orbs for orb in chain(self.players, self.orbs): orb.move() # Draw the scene self.screen.fill((0, 0, 0)) for game_object in chain(self.walls, self.orbits, self.orbs, self.players): game_object.draw(self.screen) pygame.display.flip()
def parse_head_row(head_row, gene_group, outfile): parse_head_row.last_args = head_row, gene_group, outfile for _, gene_row in gene_group.iterrows(): if overlaps((gene_row.start, gene_row.end), (head_row.start, head_row.end)): flag = 'olap' chosen_gene_id = gene_row.id distance = 0 break # if none overlaps else: # b f de forward ou backfill distance = 9e99 # create Inf() class for that? for meth in ['b', 'f']: fill_back = meth == 'b' gene_pos = ['end', 'start'][fill_back] head_pos = ['end', 'start'][not fill_back] if gene_group[gene_pos].duplicated().sum(): raise pd.core.indexes.base.InvalidIndexError( 'You appear to have duplicated gene positions. ' 'Indexes won\'t work properly.') indexed_group = gene_group.sort_values(gene_pos).set_index( gene_pos) try: near_gene_index = indexed_group.index.get_loc( head_row[head_pos], meth + 'fill') gene_row = gene_group.iloc[near_gene_index] new_distance = abs(gene_row[gene_pos] - head_row[head_pos]) if new_distance < distance: chosen_gene_id = gene_row.id flag = ["gh", "hg"][fill_back] distance = new_distance except KeyError as e: prinf( f'\nNão há gene {meth.upper()} de {head_row.id}. (B=atrás, F=à frente)\n' ) outfile.write('\t'.join([head_row.id, chosen_gene_id, flag, str(distance)]) + '\n')
near_gene_index = indexed_group.index.get_loc( head_row.start, meth + 'fill') gene_row = gene_group.iloc[near_gene_index] relation_dic[head_row.id] = dict({flag: gene_row.id}, **relation_dic.get( head_row.id, {})) outfile.write('\t'.join([head_row.id, gene_row.id, flag]) + '\n') except KeyError: if verbose: print(f'Não há gene à {flag} de {head_row.id}.') for _, gene_row in gene_group.iterrows(): if overlaps((gene_row.start, gene_row.end), (head_row.start, head_row.end)): flag = 'olap' relation_dic[head_row.id] = dict({flag: gene_row.id}, **relation_dic.get( head_row.id, {})) outfile.write( '\t'.join([head_row.id, gene_row.id, flag]) + '\n') print(relation_dic) print(f"Guardando dicionário em '{str(outpath)}'...") with outdicpath.open('wb') as outdicfile: dump(relation_dic, outdicfile) print('Concluído.')
def test_overlap(): x1, x2 = 2005, 2008 y1, y2 = 2003, 2007 assert overlaps(x1, x2, y1, y2) == True
def test_no_overlap(): x1, x2 = 2005, 2008 y1, y2 = 2003, 2004 assert overlaps(x1, x2, y1, y2) == False
sr3_scaffold_groups = sr3_vs_genoma.groupby(['saccver']) start_time = time() count = 0 discarded = [] pos = 0 for i, p in tqdm(list(perere3_vs_genoma.iterrows())): count += 1 if p['saccver'] in sr3_scaffold_groups.groups: for j, s in sr3_scaffold_groups.get_group( p['saccver']).loc[pos:].iterrows(): if overlaps((p['sstart'], p['send']), (s['sstart'], s['send'])): # print('Alinhamentos coincidentes encontrados:') # print(f"{p['sstart']}-{p['send']}\n{s['sstart']}-{s['send']}") if s['bitscore'] > p['bitscore']: # print('SR3 tem mais bitscore:') # print(f"SR3 = {s['bitscore']}\nPer = {p['bitscore']}") pos = j filtered_perere3_vs_genoma.drop(i, inplace=True) # print(f'Alinhamento {i} descartado.\n') discarded.append(str(i)) break
sam_row = sam_row.iloc[0, :] if sam_row.chrom == '*': continue try: head_group = head_groups.get_group(sam_row.chrom) except KeyError: if verbose: print(f'\nNão há heads no cromossomo {sam_row.chrom}.') continue for _, head_row in head_group.iterrows(): if overlaps((sam_row.start, sam_row.start + len_from_cigar(sam_row.cigar)), (head_row.start, head_row.end)): outfile.write('\t'.join([ head_row.chrom, head_row.id, str(head_row.start), str(head_row.end), str(sam_row.start), sam_row.cigar ]) + '\n') outfile.close() log(f"O SAM '{sam_path.stem}' acabou de ser filtrado.", __file__) print('Concluído.')
def main(): heads = pd.read_table(head_annotations_path, names=GFF3_COLUMNS, usecols=GFF_COLS_SUBSET) genes = pd.read_table(gene_annotations_path, names=GFF3_COLUMNS, usecols=GFF_COLS_SUBSET) heads['id'] = parse_gff_attributes(heads.attributes).index genes['id'] = parse_gff_attributes(genes.attributes).index head_groups = heads.groupby(COLS_TO_GROUP) gene_groups = genes.groupby(COLS_TO_GROUP) outfile = safe_open(outpath, exist_ok=False) # write header outfile.write('\t'.join(['head_id', 'gene_id', 'flag', 'distance']) + '\n') print('Iterate for each contig and for each head in contig.') for head_group_name, head_group in tqdm(head_groups): try: gene_group = gene_groups.get_group(head_group_name) except KeyError: prinf( 'Não há nenhum gene no cromossomo. As heads abaixo são "desgenadas".' ) prinf(head_group) continue for _, head_row in tqdm(list(head_group.iterrows())): for _, gene_row in gene_group.iterrows(): if overlaps((gene_row.start, gene_row.end), (head_row.start, head_row.end)): flag = 'olap' chosen_gene_id = gene_row.id distance = 0 break # if none overlaps else: # b f de forward ou backfill distance = 9e99 # create Inf() class for that? for meth in ['b', 'f']: fill_back = meth == 'b' gene_pos = ['end', 'start'][fill_back] head_pos = ['end', 'start'][not fill_back] if gene_group[gene_pos].duplicated().sum(): raise pd.core.indexes.base.InvalidIndexError( 'You appear to have duplicated gene positions.' 'Indexes won\'t work properly.') indexed_group = gene_group.sort_values(gene_pos).set_index( gene_pos) try: near_gene_index = indexed_group.index.get_loc( head_row[head_pos], meth + 'fill') gene_row = gene_group.iloc[near_gene_index] new_distance = abs(gene_row[gene_pos] - head_row[head_pos]) if new_distance < distance: chosen_gene_id = gene_row.id flag = ["gh", "hg"][fill_back] distance = new_distance except KeyError: prinf(f'Não há gene à {flag} de {head_row.id}.') outfile.write( '\t'.join([head_row.id, chosen_gene_id, flag, str(distance)]) + '\n') print(f'\nConcluído. Relações salvas em {str(outpath)}.') outfile.close()