view main.jl @ 2:d5832ac370e3 draft default tip

planemo upload for repository https://github.com/kirstvh/MultiplexCrisprDOE commit a920127294bcfcb708881e28144a77a5c10d46d2-dirty
author padge
date Wed, 31 Aug 2022 13:17:33 +0000
parents 4a5c94d1d8bb
children
line wrap: on
line source

using Pkg
Pkg.add(Pkg.PackageSpec(name="Plots", version="1.31.7"));
Pkg.add(Pkg.PackageSpec(name="Distributions", version="0.25.68"));
Pkg.add("LinearAlgebra");
Pkg.add(Pkg.PackageSpec(name="Combinatorics", version="1.0.2"));
Pkg.add(Pkg.PackageSpec(name="BioCCP", version="0.1.1"));
Pkg.add(Pkg.PackageSpec(name="ArgParse", version="1.1.4"));
Pkg.add(Pkg.PackageSpec(name="XLSX", version="0.8.2"));
Pkg.add(Pkg.PackageSpec(name="DataFrames", version="1.3.4"));
Pkg.add(Pkg.PackageSpec(name="Weave", version="0.10.10"));
Pkg.add(Pkg.PackageSpec(name="DataStructures", version="0.18.13"));
Pkg.add(Pkg.PackageSpec(name="PrettyTables", version="1.3.1"));

using Random
using Plots
using Distributions
using LinearAlgebra
using Combinatorics
using BioCCP
using ArgParse
using XLSX
using DataFrames
using Weave
using DataStructures
using PrettyTables

global current_dir = pwd()
include("MultiplexCrisprDOE.jl");

