coitrees 0.4.0

A very fast data structure for overlap queries on sets of intervals.
Documentation
#!/usr/bin/env julia

function main()
    random_test_filenames = Dict(
        "A"  => joinpath(pwd(), "test1.random.ucsc.nochrm.bed"),
        "B"  => joinpath(pwd(), "test2.random.ucsc.nochrm.bed"),
        "B_" => joinpath(pwd(), "test3.random.ucsc.bed"))

    random_methods = Dict(
        "coitrees"      => "./coitrees",
        # "coitrees --tree-vs-tree" => "./coitrees-tvt",
        # "cgranges `-c`" => "./cgranges",
        # "CITree"        => "./CITree",
        # "AIList"        => "./AIList",
        # "AITree"        => "./AITree",
        # # "bedtools"      => "./bedtools",
        # "NCList"        => "./NCList"
    )

    sorted_test_filenames = Dict(
        "A"  => joinpath(pwd(), "test1.ucsc.nochrm.bed"),
        "B"  => joinpath(pwd(), "test2.ucsc.nochrm.bed"),
        "B_" => joinpath(pwd(), "test3.ucsc.bed"))

    sorted_methods = copy(random_methods)
    sorted_methods["coitrees (`--sorted`)"] = "./coitrees-sorted"
    # sorted_methods["bedtools (`-sorted`)"] = "./bedtools-sorted"

    tests = [("A", "B"), ("B", "A"), ("A", "A"), ("B_", "B_")]

    test_sets = [
        ("sorted-bench.csv", sorted_test_filenames, sorted_methods),
        ("random-bench.csv", random_test_filenames, random_methods)
    ]

    # run testts
    for (output_filename, test_filenames, methods) in test_sets
        @show output_filename
        output = open(output_filename, "w")
        println(output, "method,test,time,mem")
        for (method_name, method) in methods
            for (test1, test2) in tests
                println((method_name, test1, test2))
                secs, kilos = runtest(method, test_filenames[test1], test_filenames[test2])
                println(
                    output, method_name, ",", test1, "vs", test2, ",",
                    round(secs, digits=1), ",", round(kilos/1000, digits=1))
                flush(output)
            end
        end
    end
end


function runtest(method, filename1, filename2)
    time_output_path, time_io = mktemp()
    run(pipeline(
        `time -f "%e,%M" -o $(time_output_path) $(method) $(filename1) $(filename2)`,
        stdout=open("/dev/null", "w")))
    time_str = String(read(time_io))
    return parse.(Float64, split(time_str, ','))
end


main()