     Timer timer;
     timer.start();
 
-    const read_string_set_type read_string_set = reads.const_read_string_set();
+    const read_view_type reads_view = reads;
+    const read_string_set_type read_string_set = reads_view.sequence_string_set();
     const seed_string_set_type seed_string_set = extract_seeds(
         read_string_set,
         params.seed_len,

    // keep stats
    Stats stats;

    while (1)
    {
        // load a batch of reads
        SharedPointer<io::ReadData> h_read_data( read_data_file->next( batch_reads, batch_bps ) );
        if (h_read_data == NULL)
            break;

        log_info(stderr, "  loading reads... started\n");

        // copy it to the device
        const io::ReadDataDevice d_read_data( *h_read_data );

        const uint32 n_reads = d_read_data.size() / 2;


    // open a read file
    log_info(stderr, "  opening reads file... started\n");

    SharedPointer<io::SequenceDataStream> read_data_file(
        io::open_sequence_file(
            DNA_N,
            reads,
            io::Phred33,
            2*max_reads,
            uint32(-1),
            io::SequenceEncoding( io::FORWARD | io::REVERSE_COMPLEMENT ) ) );

    // check whether the file opened correctly
    if (read_data_file == NULL || read_data_file->is_ok() == false)