function main(args)

    aps = ArgParseSettings("MultiplexCrisprDOE")

    @add_arg_table! aps begin
        "gfd" #, "gRNA_freq_dist"
            action = :command        # adds a command which will be read from an argument
            help = "gRNA/Cas9 frequencies"
        "ged" #, "gRNA_edit_dist" 
            action = :command
            help = "gRNA/Cas9 editing efficiencies"
        "sim"  # simulation
            action = :command
            help = "simulation-based approaches for computing the minimal plant library size that guarantees full combinatorial coverage (and other relevant statistics)"
        "ccp" # bioccp
            action = :command
            help = "BioCCP-based approaches for computing the minimal plant library size that guarantees full combinatorial coverage (and other relevant statistics)"
    end

    @add_arg_table! aps["gfd"] begin    # add command arg_table: same as usual, but invoked on s["grna"]
        "m"
            arg_type = Int
            help = "plant library size"
        "sd"
            arg_type = Int
            help = "the standard deviation on the gRNA abundances (in terms of absolute or relative frequency)"
        "l"
            arg_type = Int
            help = "minimal gRNA abundance (in terms of absolute or relative frequency)"
        "u"
            arg_type = Int
            help = "maximal gRNA abundance (in terms of absolute or relative frequency)"
        "n" #, "--n_gRNA_total"
            arg_type = Int
            help = "the total number of gRNAs in the experiment"
        "--normalize"
            action = :store_true
            # arg_type = Bool
            # default = true
            help = "if provided, the gRNA abundances (absolute frequencies) are converted into relative frequencies"
        "--visualize"
            action = :store_true
            # arg_type = Bool
            # default = false
            help = "if provided, a histogram of all gRNA abundances is plotted"
        "--out_file"
            arg_type = String
            default = "gRNA_reads"
            help = "Output excel file prefix"
    end

    @add_arg_table! aps["ged"] begin    # add command arg_table: same as usual, but invoked on s["grna"]
        "f_act"
            arg_type = Float16
            help = "fraction of all gRNAs that is active"
        "eps_edit_act"
            arg_type = Float16
            help = "Average genome editing efficiency for active gRNAs - mean of the genome editing efficiency distribution for active gRNAs"
        "eps_edit_inact"
            arg_type = Float16
            help = "Average genome editing efficiency for inactive gRNAs - mean of the genome editing efficiency distribution for inactive gRNAs"
        "sd_act"
            arg_type = Float16
            help = "standard deviation of the genome editing efficiency distributions for active and inactive gRNAs"
        "n_gRNA_total"
            arg_type = Int
            help = "the total number of gRNAs in the experiment"
        "--visualize"
            action = :store_true
            # arg_type = Bool
            # default = false
            help = "if provided a histogram of all genome editing efficiency is plotted"
        "--out_file"
            arg_type = String
            default = "gRNA_edit"
            help = "Output excel file prefix"
    end
    
    @add_arg_table! aps["sim"] begin
        "M" #, "--mode"
            # action = :command 
            # dest_name = "M"
            arg_type = Int
            range_tester = x -> 1 <= x <= 4
            help = """Select simulation mode (1: simulate_Nₓ₁; 2: simulate_Nₓ₂; 3: simulate_Nₓ₃; 4: simulate_Nₓ₂_countKOs)"""
        "x"
            arg_type = Int
            help = "number of target genes in the experiment"
        "g"
            arg_type = Int
            help = "number of gRNAs designed per target gene"
        "r"
            arg_type = Int
            help = "number of gRNA sequences per combinatorial gRNA/Cas construct"
        "t"#, "--n_gRNA_total"
            arg_type = Int
            help = "total number of gRNAs in the experiment"
        "f"#, "--p_gRNA_freq"
            arg_type = String #Vector{Float64}
            help = "vector with relative frequencies for all gRNAs in the construct library (normalized!)"
        "e"#, "--p_gRNA_edit"
            arg_type = String #Vector{Float64}
            help = "vector with genome editing efficiencies for all gRNAs"
        "E"#, "--ϵ_KO"
            arg_type=Float16
            help = "global knockout efficiency; fraction of mutations leading to effective gene knockout"
        "--i", "--iter"
            arg_type = Int
            default = 500
            help = "number of CRISPR/Cas experiments that are simulated"
    end

    @add_arg_table! aps["ccp"] begin
        "M"#, "--mode"
            arg_type = Int
            range_tester = x -> 1 <= x <= 9
            help = """Select BioCCP mode (1: BioCCP_Nₓ₁; 2: BioCCP_Nₓ₂; 3: BioCCP_Nₓ₃; 4: BioCCP_Pₓ₁; 5: BioCCP_Pₓ₂ ;
            6: BioCCP_Pₓ₃; 7: BioCCP_γₓ₁; 8: BioCCP_γₓ₂; 9: BioCCP_γₓ₃)"""
        "x"
            arg_type = Int
            help = "number of target genes in the experiment"
        "N"
            arg_type = Int
            help = "(Minimum) plant library size"
        "--s", "--step"
            arg_type = Int
            default = 5
            range_tester = x -> 1 <= x <= 10
            help = "Step size for plant library size (optional for calculating expected combinatorial coverage / plant library size)"
        "--MN", "--max_pl_size"
            arg_type = Int
            default = 4000
            help = "Maximum plant library size (optional for calculating expected combinatorial coverage / plant library size)"
        "g"
            arg_type = Int
            help = "number of gRNAs designed per target gene"
        "r"
            arg_type = Int
            help = "number of gRNA sequences per combinatorial gRNA/Cas construct"
        "t"#, "--n_gRNA_total"
            arg_type = Int
            help = "total number of gRNAs in the experiment"
        "f"#, "--p_gRNA_freq"
            arg_type = String #Vector{Float64}
            help = "File containing vector with relative frequencies for all gRNAs in the construct library (normalized!)"
        "e"#, "--p_gRNA_edit"
            arg_type = String #Vector{Float64}
            help = "File containing vector with genome editing efficiencies for all gRNAs"
        "E"#, "--ϵ_KO"
            arg_type=Float16
            help = "global knockout efficiency; fraction of mutations leading to effective gene knockout"
    end

    parsed_args = parse_args(args, aps)
    command_args = parsed_args[parsed_args["%COMMAND%"]]
    println(command_args)

    tool_info = OrderedDict()
    args_info = OrderedDict()
    grna_dict = Dict()
    out_dict = Dict()
    if parsed_args["%COMMAND%"] == "gfd"
        tool_info["method"] = "gRNA_ frequency _distribution"
        tool_info["description"] = "Generates vector with frequencies in the combinatorial "* 
                                    "gRNA/Cas9 construct library for all gRNAs"
        tool_info["mode"] = ""
        tool_info["mode_description"] = ""
        args_info["Plant library size"] = command_args["m"]
        args_info["SD on the gRNA abundances"] = command_args["sd"]
        args_info["Minimal gRNA abundance"] = command_args["l"]
        args_info["Maximal gRNA abundance"] = command_args["u"]
        args_info["Total number of gRNAs"] = command_args["n"]
        args_info["Convert gRNA abundances to relative frequencies"] = string(command_args["normalize"])
        args_info["Plot gRNA abundances"] = string(command_args["visualize"])

        m = command_args["m"]
        sd = command_args["sd"]
        l = command_args["l"]
        u = command_args["u"]
        n_gRNA_total = command_args["n"]
        norm = command_args["normalize"]
        viz = command_args["visualize"]

        println(string(norm))
        println(string(viz))

        p_gRNA_reads = gRNA_frequency_distribution(m, sd, l, u, n_gRNA_total; normalize = norm, visualize = false)
        grna_dict["p_gRNA_reads"] = p_gRNA_reads

        # println(p_gRNA_reads)
        # write to excel file
        fn = command_args["out_file"] * ".xlsx"
        labels = ["gRNA_read"]
        columns = Vector()
        push!(columns, p_gRNA_reads)
        XLSX.openxlsx(fn, mode="w") do xf
            sheet = xf[1]
            XLSX.writetable!(sheet, columns, labels)
        end

        out_dict["output file"] = fn

    elseif parsed_args["%COMMAND%"] == "ged"
        tool_info["method"] = "gRNA_ edit _distribution"
        tool_info["description"] = "Generates vector with genome editing efficiencies "*
                                    "for all the gRNAs in the experiment"
        tool_info["mode"] = ""
        tool_info["mode_description"] = ""
        args_info["Fraction of active gRNAs"] = command_args["f_act"]
        args_info["Average genome editing efficiency of active gRNAs"] = command_args["eps_edit_act"]
        args_info["Average genome editing efficiency of inactive gRNAs"] = command_args["eps_edit_inact"]
        args_info["Standard deviation"] = command_args["sd_act"]
        args_info["Total number of gRNAs"] = command_args["n_gRNA_total"]
        args_info["Plot genome editing efficiency"] = string(command_args["visualize"])

        f_act = command_args["f_act"]
        eps_edit_act = command_args["eps_edit_act"]
        eps_edit_inact = command_args["eps_edit_inact"]
        sd_act = command_args["sd_act"]
        n_gRNA_total = command_args["n_gRNA_total"]
        viz = ["visualize"]

        p_gRNA_edit = gRNA_edit_distribution(f_act, eps_edit_act, eps_edit_inact, sd_act, n_gRNA_total; visualize=false)
        grna_dict["p_gRNA_edit"] = p_gRNA_edit
        # write to excel file
        fn = command_args["out_file"] * ".xlsx"
        labels = ["gRNA_edit_efficiency"]
        columns = Vector()
        push!(columns, p_gRNA_edit)
        XLSX.openxlsx(fn, mode="w") do xf
            sheet = xf[1]
            XLSX.writetable!(sheet, columns, labels)
        end

        out_dict["output file"] = fn

    elseif parsed_args["%COMMAND%"] == "sim" || parsed_args["%COMMAND%"] == "ccp"

        filename = command_args["f"]
        sheet = 1
        data = DataFrame(XLSX.readtable(filename, sheet))
        p_gRNA_reads = data[!,"gRNA_read"]
        p_gRNA_reads_normalized = p_gRNA_reads/sum(p_gRNA_reads)  # normalize
        f = p_gRNA_reads_normalized
        grna_dict["p_gRNA_reads"] = f

        filename = command_args["e"]
        sheet = 1
        data = DataFrame(XLSX.readtable(filename, sheet))
        p_gRNA_edit = data[!,"gRNA_edit_efficiency"]
        e = p_gRNA_edit
        grna_dict["p_gRNA_edit"] = e

        x = command_args["x"]
        g = command_args["g"]
        r = command_args["r"]
        t = command_args["t"] # n_gRNA_total
        E = command_args["E"] # ϵ_KO # iter = 500
        
        args_info["# of target genes in the experiment"] = command_args["x"]
        args_info["# of gRNAs designed per target gene"] = command_args["g"]
        args_info["# of gRNAs / combi gRNA/Cas construct"] = command_args["r"]
        args_info["Total number of gRNAs"] = command_args["t"]
        args_info["Relative frequencies for all gRNAs"] = command_args["f"]
        args_info["Genome editing efficiencies for all gRNAs"] = command_args["e"]
        args_info["Global knockout efficiency"] = command_args["E"]

        if parsed_args["%COMMAND%"] == "sim"
            tool_info["method"] = "simulation"
            tool_info["description"] = "simulation-based approaches for computing the minimal "* 
                                        "plant library size that guarantees full combinatorial "*
                                        "coverage (and other relevant statistics)"
            i = command_args["i"] # iter = 500
            args_info["# of simulated experiments"] = command_args["i"]
            
            if command_args["M"] == 1
                tool_info["mode"] = "simulate_Nx1"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation "* 
                                                "of the minimal plant library size for full coverage of "*
                                                "all single gene knockouts (E[Nx,1] and σ[Nx,1]) using simulation"
                E_sim, sd_sim = simulate_Nₓ₁(x, g, r, t, f, e, E; iter=i)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 2
                tool_info["mode"] = "simulate_Nx2"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation of "* 
                    "the minimal plant library size for full coverage of "*
                    "all pairwise combinations of gene knockouts in a "*
                    "multiplex CRISPR/Cas experiment (E[Nx,2] and σ[Nx,2]) using simulation"

                E_sim, sd_sim = simulate_Nₓ₂(x, g, r, t, f, e, E; iter=i)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 3
                tool_info["mode"] = "simulate_Nx3"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation of "*
                    "the minimal plant library size for full coverage of "*
                    "all triple combinations of gene knockouts in a "*
                    "multiplex CRISPR/Cas experiment (E[Nx,3] and σ[Nx,3]) using simulation"

                E_sim, sd_sim = simulate_Nₓ₃(x, g, r, t, f, e, E; iter=i)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 4
                tool_info["mode"] = "simulate_Nx2_countKOs"
                tool_info["mode_description"] = "Counts of the number of knockouts per plant in the experiment"

                n_KOs_vec = simulate_Nₓ₂_countKOs(x, g, r, t, f, e, E; iter=i)
                out_dict["n_KOs_vec"] = n_KOs_vec

                # write to excel file
                fn = "countKOs.xlsx"
                labels = ["countKOs"]
                columns = Vector()
                push!(columns, n_KOs_vec)
                XLSX.openxlsx(fn, mode="w") do xf
                    sheet = xf[1]
                    XLSX.writetable!(sheet, columns, labels)
                end

                out_dict["output file"] = fn
            
            end

        elseif parsed_args["%COMMAND%"] == "ccp"
            tool_info["method"] = "BioCCP"
            tool_info["description"] = "BioCCP-based approaches for computing the minimal "* 
                                        "plant library size that guarantees full combinatorial "*
                                        "coverage (and other relevant statistics)"
            
            N = command_args["N"]
            if haskey(command_args,"s") && haskey(command_args,"MN")
                s = command_args["s"]
                MN = command_args["MN"]
                args_info["Step size"] = command_args["s"]
                args_info["Maximum Plant library size"] = command_args["MN"]
            end
            args_info["Plant library size"] = command_args["N"]
            

            if command_args["M"] == 1
                tool_info["mode"] = "BioCCP_Nx1"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation of "*
                    "the minimal plant library size for full coverage of all "*
                    "single gene knockouts (E[Nx,1] and σ[Nx,1]) using BioCCP"

                E_sim, sd_sim = BioCCP_Nₓ₁(x, g, r, t, f, e, E)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 2
                tool_info["mode"] = "BioCCP_Nx2"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation of "*
                    "the minimal plant library size for full coverage of all "*
                    "pairwise combinations of gene knockouts in a multiplex "*
                    "CRISPR/Cas experiment (E[Nx,2] and σ[Nx,2]) using BioCCP"

                E_sim, sd_sim = BioCCP_Nₓ₂(x, g, r, t, f, e, E)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 3
                tool_info["mode"] = "BioCCP_Nx3"
                tool_info["mode_description"] = "Computes the expected value and the standard deviation of "*
                    "the minimal plant library size for full coverage of all triple combinations of "*
                    "gene knockouts in a multiplex CRISPR/Cas experiment (E[Nx,3] and σ[Nx,3]) using BioCCP"

                E_sim, sd_sim = BioCCP_Nₓ₃(x, g, r, t, f, e, E)
                out_dict["E_sim"] = E_sim
                out_dict["sd_sim"] = sd_sim

            elseif command_args["M"] == 4
                tool_info["mode"] = "BioCCP_Px1"
                tool_info["mode_description"] = "Computes the probability of full coverage of "* 
                    "all single gene knockouts (Px,1) for an experiment with given "*
                    "plant library size using BioCCP"

                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                PT = []
                global N_95_P = nothing
                for N in plant_library_sizes
                    Pr = BioCCP_Pₓ₁(x, N, g, r, t, f, e, E)
                    push!(PT, Pr)
                    if Pr < 0.95
                        N_95_P = N
                    end
                end
                # P = BioCCP_Pₓ₁(x, N, g, r, t, f, e, E)
                out_dict["P_sim"] = PT
                out_dict["N_95_P"] = N_95_P
                out_dict["pls"] = plant_library_sizes

            elseif command_args["M"] == 5
                tool_info["mode"] = "BioCCP_Px2"
                tool_info["mode_description"] = "Computes the probability of full coverage of "*
                    "all pairwise combinations of gene knockouts (Px,2) "* 
                    "for an experiment with given plant library size using BioCCP"

                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                PT = []
                global N_95_P = nothing
                for N in plant_library_sizes  
                    Pr = BioCCP_Pₓ₂(x, N, g, r, t, f, e, E)
                    push!(PT, Pr)
                    if Pr < 0.95
                        N_95_P = N
                    end
                end
                # P = BioCCP_Pₓ₂(x, N, g, r, t, f, e, E)
                out_dict["P_sim"] = PT
                out_dict["N_95_P"] = N_95_P
                out_dict["pls"] = plant_library_sizes

            elseif command_args["M"] == 6
                tool_info["mode"] = "BioCCP_Px3"
                tool_info["mode_description"] = "Computes the probability of full coverage of all "*
                    "triple combinations of gene knockouts (Px,3) for an experiment "*
                    "with given plant library size using BioCCP"

                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                PT = []
                global N_95_P = nothing
                for N in plant_library_sizes  
                    Pr = BioCCP_Pₓ₃(x, N, g, r, t, f, e, E)
                    push!(PT, Pr)
                    if Pr < 0.95
                        N_95_P = N
                    end
                end
                # P = BioCCP_Pₓ₃(x, N, g, r, t, f, e, E)
                out_dict["P_sim"] = PT
                out_dict["N_95_P"] = N_95_P
                out_dict["pls"] = plant_library_sizes

            elseif command_args["M"] == 7
                tool_info["mode"] = "BioCCP_γx1"
                tool_info["mode_description"] = "Computes the expected coverage of all "*
                    "single gene knockouts (E[γx,1]) for an experiment "*
                    "with given plant library size using BioCCP"
                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                exp_cov = []
                global N_95 = nothing
                for N in plant_library_sizes  
                    E_cov = BioCCP_γₓ₁(x, N, g, r, t, f, e, E)
                    push!(exp_cov, E_cov)
                    if E_cov < 0.95
                        N_95 = N
                    end
                end
                # E_sim, sd_sim = BioCCP_γₓ₁(x, N, g, r, t, f, e, E)
                out_dict["E_cov"] = exp_cov
                out_dict["N_95"] = N_95
                out_dict["pls"] = plant_library_sizes

            elseif command_args["M"] == 8
                tool_info["mode"] = "BioCCP_γx2"
                tool_info["mode_description"] = "Computes the expected coverage of all "*
                    "pairwise combinations of gene knockouts (E[γx,2]) for an experiment with "*
                    "given plant library size using BioCCP"
                
                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                exp_cov = []
                global  N_95 = nothing
                for N in plant_library_sizes  
                    E_cov = BioCCP_γₓ₂(x, N, g, r, t, f, e, E)
                    push!(exp_cov, E_cov)
                    if E_cov < 0.95
                        N_95 = N
                    end
                end
                # E_sim, sd_sim = BioCCP_γₓ₂(x, N, g, r, t, f, e, E)
                out_dict["E_cov"] = exp_cov
                out_dict["N_95"] = N_95
                out_dict["pls"] = plant_library_sizes

            elseif command_args["M"] == 9
                tool_info["mode"] = "BioCCP_γx3"
                tool_info["mode_description"] = "Computes the expected coverage of all "*
                    "triple combinations of gene knockouts (E[γx,3]) for an experiment with "*
                    "given plant library size using BioCCP"

                if s != nothing && MN != nothing
                    plant_library_sizes = N:s:MN
                else
                    plant_library_sizes = N
                end
                exp_cov = []
                global  N_95 = nothing
                for N in plant_library_sizes  
                    E_cov = BioCCP_γₓ₃(x, N, g, r, t, f, e, E)
                    push!(exp_cov, E_cov)
                    if E_cov < 0.95
                        N_95 = N
                    end
                end
                # E_sim, sd_sim = BioCCP_γₓ₃(x, N, g, r, t, f, e, E)
                out_dict["E_cov"] = exp_cov
                out_dict["N_95"] = N_95
                out_dict["pls"] = plant_library_sizes

            end
        end
    end

    println(parsed_args)
    println("Parsed args:")
    for (key,val) in parsed_args
        println("  $key  =>  $(repr(val))")
    end
    println()
    println("Command: ", parsed_args["%COMMAND%"])
    # h1 = histogram(grna_dict["p_gRNA_reads"], label="", 
    #                 xlabel="Number of reads per gRNA", 
    #                 linecolor="white", 
    #                 normalize=:probability,
    #                 xtickfontsize=10,ytickfontsize=10,
    #                 color=:mediumturquoise, size=(600,350), bins = 25,
    #                 ylabel="Relative frequency", 
    #                 title="gRNA frequency distribution")
    
    # h2 = histogram(grna_dict["p_gRNA_edit"], 
    #                 normalize = :probability,
    #                 linecolor = "white",
    #                 label="", 
    #                 color=:turquoise4,
    #                 xtickfontsize=10,ytickfontsize=10, xlim = (0, 1),
    #                 xticks=(0:0.1:1),
    #                 bins = 150,
    #                 xlabel="gRNA editing efficiency", 
    #                 ylabel="Relative frequency", 
    #                 title="gRNA genome editing effiency distribution")

    # p_plot = plot(plant_library_sizes, Pₓ₂, label="Pₓ₂", 
    #             title="Probability of full combinatorial coverage with respect to plant library size",
    #             xlabel="N", ylabel="Pₓₖ", 
    #             xticks = (0:500:50000, string.(0:500:50000)),
    #             size=(900,400), color=:turquoise4, linewidth=2)
    #             hline!([0.95], linestyle=:dash, color=:grey, label="Pₓₖ = 0.95", legend=:bottomright)

    # exp_plot = plot(plant_library_sizes, expected_γₓ₂,
    #             label="E[γₓ₂]", title="Expected combinatorial coverage w.r.t. plant library size",
    #             xlabel="N", ylabel="E[γₓₖ]", 
    #             xticks = (0:500:50000, string.(0:500:50000)),
    #             size=(800,400), color=:turquoise4, linewidth=2)
    #             hline!([0.95], linestyle=:dash, color=:grey, label="E[γₓₖ] = 0.95", legend=:bottomright)
    

    ENV["GKSwstype"]="nul"
    weave(string(@__DIR__) * "/report.jmd", 
            args = (parsed_args = parsed_args,
                    tool_info = tool_info,
                    args_info = args_info,
                    grna_dict = grna_dict,
                    #h1 = h1, h2 = h2,
                    output = out_dict); 
            doctype = "md2html", out_path = :pwd)
    ENV["GKSwstype"]="gksqt"
end

main(ARGS)