A day with (the) Julia (language)

Exercises

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


In [1]:
function listaralineamientos(direccion, extension::Regex=r"\.fasta$"; vacios::Bool=false)
    alns = String[]
    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[1]:
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 [2]:
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"))


Out[2]:
Test Passed
  Expression: filter!(@r_str("\\.fasta\$"),readdir("data")) == filter!((x->begin 
                ismatch(@r_str("\\.fasta\$"),x)
            end),readdir("data"))
   Evaluated: String["Empty.fasta","PF09645_full.fasta"] == String["Empty.fasta","PF09645_full.fasta"]

In [3]:
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


WARNING: Method definition list_alns_filter(Any) in module Main at In[1]:18 overwritten at In[3]:2.
WARNING: Method definition list_alns_filter(Any, Base.Regex) in module Main at In[1]:18 overwritten at In[3]:2.
WARNING: Method definition #list_alns_filter(Array{Any, 1}, Main.#list_alns_filter, Any) in module Main overwritten.
WARNING: Method definition #list_alns_filter(Array{Any, 1}, Main.#list_alns_filter, Any, Base.Regex) in module Main overwritten.
Out[3]:
list_alns_filter (generic function with 2 methods)

In [4]:
@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$")


Out[4]:
Test Passed
  Expression: list_alns_filter("data",@r_str("\\.stockholm\$")) == listaralineamientos("data",@r_str("\\.stockholm\$"))
   Evaluated: String["PF09645_full.stockholm"] == String["PF09645_full.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 [5]:
"""
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[5]:
stockholm2fasta

In [6]:
?stockholm2fasta


search:

Out[6]:

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 [7]:
"""
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


WARNING: Method definition stockholm2fasta(Any, Any) in module Main at In[5]:10 overwritten at In[7]:7.
WARNING: replacing docs for 'stockholm2fasta :: Tuple{Any,Any}' in module 'Main'.
Out[7]:
stockholm2fasta

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


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

In [9]:
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 [10]:
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[10]:
py_stockholm2fasta

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


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

In [12]:
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-----