A day with (the) Julia (language)

Exercises

I. Reescribir la función usando filter! y testear


In [39]:
function listaralineamientos(direccion, extension::Regex=r"\.fasta$"; vacios::Bool=false)
    alns = ASCIIString[]
    for nombre in readdir(direccion)
        if ismatch(extension, nombre)
           
            if vacios || filesize(joinpath(direccion, nombre)) > 0
                push!(alns, nombre)
            end
            
        end
    end   
    alns
end

function list_alns_filter(direccion, extension::Regex=r"\.fasta$"; vacios::Bool=false)
    
    # COMPLETAR
end


Out[39]:
list_alns_filter (generic function with 2 methods)

Pistas:

  • filter! elimina de un vector los elementos para los cuales una función retorna false.
  • Si el primer argumento es una expresión regular, elimina los elementos que no son ismatch con esa Regex.
  • Base.Test.@test da un error si la condición que sigue es falsa (sino retorna nothing, no muestra nada)

In [40]:
using Base.Test

# variable -> ... es la notación para una función anónima
@test filter!(r"\.fasta$", readdir("data")) == filter!(x -> ismatch(r"\.fasta$", x), readdir("data"))

In [41]:
function list_alns_filter(direccion, extension::Regex=r"\.fasta$"; vacios::Bool=false)
    alns = filter!(extension, readdir(direccion))
    if !vacios
        filter!(nombre -> filesize(joinpath(direccion, nombre)) > 0, alns)
    end
    alns
end


Out[41]:
list_alns_filter (generic function with 2 methods)

In [42]:
@test list_alns_filter("data") == listaralineamientos("data")
@test list_alns_filter("data", vacios=true) == listaralineamientos("data", vacios=true)
@test list_alns_filter("data", r"\.stockholm$") == listaralineamientos("data", r"\.stockholm$")

II. Escribir una función para convertir un archivo Stockholm en FASTA.

Pista: En un archivo con formato Stockholm, las secuencias son las únicas líneas que no comienzan con numeral #= ni //, la regex es: ^(?![#=|//])

O31699/88-139           EVMLTDIPRLHINDPIMKGFGMVINN..GFVCVENDE
#=GR O31699/88-139 AS   ________________*____________________
//

Usar: match, @r_str, open, eachline, close, println or print
Opcional: chomp


In [1]:
"""Función para convertir un archivo Stockholm en FASTA (secuencia en una sola línea).
La función toma como argumentos la dirección/nombre de un archivo Stockholm y del archivo FASTA que se creara.
La función retorna la dirección/nombre del FASTA."""
function stockholm2fasta(sto, fas)
    
    # COMPLETAR
    
end


Out[1]:
stockholm2fasta (generic function with 1 method)

In [2]:
?stockholm2fasta


search: stockholm2fasta

Out[2]:

Función para convertir un archivo Stockholm en FASTA (secuencia en una sola línea). La función toma como argumentos la dirección/nombre de un archivo Stockholm y del archivo FASTA que se creara. La función retorna la dirección/nombre del FASTA.


In [3]:
"""Función para convertir un archivo Stockholm en FASTA (secuencia en una sola línea).
La función toma como argumentos la dirección/nombre de un archivo Stockholm y del archivo FASTA que se creara.
La función retorna la dirección/nombre del FASTA."""
function stockholm2fasta(sto, fas)
    fh_in  = open(sto, "r")
    open(fas, "w") do fh_out
        for line in eachline(fh_in)
            m = match(r"^(?![#=|//])(\S+)\s+(\S+)", line)
            if m != nothing
                println(fh_out, ">", m.captures[1], "\n", m.captures[2])
            end
        end
    end
    close(fh_in)
    fas
end


Out[3]:
stockholm2fasta (generic function with 1 method)

In [4]:
stockholm2fasta("data/PF09645_full.stockholm", "data/out.fas")


Out[4]:
"data/out.fas"

In [5]:
run(`cat ./data/out.fas`)


>C3N734_SULIY/1-95
...mp---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDECEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------k....
>H2C869_9CREN/7-104
...nk--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EICTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------trreq
>Y070_ATV/2-70
qsvne-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGECQAIKRGRKTVI-------------------------------------------vskq.
>F112_SSV1/3-112
.....QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDECEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ.....

III. Escribir una función para convertir un archivo Stockholm en FASTA usando BioPython

Usar PyCall para importar BioPython en Julia. Un ejemplo similar en (Bio)Python está al final de la wiki de AlignIO:

from Bio import AlignIO

input_handle = open("example.phy", "rU")
output_handle = open("example.sth", "w")

alignments = AlignIO.parse(input_handle, "phylip")
AlignIO.write(alignments, output_handle, "stockholm")

output_handle.close()
input_handle.close()

Usar: AlignIO.parse, AlignIO.write


In [6]:
using PyCall 

@pyimport Bio.AlignIO as AlignIO

"""Función para convertir un archivo Stockholm en FASTA usando BioPython.
La función toma como argumentos la dirección/nombre de un archivo Stockholm y del archivo FASTA que se creara.
La función retorna la dirección/nombre del FASTA."""
function py_stockholm2fasta(sto, fas)
    fh_in  = open(sto, "r")
    open(fas, "w") do fh_out
        
        # COMPLETAR
        
    end
    close(fh_in)
    fas
end


Out[6]:
py_stockholm2fasta (generic function with 1 method)

In [7]:
using PyCall 

@pyimport Bio.AlignIO as AlignIO

"""Función para convertir un archivo Stockholm en FASTA usando BioPython.
La función toma como argumentos la dirección/nombre de un archivo Stockholm y del archivo FASTA que se creara.
La función retorna la dirección/nombre del FASTA."""
function py_stockholm2fasta(sto, fas)
    fh_in  = open(sto, "r")
    open(fas, "w") do fh_out
        alignments = AlignIO.parse(fh_in, "stockholm")
        AlignIO.write(alignments, fh_out,"fasta")
    end
    close(fh_in)
    fas
end


Out[7]:
py_stockholm2fasta (generic function with 1 method)

In [8]:
py_stockholm2fasta("data/PF09645_full.stockholm", "data/py_out.fas")


Out[8]:
"data/py_out.fas"

In [9]:
run(`cat ./data/py_out.fas`)


>C3N734_SULIY/1-95
---mp---NSYQMAEIMYKILQQKKEISLEDILAQFEISASTAYNVQRTLRMICEKHPDE
CEVQTKNRRTIFKWIKNEETTEEGQEE--QEIEKILNAQPAE-------------k----
>H2C869_9CREN/7-104
---nk--LNDVQRAKLLVKILQAKGELDVYDIMLQFEISYTRAIPIMKLTRKICEAQ-EI
CTYDEKEHKLVSLNAKKEKVEQDEEENEREEIEKILDAH----------------trreq
>Y070_ATV/2-70
qsvne-------VAQQLFSKLREKKEITAEDIIAIYNVTPSVAYAIFTVLKVMCQQHQGE
CQAIKRGRKTVI-------------------------------------------vskq-
>F112_SSV1/3-112
-----QTLNSYKMAEIMYKILEKKGELTLEDILAQFEISVPSAYNIQRALKAICERHPDE
CEVQYKNRKTTFKWIKQEQKEEQKQEQTQDNIAKIFDAQPANFEQTDQGFIKAKQ-----