Skip to content

Commit 87014b3

Browse files
restructuring
Signed-off-by: AdityaPandeyCN <[email protected]>
1 parent 2fa3604 commit 87014b3

File tree

4 files changed

+164
-155
lines changed

4 files changed

+164
-155
lines changed

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ if(RAMTOOLS_BUILD_TOOLS)
7474
add_subdirectory(tools)
7575
endif()
7676

77-
if(RAMTOOLS_BUILD_BENCHMARKS)
77+
# Include benchmark directory if benchmarks OR tests are enabled
78+
# (sam_generator is needed by tests)
79+
if(RAMTOOLS_BUILD_BENCHMARKS OR RAMTOOLS_BUILD_TESTS)
7880
add_subdirectory(benchmark)
7981
endif()
8082

benchmark/CMakeLists.txt

Lines changed: 68 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,80 @@
11
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
2-
include(GoogleBenchmark)
32

4-
add_library(sam_generator STATIC
5-
generate_sam_benchmark.cxx
6-
)
3+
if(RAMTOOLS_BUILD_TESTS OR RAMTOOLS_BUILD_BENCHMARKS)
4+
add_library(sam_generator STATIC
5+
generate_sam.cxx
6+
)
77

8-
target_include_directories(sam_generator PUBLIC
9-
${CMAKE_CURRENT_SOURCE_DIR}
10-
)
8+
target_include_directories(sam_generator PUBLIC
9+
${CMAKE_CURRENT_SOURCE_DIR}
10+
)
11+
endif()
1112

12-
target_link_libraries(sam_generator PRIVATE
13-
benchmark::benchmark
14-
)
13+
if(RAMTOOLS_BUILD_BENCHMARKS)
14+
include(GoogleBenchmark)
15+
16+
add_library(ramtools_views STATIC
17+
${CMAKE_SOURCE_DIR}/tools/ramview.cxx
18+
${CMAKE_SOURCE_DIR}/tools/ramntupleview.cxx
19+
)
1520

16-
add_library(ramtools_views STATIC
17-
${CMAKE_SOURCE_DIR}/tools/ramview.cxx
18-
${CMAKE_SOURCE_DIR}/tools/ramntupleview.cxx
19-
)
21+
target_link_libraries(ramtools_views PRIVATE
22+
ramcore
23+
ROOT::TreePlayer
24+
)
2025

21-
target_link_libraries(ramtools_views PRIVATE
22-
ramcore
23-
ROOT::TreePlayer
24-
)
26+
ROOT_EXECUTABLE(sam_to_ram_benchmark
27+
sam_to_ram_benchmark.cxx
28+
LIBRARIES
29+
benchmark::benchmark
30+
ramcore
31+
sam_generator
32+
)
2533

26-
ROOT_EXECUTABLE(sam_to_ram_benchmark
27-
sam_to_ram_benchmark.cxx
28-
LIBRARIES
29-
benchmark::benchmark
30-
ramcore
31-
sam_generator
32-
)
34+
ROOT_EXECUTABLE(conversion_time_benchmark
35+
conversion_time_benchmark.cxx
36+
LIBRARIES
37+
benchmark::benchmark
38+
ramcore
39+
sam_generator
40+
)
3341

34-
ROOT_EXECUTABLE(conversion_time_benchmark
35-
conversion_time_benchmark.cxx
36-
LIBRARIES
37-
benchmark::benchmark
38-
ramcore
39-
sam_generator
40-
)
42+
ROOT_EXECUTABLE(region_query_benchmark
43+
region_query_benchmark.cxx
44+
LIBRARIES
45+
benchmark::benchmark
46+
ramcore
47+
sam_generator
48+
ramtools_views
49+
)
4150

42-
ROOT_EXECUTABLE(region_query_benchmark
43-
region_query_benchmark.cxx
44-
LIBRARIES
45-
benchmark::benchmark
46-
ramcore
47-
sam_generator
48-
ramtools_views
49-
)
51+
ROOT_EXECUTABLE(chromosome_split_benchmark
52+
chromosome_split_benchmark.cxx
53+
LIBRARIES
54+
benchmark::benchmark
55+
ramcore
56+
sam_generator
57+
)
5058

