private void start() throws FileNotFoundException, IOException, InterruptedException, ExecutionException {
        BufferedReader brWatson;
        if (Globals.FLAT) {
            flattenFastq(this.inputWatson);
            brWatson = new BufferedReader(new FileReader(new File(this.inputWatson + "_flat")));
        } else {
            brWatson = new BufferedReader(new FileReader(new File(this.inputWatson)));
        }

        for (int i = 0;;) {
            List<SequenceEntry> list = new LinkedList<>();
            try {
                for (int j = 0; j < Globals.STEPS; j++) {
                    i++;
                    SequenceEntry watsonQ = parseFastq(brWatson);
                    if (watsonQ != null && watsonQ.sequence.length() >= Globals.MIN_LENGTH) {
                        list.add(watsonQ);
                    } else {
                        StatusUpdate.processLength();
                    }
                    if (i % 10000 == 0) {
                        this.processResults();
                    }
                }
                synchronized (results) {
                    results.add(executor.submit(new FutureSequence(list)));
                }
            } catch (IllegalAccessError e) {
                if (!list.isEmpty()) {
                    synchronized (results) {
                        results.add(executor.submit(new FutureSequence(list)));
                    }
                }
                // used to halt in case of EOF
                break;
            }
        }

//        this.processResults();
        executor.shutdown();
        try {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
        } catch (InterruptedException e) {
            System.err.println(e);
            Utils.error();
            System.exit(0);
        }
        this.processResults();
        this.saveConsensus();
        this.resultsExecutor.shutdown();
    }