content: package aliview.color;
  
  import java.awt.Color;
  import java.awt.Font;
  import java.util.ArrayList;
  
  import aliview.AminoAcid;
  import aliview.alignment.AAHistogram;
  import aliview.alignment.AliHistogram;
  import aliview.alignment.Alignment;
  
  public class ClustalXColorScheme extends DefaultColorScheme{
  
  	static final Color CLUSTAL_RED =  new Color((float) 0.9, (float) 0.2, (float) 0.1);
  	static final Color CLUSTAL_BLUE = new Color((float) 0.5, (float) 0.7, (float) 0.9);
  	static final Color CLUSTAL_GREEN = new Color((float) 0.1, (float) 0.8, (float) 0.1);
  	static final Color CLUSTAL_ORANGE = new Color((float) 0.9, (float) 0.6, (float) 0.3);
  	static final Color CLUSTAL_CYAN =  new Color((float) 0.1, (float) 0.7, (float) 0.7);
  	static final Color CLUSTAL_PINK = new Color((float) 0.9, (float) 0.5, (float) 0.5);
  	static final Color CLUSTAL_MAGENTA = new Color((float) 0.8, (float) 0.3, (float) 0.8);
  	static final Color CLUSTAL_YELLOW = new Color((float) 0.8, (float) 0.8, (float) 0.0);
  
  	//	static Color SELECTED_CLUSTAL_RED =  new Color((float) 0.9, (float) 0.2, (float) 0.1);
  	//	static Color CLUSTAL_BLUE = new Color((float) 0.5, (float) 0.7, (float) 0.9);
  	//	static Color CLUSTAL_GREEN = new Color((float) 0.1, (float) 0.8, (float) 0.1);
  	//	static Color CLUSTAL_ORANGE = new Color((float) 0.9, (float) 0.6, (float) 0.3);
  	//	static Color CLUSTAL_CYAN =  new Color((float) 0.1, (float) 0.7, (float) 0.7);
  	//	static Color CLUSTAL_PINK = new Color((float) 0.9, (float) 0.5, (float) 0.5);
  	//	static Color CLUSTAL_MAGENTA = new Color((float) 0.8, (float) 0.3, (float) 0.8);
  	//	static Color CLUSTAL_YELLOW = new Color((float) 0.8, (float) 0.8, (float) 0.0);
  
  	static final Color COLOR_FOREGROUND = Color.BLACK;
  	static final Color COLOR_FOREGROUND_SELECTED = Color.WHITE;
  	static final Color COLOR_BACKGROUND_SELECTED = Color.LIGHT_GRAY.darker();
  
  	static final Color COLOR_OTHER = Color.WHITE;
  
  	public ClustalXColorScheme() {
  		super();
  	}
  
  	private static ColorThreshold percent = new ColorThreshold("WLVIMAFCHP",0.6);
  	private static ColorThreshold number = new ColorThreshold("WLVIMAFCHP",0.8);
  	private static ColorThreshold minus = new ColorThreshold("ED",0.5);
  	private static ColorThreshold plus = new ColorThreshold("KR",0.6);
  	private static ColorThreshold g = new ColorThreshold("G",0.5);
  	private static ColorThreshold n = new ColorThreshold("N",0.5);
  	private static ColorThreshold q = new ColorThreshold("QE",0.5);
  	private static ColorThreshold p = new ColorThreshold("P",0.5);
  	private static ColorThreshold t = new ColorThreshold("TS",0.5);
  	private static ColorThreshold A = new ColorThreshold("A",0.85);
  	private static ColorThreshold C = new ColorThreshold("C",0.85);
  	private static ColorThreshold D = new ColorThreshold("D",0.85);
  	private static ColorThreshold E = new ColorThreshold("E",0.85);
  	private static ColorThreshold F = new ColorThreshold("F",0.85);
  	private static ColorThreshold G = new ColorThreshold("G",0.85);
  	private static ColorThreshold H = new ColorThreshold("H",0.85);
  	private static ColorThreshold I = new ColorThreshold("I",0.85);
  	private static ColorThreshold K = new ColorThreshold("K",0.85);
  	private static ColorThreshold L = new ColorThreshold("L",0.85);
  	private static ColorThreshold M = new ColorThreshold("M",0.85);
  	private static ColorThreshold N = new ColorThreshold("N",0.85);
  	private static ColorThreshold P = new ColorThreshold("P",0.85);
  	private static ColorThreshold Q = new ColorThreshold("Q",0.85);
  	private static ColorThreshold R = new ColorThreshold("R",0.85);
  	private static ColorThreshold S = new ColorThreshold("S",0.85);
  	private static ColorThreshold T = new ColorThreshold("T",0.85);
  	private static ColorThreshold V = new ColorThreshold("V",0.85);
  	private static ColorThreshold W = new ColorThreshold("W",0.85);
  	private static ColorThreshold Y = new ColorThreshold("Y",0.85);
  	private static ColorThreshold ALWAYS_G = new ColorThreshold("G",0.0);
  	private static ColorThreshold ALWAYS_P = new ColorThreshold("P",0.0);
  
  	Color[] ALL_COMPOUND_COLORS = new Color[]{
  			CLUSTAL_RED, CLUSTAL_BLUE, CLUSTAL_GREEN, CLUSTAL_ORANGE, CLUSTAL_CYAN, CLUSTAL_PINK, CLUSTAL_PINK, CLUSTAL_MAGENTA, CLUSTAL_YELLOW, COLOR_OTHER};
  
  	AACompColorThreshold[] ALL_COMPOUNDS = new AACompColorThreshold[]{	
  			new AACompColorThreshold("F,I,L,M,F,V,W", CLUSTAL_BLUE, new ColorThreshold[]{percent,number,A,C,F,H,I,L,M,V,W,Y,P,p}),
  			new AACompColorThreshold("K,R", CLUSTAL_RED, new ColorThreshold[]{plus,K,R,Q}),
  			new AACompColorThreshold("C", CLUSTAL_BLUE, new ColorThreshold[]{percent,number,A,C,F,H,I,L,M,V,W,S,P,p}),
  			new AACompColorThreshold("C", CLUSTAL_PINK, new ColorThreshold[]{C}),
  			new AACompColorThreshold("C", CLUSTAL_PINK, new ColorThreshold[]{C}),
  			new AACompColorThreshold("G", CLUSTAL_ORANGE, new ColorThreshold[]{ALWAYS_G}),
  			new AACompColorThreshold("P", CLUSTAL_YELLOW, new ColorThreshold[]{ALWAYS_P}),
  			new AACompColorThreshold("H,Y", CLUSTAL_CYAN, new ColorThreshold[]{percent,number,A,C,F,H,I,L,M,V,W,Y,P,p}),
  			new AACompColorThreshold("E", CLUSTAL_MAGENTA, new ColorThreshold[]{minus,D,E,q,Q}),
  			new AACompColorThreshold("D", CLUSTAL_MAGENTA, new ColorThreshold[]{minus,D,E,n,N}),
  			new AACompColorThreshold("A", CLUSTAL_BLUE, new ColorThreshold[]{percent,number,A,C,F,H,I,L,M,V,W,Y,P,p,T,S,G}),
  			new AACompColorThreshold("T", CLUSTAL_GREEN, new ColorThreshold[]{percent,number,t,S,T}),
  			new AACompColorThreshold("S", CLUSTAL_GREEN, new ColorThreshold[]{number,t,S,T}),
  			new AACompColorThreshold("N", CLUSTAL_GREEN, new ColorThreshold[]{n,N,D}),
  			new AACompColorThreshold("Q", CLUSTAL_GREEN, new ColorThreshold[]{q,Q,E,plus,K,R}),
  	};
  
  
  	private AACompColorThreshold getCompIfResidueWithinThreshold(AminoAcid acid, int xPos, Alignment alignment){
  		ArrayList<AACompColorThreshold> allComp = getCompoundThresholdsFromAcid(acid);
  		for(AACompColorThreshold aComp: allComp){
  			for(ColorThreshold tHold: aComp.thresholds){
  				if(tHold.threshold <= alignment.getHistogram().getProportionCount(xPos, tHold.acids)){
  					return aComp;
  				}
  			}
  		}
  		return null;
  	}
  
  	private ArrayList<AACompColorThreshold> getCompoundThresholdsFromAcid(AminoAcid acid){
  		ArrayList<AACompColorThreshold> all = new ArrayList<AACompColorThreshold>();
  		for(AACompColorThreshold comp: ALL_COMPOUNDS){
  			for(AminoAcid residue: comp.residues){
  				if(residue == acid){
  					all.add(comp);
  				}
  			}
  		}
  		return all;
  	}
  
  	public Color getAminoAcidBackgroundColor(AminoAcid acid, int xPos, Alignment alignment) {
  		AACompColorThreshold compColorT = getCompIfResidueWithinThreshold(acid, xPos, alignment);
  		if(compColorT != null){
  			return compColorT.color;
  		}
  		else{
  			return COLOR_OTHER;
  		}
  	}
  
  	public Color getAminoAcidForgroundColor(AminoAcid acid, int xPos, Alignment alignment) {
  		return COLOR_FOREGROUND;
  	}
  
  	public Color getAminoAcidSelectionBackgroundColor(AminoAcid acid, int xPos, Alignment alignment) {
  		AACompColorThreshold compColorT = getCompIfResidueWithinThreshold(acid, xPos, alignment);
  		if(compColorT != null){
  			return compColorT.color;
  		}
  		else{
  			return COLOR_BACKGROUND_SELECTED;
  		}
  	}
  
  	public Color getAminoAcidSelectionForegroundColor(AminoAcid acid, int xPos, Alignment alignment) {
  		return COLOR_FOREGROUND_SELECTED;
  	}
  
  
  
  	public String getName() {
  		return "ClustalX";
  	}
  
  	public Color[] getALLCompundColors() {
  		return ALL_COMPOUND_COLORS;
  	}
  
  }
  