public SNVDataStore(String snvInputFile, String clusterInputFile, int normalSampleId) {
		normalSample = normalSampleId;
		somaticSNVs = new ArrayList<SNVEntry>();
		tag2SNVs = new HashMap<String, ArrayList<SNVEntry>>();
		tag2Clusters = new HashMap<String, ArrayList<Cluster>>();
		ambiguousSNVs = new ArrayList<SNVEntry>();	
		// load and process input SNVs
		if(clusterInputFile == null) {
			loadSNVFile(snvInputFile);		
		} else {
			loadSNVFileWithClusters(snvInputFile, clusterInputFile);
		}
		
		logger.fine("Sample id -> name map:");
		for(int i = 0; i < getNumSamples(); i++) {
			logger.fine(i + ": " + getSampleName(i));
		}
		logger.fine("Initial robust groups:");
		reportSNVGroups();
		if(Parameters.INPUT_FORMAT == Parameters.Format.SNV_WITH_PROFILE || clusterInputFile != null) return;
		
		// handle mutations from small groups as ambiguous
		ArrayList<String> smallGroups = new ArrayList<String>();
		for(String tag : tag2SNVs.keySet()) {
			if(tag2SNVs.get(tag).size() < Parameters.MIN_GROUP_PROFILE_SUPPORT) {
				for(SNVEntry entry : tag2SNVs.get(tag)) {
					ambiguousSNVs.add(entry);
				}
				smallGroups.add(tag);
			}
		}
		for(String group : smallGroups) {
			tag2SNVs.remove(group);
		}
		// assign ambiguous SNVs to existing groups or create new groups
		assignAmbiguousSNVs();
		// process resulting groups
		filterGroups();
		logger.fine("Final SNV groups:");
		reportSNVGroups();
	}