diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000000000000000000000000000000000000..e96534fb27b68192f27f985d3879e173ec77adb8 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Palette2"> + <group name="Swing"> + <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" /> + </item> + <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true"> + <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" /> + <initial-values> + <property name="text" value="Button" /> + </initial-values> + </item> + <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="RadioButton" /> + </initial-values> + </item> + <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="CheckBox" /> + </initial-values> + </item> + <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" /> + <initial-values> + <property name="text" value="Label" /> + </initial-values> + </item> + <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1"> + <preferred-size width="150" height="-1" /> + </default-constraints> + </item> + <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3"> + <preferred-size width="150" height="50" /> + </default-constraints> + </item> + <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3"> + <preferred-size width="200" height="200" /> + </default-constraints> + </item> + <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" /> + </item> + <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" /> + </item> + <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1"> + <preferred-size width="-1" height="20" /> + </default-constraints> + </item> + <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false"> + <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" /> + </item> + <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false"> + <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" /> + </item> + </group> + </component> +</project> \ No newline at end of file diff --git a/src/main/java/Canidate.java b/src/main/java/Canidate.java index 63ae1f7533ff89381084e00d150406f9bdd65152..1afb4853bee40bf001ab608e7514f111c570940b 100644 --- a/src/main/java/Canidate.java +++ b/src/main/java/Canidate.java @@ -40,7 +40,7 @@ public class Canidate { return vertexList; } - public double calculateFitness(boolean doOutput) { + public double[] calculateFitness(boolean doOutput) { double fitness = 0d; int hydrophobicBonds = calculateBonds(); @@ -53,7 +53,7 @@ public class Canidate { + " [hydrophobicBonds = " + hydrophobicBonds + " | overlaps = " + overlaps + "]\n"); } - return fitness; + return new double[]{fitness, hydrophobicBonds, overlaps}; } public ArrayList<Vertex> getVertexList() { diff --git a/src/main/java/GraphicsExample.java b/src/main/java/GraphicsExample.java deleted file mode 100644 index 1f6c2dd2dc21c106e969a70f25890f92e9882e2a..0000000000000000000000000000000000000000 --- a/src/main/java/GraphicsExample.java +++ /dev/null @@ -1,69 +0,0 @@ -import java.awt.Color; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -import javax.imageio.ImageIO; - - -// Example to illustrate Java 2D graphics usage for Genetic Algorithms -// (C) Alexander del Pino - -public class GraphicsExample { - - - - public static void main(String[] args) { - - int height = 500; - int width = 800; - - BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2 = image.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - - g2.setColor(Color.YELLOW); - g2.fillRect(0, 0, width, height); - - int cellSize = 80; - - g2.setColor(new Color(0, 200, 0)); - g2.fillRect(50, 50, cellSize, cellSize); - - g2.setColor(new Color(255, 0, 0)); - g2.fillRect(250, 50, cellSize, cellSize); - - g2.setColor(Color.BLACK); - g2.drawLine(50 + cellSize, 50+cellSize/2, 250, 50+cellSize/2); - - g2.setColor(new Color(255, 255, 255)); - String label = "GA"; - Font font = new Font("Serif", Font.PLAIN, 40); - g2.setFont(font); - FontMetrics metrics = g2.getFontMetrics(); - int ascent = metrics.getAscent(); - int labelWidth = metrics.stringWidth(label); - - g2.drawString(label, 50 + cellSize/2 - labelWidth/2 , 50 + cellSize/2 + ascent/2); - - String folder = "./visualization/individual/"; - String filename = "image.png"; - if (!new File(folder).exists()) new File(folder).mkdirs(); - - try { - ImageIO.write(image, "png", new File(folder + File.separator + filename)); - } catch (IOException e) { - e.printStackTrace(); - System.exit(0); - } - - - - } - - -} diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 8abc3795e3bb5c9990e7b68bb6b75d06030035ba..b7492c15b9db4d195bad5a8cefd722993e59d3e0 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -9,38 +9,39 @@ public class Main { ProteinDrawer pdraw = new ProteinDrawer("./visualization/individual/", "image.png"); - int[] isHydrophobic = {0, 0, 0, 1, 0, 1, 1, 0, 1}; // 0 = no | 1 = yes + int[] isHydrophobic = {0, 0, 0, 1, 0, 1, 1, 0, 0}; // 0 = no | 1 = yes // Last outgoing direction has no influence on the protein int[] outgoingDirection = {0, 1, 2, 1, 2, 3, 3, 1, 0}; // 0 = North | 1 = East | 2 = South | 3 = West Canidate c = new Canidate(isHydrophobic, outgoingDirection); - c.calculateFitness(true); + double[] fitnessBondOverlap = c.calculateFitness(true); pdraw.printProtein(c.getVertexList()); - - Random rd = new Random(); - int proteinSize = 20; - int[] isHydrophobicRandom = new int[proteinSize]; - int[] outgoingDirectionRandom = new int[proteinSize]; - - for (int i = 0; i < proteinSize; i++) { - isHydrophobicRandom[i] = rd.nextInt(2); - outgoingDirectionRandom[i] = rd.nextInt(4); - } - - System.out.print("Hydrophobic: "); - for (int a : isHydrophobicRandom) { - System.out.print(a + " "); - } - System.out.println(); - - System.out.print("Outgoing Direction: "); - for (int a : outgoingDirectionRandom) { - System.out.print(a + " "); - } - - System.out.println(); - Canidate cRandom = new Canidate(isHydrophobicRandom, outgoingDirectionRandom); - cRandom.calculateFitness(true); - pdraw.printProtein(cRandom.getVertexList()); + pdraw.drawProteinToFile(c.getVertexList(), fitnessBondOverlap); + +// Random rd = new Random(); +// int proteinSize = 20; +// int[] isHydrophobicRandom = new int[proteinSize]; +// int[] outgoingDirectionRandom = new int[proteinSize]; +// +// for (int i = 0; i < proteinSize; i++) { +// isHydrophobicRandom[i] = rd.nextInt(2); +// outgoingDirectionRandom[i] = rd.nextInt(4); +// } +// +// System.out.print("Hydrophobic: "); +// for (int a : isHydrophobicRandom) { +// System.out.print(a + " "); +// } +// System.out.println(); +// +// System.out.print("Outgoing Direction: "); +// for (int a : outgoingDirectionRandom) { +// System.out.print(a + " "); +// } +// +// System.out.println(); +// Canidate cRandom = new Canidate(isHydrophobicRandom, outgoingDirectionRandom); +// cRandom.calculateFitness(true); +// pdraw.printProtein(cRandom.getVertexList()); } } diff --git a/src/main/java/ProteinDrawer.java b/src/main/java/ProteinDrawer.java index 576f88324ab9a166175ed7ba72fbac37a55d5eb5..9ee6f1d9b306b7aeb14ffdb808044203f832785f 100644 --- a/src/main/java/ProteinDrawer.java +++ b/src/main/java/ProteinDrawer.java @@ -1,3 +1,8 @@ +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -8,41 +13,141 @@ public class ProteinDrawer { // Used only for the console output String consoleEmpty = " "; - String consoleHydrophobic = " o "; - String consoleHydrophilic = " i "; - String consoleMultiple = " z "; + String consoleHydrophobic = "(o)"; + String consoleHydrophilic = "(i)"; + String consoleHydrophobicMulti = "{o}"; + String consoleHydrophilicMulti = "{i}"; + String consoleMixed = "{z}"; String consoleConnectionVertical = " | "; String consoleConnectionHorizontal = "---"; + // For image + int pixelsPerCell = 40; + int margin = pixelsPerCell * 2; + int outline = 2; + Font font = new Font("Sans-Serif", Font.PLAIN, 15); + Color imageBackground = new Color(255, 255, 255); + Color imageConnection = new Color(0, 0, 0); + Color imageOutline = new Color(0, 0, 0); + Color imageHydrophobic = new Color(205, 0, 0); + Color imageHydrophilic = new Color(0, 0, 255); + Color imageMixed = new Color(205, 0, 205); + Color imageAminoText = new Color(200, 200, 200); + Color imageText = new Color(0,0,0); + public ProteinDrawer(String folder, String filename) { this.folder = folder; this.filename = filename; } - public void drawProteinToFile(ArrayList<Vertex> vertexListOriginal) { + public void drawProteinToFile(ArrayList<Vertex> vertexListOriginal, double[] fitBondOver) { // Copy VertexList to be able to manipulate it ArrayList<Vertex> vertexList = deepCopyVertexList(vertexListOriginal); - Block[][] proteinArray = convertProteinTo2DArray(vertexList); + Cell[][] cellArray = convertProteinTo2DArray(vertexList); + + int height = (cellArray.length * pixelsPerCell) + margin * 2; + int width = (cellArray[0].length * pixelsPerCell) + margin * 2; + + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g2 = image.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2.setFont(font); + FontMetrics metrics = g2.getFontMetrics(); + int ascent = metrics.getAscent(); + + // Background + g2.setColor(imageBackground); + g2.fillRect(0, 0, width, height); + + for (int yIndex = cellArray.length-1; yIndex >= 0; yIndex--) { + int yIndexPosition = cellArray.length-1 - yIndex; + + for (int xIndex = 0; xIndex < cellArray[0].length; xIndex++) { + Color aminoColor = null; + + State cellState = cellArray[yIndex][xIndex].getRelevantDrawState(); + + switch (cellState) { + case Empty: + break; + + case Hydrophobic: + aminoColor = imageHydrophobic; + break; - for (int yIndex = proteinArray.length-1; yIndex >= 0; yIndex--) { - for (int xIndex = 0; xIndex < proteinArray[0].length; xIndex++) { - System.out.print(convertBlockToString(proteinArray[yIndex][xIndex])); + case Hydrophilic: + aminoColor = imageHydrophilic; + break; + + case Mixed: + aminoColor = imageMixed; + break; + + case ConnectionVertical: + g2.setColor(imageConnection); + g2.fillRect((xIndex * pixelsPerCell) + margin + (pixelsPerCell/2)-outline, + (yIndexPosition * pixelsPerCell) + margin, + outline * 2, pixelsPerCell); + break; + + case ConnectionHorizontal: + g2.setColor(imageConnection); + g2.fillRect((xIndex * pixelsPerCell) + margin, + (yIndexPosition * pixelsPerCell) + margin + (pixelsPerCell/2)-outline, + pixelsPerCell, outline * 2); + break; + } + + if (aminoColor != null) { + g2.setColor(imageOutline); + g2.fillRect((xIndex * pixelsPerCell) + margin, (yIndexPosition * pixelsPerCell) + margin, + pixelsPerCell, pixelsPerCell); + g2.setColor(aminoColor); + g2.fillRect((xIndex * pixelsPerCell) + outline + margin, (yIndexPosition * pixelsPerCell) + outline + margin, + pixelsPerCell - (outline * 2), pixelsPerCell - (outline * 2)); + + g2.setColor(imageAminoText); + String label = ""; + for (int aminoIndex : cellArray[yIndex][xIndex].aminoIndexes) { + label += aminoIndex + " "; + } + int labelWidth = metrics.stringWidth(label); + int x = (xIndex * pixelsPerCell) + margin + (pixelsPerCell/2) - (labelWidth/2) + outline; + int y = (yIndexPosition * pixelsPerCell) + margin + (pixelsPerCell/2) + (ascent/2) - outline; + g2.drawString(label, x, y); + } } - System.out.println(); } - System.out.println(); + + g2.setColor(imageText); + String label = "Fitness: " + fitBondOver[0] + + " H/H Bonds: " + (int)fitBondOver[1] + + " Overlaps: " + (int)fitBondOver[2]; + int labelWidth = metrics.stringWidth(label); + int x = margin / 4; + int y = margin / 4; + g2.drawString(label, x, y); + + if (!new File(folder).exists()) new File(folder).mkdirs(); + + try { + ImageIO.write(image, "png", new File(folder + File.separator + filename)); + } catch (IOException e) { + e.printStackTrace(); + System.exit(0); + } } public void printProtein(ArrayList<Vertex> vertexListOriginal) { // Copy VertexList to be able to manipulate it ArrayList<Vertex> vertexList = deepCopyVertexList(vertexListOriginal); - Block[][] proteinArray = convertProteinTo2DArray(vertexList); + Cell[][] cellArray = convertProteinTo2DArray(vertexList); - for (int yIndex = proteinArray.length-1; yIndex >= 0; yIndex--) { - for (int xIndex = 0; xIndex < proteinArray[0].length; xIndex++) { - System.out.print(convertBlockToString(proteinArray[yIndex][xIndex])); + for (int yIndex = cellArray.length-1; yIndex >= 0; yIndex--) { + for (int xIndex = 0; xIndex < cellArray[0].length; xIndex++) { + System.out.print(convertCellToString(cellArray[yIndex][xIndex])); } System.out.println(); } @@ -58,7 +163,7 @@ public class ProteinDrawer { return vertexList; } - private Block[][] convertProteinTo2DArray(ArrayList<Vertex> vertexList) { + private Cell[][] convertProteinTo2DArray(ArrayList<Vertex> vertexList) { // Determine size int minX = 0; int maxX = 0; @@ -90,69 +195,68 @@ public class ProteinDrawer { } // Add vertexes and connections to 2d array - Block[][] proteinArray = new Block[maxY * 2 + 1][maxX * 2 + 1]; + Cell[][] cellArray = new Cell[maxY * 2 + 1][maxX * 2 + 1]; for (int yIndex = 0; yIndex < maxY * 2 + 1; yIndex++) { for (int xIndex = 0; xIndex < maxX * 2 + 1; xIndex++) { - proteinArray[yIndex][xIndex] = new Block(); + cellArray[yIndex][xIndex] = new Cell(); } } for (int i = 0; i < vertexList.size(); i++) { Vertex vertex = vertexList.get(i); if (vertex.isHydrophobic) { - proteinArray[vertex.y][vertex.x].addState(State.Hydrophobic); + cellArray[vertex.y][vertex.x].addState(State.Hydrophobic); } else { - proteinArray[vertex.y][vertex.x].addState(State.Hydrophilic); + cellArray[vertex.y][vertex.x].addState(State.Hydrophilic); } + cellArray[vertex.y][vertex.x].addAminoIndex(i); // Add connection, except on the last one if (i + 1 != vertexList.size()) { if (vertex.outgoingDirection == 0) { - proteinArray[vertex.y + 1][vertex.x].addState(State.ConnectionVertical); + cellArray[vertex.y + 1][vertex.x].addState(State.ConnectionVertical); } else if (vertex.outgoingDirection == 1) { - proteinArray[vertex.y][vertex.x + 1].addState(State.ConnectionHorizontal); + cellArray[vertex.y][vertex.x + 1].addState(State.ConnectionHorizontal); } else if (vertex.outgoingDirection == 2) { - proteinArray[vertex.y - 1][vertex.x].addState(State.ConnectionVertical); + cellArray[vertex.y - 1][vertex.x].addState(State.ConnectionVertical); } else if (vertex.outgoingDirection == 3) { - proteinArray[vertex.y][vertex.x - 1].addState(State.ConnectionHorizontal); + cellArray[vertex.y][vertex.x - 1].addState(State.ConnectionHorizontal); } } } - return proteinArray; + return cellArray; } - private String convertBlockToString (Block block) { - boolean multiple = false; - if (block.states.size() > 1) { - multiple = true; - } + private String convertCellToString(Cell cell) { - State blockState = block.states.get(0); + State cellState = cell.getRelevantDrawState (); - switch (blockState) { + switch (cellState) { case Empty: return consoleEmpty; case Hydrophobic: - if (multiple) { - return consoleMultiple; - } else { return consoleHydrophobic; - } case Hydrophilic: - if (multiple) { - return consoleMultiple; - } else { return consoleHydrophilic; - } + + case HydrophobicMulti: + return consoleHydrophobicMulti; + + case HydrophilicMulti: + return consoleHydrophilicMulti; + + case Mixed: + return consoleMixed; case ConnectionVertical: return consoleConnectionVertical; case ConnectionHorizontal: return consoleConnectionHorizontal; + } // Fallback return consoleEmpty; @@ -175,10 +279,11 @@ public class ProteinDrawer { } } -class Block { +class Cell { ArrayList<State> states = new ArrayList<>(); + ArrayList<Integer> aminoIndexes = new ArrayList<>(); - public Block () { + public Cell() { states.add(State.Empty); } @@ -188,12 +293,42 @@ class Block { } states.add(state); } + + public void addAminoIndex (int aminoIndex) { + aminoIndexes.add(aminoIndex); + } + + public State getRelevantDrawState () { + State rc = states.get(0); + if (states.size() > 1) { + if (rc.equals(State.Hydrophobic)) { + for (State s : states) { + if (s.equals(State.Hydrophilic)) { + return State.Mixed; + } + } + return State.HydrophobicMulti; + + } else if (rc.equals(State.Hydrophilic)) { + for (State s : states) { + if (s.equals(State.Hydrophobic)) { + return State.Mixed; + } + } + return State.HydrophilicMulti; + } + } + return rc; + } } enum State { Empty, Hydrophobic, Hydrophilic, + HydrophobicMulti, + HydrophilicMulti, + Mixed, ConnectionVertical, ConnectionHorizontal } \ No newline at end of file