51-
ROOT_EXECUTABLE(chromosome_split_benchmark
52-
chromosome_split_benchmark.cxx
53-
LIBRARIES
54-
benchmark::benchmark
55-
ramcore
56-
sam_generator
57-
)
59+
install(TARGETS sam_to_ram_benchmark conversion_time_benchmark region_query_benchmark chromosome_split_benchmark
60+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
61+
)
5862

59-
install(TARGETS sam_to_ram_benchmark conversion_time_benchmark region_query_benchmark chromosome_split_benchmark
60-
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
61-
)
62-
63-
add_custom_target(benchmark
64-
COMMAND ${CMAKE_COMMAND} -E echo "=== SAM to RAM Benchmark ==="
65-
COMMAND sam_to_ram_benchmark
66-
COMMAND ${CMAKE_COMMAND} -E echo ""
67-
COMMAND ${CMAKE_COMMAND} -E echo "=== Conversion Time Benchmark ==="
68-
COMMAND conversion_time_benchmark
69-
COMMAND ${CMAKE_COMMAND} -E echo ""
70-
COMMAND ${CMAKE_COMMAND} -E echo "=== Region Query Benchmark ==="
71-
COMMAND region_query_benchmark
72-
COMMAND ${CMAKE_COMMAND} -E echo ""
73-
COMMAND ${CMAKE_COMMAND} -E echo "=== Chromosome Split Benchmark ==="
74-
COMMAND chromosome_split_benchmark
75-
DEPENDS sam_to_ram_benchmark conversion_time_benchmark region_query_benchmark chromosome_split_benchmark
76-
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
77-
COMMENT "Running all RAM tools benchmarks"
78-
)
63+
add_custom_target(benchmark
64+
COMMAND ${CMAKE_COMMAND} -E echo "=== SAM to RAM Benchmark ==="
65+
COMMAND sam_to_ram_benchmark
66+
COMMAND ${CMAKE_COMMAND} -E echo ""
67+
COMMAND ${CMAKE_COMMAND} -E echo "=== Conversion Time Benchmark ==="
68+
COMMAND conversion_time_benchmark
69+
COMMAND ${CMAKE_COMMAND} -E echo ""
70+
COMMAND ${CMAKE_COMMAND} -E echo "=== Region Query Benchmark ==="
71+
COMMAND region_query_benchmark
72+
COMMAND ${CMAKE_COMMAND} -E echo ""
73+
COMMAND ${CMAKE_COMMAND} -E echo "=== Chromosome Split Benchmark ==="
74+
COMMAND chromosome_split_benchmark
75+
DEPENDS sam_to_ram_benchmark conversion_time_benchmark region_query_benchmark chromosome_split_benchmark
76+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
77+
COMMENT "Running all RAM tools benchmarks"
78+
)
79+
endif()
7980

