/*****************************************************
 Amino Acid Preference Toolkit in Java
 Pathogen Project
 Department of Computer Science and Engineering
 University of South Carolina
 Columbia, SC 29208
 Contact Email: rose@cse.sc.edu
*****************************************************/

import java.util.*;
import java.io.*;

public class AnalyzeClassificationResults
{
	public static void main(String[] args)
	{
		//args[0] = classification profile names (in a file)
		//args[1] = real classification values
		//args[2] = classification tool outputs
		//args[3] = number of profiles



		try
		{
			String profileFilename = args[0];
			String realClassificationFilename = args[1];
			String toolClassificationFilename = args[2];

			Hashtable profileToIndexTable = new Hashtable();

			BufferedReader bufferedReader = new BufferedReader(new FileReader(profileFilename));
			int numberOfProfiles = Integer.parseInt(args[3]);
			double[][] classificationMatrix = new double[numberOfProfiles][numberOfProfiles];
			String[] profileNames = new String[numberOfProfiles];

			for (int i = 0; i < numberOfProfiles; i++)
			{
				String profileName = bufferedReader.readLine();
				//System.out.println("Read profile name: " + profileName);
				profileNames[i] = profileName;
				profileToIndexTable.put(profileName, new Integer(i));
			}
			bufferedReader.close();

			double correct = 0;
			double wrong = 0;
			double total = 0;

			BufferedReader realClassificationReader = new BufferedReader(new FileReader(realClassificationFilename));
			BufferedReader toolClassificationReader = new BufferedReader(new FileReader(toolClassificationFilename));

			String realClassificationString;
			String toolClassificationString;
			String realClassification;
			String toolClassification;
			StringTokenizer realClassificationTokenizer;
			StringTokenizer toolClassificationTokenizer;
			int realClassificationIndex;
			int toolClassificationIndex;

			

			while ((realClassificationString = realClassificationReader.readLine()) != null)
			{
				toolClassificationString = toolClassificationReader.readLine();	
				realClassificationTokenizer = new StringTokenizer(realClassificationString, ":");
				toolClassificationTokenizer = new StringTokenizer(toolClassificationString, ":");
				//System.out.println("Read classifications: " + realClassificationString + " Tool classification: " + toolClassificationString);

				String sequenceName =  realClassificationTokenizer.nextToken();
				toolClassificationTokenizer.nextToken();
				realClassification = realClassificationTokenizer.nextToken().trim();
				toolClassification = toolClassificationTokenizer.nextToken().trim();

				//System.out.println("Getting indexes:" + realClassification);
				realClassificationIndex = ((Integer)profileToIndexTable.get(realClassification)).intValue();
				//System.out.println("Getting indexes:" + toolClassification);
				toolClassificationIndex = ((Integer)profileToIndexTable.get(toolClassification)).intValue();

				
				//System.out.println("Updating total:");
				total = total + 1;
				//System.out.println("Updating right/wrong");
				if (realClassificationIndex == toolClassificationIndex)
				{
					System.out.println(sequenceName + " => Correctly identified " + realClassification + " as " + toolClassification); 
					correct = correct + 1;
				}
				else
				{
					System.out.println(sequenceName + " => Wrongly identified " + realClassification + " as " + toolClassification); 
					wrong = wrong + 1;
				}
				//System.out.println("Updating matrix");
				classificationMatrix[realClassificationIndex][toolClassificationIndex] = classificationMatrix[realClassificationIndex][toolClassificationIndex] + 1;
				

			}

			System.out.println();


			realClassificationReader.close();
			toolClassificationReader.close();
			double correctPercentage = correct / total;
			double wrongPercentage = wrong / total;
			System.out.println("Total classifications => " + total);			
			System.out.println("Correct classifications => " + correct + " (" + correctPercentage + ")");
			System.out.println("Incorrect classifications => " + wrong + " (" + wrongPercentage + ")");
			

			System.out.println();
			for (int i = 0; i < numberOfProfiles; i++)
			{
				System.out.println("Real Classification: " + profileNames[i]);
				System.out.println("Tool Classification Matrix: ");
				for (int j = 0; j < numberOfProfiles; j++)
				{
					System.out.println("\t" + profileNames[j] + " " + classificationMatrix[i][j]);
				}
				System.out.println();
			}

		}
		catch(Exception exception)
		{
			exception.printStackTrace();
		}

	}
}
