@@ -1156,88 +1156,67 @@ void align_or_map_single(
1156
1156
Details details;
1157
1157
Timer strobe_timer;
1158
1158
std::string seq_revcomp = reverse_complement (record.seq );
1159
- std::vector<QueryRandstrobe> query_randstrobes[2 ];
1160
- std::vector<Nam> nams[2 ];
1159
+ std::vector<Nam> nams;
1161
1160
for (bool revcomp : {false , true }) {
1162
1161
const std::string& seq = revcomp ? seq_revcomp : record.seq ;
1163
- query_randstrobes[revcomp] = randstrobes_query (seq, index_parameters);
1162
+ auto query_randstrobes = randstrobes_query (seq, index_parameters);
1164
1163
1165
- statistics.n_randstrobes += query_randstrobes[revcomp] .size ();
1164
+ statistics.n_randstrobes += query_randstrobes.size ();
1166
1165
statistics.tot_construct_strobemers += strobe_timer.duration ();
1167
1166
1168
1167
// Find NAMs
1169
1168
Timer nam_timer;
1170
- auto [nonrepetitive_fraction, n_hits, nams_found] = find_nams (query_randstrobes[revcomp], index , map_param.use_mcs );
1171
- nams[revcomp] = nams_found;
1169
+ auto [nonrepetitive_fraction, n_hits, nams_found] = find_nams (query_randstrobes, index , map_param.use_mcs );
1172
1170
statistics.tot_find_nams += nam_timer.duration ();
1173
1171
statistics.n_hits += n_hits;
1174
- details.nams += nams[revcomp] .size ();
1172
+ details.nams += nams_found .size ();
1175
1173
1176
- if (map_param.rescue_level > 1 && (nams[revcomp] .empty () || nonrepetitive_fraction < 0.7 )) {
1174
+ if (map_param.rescue_level > 1 && (nams_found .empty () || nonrepetitive_fraction < 0.7 )) {
1177
1175
Timer rescue_timer;
1178
1176
int n_rescue_hits;
1179
- std::tie (n_rescue_hits, nams[revcomp]) = find_nams_rescue (query_randstrobes[revcomp], index , map_param.rescue_cutoff , map_param.use_mcs );
1180
- statistics.n_rescue_hits += n_rescue_hits;
1181
- details.rescue_nams += nams[revcomp].size ();
1177
+ std::tie (n_rescue_hits, nams_found) = find_nams_rescue (query_randstrobes, index , map_param.rescue_cutoff , map_param.use_mcs );
1178
+ details.rescue_nams += nams_found.size ();
1182
1179
details.nam_rescue = true ;
1180
+ statistics.n_rescue_hits += n_rescue_hits;
1183
1181
statistics.tot_time_rescue += rescue_timer.duration ();
1184
1182
}
1185
- }
1186
-
1187
- for ( auto &n : nams[ 1 ]) {
1188
- n. is_rc = true ;
1183
+ for ( auto &nam : nams_found) {
1184
+ nam. is_rc = revcomp;
1185
+ nams. push_back (nam);
1186
+ }
1189
1187
}
1190
1188
1191
1189
Timer nam_sort_timer;
1192
- for (int i = 0 ; i < 2 ; ++i) {
1193
- std::sort (nams[i].begin (), nams[i].end (), by_score<Nam>);
1194
- shuffle_top_nams (nams[i], random_engine);
1195
- }
1190
+ std::sort (nams.begin (), nams.end (), by_score<Nam>);
1191
+ shuffle_top_nams (nams, random_engine);
1196
1192
statistics.tot_sort_nams += nam_sort_timer.duration ();
1197
1193
1198
1194
#ifdef TRACE
1199
1195
std::cerr << " Query: " << record.name << ' \n ' ;
1200
- for (bool revcomp : {false , true }) {
1201
- std::cerr << " Found " << nams[revcomp].size () << " NAMs for "
1202
- << (revcomp ? " reverse-complemented" : " forward" ) << " query\n " ;
1203
- for (auto & nam : nams[revcomp]) {
1204
- std::cerr << " - " << nam << ' \n ' ;
1205
- }
1196
+ std::cerr << " Found " << nams.size () << " NAMs:\n " ;
1197
+ for (auto & nam : nams) {
1198
+ std::cerr << " - " << nam << ' \n ' ;
1206
1199
}
1207
1200
#endif
1208
1201
1209
- // Forward or reverse complement?
1210
- // TODO this does not allow us to have secondary hits in a different
1211
- // orientation. We should merge the NAMs into one vector again.
1212
- int orientation;
1213
- if (nams[0 ].empty ()) {
1214
- orientation = 1 ;
1215
- } else if (nams[1 ].empty ()) {
1216
- orientation = 0 ;
1217
- } else if (nams[0 ][0 ].score >= nams[1 ][0 ].score ) {
1218
- orientation = 0 ;
1219
- } else {
1220
- orientation = 1 ;
1221
- }
1222
-
1223
1202
Timer extend_timer;
1224
1203
size_t n_best = 0 ;
1225
1204
switch (map_param.output_format ) {
1226
1205
case OutputFormat::Abundance: {
1227
- if (!nams[orientation] .empty ()){
1228
- for (auto &t : nams[orientation] ) {
1229
- if (t.score == nams[orientation][ 0 ].score ){
1206
+ if (!nams.empty ()){
1207
+ for (auto &t : nams) {
1208
+ if (t.score == nams[0 ].score ){
1230
1209
++n_best;
1231
1210
} else {
1232
1211
break ;
1233
1212
}
1234
1213
}
1235
1214
1236
- for (auto &nam: nams[orientation] ) {
1215
+ for (auto &nam: nams) {
1237
1216
if (nam.ref_start < 0 ) {
1238
1217
continue ;
1239
1218
}
1240
- if (nam.score != nams[orientation][ 0 ].score ){
1219
+ if (nam.score != nams[0 ].score ){
1241
1220
break ;
1242
1221
}
1243
1222
abundances[nam.ref_id ] += float (record.seq .length ()) / float (n_best);
@@ -1246,12 +1225,12 @@ void align_or_map_single(
1246
1225
}
1247
1226
break ;
1248
1227
case OutputFormat::PAF:
1249
- output_hits_paf (outstring, nams[orientation] , record.name , references,
1228
+ output_hits_paf (outstring, nams, record.name , references,
1250
1229
record.seq .length ());
1251
1230
break ;
1252
1231
case OutputFormat::SAM:
1253
1232
align_single (
1254
- aligner, sam, nams[orientation] , record, index_parameters.syncmer .k ,
1233
+ aligner, sam, nams, record, index_parameters.syncmer .k ,
1255
1234
references, details, map_param.dropoff_threshold , map_param.max_tries ,
1256
1235
map_param.max_secondary , random_engine
1257
1236
);
0 commit comments