benchmark/generate_sam.cxx

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include "generate_sam_benchmark.h"
2+
#include <fstream>
3+
#include <random>
4+
#include <vector>
5+
#include <string>
6+
#include <iostream>
7+
8+
#ifndef BASE_SAM_READS
9+
#define BASE_SAM_READS 100
10+
#endif
11+
12+
void GenerateSAMFile(const std::string& filename, int num_reads) {
13+
std::mt19937 rng(42);
14+
std::vector<std::pair<std::string, int>> chromosomes = {
15+
{"chr1", 249250621}, {"chr2", 243199373}, {"chr3", 198022430},
16+
{"chr4", 191154276}, {"chr5", 180915260}, {"chr6", 171115067},
17+
{"chr7", 159138663}, {"chr8", 146364022}, {"chr9", 141213431},
18+
{"chr10", 135534747}, {"chr11", 135006516}, {"chr12", 133851895},
19+
{"chr13", 115169878}, {"chr14", 107349540}, {"chr15", 102531392},
20+
{"chr16", 90354753}, {"chr17", 81195210}, {"chr18", 78077248},
21+
{"chr19", 59128983}, {"chr20", 63025520}, {"chr21", 48129895},
22+
{"chr22", 51304566}, {"chrM", 16571}, {"chrX", 155270560}
23+
};
24+
25+
const char bases[4] = {'A', 'C', 'G', 'T'};
26+
std::ofstream out(filename);
27+
for (const auto& [chrom, length] : chromosomes) {
28+
out << "@SQ\tSN:" << chrom << "\tLN:" << length << "\n";
29+
}
30+
31+
std::uniform_int_distribution<> base_dist(0, 3);
32+
std::uniform_int_distribution<> flag_dist(0, 1);
33+
std::uniform_int_distribution<> chrom_dist(0, chromosomes.size() - 1);
34+
std::uniform_int_distribution<> qual_dist(33, 73);
35+
std::uniform_int_distribution<> fc_dist(10000, 99999);
36+
std::uniform_int_distribution<> lane_dist(1, 8);
37+
std::uniform_int_distribution<> tile_dist(1, 300);
38+
std::uniform_int_distribution<> coord_dist(1, 1000);
39+
std::uniform_int_distribution<> mismatch_dist(0, 9);
40+
41+
for (int i = 0; i < num_reads; ++i) {
42+
auto [chrom, chrom_length] = chromosomes[chrom_dist(rng)];
43+
int read_length = 36;
44+
std::uniform_int_distribution<> pos_dist(1, std::max(1, chrom_length - read_length));
45+
int position = pos_dist(rng);
46+
47+
out << "SOLEXA-1GA-2_2_FC" << fc_dist(rng)
48+
<< ":" << lane_dist(rng)
49+
<< ":" << tile_dist(rng)
50+
<< ":" << coord_dist(rng)
51+
<< ":" << coord_dist(rng) << "\t";
52+
53+
out << (flag_dist(rng) * 16) << "\t"
54+
<< chrom << "\t"
55+
<< position << "\t"
56+
<< 25 << "\t";
57+
58+
out << read_length << "M\t";
59+
out << "*\t0\t0\t";
60+
61+
std::string sequence;
62+
sequence.reserve(read_length);
63+
for (int j = 0; j < read_length; ++j) {
64+
sequence += bases[base_dist(rng)];
65+
}
66+
out << sequence << "\t";
67+
68+
for (int j = 0; j < read_length; ++j) {
69+
out << static_cast<char>(qual_dist(rng));
70+
}
71+
72+
int nm = mismatch_dist(rng) < 7 ? 0 : 1;
73+
out << "\tNM:i:" << nm;
74+
out << "\tX" << nm << ":i:1";
75+
out << "\tMD:Z:" << read_length;
76+
out << "\n";
77+
}
78+
out.close();
79+
}
80+
Lines changed: 13 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,20 @@
11
#include <benchmark/benchmark.h>
22
#include "generate_sam_benchmark.h"
3-
#include <fstream>
4-
#include <random>
5-
#include <vector>
6-
#include <string>
7-
#include <iostream>
83
#include <cstdio> // For std::remove
94

