public static List<Cluster> getClusteredList(File dereppedFile, int minNumRequired) throws Exception
	{
		List<Cluster> list = getInitialListFromDereplicatedFile(dereppedFile, minNumRequired);
		
		System.out.println(list.size());
		int numMerged =0;
		
		for( int x=0; x < list.size() -1; x++)
		{
			Cluster xCluster = list.get(x);
			
			if( xCluster.merged == false )
			{
				HashMap<Long, Integer> xMap = HashHolder.getWordIndex(xCluster.consensusSequence, WORD_SIZE);
				xCluster.merged = true;
				for( int y=x+1; y < list.size(); y++)
				{
					Cluster yCluster = list.get(y);
					
					if( yCluster.merged == false)
					{	
						HashHolder yPosition = getMatchPosition(xMap, yCluster.consensusSequence);
						
						if( yPosition != null)
						{
							int max = Math.max(xCluster.consensusSequence.length(), yCluster.consensusSequence.length());
							int numErrors = (int) (0.03 * max+ 1 );
								
							
							DP_Expand expand = new DP_Expand(xCluster.consensusSequence, 
									yCluster.consensusSequence, xMap.get(yPosition.getBits()), 
											yPosition.getStringIndex(), WORD_SIZE, numErrors);
							
							if( expand.alignmentWasSuccesful())
							{
								yCluster.merged = true;
								yCluster.yMerged = true;
								
								double distance = 
									((double)expand.getNumErrors()) 
									/ Math.min(xCluster.consensusSequence.length(), yCluster.consensusSequence.length());
								
								EditRepresentation er = new EditRepresentation(yCluster.getTotalNum(),
													expand.getEditList(), distance);
								
								xCluster.clusteredSequences.add(er);
								numMerged++;
								
								if( numMerged %10000 == 0 )
									System.out.println("Merged " + x + " with " + y  +" as merge # " + numMerged);
							}
						}
					}
				}
			}	
		}
		
		Collections.sort(list);
		
		return list;
	}