@@ -92,6 +92,7 @@ import core.atomic;
92
92
93
93
import sambamba.utils.common.progressbar;
94
94
import sambamba.utils.common.overwrite;
95
+ import sambamba.utils.common.filtering;
95
96
96
97
void printUsage () {
97
98
stderr.writeln(" Usage: sambamba-merge [options] <output.bam> <input1.bam> <input2.bam> [...]" );
@@ -104,6 +105,8 @@ void printUsage() {
104
105
stderr.writeln(" output merged header to stdout in SAM format, other options are ignored; mainly for debug purposes" );
105
106
stderr.writeln(" -p, --show-progress" );
106
107
stderr.writeln(" show progress bar in STDERR" );
108
+ stderr.writeln(" -F, --filter=FILTER" );
109
+ stderr.writeln(" keep only reads that satisfy FILTER" );
107
110
}
108
111
109
112
// these variables can be implicitly used in tasks created in writeBAM
@@ -114,6 +117,7 @@ shared(string[string][]) program_id_map;
114
117
shared (string [string ][]) readgroup_id_map;
115
118
116
119
__gshared static TaskPool task_pool;
120
+ __gshared static Filter read_filter;
117
121
118
122
BamRead changeAlignment (Tuple ! (BamRead, size_t ) al_with_file_id) {
119
123
auto al = al_with_file_id[0 ];
@@ -157,14 +161,10 @@ BamRead changeAlignment(Tuple!(BamRead, size_t) al_with_file_id) {
157
161
}
158
162
159
163
auto modifyAlignmentRange (T)(T alignments_with_file_id) {
160
- version (serial) {
161
- return map! changeAlignment(zip(alignments_with_file_id[0 ],
162
- repeat(alignments_with_file_id[1 ])));
163
- } else {
164
- return task_pool.map! changeAlignment(zip(alignments_with_file_id[0 ],
165
- repeat(alignments_with_file_id[1 ])),
166
- 8192 );
167
- }
164
+ return task_pool.map! changeAlignment(
165
+ zip(filtered(alignments_with_file_id[0 ], read_filter),
166
+ repeat(alignments_with_file_id[1 ])),
167
+ 8192 );
168
168
}
169
169
170
170
version (standalone) {
@@ -180,6 +180,7 @@ int merge_main(string[] args) {
180
180
bool validate_headers = false ;
181
181
bool header_only = false ;
182
182
bool show_progress = false ;
183
+ string filter_str = null ;
183
184
184
185
if (args.length < 4 ) {
185
186
printUsage();
@@ -194,7 +195,10 @@ int merge_main(string[] args) {
194
195
" compression-level|l" , &compression_level,
195
196
" validate-headers|v" , &validate_headers,
196
197
" header|H" , &header_only,
197
- " show-progress|p" , &show_progress);
198
+ " show-progress|p" , &show_progress,
199
+ " filter|F" , &filter_str);
200
+
201
+ read_filter = createFilterFromQuery(filter_str);
198
202
199
203
task_pool = new TaskPool(number_of_threads);
200
204
scope (exit) task_pool.finish();
0 commit comments