private String assemble(KmersGenerator kmersGenerator, int oneKmerLength, int kmersOverlapLength, int graphDegree) throws IOException {
		
		List<String> kmers = kmersGenerator.getKmers(oneKmerLength, kmersOverlapLength);
		String inputSequence = kmersGenerator.getInputSequence();
		String resultSequence = null;

			Logger.log("K-MERS: " + kmers.toString());
			Logger.log("INPUT:  " + inputSequence);

		try {
			Assembler assembler = new Assembler();
			assembler.loadSequence(inputSequence);
			assembler.loadKmers(kmers);
			
			long startTime = System.nanoTime();
			
			assembler.buildDeBruijnGraph(graphDegree);
			
			long elapsedTime = System.nanoTime() - startTime;
			double elapsedTimeInSeconds = (double)elapsedTime / 1000000000.0;
			Logger.log("de Bruijn graph building", Double.toString(elapsedTimeInSeconds));
			
			resultSequence = TimeMeasureHandler.executeAndMeasure(new AssembleCommand(assembler, graphDegree), "finding eulerian path");

			Logger.log("RESULT: " + resultSequence);
			
			if(inputSequence.equals(resultSequence)) {
				Logger.log("INPUT equals RESULT");
			}
			else {
				Logger.log("INPUT differs from RESULT");
				
				startTime = System.nanoTime();
				int longestCommonSubstringLength = Helpers.longestSubstringLength(inputSequence, resultSequence);
				Logger.log("longest: " + longestCommonSubstringLength);
				Logger.logLongestCommonSubstringLength(Integer.toString(longestCommonSubstringLength));
				elapsedTime = System.nanoTime() - startTime;
				elapsedTimeInSeconds = (double)elapsedTime / 1000000000.0;
				Logger.log("longest substring searching", Double.toString(elapsedTimeInSeconds));
			}
			
			
		} catch (MbiException e) {
			Logger.log("Exception: " + e.getMessage());
		} catch (Exception e) {
			Logger.log("Exception: " + e.getMessage());
		}

		return resultSequence;
	}