#!/usr/bin/env python
#encoding=utf-8

import abifpy
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
#from Bio.Emboss.Applications import NeedleCommandline #nao consegui fazer esse modulo funcionar 
import os #uso a funcao listdir 
from Bio import SeqIO
import subprocess #para chamar outros subprocessos como needle, finchtv
import shlex #shlex.split é útil para determinar os argumentos dos subprocessos no bash
import glob #para processamento em lote 


def acessa_ab1(arquivo,trim=True): #generalizar depois
    """acessa um arquivo ab1 e retorna um objeto SeqRecord
    arquivo --> string com o caminho absoluto para o arquivo"""

    dado = abifpy.Trace(arquivo)
    if trim:
        cortado = Seq(dado.trim(dado.seq(ambig=True))) 
        return SeqRecord(cortado, id=arquivo, name=dado.meta['sample']+'_'+dado.meta['well'], description='dado cortado')
    else:
        return dado.seqrecord()
        
def abre_ref(arquivo):
    """acessa um arquivo contendo uma sequencia de referencia
      retorna um objeto SeqRecord"""
    with open(arquivo, 'rUb') as dado:
        referencia = SeqIO.read(dado, 'genbank')
    return referencia

def salva_fasta(diretorio, obj_SeqRecord):
    """Pega um objeto SeqRecord e cria um fasta com a sua sequencia"""
    
    SeqIO.write(obj_SeqRecord, diretorio + obj_SeqRecord.name + '.fasta','fasta')

def processar_lote(diretorio, ref):
    """abre os arquivos ab1 de uma pasta, apara, salva em fasta, faz o alinhamento com 
    o fasta de referencia e salva o alinhamento em um arquivo para analise
    posterior.
    diretorio --> uma string representando o caminho da pasta contendo os arquivos
    ref --> uma string representando o caminho absoluto + genbank com a 
    sequencia de referencia.
    """
    
    referencia = abre_ref(ref)
    referencia.id = 'sequencia de referencia'
    referencia.name = 'referencia'
    pasta = '/home/mercutio22/Dropbox/My_scripts/Fabi/resultados/'
    salva_fasta(pasta, referencia)
    ab1files = glob.iglob(diretorio + '*.ab1')
    for file in ab1files:
        dado = acessa_ab1(file)
        salva_fasta(pasta, dado)
        needle_cline = '/usr/bin/needle -asequence '+ pasta +'referencia.fasta\
 -bsequence '+ pasta + dado.name + '.fasta -gapopen 10 -gapextend 0.5 -outfile\
 ' + pasta + dado.name + '_aligned.txt'
        print needle_cline
        alinhar = shlex.split(needle_cline)
        print alinhar
        needle_run = subprocess.call(needle_cline)
    

pasta = '/home/mercutio22/Dropbox/My_scripts/Fabi/vs/Seq_placa273_analisada/'
referencia = '/home/mercutio22/Dropbox/My_scripts/Fabi/vs/Seq_placa273_analisada/BRCA1 (total) - Frag 3450.gb'
processar_lote(pasta, referencia)