10-
#ifndef BASE_SAM_READS
11-
#define BASE_SAM_READS 100
12-
#endif
13-
14-
void GenerateSAMFile(const std::string& filename, int num_reads) {
15-
std::mt19937 rng(42);
16-
std::vector<std::pair<std::string, int>> chromosomes = {
17-
{"chr1", 249250621}, {"chr2", 243199373}, {"chr3", 198022430},
18-
{"chr4", 191154276}, {"chr5", 180915260}, {"chr6", 171115067},
19-
{"chr7", 159138663}, {"chr8", 146364022}, {"chr9", 141213431},
20-
{"chr10", 135534747}, {"chr11", 135006516}, {"chr12", 133851895},
21-
{"chr13", 115169878}, {"chr14", 107349540}, {"chr15", 102531392},
22-
{"chr16", 90354753}, {"chr17", 81195210}, {"chr18", 78077248},
23-
{"chr19", 59128983}, {"chr20", 63025520}, {"chr21", 48129895},
24-
{"chr22", 51304566}, {"chrM", 16571}, {"chrX", 155270560}
25-
};
26-
27-
const char bases[4] = {'A', 'C', 'G', 'T'};
28-
std::ofstream out(filename);
29-
for (const auto& [chrom, length] : chromosomes) {
30-
out << "@SQ\tSN:" << chrom << "\tLN:" << length << "\n";
31-
}
32-
33-
std::uniform_int_distribution<> base_dist(0, 3);
34-
std::uniform_int_distribution<> flag_dist(0, 1);
35-
std::uniform_int_distribution<> chrom_dist(0, chromosomes.size() - 1);
36-
std::uniform_int_distribution<> qual_dist(33, 73);
37-
std::uniform_int_distribution<> fc_dist(10000, 99999);
38-
std::uniform_int_distribution<> lane_dist(1, 8);
39-
std::uniform_int_distribution<> tile_dist(1, 300);
40-
std::uniform_int_distribution<> coord_dist(1, 1000);
41-
std::uniform_int_distribution<> mismatch_dist(0, 9);
42-
43-
for (int i = 0; i < num_reads; ++i) {
44-
auto [chrom, chrom_length] = chromosomes[chrom_dist(rng)];
45-
int read_length = 36;
46-
std::uniform_int_distribution<> pos_dist(1, std::max(1, chrom_length - read_length));
47-
int position = pos_dist(rng);
48-
49-
out << "SOLEXA-1GA-2_2_FC" << fc_dist(rng)
50-
<< ":" << lane_dist(rng)
51-
<< ":" << tile_dist(rng)
52-
<< ":" << coord_dist(rng)
53-
<< ":" << coord_dist(rng) << "\t";
54-
55-
out << (flag_dist(rng) * 16) << "\t"
56-
<< chrom << "\t"
57-
<< position << "\t"
58-
<< 25 << "\t";
59-
60-
out << read_length << "M\t";
61-
out << "*\t0\t0\t";
62-
63-
std::string sequence;
64-
sequence.reserve(read_length);
65-
for (int j = 0; j < read_length; ++j) {
66-
sequence += bases[base_dist(rng)];
67-
}
68-
out << sequence << "\t";
69-
70-
for (int j = 0; j < read_length; ++j) {
71-
out << static_cast<char>(qual_dist(rng));
72-
}
73-
74-
int nm = mismatch_dist(rng) < 7 ? 0 : 1;
75-
out << "\tNM:i:" << nm;
76-
out << "\tX" << nm << ":i:1";
77-
out << "\tMD:Z:" << read_length;
78-
out << "\n";
79-
}
80-
out.close();
5+
static void BM_GenerateSAM(benchmark::State& state) {
6+
int num_reads = state.range(0);
7+
for (auto _ : state) {
8+
GenerateSAMFile("benchmark_temp.sam", num_reads);
9+
std::remove("benchmark_temp.sam");
10+
}
11+
12+
state.counters["reads_per_second"] = benchmark::Counter(
13+
num_reads, benchmark::Counter::kIsRate);
14+
state.counters["bytes_per_second"] = benchmark::Counter(
15+
num_reads * 200, benchmark::Counter::kIsRate);
8116
}
8217

83-
static void BM_GenerateSAM(benchmark::State& state) {
84-
int num_reads = state.range(0);
85-
for (auto _ : state) {
86-
GenerateSAMFile("benchmark_temp.sam", num_reads);
87-
std::remove("benchmark_temp.sam");
88-
}
18+
BENCHMARK(BM_GenerateSAM)->Range(100, 10000);
19+
BENCHMARK_MAIN();
8920

90-
state.counters["reads_per_second"] = benchmark::Counter(
91-
num_reads, benchmark::Counter::kIsRate);
92-
state.counters["bytes_per_second"] = benchmark::Counter(
93-
num_reads * 200, benchmark::Counter::kIsRate);
94-
}

0 commit comments

Comments
 (0)