         // copy it to the device
         const io::ReadDataDevice d_read_data( *h_read_data );
 
+        const uint32 n_reads = d_read_data.size();
+
         log_info(stderr, "  loading reads... done\n");
-        log_info(stderr, "    %u reads\n", d_read_data.size());
+        log_info(stderr, "    %u reads\n", n_reads);
 
         // prepare some typedefs for the involved string-sets and infixes
         typedef io::ReadData::const_read_string_set_type                        string_set_type;    // the read string-set


// perform q-gram index mapping
//
template <typename qgram_index_type, typename genome_string>
void map(
          qgram_index_type&     qgram_index,
    const io::ReadDataDevice&   reads,
    const uint32                n_queries,
    const uint32                genome_len,

                d_genome,
                stats );

            cudaDeviceSynchronize();
            timer.stop();
            time += timer.seconds();

            const float genome_ratio = float( genome_end ) / float( genome_len );

            log_verbose(stderr, "\r  aligned %5.2f%% of genome (%6.2f K reads/s)", 100.0f * genome_ratio, (1.0e-3f * n_reads) * genome_ratio / time  );
        }
        log_verbose_cont(stderr, "\n");


        // accumulate the number of aligned reads
        stats.reads += n_reads;
        stats.time  += time;

        log_info(stderr, "  aligned %.1f M reads (%6.2f K reads/s)\n", 1.0e-6f * float(stats.reads), (1.0e-3f * float( stats.reads )) / stats.time);
        log_verbose(stderr, "  breakdown:\n");
        log_verbose(stderr, "    extract throughput : %.2f B q-grams/s\n", (1.0e-9f * float( stats.queries )) / stats.extract_time);
        log_verbose(stderr, "    rank throughput    : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.rank_time);
        log_verbose(stderr, "                       : %6.2f B seeds/s\n", (1.0e-9f * float( stats.queries )) / stats.rank_time);
        log_verbose(stderr, "    locate throughput  : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.locate_time);
        log_verbose(stderr, "    align throughput   : %6.2f K reads/s\n", (1.0e-3f * float( stats.reads )) / stats.align_time);
        log_verbose(stderr, "                       : %6.2f M hits/s\n",  (1.0e-6f * float( stats.merged )) / stats.align_time);
        log_verbose(stderr, "    matches            : %.2f M\n", 1.0e-6f * float( stats.matches ) );
        log_verbose(stderr, "    occurrences        : %.3f B\n", 1.0e-9f * float( stats.occurrences ) );
        log_verbose(stderr, "    merged occurrences : %.3f B (%.1f %%)\n", 1.0e-9f * float( stats.merged ), 100.0f * float(stats.merged)/float(stats.occurrences));
    }
    return 0;
}
