private void processSequence(ShortKmer startKmer) {
        int value = hm.getWithZero(startKmer.toLong());

        StringBuilder sequenceSB = new StringBuilder(startKmer.toString());
        long seqWeight = value;
        int minWeight = value, maxWeight = value;

        ShortKmer kmer = new ShortKmer(startKmer);

        while (true) {
            byte rightNuc = HashMapOperations.getRightNucleotide(hm, kmer, freqThreshold);
            if (rightNuc < 0) {
                break;
            }
            kmer.shiftRight(rightNuc);
            byte leftNuc = HashMapOperations.getLeftNucleotide(hm, kmer, freqThreshold);
            if (leftNuc < 0) {
                break;
            }

            sequenceSB.append(DnaTools.toChar(rightNuc));
            value = hm.getWithZero(kmer.toLong());
            seqWeight += value;
            minWeight = Math.min(minWeight, value);
            maxWeight = Math.max(maxWeight, value);
        }

        if (sequenceSB.length() >= lenThreshold) {
            long stKmer = startKmer.toLong();
            long endKmer = kmer.toLong();

            // we want to print one sequence of two (fw and rc) - one with min long value of start kmer
            if (stKmer > endKmer) {
                return;
            }

            if (stKmer == endKmer) {  // print any sequence, but only one of them
                synchronized (used) {
                    if (used.contains(stKmer) || used.contains(endKmer)) {
                        // sequence was already printed
                        return;
                    } else {
                        used.add(stKmer);
                    }
                }
            }
            sequences.add(new Sequence(new Dna(sequenceSB.toString()),
                    (int) (seqWeight / (sequenceSB.length() - k + 1)), minWeight, maxWeight));
        }
    }