From e6d4ffd0594f040d45699f5bc705214a3a6364cd Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Tue, 31 Mar 2020 14:35:23 +0200 Subject: [PATCH 01/43] GUI zonder ORF visualisatie ORFF gui tot nu toe --- ORFF_GUI/Blast.java | 68 ++++++++++++ ORFF_GUI/ORF.java | 15 +++ ORFF_GUI/ORFBaby.java | 49 +++++++++ ORFF_GUI/ORFFinder.java | 204 +++++++++++++++++++++++++++++++++++ ORFF_GUI/ORFvis.java | 230 ++++++++++++++++++++++++++++++++++++++++ ORFF_GUI/Reader.java | 27 +++++ ORFF_GUI/Sequence.java | 76 +++++++++++++ 7 files changed, 669 insertions(+) create mode 100644 ORFF_GUI/Blast.java create mode 100644 ORFF_GUI/ORF.java create mode 100644 ORFF_GUI/ORFBaby.java create mode 100644 ORFF_GUI/ORFFinder.java create mode 100644 ORFF_GUI/ORFvis.java create mode 100644 ORFF_GUI/Reader.java create mode 100644 ORFF_GUI/Sequence.java diff --git a/ORFF_GUI/Blast.java b/ORFF_GUI/Blast.java new file mode 100644 index 0000000..6c49dc6 --- /dev/null +++ b/ORFF_GUI/Blast.java @@ -0,0 +1,68 @@ +package ORFF_GUI; +import java.io.*; +import org.biojava.nbio.core.sequence.io.util.IOUtils; +import org.biojava.nbio.ws.alignment.qblast.*; + +// TODO: 24-3-2020 make doBlast return arraylist with blast results +public class Blast { + public String blasttype = ""; + protected String currentBlast = ""; + private static final String BLAST_OUTPUT_FILE = "blastOutput.xml"; // file to save blast results to + private static final String SEQUENCE = "MYPRGPNLQQRPLANQNQPYPVRKVPDQGPNGPLNASQSKIDPARQREKVADKLISDCYSKVIIDKNGKRYTDTSYQTHIDIKEFSSYQSHPPPDNIPPGQIGSIKNRVLVICVKYSGRVIIQKGKYNETKNVYQIGRTWDMDELKAIKKVGNDGIILTLNKDYYWKVEEGLERVWKFARFLTKAYGGFMGRYPILNGFTLEEFKLPPIPMKKSLGNGQQSDRTSGSTNDIVLNEPTPDSQLLKSRSLKRKNMPNPVLPSESLLQNNQRTTTQLQMQPSSTSAKSNEFYKDFDFTSNGKLPMKLMKVMEVDRPVVGSANTVILSQKTSEQFSNTSSEGYKYNKTDNERTKQKGFIDNHVKLDDNDDFKDISKTPRTSTHPYQQKSPLKGGDLVSNDSQSFIFKARDTYSSEKLHEYVKENEVLETSPLRKYNTQKITAETEQRKVSDPLESVAVLGLRLEEKLGGYNAADDFFQSDHSLKQPAISKNPGYSPDFGIEEITDVSEDSLTFPSATGATDKGLAISQRENSPEIIEESTKLEANDISSDNINSSIQEIENFIGSQLHFGVDDKGNKTPNQTVTANVIQNEVLNLNQAEESNLGTSLEINESTNKNANEQLDILNIREGYPLEEDESLFTQGYVSKPDLNIQKKEETQHVNFEKDPELEELLEEVNWTISDNSDSLIKKLTKELNNVKQHNIKEIVSLDFSKDSVSNDITTSLNEIENLNHIFKKMEIDFKFLAPEVRLIETNSHGLQVKSVNKKVLYNDLKSILSKVSMSSADLTAIESFKEFDRLNKIEALESKLVGLYNALGTIRYDSNEDKDDLGSMRALRQYQTNYEKVTSKFIRHFNSFIKEQFKSLIDQFSSDLERFYPNAIFRELNNLLIYSSITYFIKNTSPNEFLDLNNFFNQLISEFLEKLIRSKLKNVKGSGASSVSSNLSQTFEINPLKKSRTLRLSTRKDKFIGKLGLNDDDHKTQQLDNSKKSTKNPNEIEDPKTVISIIDDSKDLICLLQYFVGYLFHFGTNILDFNEYINTTSYKERRKLLETSSIDKIDVKRYSNELIANMNFIFGSYINIFMKKVTPSELSIPVLLIYLETLLHENQRINQEFLVFNFLKKAIEKFKGIWNKFIRNQIELLNKSTIVVKCGILPAVKNVIQLLLVTESSLERSTHINETLVRSMVDKSYKEITEAAIHLFMRDDPLLKSHDFDDKEREYRNVSIIKNVFYFLEQFPTSDIESINKMKFQLESVLKKVQENYFQKLLIKNVGKLVEFVNNYEALSKMNNGKPKKYNKKYLKSLLTGYTSKDVSMKAHEIFKKLEKHYITGSDMFEKDLLDKLWLDMENEFVGYFSRLDNIIRANFDKDIEHNISKQEIHSIFKSIY"; // Blast query sequence + NCBIQBlastService service; + + public static void main(String[] args) { + NCBIQBlastService service = new NCBIQBlastService(); + + // set alignment options + NCBIQBlastAlignmentProperties props = new NCBIQBlastAlignmentProperties(); + + props.setBlastProgram(BlastProgramEnum.tblastx); + + props.setBlastDatabase("nr"); + //props.setAlignmentOption(ENTREZ_QUERY, "\"serum albumin\"[Protein name] AND mammals[Organism]"); + + // set output options + NCBIQBlastOutputProperties outputProps = new NCBIQBlastOutputProperties(); + // in this example we use default values set by constructor (XML format, pairwise alignment, 100 descriptions and alignments) + + // Example of two possible ways of setting output options + String rid = null; // blast request ID + FileWriter writer = null; + BufferedReader reader = null; + try { + // send blast request and save request id + rid = service.sendAlignmentRequest(SEQUENCE, props); + + // wait until results become available. Alternatively, one can do other computations/send other alignment requests + while (!service.isReady(rid)) { + System.out.println("Waiting for results. Sleeping for 5 seconds"); + Thread.sleep(5000); + } + + // read results when they are ready + InputStream in = service.getAlignmentResults(rid, outputProps); + reader = new BufferedReader(new InputStreamReader(in)); + + // write blast output to specified file + File f = new File(BLAST_OUTPUT_FILE); + System.out.println("Saving query results in file " + f.getAbsolutePath()); + writer = new FileWriter(f); + + String line; + while ((line = reader.readLine()) != null) { + writer.write(line + System.getProperty("line.separator")); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } finally { + // clean up + IOUtils.close(writer); + IOUtils.close(reader); + + // delete given alignment results from blast server (optional operation) + service.sendDeleteRequest(rid); + } + } +} diff --git a/ORFF_GUI/ORF.java b/ORFF_GUI/ORF.java new file mode 100644 index 0000000..cdfde8e --- /dev/null +++ b/ORFF_GUI/ORF.java @@ -0,0 +1,15 @@ +package ORFF_GUI; + +public class ORF { + + int startpos; + int length; + int endpos; + + public ORF(int startpos, int length, int endpos) { + + } + + public ORF() { + } +} diff --git a/ORFF_GUI/ORFBaby.java b/ORFF_GUI/ORFBaby.java new file mode 100644 index 0000000..8f3f13e --- /dev/null +++ b/ORFF_GUI/ORFBaby.java @@ -0,0 +1,49 @@ +package ORFF_GUI; +public class ORFBaby extends ORF { + + static int totalBabyORFs = 0; + + private Sequence parentSequence; + private int id; + private int startpos; + private int length; + private int endpos; + + public ORFBaby(int startpos, Sequence parent) { + this.id = totalBabyORFs++; + this.startpos = startpos; + + + /** + * bugfix: initial length 3 -> 2, because each ORF wil be 'fed' the last 'G' of 'ATG' directly after + * initiation + */ + this.length = 2; + + this.parentSequence = parent; + } + + public boolean feed(boolean stopcodon) { // todo maybe this can return a mature ORF on stopcodon instead + this.length++; + if (stopcodon && length % 3 == 0) { + endpos = startpos + length; + return false; + } + return true; + } + + public ORF mature() { + ORF matureOrf = new ORF(startpos, length, endpos); + return matureOrf; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ORF="); + sb.append(id); + sb.append("START=").append(startpos); + sb.append("END=").append(endpos); + sb.append("SEQID=").append(parentSequence.getSequenceID()); + return sb.toString(); + } +} diff --git a/ORFF_GUI/ORFFinder.java b/ORFF_GUI/ORFFinder.java new file mode 100644 index 0000000..6a4b417 --- /dev/null +++ b/ORFF_GUI/ORFFinder.java @@ -0,0 +1,204 @@ +package ORFF_GUI; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +// try -Xms512M -Xmx512M in VM options +public class ORFFinder { + + + static String filename_RELATIVE_TEMP = "data/DNA.txt"; + + /** + * constructor + */ + public ORFFinder() { + read(new File(filename_RELATIVE_TEMP)); + + } + + /** + * main (for testing...) + */ + public static void main(String[] args) { + new ORFFinder(); + } + + /** + * ASCII TABLE + * Dec Char Dec Char Dec Char Dec Char + * --------- --------- --------- ---------- + * 0 NUL (null) 32 SPACE 64 @ 96 ` + * 1 SOH (start of heading) 33 ! 65 A 97 a + * 2 STX (start of text) 34 " 66 B 98 b + * 3 ETX (end of text) 35 # 67 C 99 c + * 4 EOT (end of transmission) 36 $ 68 D 100 d + * 5 ENQ (enquiry) 37 % 69 E 101 e + * 6 ACK (acknowledge) 38 & 70 F 102 f + * 7 BEL (bell) 39 ' 71 G 103 g + * 8 BS (backspace) 40 ( 72 H 104 h + * 9 TAB (horizontal tab) 41 ) 73 I 105 i + * 10 LF (NL line feed, new line) 42 * 74 J 106 j + * 11 VT (vertical tab) 43 + 75 K 107 k + * 12 FF (NP form feed, new page) 44 , 76 L 108 l + * 13 CR (carriage return) 45 - 77 M 109 m + * 14 SO (shift out) 46 . 78 N 110 n + * 15 SI (shift in) 47 / 79 O 111 o + * 16 DLE (data link escape) 48 0 80 P 112 p + * 17 DC1 (device control 1) 49 1 81 Q 113 q + * 18 DC2 (device control 2) 50 2 82 R 114 r + * 19 DC3 (device control 3) 51 3 83 S 115 s + * 20 DC4 (device control 4) 52 4 84 T 116 t + * 21 NAK (negative acknowledge) 53 5 85 U 117 u + * 22 SYN (synchronous idle) 54 6 86 V 118 v + * 23 ETB (end of trans. block) 55 7 87 W 119 w + * 24 CAN (cancel) 56 8 88 X 120 x + * 25 EM (end of medium) 57 9 89 Y 121 y + * 26 SUB (substitute) 58 : 90 Z 122 z + * 27 ESC (escape) 59 ; 91 [ 123 { + * 28 FS (file separator) 60 < 92 \ 124 | + * 29 GS (group separator) 61 = 93 ] 125 } + * 30 RS (record separator) 62 > 94 ^ 126 ~ + * 31 US (unit separator) 63 ? 95 _ 127 DEL + * + * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) + * chars of interest: (65, A) (84, T) (67, C) (71, G) + */ + public static void read(File file) { + + long startTime = System.nanoTime(); + + int[] last = new int[3]; + int trackedATGs = 0; + int currentSequenceID = 0; + int currentPos = 0; + Sequence currentSequence = null; + boolean isStopCodon; + + try (BufferedReader reader = Files.newBufferedReader(Paths.get(String.valueOf(file)))) { + int c; + while ((c = reader.read()) != -1) { + + // header 62 = > + // assume all files start with this + + // chars of interest: (65, A) (84, T) (67, C) (71) + + switch (c) { + case (62): // > + double dnaStartTime = System.nanoTime(); + String header = reader.readLine(); // catch header and skip this header TODO confirm? CONFIRMED! + currentSequenceID++; + currentPos = 0; + if (currentSequence != null) { + // testing + + System.out.print(currentSequence); + System.out.println(header); // TODO REMOVE ?? + long dnaEndTime = System.nanoTime(); + double duration = (dnaEndTime - dnaStartTime); + BigDecimal planckseconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); + System.out.println(". ERIC, WOW, THAT ONLY TOOK " + planckseconds.toPlainString() + " planckseconds!!!!!!!!!!!!!!!"); + int totalThisSequence = currentSequence.getCompletedORFCount(); + Sequence.addTotalCompletedORFCount(totalThisSequence); + } else { + System.out.println(header); + } + currentSequence = new Sequence(currentSequenceID); + System.out.println("created " + currentSequenceID); + break; + case (65): // A + case (67): // C + case (71): // G + case (84): // T + currentPos++; + last[0] = last[1]; + last[1] = last[2]; + last[2] = c; + switch (Integer.toString(last[0]) + last[1] + last[2]) { + case "846571": // TAG + case "846565": // TAA + case "847165": // TGA + // System.out.println("is stop codon true"); // TODO DEBUGPRINT + isStopCodon = true; + break; + case "658471": // ATG replaces // if (last[0] == 65 && last[1] == 84 && last[2] == 71) {} + trackedATGs++; + // continue to default + ORFBaby orfBaby = new ORFBaby(currentPos, currentSequence); + currentSequence.addORFBaby(orfBaby); + default: + // System.out.println("is stop codon false"); // TODO DEBUGPRINT + isStopCodon = false; + break; + } + currentSequence.feedActiveORFBabies(isStopCodon); + + break; + default: + //dostuff + break; + } + + + } + } catch (IOException e) { + e.printStackTrace(); + } + + System.out.println(currentSequence); // last sequence + + System.out.println("found " + trackedATGs + " occurences of ATG"); + System.out.println("of which " + Sequence.getTotalCompletedCount() + " Complete ORFs"); + long endTime = System.nanoTime(); + long duration = (endTime - startTime); + double planckseconds = 5.39124760e44 * duration; + System.out.println("Duration : " + planckseconds + " planckseconds"); + System.out.println("Duration : " + duration + " nanoseconds"); + long mseconds = duration / 1000000; + System.out.println("Duration : " + mseconds + " milliseconds"); + long seconds = mseconds / 1000; + System.out.println("Duration : " + seconds + " seconds"); + } + + + public void testReadAndCountSpeed(int amount) { + for (int i = 0; i < amount + 1; i++) { + long startTime = System.nanoTime(); + long counts = readandcount(i * 10); + long endTime = System.nanoTime(); + long duration = (endTime - startTime); + System.out.print("with looping " + counts + " times per char, counting, I counted " + counts + " times | "); + System.out.println("Duration : " + duration / 1000000 + " milliseconds"); + } + } + + public long readandcount(int counts) { + + long countable = 0; + + try (BufferedReader reader = Files.newBufferedReader(Path.of(filename_RELATIVE_TEMP))) { + int c; + while ((c = reader.read()) != -1) { + + for (int i = 0; i < counts + 1; i++) { + countable++; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + + return countable; + + } + +} + + +// raise Exception.Create('hell'); diff --git a/ORFF_GUI/ORFvis.java b/ORFF_GUI/ORFvis.java new file mode 100644 index 0000000..735868b --- /dev/null +++ b/ORFF_GUI/ORFvis.java @@ -0,0 +1,230 @@ +package ORFF_GUI; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.*; +import java.io.*; + +public class ORFvis extends JFrame { + private JFrame mainFrame; + private JLabel headerLabel; + private JLabel statusLabel; + private JPanel controlPanel; + private JScrollPane displayfile; + private JTextField pathToFile; + private JTextArea textofFile; + + public ORFvis() { + prepareGUI(); + } + + public static void main(String[] args) { + ORFvis swingMenuDemo = new ORFvis(); + swingMenuDemo.ORFvisualisatie(); + swingMenuDemo.showFile(); + swingMenuDemo.showMenuDemo(); + + + } + + private void prepareGUI() { + mainFrame = new JFrame("ORFF_GUI"); + mainFrame.setSize(1000, 1000); + mainFrame.setLayout(null); + + + headerLabel = new JLabel("", JLabel.CENTER); + statusLabel = new JLabel("", JLabel.CENTER); + statusLabel.setSize(350, 100); + + mainFrame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent windowEvent) { + System.exit(0); + } + }); + controlPanel = new JPanel(); + controlPanel.setBounds(1, 1, 1000, 1000); + controlPanel.setLayout(null); + //mainFrame.add(headerLabel); + mainFrame.add(controlPanel); + //mainFrame.add(statusLabel); + mainFrame.setVisible(true); + } + + private void showFile() { + // creation of file display with scrolling bar + Border blackline = BorderFactory.createLineBorder(Color.black); + textofFile = new JTextArea(200, 100); + displayfile = new JScrollPane(textofFile); + pathToFile = new JTextField("Path/of/File"); + pathToFile.setBounds(5, 5, 970, 25); + displayfile.setBounds(5, 30, 970, 200); + displayfile.setBorder(blackline); + displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + + textofFile.setText("Display of file content"); + controlPanel.add(pathToFile); + controlPanel.add(displayfile); + } + + private void ORFvisualisatie(){ + Border blackline = BorderFactory.createLineBorder(Color.black); + JPanel visScreen = new JPanel(); + visScreen.setBounds(5,240,970,685); + visScreen.setBackground(Color.white); + visScreen.setBorder(blackline); + controlPanel.add(visScreen); + // TODO: 31-3-2020 make visualisation + } + private void showMenuDemo() { + //create a menu bar + final JMenuBar menuBar = new JMenuBar(); + + //create menus + JMenu fileMenu = new JMenu("File"); + JMenu editMenu = new JMenu("Blast"); + JMenu databaseMenu = new JMenu("Database"); + final JMenu linkMenu = new JMenu("if anything else"); + + //create menu items + JMenuItem New = new JMenuItem("New ORF search"); + New.setMnemonic(KeyEvent.VK_N); + New.setActionCommand("New"); + + JMenuItem Export = new JMenuItem("Export"); + Export.setActionCommand("Export"); + + JMenuItem Exit = new JMenuItem("Exit"); + Exit.setActionCommand("Exit"); + + JMenuItem selectBlastn = new JMenuItem("BLASTn"); + selectBlastn.setActionCommand("BLASTn"); + + JMenuItem selectBlastt = new JMenuItem("BLASTx"); + selectBlastt.setActionCommand("BLASTx"); + + JMenuItem selectTBlastX = new JMenuItem("tBLASTx"); + selectTBlastX.setActionCommand("tBLASTx"); + + JMenuItem Upload = new JMenuItem("Upload"); + Upload.setActionCommand("Upload"); + + JMenuItem Download = new JMenuItem("Download"); + Download.setActionCommand("Download"); + + MenuItemListener menuItemListener = new MenuItemListener(); + + + New.addActionListener(menuItemListener); + Export.addActionListener(menuItemListener); + Exit.addActionListener(menuItemListener); + selectBlastn.addActionListener(menuItemListener); + selectBlastt.addActionListener(menuItemListener); + selectTBlastX.addActionListener(menuItemListener); + Upload.addActionListener(menuItemListener); + Download.addActionListener(menuItemListener); + + final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Hide file", false); + showWindowMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showWindowMenu.getState()) { + controlPanel.remove(displayfile); + mainFrame.repaint(); + } else { + controlPanel.add(displayfile); + mainFrame.repaint(); + + } + } + }); + final JCheckBoxMenuItem showLinksMenu = new JCheckBoxMenuItem( + "Show Translation", true); + showLinksMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showLinksMenu.getState()) { + menuBar.remove(linkMenu); + mainFrame.repaint(); + } else { + menuBar.add(linkMenu); + mainFrame.repaint(); + } + } + }); + //add menu items to menus + fileMenu.add(New); + fileMenu.add(Export); + fileMenu.addSeparator(); + fileMenu.add(showWindowMenu); + fileMenu.addSeparator(); + fileMenu.add(showLinksMenu); + fileMenu.addSeparator(); + fileMenu.add(Exit); + + editMenu.add(selectBlastn); + editMenu.add(selectBlastt); + editMenu.add(selectTBlastX); + + databaseMenu.add(Upload); + databaseMenu.add(Download); + //add menu to menubar + menuBar.add(fileMenu); + menuBar.add(editMenu); + menuBar.add(databaseMenu); + + //add menubar to the frame + mainFrame.setJMenuBar(menuBar); + mainFrame.setVisible(true); + } + + private void FileDisplayer(File file) throws IOException { + + BufferedReader input = new BufferedReader( + new InputStreamReader( + new FileInputStream( + file))); + textofFile.read(input, "READING FILE :)"); + } + class MenuItemListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) + switch (e.getActionCommand()){ + + case "New": + File file = Reader.FileChooser(); + pathToFile.setText(String.valueOf(file)); + try { + FileDisplayer(file); + } catch (IOException ex) { + ex.printStackTrace(); + } + case "Export": + System.out.println("hellooo"); + break; + case "BLASTn": + System.out.println("1"); + break; + case "BLASTx": + System.out.println("2"); + break; + case "tBLASTx": + System.out.println("3"); + break; + case "Exit": + System.out.println("you wanna exit :("); + break; + case "Upload": + System.out.println("uploading"); + break; + case "download": + System.out.println("downloading"); + break; + } + statusLabel.setText(e.getActionCommand() + " JMenuItem clicked."); + + } + } +} diff --git a/ORFF_GUI/Reader.java b/ORFF_GUI/Reader.java new file mode 100644 index 0000000..4001bae --- /dev/null +++ b/ORFF_GUI/Reader.java @@ -0,0 +1,27 @@ +package ORFF_GUI; + +import javax.swing.*; +import javax.swing.filechooser.FileSystemView; +import java.io.File; + +public class Reader { + private static File file; + + static File FileChooser() { + + System.out.println("i got here"); + JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + jfc.setDialogTitle("Choose a directory to save your file: "); + jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); + + int returnValue = jfc.showSaveDialog(null); + if (returnValue == JFileChooser.APPROVE_OPTION) { + if (jfc.getSelectedFile().isFile()) { + file = jfc.getSelectedFile(); + } + } + ORFFinder.read(file); + return file; + } + +} diff --git a/ORFF_GUI/Sequence.java b/ORFF_GUI/Sequence.java new file mode 100644 index 0000000..5d60b38 --- /dev/null +++ b/ORFF_GUI/Sequence.java @@ -0,0 +1,76 @@ +package ORFF_GUI; + +import java.util.ArrayList; + +public class Sequence { + + + static int totalCompletedORFs = 0; + + ArrayList ActiveORFBabyMap; + ArrayList CompletedORFMap; + int sequenceID; + boolean isActive; // is the baby active or not + + public Sequence(int sequenceID) { + this.sequenceID = sequenceID; + ActiveORFBabyMap = new ArrayList(); + CompletedORFMap = new ArrayList(); + } + + public static void addTotalCompletedORFCount(int amount) {// todo rename + totalCompletedORFs += amount; // todo rename + + } + + public static int getTotalCompletedCount() {// todo rename + return totalCompletedORFs; // todo rename + } + + public void addORFBaby(ORFBaby orfBaby) { + ActiveORFBabyMap.add(orfBaby); + + } + + public void feedActiveORFBabies(boolean isStopcodon) { + // System.out.println("feeding " + ActiveORFBabyMap.size()); // TODO DEBUGPRINT + + ArrayList inactives = new ArrayList(ActiveORFBabyMap.size()); + + for (Object orfBaby : ActiveORFBabyMap) { + isActive = ((ORFBaby) orfBaby).feed(isStopcodon); + if (!isActive) { + inactives.add(orfBaby); + ORF matureORF = ((ORFBaby) orfBaby).mature(); + CompletedORFMap.add(matureORF); + } + + } + + // remove inactives (cant do in other loop, derp) + for (Object orfBaby : inactives) { + // System.out.println(orfBaby); // + ActiveORFBabyMap.remove(orfBaby); + } + + } + + public int getSequenceID() { + return sequenceID; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Sequence{"); + sb.append("ActiveORFMap=").append(ActiveORFBabyMap.size()); + sb.append(", CompletedORFMap=").append(CompletedORFMap.size()); + sb.append(", sequenceID=").append(sequenceID); + sb.append('}'); + return sb.toString(); + } + + public int getCompletedORFCount() { + return CompletedORFMap.size(); + } + +} From df17d03acd30e9d8b722753d886832ab935f4771 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Tue, 31 Mar 2020 15:15:18 +0200 Subject: [PATCH 02/43] pom file --- pom.xml | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d06f881 --- /dev/null +++ b/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + nl-HAN-ORFFApp + ORFFApp + 1.0-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + + + org.biojava + biojava3-core + 3.0 + + + + + org.biojava + biojava-genome + 4.2.0 + + + + + + + + + + + org.biojava + biojava-structure + 4.2.0 + + + org.biojava + biojava-ws + 5.3.0 + + + + + + biojava-maven-repo + BioJava repository + http://www.biojava.org/download/maven/ + + + + \ No newline at end of file From a88dc0546881c27f61426fd03743b3af03959ce0 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Fri, 3 Apr 2020 14:38:40 +0200 Subject: [PATCH 03/43] ORF-GUI met splash screen bug bij visualisatie van sequentie lijn zodra hij in een Jscrollpane geplaatst word --- ORFF_GUI/ORF.java | 57 +++++++++++++-- ORFF_GUI/ORFFinder.java | 126 ++++++++++++++++----------------- ORFF_GUI/ORFvis.java | 25 +++++-- ORFF_GUI/Reader.java | 11 ++- ORFF_GUI/Sequence.java | 87 +++++++++++++++++------ ORFF_GUI/Settings.java | 7 ++ ORFF_GUI/SplashScreenDemo.java | 80 +++++++++++++++++++++ ORFF_GUI/VisualisatiePane.java | 33 +++++++++ genes.gif | Bin 0 -> 76599 bytes 9 files changed, 327 insertions(+), 99 deletions(-) create mode 100644 ORFF_GUI/Settings.java create mode 100644 ORFF_GUI/SplashScreenDemo.java create mode 100644 ORFF_GUI/VisualisatiePane.java create mode 100644 genes.gif diff --git a/ORFF_GUI/ORF.java b/ORFF_GUI/ORF.java index cdfde8e..323aedd 100644 --- a/ORFF_GUI/ORF.java +++ b/ORFF_GUI/ORF.java @@ -1,15 +1,60 @@ package ORFF_GUI; public class ORF { - - int startpos; - int length; - int endpos; - public ORF(int startpos, int length, int endpos) { + private static int totalBabyORFs = 0; + private Sequence parentSequence; + private int id; + private int startpos; + private int length; + private int endpos; + private String dnaSequence; + private StringBuilder dnaBuilder; + + public ORF(int startpos, Sequence parent) { + this.id = totalBabyORFs++; + this.startpos = startpos; + + /** + * bugfix: initial length 3 -> 2, because each ORF wil be 'fed' the last 'G' of 'ATG' directly after + * initiation + */ + // this.length = 2; + this.dnaBuilder = new StringBuilder("AT"); + + this.parentSequence = parent; + } + + public boolean feed(int c, boolean stopcodon) { // todo maybe this can return a mature ORF on stopcodon instead + // this.length++; + dnaBuilder.append((char) c); + if (stopcodon && dnaBuilder.length() % 3 == 0) { + endpos = startpos + length; + dnaSequence = dnaBuilder.toString(); + dnaBuilder = null; + return false; + } + return true; + } + + public String getDnaSequence() { + return dnaSequence; + } + + public int getLength() { + return dnaSequence.length(); } - public ORF() { + @Override + public String toString() { + length = dnaSequence.length(); + final StringBuilder sb = new StringBuilder("ORF="); + sb.append(id); + sb.append(" START= ").append(startpos); + sb.append(" END= ").append(endpos); + sb.append(" LENGTH= ").append(length); + sb.append(" SEQID= ").append(parentSequence.getSequenceID()); + return sb.toString(); } } diff --git a/ORFF_GUI/ORFFinder.java b/ORFF_GUI/ORFFinder.java index 6a4b417..87af19f 100644 --- a/ORFF_GUI/ORFFinder.java +++ b/ORFF_GUI/ORFFinder.java @@ -1,75 +1,55 @@ package ORFF_GUI; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; + +import java.io.*; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; // try -Xms512M -Xmx512M in VM options -public class ORFFinder { +/** + * ORFFinder reads through a textfile (assumed format: nucleotide FASTA) to find ORFS + */ +public class ORFFinder { static String filename_RELATIVE_TEMP = "data/DNA.txt"; + private final ArrayList sequences = new ArrayList(100); /** * constructor */ public ORFFinder() { - read(new File(filename_RELATIVE_TEMP)); + } + /** * main (for testing...) */ public static void main(String[] args) { - new ORFFinder(); + // test ORFFinder + + ORFFinder orfFinder = new ORFFinder(); + // read the default input + orfFinder.readAndFindORFs(); + + orfFinder.seeDNA(); + } /** - * ASCII TABLE - * Dec Char Dec Char Dec Char Dec Char - * --------- --------- --------- ---------- - * 0 NUL (null) 32 SPACE 64 @ 96 ` - * 1 SOH (start of heading) 33 ! 65 A 97 a - * 2 STX (start of text) 34 " 66 B 98 b - * 3 ETX (end of text) 35 # 67 C 99 c - * 4 EOT (end of transmission) 36 $ 68 D 100 d - * 5 ENQ (enquiry) 37 % 69 E 101 e - * 6 ACK (acknowledge) 38 & 70 F 102 f - * 7 BEL (bell) 39 ' 71 G 103 g - * 8 BS (backspace) 40 ( 72 H 104 h - * 9 TAB (horizontal tab) 41 ) 73 I 105 i - * 10 LF (NL line feed, new line) 42 * 74 J 106 j - * 11 VT (vertical tab) 43 + 75 K 107 k - * 12 FF (NP form feed, new page) 44 , 76 L 108 l - * 13 CR (carriage return) 45 - 77 M 109 m - * 14 SO (shift out) 46 . 78 N 110 n - * 15 SI (shift in) 47 / 79 O 111 o - * 16 DLE (data link escape) 48 0 80 P 112 p - * 17 DC1 (device control 1) 49 1 81 Q 113 q - * 18 DC2 (device control 2) 50 2 82 R 114 r - * 19 DC3 (device control 3) 51 3 83 S 115 s - * 20 DC4 (device control 4) 52 4 84 T 116 t - * 21 NAK (negative acknowledge) 53 5 85 U 117 u - * 22 SYN (synchronous idle) 54 6 86 V 118 v - * 23 ETB (end of trans. block) 55 7 87 W 119 w - * 24 CAN (cancel) 56 8 88 X 120 x - * 25 EM (end of medium) 57 9 89 Y 121 y - * 26 SUB (substitute) 58 : 90 Z 122 z - * 27 ESC (escape) 59 ; 91 [ 123 { - * 28 FS (file separator) 60 < 92 \ 124 | - * 29 GS (group separator) 61 = 93 ] 125 } - * 30 RS (record separator) 62 > 94 ^ 126 ~ - * 31 US (unit separator) 63 ? 95 _ 127 DEL - * + * ASCII TABLE (for reference) * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) - * chars of interest: (65, A) (84, T) (67, C) (71, G) + * chars of interest and their ASCII values: (65, A) (84, T) (67, C) (71, G) (62, >) */ - public static void read(File file) { + public void readAndFindORFs() { + readAndFindORFs(filename_RELATIVE_TEMP); + } + public void readAndFindORFs(String filename) { long startTime = System.nanoTime(); int[] last = new int[3]; @@ -79,19 +59,17 @@ public static void read(File file) { Sequence currentSequence = null; boolean isStopCodon; - try (BufferedReader reader = Files.newBufferedReader(Paths.get(String.valueOf(file)))) { - int c; - while ((c = reader.read()) != -1) { - - // header 62 = > - // assume all files start with this + int c; - // chars of interest: (65, A) (84, T) (67, C) (71) + try (BufferedReader reader = Files.newBufferedReader( + Path.of(filename))) { + while ((c = reader.read()) != -1) { + // iterate over character (int) in the file... switch (c) { - case (62): // > + case (62): // ASCII 62 == > double dnaStartTime = System.nanoTime(); - String header = reader.readLine(); // catch header and skip this header TODO confirm? CONFIRMED! + String header = reader.readLine(); // Save the header currentSequenceID++; currentPos = 0; if (currentSequence != null) { @@ -109,12 +87,13 @@ public static void read(File file) { System.out.println(header); } currentSequence = new Sequence(currentSequenceID); - System.out.println("created " + currentSequenceID); + sequences.add(currentSequence); break; - case (65): // A - case (67): // C - case (71): // G - case (84): // T + case (65): // ASCII 65 == A + case (67): // ASCII 67 == C + case (71): // ASCII 71 == G + case (84): // ASCII 84 == T // TODO enhancement add 'U' ? + currentSequence.calculateLength(1); currentPos++; last[0] = last[1]; last[1] = last[2]; @@ -126,17 +105,19 @@ public static void read(File file) { // System.out.println("is stop codon true"); // TODO DEBUGPRINT isStopCodon = true; break; - case "658471": // ATG replaces // if (last[0] == 65 && last[1] == 84 && last[2] == 71) {} + case "658471": // ATG trackedATGs++; // continue to default - ORFBaby orfBaby = new ORFBaby(currentPos, currentSequence); - currentSequence.addORFBaby(orfBaby); + ORF orf = new ORF(currentPos, currentSequence); + assert currentSequence != null; + currentSequence.addNewORF(orf); default: // System.out.println("is stop codon false"); // TODO DEBUGPRINT isStopCodon = false; break; } - currentSequence.feedActiveORFBabies(isStopCodon); + assert currentSequence != null; + currentSequence.feedActiveORFs(c, isStopCodon); break; default: @@ -165,6 +146,14 @@ public static void read(File file) { System.out.println("Duration : " + seconds + " seconds"); } + public void seeDNA() { + for (Sequence sequence : sequences) { + for (ORF orf : sequence) { + System.out.println(orf); + System.out.println(orf.getDnaSequence()); + } + } + } public void testReadAndCountSpeed(int amount) { for (int i = 0; i < amount + 1; i++) { @@ -176,7 +165,14 @@ public void testReadAndCountSpeed(int amount) { System.out.println("Duration : " + duration / 1000000 + " milliseconds"); } } - + public List getInfoForVisualisation(){ + List num = new ArrayList<>(); + for (Sequence sequence : sequences) { + int length = sequence.getLengthOfsequence(); + num.add(length); + } + return num; + } public long readandcount(int counts) { long countable = 0; @@ -193,7 +189,7 @@ public long readandcount(int counts) { e.printStackTrace(); } - + System.out.println(countable); return countable; } diff --git a/ORFF_GUI/ORFvis.java b/ORFF_GUI/ORFvis.java index 735868b..db093e2 100644 --- a/ORFF_GUI/ORFvis.java +++ b/ORFF_GUI/ORFvis.java @@ -5,6 +5,7 @@ import java.awt.*; import java.awt.event.*; import java.io.*; +import java.util.List; public class ORFvis extends JFrame { private JFrame mainFrame; @@ -20,15 +21,23 @@ public ORFvis() { } public static void main(String[] args) { + new SplashScreenDemo(); ORFvis swingMenuDemo = new ORFvis(); - swingMenuDemo.ORFvisualisatie(); swingMenuDemo.showFile(); swingMenuDemo.showMenuDemo(); - } + } + private void setLookAndFeel() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } private void prepareGUI() { + setLookAndFeel(); mainFrame = new JFrame("ORFF_GUI"); mainFrame.setSize(1000, 1000); mainFrame.setLayout(null); @@ -71,11 +80,16 @@ private void showFile() { private void ORFvisualisatie(){ Border blackline = BorderFactory.createLineBorder(Color.black); - JPanel visScreen = new JPanel(); - visScreen.setBounds(5,240,970,685); + JPanel visScreen = new VisualisatiePane(); visScreen.setBackground(Color.white); - visScreen.setBorder(blackline); + visScreen.setBounds(5,240,970,685); + //JScrollPane displayORF = new JScrollPane(visScreen); + //displayORF.setBorder(blackline); + //displayORF.setBounds(5,240,970,685); + //displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + //displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); controlPanel.add(visScreen); + // TODO: 31-3-2020 make visualisation } private void showMenuDemo() { @@ -201,6 +215,7 @@ public void actionPerformed(ActionEvent e) { } catch (IOException ex) { ex.printStackTrace(); } + ORFvisualisatie(); case "Export": System.out.println("hellooo"); break; diff --git a/ORFF_GUI/Reader.java b/ORFF_GUI/Reader.java index 4001bae..f3c0631 100644 --- a/ORFF_GUI/Reader.java +++ b/ORFF_GUI/Reader.java @@ -3,9 +3,11 @@ import javax.swing.*; import javax.swing.filechooser.FileSystemView; import java.io.File; +import java.util.List; public class Reader { private static File file; + private static ORFFinder orf; static File FileChooser() { @@ -20,8 +22,13 @@ static File FileChooser() { file = jfc.getSelectedFile(); } } - ORFFinder.read(file); + orf = new ORFFinder(); + orf.readAndFindORFs(String.valueOf(file)); + return file; } - + static List getLengths(){ + List listoflength = orf.getInfoForVisualisation(); + return listoflength; + } } diff --git a/ORFF_GUI/Sequence.java b/ORFF_GUI/Sequence.java index 5d60b38..984880b 100644 --- a/ORFF_GUI/Sequence.java +++ b/ORFF_GUI/Sequence.java @@ -1,21 +1,28 @@ package ORFF_GUI; +import com.sun.source.tree.LiteralTree; + import java.util.ArrayList; +import java.util.Iterator; -public class Sequence { +public class Sequence implements Iterable { static int totalCompletedORFs = 0; - ArrayList ActiveORFBabyMap; - ArrayList CompletedORFMap; + ArrayList activeORFMap; + ArrayList completedORFMap; int sequenceID; boolean isActive; // is the baby active or not + private int longestORF = 0; + private int totalORFLength = 0; + private int shortestORF = 100000000; + private int lengthOfsequence = 0; public Sequence(int sequenceID) { this.sequenceID = sequenceID; - ActiveORFBabyMap = new ArrayList(); - CompletedORFMap = new ArrayList(); + activeORFMap = new ArrayList(); + completedORFMap = new ArrayList(); } public static void addTotalCompletedORFCount(int amount) {// todo rename @@ -27,30 +34,45 @@ public static int getTotalCompletedCount() {// todo rename return totalCompletedORFs; // todo rename } - public void addORFBaby(ORFBaby orfBaby) { - ActiveORFBabyMap.add(orfBaby); + public void addNewORF(ORF orf) { + activeORFMap.add(orf); } - public void feedActiveORFBabies(boolean isStopcodon) { - // System.out.println("feeding " + ActiveORFBabyMap.size()); // TODO DEBUGPRINT + public void feedActiveORFs(int c, boolean isStopcodon) { + // System.out.println("feeding " + activeORFMap.size()); // TODO DEBUGPRINT - ArrayList inactives = new ArrayList(ActiveORFBabyMap.size()); + ArrayList inactives = new ArrayList(activeORFMap.size()); - for (Object orfBaby : ActiveORFBabyMap) { - isActive = ((ORFBaby) orfBaby).feed(isStopcodon); + for (ORF orf : activeORFMap) { + isActive = orf.feed(c, isStopcodon); if (!isActive) { - inactives.add(orfBaby); - ORF matureORF = ((ORFBaby) orfBaby).mature(); - CompletedORFMap.add(matureORF); + inactives.add(orf); + if (!(orf.getLength() <= Settings.MINIMAL_ORF_LENGTH)) { + // if orf.Length is not too small, add it + int orfLength = orf.getLength(); + totalORFLength += orfLength; + if (orfLength > longestORF) { + longestORF = orfLength; + } + if (orfLength < shortestORF) { + shortestORF = orfLength; + } + completedORFMap.add(orf); + } else { + // orfs that are too small are disposed of + orf = null; + } + } } + // remove inactives (cant do in other loop, derp) - for (Object orfBaby : inactives) { + for (Object orf : inactives) { // System.out.println(orfBaby); // - ActiveORFBabyMap.remove(orfBaby); + activeORFMap.remove(orf); } } @@ -62,15 +84,38 @@ public int getSequenceID() { @Override public String toString() { final StringBuilder sb = new StringBuilder("Sequence{"); - sb.append("ActiveORFMap=").append(ActiveORFBabyMap.size()); - sb.append(", CompletedORFMap=").append(CompletedORFMap.size()); - sb.append(", sequenceID=").append(sequenceID); + sb.append("sequenceID=").append(sequenceID); + sb.append(", totalORFLength=").append(totalORFLength); + sb.append(", averageORFLength=").append(getAverageORFLength()); + sb.append(", longestORF=").append(longestORF); + sb.append(", shortestORF=").append(shortestORF); + sb.append(", completedORFs=").append(getCompletedORFCount()); + sb.append(", length of Sequence=").append(lengthOfsequence); sb.append('}'); return sb.toString(); } + public void calculateLength(int i){ + lengthOfsequence = lengthOfsequence + i; + } + public int getShortestORFLength() { + return shortestORF; + } + + public int getLongestORFLength() { + return longestORF; + } + + public int getAverageORFLength() { + return totalORFLength / completedORFMap.size(); + } public int getCompletedORFCount() { - return CompletedORFMap.size(); + return completedORFMap.size(); } + public int getLengthOfsequence(){return lengthOfsequence;} + @Override + public Iterator iterator() { + return completedORFMap.iterator(); + } } diff --git a/ORFF_GUI/Settings.java b/ORFF_GUI/Settings.java new file mode 100644 index 0000000..6978746 --- /dev/null +++ b/ORFF_GUI/Settings.java @@ -0,0 +1,7 @@ +package ORFF_GUI; + +public class Settings { + + public static final int MINIMAL_ORF_LENGTH = 100; // used in Sequence to determine whether to keep an ORF or not + +} diff --git a/ORFF_GUI/SplashScreenDemo.java b/ORFF_GUI/SplashScreenDemo.java new file mode 100644 index 0000000..931562e --- /dev/null +++ b/ORFF_GUI/SplashScreenDemo.java @@ -0,0 +1,80 @@ +package ORFF_GUI; + +import javax.swing.*; +import java.awt.*; + +public class SplashScreenDemo { + JFrame frame; + JLabel image=new JLabel(new ImageIcon("genes.gif")); + JLabel text=new JLabel("ORFFinder"); + JProgressBar progressBar=new JProgressBar(); + JLabel message=new JLabel(); + SplashScreenDemo() + { + createGUI(); + addImage(); + addText(); + addProgressBar(); + addMessage(); + runningPBar(); + } + public void createGUI(){ + frame=new JFrame(); + frame.getContentPane().setLayout(null); + frame.setUndecorated(true); + frame.setSize(600,400); + frame.setLocationRelativeTo(null); + Color x= new Color( 30,200,255); + frame.getContentPane().setBackground(x); + frame.setVisible(true); + + } + public void addImage(){ + image.setSize(600,200); + frame.add(image); + } + public void addText() + { + text.setFont(new Font("arial",Font.BOLD,30)); + text.setBounds(220,220,600,40); + text.setForeground(Color.white); + frame.add(text); + } + public void addMessage() + { + message.setBounds(250,320,200,40); + message.setForeground(Color.white); + message.setFont(new Font("arial",Font.BOLD,15)); + frame.add(message); + } + public void addProgressBar(){ + progressBar.setBounds(100,280,400,30); + progressBar.setBorderPainted(true); + progressBar.setStringPainted(true); + Color x= new Color(47, 79, 79); + progressBar.setBackground(Color.WHITE); + progressBar.setForeground(x); + progressBar.setValue(0); + frame.add(progressBar); + } + public void runningPBar(){ + int i=0; + + while( i<=100) + { + try{ + Thread.sleep(50); + progressBar.setValue(i); + message.setText("LOADING "+Integer.toString(i)+"%"); + i++; + if(i==100) + frame.dispose(); + }catch(Exception e){ + e.printStackTrace(); + } + + + + } + } +} diff --git a/ORFF_GUI/VisualisatiePane.java b/ORFF_GUI/VisualisatiePane.java new file mode 100644 index 0000000..e60713e --- /dev/null +++ b/ORFF_GUI/VisualisatiePane.java @@ -0,0 +1,33 @@ +package ORFF_GUI; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.util.List; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +public class VisualisatiePane extends JPanel { + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.setColor(Color.BLACK); + List list = Reader.getLengths(); + for (Integer l:list){ + g.drawLine(10,10,l-10,10); + } + } + + public static void createAndShowGui() { + JFrame frame = new JFrame(); + frame.add(new VisualisatiePane()); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setLocationByPlatform(true); + frame.pack(); + frame.setVisible(true); + + } + +} \ No newline at end of file diff --git a/genes.gif b/genes.gif new file mode 100644 index 0000000000000000000000000000000000000000..e48a847c1f40d936e68b61dcd9dc40b686846b60 GIT binary patch literal 76599 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

m@H&|g?1YiCnf3Wsa&g2V-HGhR zndf320A>osL43RqfN(Ny9D1}(O$WSLYs5=%|yjQwuP^U0AY*g)wE&kM~ z9!uPL03MKJnDj0YDPiXPa6eB0pQ2&car#E;>(1Y-0E%A*34A>^Krv`|1n(1WzK{NL z?(jJjJ9bd^s_9PPOjNqAlBVV{a73}5rAB1?#0{QB0cPG=>H6bwD|gEs2{#^KwJ=DA zi_kEI+}|!YIcL@FJt2_SmYRiKA(BGnzc!d;{F)_ExeiETZ~?n1a3LO-t4)oNItKJ! zUdg$}-naSQn!df)<>A*m19m98s?F=?61FdTj(%up`IcXxu@Te!-un#yt_o!&6`Xx7 zQ!EmnAIFcx3P04sns^o14D|?lH(WcPC0?JS6IdBiaWRl$_Tq)gTeC?oAD_`6&JPpI zqWAYxXnUoKIoE|MzC<@_^EZ_dSU+mrlRl>qp_p;rrrujaVpO?^q)eOA4xHddE+xD& z(w2fNiczw33OONuBZAFKe^nv>T+LPfBB`t~zF!N840Oo3CSzuINLRs@<-r+T@ra8a zAlSYkoh}sCTf&2Gd%Dp-VjPd8wl@na<-vF=GFZN8z8*~H-8EWk(0=jeYCJgf%qMn0 z=@^;J$_w7k5z#+(Sfstf(W5iA5;-vv@^rt)Z(_vc<+1$JSR1AH)$EfZ6susm2myXm z_pE@6sqzhb1FNKF-EnuLF1-kTiFX_soI^&ycZ6(kIavh(=yxk-79~G{(7c%&m-Hy_ z2R2r_wpS^c=>9%?nN7sbC#eA**z}$B3-utOdVY`M%(pBQakza zf_(ns7xPUA2zAP@D&&Q~R&!%_*j;9amuw`?Q4)bb%DfxRCjAIqz*v`}YED14U#s}~)=AGzV9qy&u9JgTXDnomT@;6>eZ$YV z-nhv0Y%YMWRD>(8h=a^)dzSb4dn9lnF$fna-j!=#`(~q}nwQkZA~|#k;Xk|=_m-;V zJKP#C3WD7qCqt-wvbydLzxwSp(%Vko#rJKAS{!O-+=%xL6$(wdc0hW6R0{O}?c)9S z*5lt^K05i@l=bAJd)AvUx3a;ytL;by3+`j7cL(di2|O3}D}C_f4lMjrAdB^rAid?7 zVOe-wbgL4F+@?${TF8wXP&k~IsemGguC>BxCK2QZU!iRyOBG82AQ>a$NoE9!eHs>V z^~&#g=8ol(SLB72N*UY425z;AKQGSZD!MvzKcQk0l1h za#A?o9&()1G}_dTFXhK0LSnr4_$I${YN)1Us9!WxRk?!Ur>WsXI;h$9^6t-iuef+m zo=5^ZhS&;)<3ys08a(KN+5NXmSn0$wyGYlP_niL={_d(pg=|VWAmABM_&% zJNKhaW@2*?j-FjEheHBls@zhQF{UJd6)sbLh4F$MRN{X4kL}omK-qxhOu~v|xkM^Y z&Q-hXbP~%bsp%`|16u@{Rz)VnPc``^(K&pONpu0?-Q-8e5%>_t*Tu$!&nL$dwIW&b zZ%-xbY*-`7esSez<(mEu-Po_2$zQiv$Y)&Ec%JQoY_^dLjd%Tex|&NXsz$jUFptpL zy6Qwp@=8sTg@aFHIiUq6IZtM4af{FeRVZ_gNVjF7dxF$HE+jFuyfRNz!2M*<)m}WW zXCj0a3#P}0aAjZO@I>M;V2v%w7u(2f^-vcamPB^T@gVScA~R(DUOiA+v|)gI=GsnR z2|H{L=4IyQ(e*%%!lEmXBIbLWKD!<4O>>;TsK|Z z%Ww&0Yp_-7&ylW>RYo}oa7laJTlabB9$Wu1{khEz`(1-I(@1MXR^1%BSIB;`37uVQ z{Jr{GnY(?{T1N7;w2M|r-mp<#MX8i9eYzX;k0K+9iIwp9LlY5ACqNoRFq9EUbUaMZ zD}1OD9BLfo$rxi%cH24Su*pQ{9qmM?qLo~17h--m4MY<9Yu7;1OB(b~b znpNotUKN1A)wS|cJX}=HAg^>$x~;=BII1^-3l6g#18oeH8>(VzxJA?al~vgWg^m7z zR~UL#zuVU`JCj3vX~a2HW7|;uzR$Np_lks_QS1G3@%uikow^!9d;x6s^Mf25_fdgq zbw&W6ohpe}K@KbnMosdJ)VTAcCKeQckH=0C(E||c!adx?JrBBhuzqb4O6U6?^>5Hq z0G0z9|L-=5ZM7l%&$RB}peGVb;dpZU+u{dX^xDt!D9oNr5a(?B?+rgGFZA?0N~j96 zKLTZPHTx&zrJSBe(c%GIL&3O!zB$=HF|VlMRw7b`0S~jGi>bO=gQ&mV`N-i81B$Wr z{{06J9}f;`-38n9_SV!5Pfb0m9J_DJ#5BFsc^chy&-KzlnXloHuRj#vj7{J6GIBvt z%uMe;ehXnnRqTwjXarzDzden2(IWT*n95su$ao7iok@KK7$Y}?tBa)7pQYdRV>M1u?I=qWN!Pt2P_AE5y3QUCiQn{(V6*M%c6#kwO zESD7zjsp8w4evT}T4dwY9D>93;}w-x+VsdnlW*s;q|izro6K%7A_0KD51K4ZF}!mA zr1;y!iwP|5fU4wr8%^AmW019o+ynmPN1FWnnWS=ZJ_HK!xF%9mN#noD)8j(4)43gl z6|qUl7QD1o8J)Rk)+H{6RNBBFb)1`4UtN*|i#HiQK8C-DYTB#?iFc8r?vybnkFi(! zeSzXc#_z^NEzx8usk1;9)p&SG&!4m9hR4y;gLj#l{JoBU|3kC1W{`vgdXyvhCWyUI zn*W_gX>T1OF?Cp0xZFDt-v-4V?L%gWh%Zm8 zgCKk`mGc>-N0W{}gU&t<@mq?3feD=y=1tD|k$}~+U^$0%KnFTcBiC7Vsyf`%PJ&DY zE3dF%SrI?IRqiHOiUf@x_Q_> zb|Lmu@qKL+Ku#gSB35ShWmSN~`}JDQeT!T$)hUggrgi^u-df)fN!3?wSR_E`8`cFt z-2caUllkD&bXJHXKd+z@=ga?7srwuBer=Qd+@B1*0HV&3s}TUa{O0wXMsenE(EI)1 z!my1@XBpT_HC3avh?H~6{!}&N+NG4uT&w6|4kS@s zSs1iPP#%z#B6iQ)!2xI%RdAbmnr;%8bG7iv=-2KH1g0;X{ z*hjXwOZs5{RVuK^%YjvpG;x9|Xiqtbr0F)V?}TTVSYX+c!`x8KZOu!L$rzQ1++=yk zyrj%f`ESts{;6Z*?)T5+;+hPo%BavFDtzZn8;-lkL9Hrun4HYBNWAiUP=v;|E_g3N zYopkaSSSx#PCn?tBtAP~1jtIX^Uxd+=BR^x?yQi6lU|s&!Lb6Dr$-ByMLWW zc_`6!H&lKr4fyRhU`;uIg=P6a=TX8(t9TBFwB;7>q;=TzP|eLl=&QGrew|0r;Y5;{ zs+QAgGM5|97dhp&RN0O|x~T*=8R+AN$`n;-+hsK}{XDxlX*w$va~hkuls|&NI0r$Z z%L)r3{~~RbTmPBwTBmY2JRbXP?($0?P& zVB~X{c25Q&4cz7u5#{7vuRXI%>46zGn>F!9%my$AF{$~6AxxM}CWu?eudOd9jLW~U z*liUjcg|IIBd-FUgu@BV4vOBB0p@zSXMghsK;^VvwrKe{URxzXO>n$=;f*vx4&;j) zdjB|YwhopTN+*eqE2Nw4LIXXy-j~E8My_gL;-B6XNa0UubP?2F7_mEOq4fK}xE?{m z*mZO~STP1r;_azoE6aAAD{DDf_fv<2myPpTMK3j2qpPI~^TkO^dH=LjqbgT})M_JG zbx~}GuXYE^nUSeT9L@3Rw7^KNxurOnt-4k?Y3EKf(ysa$#iL+u_A=kFsbA+23)4USO6%$^v#R(h${D7Okp;Ln(?R$YSa|RHo6Q^ zoDWTjbYCBOzO1RVuZKckmS!C-GsbND!q7|6G|?S>F@~g!sNR(4QF2LK{wS`U&m>la zlo|iTZTr{m;0qGMg37IC+aJZgeC}CbL=CZFC&rgioyLoJ6zsE3X&8q;H}8^+4GKoBW;UzO3FMiYh%ha{dh|Y z<<~I^E372?Qff%D7IhRL;`Z5GNJ6>;`=xK)%diI>znr(F6iS`U=fGExD^3Wv6e5)x z;EJF5OjPln=YhsFB8sN1FU`5sd4I-dgXMwF4`=Ob;Gxmk=yszd5|2HW z|9u`s$5>&?TcS*gN`jq^?855o@bcElg&*%xXIlb!Vrc~vP)H>m^8BFDK}*Sxj~>R4 z7U#we+Uu6Rn%5HN7PtVRWdKO{_@g(6V~0<_|M)^;db~`-6yN#9$8~5s(qb;KM_p!j zC)=GLI9l3JNf*vqDN#kMacBR}cBQq#=nfuw_i~R)_m5d!;XXt9?T)F!(g7x4r48Ci zoB7u8_?uxn8IsF0yPRGDGUiIqs~4OIV(-pr$7kVwpXvoFJGFddjo)edTEF}tr>pe~ z=u6B|oMi9K#J2;7^?7|iFdI$wM{4m#Z{L0sK>}rZUSGCnoS5F<9Q%*+mZHE%RO)|A z&9ki(iQ(E$K2bCeWZD(v(w@RLV>y2`dwrtfmRhDgP88Vax@_3WUXlmlSjQfNYX$tZKk0x@a+3QS^eCr47;}QzU-<`kx}LR>O%Aq6 z4n>RG0(I(}sBgK3Lx|xdbV{6DN`g&F+yh{g8$Ab&l9dqk$4Zb4JT+G?_2150>3r&q z`qUIThARLu<7rVYOmf(t?Mk-2QzcY~j@hzl#;?OX!S`fHuhc=xy_Zu$RyjU5(r!q1 zyHYE!2N>>e+`K7pb)AE^IwUF3SWp5~?Iu}dDhO(}GmMKr)(}ii3Yfxrwj>6+R>mpf zc%%sNLoU3bRVp7;T~#eFTQ~`Pv*hO^WmW{iGRv=&_4?>718GCBmu5-#-_lo0az+B> zFE>%QZ5mS}xGH5xr`se*`5YG8926}Q(M~F0_8T|PZWUK~G3{{FE`L*%3A`+OFr+Bq z&twLP|1b&Oe;Wv1$f9BF3j*-XuP@2g;LQV^?n z)GhHeMW83X+D0Nr)twfan{@R92Kh(`>V>Anc_xtt2zE``P;rl@`+(X&yUb%sg9JMG z0c-Oh^IZ?>Fe`BJ!=loKq8rCW) zQF175Yi3T1NNAid;g^L?_(!mqQmX6limIja1lp7ccFOyZ78<0{ zeYUV6CGa7$!-5$Xh96YK;3n_3A)B8HWDu37&)UiFEJ`juVEt{wk$*Gau7S=}m*D~% zT6y@ix~Rai;k_%5*IZy3!RDDXoR}OAM|CCS8T5F6(Q)z#x(;H?qmNXatd_qaPK_@@ zPt`e81@RK)H5;_qQnSU5+HkF$3M9b9Q7X4b- zBu0(xwoBk~zGMWu^!-EQ*an1peC^?yi;H*ykX1}Hhxn+__+n@6x7I?y*Mt;E-8*8{ zL%#aF;h>pg;}@HCrr`QNW=eO;xuVjH7q{wfOV^&XmGn7if>=>Db{7WNP3W4-KJAuL zC(>0EO9-cVyV@Zc{Z&{D`p>fT5yr!>o?`+5QOYL36iJG$2aPC_sF z4c2c$5B#1jJM!YGxd?#GwW{_#{jM44H*wCdj(0kl9lr#_IFEV%i{xe@hUL_=xcKjWhp=jA5r2H^U+r z81P^iG@sEVo|1@2Nk6@~sf~<6K?~^W=n5(E#iixmrX%$!f=I&a4rt-i{Cq(!3grIAE z^<(|56#hz$rPDJBB(O4r;}xzSesj(ONFIigJ|OvtN_V0+OMgdrZ5e-2_(bm@6EAOT z^`Hx2B9e2Qt~X46&nkL6blv(=!sn+dNbNqDUBx11MfN*@CnpyQ_IEHnV^K3j0wdO# zm*X}02Z>M=VX!+9%Fr}SC3T`fvyu!bC%?FaC-!xnext6hgu5T**vXt75PF*~_0r>Q zhFqX}JiG8a4_?NRvOQ>;N~a)DgPCGdae4#Ne~3yY+{VQmS&leOB$wm#unY=v>yjKw zUrA7veRKscSf@3Y<#z!oa{lGmRVWU>T*GBhakSD^oavauQ5qnMTer?ZgB z(Pl}uS0G2`zVd_e$Ym9(g%jxhQYcBPb3i9m7_TOGKLGAjpAP7+=LAxi zxgw(P;>^x9or&|VGJl*?4CkP7eRCNaJnPM^QeS&p{()=nd-2_E&8|O%y?-O68>hPS zsj=3ksSQb+CeqWiVg8*R{)v=(JpQV_cg63cJ0Gnjs51ULJNy$VeyB1_DgF8R=(y_Fl+sH13Tl9e&&!C(@j2dm)=ZYT|qkGWmFs z>a6!J`bF+LO5KA=(8SPp$HO-65~qykBjK5}L1tW~%^}<#qay8WT7&qY7l5@%~pvJr`P&nKj;))oynV{*YA3@le1cBSs<0CcrWmSv6HAm=O z%{(u9i-+qadrujK({w%1mPcnSj!~4q^8_cAqU*-SL(y?m2HU_vyd2dk-xXBpQa85o zpKS2Eqq1Lq-{V`edWj3dH3@*_8USLA>7XmCbXj#^@-C?k1vptK02*oW1$EQ zcn{CV%VJpJ0t435v#SZ86W>(}S%8l=o^4qQ3w6L#G$WTub)+-KP^BSq^xI?_2{GU3 zJ+AqLLaK)@P14S*4twygRE-fy)|V)TH$~N-&^-QV(=Cx9mcLCxq-W4wq1=Ro{-2Wu zJ1N?~UynBFr_Oin0j>Xa(jfMl=Y@b5zvY%A4NM%sw9qQ_pw7Ur?68VsZfHQJQyj>< zjXrxK=dU0d8~|q-0x%p54XS+G$s#dSV`y}LUEEAirCrl$DV)zC@N)uye#ButyWL#M zXfjP@6*Tx);UPe!H+I`?Y` zh8|o4Qsa~)RnUM^j*P~PQAr>+EGnf-d1s63EA33(VTCRgyjG&RW)bYTy*X=mvj^5Ae3a}Nb&=9MQKO#t9-m0hAr`L^AT8l z)M|>N-AvEz_^ds&I)>*XskM%E+prCamcXWSp0JdFrAK_)=ab zYEsUJ$el{Se>HOzG*Q@cDCZXGxseKCD7&aO;GOAWJ(PSN93hx)(f6O zDuM3zxCLAi%|0?t&oW}j-;0bbBGP$lPxdf{9N}5Fe<#sh@(6VIq{8y-8MFV)8s7P zKyAOe2qi(stb?nSQ@$XeZ?pm}z>P0Y0Dw(0hlTRT?&O*|tiW^o3oU`ARSo9vF;L3Q zxs9$5du{SYZ%ke&iu3?Y8{qzMGI`Ey3)o$UDEbC>JZfZ<0GoanF_YHA}4>7VS-`1|6klY@?{KWNcK^N)Xk ztYA4!is{x&>;toa^kw_C`}v0`miv4 zq$7QFK7Gt4%67%wfE*JR4`_y_&r>oMJ2IA_>5?SCfYw$0fRH>aFU%plj*|JlBePO(IRZ z(|oG}RS(w%k3{`tl`KGzhyd24C+`y4#T8DYC71Azu;<^*r$x)hM`IDaED?#w*OC!b zt4X}jL91Qkd~#?`_kMG$xX%7r;~pn{|sa?ZsNeu#u*~6 z%z(0bRMnOrSoLo*PrDR#_W*lwT*>Q}YuVX3rkSfGp9)}T$^dJ~0=&VR9o-$rL3S@k z!x`b=*I}iLahkK`noTQdog~l%TiFzQ8819DQ%(Dkd`bQQ1ihX9=3#oDWl21UF`m&&eXug3M30JfCe9BOKiP z1W!r?9dEDz?We>^G2p8b2!rbt9%~WEcP=8)@yRdL@_wIie}a$AuE=%o5GZ#pkl49N zHJz0qk5$*Cy(m|t@gTc5f?8r9qngX14l0F_?fXdvSD`pfXwK=MW?AlP0n$lDCO06& zzX4w440VyQ#U3SK4@g4l51p01fZxSC_>F2`62l(187sYtyi7jb#vO7=v`w*fUXO-Jd) z)B6q;LN%2)UIHpHmYDY?c^>BBUvIo0j3sDh%w|)o+`oBapqTBJ@~7pCJ58}s*K5s~ zFyOoqI=W6XUA3FooZDvv!ey|R!g(GGiG*J}ox8F3cKoVD{aH-Ote+=O9(N z$gY%gYs8k(HLpxq(;<_CX@sSrOpm}NXo-AytE<8hi45h9XG-)ULgx$o92irO_kMQ~ z&{nuqAb}JbxeL+av6&*9kesAUDL)F3*(O#}gQgNm_o9vhUcb!)BL8)YK^|Cj8h8Gm ziBH=Z!Y?_|u8uBK=dWHX1IiFSdE4%_HwFJQ?yUQ+ku}W!$8z-?$=ny=A96Y-6MPzG zGN|AY2t1C#gIoxVPfRT>yP=89XGX!GT#WTxFfL^Z+4suLmewR>1PZE5N2mPc$<@2w zwj4}t1A`7oW*n^ZPWOZv9W-<3<($@tn8*0!#1k;X{M)&9T)~?+bc|S>N<@^(+Fn_@ z$=23s&dSWdlM6VS+$P>z=AvZ~+3#UH_Z$pCSk(l=$z&)kL^91WA+zGPJqpd>(ez=i z)1OWH*2i4`3T=bV9@VWRO;tILvq89kz%T130`@Doj<%_h9(Ra~)vdTacaIAKM{`yI4J-XJ?JbWnaSMek5)MNqm42xVfsSYb0GyPjui1a+ z#lpcIZ8{}0ew%dXfH)RmAD#9cHuItG1Vi)yjbG!&c)7C+sG4?955dze!O&O{_hGK- ztkU)hjY&aRt>rh$L|$u&lfFmFTK@nZT>4Nl6aBgQR+4Bq#jNOnq#u~U#GieU+fRed z6+ZzVZ=+XDp+(`CXt&X=LbOBJ5E@J4n zJ5;8C&pB>ffsXKLrt?fD^W}Q9C#pv|DpByZl@vXwJ5bl%^i)oZg6gbZ)6l_`(!z*C z`m)dVyHs@;dN!S9eq{FmBl@II%dPnn%d1%iNmJwW5T2A}PI?JXS0o>0a;V_HaE+2KacwX>ZW9U6%QgC@E5wlQP!5iJTJaJN_jSL(wBm5)%(>J1o*pqz zq?U=$L0UPo6#_Zi>)JY2nNGF3Qm+rjn(BbBbSw0$LYcVid~iHU+W=WF4O7#|s`P_5 zDjfDvDgGyt3o^dqN}8|E(TMfAf5s-(=*+6{jlR1~AosufGw$5(qGI#e?uJ@-Eg5q? zmLy*|c#1UYVX^+nrZm522m447>#0}On5`N43w?Hnh3Xo2M?@Zc+ly2Ld9&> zfdH#@Q_JoDV$=Nz4L0BXNgcsEQj@$hA4gumqrhi9EUbOM&f2)&`TFu=*r)sMT$d;5 zu>BwD4RtuG?;I@pJot3*>hFoq2d|7fu2ItfMhn8!Ka7KV5L}{<+fTQoY|xH0n0M9;21lSfU#$Np2U9}PW$l8=t&x?>_&>j zXw#|zC)8rCH@7%YREGsD!hGvfz{dr_TX9G_(tWjX%ta`SGV7rW#K6t;hMe_#)g$*? z8TQMSSh@kV{#~l&TB+)>hbalRcac0F2eK6H?5O{+yzaO2?c|>^nSV|(KokftjxP0( zckWPe(+TqOUN`+}$g{&7GV(%k7m;U^ybb`w)S27_r^nrhH&Fwba^&-Hb)+N^-bb3w zU*8%iPp4TLVbi)bw1?VE0EVXs*_ur3x z6x}|cuAK}b6W1EgxUiJdXyi(s$%im-WYc+`fJ}0z=XWxH#hw4KDbO}`GDnolF`VSK z2*uJg0zld6)%=3G|7KGIl@|YYRT8v2TdvHN2&gxxIrIP6dh5TY`~LlZy#X6+14hFb z-J?Um0V4&ZOGUcTfi$S2JEf&T!lWbwbd-dkfPjcaiD06HVBmM2p6B&Guj}*u4_?2$ zZujSLJdV5l*uUA-aUKsa|IPsN(i=x4WS}?}V*gLY@b_`zs)j^uSq( z+7r(;OB!!@Js%aec)ASKB6Ud;04#@^aWVmk)N@zk>@iT6_X&pl+Y!0R`9A5f(ln_^ zi7Bvo3Q0fcaKG_I1QEG6I0a5^hFjIiS+H;B3Jxe)3$1-(&Mc;~I4@e8Ki7d|O8rqW zX#A_!8mh{1r_%N{Uh4we1__r!)9dP-lY5`ahN2bZ!nSe*3kw*=w{$Yq8q$4jJjwzz zB%NETQD;&E`6~5netye^$GUi*0PZ?a(aM&WS7sw%W0$oAhk${v$8apg{i^6&Px6@!(@rk=LvJeBDRwhnHVAGj~t_Rxvy~ z>Hl!L+|TKuU#jlNnZ^s4((g846nF{Ll&6|#^S<{RcRx7>uVkF@;`D&FPzP8I4^}Y@?5_2&5fgM5}b8Ias`esKL3t~#zYYDXiFP_3nKavL-w8u zWD3(qbYRhl>AJ$@g9#t=w$ewY;N%a$CjY{XHfd05^Id8)S!BC{5X>l{QoWL1%v z(et)oZM1g*Q!srU$-O@(v7$d&5~vf;9R9K0jlWH6Ve`h}u&isd4tuke;Cse>Y1f)J zdO2K$+=feOGR>qKon4~zP|f@`!C8yAjvsfVb&+?dyO6SZujlHK57|yZMNfglXmMUg zzCV?&x{1G|_ISmh){8SmB*M}A6k2R*@s*1moXGI7#n&M=zy=P-O+Dj5(|Tv7;u?7z z#=oX0JXT_V5n|rs0eIOzd^{7OZu6y->+K*D$4Ptj58<}-dYBE9 zq|T51Q)TIBYgyNr4c(kq&bhyPtv@#{vhU0`oXM0s{O+>pd-$@P@!HY)OXCpq=~s+U ztsN(st2d!fDuxujVOplFJjfR?!*WYaW2T!)1QCg&ArI%?YC7qwc1QD170m-0b#-`; z!q(P}QX*aFtL~=MD08PVyv^XX95tWTK=glQlsRNS)qD9b-QFt71EW_f4;YsVc=>g= z`IBhxixhKr5B7Et{DLNDPl)R+HTLOg=-_ z%n1z_w8dkHo=9)$Xd>39lj&)jR=J_`7JxchrFj7){(c*+`y^y3-X=uX&isj&%es>d z$A9bg9Bh8BG7GS2pW?8E5-zJO|XK~^~;cqs5zmWBDKkJhbfT7{o36gc*KBItL+PALk9}Zasss?15 zD{%Ls{#?v+Rq0h_UZtd*FeB1syGSSENw2MNzAhG03aJAiz0ZkN00;|_a*x)_pnOR- zY?S-*$GyC@vIZPwW^6=TC2%8-{`T5PK$ud5Fyl<3zCJoe!C&g>5k+6fOl=Uy7l2`> z4GRX;Fryi@=3_?LZ$k8~X7G5uiTGz6WLVa?PN^HYt5W5&MN1bpn z#m!+V&5h51$_57CJE-4GXoLFnL(t6+aNZd zQ%|ZxF$u`i%<=qb`OAay-?}~Z3YY~KQXaLdMkp;V=OJ=^JgC^>s{Eo}xuedtp31Uu zaJg8=p$?nZwbi+khbET%W*&m8? zvdc^KO~t#tMrcSfEqyK>Y-9PRPWVKT7_+=|fo9Z8BWT!qY56*NTiU1DUGc0(GPuS{ za6&nT3sFiS!_d%1Ax4)G&7&M>3b8hz$aXGBkSYNWVzY5~Y=8;7v9N}{9n{XRy5!+f zf9PJcHE40#MEHrjz_1Xr{-QM^i20!fuOr2tvS`!qe!K!JRpeyDKavvL%+%s&w@9tK z%!SRqO6o6RLAk)n-;x-rOR8_&VbR@Vz6p!U+qT)naQi;?F-^_$b?TfX#S>cl z#?g^u(`FKWeQo)=%`iXA$q)C`^D?gLv*`nU=#_6&0WSkdS&kG( zG_y{<_dqUsE?!DCN;p=sxq`dpw1^193`<;^*RHjLpzw9#znN7Hcm;3^0R8Vl9p9J~ zwLcZzhCTz2zqJ&a7xt^3v}^Q;^t{?qD-$g><&5~gDz8JHquMx%o(!flYY_bslLdnV z=YlcX5zH53V;SiQX=-IvwISULj|C%8K&|Umyv!`%8zoeFUaDPlrza^L3ASL=vZdoI ziWxQ7?t2}K?46!*{f)1~rNFBbz9WJak5^U=(pfG%c=6Vjk$H-&#I3ZpbEl5AX!G6o z%b~jb8Jy33ZEm^LoNn9u;O^OrMP_}X)`$!su_`dd1^8tIrBE#6kO|+K z#Utv0P4+^p($^U!t|UYAhZ9;%q9VeQ)wd#A@@zM$H2UZan!-5&j0H0> z{g8EtiKkw_KJ3Y%oAq=A zKI0PiS;6Z{ysH(Ge06fPzwPtt=%u6jAJ$Z@mW!Sp^y&27*?l+5(3@ovQn6hkHj)=O zLi=9Syz;K}{MS?K;OrcI6}H;yM_Upd(-L zM9CZNRygJai@BnJILC1&9K@j56-}@ z=D=n4+D-@~pb~UI^ucHYZSC1K`IxRN%_Y31l`#kO*J9|450yEO@&-u==6qjKg-~Aq zmF&ZI^7PcL7im_4Y&q=lBm^tx?UCe7LbG8{kMtMNDf@-iTWB$@?)x!6(%fE$S!xLl zA@+UVnbG}Y0Y-)j9}UJUy^VN@@Jv^+FQfm*tU|0?c$q;5+Hmyv1l@r7UwP_pX5~|2 z;@~tz8nX^H?y%o+r97Mc7qgxy=TThyyxBg93jy>$^=bHTX6@+%4N?)tBlq})Ms=X7 z(xU$;;{O`dQT-UPlC`TfAEWexqx$YO$1$#UVW5nll)z^D6S zo0Y|!wTDBOdnp_M=+RTS&gOXR%k#rNmO_Bt*Q`eJAJ=BSi!sC63N5%>dl1?dP|ew6 z?`7o-i>Imv%)kib(yN5mTk>5u5ef_u|{DwER)$cDY#s3bV{xH#$#OVe>AS{rlP`)TVT@+~T1hzV* zv};LP-A2|Xyz3O4Yb(z8#tLcFg7qM(A3?(}rOf$3z%mgcZ+tyjQCvDG36D%lNs~;p zLk&cPawP*Q4M3#Fb4}?WV>89$&3*XdxJkFvY?#kFEi=Ln{R!${hJaeIHYS(=tusV< z>D*aL=17MwRhRoq&Yz0zsDZ|pTspG~3FTDue$GPje{o>Zo&xbk{FSGQ8yb&Wm43

{;)im5rlT~5AY8VzA6lMu@*M33lQ{$T^+5}a?E;r(&A#xdgTiK+2 z3u&rd4!M47*{S0&xBg2p8?$zbF9UEX9X&J!3cLEmv|&0mHY2~{$lqFuf9V4UTp`>k zO`2tkOr$;!mT-!gZ9mn@mx1m@lt{eQ!3evwU~IIN0)DO4!iL>5J zDaP~REQ}3o>tk}j$vin$fS=ONxy9Zf0Phb;F?kRGWW2bStGYz>c>pqqcVfJ3@r;T} zI`({p`)k*znQX8v8t@{-owGK2et=4jMR6|OS(v;T)=3}K3G3`8aJ{+ahdmTXdcN12 zo}u%m7^C>gX&mD`^hiL=BKEf;et+`Tg|F$a;65%@>q7yZFFEZa4Z^v%uD|zD$AfQV zG2&+xtpO|( z-Vl9#qpN|}FcxVdrwVe%n8N-KaAxb(zFn;$zQP9)GwhJeXq5|_G7q+=JV9f%bQ znm#m7ndpNDF3fGkznS%&1DL8?t^DPiC-y~uJ(${xgt~bNYObA-)CvYTSJ#WAKLu;+ zRBF%60AxK&n$F&M$x)fRDsf^{K80P5lX=buJ>b(n1#*FHh+$ znCi^0J2B2B#3->UG!Z2<#fHCjlB~|59aHAV;hqU9c-hHNf>qk<@MO7K{7rjw@K( zOHYMGNz-NDIMx)Nv9k~mz(#JJ__XvAW;HgMqmk&Nguiz+;(+y~%$uYs~rN23$Z0g@ApYxiH~XJe5snRyk8(8U9&lw=@ma zAF~(S3SDBkw?A_H@XO_2KQ@lv`}QRJ&~80*r>CngE-?1xw`ac&cN>Ji0LRkjyeoji z9Dfw?F~RcDO)Y0G?Sf?1=}WTKQTK8J8~_)m0etW4qU-b+Kg>s-(D9qbABzt$Pq5eb z2}R0&KHBR-5CudazPLTGwhWH5)aO7Iah%iD3BP2>&R85v5J5*SNv=}QeN#kADgaJG z0Oy~`DpiT|0DVBNAVeKWA|%uoCwcNK(Y`p*=^sTry`pOb4NszZPT*{=P<2he!p`UE zd57DWc(g^$Jhru)$5cL+iDHQ`(h@ z=M>%?$IgZ5%;_)2X>xqFqM!4=Z06Td2Eu|h`HJl^jY_YY&jXXAZKljk@M)+Ne4eGQ zl8{^5VG5+UlZT0>@V6pU=;3HXR44Zv8M9;L))#nQBpP7k`if+CRyLe@WobED~qskmq5SC?^=| zR$S=UT^R7R@XV%&Pm;Jd!plw>WFltORFDuT0^D6j1S^EtRHx~#Gub%C873iZV&e)F zKqr$5jW9BHJHq|j$i&?Utzx)iDhK)LaSa`|0%LL4U^oWP5UT4PRT3Ao6c}shl;eg? zEWw$(ie)*{1uH_=|$mv6kvwKkb-!(Pccb z@;Bzw=q33KU6=PBxw|>(Ox5QzYs}f2un3Es{gJe%zVtt+Qo$?|mBagoSwE|TAIS4p zHi&WT1!@7ZemL^1G@`E?i?1Gf~pXuZ>t#ZR3S|&A2$VRI*KdR9=VKG=#Qvg zTt0K7u{_Yt={&0nPk*^0C@u3#PV7iFth$2bj?2`T#GYWu6>-*wg=L+i;_0;G;=ag_ zRmJV8L4?>Em2cRw=5z12?fKl)AF)?u+cO#{aW1=yX>x~8M&=-@1R9!zBcC8F3-k*2 z*~KvF*NpwO4JCrQz8P2S$d7A~ zHvrnqfGZD59C6c1Nro~w3r5Rv$mvM9_7);Hhm=vpZGT5oG#J}Cfb(wkmIb0z>=W&L z(Eo1GssbAT&Hqb$k!=4QWj6FB`Tk9O*LkNOw$~&rr#Qbl3pL!v)0G#!FH~Jk4=*B- zEZn+CuoflF_BY5y<>pRsTXkc6QQZ zOVM~1i~2Nr`WSj^WHb_c5sYHIVy88D6^U!?4`RMH_WZ@^2Ly{V16qqn+Cm1e`O6O< zn_2EXT9{dsd${SKg+pQuxCtv-)Sa74!kB>dD|%NXb*Vx9bxkIE9#4f>F}gdSmmgIb zD)3*0QVY*G$T2-M8i=enAsYg)F+_ws0GJHx+1H9VXz@Pez%1j}tzBdj)LerJM2c~O zfwK1_3$1hLoQ6l&49QndF5u&?Gl12M(j|B8z;JV42X=`NkJ*NBxbQk1zT<*O{1W>BP6t z=5BvCWdjoTDEexlbKW2bq&jo$^rO2!Q6PCcrpuf!-y{sJwTwmL3GH;>04(7lPve$# z<#AA6eWglwru=~5lc9d#Mfl!Y{;7M$K_~b>A0kJM06%!`s*kLCijOeef8Jt>$ZKLt zlzf=EF&)p@S`RosZi?5D>Czko9yJ}?pN0sEtITS!3|%plu5no*i7EKvYjQr?2u)g? z+Ep|*Jr4je7TBvNro;(+dAua76cZ*|EU+1BWYRF&&te!bZ=3}2CsS#9jrlX)Y`sKc zTzNv)G7xofXSmZG{iM%}AXavc=xp+PdJFf-n4FxlTC3B>KoqZ|L{D6<_m zWZ3j-Zd}rf(-GZ|i@)Afgiu7|q4{^HHT z+t~WJU4U=V5OG+{yp$>cFp?yjq9xVlAUb*Pn0woa(UXpSjdN@X2fhvuh4x;iTPSw> z_{^8-C9GM{zHvHGj(on~a@;*8Vu24tGJ8HL&BE}wAgfxl7oBo4A|r#9`?SuiQ0`|ol`Q*hqjuY_T>|FBApe@@YD~tlATfTHLjYk4-6J7-Wg|+;O_J>L zPEfG*4x8#q$9E}yd_va=W>d7#gS)p9XzxevwPvswT58*B$_*2MYzM}J{kRIddutFD z{Bw64xaurBy?W)CsHBCbCHJg%Vjq|m`zScL?p{rimTqonc}@U4`lfgAMT~(ZMuh)~ zWaVXgjk7<(Q-a9@FA@V_+v2^ZcmWORQ)txbt{a1EqwN^}77_lJ@?yDxEP}>tObPK% z(F~N_F_@)C?B@G}U>n4s=awkz#bsI>zp#uQ{i`vQw2vO*u_Z%~PIT{23mI`HdDgK2 zV=<<3F%&W`X$T^dc0c_P(IFBgNWI|c3pnbwHsH{^6gCaWEhOajRt1PK3dXrk+)=zM zv$Bkyu8rdbERA9d5#eep7P+G~n$?kih))V&{F6em$!(swkNbZcwE3@5g{t>*H+4+W z@0?Ic{|Mv%God;zt@A9-H8y{_I{f5!0CNYO_@cHiFCqW4zO(X!rex_oY3Stco|E37 z`Q|{$+3I0YR9ANH$-*&q#?Qg2wI0Ir01IQk>T>B>6Qc9|A%%HhjGc?I`$>e>b6-K@ zJO>zWpGX0q{ZYKk$@}7?LpiC~FGpNm?EqzmSMmXODL6{n1}(-%-?5hlQp=uKR+1E%*-1)mHRi6|O|3qhib8ZBhg@Kv3)9-=)66jZaPzk?e)pOS>YBrd z$$V?+?scExv_>OkL{9x2v%P5%)D)i{)VFJHJZDcRo6}Bsxyytk_VbN>k%5RqMP)Sg zI-U#0)9%YNJ33WgHi4Ezzkuh+KEQH?zGm6E;tvqa%~SPodo+WmIwQ;UJ7a9jvG8%f#Zn+xR)DB)Ggd9X5W1#%lR#DzF%Jq}D1l%i5Y8jihq z>-6=`LL!aPLP1ly>UtEQ2So2O9#a2W-}#+V`a2^jZ)C3mZf)Vt#quruO?(eteXqgm zeb(ZiuIOQj(m+AJRF8ybi%Bk5eCfP}?ic8}R-ImYyfT5$Kv^{!{@}A+UPEH@yN}j1 zGUt4RfTAN=_C85$ynv7Q{vaVJ+^JKc*ru`XiC&}>JadTihE&vbUUkaCy$h>HPPcz3 zKwA_Gyb8V8-ZjP+{3ZE0cO*lK8$Gbhd3;>$(YU?WfD^2x-yN)Hzo@B1aU zR~ZnE6e9mAtbDmEA^n)oid@-L)9KA0DNdY3SFxKlmwPyYg8q+cIfZwOdaS$kSsB{W zUFG>nDK`!qoHquCRsm@r6T~rf$0Wjrmql8|K zFuj#0Pc9AS0f2V8-YmT95BR(;JqT}38L*k^M>3K=_?`H^I9CzNY;Io~y1<#lLKSMi zLINV2zdi@iXd22&+FJ1^o?qVtGS+8)h&mAs6VGApa$fq#F@TzVDWlSwYX(3kT<`2| ztxo=wm-skg`LTeTEVJv0yzvZI{K|%SMz9*%l+~x-EoGPsc!OBz9f-fK@F3INYR|aD3Q!`7iS!ayJ zB*USa)?|?S6YujPObs6+Z*-0CR{Z-Y)0xO!Md|P`G-~=WbynlkBY1IC-W~MHuF4U4 zX_o%P+HX!Fr$jL4wZn(g6mIr?i==vpgj_;&P3+2ttwv?d^N$c0S1d6WR~~|_miwBw z)Rb?1gg$-%<^|Y%D?fZ&kdpO`6TiMKJoy9%&8H;v=vMb5vgiT(-^6z@>PkshRv+lcna8V) z8l+#piSJ(`!e4KKh7`3@li}ZHPYpH$z@2{y<9{nJ7N`)~vA%F5*I;xOApEgzP^^vF z=#;~@Cr_!DHoJ&nLlH80(EaY58yRHjFog&qMwxC!r1l%bq0wu>T1oR_-pde$1!!g> zHg^q2Rx#pkKU!23-k0O|dL99BKRClvFp^8D_%bD z&*2Rn4fCOIzjP%9EF_)TPoi)pyW7inge9F?3Ip~Fa2M-2ih>+$IFD5mLfJv3EihJ^ z^(m<5g*JjhCn1DrXdx_#%)H9!LN@d3Jq(W+|!phm5q36OhF z_>yY%&{jdbLl6cG=6*vAJ*E6S6a$%I9}tJsK`EM4^EHR8^@yyEh^%Mf3jCasJw?o7 z0JFb|&msGLgUg3v$TBC!(d{IF>o4LvF!|J&9d8GjOF6=80aUff`F)hhkju20?c5KU z9OVsB3bKz^cN@vRy}&0_dyZEXG}g#+l@?$~b=9@kw1*n2cE-uTt@R?9lH%iKJ)#M< z*1RfA@w>>bDZmGzbT#4N>#7MeXh+X{af{iMzNv7PkdSM(IK(WIovneTzS!xYg47iB z1)Tn2nMG(M39R`BEV*fWS`c{oGke&E7cf@)r(klhdQpgDQCPRGPfn7@m>r?r*2`NK zi3dkEgyR5!3nZ|bug4iT(1m3jLmQLXZsO_PaEshvohu|(MG)_hKwxBKSP02ThdoDC zniT?&!;=f&us*0#)IdfjqbFZ z`v$H=uaso=|AxaxKnno&-*I5%zbmZk{eN5PaSE_Lx?h7tjCoD3u)-hHE39jRaXexe zl&^n+)o=C-P0z^mU_r9dYpexwthq}3dfKcA%ftja{GH5dXl&xwMzYW+d{C|Q$sKxm zk$|O3>65DinA4huhR8_BsvuKEPdT4uK+67Yfw80MlR@B$6kOIo3K;SEkQL8mgZref``tx!VeelwHi&=;YF}xe${A{! zS3q*Y!zyL}C2EpJHQ7Z2y_0b@`3!lGe_0eG(FPMWZK+*nw3Bw6f%W<%79j8$HrT~7 z3;XM1JzOl3yebe!VT_z? zUjlDnk4Pi_41~P(fP3zg7+zbhN#!&PZ!h&Jug>9Eg8`14s^Y45d2%EJoTn6=r06Hy zK9z#f7c~n1fayR8{B+38@g@wUut?!bZ<}SOr_=&L45++1ur}niyY}hCEgmc7J&|NJ z7PUG02<$>la=~$|BAWYGOFw<%$6{6Quc_Bkmn37PvPHfzD+sVDkBgNQt?b(xFw7fre0R$zgIF4Nz8&_yWmNRq`_>7ScfWmz{u2l#PAQqT z%)}k)?I(wfsR#@be-kR|5@+3cxbUL7T)?<$oW^8s{MNK+J~!>ALlgh}Lbtxp;sX!q z@zo44_#o<*YB6~U078C;01Wk;6{tEgUO{8m;cpZz5Ni>O$fVSTBXrk$dK`eC)BDGy zJ;tM=JMH+T{(N zO6c<-Gl;-3JNs!E@V1Qjf8g*24^R&rf6~b;^n)TCI$=S35%K26*OxJ0|KrzyYY!rg z?(hM$MEJ=%3>*5g2W$EEXAWK$duvC+-dT29u71Yb?{CxeNm_N3F)!IcqTNh!R(Z&91G|P+>!il;m+25AGoqvYC!9*C9VB4*Yy7H3`tV$V*L8>G!IXt$`87w-4Tp!6uO%~*B_Hqr_0kGKbXs&jpFs0k?43*19*XseCpsV zglFJwF8LD&{$GVv(w$iQw%RBsgfw9tGE(XM?LU_K?^RWbwZ7y}h|lF)J|9b_GU}Ct zl7V2)6r+#`z@zsGyiD}M?7!gf&ot{piishS7XVOsLxrzS(FgNgNYK517JC{=aFeMx z?wzV1!bUQB(@F59JZ34$$CI-`dfJ+|E~b(QLekt#mUSY@QdcXc&8M@DnhR!aPPq!m z9!Aad`?O;eim41}%4l{Fm0#|5H4sY-9O`B~>*&7MJcO*@_|8GnE zx8Ht^K|U{W&>ff^v;Q3P&GpCy`TYlQyt*%xrvqO@CZybMdZV)Ir5f3H?$^$N;vhBu`%!?OB zN@K-TRCN8j-5ZJgX?;ce1Q7Q`Pf%c_~42HIrh{GM)KT3Z$>HTgxVRVOoHiEF=i?-Y-T^ffc(<-oq2s~d{} zcT{$sob|_?d;?>@JIv>MR$?J@(QXbiHuu3l^4cJJ*Y$QI=j;I<^6XKP9!m`hIg#=H zwXn;cgg`uFlEw)yBC=VA?}rN_@R^r9GDj%%RQB%nY7;}|f|%zg-ZSr8_|>Q^ zBsRJBi-z=r%Sj8FE5R&9PfNC2gL`Ymhgmv1rUEn{!svdD-Zy4vBd_5BmQSpiH(uC9#3|5zw&*Uu_l}k%PRhDA-U>isM+}s zl##5w0}Z+_v#meh{{ZW!CRoFL2UZp@@BA~!42G;6?Yxb21=Ut*6cp?31) zZim$B+ep#tz?iYAszYtV0E07x3M#Dd(T{cddF5Ym;2$_V!KorTcRuY?A{OJ?Q@%eU zcLB6tV~WuoCcMyEitG9Hb1VDak2lAEedFkbmDOf-aRE)j&*GtUA0kNYAHPO1m9dM8 zPV^<>eOj*A%pjSMo&g8ko?dbR`)nbspqp68@} z6nS$*iDVu22!cc$qxq8iB3g^cW}Rn=PfmZCh2eh|dy*njQi@a3x>CYLxK9^ER*Kq2SNRx;!=ASK#EO$oaWE{m z617}`*Q+8<;q`6SSl6%&G2)uwx`0xs!pYYTVb4{(l|TkL#mkd2J}Xe zunE=>m`lbAdFI6d%vKz4iF&e4J0JBhKDFxB5$9i=fF$oI4cSGz(5>#oa}$6#E#Vkm zFHvGL_sEC^FA>N@4f<1IecuJ(=Fl*?52*_gmu-~#U143wKHSg#8x9?FU|jC(MQ$D5 z5PmpvQW(I9`)9EyGM7_57wrf_H(u;$grG`Lno}TQ$2`%zoEQu}A$l$nkmUx8`hg-Z)&}a<&agV*wyl8 zTUyh;{Q;ICZ9d#xOnMQRno(SOwY!wQ*mJKHdLEP#DrQR{F<@Lko`$7y25EL`OfxP( zuwdH7B*$!ZKTCAU>0qA~i$u!PqdgAA1K`W&TV+HAnXyya?{lI1+a(!poPsVo7#H?| zRK}csZGj@_3bo|niY#v%@+7vzv6!X%^^tp*;<>7*r2!y+)n%!1`pdEEekoNR>ZXc{S6dg*Y-1TbG(c;^!_I+eb;i>*PK+hF}|tcWjE;P!L@$ z=8*b|8q%vWss$SAvqSVAq7rtm^xfzbImXG`j;L;Hn z-mI;dBt!+N0QMCtj9p5HgRyVC@ph?7eK_|kOPn5*)R?VgO-cE{w`Bw9`YD2*(wc*v ze+w(}Ttu(|swO4k7riOJ6JM6*B61Bubn9pgnGWfu3R~4zTEUYK6+oY7 zNYVsU>PWey9$K`Z9JqC~SVH#}F{)CH!(jM&ETy9I4&(wSw$M1)tTR$~Q+dVOAZtHm z5c992NfqE#K->QkXGs~EyYIKr(Fxr5lKMAsUayNBwM zRY2R@2#Iq%lWfJvd@>?4D?5Z=DTW^hE&}5)^g=4XApz;1a)yyNI;ZLCHGOQEC>=Q+ zl28b6wRR;L%PNWrsIzsX=Ze=y$HMyvU>c*N<@6NqFw00U5(DfXa9}(UH@>=dst@b` zB5(@K`otiCW?Aed~pquD^B_lr{^06vxa8aMef zzU&32vj|~1O*v^g_;z0uk6Kkf)qpIF-6L+f5+If89Ot5@X|&iwjkA_%eGqipr9_8T zZl$Fq7h1ZxUUpZh3ourie)E~&!)4oG4=}Hy)YSm`(qq`% z)TuUMFG;00T6sukDO1nW54Mt>T*e}rlaC)|m?g>AepbtpqgC1AbjCf%_Ije~vw3+3 z&y7|z;O0~8!Z&?Zsq{CdC9u82dfSKrDRz*C__ifDz|=>|uh$Nix2wVJ2^*WcvZdl5 zmLIH1pi@E6sfSt#DvL&PLIoi+Y@$$lVws_FwTVx^j|c#@ky!zDILgXQedEjOLI#|} z%vJMc!=TwV&XDM$t8rW8j(+|7w-8_3HlzOhJ2w`d zc}SdDS-hp+2Uwz2&uqM7ri)iZgf3{YwQcF&1XMKyg3BXnRjxO6bH;(n6malAN0YlxT+X5t z^}Gb@VY7i-IRpQFH2IZIoaMTJuYxo2$t*b|^~B9`z~FMq-v!kD)f~gWi1PyI6>xJO za4i1P7aj!UIsV(<#M$tV4CE#&Anwp%2TvO0)%x&*3%;iO;rk~VT<*sfyG4k+Uh#SI zoUgDDjg+YQWb0~$X~L>1|>%JCEPyvagLQzSsb4`Gsr(UK{4Ki{_1 z>gvH~0$X#=Fk66YEJH+7+;_^n<3Q+Lp_n)pYzpa`G@AQJ^%Q}-IHihK1&5V36IA~q z&LIN#9~sDhjE*Ze5$Cip;>XgQKLhBSV{z!1Mpoys^; z00N+g@uNt%8al3ifrCfDGM}zK$3cWv)V23Y_+64tu8dY?6+^3?_wi=yWG+R3`?n3YA~MkbJ{LlnD}!vY0?Hczx|w$Gi^%N zd<^@WIK%F2mv3dz<4EI2A#s<4I*pSaHhNF|-iUS76TM(M#<=M7i6qLp^qu;JlSP-{ zDaD;4viar#HmHg??qU^EylV07ieU8Fg}8PHOdjF~7%#d^@>xF=Cw-D>@Mh4z4{=7P zOAw*b((HI$X%LCL)K&qgd$skpPCrIgPBATJsk@8l7| zz`X~|jpZAZ_llc?=S?M0&7_SU+K?nIuQr{?eb4DI@R*%zQ&3%o;H2MbXH>j?i8nI? zdxTvMHg3tTnCK}Hb$^`TRo7Ceo8$a}sP)KGnrf6FZn6tMX*glr;gLRv3HNK8RicWq z({e%@dZ-w6aV4WNgwYG~i;rGL>NAlO3aQ11HF+mvL0rYzQBS_}e|JbaZWQAfAGHPK z{U?r$e#Mk?mJ=egvfFV4K*hp)FE&+R42^LIC4~*YcC+K#qC4(4yE0Yt#Y>IY9T69_ zlnqlNE8CSU%kRvejj{TWtiC*Anm`8ULgNiCbKDhiCf;x%8^~@3;bHj>ZMu}AhgAkA z@lv8}I11i{dmuJBO6nWZX?HrAd04Eih<+)uA3NR$)6&d`zzZFWe~k zD~>#vq-3>S&b{KL&NJlrD6OeHoyLHobW7lhpIrJX4UwJQq23DuB%qnR1?_PcUQy%u zzfL@@D2zLPB@tpx8=oFuYOY4)O;rX>c zdiKX=f~(@-=91Iez2>rz4fd5uA==bz@~h*ICawP!lBAC1tKuU%%T^tZ$!I6<4WuY9wLIib! z*$-TF4O?_N0fL6ZWE&5C4Mf6O9nA7fh`%A2J4afH8W;FA`9B-6zlqbxN6SO^W3%2h zB1j`7(uz%#KyoN`v9a9H^_^l!#K>|tC&mq7CjpW|N}-6@8S%2)}SWHV!wBciX_#XK&Yy1vBpYl#mO3%Cl`zt^aB?{*aXDj4q&y}C}0 z1;?TG1U;H9W)+={*{}!$7HLix^H(e74zjOHW{)BW(+K&#rj7z=z;M3{sPd%P3*dOs zJtA)q5I*(a#7QqBmgF!*0+-p)z&)ts226}}@%Kh7oj6m^a8Bh^Z09(ma|4%*WQlqI zFLBBkvyUY~`JX~RY^ZA8kJae@ZFI!epqL}F(PFSwBb6tQ$a^me@HdLr6df*F7-NzwLh z6~w$273zY>?Eq|Z*-R~w-cQMpI*$f1-#9~lSf8Kl3cGYu)HntgnJYq35}- zx`>^-G{I@Qt;UO<7hnn(QQTHa7zEQ>4RqpEiKFFx*$e#CY#iW z(P~@QYeh5)JX!+Ak|{i`l|{K+)9y7=U{fUJn4Wu}A~uU>P?&!lNSZadhre5yMr4j^Pq1BHyuhO}`kcI<9T7Hfk+Y`=xTUpy} z;7ln?IKP$n#?7&81S)4K&yGVMSF8HW1rv_5tjK`uPs-P3R99jA8lic(Cx%s6Sw4y8(C+;qN_de)bG z&&x5`e)5&NW1X}bofcvZnXfq$BbKJpFX^WX>ztH$2SlCkY!oMLEyX5_U{C5txekyI z5&8*3MqBbT15H32U_xpPOR$8qxw}1`yT+7xM0q=hD+&h0c>vXrK11zIeGHfkxqE4gR8mr)g6CQ&%kH7l}8;r+HZz)cX&y1LT3L? zJ!_B1>BOFnN9ZK`OYuj`XXEJlkKd_hRI_q_43l$ z?ypQPGbec7}7E(D^Fr|5|jz~I5;livf9GQeSz`wy%oKs8MM7eBiK;in~p>~eI!rC0rhss2kFT66rU^l;l7HDCh2S9qQrw8@eAb|rFao0Cn<5j|T zjRN9F?VGA9gdQ?r4Buv|nBif(Q5$kyLbs?1-)tgvOy_EopqMftPAX%xYqK%wo#tYU17M2eSO<4L5CtZW@= z9u4fHowTe@ppTgXHOdEI?)iO#{-&OfjP6-@e62mYpkhx1 zQ7G{~IQcUY`_~QX*R?KEPI>|{&VBv@@Plw3iT#s$R{6cVD%$Ga8p&%#*?J}}x}@%I z3?Rz28ge8`D#_9Gph5{2K){U=$vAfeLDuPqP)QJ^x zwqNyBG|vg3O9te5xkgT(`^=zqml^zV1#BV_Wo@{Nu4H2w^nZ-6; z^KMea0B|2SNG7BP7G!{Ff3?ZUJcIU@MdO=8**WkZRtdvBhJrF<%L7mqK=WHipw64> zwBxqjmPK3d6mh$$V4Gv=$(o(>QCSy$XH2D+{bdWbaN@3PG>(;F`HvFhzp1B)vjUiN zpbFUs)ZW!*1(0VJUnf$YcLhD=C@qH3pQd7XLl>pZC-(oKo>lQ%aIt0KG#kEEZF|QsA41qug<<4!n2%6R|CU-Q}tBx!p()-{LQb zJ6rGje6IwNpg8mpGMib4OOMyw>lKpk0~(Yh!2>9rG*3{#qFgk%q_oK@>B1 zT6bOyzR!-C(qwobVa-&zOP`4XiqkUka6X8qU6j-`LMSA2!RTT?zZ~hBWO}LCIUQ{5 z%}eU(I*Y9%vT8oqC6z)$7;y_CY< zIDpy2T~?3b1fC0+Ip^%8Ge$vbv!?ZtUtviLKD}K zf@gh3imzyeQ2oGP%ihV40U`j51V}q*H1)lSs16$W&>*=bv&wK?_{!;+&BVT}BFstj zJEIL7ERsO+e%-aJ)P7=H$o@j)oMdYqZHN(69WdL-9C)Mm^QN)<5Yk2X+?}@K`boJ% z4XliaiHSImd+@O){7f4lLnoE^sudWRYB~Y@+Gj4!9QK`23oC{#FnaUt+rQuIFiCq@ zF$zWwY+GH_O)(t>McKnp*(7q%Csg-HtP)8`u@4Bku3tn$anVlf-xo%VJ6bXt6pZj4 z1c58#WaS#4z2suM#npK!qJJ(wN9D*ZQ-_e)bAPJ*Sx#uT62t%E-Un?sKWzd@KL_lf7_gI#IG+&tr>A9KJ zf(S$s>fu6u+#usb#bdsme1je~lsLPrI?wg2;dq)A{LatVE@{Jh=AZ0@>7B=Lo+ZwE zZ(iOI^9mhAy_$U;kFpJ?b6dNJKU7M=pUU%cwPj)-{xRHB@Z>FNqlq?E3AN)>LBPRi z`zQCyH-C1j7K~lQxBFcuA+IJv{~qo+zdCE#$f-T}m#5^N8nw1OlRNCtjhB*9gUpgQ z$c#RM`3(017a)m8ZmXU1bJLhq#{`1%v8-cslWKIY{pDd7;f^q}Sm&~JmaW@^PeS111pc}s37D4EYXA@)*I!ztg*mjk!hmscPIizs99P=AE3d8 zENY2O(Fzu#A5+C$Kk#aJz#>O@#gJN!#F&fH6rO7SBRGKZZt!*!uY`=d>=C)9he&d@ zNfZH4ZF%MWS874#D3JpRc5N0%X6U&zrRP9}AEwbbEeTi;>p8Q&{8Uz>!Gos=&+FV| zFe}AQi4FgAxTkXpIYxqTEmksg*4to6Iv?(t)&)G2r*1!wQ-)IbnBP7xK`yf-ud>{h zX#!5pOTu-b_uFOJQ$gp$J^w60p5&%{i%WUo?yyyz)EH^h4Y&ibO|1z`>I8(kATVul zvTLq)de@mmJ8v^KUzFBF90jXP&y&pX;2vQjC1*mwNB)$=I9;5@#jo0aSb~%V8Lt~o zL;>n;rW5UG=j@^(S{lik75o}x8oVclcdT@m%y}<9xW82@fu|QiN{=u z#VY^-)FmNHYuCUDf^z4asQ`3m6HW1&81u?djpBWfjSEO~C0J)(t$!b2E*SGyB-ZmH zPpW3$vXE=Mt1~0Wa1+muwgAlproYVkNw1|M1Nha1z0FT4!ko2}K|+n9@EZbn+$?*b%r3Xz`iU+Bxa^r}6KClGc&gahBK_F5jfV+nf` z%mMBPb_rfyvY@(-OMJWsxX;g87otk$sw)*qx@`+2wSupDa#S8Ek&Hl}Sb)bIeL>{K zGT7Vu61c_bv-@8TfFGucsb7KOg^G4FFYRsV?Sz0&gi6RgixRY1Zt1yvTJ+5?_Wcl8 zC`k)=XG_|;zN{q>z(PxFy z)(*8y6o?w-Ot#|vLI^@fgzM*#E3cbJEQ{kJ%Z@rI*vX{)<3f}P+RQN!);Y#Fv*2G+ zOjtMteU;xw7kZJP7#>>C#$;?rn%dR!^ukdJxinRsaNT8kjp9WTe<$6Lwz%v3K))GD z0mdAqnfPB&tQi~GM;=s~pdi13qt;=*fE~(gn>;ok9=gZ-BU?k0w%SJmmbC)Z9pq!5 zqU{h=03dg;l2eHz_kK3e(}LG$^5VQwkI@>_Ml^c=lcT~UZFU6LK`>c`)-%AZBV zY+Sv?H(pT{J%2EE6IHSczF;G5+qAwb4yKCA3d?2Ij`|(TB&gYIP2fC_S-R+H<@bfj z+ze+{CW~)yk^3Sk=$lOeG4$@$RxhS6>mS^lY8G3~{(G)6l;`qWseJ9TeMVqr$Ux|$Xt z+^AlL#f2EOzjS_IMgk4Q{DM5HBG*ug76xAOFaJdetnjeMVuE&hDVSFuD#c915AHL#f2M;&pr_2E7a zD!f@7u_Q#r>oLp98!G0AAeNX1O{j8(jf>yw7FQP}kp|#Xm%=&h zhlwy`ZCqUEF^h$zg4-Gk(5|4`0}pvaNn~j=@Cv0)AnZBs(Qar77)W$*K;Dh0IEpkP z54hwgL9?ObEtd%;!})@r6fnKqs3o6FX2KLal0;W$k`gRS@tJ`N!N?RaY5dQf*Yk6+ zHL+qQDCRRQF*Xis>xPN*3BIU`V_1oF(?m6S!**BRzsBcUXOQuu2HS$4W09OUQYI7i z`yw8y#k0g$TkpQO37#CMIK&BG?Miyctpkx_3$dq>rBiEbDbI8<`rx;Fqs4EvaG&%n zy_ku;;&pu;w_EyZ=ta%sTg~rncD%9glhRL0%9=IcjJiLVzOe}>$#W|sNVmmhFdGGL zLcaVwUXB$%J9#5Mw=4Q1X_ik^xeeF;u19~yt1{WyNtN0RTgpf=Lf z;Nh_ik?Tio22U#J@Ll$i~qCf*ji+p_YviRsz$}?W4=z#S0pi{7Y;3w)(9B zb-?4p*-{{PXD{e~9VEJjPKp!9QtP88#;!N7GU1K~9(dq+9(l8Lm3I2iAUkyq(`c-Y{72#?B%oQ5liRE#3w^Bdqrs#O+Zq%nA z6j~TqG>qk;49%{){A?J66x%H6>eB}T$5rVajmRju?QpAL0e9vs$#No%5!*0aQmv=V zOdQ~5awPM`jn=qGK>B?-sikk<1_1$9eT8c3^R`?V(~?`l(qC2y(9PyDzQ?-6V{D1iPfJeWjn0aHTrYsRqPPVZjr9U z(4D#-sX+oAIX@Tw*`Ty)c1sBRR_?{e#IMo1tZ(x#WC{9s{q4|ehX-l`6B+BYL(e8ZxW>_4Vb6lzPt}kTR;B4vd2IaG*Mxz+i3Z?DM8f+Y#C{@Ii z$|HQW;Of_0gbIL!#M@uu)#;9vuKb>+s@BK1`?4?DmG(93$qn^LpC?f@Thd_^x}Q}z z#0iO)nt0}9%{dsOG4(<=hHQzD)HRu#nkBrc*g%e@$!xN(r$X^G+M_Ofe94q1TOc-e zHe$YMf~qTneSoX=Rc=}38MN(xn{gtB#pdGjmi3a z6hyDVNnyECF4SLbPDJ-vI>NwuK(Kd4x6&c;&bh=C+eXSPbziX zZLSz!mA3Eed} zF0~@dO>}LN9pAsavQ#*be{2%_I%)*c>Dw;hTpotpY&}00gH%7{n!3dki(8LAq}i}W zn_Me~Qj{*RpIJ9-Vb0JL9TSHSZvOm;q4_>Xg9Sdf{OSGm1o;(?o8A?LZZ#ggD%Fsh zHHgFU`FV1^Xb9dPD*Q?J!HzUdKe;_kbuocUw+*qea*u70*9YyiP|^{~rhwsiTH?|? zEg3T$6+|gNV)~(1`lSM4s7)q7@UB=~-WU-{dT5t1bNd{7RfbjW>HO&fGart3E zBgf;g7ormZzmesi=i-La{nJkTB+JZCUzfVi9o>z$eLW`iE?b5Bm-0Sgv3Ws~vv(!v zuojBl@|f5>Q~iFun(DgB_4iWY#j?e9a)L;Sn{vvrs?%U(Ux-ZHWPq3e8@x2k5N#09 zaRzhc)uQ_l#y12#e^)ZN-?$ciBXCaB2ZxM(=wieag_Mut)wPDe;aCRRn>r*;Q2}DZ zz;bnvqm2viSWN#OBWk}>q8;bLume>hr3x+fc&}E(i(!XWaVaJkp+5@ir&ak z(y6vK?1Sp3{L^U>lhu2C3s-=}4USJpp(# zJ<^>QTssRWA==4g#OtQ|#8_~~yTIy0Wj3a6>YnlF2$bNgv9RENpYbD~d@EhiF1(PX1^lO zY^)2!-@Z6<`m3Ao!{5mA4ZV9lKO9k`^l&9=)dcXjgT(kW(}Xq4Od-qSG*bkjV#ttg z2#UmPFr{&+!E3oIT=XM(gsOQX8WCHV_9?lIv2xoLi2J0Z2>ky$`Unn z(vvu9U4X20ZcJEioUNvu2{0;5L!yI3b(p7cNY2SW)FBcOUJYG&$v4v)glXjqWnoip zhhAr(V%AkgtEETHL5=AWs19T6zuuu3#*%V_eQ|7ssrGSSuYW&KF3jOALa|-P`6xyw zsI(@SWrq5grX^=x{yDFh2?XTQ0v|w9%v`vBt-<0l<$B{%rst9eb(MSf0GlO7_g#S3 zh#Vh-VFl+)+j@RHM8o%SNe8y~kHYS&&|bZ`>HUf2+NaZ^x7pCZCZFdWq}LE$AKTBQ zgUzoe1IWWM&>D>Qh9;PrSeVR5-D8#73!!}1%X6=~s0%Ff$u=T#l2W$B^F9`yJR~=A z1lnEm*(AGDCkxG9WTYr9+2c;(KqP!8#rmPWv}Ap|1*Hp46l1f)y_@o8SE<)*Wa^pd z4rvREs-YJAjH^ww*Uc*`^~8)4Ae>PIL8-iJ8d`#^T6U?7=^@NJyRv#6LY*&zOY-Oy z=PR7R2Ng)C^dV^QoY@M+L_+i6alGw1Rv3B=Fqg znH^q}t6viVtCWwq&o3F=oPKFV||Dg}e09I*iAVeh4cjWv$_|#$PutrzYS&GkC}1?E9=z(s!x# zg{us=Q=L#LKbgqhDnRnFCcv$*RjhchA|8NhaEtai(sGc<*Dv;nytkmE*2Q>6S6XwF z#LFYz+bS|uDxS1xGWyjZ$GoY$3DGfCf?)uF@n!bW46`o*i1%Q|?ffU}MnpX9L6>u7 z9BebwnEKnTK_(r-?~@Je6(4yagt7t)UZ ze@eGY%RTs`2TCe0QJbvmCweYe{gVXIBLb8_%X<;(Y9 z=KR!QcsvI!?p(8}PRl_^4LzSbOw7)~&<3ZaQ8DEfmzeRV6jm0M*3{~V!zvqr9Ncwn zwfRkr;Pywk4V{ft{5|~%v`?G52gYti4_Csnp1r*OV4{$NZu-?#y4kr@s)*O`E$AxV z5mwednr&<@w|?3;di!N-_3Nqb(ox95H$aN?#}HDr4jhbNgNPee>x<={IMg^mt*A#) zU*xCk{lZS_$VR^uo+DB|Xfy%kkd8O$17tR_$rFd^O3JPkS)KjOt(W6+Qo4=d_JF-6X zM%mf;Wa+_H0&$Z~hSy6kjy@BNHS!YiX;9c@2j$m6ZmPUPR+q-F#(>YpWtjntih*&mbUnL$PQF@k6joCa zxi1WwL^eyW(8}XxIO93x%akoWJ4?XyJJqJ~{H20xX}bJ1Yw3ovTWc96+CuA@7FM3? z3=yZinO4?L^0;$J;5s18VQgv|Kn>U`p`!)Foj;;CZQM++ZqW+R?HI{^V5gJEE%NHD zjgkr945wW!zEA6aLF5ACD?)VDfq+MOGSfOg@2*1-Wki;K^E)BLp(hooSmwV@-1?5~ z?YgER;g9u|V&r$-AZKRkRR2undjHV_^=V`+=hb}BDc#iHHe==e`9Cz92A@eLK#1D7 zvw+}Qe8UM<$(DFw?e~GI=rO(}@t>pLA#H^$<(m>o+ZP8PMQU-{iV10nNYdzX-W@$u>1BP3XTzg8oe9 zwn;mWa9BV%FFe;AMW!fFrdf8x3r6SaVj`0`bU9rI!Upc@v6^tBE7N~zeMj-rl8*B} ziY|Jr`|78Y3eQ3+rsrIt!7IZ1?g`-~Yb7Ux-^o8yx#FrP7k^;_Jh@m!>P~-;1bMek z)VqZxN@f1;f&QJ!ZECz7b|w(~OQLJwdW!zn3%I)?$H}SPOyvEQuv{1K;myaeeZt6s z%Wh>Sm3|Vx60RkEV0caLwFf9nC1d>K)`1|E2FQK-J$s1^DE1z$W$IR)56ISKmh0~m z_se-8?7Z=LaX$*4i-2r?zmIq&z@I}k>A-CeyBJ(`sUeS4XYBPgyBY1?6SYPMg*tMR zIef*UkYMCZyZgNLIs}@fZMO>%;|zu@WUQ5+uF`o=^@-Uu<{yeN@#1jjJg z4eOhoraD*0WlsG50-duX$c{VBOsH(0GjSdwI3w z|DiHD*KATnY!!j=l6pV#mIYCIi5K>CMvR-VII?hUp}WwLxU}65dFR!sT{L>Pb$FiD|Ps#$RY{cjMO^-|JYOWG5=g9#MUqJGnS~kxA!Yh zNi~M<`qRHpT>0l)$(k$-S^MH39f^V5pg8T8O$kcO-O@geS6>ht(S1r|PZF5ZOeDFQ*2m63o<|lbQ&^GU4X!FRy^%)&lm;aAtVU)#I`G zC*N+^37(Ls769gyeTaZKqk1RiXA47$N6o28^)3Piwqvz`t0^r*n5v+8C7)ojz(Ea% z8tM5d$(8ykgO3?=c5x{ksIYI6m1d%@Lmk;<+RMAbj82|U8m#oZtt!UZ?G}}%v&pJe z?V@>lOupDku6+}=Jrxk19gE>svvKK2QkS7nySLMMGKflUPINbXza6p6$!82Ad?7|N zocz{owxq@yt|8e^M|6!_(g{64j%de0=N`Ju-ZUq{pt%c{S6^mPtzdXl>02Ghdt)i~ z76lCR1_ED6B%iOr9_tGZuyO`!tS-AzwuI=M^=Ky-VD;NE>l5l@T zpC|$by#Pg!iv`zezSr`K;#mP$^XPfA(QUBlHbCaIFZP=#x_FcNkenOC7K|j1m>Lnj zy^6K3Jki0l9dE>SZde6<&Xq)UNAUXRE=}9L&aX13f}o zQuZR5PQJhU-2+|!QFNnUiTn%GQelg}8{cwwg`%419dZ&Y=?lPW0nUxwH>oCq>g>MK z0}J2A!P)fllk;MIR~qjU(oy3(n6P<5j0TjwD6kzs#+VD(evtk5$hwWHfoy{|QPw#)+$Odg;zLLQZ! zP!qetHh^u{-tWk~-d%}Zk{TAz*o%A^5&iu`5RUfDU7P#lBJgBq5!9sPWeWbmuobCG zPI7SnOdSpYaGydTU;qFhB6p4+S^)q3F4O!cdNBBJ^icP|=t1}YK@Yb7A9|?!Z}f2e zpXkBvKhcBsKheWqv)|<5;~(T<_eT#sEpTR$C)*GA=r&CJMx9)0E(p>^r_V5u zbhRJLaaB2YWGX3+lu4Y<2kxjooZ-dQgX2$Us`e6eb_;_?MH92zt2r}ATSw1WvgHG_ zKj{VOX~n2<6HvBoTWJI}9hJn*w(V3hCXhB&1+jRx5fGsaNcfE&*n90`s)vnfNLm){}eQx1=;22v8a`2is>{ zJPubM8fK8?Qubj(d@@zMoX92*OS{|Rq0Tdo&%+8PrpR73vBjR}?Dn8x&_eYu+x8 z%PI);mD|Sta*=X{H~1%nRHjT~U{B+Z2y$nHz-%eO&pH`ofHRKOVJDx8z$uM2EQ5~N zjpY^MO_tjAUT`n3ppkVob|8tQpyDeG^nAdY!6HNku5Nc8mCucW0d|RERz|z(*IdK0 zQb~WIx8R_qNP@A2xz+-W+>$PM>}Db`K0}@Yj_v=A9ySWFLqZ=4z3Jc@V8#iMb&};M zy_*@;rU|ha&*ZgP631V=SxP7cu#(b*E@s*Uw`-~aSYX9lm4(6ETUEs|!opQ7%8K_b zGsilq1r^7Mo9FMcgiXri2RziQR-V}6+T~ov==>n)#ZOJw=>SnyQcg7scE0}cL>97J z7D8%f4@gXkQro3yue7}B?@h&US~AHP@~yc)JPTiHnZCM-Dfk3QKkDZc06f`X6_ZBA z*XDt#ockc(kZsqHR33bNnNJC@pig^^dbF(+2K{%H4J{3k2mIQ7 zSrTxN%I3ssp4zKJ{Qa=!%EWx{MhQ9qXm(Q_WBHwsy6R75Vf_+P^XW$xrQ0M!QRo}P z;>Z+j`t@aSPdw0Z<{xdTKgJuu>d_3Y^c4joqE*lDMpsDem14p27|vkIw$H(QT=<@N zn%ngE{H2hT82X!XPlw+uWeq5EaD^9^KJ?-*j>r(DjswcPw;wS*MJDI+jjjTu&CSQi z6#=3jaJvM>%{*}-&9jl|ZcUz#PYvPD(nTH=MA+w7!Y*B%b+r5Ud+I1~Z5-lGlb(Zt zdo(Ry#^`}XKaptS(ZA8dTF&*e)6J?Ew_59pv~F1K)c)uN{u4d?^)B0b7)>)EE+7&x z4%AYMq?^H5`~y7{2=`V%`;aG85IQ(kja2)8&;u%QMOj{!f64xOq`evusi*a(+EUl$NE8P6M54GLwiGZ6~U)RB23s3Svx1OL#)(-VlmP;v*} z>X>15u@y}~b-%xSQ>oFy5IQK=_y!cs{@6C1RZmJS)I&qMdi2~nq5wWH9*wEl<2SS3 zjb!xv_gw$q=%G^bE$aR^d*8gMT>uqzNjf}&`+64MjnPN`o|45d=-LVV(f~5%d!ncm zHQ=oPS1-^$&YZnBGA%Sc+vqE5IlQrz6He{pQSY zu^2D&8F~hqv4lV}I^cyByIr5zxnknnzj6=qzi@qIHq5qoe-_ImP?kz|LF`GNtpYx-*T8k?E+1h_4)y8IPiVy(y zHXRzthm`r%%~DhVU{l=SA8o0@?iI({bqfD5ZxBT_?$3AG?|qK?-{_%l`v#EPW4qR^ zHZdtG?SW~Aj;4dt%g|3_mx@B?R68~nSZ^?}iZVqd) zI!zE`mo6^&#(^|=MFLqKL7hF@%|Gth{5{_IZ0V>w#GOa*%gqL&1B%#k_p7fu_RKL7 zcrp*FkFdL)Hc45JD8>NDaXz(b-9Q>{DOk0&s83}#j+%v~ui<^Gi2ZnLSSDG!uZ`Q| zjMtkE8;{qVh-X$r1tps*P%T0ubW=7Kwj@dXW?mTVv?K`Ock@}5e`nn^$Hz9smiz6lt*ect| zEJl%hS@}h8MVXxdou<7lSZRSC#o^;6oA@DL@@elLtIw}4q!h<%Smx#gMV}Ox*G4#z zx|{EIqtQ-4!S^?Rw51-i5EZ7SKP{!`8DgTivq;}Qdj9%7LTBtg zNq*~xlMu^k@<}?C;k81PwyQPuTOXuP?N&hJ`}Cxr7L>%ZjaQfRkLgxVqm-mEeu^;T z)dvI*&HI)^EF#RQmo3t~V^zl=@?#c?zW0FM1dOtFxp@{)+6fpKexto^0(_kg8@Kr= zRi*))eQ;*?b6e)btH66tRA0wvTXeL>^nAP#f@o*a-|L=w;(X8#K{tpeDH$p_>s0GB zB>J6MXC6-+Kl%Ri3uA7{=i3c3;>o(L27^^-$-5UHsC|pp7}myW2q37PsX`f|C|7g1 zji5cn-E$J5^H#(oZ)7f zv0l!GxlAeT?B7`R#y(J<6uwR&+jirmz`nm%%?pA#Dcx@ttJ0JopM?P@jk$BqNSGL@ z$21I{0|3%G5l^5Fwg6@MId2Z4LmRK{z=lM-4hc;$uw$K0TUPtcs#qN%!Xj0x14^qe z_Xm2=jg~`%I;BS$O;RbiG4UfnVko?(4PHAGubYei8$DbWbh{1J9!n?rfuzbw7h-Aq z13d@|S2$hdm<+XEj=pgI=`r)K@y6poV9Kh86(%Ni3Lu9F3C)cSA2ACFK=abw)(1rA zlZt2KLsp2V4O9P zQxzxKK_7Wv5O;V?MtKr}Ma$Gr**_1y^Wc>OUTexs7ILCK)($B-BUxwX}2E%&< zUEVUv2QwQQW#7gx`@P?|^*4I>t(eqial3#z;8`u_U9?yo+M?@NWGNMkHAG{ zPs#}fLwP#o?j3`+o4JaYx$^tvIQMCOJVaImC2CKHvA<^mm^p&-Ag4^g1h^uES&}U8 z0-FaPWDo8{o2HF(>07=);U4C!!3Syg595K|)bwGh33k>nbE>ew71Q0d3H%I5zSinN z#Z8U-3XPff&a#wM2#Il7rLEG{05@4-Ei<*lGJUlG6qCU+VS&B~LdOO`0S&US&9Vy1 zvdPQ(w_*;X2T~{on=g3VuR(20v)j->)?LDH^iU&I(Q>1sCCmrz?nD5HH04Ar=G;Eb z!LjB>Ddgg9f1`(+wt)61&$@mnsxMPYGV`W9G8ya@p`TiadU$}LQg)j0;obKcuGZ%F2+OE?tMKz*OLI3x)`F&m0>W&BM^I|N1;C2 zxQ83`DDRFN95@h(A+IETgK_?Kqz`}tf4Txgqx08fK}}Z1ujPv&cE!+eI;_Uo)fs{0 zV=bBb*z1jLcS~AJvRWoG3 zwX5$wS@^IkKhN^QW{u4Eiu+47WMYDH@b-MB%}jy?=Em*?ip>(9WfNk*svcul7#?>h ziS3*$(%D6F$9uZSYmd}mJGDq^Ss6(jajT03W@$8MwvYr^xrL4W;Iwj0~whpr@I@keS>}b1fJS2Afn1(-#b$NmUhPQN*UgWQI$M ziNIoVyozEiCECRxTdq&&W>c+zyMi`CFOA#@o)JGb))1oezaTtBQ*S5$~)~uONyF?+GpFF7FzwZPA9zMO`(Qj1us0BH3y1qISONXdetZmO|aoFzI;z&L(XA`2F{(V34;pXMshV7e`3D8l z;+uLNKXJbMJN9R3WqHMcE&S>8i6**aY8w^c-29vk6%!?L{KfK0#1svTe0E`L?gN;T zjcfHbTQub%jp|;mH~q%u_V%Y&YXQt%Zjw5HQC8A>X}qiTch@U+33DoN4S+=G zB> z)PQG?ABF7Di`ZOKINS?D(wL}TZy-j#|C*TyqCy-*&{F;2H}5c;f6_F#g)uFFRS1eG@{MIpy4r4 z)sxhW;y*6ve+uusJe8#_gw%y{`0ez9vU;YsOtj~~glatoX&e~VwvAISbDLQK({i{( zioG@IGzHtZtk8o(0RWHs7n)K)ogS-c0O*Y}(L`E$ysb#~O`Ez;GyRC>bH*9@;xRd` zse=@z?l)n+$g{hE-5E_AMDZB>vgR7EEE!wCj(FigIUUnyK@#f(w5#sy<3_yPk|~qK zNot^Q_jfc2Tt{SY;7>`rd;Q)JN604$F!RJLHI?=@JJYq1x5a-;+C{#O|DivSqsR7l zn>M@X265N9ERuCI`u-tlKi?a9#)S5)bUhB7yi}9g_qU||udbI%&aJ~~0fT$uDZf}^ zIRgKZv?sB=xTF^v=R#$!hZ1QuQQ5%>P83i(?EIjjxcc}lWJ81h#Vi_z5#AY73B9{+ zW|;Sduc<4$YQ<9GqCfgnj#6`StrJwh+V}5Q-#e>q-aTB`$9$qXQZ-WMTsUxI04nXoV()@$B=68`-iL{gGA`Yq=T^;?G>F4GNL8BV|t}}Hq zb(W~&i&|jz?!9;q=_qpv6^+=dO~Py|>i6)uZpP+=alUL|*7Kbn7+%o=si^^(hR>*7Z;@%b3sk%W}-tDOvHsD$!tKs<7H8Wa08q)4x)gFbd$Tgcy*f~ z&X0lXtn@{KZJ}V0ZiAO)0nnnT9!Lvs(9*kE?DYvp()rxiPaHM(m}u2OBSSY!7sT?S z(kKhb`PSuR5Wu@!@$hobur9Y*qVoY!rH(;891v5S7C!@Souo_3uEsXLltjXwSEdi9+h)_~jQ^((5{ zK5gBdKpK6{+cLyLpnl~$x;9MBwk+|kVhPNHoiF&OUvw0rF9*+G46*%YI^oooQ)Zs7 zrO9pUk#AB(In!C*Q?9}9v8=V=Rnx?Ogl(uJ=lSH{fT2Y6I*=2;gul7#f4NqpUvOv- zgaf37vJ8onr^H+#nIU`gbwn(GOGVI>=A`t;gZ!40XYR&d^I!kikbluN5i;@BJ+Zjr z)0MAjbsq?JZxhD*Rt2e`D`t7(yZpNsGXDB2fGCx0eNH2i2D!Z(G0kHuvc4 zuu1M`%i^rhVLYNS%l}40$iF1*x9cTv9k&#AzOKW9B;dvfB{{KiqZ zk+jWh!;hoQ@#a5-cfTd=f9{RUHcC$1`7wMO+F}5$f&WP4@hclrCj%G;d5WE6YXeKNze@;~2d!RvxYB@a0Y0@kL z>7c?)Fq0=(*buBj3BS8u)$+!nyv8|By{TMEp%+U5(VSXjwW-$*zDApv@Xw=3Wp%NW zL>LxG?z$P!7wunR8TA;66mY^{j&(7`Pz0FpJO{-k?jvbPHO+?rad8kDTHwtQrMCyM zeNvGs8Jw<_Wahj|m!kmM`*Be%u5Yxstjo#B7d)y?;COJ({?u{DmXJ+7!4Hqy5&#}-D@e(7j`DtMoLcjqP zd{HQ#^da?p#q}Np1&OrtYv;_eeK?HK@sT;n8OLr$X>KwhD*40t{=%*s!Gn}dI@{k; z7*9&R0VXkU4YWv)aqA+4cm2MgMcT2*7@U}_c`7O<-GnB})`@c!EU6wn)|V|e;?#@N zc)ZUs1J7ohb6SI2#!UN7z0ZbdNE$h2ufa1Ot6`E)Oep3BvWfU;Ould*a0-x5G6<9C z6Bc7o3!$~e-$*-a&2wAj%dUp31ff`vX+P+xxKQ*CeL&MvNJ}W^$7R3hoC_7LjC&P| z)1A!2^Ow>~w63oOYnu4I?4mX=$;#H?JIe88221j8xjxCe6fJXs3FRyHm03p>`Zw?Uzz8cZOEn>?KPpctXE{6}T3KO-D;F1N$&uh=(70+^-UUN08IGAIhM!5Vnt4tuT8$X=P2bC(4z)%y9W|-$inlm4i z8pnm1MR!*{e<_frXLeV=?1Poys^^7&HnaZ3qdfl=TT@P!eo}o|%IlA2*0axcd`PJC zK0Ka_zFBwG_uOWFVp&S71BE3QMYGtvRP_mn#uH+6={$dTvyxMi&%0TkQL*R8ogF0- z_Pd%@T2@vJ6Q`8s%0GA80Vrvyip$%}?o%<<)HObSa-FWZwPT68e{hnV zik33_+5CcrBaD1($P4fIUFlCOi|2R2oW z2!1GaH!yJn7YU7qlb&J_*BzU~-H~1qUvW@U0+a8d2ga#yD8qq2*JD@QrNM;Ou(U8< zi_ahj2_7i_jYp%IFZe$x2MRA$oW#FfU zThoT;_){H1zdHmV-RU2X{(x)~bI-C!%w3rlPYIn=iXwbr(m$G*m=gligMDJDCW~pl zOs*w`=c0Op%CFQ4B%N|zb1r3mgSASq-`yp(44l%+8i6t1`bq}!V3E&&NW+G6v5kkB z7SS1J3aH4S7J_3GIBa(XAhUaKE%FM8Zw@Tk;_rTe_od0|YeO15ZeIQHq$%4}j}J00 zz_l7kMkm#CX<*?(Oha?^zOec5fmd)wWbzv@o23c zQDH0Y#!E;`YMu?4cMaY5XEW1; z9?sz{h=va=ll z9i_rqdGR*H7eZ6kJ3+Drww!zE+{k9jz94a?wU-$u0tyDd*HevoEeKlRB$Si1rpDhD zqbXsathJ)!16y#-&;ogC2vLCZ0W%1z;*D2&Ot(VhmvI+70K{i_M|m7ejZ=Knp4F_a zb)%{A?EFZ3XMKj#9f9Y;yPn0>vgu%cERuU18fL;>#QQ4y$_0r$X~`GLd~#MWZbRvq zR$ZNSo?A3%&cpvX?tTT(+;XvTkmZNf-h+fVa*cz1$OWV99Xcp)jkM(Dbh0I5S_j|k_G4=NF-L&cUF`RYjp?<2xYESpxBb!Yb zu96AFp+#E$!lQTk3onODnL)e>r{l_k49jQ#)68PV_3fQRPBjAL$;k@=7BIuVnpyD3 zQc#>tEeidAWu1pt6XyT6vj|})fGiP1m=0tG2vcSVJM18cVS}P&$`VP!Mn>3Ss4S6L z!=5TAA_^))RuK(TK(PTqaM541?c09){t?eP&wcLCeO(+CNOsksGN{H-KW{WM9?AXJ zGHW#9+Lt5kB6v1LIwM+h>=DQp_fYIV`T|Hrvja>gjE9Ue-eG4qWJn(>ynM z;5#`?$!lz@3Ly~Qy{L18WXvaymyCM~waF=Gzq^x^@wwFYoO2X!lzQF(_GI-Df!PYs zltJMNGLO`9K|<40vi4L_D&R-BbN*S6?)*Gk^V*Phw5m*9Avo!SNEGn?KlSL3WtQ&w zUmbh~f|04N17(6x3EYo*)DDqH1T?Ghb}XL~6pAFV{MUcF?X2q0OtWB;b-O@(qrH8P zxk*8`H}KF<{r}XXTr<*U%<4@XCwD}L)tE776~o_J`yhYRE{MT4E%+?7edgA+?uX*H z5h+p_s%pH%$~nhg82gnxKF;fpfrjsl$X`A>L|k4M;T9nnFnmEaJ5t_2OPTYN#4^ETB_V55XBZcC>*VV5uGC={pnk*rIKb@O(!bKN8T_phWMwY6U!qd;d)-ALhM!k-AO_yTHZ!Q^LB zAe##+pzxX?^5LR90Y1N}Io^(+HuE3#=xQ3YPxpgU#l)N#gL##;%Ye*i56TO5jKF2_ zQ)Px;bLuwQ_A5n^H@qQ`%q+S<^NRonFltU&bg7{71vVG}D0(*ds}c1HkRULtQ$$id z{&Z$a)~BmgU*Ak$PvFkIu94wUl_Xv8>-YO>&ru5-m<{~&S;vc78&V-s;z|=0hv(O} zwayKG-X>hbmqDN@-7o*KnMc2z*FE*aZRdLZ9ez77Q018vMEv_^kl*^Q zVR`5n{PyICC%|LxdBlUKE^gj8tP>%zT(4G*VjWZYd)|%v*)?8%F-^$U2$0saf4n+^ za_Z4`0L{(mL|{(t75*;Xsy(D3xa6V?j0}gmdCYvej^T}!ea`$?1I+9C1J83|O)BOb zKR@spFI)Ua-49AN5FH`dAY?J)gTtQh)_Nw(X8sRMGEqNXUO#SbkN!N|@|R(`$fF{! zqJZfNzCfQniNJa|uh^i{mg4AbDiub$)ppnX9uLV_*dFbMH{IK^78{I6WZZv9lYcdcJ_WIqB?EUzF%GWNi!%G(Y8NR0?O)LSrhfIJ+nLaGH-OpuK^5w|nAN6Qw^5r#ep6m;_azP`Jhy+3k z3nrNu2_7>%UR(%iYlDBQ0Onv)^9ZR0k*PFVYH??3=}hX4{nXr)sK{yoeFDVlZKP$Z zc}B;HEKjz%3d6Jxb3=^VcLxE#gDQN&C$m4c5YZ3ZG9tB_`mUjZ54D(BqyhlCSgD*o z#cDRZ9+aaYTk!X3wbVX7`YrZYh8V9?214J;*yu|8vZj{3WZfzoQD4or@5r!5hNr#m zs4{Hc52^=eqtn75;|6gWl7Up2jcfcc)7>6D9!<^NA)T1tK za%-V58-qk$CeUn`Mini}(JV4)bCApyIuWT&!6>H86y5k-lwN(@BCqHoGh&By;Y_Ha z%!)T0MZJVK*wGhs%aw|pmUk6pKLf=o4ym2h6g^GILDZb!L)o5HjsB=FU6{m?st*QE z@{fdPpX^fG%Q+)V2I!%3pM=Hr73SO&zV0d&XuYkC)&R}~XbJ>VioAhqxz-+`nV$@T zGD!f;I+u)5oR5@hZnfB+GDq+9CBctzpL}hqvU7Wv&3BZch}45i^TKQgGiAJA%EA#@ zW6D`$e$+<^*2}`@UM+wp1j|yFf~y>EthHTG1h{@Fii^c_eD#sYl|zoKkVLoL`x8AP zll;ruE#?cvKGTe^&QT@P4BMbL#t?=oRx7+OX=<8owjj<{qrV`M> zU$5s0t|i4!(az5g1i~FtXzVl{XiC{(07Mc%!a=N810;I55ZX-*3VEGsj)?>%<(}bF z)GtmDkWD+UCxfr6J_E|t(iR6mZweksFa^@Z>gh?vbqqZ8=1X$xQ^AQA^TDF}LeWHT z>3GAp_2z!*9`G9vi|Ygl7OTrv>Pz)I`e~^1S{$Fxr2`uADxTfw!=CWsnL6zqP+dxz z@f*&V@fnNJoQB6{qInY*ct~SKTRNlD;&=0Ug$L|HaOiHb#jaK@_|}cyevTmrwV3mI zK&q-uWmOUUUuFXg>sGf3AoHIviXQ);Fsd%Y2VL6wR~YSdM2Wfn8Agr&4x?Cpv=>-h zmotl+1%wH43s91aic6gN^|%q@Il!u0Rhhaler|w7=^gqViEuE>wAxvn$&-(6y5AQf zaTCm`+ck8n1Hnz}e=$m6N!uSkndamfc|JD(+DL_ksO*?t<%9|Fy?OseOaQjB`WD=< zx%Yx~raSdo_Z zRt0!^bz`h=AR$NTuBAn-U158na;R^Si~YiZ)ph;G(yH0qa~7orxu~(ncjSMiicKB6 zerCC!E7dw*lE{d!bC$fx>#I9i`Fi?}ge<|oSj`ny>sR|F68=k|Nlfrviszha6|5@i zwitRU)T5=(eO(EI+bOP$z6Y1XhQb%Rnz^TN2b{iQU4vB;!Nlq))wf!*;?x+2MzJa= zFIK6n|5@uaT9z5)-`4}Y2~-?>*}gdm&OpPhj8ou?cVwIgtg>LZ>U3E8Sjz=ItQ2Sd zW_8BxCiGQ9Br{ld;oef&-J598nEhrT(BLty6QVLkuEPC zjjrixBD93g6IcHgMlWuAXXcRRm%uunvIFBhke$CVA*?W3Q;yT}6*BM%nib&v8x!(p z7-i>6N|LEWtgQ2~0bdgT!i4;}p(@ZnZsMxuom6?W$(zXb?+w+7_aJUY@$gxmTKNqf z-5_RW)6WgneHChr;WhqN!tI&B-4$me-8HA{2YX6vr&MSjxXJ7aJ@pc!h)X3@S4$ze z%;wB0dodcq!9EwX>ySNtyqrE&tjt?#yQ~r4c=(Lg=RqGyDIV%LK<0rD4y*Gn$#~iK z`ezpY13`liM#(5($l%NoQ9D@jEcW5KulYbh5dm&MRUa2SgM{Lf!%;mYi6dEk;+VdX zJggksIfzuIKM>&Qj}Ln(8gA;5h}s$2{adu&_~~!6!Tg))f_=uXuj0AwUxPj6%4sk; zS0b4#FdC%s`eI}mS>$Q?H?v2^ohpZ=EZFJ6GI*&ENyEE7fl(9C16PQA#Tv{50Iq3i zTQxrkLmubyv(GwMYa|(F8b+KQ(h}y12B_d@shj;^DS6j4kDkz`PC_OdvK$^CKGg5} z#a1UVY4cA^$jpI{V$X}40~O%p_TT>sqsgyFhwk!P66vLtSBVdQZm8IC zeIPL=>F+RFhXk}#OhV`n??yD6L(7%j8EKJn-!HQA0wAft7EPP<7N^WN735jC>fPym)<#b3or@&v3gO z#T@Z7qzp)NhYg*KT$F~<*`x`J06qpAqGpWes5p`Qy|p5TKmx0;uf&`XXvP#HOnj*}jdXcMYdwupzDgJ%?!g08PSN`RjS0~Tua!$d9;_zvMV?)v z9QzL@u#uEktyN9qJL37z4i`*qzq$wYp z>Sd^32Pu|}GUOo@?dD@p0mVfs+g*LNG-H5jyO(1c8gNr(C}p^26~JHKAM~3`Lp;5o z3o3pIX^SwLUvA+XoZ1phbU2~;-B*GgjmjxSQ>QLpU;$tT^I`IvM-R;0PRM5#d^L-Y za-Vy3BAo=CY5eta$MF0I)`p6~b0?Cc`~XPIkqlhgozqsS6c^}y#DCjT5iuV0T!*=; z0rk8TDGH}VjZdh}`p=m3UntFO5Rx_u*^Hc=HgSbbl@0g0D7}#9#axB~kurXM5={4J zm`%6@E}ij(x(EXS{XA*Cl~Qt_i+pE< zv`&TGCx7lNUZ6KB8^=Eu6^5!zx#8pX7$mmx&fD$#frU3`Ma5{0;6V5WZ3DRAjWs!< zd!`{VARM}-LWq`zC=jo5m%tQ*UL|k1!_OXVZZ%UvG|Rx^AB5N?4fww)@L_J6n!| z)Q)y`_kxe|CApqrq1ttuiweiH-^C~OALrut!vX6(b&{NJ3J-&in%AB?x)5GBQ~Um& z;2@p*7c3%4x8W(;bL65Xs3Syes>=7JM}A}=}zHJ)!}#(Y~szQEj+K5YB=&9 zv8JWFR%fHKKP`ej-+hsF-bWR2YxS@Bz5dz62im~Lh(DC@D{*7iv)c-7LX_EyXH|=B z3S2v?qomo-^a{8f@p1Xpt1%G<8@aO zEhk1z!kQt!_vv^G0=*+HBSn5-LL_kjjtCuY0wjP1JS2f!_b5st@qc1Ml;k6klBdjx zmKW8J%dwQ9A_<0=pSQXq3AUGcwP=uz2b2@0AXWJPHjSM>Z*_5r_>}nJ<^&vG5#0_K z77qDGw7ws#LHFXRb~X&5 zZ})^jZ2U{rmcz2q5=~q$9zuXJNS7VLaFvJV*;Mp zyO5?T(d;AnyQx*-j@=tHDvm1p9u9xIs;)Dk+1I8FCP5#`b3aygZS}tDy`=SVAha`| zGw)?)iGcZ+0=HXLac-4LEy5QBTXBq>mqRnqUI z;+;}L*U5y*>>H~G^xJn;m<;VhJ%mlUgMP7nn5=^4FA0jc(H7+9bqI>XUX6r-`n}3M zf`fK*^*K%>sh-g}lz3{+XpWBpJsI%3o^X&8UM?k>6vD9(dO+td@YF2u zb}6{S?`YzYoJ=>ipR{A$>Q3cInUsel6mracr0&9#e>9Cxl45}Vw~2Z2$lSMO$+ljH zbdGszb`@MPLELJOzrsR7w@81`>9><9kl{!-Ke4$0q$RQ}JG6q%qG8g2nCNIiVkccKkj1#uMV z;R8?i%}o<+Nh^#msl9C0O*nHE&%RA__akL^k&5qQGsXxvR-2i1g}+nV02w| zEZO5?x3+}Y?N}{?C#^-4-z3!wEEA$?FkLAgXdSc?HNDswRbJ)cUAoaxl3Z+e&&8~? zGA&mtDOWV@MFhq93{|5}Gv#xom&zs2I@3dgbw^ZGE+N)@l+ Date: Fri, 3 Apr 2020 19:20:53 +0200 Subject: [PATCH 04/43] GUI Updated color scheme updated colorscheme and some bugfixes for the display --- DNA-512.png | Bin 0 -> 32943 bytes ORFF_GUI/ORFvis.java | 81 +++++++++++++++++++++++++-------- ORFF_GUI/Reader.java | 6 ++- ORFF_GUI/VisualisatiePane.java | 28 ++++++------ hatebed.gif | Bin 0 -> 81669 bytes 5 files changed, 81 insertions(+), 34 deletions(-) create mode 100644 DNA-512.png create mode 100644 hatebed.gif diff --git a/DNA-512.png b/DNA-512.png new file mode 100644 index 0000000000000000000000000000000000000000..807568758ddf51aa8c31e6ef86ee26d5859fbd77 GIT binary patch literal 32943 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 literal 0 HcmV?d00001 diff --git a/ORFF_GUI/ORFvis.java b/ORFF_GUI/ORFvis.java index db093e2..c0dcc83 100644 --- a/ORFF_GUI/ORFvis.java +++ b/ORFF_GUI/ORFvis.java @@ -15,6 +15,12 @@ public class ORFvis extends JFrame { private JScrollPane displayfile; private JTextField pathToFile; private JTextArea textofFile; + private JLabel jl; + Color black= new Color(43, 43, 43); + Color lighter_black= new Color(60, 63, 65); + Color DarkBlue= new Color(47, 79, 79); + Color Blue= new Color( 30,200,255); + Image img = Toolkit.getDefaultToolkit().getImage("DNA-512.png"); public ORFvis() { prepareGUI(); @@ -23,6 +29,7 @@ public ORFvis() { public static void main(String[] args) { new SplashScreenDemo(); ORFvis swingMenuDemo = new ORFvis(); + swingMenuDemo.HolderImage(); swingMenuDemo.showFile(); swingMenuDemo.showMenuDemo(); @@ -41,8 +48,8 @@ private void prepareGUI() { mainFrame = new JFrame("ORFF_GUI"); mainFrame.setSize(1000, 1000); mainFrame.setLayout(null); - - + mainFrame.getContentPane().setBackground(black); + mainFrame.setIconImage(img); headerLabel = new JLabel("", JLabel.CENTER); statusLabel = new JLabel("", JLabel.CENTER); statusLabel.setSize(350, 100); @@ -53,49 +60,77 @@ public void windowClosing(WindowEvent windowEvent) { } }); controlPanel = new JPanel(); - controlPanel.setBounds(1, 1, 1000, 1000); - controlPanel.setLayout(null); + controlPanel.setBounds(1, 1, 950, 930); + controlPanel.setLayout(new BorderLayout(10,10)); + controlPanel.setBackground(black); //mainFrame.add(headerLabel); mainFrame.add(controlPanel); //mainFrame.add(statusLabel); + controlPanel.setVisible(true); mainFrame.setVisible(true); } private void showFile() { // creation of file display with scrolling bar - Border blackline = BorderFactory.createLineBorder(Color.black); + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); + Font text = new Font("arial",Font.PLAIN,12); textofFile = new JTextArea(200, 100); + textofFile.setBackground(lighter_black); + textofFile.setForeground(Color.white); + textofFile.setFont(text); + displayfile = new JScrollPane(textofFile); pathToFile = new JTextField("Path/of/File"); - pathToFile.setBounds(5, 5, 970, 25); - displayfile.setBounds(5, 30, 970, 200); - displayfile.setBorder(blackline); + pathToFile.setBackground(Blue); + pathToFile.setForeground(Color.white); + pathToFile.setEditable(false); + pathToFile.setFont(titel); + pathToFile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //pathToFile.setBounds(5, 5, 970, 25); + pathToFile.setPreferredSize(new Dimension(970,25)); + //displayfile.setBounds(5, 30, 970, 200); + + textofFile.setPreferredSize(new Dimension(940,100)); + + displayfile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //displayfile.setBorder(blackline); displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + displayfile.setPreferredSize(new Dimension(940,100)); textofFile.setText("Display of file content"); - controlPanel.add(pathToFile); - controlPanel.add(displayfile); + + controlPanel.add(pathToFile, BorderLayout.NORTH); + controlPanel.add(displayfile,BorderLayout.CENTER); } private void ORFvisualisatie(){ - Border blackline = BorderFactory.createLineBorder(Color.black); + Border blackline = BorderFactory.createLineBorder(Blue); JPanel visScreen = new VisualisatiePane(); - visScreen.setBackground(Color.white); - visScreen.setBounds(5,240,970,685); - //JScrollPane displayORF = new JScrollPane(visScreen); - //displayORF.setBorder(blackline); + visScreen.setBackground(lighter_black); + //visScreen.setBounds(5,240,970,685); + List list = Reader.getLengths(); + int largest = 0; + for (int length : list) { + if (length > largest) { + largest = length; + System.out.println(largest); + } + } + visScreen.setPreferredSize(new Dimension(largest,685)); + JScrollPane displayORF = new JScrollPane(visScreen); + displayORF.setBorder(blackline); //displayORF.setBounds(5,240,970,685); - //displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - //displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - controlPanel.add(visScreen); + displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + controlPanel.add(displayORF,BorderLayout.SOUTH); // TODO: 31-3-2020 make visualisation } private void showMenuDemo() { //create a menu bar final JMenuBar menuBar = new JMenuBar(); - //create menus JMenu fileMenu = new JMenu("File"); JMenu editMenu = new JMenu("Blast"); @@ -194,6 +229,11 @@ public void itemStateChanged(ItemEvent e) { mainFrame.setVisible(true); } + private void HolderImage(){ + ImageIcon image = new ImageIcon("hatebed.gif"); + jl=new JLabel("",image,JLabel.CENTER); + controlPanel.add(jl,BorderLayout.SOUTH); + } private void FileDisplayer(File file) throws IOException { BufferedReader input = new BufferedReader( @@ -216,6 +256,9 @@ public void actionPerformed(ActionEvent e) { ex.printStackTrace(); } ORFvisualisatie(); + controlPanel.repaint(); + controlPanel.remove(jl); + controlPanel.validate(); case "Export": System.out.println("hellooo"); break; diff --git a/ORFF_GUI/Reader.java b/ORFF_GUI/Reader.java index f3c0631..3fc40e5 100644 --- a/ORFF_GUI/Reader.java +++ b/ORFF_GUI/Reader.java @@ -10,7 +10,6 @@ public class Reader { private static ORFFinder orf; static File FileChooser() { - System.out.println("i got here"); JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); jfc.setDialogTitle("Choose a directory to save your file: "); @@ -27,8 +26,11 @@ static File FileChooser() { return file; } - static List getLengths(){ + static List getLengths() { + int largest = 0; List listoflength = orf.getInfoForVisualisation(); + return listoflength; } + } diff --git a/ORFF_GUI/VisualisatiePane.java b/ORFF_GUI/VisualisatiePane.java index e60713e..7487fb9 100644 --- a/ORFF_GUI/VisualisatiePane.java +++ b/ORFF_GUI/VisualisatiePane.java @@ -1,8 +1,6 @@ package ORFF_GUI; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; +import java.awt.*; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; @@ -12,22 +10,26 @@ public class VisualisatiePane extends JPanel { @Override protected void paintComponent(Graphics g) { + int firstline = 10; super.paintComponent(g); - g.setColor(Color.BLACK); + Graphics2D g2 = (Graphics2D) g; + g2.setColor(Color.WHITE); + g2.setStroke(new BasicStroke(2)); List list = Reader.getLengths(); for (Integer l:list){ - g.drawLine(10,10,l-10,10); + firstline = firstline + 30; + g.drawLine(10,10 + firstline,l-10,10 + firstline); } } - public static void createAndShowGui() { - JFrame frame = new JFrame(); - frame.add(new VisualisatiePane()); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setLocationByPlatform(true); - frame.pack(); - frame.setVisible(true); + //public static void createAndShowGui() { + // JFrame frame = new JFrame(); + // frame.add(new VisualisatiePane()); + // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // frame.setLocationByPlatform(true); + // frame.pack(); + // frame.setVisible(true); - } + //} } \ No newline at end of file diff --git a/hatebed.gif b/hatebed.gif new file mode 100644 index 0000000000000000000000000000000000000000..00d84a557a38ac96cc7f9ee0328f7c618e979481 GIT binary patch literal 81669 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%0AYS_=%cw7zGV`ye)xTJ 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 P+|OcE Date: Fri, 3 Apr 2020 19:21:19 +0200 Subject: [PATCH 05/43] Delete ORFBaby.java --- ORFF_GUI/ORFBaby.java | 49 ------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 ORFF_GUI/ORFBaby.java diff --git a/ORFF_GUI/ORFBaby.java b/ORFF_GUI/ORFBaby.java deleted file mode 100644 index 8f3f13e..0000000 --- a/ORFF_GUI/ORFBaby.java +++ /dev/null @@ -1,49 +0,0 @@ -package ORFF_GUI; -public class ORFBaby extends ORF { - - static int totalBabyORFs = 0; - - private Sequence parentSequence; - private int id; - private int startpos; - private int length; - private int endpos; - - public ORFBaby(int startpos, Sequence parent) { - this.id = totalBabyORFs++; - this.startpos = startpos; - - - /** - * bugfix: initial length 3 -> 2, because each ORF wil be 'fed' the last 'G' of 'ATG' directly after - * initiation - */ - this.length = 2; - - this.parentSequence = parent; - } - - public boolean feed(boolean stopcodon) { // todo maybe this can return a mature ORF on stopcodon instead - this.length++; - if (stopcodon && length % 3 == 0) { - endpos = startpos + length; - return false; - } - return true; - } - - public ORF mature() { - ORF matureOrf = new ORF(startpos, length, endpos); - return matureOrf; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("ORF="); - sb.append(id); - sb.append("START=").append(startpos); - sb.append("END=").append(endpos); - sb.append("SEQID=").append(parentSequence.getSequenceID()); - return sb.toString(); - } -} From da041fea67b012d0efa84c4f38e81abb6752ae13 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Tue, 7 Apr 2020 23:36:53 +0200 Subject: [PATCH 06/43] add big datafile to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4dfc85f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +src/test/resources/data/DNA.txt From 64bd65e4fe356c3df1078b42e4151712f60623ee Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Tue, 7 Apr 2020 23:33:23 +0200 Subject: [PATCH 07/43] merge ORFFinder with ORFvis & Maven structure (part 1) --- src/main/java/helpers/MaskFactory.java | 19 + src/main/java/helpers/Reader.java | 49 +++ src/main/java/main/Controller.java | 8 + src/main/java/main/Settings.java | 5 + src/main/java/orffinder/ORF.java | 34 ++ src/main/java/orffinder/ORFFinder.java | 422 +++++++++++++++++++++ src/main/java/orffinder/Sequence.java | 119 ++++++ src/main/java/orfgui/ORFVisualiser.java | 288 ++++++++++++++ src/main/java/orfgui/SplashScreenDemo.java | 80 ++++ src/main/java/orfgui/VisualisatiePane.java | 34 ++ src/main/resources/DNA-512.png | Bin 0 -> 32943 bytes src/main/resources/genes.gif | Bin 0 -> 76599 bytes src/main/resources/hatebed.gif | Bin 0 -> 81669 bytes 13 files changed, 1058 insertions(+) create mode 100644 src/main/java/helpers/MaskFactory.java create mode 100644 src/main/java/helpers/Reader.java create mode 100644 src/main/java/main/Controller.java create mode 100644 src/main/java/main/Settings.java create mode 100644 src/main/java/orffinder/ORF.java create mode 100644 src/main/java/orffinder/ORFFinder.java create mode 100644 src/main/java/orffinder/Sequence.java create mode 100644 src/main/java/orfgui/ORFVisualiser.java create mode 100644 src/main/java/orfgui/SplashScreenDemo.java create mode 100644 src/main/java/orfgui/VisualisatiePane.java create mode 100644 src/main/resources/DNA-512.png create mode 100644 src/main/resources/genes.gif create mode 100644 src/main/resources/hatebed.gif diff --git a/src/main/java/helpers/MaskFactory.java b/src/main/java/helpers/MaskFactory.java new file mode 100644 index 0000000..e6c19fb --- /dev/null +++ b/src/main/java/helpers/MaskFactory.java @@ -0,0 +1,19 @@ +package helpers; +public class MaskFactory +{ + public static byte GetByte_0(long u) + { + return (byte) (u & 0xFF); + } + + public static byte GetByte_1(long u) + { + return (byte) ((u & 0xFF00) >> 8); + } + + public static byte GetByte_2(long u) + { + return (byte) ((u & 0xFF0000) >> 16); + } + +} \ No newline at end of file diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java new file mode 100644 index 0000000..8857512 --- /dev/null +++ b/src/main/java/helpers/Reader.java @@ -0,0 +1,49 @@ +package helpers; + +import orffinder.ORFFinder; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.util.List; + + +public class Reader { + private static File file; + private static ORFFinder orfFinder; + + public static File FileChooser() { + System.out.println("Reader.FileChooser() fired!"); // todo-debugprint + JFileChooser jfc = new JFileChooser("."); + jfc.setDialogTitle("Choose a directory to save your file: "); + jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); + + int returnValue = jfc.showSaveDialog(null); + if (returnValue == JFileChooser.APPROVE_OPTION) { + if (jfc.getSelectedFile().isFile()) { + file = jfc.getSelectedFile(); + } + } + + try { + orfFinder = new ORFFinder(file); + + } catch (IOException e) { + + // todo popup + e.printStackTrace(); + } + + orfFinder.findOrfs(); + + return file; + } + + public static List getLengths() { + int largest = 0; + List listoflengths = orfFinder.getInfoForVisualisation(); + + return listoflengths; + } + +} diff --git a/src/main/java/main/Controller.java b/src/main/java/main/Controller.java new file mode 100644 index 0000000..9099930 --- /dev/null +++ b/src/main/java/main/Controller.java @@ -0,0 +1,8 @@ +package main; + +public class Controller { + + public Controller() { + + } +} diff --git a/src/main/java/main/Settings.java b/src/main/java/main/Settings.java new file mode 100644 index 0000000..9a93757 --- /dev/null +++ b/src/main/java/main/Settings.java @@ -0,0 +1,5 @@ +public class Settings { + + public static final int MINIMAL_ORF_LENGTH = 0; // used in Sequence to determine whether to keep an ORF or not + +} diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java new file mode 100644 index 0000000..648648b --- /dev/null +++ b/src/main/java/orffinder/ORF.java @@ -0,0 +1,34 @@ +package orffinder; + +public class ORF { + + private long offset; // offset in file + public long endpos; // endpos in file + private long counterStart; // relative counter to dna + public long counterEnd; // relative counter to dna without the fucking linefeeds + +public ORF(long position, long charCounter) { + offset = position; + counterStart = charCounter; +} + + public long getSize() { + return counterEnd-counterStart; + } + + public int getOffset() { + return (int) offset; + } + + public long getCounterStart() { + return counterStart; + } + + public long getEndpos() { + return endpos; + } + +} + + +// raise LITTLE_ENDIAN \ No newline at end of file diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java new file mode 100644 index 0000000..b87dd62 --- /dev/null +++ b/src/main/java/orffinder/ORFFinder.java @@ -0,0 +1,422 @@ +package orffinder; + + +import helpers.MaskFactory; +import org.jetbrains.annotations.Contract; + +import java.io.*; +import java.math.BigDecimal; +import java.nio.BufferUnderflowException; +import java.nio.ByteOrder; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +// try -Xms512M -Xmx512M in VM options +// add -ea for enable assertions in VM options + +/** + * ORFFinder reads through a textfile (assumed format: nucleotide FASTA) to find ORFS + */ +public class ORFFinder { + + // constants + private static final byte HEADER = 62; // 00 11 11 10 // Header prefix > + private static final byte CR = 13; // 00 00 11 01 // Carriage Return + private static final byte LF = 10; // 00 00 10 10 // Line Feed + private static final byte A = 65; // 01 00 00 01 + private static final byte T = 84; // 01 01 01 00 + private static final byte C = 67; // 01 00 00 11 + private static final byte G = 71; // 01 00 01 11 + private static final byte N = 78; // 01 00 11 10 + private static final long ATG = (A) | (T << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 01 01 00 01 00 00 01 + private static final long TAG = (T) | (A << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 00 00 01 01 01 01 00 + private static final long TAA = (T) | (A << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 00 01 01 01 01 00 + private static final long TGA = (T) | (G << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 01 11 01 01 01 00 + private static final long CRLF_CHECK_1 = (CR << 8) | (LF << 16); // 00 00 00 00 00 00 10 10 00 00 11 01 00 00 00 00 // x + #13 + #10 + private static final long CRLF_CHECK_2 = (CR << 16); // 00 00 00 00 00 00 11 01 00 00 00 00 00 00 00 00 // x + y + #13 + private static final int MASK_3 = 0x00FFFFFF; + private static final long MASK_5 = 0xFFFFFFFFFFL; + + static String filename_RELATIVE_TEMP = "src/test/resources/data/Glennie the platypus.fa"; + private final ArrayList sequences = new ArrayList(100); + private File file; + private RandomAccessFile mainRAFile; + private FileChannel mainFileChannel; + private MappedByteBuffer mainBuffer; + + public static void main(String[] args) { + + } + + public ORFFinder(File file) throws IOException { + file = file; + mainRAFile = new RandomAccessFile(file, "r"); + mainFileChannel = mainRAFile.getChannel(); + // mainBuffer = new RandomAccessFile(file, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); // as oneliner + mainBuffer = mainFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); + mainBuffer.order(ByteOrder.LITTLE_ENDIAN); // SHOOT ME IN THE FOOT (took ~xxxhours to figure out) + + } + + public void setFile(File file) { + this.file = file; + } + + + /** + * Algorithm by Eric Langedijk + * ASCII TABLE (for reference) + * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) + * chars of interest and their ASCII values: (65, A) (84, T) (67, C) (71, G) (62, >) + */ + public void findOrfs() { + findOrfs(String.valueOf(file)); + } + + public void findOrfs(String filename) { + + // TIME LOGGING + long startTime = System.nanoTime(); + + // variables + StringBuilder currHeader; + byte b_byteAtPointer; + long currentCodonLong; + int position; + int charCounter; + int currentTextLine; + + // initialise some + Sequence currentSequence = null; + position = 0; + charCounter = 0; + currentTextLine = 0; + int delta; + + //debug stuff + int orfsCounted = 0; + + + MappedByteBuffer buffer = mainBuffer; + + final long lastValidDNACharacterPos = buffer.capacity() - 8; + + boolean UNIXLinefeeds = true; + // check which type of linefeed the file contains, if it contains CR assume all are CRLF + while (position < lastValidDNACharacterPos) { + b_byteAtPointer = buffer.get(); + if (b_byteAtPointer == CR) { + System.out.println("Encountered {CR} character, assuming all lines end with CRLF! - WINDOWS FILE"); + UNIXLinefeeds = false; + } + if (b_byteAtPointer == LF) { + break; + } + position++; + } + + if (UNIXLinefeeds) { + delta = 3; // for reading [current] + [T LF G] for example + } else { + delta = 4; // for reading [current] + [CR LF T G] for example + } + final boolean isUnix = UNIXLinefeeds; + + // reset pos to 0 before reading again + buffer.rewind(); + position = 0; + int p_pointerPos = 0; + + while (position < lastValidDNACharacterPos) { + // if c = #13 and c + 1 <> #10 then raise FuckingLinuxException + + b_byteAtPointer = buffer.get(p_pointerPos); + + switch (b_byteAtPointer) { + // end of line + + case LF: + currentTextLine++; + + break; + + // header line start (>) marks start of new sequence object + case HEADER: // > + // if sequence object was made, end it here at the start of a new header + if (currentSequence != null) { + currentSequence.EndPos = position; // TODO: 6-4-2020 make private? use setter? + currentSequence.RealSize = charCounter + 1; + //currentSequence.getStatistics(); + } + // build the string of the new header (thanks java for not being nice with string concat) + currHeader = new StringBuilder(); + buffer.position(p_pointerPos); + while (position <= lastValidDNACharacterPos && b_byteAtPointer != LF) { + b_byteAtPointer = buffer.get(); + if (b_byteAtPointer != CR) { + currHeader.append((char) b_byteAtPointer); + } + p_pointerPos++; + position++; + + } //end while headerbuilder + + currentTextLine++; + currentSequence = new Sequence(currHeader.toString(), currentTextLine, position); + + currHeader = null; + sequences.add(currentSequence); + charCounter = 0; + continue; // do not increment position but continue + + + // check orf start + case A: + assert currentSequence != null : "NO FUCKING DNA"; + + // put byes 0,1,2 of buffer.getInt into currentCodon + // (read 4 bytes from here but only use first 3 ) + currentCodonLong = buffer.getInt(p_pointerPos) & MASK_3; + + + if (currentCodonLong == ATG) { + currentSequence.addNewORF(position, charCounter, charCounter % 3); + + } else { + // if 0,1,3 bytes wasn't enough, check 5 bytes briefly too + currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); + + if (currentCodonLong == ATG) { + currentSequence.addNewORF(position, charCounter, charCounter % 3); + } + } + + break; + + // check if orf ends + case T: + assert currentSequence != null : "NO FUCKING DNA"; + + currentCodonLong = buffer.getInt(position) & MASK_3; + + if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { + currentSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3); + + } else { + currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); + if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { + currentSequence.updateORFs(position + delta, charCounter + delta, charCounter % 3); + + } + } + + break; + + } // end switch (b_byteAtPointer) + + if (b_byteAtPointer >= 40) { + charCounter++; // count chars valued higher than A, assume in {A,T,C,G,N} + } + p_pointerPos++; + position++; + + } // end while loop that reads over file + + // round up the last sequence made (if any were made) + if (currentSequence != null) { + if (currentSequence.EndPos == 0) { + currentSequence.EndPos = lastValidDNACharacterPos; + currentSequence.RealSize = charCounter + 1; + } + } + //currentSequence.getStatistics(); + + + // Print logged time + logTime(startTime, 4); + + + } + + public void printStats() { + for (Sequence seq : sequences) { + seq.getStatistics(); + } + } + + private static long compress(long i, boolean isUnix) { + if (isUnix) { + return compressUnix(i); + } else { + return compressWindows(i); + } + } + + private static long compressWindows(long i) { + if (MaskFactory.GetByte_1(i) == LF) { + return CRLFCompress1(i); + } else if (MaskFactory.GetByte_2(i) == LF) { + return CRLFCompress2(i); + } else { + return 0; + } + } + + @Contract(pure = true) + private static long CRLFCompress1(long i) { + return (i & 0xFF) | ((i & 0xFFFF000000L) >> 16); + } + + @Contract(pure = true) + private static long CRLFCompress2(long i) { + // compress from a + b + CR + LF + c + return (i & 0xFFFF) | ((i & 0xFF00000000L) >> 16); + + } + + private static long compressUnix(long i) { + if (MaskFactory.GetByte_1(i) == LF) { + return LFCompress1(i); + } else if (MaskFactory.GetByte_2(i) == LF) { + return LFCompress2(i); + } else { + return 0; + } + } + + @Contract(pure = true) + private static long LFCompress1(long i) { + return (i & 0xFF) | ((i & 0xFFFF0000) >> 8); + } + + @Contract(pure = true) + private static long LFCompress2(long i) { + return (i & 0xFF) | ((i & 0xFF000000) >> 8); + } + + + + public void getallOrfs() { + long startTime = System.nanoTime(); + + System.out.println("getting all ORFS..."); + String orfString; + int orfsFound = 0; + for (Sequence seq : sequences + ) { + for (ORF orf : seq + ) { + orfString = getOrf(orf); + orfsFound++; + } + } + logTime(startTime, 4); + System.out.println("got " + orfsFound + " orf Strings"); + } + + + public String getOrf(ORF orf) { + + int c; + StringBuilder dna = new StringBuilder(); + + int endpos = (int) orf.getEndpos(); + if (endpos + 1 < mainBuffer.capacity()) { + for (int i = orf.getOffset(); i < endpos; i++) { + // todo change endpos in ORF + c = mainBuffer.get(i); + if (c >= A) { // skip whitechars + dna.append((char) c); + } + + } + return dna.toString(); + } + // todo exception + System.out.println("dna impossible length"); + System.out.println("buffer cap: " +mainBuffer.capacity()); + System.out.println("endpos: " +endpos); + return ""; + + } + + public List getInfoForVisualisation() { + + List num = new ArrayList<>(); + for (Sequence sequence : sequences) { + int length = (int) sequence.RealSize; + num.add(length); + } + return num; + } + + + + + private void logTime(long startTime, int verbose) { + long endTime = System.nanoTime(); + long duration = (endTime - startTime); + switch (verbose) { + case 5: // nanoseconds only + System.out.println("Duration : " + duration + " nanoSeconds"); + break; + case 4: + BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); + System.out.println("Duration : " + planckSeconds + " planckSeconds"); + case 3: + System.out.println("Duration : " + duration + " nanoSeconds"); + case 2: + long mseconds = duration / 1000000; + System.out.println("Duration : " + mseconds + " milliSeconds"); + case 1: + long seconds = duration / 1000000000; + System.out.println("Duration : " + seconds + " seconds"); + case 0: + default: + break; + } + + } + + private void logPlanckTime(double startTime) { + long endTime = System.nanoTime(); + double duration = (endTime - startTime); + BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); + System.out.println("THAT ONLY TOOK " + planckSeconds.toPlainString() + " planckSeconds!"); + } + + private void printConstants() { + StringBuilder constants = new StringBuilder(); + constants.append("A=").append(A); + constants.append("\nT=").append(T); + constants.append("\nC=").append(C); + constants.append("\nG=").append(G); + constants.append("\nATG=").append(ATG); + constants.append("\nTAG=").append(TAG); + constants.append("\nTAA=").append(TAA); + constants.append("\nTGA=").append(TGA); + constants.append("\nCRLF_CHECK_1=").append(CRLF_CHECK_1); + constants.append("\nCRLF_CHECK_2=").append(CRLF_CHECK_2); + constants.append("\nCRLF_CHECK_1BINARY=").append(Long.toBinaryString(CRLF_CHECK_1)); + constants.append("\nCRLF_CHECK_2BINARY=").append(Long.toBinaryString(CRLF_CHECK_2)); + constants.append("\nMASK_3=").append(MASK_3); + constants.append("\nMASK_5=").append(MASK_5); + constants.append("\nMASK_3BINARY=").append(Long.toBinaryString(MASK_3)); + constants.append("\nMASK_5BINARY=").append(Long.toBinaryString(MASK_5)); + + System.out.println(constants.toString()); + + } +} + + + + + + +// raise Exception.Create('hell') || Exception.Create('LITTLE_ENDIAN'); \ No newline at end of file diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java new file mode 100644 index 0000000..7f0a1d3 --- /dev/null +++ b/src/main/java/orffinder/Sequence.java @@ -0,0 +1,119 @@ +package orffinder; + +import java.util.ArrayList; +import java.util.Iterator; + +public class Sequence implements Iterable { + + final String header; + final int SequenceID; + private static int IDIncrement = 0; + final long lineNumber; + final long offset; // in file + public long EndPos; + public long RealSize; + + private ArrayList ORFList = new ArrayList(); + private ArrayList[] ORFTrackers = new ArrayList[3]; +//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work + + public Sequence(String currHeader, int currentTextLine, int position) { + SequenceID = IDIncrement++; + header = currHeader; + lineNumber = currentTextLine; + offset = position; // in file + ORFTrackers[0]= new ArrayList(); + ORFTrackers[1]= new ArrayList(); + ORFTrackers[2]= new ArrayList(); + } + + public void addNewORF(long position, long charCounter, int modulo) { + //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist + + ORFTrackers[modulo].add(new ORF(position, charCounter)); + } + + public void updateORFs(long endPos, long charCounter, int modulo) { + //ArrayList tracker = ORFTrackers.get(modulo); // for nested arraylist + assert (modulo >= 0 && modulo <= 2) : "MODULO CANT BE < 0 or > 2"; + ArrayList tracker = ORFTrackers[modulo]; + if (tracker.size() > 0) { + for ( ORF orf : tracker ) { + orf.endpos = endPos; + orf.counterEnd = charCounter; + + } + ORFList.addAll(tracker); + tracker.clear(); + } + } + + public long getRealSize() { + return RealSize; + } + + @Override + public Iterator iterator() { + return ORFList.iterator(); + } + + public String getStatistics() { + long totalOrfLength = 0; + long averageOrfLength = 0; + long shortestOrfLength= 0; + long longestOrfLength= 0; + int completedOrfCount = 0; + int incompleteOrfCount = 0; + + long size; + + for (ArrayList tracker : ORFTrackers) { + incompleteOrfCount += tracker.size(); + } + + for (ORF orf: ORFList ) { + completedOrfCount++; + size = orf.getSize(); + totalOrfLength += size; + + if (orf.getEndpos() != 0 && size < shortestOrfLength) { + shortestOrfLength = size; + } + if (size > longestOrfLength) { + longestOrfLength = size; + } + } + averageOrfLength = totalOrfLength / completedOrfCount; + + StringBuilder statistics = new StringBuilder("DNA header="); + statistics.append(header); + statistics.append("{ID=").append(SequenceID); + statistics.append(" StartPos=").append(offset); + statistics.append(" EndPos=").append(EndPos); + statistics.append(" CalculatedSize=").append(EndPos - offset); + statistics.append(" RealSize=").append(RealSize); + + + for (int i = 0; i < 10; i++) { + ORF o = ORFList.get(i); + statistics.append("\n\torf startpos=").append(o.getOffset()); + statistics.append(" endpos=").append(o.endpos); + statistics.append(" RealSize=").append(o.getSize()); + statistics.append(" StartCounter=").append(o.getCounterStart()); + statistics.append(" EndCounter=").append(o.counterEnd); + } + + statistics.append(" totalOrfLength=").append(totalOrfLength); + statistics.append(" averageOrfLength=").append(averageOrfLength); + statistics.append(" longestOrfLength=").append(longestOrfLength); + statistics.append(" shortestOrfLength=").append(shortestOrfLength); + statistics.append(" incompleteOrfCount=").append(incompleteOrfCount); + statistics.append(" completedOrfCount=").append(completedOrfCount); + statistics.append("}"); + + System.out.println(statistics.toString()); + return statistics.toString(); + + } +} + diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java new file mode 100644 index 0000000..31e3cc5 --- /dev/null +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -0,0 +1,288 @@ +package orfgui; +import helpers.Reader; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.util.List; + +public class ORFVisualiser extends JFrame { + private JFrame mainFrame; + private JLabel headerLabel; + private JLabel statusLabel; + private JPanel controlPanel; + private JScrollPane displayfile; + private JTextField pathToFile; + private JTextArea textofFile; + private JLabel jLabelEmptyHolderImage; + Color black= new Color(43, 43, 43); + Color lighter_black= new Color(60, 63, 65); + Color DarkBlue= new Color(47, 79, 79); + Color Blue= new Color( 30,200,255); + Image img = Toolkit.getDefaultToolkit().getImage("DNA-512.png"); + + public ORFVisualiser() { + + + new SplashScreenDemo(); + prepareGUI(); + HolderImage(); + showFile(); + showMenuDemo(); + + } + + public static void main(String[] args) { + + ORFVisualiser swingMenuDemo = new ORFVisualiser(); + + + + + } + private void setLookAndFeel() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } + private void prepareGUI() { + setLookAndFeel(); + mainFrame = new JFrame("orfgui"); + mainFrame.setSize(1000, 1000); + mainFrame.setLayout(null); + mainFrame.getContentPane().setBackground(black); + mainFrame.setIconImage(img); + headerLabel = new JLabel("", JLabel.CENTER); + statusLabel = new JLabel("", JLabel.CENTER); + statusLabel.setSize(350, 100); + + mainFrame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent windowEvent) { + System.exit(0); + } + }); + controlPanel = new JPanel(); + controlPanel.setBounds(1, 1, 950, 930); + controlPanel.setLayout(new BorderLayout(10,10)); + controlPanel.setBackground(black); + //mainFrame.add(headerLabel); + mainFrame.add(controlPanel); + //mainFrame.add(statusLabel); + controlPanel.setVisible(true); + mainFrame.setVisible(true); + } + + private void showFile() { + // creation of file display with scrolling bar + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); + Font text = new Font("arial",Font.PLAIN,12); + textofFile = new JTextArea(200, 100); + textofFile.setBackground(lighter_black); + textofFile.setForeground(Color.white); + textofFile.setFont(text); + + displayfile = new JScrollPane(textofFile); + pathToFile = new JTextField("Path/of/File"); + pathToFile.setBackground(Blue); + pathToFile.setForeground(Color.white); + pathToFile.setEditable(false); + pathToFile.setFont(titel); + pathToFile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //pathToFile.setBounds(5, 5, 970, 25); + pathToFile.setPreferredSize(new Dimension(970,25)); + //displayfile.setBounds(5, 30, 970, 200); + + textofFile.setPreferredSize(new Dimension(940,100)); + + displayfile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //displayfile.setBorder(blackline); + displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + displayfile.setPreferredSize(new Dimension(940,100)); + + textofFile.setText("Display of file content"); + + controlPanel.add(pathToFile, BorderLayout.NORTH); + controlPanel.add(displayfile,BorderLayout.CENTER); + } + + private void ORFvisualisatie(){ + Border blackline = BorderFactory.createLineBorder(Blue); + JPanel visScreen = new VisualisatiePane(); + visScreen.setBackground(lighter_black); + //visScreen.setBounds(5,240,970,685); + List list = Reader.getLengths(); + System.out.println("got lengths" + list.size()); + int largest = 0; + for (int length : list) { + if (length > largest) { + largest = length; + System.out.println(largest); + } + } + visScreen.setPreferredSize(new Dimension(largest,685)); + JScrollPane displayORF = new JScrollPane(visScreen); + displayORF.setBorder(blackline); + //displayORF.setBounds(5,240,970,685); + displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + controlPanel.add(displayORF,BorderLayout.SOUTH); + + // TODO: 31-3-2020 make visualisation + } + private void showMenuDemo() { + //create a menu bar + final JMenuBar menuBar = new JMenuBar(); + //create menus + JMenu fileMenu = new JMenu("File"); + JMenu editMenu = new JMenu("Blast"); + JMenu databaseMenu = new JMenu("Database"); + final JMenu linkMenu = new JMenu("if anything else"); + + //create menu items + JMenuItem New = new JMenuItem("New ORF search"); + New.setMnemonic(KeyEvent.VK_N); + New.setActionCommand("New"); + + JMenuItem Export = new JMenuItem("Export"); + Export.setActionCommand("Export"); + + JMenuItem Exit = new JMenuItem("Exit"); + Exit.setActionCommand("Exit"); + + JMenuItem selectBlastn = new JMenuItem("BLASTn"); + selectBlastn.setActionCommand("BLASTn"); + + JMenuItem selectBlastt = new JMenuItem("BLASTx"); + selectBlastt.setActionCommand("BLASTx"); + + JMenuItem selectTBlastX = new JMenuItem("tBLASTx"); + selectTBlastX.setActionCommand("tBLASTx"); + + JMenuItem Upload = new JMenuItem("Upload"); + Upload.setActionCommand("Upload"); + + JMenuItem Download = new JMenuItem("Download"); + Download.setActionCommand("Download"); + + MenuItemListener menuItemListener = new MenuItemListener(); + + + New.addActionListener(menuItemListener); + Export.addActionListener(menuItemListener); + Exit.addActionListener(menuItemListener); + selectBlastn.addActionListener(menuItemListener); + selectBlastt.addActionListener(menuItemListener); + selectTBlastX.addActionListener(menuItemListener); + Upload.addActionListener(menuItemListener); + Download.addActionListener(menuItemListener); + + final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Hide file", false); + showWindowMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showWindowMenu.getState()) { + controlPanel.remove(displayfile); + mainFrame.repaint(); + } else { + controlPanel.add(displayfile); + mainFrame.repaint(); + + } + } + }); + final JCheckBoxMenuItem showLinksMenu = new JCheckBoxMenuItem( + "Show Translation", true); + showLinksMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showLinksMenu.getState()) { + menuBar.remove(linkMenu); + mainFrame.repaint(); + } else { + menuBar.add(linkMenu); + mainFrame.repaint(); + } + } + }); + //add menu items to menus + fileMenu.add(New); + fileMenu.add(Export); + fileMenu.addSeparator(); + fileMenu.add(showWindowMenu); + fileMenu.addSeparator(); + fileMenu.add(showLinksMenu); + fileMenu.addSeparator(); + fileMenu.add(Exit); + + editMenu.add(selectBlastn); + editMenu.add(selectBlastt); + editMenu.add(selectTBlastX); + + databaseMenu.add(Upload); + databaseMenu.add(Download); + //add menu to menubar + menuBar.add(fileMenu); + menuBar.add(editMenu); + menuBar.add(databaseMenu); + + //add menubar to the frame + mainFrame.setJMenuBar(menuBar); + mainFrame.setVisible(true); + } + + private void HolderImage(){ + ImageIcon image = new ImageIcon("hatebed.gif"); + jLabelEmptyHolderImage =new JLabel("",image,JLabel.CENTER); + controlPanel.add(jLabelEmptyHolderImage,BorderLayout.SOUTH); + } + private void FileDisplayer(File file) throws IOException { + + BufferedReader input = new BufferedReader( + new InputStreamReader( + new FileInputStream( + file))); + textofFile.read(input, "READING FILE :)"); + } + + class MenuItemListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) + + String actionEventName = e.getActionCommand(); + switch (actionEventName) { + + case "New": + File file = Reader.FileChooser(); + pathToFile.setText(String.valueOf(file)); +// try { // todo disabled due to memory issues +// FileDisplayer(file); +// } catch (IOException ex) { +// ex.printStackTrace(); +// } + ORFvisualisatie(); + controlPanel.repaint(); + controlPanel.remove(jLabelEmptyHolderImage); + controlPanel.validate(); + + case "Export": + case "BLASTn": + case "BLASTx": + case "tBLASTx": + case "Exit": + case "Upload": + case "download": + default: + break; + } + System.out.println("you pressed " + actionEventName); + statusLabel.setText(e.getActionCommand() + " JMenuItem clicked."); + + } + } +} diff --git a/src/main/java/orfgui/SplashScreenDemo.java b/src/main/java/orfgui/SplashScreenDemo.java new file mode 100644 index 0000000..e713522 --- /dev/null +++ b/src/main/java/orfgui/SplashScreenDemo.java @@ -0,0 +1,80 @@ +package orfgui; + +import javax.swing.*; +import java.awt.*; + +public class SplashScreenDemo { + JFrame frame; + JLabel image=new JLabel(new ImageIcon("genes.gif")); + JLabel text=new JLabel("orffinder"); + JProgressBar progressBar=new JProgressBar(); + JLabel message=new JLabel(); + SplashScreenDemo() + { + createGUI(); + addImage(); + addText(); + addProgressBar(); + addMessage(); + runningPBar(); + } + public void createGUI(){ + frame=new JFrame(); + frame.getContentPane().setLayout(null); + frame.setUndecorated(true); + frame.setSize(600,400); + frame.setLocationRelativeTo(null); + Color x= new Color( 30,200,255); + frame.getContentPane().setBackground(x); + frame.setVisible(true); + + } + public void addImage(){ + image.setSize(600,200); + frame.add(image); + } + public void addText() + { + text.setFont(new Font("arial",Font.BOLD,30)); + text.setBounds(220,220,600,40); + text.setForeground(Color.white); + frame.add(text); + } + public void addMessage() + { + message.setBounds(250,320,200,40); + message.setForeground(Color.white); + message.setFont(new Font("arial",Font.BOLD,15)); + frame.add(message); + } + public void addProgressBar(){ + progressBar.setBounds(100,280,400,30); + progressBar.setBorderPainted(true); + progressBar.setStringPainted(true); + Color x= new Color(47, 79, 79); + progressBar.setBackground(Color.WHITE); + progressBar.setForeground(x); + progressBar.setValue(0); + frame.add(progressBar); + } + public void runningPBar(){ + int i=0; + + while( i<=100) + { + try{ + // Thread.sleep(50); // todo dingen laden + progressBar.setValue(i); + message.setText("LOADING "+Integer.toString(i)+"%"); + i++; + if(i==100) + frame.dispose(); + }catch(Exception e){ + e.printStackTrace(); + } + + + + } + } +} diff --git a/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java new file mode 100644 index 0000000..1772e8b --- /dev/null +++ b/src/main/java/orfgui/VisualisatiePane.java @@ -0,0 +1,34 @@ +package orfgui; +import helpers.Reader; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +public class VisualisatiePane extends JPanel { + + @Override + protected void paintComponent(Graphics g) { + int firstline = 10; + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g; + g2.setColor(Color.WHITE); + g2.setStroke(new BasicStroke(2)); + List list = Reader.getLengths(); // todo solution + for (Integer l: list){ + firstline = firstline + 30; + g.drawLine(10,10 + firstline,l-10,10 + firstline); + } + } + + //public static void createAndShowGui() { + // JFrame frame = new JFrame(); + // frame.add(new VisualisatiePane()); + // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // frame.setLocationByPlatform(true); + // frame.pack(); + // frame.setVisible(true); + + //} + +} \ No newline at end of file diff --git a/src/main/resources/DNA-512.png b/src/main/resources/DNA-512.png new file mode 100644 index 0000000000000000000000000000000000000000..807568758ddf51aa8c31e6ef86ee26d5859fbd77 GIT binary patch literal 32943 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/genes.gif b/src/main/resources/genes.gif new file mode 100644 index 0000000000000000000000000000000000000000..e48a847c1f40d936e68b61dcd9dc40b686846b60 GIT binary patch literal 76599 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

m@H&|g?1YiCnf3Wsa&g2V-HGhR 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%0AYS_=%cw7zGV`ye)xTJ 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 P+|OcE Date: Tue, 7 Apr 2020 23:33:32 +0200 Subject: [PATCH 08/43] add tests --- src/test/java/GUITests/TestORFVis.java | 10 +++ .../java/ORFFinderTests/TestORFFinder.java | 21 +++++ .../resources/data/Glennie the platypus.fa | 80 +++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 src/test/java/GUITests/TestORFVis.java create mode 100644 src/test/java/ORFFinderTests/TestORFFinder.java create mode 100644 src/test/resources/data/Glennie the platypus.fa diff --git a/src/test/java/GUITests/TestORFVis.java b/src/test/java/GUITests/TestORFVis.java new file mode 100644 index 0000000..9fcb9f4 --- /dev/null +++ b/src/test/java/GUITests/TestORFVis.java @@ -0,0 +1,10 @@ +package GUITests; + +import orfgui.ORFVisualiser; + +public class TestORFVis { + + public static void main(String[] args) { + new ORFVisualiser(); + } +} diff --git a/src/test/java/ORFFinderTests/TestORFFinder.java b/src/test/java/ORFFinderTests/TestORFFinder.java new file mode 100644 index 0000000..22b3475 --- /dev/null +++ b/src/test/java/ORFFinderTests/TestORFFinder.java @@ -0,0 +1,21 @@ +package ORFFinderTests; + +import orffinder.ORFFinder; + +import java.io.File; +import java.io.IOException; + +public class TestORFFinder { + + public static void main(String[] args) { + try { + File testfile = new File("D:\\GitHub\\Course7Informatica\\src\\test\\resources\\data\\DNA.txt"); + ORFFinder orfFinder = new ORFFinder(testfile); + orfFinder.findOrfs();// + orfFinder.printStats(); + orfFinder.getallOrfs(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/resources/data/Glennie the platypus.fa b/src/test/resources/data/Glennie the platypus.fa new file mode 100644 index 0000000..2fe00fd --- /dev/null +++ b/src/test/resources/data/Glennie the platypus.fa @@ -0,0 +1,80 @@ +>DS218343.1 Ornithorhynchus anatinus Scfld51825 genomic scaffold, whole genome shotgun sequence +CCCTTGGGAGACCTTTTCCCACTTACTTCTACCAGTTCACGACTATGGGGAGGGAGGAGTTCAAGCAGAG +GCCTACCCATTTCCATTCCTAGCTTGGCTAGTGGCTAGCAAGTGGAAGGCAATCTGTTACAAGTCCCAAA +CTCAGCTGTGCTGGGCAGAGCGGCACGGGAGAGAGTCAGGGCGGAGGCTCGAGTTTACTGCGCGGAAGGC +AGCGACGGTAAACCACTTCCATATTTTGACCAAGAAAACTCTATTCACTACTGGAACGATTGCAGATGGA +GAGCGGGGCGTACTGAGAGAGATGTGTCTGTGGTGTCGCTGTGGGTCAGAAATGACGGCGTAAGGCAAGA +AAGTGAGAACAGTGGGTGGGGAGGAAGCCAGCTAGGGGAGAGCCTTGAAATCGATGGTTAAGAGTTTTAG +TTAATGTGACTGGTGATGGGAACCAACTCTGTGGACTTTTCAGGAGCAGGGTGATGTGAACAGAATTGTG +CTCAAGTTGCTCCGTGTTTATGAGCGTATAGGACTACCCCAGGGAGAGGCTGGGGGCCAGAGAGACTGGA +CTAGCAAGGAGATTCATTCAGTAGTACTTATTGAGCGCTTACTATGTGCAGAGCACTGTTCTGATGAATA +CAATAATATGGGTGGAGCATAAAGGTTTAGGTTAGGATAGTGTTGTCCTCTCCCAACCGCCTAATACAGT +GTTCTGCACATAGTAAACACTCAATAAATACCATCGGTAACCTTTGAGGAAGAATTGGCAGGATTTTAGA +ACAGTTCGGATGTGGGAGGTCAAAGAGACTTGAGTTCCAAGATGAGTCCGAGGTTGCTGTTATTTGGGGC +ACAGAGGGGAGTCAACCGTGATTGAAAGGTATTGTAGAAAAGAATTTAAGGAATTCTGTTTTTGACTCAA +GTCTGAGATTATGGATGTGTAATAATTCAAGTGGAAATCCCAGAGACTGGAAGAGACAAGGCTAGACATA +TAGATTTGTTGAGGGGGAAATGGGAAAATAGGATGGGGACACGTGATTAATCAAGGAAGACCCTCTGGAG +GAGATGTAATTTCAGAAGGGCTTTGAAGATGGAGAGCAGTGGTCTGCTGGATATGAAGAGAGGAGAGTGC +AGAGAGGAAGAGGAGGTATGAGAAAAAGGGAAAAATGTAGGCAGGAGGAGAAATGAGAACAAAGCCGTCG +GATTGGCTTGTACTTTCCCAAGTGCCTAGTACAGCCCTCTACCTATAGGGGCCCAACAATTGCTTTTGAC +TGTCTGATGGAGCAGACAATCCTACCGGTGCTTAGCAAATCTAGGTGCAGAAAGCGGAGAGATTAGATAT +CACCCAAACAAAAATGAGCAGTCCAAGAGATAAACCAAAGAGTTGCTAATTGCGTAGCCTGAGAATTTTC +ACCCATTCCTGAACTAAGATAACTGGGCTCCAGTTATCTCTATTCAGTTTGTTCATCTCTTGTGTGTGTG +TTTCCCCAGTAAAGTGCCCATTTGAAGAGCAGATCCTTGAGGACATTTGCGGAATATTGTCTCTGCCGTG +GATTTGCAACCACTCTGATGAGGATTCTTATAAATTAACCCCATTTGGCACTAGTCTTTTGGCTGTGAGT +CAGAGGATTTCAGATTGTTTTTGTAAGTATGCTTACGTAGTTCAAGCCTTCTCTCTGTGTTGTAGTTTAA +TGATTTAAAAGTCTAATTTGGGGAGAGTGACCGTATTAGAACTCTACCGTTTTAAAACACTTGTTGATTT +TTTTTTTACCACTGCGTCTCGTAGTGGTACGGGAAATCTGTTCAATCGTTTTCTTCTTTTCAGCCCCACA +GGTTCAGGCTCAATGTGTATTTCTTCTGACTCTGCTCCCCAAAAACATATTCCTTGAGTGGAGAACAGCA +GTGTTCTATTGGGCACTGCAAAGTTCTCATGAAATTATCCGGGCCAGTTGTGTTAAAGCGTTTCCTCTCA +TGCTACATCAACAGATTACAGACTCTTGCAAAGTTCCCAAGAAGTTCATGTATGTATGTGAGGTGCTTTT +ATTTAATCGGGTTCAAACTGTCATTCGTTCAGTTGTATTTATGGAGTGCTTACTGTGTGCAGAGCACTGT +ACTAAGCTATTGAGAAAGTACAGTATGGTAATAAACAGGGACATTCCCTGCCCACCGTGAGCTTACGGTC +TAGAGGGGGAGTTTACAGTAATAGGAATAGTTTTTATTAAATACCTGCTCTGCAAAACACTGTACTAATC +ATAACTGGGTGAGAATGAGAATTAGAGGAGTTTTTTTTATAGTATTTAAGCGCTTACAATGTGCAAGCTA +ATCAAATTGGACACGGTCCATGCCCCACATGGGGCTCACAGTCTTAATCCCCATTTTACAGGTGAGGTGA +TGGAAGCACAGAGAAGTTAAGTGACTTGTCCGAGCTCACGCAGCAGGCAAGTGGAAGAGCCGGGATTAGA +ACCCCCCCAGTGGACTCTCTGTTTTAGAAGTAGGGGGAAAGGAGGCTGGCACCAGATAACGTGAGAAGAG +AAGAAACAATAAGACACATAAACAGGAAAGATAAAGACATAGATAAATGCAGAAGAAAATACAGAAAAGG +CAATAGAGCATTAATTCATTCATTCAATAGTACTTATTGAGCGCTTACTATGTTCAGAGCACTGTACTAA +GCGCTTGGCATGTTCAAATCGGTAACAGATAGAGACAGTCCCTGCCCTTTGATGGGCTTACAGTCTAATC +GGGACTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNATGGAACTGGTGGTTTCTTCTGTAAAAAT +CTCACAGCTACTCTCATGAGCACACATGTTCTCTACTGCAAGCCTCTGTTTTCAAGCCTTTCCTTTTCTC +TAAAAAGAAAGGTGCCCAGCGCAGTAAAATTAGGTAAATGACTTGTTTTCAAGTTAATTTGTATTGTAAT +AAAGTTGTGGTGGAAAAAAGATCCCTTTATTTGTCTTGCAAAATTAGCATTTACTGGAAAAAATATCTCC +AGAGAAGTAATAATTCTAATAAAAATGGATTGGATGGCCTTTATGGTCTCTGCCTGCAGGGTGATCTCAG +ACAACTCTTCTAATTTATCTGTGCCTCAGCTTCCTCATCTGTAAAAATGGAAATTTGATACTTAGATTGT +AAGCCTTACGCGGGAGAGAGACTGTGTCCTACCTGATCATCTTCTGCCTACCGTAGCGCTTGGTACAATG +CATGATACATAGGAAGTGCTCAAGAAATATCATTATCATCATTATTATTACTATGTAATGGAAAGAGCAT +TGGACTGTAAAGTTTTTATCTTAACTCTTCCAGATGTGTGTGACCTTGGGCAATTTTGATTCTATATTGC +TGAGAAAAAATCTCCAGATTCTGTAACTATTATCTGGACGTGACACTTTCTGAATTCAAATCAGTGGATA +CTGAAGCCCAGGTTCCTTAAGATACCCAGTGCGTGGAGGAACTCTAGTTGCTGGCTTTACTTAGGTTTAT +TTCAGTAAATCCTCCTAATCCATAGAATAATTTTTATCTGCCTGTCTGGATTTTTCTGCCTGGAGGGATG +ACAATATTAAGAAGCTCTTTGTCTGGTTTAAGGGTCTCAATTCTTGGTTGTTTGTAAGCCAGTGTTGTCA +GCGTATTTCCCATGGGAGCTGCTTTCCAACACACTCCCGTGTCCGTAGGTACAGTGTGGTATCGATCTAT +TGATTAACTTGCAAATGTAGGCTAACTTGGATTTTCCGTATGTATTTTAACATCATTTTGCATTTTTGAT +GTGGGAATCTTCGTGTTCAAAAAAGAAGCCACCGATGGTGACATTTCCCTTACGAGTGCATGTGTGACTG +AAAAGAGGAAGGCAGGGAAGTCCTGGCCATGTATTGCATACAAAAAGCCTGTCCCTTTCTTTCATTCATT +CAGTTTTTATTGAGTTCTGTGTGCAGAACACTGTACTAGAGAAGCAGCGTGGCTCAGTGGAAAGAGCCCG +GCTGGGGAGTCAGGGGTCATGAGTTCGAATCCAAGCTCTGCCCCTTGTCAGCTGTGTGACTGTGGGCGAG +TCACTTCACTTCTCTGTGCCTCAGTTCCCTCATCTGTAAAATGGAAATTAACTGTGAGCCTCACGTGGGA +CAACCTGATGACCCTGTATCTACCCCAGCACTTAGAACAGTGCTCTGCACATAGTAAGCGCTTAACAAAT +ACCAACATTATTATTATTATCACTAAGCACTTGGGAGAGTACAAGGAGAGAGCAAGGTGTTGTGGATAGA +GCATGGGCCTGGGAGTCACAAGGTCATGGGTTTTAAAATCCCAGCTCCTCCACTTGTCTGCTGTGTGACC +TTGGGCAAGTCACTTCAATGTCACTTCACTTCTGGTGCCCTCAGTTAACTCATCTGTAAAATGGGGATTC +ACTCAATCGTATTTATTGAGCGCTTACTGTGTGGAGAGCACTGTACTAAGCACTTGGAAAGTATAGTTTG +ACAACAGATAGAGACAATCCCTACCCAACACCGGGCGCACAGTCTAGAAGGGGGAGACAGACAACAAAAC +ACAACAAGTAGACAGGCAT + From 02f48c41480abda9712f82dfee0a8685833dc217 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Tue, 7 Apr 2020 23:33:23 +0200 Subject: [PATCH 09/43] Revert "merge ORFFinder with ORFvis & Maven structure (part 1) " This reverts commit bba402b6df26690369a47a989947155afe6c3e40. --- src/main/java/helpers/MaskFactory.java | 19 - src/main/java/helpers/Reader.java | 49 --- src/main/java/main/Controller.java | 8 - src/main/java/main/Settings.java | 5 - src/main/java/orffinder/ORF.java | 34 -- src/main/java/orffinder/ORFFinder.java | 422 --------------------- src/main/java/orffinder/Sequence.java | 119 ------ src/main/java/orfgui/ORFVisualiser.java | 288 -------------- src/main/java/orfgui/SplashScreenDemo.java | 80 ---- src/main/java/orfgui/VisualisatiePane.java | 34 -- src/main/resources/DNA-512.png | Bin 32943 -> 0 bytes src/main/resources/genes.gif | Bin 76599 -> 0 bytes src/main/resources/hatebed.gif | Bin 81669 -> 0 bytes 13 files changed, 1058 deletions(-) delete mode 100644 src/main/java/helpers/MaskFactory.java delete mode 100644 src/main/java/helpers/Reader.java delete mode 100644 src/main/java/main/Controller.java delete mode 100644 src/main/java/main/Settings.java delete mode 100644 src/main/java/orffinder/ORF.java delete mode 100644 src/main/java/orffinder/ORFFinder.java delete mode 100644 src/main/java/orffinder/Sequence.java delete mode 100644 src/main/java/orfgui/ORFVisualiser.java delete mode 100644 src/main/java/orfgui/SplashScreenDemo.java delete mode 100644 src/main/java/orfgui/VisualisatiePane.java delete mode 100644 src/main/resources/DNA-512.png delete mode 100644 src/main/resources/genes.gif delete mode 100644 src/main/resources/hatebed.gif diff --git a/src/main/java/helpers/MaskFactory.java b/src/main/java/helpers/MaskFactory.java deleted file mode 100644 index e6c19fb..0000000 --- a/src/main/java/helpers/MaskFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package helpers; -public class MaskFactory -{ - public static byte GetByte_0(long u) - { - return (byte) (u & 0xFF); - } - - public static byte GetByte_1(long u) - { - return (byte) ((u & 0xFF00) >> 8); - } - - public static byte GetByte_2(long u) - { - return (byte) ((u & 0xFF0000) >> 16); - } - -} \ No newline at end of file diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java deleted file mode 100644 index 8857512..0000000 --- a/src/main/java/helpers/Reader.java +++ /dev/null @@ -1,49 +0,0 @@ -package helpers; - -import orffinder.ORFFinder; - -import javax.swing.*; -import java.io.File; -import java.io.IOException; -import java.util.List; - - -public class Reader { - private static File file; - private static ORFFinder orfFinder; - - public static File FileChooser() { - System.out.println("Reader.FileChooser() fired!"); // todo-debugprint - JFileChooser jfc = new JFileChooser("."); - jfc.setDialogTitle("Choose a directory to save your file: "); - jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); - - int returnValue = jfc.showSaveDialog(null); - if (returnValue == JFileChooser.APPROVE_OPTION) { - if (jfc.getSelectedFile().isFile()) { - file = jfc.getSelectedFile(); - } - } - - try { - orfFinder = new ORFFinder(file); - - } catch (IOException e) { - - // todo popup - e.printStackTrace(); - } - - orfFinder.findOrfs(); - - return file; - } - - public static List getLengths() { - int largest = 0; - List listoflengths = orfFinder.getInfoForVisualisation(); - - return listoflengths; - } - -} diff --git a/src/main/java/main/Controller.java b/src/main/java/main/Controller.java deleted file mode 100644 index 9099930..0000000 --- a/src/main/java/main/Controller.java +++ /dev/null @@ -1,8 +0,0 @@ -package main; - -public class Controller { - - public Controller() { - - } -} diff --git a/src/main/java/main/Settings.java b/src/main/java/main/Settings.java deleted file mode 100644 index 9a93757..0000000 --- a/src/main/java/main/Settings.java +++ /dev/null @@ -1,5 +0,0 @@ -public class Settings { - - public static final int MINIMAL_ORF_LENGTH = 0; // used in Sequence to determine whether to keep an ORF or not - -} diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java deleted file mode 100644 index 648648b..0000000 --- a/src/main/java/orffinder/ORF.java +++ /dev/null @@ -1,34 +0,0 @@ -package orffinder; - -public class ORF { - - private long offset; // offset in file - public long endpos; // endpos in file - private long counterStart; // relative counter to dna - public long counterEnd; // relative counter to dna without the fucking linefeeds - -public ORF(long position, long charCounter) { - offset = position; - counterStart = charCounter; -} - - public long getSize() { - return counterEnd-counterStart; - } - - public int getOffset() { - return (int) offset; - } - - public long getCounterStart() { - return counterStart; - } - - public long getEndpos() { - return endpos; - } - -} - - -// raise LITTLE_ENDIAN \ No newline at end of file diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java deleted file mode 100644 index b87dd62..0000000 --- a/src/main/java/orffinder/ORFFinder.java +++ /dev/null @@ -1,422 +0,0 @@ -package orffinder; - - -import helpers.MaskFactory; -import org.jetbrains.annotations.Contract; - -import java.io.*; -import java.math.BigDecimal; -import java.nio.BufferUnderflowException; -import java.nio.ByteOrder; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -// try -Xms512M -Xmx512M in VM options -// add -ea for enable assertions in VM options - -/** - * ORFFinder reads through a textfile (assumed format: nucleotide FASTA) to find ORFS - */ -public class ORFFinder { - - // constants - private static final byte HEADER = 62; // 00 11 11 10 // Header prefix > - private static final byte CR = 13; // 00 00 11 01 // Carriage Return - private static final byte LF = 10; // 00 00 10 10 // Line Feed - private static final byte A = 65; // 01 00 00 01 - private static final byte T = 84; // 01 01 01 00 - private static final byte C = 67; // 01 00 00 11 - private static final byte G = 71; // 01 00 01 11 - private static final byte N = 78; // 01 00 11 10 - private static final long ATG = (A) | (T << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 01 01 00 01 00 00 01 - private static final long TAG = (T) | (A << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 00 00 01 01 01 01 00 - private static final long TAA = (T) | (A << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 00 01 01 01 01 00 - private static final long TGA = (T) | (G << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 01 11 01 01 01 00 - private static final long CRLF_CHECK_1 = (CR << 8) | (LF << 16); // 00 00 00 00 00 00 10 10 00 00 11 01 00 00 00 00 // x + #13 + #10 - private static final long CRLF_CHECK_2 = (CR << 16); // 00 00 00 00 00 00 11 01 00 00 00 00 00 00 00 00 // x + y + #13 - private static final int MASK_3 = 0x00FFFFFF; - private static final long MASK_5 = 0xFFFFFFFFFFL; - - static String filename_RELATIVE_TEMP = "src/test/resources/data/Glennie the platypus.fa"; - private final ArrayList sequences = new ArrayList(100); - private File file; - private RandomAccessFile mainRAFile; - private FileChannel mainFileChannel; - private MappedByteBuffer mainBuffer; - - public static void main(String[] args) { - - } - - public ORFFinder(File file) throws IOException { - file = file; - mainRAFile = new RandomAccessFile(file, "r"); - mainFileChannel = mainRAFile.getChannel(); - // mainBuffer = new RandomAccessFile(file, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); // as oneliner - mainBuffer = mainFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); - mainBuffer.order(ByteOrder.LITTLE_ENDIAN); // SHOOT ME IN THE FOOT (took ~xxxhours to figure out) - - } - - public void setFile(File file) { - this.file = file; - } - - - /** - * Algorithm by Eric Langedijk - * ASCII TABLE (for reference) - * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) - * chars of interest and their ASCII values: (65, A) (84, T) (67, C) (71, G) (62, >) - */ - public void findOrfs() { - findOrfs(String.valueOf(file)); - } - - public void findOrfs(String filename) { - - // TIME LOGGING - long startTime = System.nanoTime(); - - // variables - StringBuilder currHeader; - byte b_byteAtPointer; - long currentCodonLong; - int position; - int charCounter; - int currentTextLine; - - // initialise some - Sequence currentSequence = null; - position = 0; - charCounter = 0; - currentTextLine = 0; - int delta; - - //debug stuff - int orfsCounted = 0; - - - MappedByteBuffer buffer = mainBuffer; - - final long lastValidDNACharacterPos = buffer.capacity() - 8; - - boolean UNIXLinefeeds = true; - // check which type of linefeed the file contains, if it contains CR assume all are CRLF - while (position < lastValidDNACharacterPos) { - b_byteAtPointer = buffer.get(); - if (b_byteAtPointer == CR) { - System.out.println("Encountered {CR} character, assuming all lines end with CRLF! - WINDOWS FILE"); - UNIXLinefeeds = false; - } - if (b_byteAtPointer == LF) { - break; - } - position++; - } - - if (UNIXLinefeeds) { - delta = 3; // for reading [current] + [T LF G] for example - } else { - delta = 4; // for reading [current] + [CR LF T G] for example - } - final boolean isUnix = UNIXLinefeeds; - - // reset pos to 0 before reading again - buffer.rewind(); - position = 0; - int p_pointerPos = 0; - - while (position < lastValidDNACharacterPos) { - // if c = #13 and c + 1 <> #10 then raise FuckingLinuxException - - b_byteAtPointer = buffer.get(p_pointerPos); - - switch (b_byteAtPointer) { - // end of line - - case LF: - currentTextLine++; - - break; - - // header line start (>) marks start of new sequence object - case HEADER: // > - // if sequence object was made, end it here at the start of a new header - if (currentSequence != null) { - currentSequence.EndPos = position; // TODO: 6-4-2020 make private? use setter? - currentSequence.RealSize = charCounter + 1; - //currentSequence.getStatistics(); - } - // build the string of the new header (thanks java for not being nice with string concat) - currHeader = new StringBuilder(); - buffer.position(p_pointerPos); - while (position <= lastValidDNACharacterPos && b_byteAtPointer != LF) { - b_byteAtPointer = buffer.get(); - if (b_byteAtPointer != CR) { - currHeader.append((char) b_byteAtPointer); - } - p_pointerPos++; - position++; - - } //end while headerbuilder - - currentTextLine++; - currentSequence = new Sequence(currHeader.toString(), currentTextLine, position); - - currHeader = null; - sequences.add(currentSequence); - charCounter = 0; - continue; // do not increment position but continue - - - // check orf start - case A: - assert currentSequence != null : "NO FUCKING DNA"; - - // put byes 0,1,2 of buffer.getInt into currentCodon - // (read 4 bytes from here but only use first 3 ) - currentCodonLong = buffer.getInt(p_pointerPos) & MASK_3; - - - if (currentCodonLong == ATG) { - currentSequence.addNewORF(position, charCounter, charCounter % 3); - - } else { - // if 0,1,3 bytes wasn't enough, check 5 bytes briefly too - currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); - - if (currentCodonLong == ATG) { - currentSequence.addNewORF(position, charCounter, charCounter % 3); - } - } - - break; - - // check if orf ends - case T: - assert currentSequence != null : "NO FUCKING DNA"; - - currentCodonLong = buffer.getInt(position) & MASK_3; - - if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { - currentSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3); - - } else { - currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); - if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { - currentSequence.updateORFs(position + delta, charCounter + delta, charCounter % 3); - - } - } - - break; - - } // end switch (b_byteAtPointer) - - if (b_byteAtPointer >= 40) { - charCounter++; // count chars valued higher than A, assume in {A,T,C,G,N} - } - p_pointerPos++; - position++; - - } // end while loop that reads over file - - // round up the last sequence made (if any were made) - if (currentSequence != null) { - if (currentSequence.EndPos == 0) { - currentSequence.EndPos = lastValidDNACharacterPos; - currentSequence.RealSize = charCounter + 1; - } - } - //currentSequence.getStatistics(); - - - // Print logged time - logTime(startTime, 4); - - - } - - public void printStats() { - for (Sequence seq : sequences) { - seq.getStatistics(); - } - } - - private static long compress(long i, boolean isUnix) { - if (isUnix) { - return compressUnix(i); - } else { - return compressWindows(i); - } - } - - private static long compressWindows(long i) { - if (MaskFactory.GetByte_1(i) == LF) { - return CRLFCompress1(i); - } else if (MaskFactory.GetByte_2(i) == LF) { - return CRLFCompress2(i); - } else { - return 0; - } - } - - @Contract(pure = true) - private static long CRLFCompress1(long i) { - return (i & 0xFF) | ((i & 0xFFFF000000L) >> 16); - } - - @Contract(pure = true) - private static long CRLFCompress2(long i) { - // compress from a + b + CR + LF + c - return (i & 0xFFFF) | ((i & 0xFF00000000L) >> 16); - - } - - private static long compressUnix(long i) { - if (MaskFactory.GetByte_1(i) == LF) { - return LFCompress1(i); - } else if (MaskFactory.GetByte_2(i) == LF) { - return LFCompress2(i); - } else { - return 0; - } - } - - @Contract(pure = true) - private static long LFCompress1(long i) { - return (i & 0xFF) | ((i & 0xFFFF0000) >> 8); - } - - @Contract(pure = true) - private static long LFCompress2(long i) { - return (i & 0xFF) | ((i & 0xFF000000) >> 8); - } - - - - public void getallOrfs() { - long startTime = System.nanoTime(); - - System.out.println("getting all ORFS..."); - String orfString; - int orfsFound = 0; - for (Sequence seq : sequences - ) { - for (ORF orf : seq - ) { - orfString = getOrf(orf); - orfsFound++; - } - } - logTime(startTime, 4); - System.out.println("got " + orfsFound + " orf Strings"); - } - - - public String getOrf(ORF orf) { - - int c; - StringBuilder dna = new StringBuilder(); - - int endpos = (int) orf.getEndpos(); - if (endpos + 1 < mainBuffer.capacity()) { - for (int i = orf.getOffset(); i < endpos; i++) { - // todo change endpos in ORF - c = mainBuffer.get(i); - if (c >= A) { // skip whitechars - dna.append((char) c); - } - - } - return dna.toString(); - } - // todo exception - System.out.println("dna impossible length"); - System.out.println("buffer cap: " +mainBuffer.capacity()); - System.out.println("endpos: " +endpos); - return ""; - - } - - public List getInfoForVisualisation() { - - List num = new ArrayList<>(); - for (Sequence sequence : sequences) { - int length = (int) sequence.RealSize; - num.add(length); - } - return num; - } - - - - - private void logTime(long startTime, int verbose) { - long endTime = System.nanoTime(); - long duration = (endTime - startTime); - switch (verbose) { - case 5: // nanoseconds only - System.out.println("Duration : " + duration + " nanoSeconds"); - break; - case 4: - BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); - System.out.println("Duration : " + planckSeconds + " planckSeconds"); - case 3: - System.out.println("Duration : " + duration + " nanoSeconds"); - case 2: - long mseconds = duration / 1000000; - System.out.println("Duration : " + mseconds + " milliSeconds"); - case 1: - long seconds = duration / 1000000000; - System.out.println("Duration : " + seconds + " seconds"); - case 0: - default: - break; - } - - } - - private void logPlanckTime(double startTime) { - long endTime = System.nanoTime(); - double duration = (endTime - startTime); - BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); - System.out.println("THAT ONLY TOOK " + planckSeconds.toPlainString() + " planckSeconds!"); - } - - private void printConstants() { - StringBuilder constants = new StringBuilder(); - constants.append("A=").append(A); - constants.append("\nT=").append(T); - constants.append("\nC=").append(C); - constants.append("\nG=").append(G); - constants.append("\nATG=").append(ATG); - constants.append("\nTAG=").append(TAG); - constants.append("\nTAA=").append(TAA); - constants.append("\nTGA=").append(TGA); - constants.append("\nCRLF_CHECK_1=").append(CRLF_CHECK_1); - constants.append("\nCRLF_CHECK_2=").append(CRLF_CHECK_2); - constants.append("\nCRLF_CHECK_1BINARY=").append(Long.toBinaryString(CRLF_CHECK_1)); - constants.append("\nCRLF_CHECK_2BINARY=").append(Long.toBinaryString(CRLF_CHECK_2)); - constants.append("\nMASK_3=").append(MASK_3); - constants.append("\nMASK_5=").append(MASK_5); - constants.append("\nMASK_3BINARY=").append(Long.toBinaryString(MASK_3)); - constants.append("\nMASK_5BINARY=").append(Long.toBinaryString(MASK_5)); - - System.out.println(constants.toString()); - - } -} - - - - - - -// raise Exception.Create('hell') || Exception.Create('LITTLE_ENDIAN'); \ No newline at end of file diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java deleted file mode 100644 index 7f0a1d3..0000000 --- a/src/main/java/orffinder/Sequence.java +++ /dev/null @@ -1,119 +0,0 @@ -package orffinder; - -import java.util.ArrayList; -import java.util.Iterator; - -public class Sequence implements Iterable { - - final String header; - final int SequenceID; - private static int IDIncrement = 0; - final long lineNumber; - final long offset; // in file - public long EndPos; - public long RealSize; - - private ArrayList ORFList = new ArrayList(); - private ArrayList[] ORFTrackers = new ArrayList[3]; -//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work - - public Sequence(String currHeader, int currentTextLine, int position) { - SequenceID = IDIncrement++; - header = currHeader; - lineNumber = currentTextLine; - offset = position; // in file - ORFTrackers[0]= new ArrayList(); - ORFTrackers[1]= new ArrayList(); - ORFTrackers[2]= new ArrayList(); - } - - public void addNewORF(long position, long charCounter, int modulo) { - //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist - - ORFTrackers[modulo].add(new ORF(position, charCounter)); - } - - public void updateORFs(long endPos, long charCounter, int modulo) { - //ArrayList tracker = ORFTrackers.get(modulo); // for nested arraylist - assert (modulo >= 0 && modulo <= 2) : "MODULO CANT BE < 0 or > 2"; - ArrayList tracker = ORFTrackers[modulo]; - if (tracker.size() > 0) { - for ( ORF orf : tracker ) { - orf.endpos = endPos; - orf.counterEnd = charCounter; - - } - ORFList.addAll(tracker); - tracker.clear(); - } - } - - public long getRealSize() { - return RealSize; - } - - @Override - public Iterator iterator() { - return ORFList.iterator(); - } - - public String getStatistics() { - long totalOrfLength = 0; - long averageOrfLength = 0; - long shortestOrfLength= 0; - long longestOrfLength= 0; - int completedOrfCount = 0; - int incompleteOrfCount = 0; - - long size; - - for (ArrayList tracker : ORFTrackers) { - incompleteOrfCount += tracker.size(); - } - - for (ORF orf: ORFList ) { - completedOrfCount++; - size = orf.getSize(); - totalOrfLength += size; - - if (orf.getEndpos() != 0 && size < shortestOrfLength) { - shortestOrfLength = size; - } - if (size > longestOrfLength) { - longestOrfLength = size; - } - } - averageOrfLength = totalOrfLength / completedOrfCount; - - StringBuilder statistics = new StringBuilder("DNA header="); - statistics.append(header); - statistics.append("{ID=").append(SequenceID); - statistics.append(" StartPos=").append(offset); - statistics.append(" EndPos=").append(EndPos); - statistics.append(" CalculatedSize=").append(EndPos - offset); - statistics.append(" RealSize=").append(RealSize); - - - for (int i = 0; i < 10; i++) { - ORF o = ORFList.get(i); - statistics.append("\n\torf startpos=").append(o.getOffset()); - statistics.append(" endpos=").append(o.endpos); - statistics.append(" RealSize=").append(o.getSize()); - statistics.append(" StartCounter=").append(o.getCounterStart()); - statistics.append(" EndCounter=").append(o.counterEnd); - } - - statistics.append(" totalOrfLength=").append(totalOrfLength); - statistics.append(" averageOrfLength=").append(averageOrfLength); - statistics.append(" longestOrfLength=").append(longestOrfLength); - statistics.append(" shortestOrfLength=").append(shortestOrfLength); - statistics.append(" incompleteOrfCount=").append(incompleteOrfCount); - statistics.append(" completedOrfCount=").append(completedOrfCount); - statistics.append("}"); - - System.out.println(statistics.toString()); - return statistics.toString(); - - } -} - diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java deleted file mode 100644 index 31e3cc5..0000000 --- a/src/main/java/orfgui/ORFVisualiser.java +++ /dev/null @@ -1,288 +0,0 @@ -package orfgui; -import helpers.Reader; - -import javax.swing.*; -import javax.swing.border.Border; -import java.awt.*; -import java.awt.event.*; -import java.io.*; -import java.util.List; - -public class ORFVisualiser extends JFrame { - private JFrame mainFrame; - private JLabel headerLabel; - private JLabel statusLabel; - private JPanel controlPanel; - private JScrollPane displayfile; - private JTextField pathToFile; - private JTextArea textofFile; - private JLabel jLabelEmptyHolderImage; - Color black= new Color(43, 43, 43); - Color lighter_black= new Color(60, 63, 65); - Color DarkBlue= new Color(47, 79, 79); - Color Blue= new Color( 30,200,255); - Image img = Toolkit.getDefaultToolkit().getImage("DNA-512.png"); - - public ORFVisualiser() { - - - new SplashScreenDemo(); - prepareGUI(); - HolderImage(); - showFile(); - showMenuDemo(); - - } - - public static void main(String[] args) { - - ORFVisualiser swingMenuDemo = new ORFVisualiser(); - - - - - } - private void setLookAndFeel() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { - e.printStackTrace(); - } - } - private void prepareGUI() { - setLookAndFeel(); - mainFrame = new JFrame("orfgui"); - mainFrame.setSize(1000, 1000); - mainFrame.setLayout(null); - mainFrame.getContentPane().setBackground(black); - mainFrame.setIconImage(img); - headerLabel = new JLabel("", JLabel.CENTER); - statusLabel = new JLabel("", JLabel.CENTER); - statusLabel.setSize(350, 100); - - mainFrame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent windowEvent) { - System.exit(0); - } - }); - controlPanel = new JPanel(); - controlPanel.setBounds(1, 1, 950, 930); - controlPanel.setLayout(new BorderLayout(10,10)); - controlPanel.setBackground(black); - //mainFrame.add(headerLabel); - mainFrame.add(controlPanel); - //mainFrame.add(statusLabel); - controlPanel.setVisible(true); - mainFrame.setVisible(true); - } - - private void showFile() { - // creation of file display with scrolling bar - Border blackline = BorderFactory.createLineBorder(Blue); - Font titel = new Font("arial",Font.BOLD,16); - Font text = new Font("arial",Font.PLAIN,12); - textofFile = new JTextArea(200, 100); - textofFile.setBackground(lighter_black); - textofFile.setForeground(Color.white); - textofFile.setFont(text); - - displayfile = new JScrollPane(textofFile); - pathToFile = new JTextField("Path/of/File"); - pathToFile.setBackground(Blue); - pathToFile.setForeground(Color.white); - pathToFile.setEditable(false); - pathToFile.setFont(titel); - pathToFile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); - //pathToFile.setBounds(5, 5, 970, 25); - pathToFile.setPreferredSize(new Dimension(970,25)); - //displayfile.setBounds(5, 30, 970, 200); - - textofFile.setPreferredSize(new Dimension(940,100)); - - displayfile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); - //displayfile.setBorder(blackline); - displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - displayfile.setPreferredSize(new Dimension(940,100)); - - textofFile.setText("Display of file content"); - - controlPanel.add(pathToFile, BorderLayout.NORTH); - controlPanel.add(displayfile,BorderLayout.CENTER); - } - - private void ORFvisualisatie(){ - Border blackline = BorderFactory.createLineBorder(Blue); - JPanel visScreen = new VisualisatiePane(); - visScreen.setBackground(lighter_black); - //visScreen.setBounds(5,240,970,685); - List list = Reader.getLengths(); - System.out.println("got lengths" + list.size()); - int largest = 0; - for (int length : list) { - if (length > largest) { - largest = length; - System.out.println(largest); - } - } - visScreen.setPreferredSize(new Dimension(largest,685)); - JScrollPane displayORF = new JScrollPane(visScreen); - displayORF.setBorder(blackline); - //displayORF.setBounds(5,240,970,685); - displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - controlPanel.add(displayORF,BorderLayout.SOUTH); - - // TODO: 31-3-2020 make visualisation - } - private void showMenuDemo() { - //create a menu bar - final JMenuBar menuBar = new JMenuBar(); - //create menus - JMenu fileMenu = new JMenu("File"); - JMenu editMenu = new JMenu("Blast"); - JMenu databaseMenu = new JMenu("Database"); - final JMenu linkMenu = new JMenu("if anything else"); - - //create menu items - JMenuItem New = new JMenuItem("New ORF search"); - New.setMnemonic(KeyEvent.VK_N); - New.setActionCommand("New"); - - JMenuItem Export = new JMenuItem("Export"); - Export.setActionCommand("Export"); - - JMenuItem Exit = new JMenuItem("Exit"); - Exit.setActionCommand("Exit"); - - JMenuItem selectBlastn = new JMenuItem("BLASTn"); - selectBlastn.setActionCommand("BLASTn"); - - JMenuItem selectBlastt = new JMenuItem("BLASTx"); - selectBlastt.setActionCommand("BLASTx"); - - JMenuItem selectTBlastX = new JMenuItem("tBLASTx"); - selectTBlastX.setActionCommand("tBLASTx"); - - JMenuItem Upload = new JMenuItem("Upload"); - Upload.setActionCommand("Upload"); - - JMenuItem Download = new JMenuItem("Download"); - Download.setActionCommand("Download"); - - MenuItemListener menuItemListener = new MenuItemListener(); - - - New.addActionListener(menuItemListener); - Export.addActionListener(menuItemListener); - Exit.addActionListener(menuItemListener); - selectBlastn.addActionListener(menuItemListener); - selectBlastt.addActionListener(menuItemListener); - selectTBlastX.addActionListener(menuItemListener); - Upload.addActionListener(menuItemListener); - Download.addActionListener(menuItemListener); - - final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Hide file", false); - showWindowMenu.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - - if (showWindowMenu.getState()) { - controlPanel.remove(displayfile); - mainFrame.repaint(); - } else { - controlPanel.add(displayfile); - mainFrame.repaint(); - - } - } - }); - final JCheckBoxMenuItem showLinksMenu = new JCheckBoxMenuItem( - "Show Translation", true); - showLinksMenu.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - - if (showLinksMenu.getState()) { - menuBar.remove(linkMenu); - mainFrame.repaint(); - } else { - menuBar.add(linkMenu); - mainFrame.repaint(); - } - } - }); - //add menu items to menus - fileMenu.add(New); - fileMenu.add(Export); - fileMenu.addSeparator(); - fileMenu.add(showWindowMenu); - fileMenu.addSeparator(); - fileMenu.add(showLinksMenu); - fileMenu.addSeparator(); - fileMenu.add(Exit); - - editMenu.add(selectBlastn); - editMenu.add(selectBlastt); - editMenu.add(selectTBlastX); - - databaseMenu.add(Upload); - databaseMenu.add(Download); - //add menu to menubar - menuBar.add(fileMenu); - menuBar.add(editMenu); - menuBar.add(databaseMenu); - - //add menubar to the frame - mainFrame.setJMenuBar(menuBar); - mainFrame.setVisible(true); - } - - private void HolderImage(){ - ImageIcon image = new ImageIcon("hatebed.gif"); - jLabelEmptyHolderImage =new JLabel("",image,JLabel.CENTER); - controlPanel.add(jLabelEmptyHolderImage,BorderLayout.SOUTH); - } - private void FileDisplayer(File file) throws IOException { - - BufferedReader input = new BufferedReader( - new InputStreamReader( - new FileInputStream( - file))); - textofFile.read(input, "READING FILE :)"); - } - - class MenuItemListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) - - String actionEventName = e.getActionCommand(); - switch (actionEventName) { - - case "New": - File file = Reader.FileChooser(); - pathToFile.setText(String.valueOf(file)); -// try { // todo disabled due to memory issues -// FileDisplayer(file); -// } catch (IOException ex) { -// ex.printStackTrace(); -// } - ORFvisualisatie(); - controlPanel.repaint(); - controlPanel.remove(jLabelEmptyHolderImage); - controlPanel.validate(); - - case "Export": - case "BLASTn": - case "BLASTx": - case "tBLASTx": - case "Exit": - case "Upload": - case "download": - default: - break; - } - System.out.println("you pressed " + actionEventName); - statusLabel.setText(e.getActionCommand() + " JMenuItem clicked."); - - } - } -} diff --git a/src/main/java/orfgui/SplashScreenDemo.java b/src/main/java/orfgui/SplashScreenDemo.java deleted file mode 100644 index e713522..0000000 --- a/src/main/java/orfgui/SplashScreenDemo.java +++ /dev/null @@ -1,80 +0,0 @@ -package orfgui; - -import javax.swing.*; -import java.awt.*; - -public class SplashScreenDemo { - JFrame frame; - JLabel image=new JLabel(new ImageIcon("genes.gif")); - JLabel text=new JLabel("orffinder"); - JProgressBar progressBar=new JProgressBar(); - JLabel message=new JLabel(); - SplashScreenDemo() - { - createGUI(); - addImage(); - addText(); - addProgressBar(); - addMessage(); - runningPBar(); - } - public void createGUI(){ - frame=new JFrame(); - frame.getContentPane().setLayout(null); - frame.setUndecorated(true); - frame.setSize(600,400); - frame.setLocationRelativeTo(null); - Color x= new Color( 30,200,255); - frame.getContentPane().setBackground(x); - frame.setVisible(true); - - } - public void addImage(){ - image.setSize(600,200); - frame.add(image); - } - public void addText() - { - text.setFont(new Font("arial",Font.BOLD,30)); - text.setBounds(220,220,600,40); - text.setForeground(Color.white); - frame.add(text); - } - public void addMessage() - { - message.setBounds(250,320,200,40); - message.setForeground(Color.white); - message.setFont(new Font("arial",Font.BOLD,15)); - frame.add(message); - } - public void addProgressBar(){ - progressBar.setBounds(100,280,400,30); - progressBar.setBorderPainted(true); - progressBar.setStringPainted(true); - Color x= new Color(47, 79, 79); - progressBar.setBackground(Color.WHITE); - progressBar.setForeground(x); - progressBar.setValue(0); - frame.add(progressBar); - } - public void runningPBar(){ - int i=0; - - while( i<=100) - { - try{ - // Thread.sleep(50); // todo dingen laden - progressBar.setValue(i); - message.setText("LOADING "+Integer.toString(i)+"%"); - i++; - if(i==100) - frame.dispose(); - }catch(Exception e){ - e.printStackTrace(); - } - - - - } - } -} diff --git a/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java deleted file mode 100644 index 1772e8b..0000000 --- a/src/main/java/orfgui/VisualisatiePane.java +++ /dev/null @@ -1,34 +0,0 @@ -package orfgui; -import helpers.Reader; - -import javax.swing.*; -import java.awt.*; -import java.util.List; - -public class VisualisatiePane extends JPanel { - - @Override - protected void paintComponent(Graphics g) { - int firstline = 10; - super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - g2.setColor(Color.WHITE); - g2.setStroke(new BasicStroke(2)); - List list = Reader.getLengths(); // todo solution - for (Integer l: list){ - firstline = firstline + 30; - g.drawLine(10,10 + firstline,l-10,10 + firstline); - } - } - - //public static void createAndShowGui() { - // JFrame frame = new JFrame(); - // frame.add(new VisualisatiePane()); - // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // frame.setLocationByPlatform(true); - // frame.pack(); - // frame.setVisible(true); - - //} - -} \ No newline at end of file diff --git a/src/main/resources/DNA-512.png b/src/main/resources/DNA-512.png deleted file mode 100644 index 807568758ddf51aa8c31e6ef86ee26d5859fbd77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32943 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 diff --git a/src/main/resources/genes.gif b/src/main/resources/genes.gif deleted file mode 100644 index e48a847c1f40d936e68b61dcd9dc40b686846b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76599 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

m@H&|g?1YiCnf3Wsa&g2V-HGhR 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%0AYS_=%cw7zGV`ye)xTJ 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 P+|OcE Date: Tue, 7 Apr 2020 23:40:45 +0200 Subject: [PATCH 10/43] what is pom --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d06f881..fa3a59f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - nl-HAN-ORFFApp - ORFFApp + groupId + Course7Informatica 1.0-SNAPSHOT From 7a09a792479ce3574657fc0ca6375770417ca860 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Wed, 8 Apr 2020 00:53:23 +0200 Subject: [PATCH 11/43] add all IDE related stuff --- .gitignore | 2 + .idea/$PRODUCT_WORKSPACE_FILE$ | 40 +++++++++ .idea/compiler.xml | 16 ++++ ...mons_beanutils_commons_beanutils_1_8_0.xml | 13 +++ ..._collections_commons_collections_3_2_1.xml | 13 +++ .../Maven__commons_lang_commons_lang_2_5.xml | 13 +++ ..._commons_logging_commons_logging_1_1_1.xml | 13 +++ .../libraries/Maven__java3d_vecmath_1_3_1.xml | 13 +++ .../Maven__net_sf_ezmorph_ezmorph_1_0_6.xml | 13 +++ ...en__net_sf_json_lib_json_lib_jdk15_2_4.xml | 13 +++ ...org_apache_logging_log4j_log4j_api_2_5.xml | 13 +++ ...rg_apache_logging_log4j_log4j_core_2_5.xml | 13 +++ ...che_logging_log4j_log4j_slf4j_impl_2_5.xml | 13 +++ .../Maven__org_biojava_biojava3_core_3_0.xml | 13 +++ ...n__org_biojava_biojava_alignment_4_2_0.xml | 13 +++ .../Maven__org_biojava_biojava_core_4_2_0.xml | 13 +++ ...aven__org_biojava_biojava_genome_4_2_0.xml | 13 +++ ...Maven__org_biojava_biojava_phylo_4_2_0.xml | 13 +++ ...n__org_biojava_biojava_structure_4_2_0.xml | 13 +++ .../Maven__org_biojava_biojava_ws_5_3_0.xml | 13 +++ ..._org_biojava_thirdparty_forester_1_038.xml | 13 +++ ...aven__org_jetbrains_annotations_19_0_0.xml | 13 +++ .../Maven__org_jgrapht_jgrapht_core_0_9_1.xml | 13 +++ .../Maven__org_slf4j_slf4j_api_1_7_14.xml | 13 +++ .idea/misc.xml | 13 +++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ .idea/workspace.xml | 84 +++++++++++++++++++ Course7Informatica.iml | 37 ++++++++ pom.xml | 6 ++ 30 files changed, 485 insertions(+) create mode 100644 .idea/$PRODUCT_WORKSPACE_FILE$ create mode 100644 .idea/compiler.xml create mode 100644 .idea/libraries/Maven__commons_beanutils_commons_beanutils_1_8_0.xml create mode 100644 .idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml create mode 100644 .idea/libraries/Maven__commons_lang_commons_lang_2_5.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml create mode 100644 .idea/libraries/Maven__java3d_vecmath_1_3_1.xml create mode 100644 .idea/libraries/Maven__net_sf_ezmorph_ezmorph_1_0_6.xml create mode 100644 .idea/libraries/Maven__net_sf_json_lib_json_lib_jdk15_2_4.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_5.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_5.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_slf4j_impl_2_5.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava3_core_3_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_alignment_4_2_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_core_4_2_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_genome_4_2_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_phylo_4_2_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_structure_4_2_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_biojava_ws_5_3_0.xml create mode 100644 .idea/libraries/Maven__org_biojava_thirdparty_forester_1_038.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_annotations_19_0_0.xml create mode 100644 .idea/libraries/Maven__org_jgrapht_jgrapht_core_0_9_1.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_14.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 Course7Informatica.iml diff --git a/.gitignore b/.gitignore index 4dfc85f..bebaf24 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ src/test/resources/data/DNA.txt +target/* + diff --git a/.idea/$PRODUCT_WORKSPACE_FILE$ b/.idea/$PRODUCT_WORKSPACE_FILE$ new file mode 100644 index 0000000..67bd976 --- /dev/null +++ b/.idea/$PRODUCT_WORKSPACE_FILE$ @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..06dfe98 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_8_0.xml b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_8_0.xml new file mode 100644 index 0000000..cf7c90c --- /dev/null +++ b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml new file mode 100644 index 0000000..3caee7e --- /dev/null +++ b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_5.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_5.xml new file mode 100644 index 0000000..055afe5 --- /dev/null +++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml new file mode 100644 index 0000000..b770f56 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__java3d_vecmath_1_3_1.xml b/.idea/libraries/Maven__java3d_vecmath_1_3_1.xml new file mode 100644 index 0000000..e6b4b12 --- /dev/null +++ b/.idea/libraries/Maven__java3d_vecmath_1_3_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_sf_ezmorph_ezmorph_1_0_6.xml b/.idea/libraries/Maven__net_sf_ezmorph_ezmorph_1_0_6.xml new file mode 100644 index 0000000..546e6cf --- /dev/null +++ b/.idea/libraries/Maven__net_sf_ezmorph_ezmorph_1_0_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_sf_json_lib_json_lib_jdk15_2_4.xml b/.idea/libraries/Maven__net_sf_json_lib_json_lib_jdk15_2_4.xml new file mode 100644 index 0000000..7c6b3e6 --- /dev/null +++ b/.idea/libraries/Maven__net_sf_json_lib_json_lib_jdk15_2_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_5.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_5.xml new file mode 100644 index 0000000..44fb98f --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_5.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_5.xml new file mode 100644 index 0000000..074c87b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_core_2_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_slf4j_impl_2_5.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_slf4j_impl_2_5.xml new file mode 100644 index 0000000..48a2ee5 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_slf4j_impl_2_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava3_core_3_0.xml b/.idea/libraries/Maven__org_biojava_biojava3_core_3_0.xml new file mode 100644 index 0000000..7b8bcf8 --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava3_core_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_alignment_4_2_0.xml b/.idea/libraries/Maven__org_biojava_biojava_alignment_4_2_0.xml new file mode 100644 index 0000000..602a76e --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_alignment_4_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_core_4_2_0.xml b/.idea/libraries/Maven__org_biojava_biojava_core_4_2_0.xml new file mode 100644 index 0000000..e69e7c1 --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_core_4_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_genome_4_2_0.xml b/.idea/libraries/Maven__org_biojava_biojava_genome_4_2_0.xml new file mode 100644 index 0000000..7ae348a --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_genome_4_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_phylo_4_2_0.xml b/.idea/libraries/Maven__org_biojava_biojava_phylo_4_2_0.xml new file mode 100644 index 0000000..b01258a --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_phylo_4_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_structure_4_2_0.xml b/.idea/libraries/Maven__org_biojava_biojava_structure_4_2_0.xml new file mode 100644 index 0000000..abea441 --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_structure_4_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_biojava_ws_5_3_0.xml b/.idea/libraries/Maven__org_biojava_biojava_ws_5_3_0.xml new file mode 100644 index 0000000..d5bf813 --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_biojava_ws_5_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_biojava_thirdparty_forester_1_038.xml b/.idea/libraries/Maven__org_biojava_thirdparty_forester_1_038.xml new file mode 100644 index 0000000..f473c0f --- /dev/null +++ b/.idea/libraries/Maven__org_biojava_thirdparty_forester_1_038.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_annotations_19_0_0.xml b/.idea/libraries/Maven__org_jetbrains_annotations_19_0_0.xml new file mode 100644 index 0000000..53f3d57 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_annotations_19_0_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jgrapht_jgrapht_core_0_9_1.xml b/.idea/libraries/Maven__org_jgrapht_jgrapht_core_0_9_1.xml new file mode 100644 index 0000000..d34d9e7 --- /dev/null +++ b/.idea/libraries/Maven__org_jgrapht_jgrapht_core_0_9_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_14.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_14.xml new file mode 100644 index 0000000..2f9f43a --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2545dc7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..3cf76cc --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..6e2e2d3 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1586298334998 + + + + + + + + + \ No newline at end of file diff --git a/Course7Informatica.iml b/Course7Informatica.iml new file mode 100644 index 0000000..a993d56 --- /dev/null +++ b/Course7Informatica.iml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index fa3a59f..b601a94 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,12 @@ biojava-ws 5.3.0 + + org.jetbrains + annotations + RELEASE + compile + From 83822286c34308bd02d0c9668d4e7378750215ae Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Wed, 8 Apr 2020 00:53:55 +0200 Subject: [PATCH 12/43] move fix and merge --- ORFF_GUI/Blast.java | 68 --- ORFF_GUI/ORF.java | 60 -- ORFF_GUI/ORFFinder.java | 200 ------ ORFF_GUI/Reader.java | 36 -- ORFF_GUI/Sequence.java | 121 ---- ORFF_GUI/Settings.java | 7 - src/main/java/helpers/MaskFactory.java | 19 + src/main/java/helpers/Reader.java | 49 ++ src/main/java/main/Controller.java | 8 + src/main/java/main/Settings.java | 5 + src/main/java/orffinder/ORF.java | 34 ++ src/main/java/orffinder/ORFFinder.java | 422 +++++++++++++ src/main/java/orffinder/Sequence.java | 119 ++++ .../main/java/orfgui/ORFVisualiser.java | 576 +++++++++--------- .../main/java/orfgui}/SplashScreenDemo.java | 160 ++--- .../main/java/orfgui}/VisualisatiePane.java | 67 +- DNA-512.png => src/main/resources/DNA-512.png | Bin genes.gif => src/main/resources/genes.gif | Bin hatebed.gif => src/main/resources/hatebed.gif | Bin 19 files changed, 1057 insertions(+), 894 deletions(-) delete mode 100644 ORFF_GUI/Blast.java delete mode 100644 ORFF_GUI/ORF.java delete mode 100644 ORFF_GUI/ORFFinder.java delete mode 100644 ORFF_GUI/Reader.java delete mode 100644 ORFF_GUI/Sequence.java delete mode 100644 ORFF_GUI/Settings.java create mode 100644 src/main/java/helpers/MaskFactory.java create mode 100644 src/main/java/helpers/Reader.java create mode 100644 src/main/java/main/Controller.java create mode 100644 src/main/java/main/Settings.java create mode 100644 src/main/java/orffinder/ORF.java create mode 100644 src/main/java/orffinder/ORFFinder.java create mode 100644 src/main/java/orffinder/Sequence.java rename ORFF_GUI/ORFvis.java => src/main/java/orfgui/ORFVisualiser.java (85%) rename {ORFF_GUI => src/main/java/orfgui}/SplashScreenDemo.java (89%) rename {ORFF_GUI => src/main/java/orfgui}/VisualisatiePane.java (77%) rename DNA-512.png => src/main/resources/DNA-512.png (100%) rename genes.gif => src/main/resources/genes.gif (100%) rename hatebed.gif => src/main/resources/hatebed.gif (100%) diff --git a/ORFF_GUI/Blast.java b/ORFF_GUI/Blast.java deleted file mode 100644 index 6c49dc6..0000000 --- a/ORFF_GUI/Blast.java +++ /dev/null @@ -1,68 +0,0 @@ -package ORFF_GUI; -import java.io.*; -import org.biojava.nbio.core.sequence.io.util.IOUtils; -import org.biojava.nbio.ws.alignment.qblast.*; - -// TODO: 24-3-2020 make doBlast return arraylist with blast results -public class Blast { - public String blasttype = ""; - protected String currentBlast = ""; - private static final String BLAST_OUTPUT_FILE = "blastOutput.xml"; // file to save blast results to - private static final String SEQUENCE = "MYPRGPNLQQRPLANQNQPYPVRKVPDQGPNGPLNASQSKIDPARQREKVADKLISDCYSKVIIDKNGKRYTDTSYQTHIDIKEFSSYQSHPPPDNIPPGQIGSIKNRVLVICVKYSGRVIIQKGKYNETKNVYQIGRTWDMDELKAIKKVGNDGIILTLNKDYYWKVEEGLERVWKFARFLTKAYGGFMGRYPILNGFTLEEFKLPPIPMKKSLGNGQQSDRTSGSTNDIVLNEPTPDSQLLKSRSLKRKNMPNPVLPSESLLQNNQRTTTQLQMQPSSTSAKSNEFYKDFDFTSNGKLPMKLMKVMEVDRPVVGSANTVILSQKTSEQFSNTSSEGYKYNKTDNERTKQKGFIDNHVKLDDNDDFKDISKTPRTSTHPYQQKSPLKGGDLVSNDSQSFIFKARDTYSSEKLHEYVKENEVLETSPLRKYNTQKITAETEQRKVSDPLESVAVLGLRLEEKLGGYNAADDFFQSDHSLKQPAISKNPGYSPDFGIEEITDVSEDSLTFPSATGATDKGLAISQRENSPEIIEESTKLEANDISSDNINSSIQEIENFIGSQLHFGVDDKGNKTPNQTVTANVIQNEVLNLNQAEESNLGTSLEINESTNKNANEQLDILNIREGYPLEEDESLFTQGYVSKPDLNIQKKEETQHVNFEKDPELEELLEEVNWTISDNSDSLIKKLTKELNNVKQHNIKEIVSLDFSKDSVSNDITTSLNEIENLNHIFKKMEIDFKFLAPEVRLIETNSHGLQVKSVNKKVLYNDLKSILSKVSMSSADLTAIESFKEFDRLNKIEALESKLVGLYNALGTIRYDSNEDKDDLGSMRALRQYQTNYEKVTSKFIRHFNSFIKEQFKSLIDQFSSDLERFYPNAIFRELNNLLIYSSITYFIKNTSPNEFLDLNNFFNQLISEFLEKLIRSKLKNVKGSGASSVSSNLSQTFEINPLKKSRTLRLSTRKDKFIGKLGLNDDDHKTQQLDNSKKSTKNPNEIEDPKTVISIIDDSKDLICLLQYFVGYLFHFGTNILDFNEYINTTSYKERRKLLETSSIDKIDVKRYSNELIANMNFIFGSYINIFMKKVTPSELSIPVLLIYLETLLHENQRINQEFLVFNFLKKAIEKFKGIWNKFIRNQIELLNKSTIVVKCGILPAVKNVIQLLLVTESSLERSTHINETLVRSMVDKSYKEITEAAIHLFMRDDPLLKSHDFDDKEREYRNVSIIKNVFYFLEQFPTSDIESINKMKFQLESVLKKVQENYFQKLLIKNVGKLVEFVNNYEALSKMNNGKPKKYNKKYLKSLLTGYTSKDVSMKAHEIFKKLEKHYITGSDMFEKDLLDKLWLDMENEFVGYFSRLDNIIRANFDKDIEHNISKQEIHSIFKSIY"; // Blast query sequence - NCBIQBlastService service; - - public static void main(String[] args) { - NCBIQBlastService service = new NCBIQBlastService(); - - // set alignment options - NCBIQBlastAlignmentProperties props = new NCBIQBlastAlignmentProperties(); - - props.setBlastProgram(BlastProgramEnum.tblastx); - - props.setBlastDatabase("nr"); - //props.setAlignmentOption(ENTREZ_QUERY, "\"serum albumin\"[Protein name] AND mammals[Organism]"); - - // set output options - NCBIQBlastOutputProperties outputProps = new NCBIQBlastOutputProperties(); - // in this example we use default values set by constructor (XML format, pairwise alignment, 100 descriptions and alignments) - - // Example of two possible ways of setting output options - String rid = null; // blast request ID - FileWriter writer = null; - BufferedReader reader = null; - try { - // send blast request and save request id - rid = service.sendAlignmentRequest(SEQUENCE, props); - - // wait until results become available. Alternatively, one can do other computations/send other alignment requests - while (!service.isReady(rid)) { - System.out.println("Waiting for results. Sleeping for 5 seconds"); - Thread.sleep(5000); - } - - // read results when they are ready - InputStream in = service.getAlignmentResults(rid, outputProps); - reader = new BufferedReader(new InputStreamReader(in)); - - // write blast output to specified file - File f = new File(BLAST_OUTPUT_FILE); - System.out.println("Saving query results in file " + f.getAbsolutePath()); - writer = new FileWriter(f); - - String line; - while ((line = reader.readLine()) != null) { - writer.write(line + System.getProperty("line.separator")); - } - } catch (Exception e) { - System.out.println(e.getMessage()); - e.printStackTrace(); - } finally { - // clean up - IOUtils.close(writer); - IOUtils.close(reader); - - // delete given alignment results from blast server (optional operation) - service.sendDeleteRequest(rid); - } - } -} diff --git a/ORFF_GUI/ORF.java b/ORFF_GUI/ORF.java deleted file mode 100644 index 323aedd..0000000 --- a/ORFF_GUI/ORF.java +++ /dev/null @@ -1,60 +0,0 @@ -package ORFF_GUI; - -public class ORF { - - private static int totalBabyORFs = 0; - private Sequence parentSequence; - private int id; - private int startpos; - private int length; - private int endpos; - private String dnaSequence; - private StringBuilder dnaBuilder; - - - public ORF(int startpos, Sequence parent) { - this.id = totalBabyORFs++; - this.startpos = startpos; - - /** - * bugfix: initial length 3 -> 2, because each ORF wil be 'fed' the last 'G' of 'ATG' directly after - * initiation - */ - // this.length = 2; - this.dnaBuilder = new StringBuilder("AT"); - - this.parentSequence = parent; - } - - public boolean feed(int c, boolean stopcodon) { // todo maybe this can return a mature ORF on stopcodon instead - // this.length++; - dnaBuilder.append((char) c); - if (stopcodon && dnaBuilder.length() % 3 == 0) { - endpos = startpos + length; - dnaSequence = dnaBuilder.toString(); - dnaBuilder = null; - return false; - } - return true; - } - - public String getDnaSequence() { - return dnaSequence; - } - - public int getLength() { - return dnaSequence.length(); - } - - @Override - public String toString() { - length = dnaSequence.length(); - final StringBuilder sb = new StringBuilder("ORF="); - sb.append(id); - sb.append(" START= ").append(startpos); - sb.append(" END= ").append(endpos); - sb.append(" LENGTH= ").append(length); - sb.append(" SEQID= ").append(parentSequence.getSequenceID()); - return sb.toString(); - } -} diff --git a/ORFF_GUI/ORFFinder.java b/ORFF_GUI/ORFFinder.java deleted file mode 100644 index 87af19f..0000000 --- a/ORFF_GUI/ORFFinder.java +++ /dev/null @@ -1,200 +0,0 @@ -package ORFF_GUI; - -import java.io.*; -import java.math.BigDecimal; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -// try -Xms512M -Xmx512M in VM options - -/** - * ORFFinder reads through a textfile (assumed format: nucleotide FASTA) to find ORFS - */ -public class ORFFinder { - - static String filename_RELATIVE_TEMP = "data/DNA.txt"; - private final ArrayList sequences = new ArrayList(100); - - /** - * constructor - */ - public ORFFinder() { - - - } - - - /** - * main (for testing...) - */ - public static void main(String[] args) { - // test ORFFinder - - ORFFinder orfFinder = new ORFFinder(); - // read the default input - orfFinder.readAndFindORFs(); - - orfFinder.seeDNA(); - - } - - /** - * ASCII TABLE (for reference) - * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) - * chars of interest and their ASCII values: (65, A) (84, T) (67, C) (71, G) (62, >) - */ - public void readAndFindORFs() { - readAndFindORFs(filename_RELATIVE_TEMP); - } - - public void readAndFindORFs(String filename) { - long startTime = System.nanoTime(); - - int[] last = new int[3]; - int trackedATGs = 0; - int currentSequenceID = 0; - int currentPos = 0; - Sequence currentSequence = null; - boolean isStopCodon; - - int c; - - try (BufferedReader reader = Files.newBufferedReader( - Path.of(filename))) { - - while ((c = reader.read()) != -1) { - // iterate over character (int) in the file... - switch (c) { - case (62): // ASCII 62 == > - double dnaStartTime = System.nanoTime(); - String header = reader.readLine(); // Save the header - currentSequenceID++; - currentPos = 0; - if (currentSequence != null) { - // testing - - System.out.print(currentSequence); - System.out.println(header); // TODO REMOVE ?? - long dnaEndTime = System.nanoTime(); - double duration = (dnaEndTime - dnaStartTime); - BigDecimal planckseconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); - System.out.println(". ERIC, WOW, THAT ONLY TOOK " + planckseconds.toPlainString() + " planckseconds!!!!!!!!!!!!!!!"); - int totalThisSequence = currentSequence.getCompletedORFCount(); - Sequence.addTotalCompletedORFCount(totalThisSequence); - } else { - System.out.println(header); - } - currentSequence = new Sequence(currentSequenceID); - sequences.add(currentSequence); - break; - case (65): // ASCII 65 == A - case (67): // ASCII 67 == C - case (71): // ASCII 71 == G - case (84): // ASCII 84 == T // TODO enhancement add 'U' ? - currentSequence.calculateLength(1); - currentPos++; - last[0] = last[1]; - last[1] = last[2]; - last[2] = c; - switch (Integer.toString(last[0]) + last[1] + last[2]) { - case "846571": // TAG - case "846565": // TAA - case "847165": // TGA - // System.out.println("is stop codon true"); // TODO DEBUGPRINT - isStopCodon = true; - break; - case "658471": // ATG - trackedATGs++; - // continue to default - ORF orf = new ORF(currentPos, currentSequence); - assert currentSequence != null; - currentSequence.addNewORF(orf); - default: - // System.out.println("is stop codon false"); // TODO DEBUGPRINT - isStopCodon = false; - break; - } - assert currentSequence != null; - currentSequence.feedActiveORFs(c, isStopCodon); - - break; - default: - //dostuff - break; - } - - - } - } catch (IOException e) { - e.printStackTrace(); - } - - System.out.println(currentSequence); // last sequence - - System.out.println("found " + trackedATGs + " occurences of ATG"); - System.out.println("of which " + Sequence.getTotalCompletedCount() + " Complete ORFs"); - long endTime = System.nanoTime(); - long duration = (endTime - startTime); - double planckseconds = 5.39124760e44 * duration; - System.out.println("Duration : " + planckseconds + " planckseconds"); - System.out.println("Duration : " + duration + " nanoseconds"); - long mseconds = duration / 1000000; - System.out.println("Duration : " + mseconds + " milliseconds"); - long seconds = mseconds / 1000; - System.out.println("Duration : " + seconds + " seconds"); - } - - public void seeDNA() { - for (Sequence sequence : sequences) { - for (ORF orf : sequence) { - System.out.println(orf); - System.out.println(orf.getDnaSequence()); - } - } - } - - public void testReadAndCountSpeed(int amount) { - for (int i = 0; i < amount + 1; i++) { - long startTime = System.nanoTime(); - long counts = readandcount(i * 10); - long endTime = System.nanoTime(); - long duration = (endTime - startTime); - System.out.print("with looping " + counts + " times per char, counting, I counted " + counts + " times | "); - System.out.println("Duration : " + duration / 1000000 + " milliseconds"); - } - } - public List getInfoForVisualisation(){ - List num = new ArrayList<>(); - for (Sequence sequence : sequences) { - int length = sequence.getLengthOfsequence(); - num.add(length); - } - return num; - } - public long readandcount(int counts) { - - long countable = 0; - - try (BufferedReader reader = Files.newBufferedReader(Path.of(filename_RELATIVE_TEMP))) { - int c; - while ((c = reader.read()) != -1) { - - for (int i = 0; i < counts + 1; i++) { - countable++; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - - System.out.println(countable); - return countable; - - } - -} - - -// raise Exception.Create('hell'); diff --git a/ORFF_GUI/Reader.java b/ORFF_GUI/Reader.java deleted file mode 100644 index 3fc40e5..0000000 --- a/ORFF_GUI/Reader.java +++ /dev/null @@ -1,36 +0,0 @@ -package ORFF_GUI; - -import javax.swing.*; -import javax.swing.filechooser.FileSystemView; -import java.io.File; -import java.util.List; - -public class Reader { - private static File file; - private static ORFFinder orf; - - static File FileChooser() { - System.out.println("i got here"); - JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); - jfc.setDialogTitle("Choose a directory to save your file: "); - jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); - - int returnValue = jfc.showSaveDialog(null); - if (returnValue == JFileChooser.APPROVE_OPTION) { - if (jfc.getSelectedFile().isFile()) { - file = jfc.getSelectedFile(); - } - } - orf = new ORFFinder(); - orf.readAndFindORFs(String.valueOf(file)); - - return file; - } - static List getLengths() { - int largest = 0; - List listoflength = orf.getInfoForVisualisation(); - - return listoflength; - } - -} diff --git a/ORFF_GUI/Sequence.java b/ORFF_GUI/Sequence.java deleted file mode 100644 index 984880b..0000000 --- a/ORFF_GUI/Sequence.java +++ /dev/null @@ -1,121 +0,0 @@ -package ORFF_GUI; - -import com.sun.source.tree.LiteralTree; - -import java.util.ArrayList; -import java.util.Iterator; - -public class Sequence implements Iterable { - - - static int totalCompletedORFs = 0; - - ArrayList activeORFMap; - ArrayList completedORFMap; - int sequenceID; - boolean isActive; // is the baby active or not - private int longestORF = 0; - private int totalORFLength = 0; - private int shortestORF = 100000000; - private int lengthOfsequence = 0; - - public Sequence(int sequenceID) { - this.sequenceID = sequenceID; - activeORFMap = new ArrayList(); - completedORFMap = new ArrayList(); - } - - public static void addTotalCompletedORFCount(int amount) {// todo rename - totalCompletedORFs += amount; // todo rename - - } - - public static int getTotalCompletedCount() {// todo rename - return totalCompletedORFs; // todo rename - } - - public void addNewORF(ORF orf) { - activeORFMap.add(orf); - - } - - public void feedActiveORFs(int c, boolean isStopcodon) { - // System.out.println("feeding " + activeORFMap.size()); // TODO DEBUGPRINT - - ArrayList inactives = new ArrayList(activeORFMap.size()); - - for (ORF orf : activeORFMap) { - isActive = orf.feed(c, isStopcodon); - if (!isActive) { - inactives.add(orf); - if (!(orf.getLength() <= Settings.MINIMAL_ORF_LENGTH)) { - // if orf.Length is not too small, add it - int orfLength = orf.getLength(); - totalORFLength += orfLength; - if (orfLength > longestORF) { - longestORF = orfLength; - } - if (orfLength < shortestORF) { - shortestORF = orfLength; - } - completedORFMap.add(orf); - } else { - // orfs that are too small are disposed of - orf = null; - } - - } - - } - - - // remove inactives (cant do in other loop, derp) - for (Object orf : inactives) { - // System.out.println(orfBaby); // - activeORFMap.remove(orf); - } - - } - - public int getSequenceID() { - return sequenceID; - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder("Sequence{"); - sb.append("sequenceID=").append(sequenceID); - sb.append(", totalORFLength=").append(totalORFLength); - sb.append(", averageORFLength=").append(getAverageORFLength()); - sb.append(", longestORF=").append(longestORF); - sb.append(", shortestORF=").append(shortestORF); - sb.append(", completedORFs=").append(getCompletedORFCount()); - sb.append(", length of Sequence=").append(lengthOfsequence); - sb.append('}'); - return sb.toString(); - } - public void calculateLength(int i){ - lengthOfsequence = lengthOfsequence + i; - } - public int getShortestORFLength() { - return shortestORF; - } - - public int getLongestORFLength() { - return longestORF; - } - - public int getAverageORFLength() { - return totalORFLength / completedORFMap.size(); - } - - public int getCompletedORFCount() { - return completedORFMap.size(); - } - - public int getLengthOfsequence(){return lengthOfsequence;} - @Override - public Iterator iterator() { - return completedORFMap.iterator(); - } -} diff --git a/ORFF_GUI/Settings.java b/ORFF_GUI/Settings.java deleted file mode 100644 index 6978746..0000000 --- a/ORFF_GUI/Settings.java +++ /dev/null @@ -1,7 +0,0 @@ -package ORFF_GUI; - -public class Settings { - - public static final int MINIMAL_ORF_LENGTH = 100; // used in Sequence to determine whether to keep an ORF or not - -} diff --git a/src/main/java/helpers/MaskFactory.java b/src/main/java/helpers/MaskFactory.java new file mode 100644 index 0000000..e6c19fb --- /dev/null +++ b/src/main/java/helpers/MaskFactory.java @@ -0,0 +1,19 @@ +package helpers; +public class MaskFactory +{ + public static byte GetByte_0(long u) + { + return (byte) (u & 0xFF); + } + + public static byte GetByte_1(long u) + { + return (byte) ((u & 0xFF00) >> 8); + } + + public static byte GetByte_2(long u) + { + return (byte) ((u & 0xFF0000) >> 16); + } + +} \ No newline at end of file diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java new file mode 100644 index 0000000..8857512 --- /dev/null +++ b/src/main/java/helpers/Reader.java @@ -0,0 +1,49 @@ +package helpers; + +import orffinder.ORFFinder; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.util.List; + + +public class Reader { + private static File file; + private static ORFFinder orfFinder; + + public static File FileChooser() { + System.out.println("Reader.FileChooser() fired!"); // todo-debugprint + JFileChooser jfc = new JFileChooser("."); + jfc.setDialogTitle("Choose a directory to save your file: "); + jfc.setFileSelectionMode(JFileChooser.FILES_ONLY); + + int returnValue = jfc.showSaveDialog(null); + if (returnValue == JFileChooser.APPROVE_OPTION) { + if (jfc.getSelectedFile().isFile()) { + file = jfc.getSelectedFile(); + } + } + + try { + orfFinder = new ORFFinder(file); + + } catch (IOException e) { + + // todo popup + e.printStackTrace(); + } + + orfFinder.findOrfs(); + + return file; + } + + public static List getLengths() { + int largest = 0; + List listoflengths = orfFinder.getInfoForVisualisation(); + + return listoflengths; + } + +} diff --git a/src/main/java/main/Controller.java b/src/main/java/main/Controller.java new file mode 100644 index 0000000..9099930 --- /dev/null +++ b/src/main/java/main/Controller.java @@ -0,0 +1,8 @@ +package main; + +public class Controller { + + public Controller() { + + } +} diff --git a/src/main/java/main/Settings.java b/src/main/java/main/Settings.java new file mode 100644 index 0000000..9a93757 --- /dev/null +++ b/src/main/java/main/Settings.java @@ -0,0 +1,5 @@ +public class Settings { + + public static final int MINIMAL_ORF_LENGTH = 0; // used in Sequence to determine whether to keep an ORF or not + +} diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java new file mode 100644 index 0000000..648648b --- /dev/null +++ b/src/main/java/orffinder/ORF.java @@ -0,0 +1,34 @@ +package orffinder; + +public class ORF { + + private long offset; // offset in file + public long endpos; // endpos in file + private long counterStart; // relative counter to dna + public long counterEnd; // relative counter to dna without the fucking linefeeds + +public ORF(long position, long charCounter) { + offset = position; + counterStart = charCounter; +} + + public long getSize() { + return counterEnd-counterStart; + } + + public int getOffset() { + return (int) offset; + } + + public long getCounterStart() { + return counterStart; + } + + public long getEndpos() { + return endpos; + } + +} + + +// raise LITTLE_ENDIAN \ No newline at end of file diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java new file mode 100644 index 0000000..8b41a01 --- /dev/null +++ b/src/main/java/orffinder/ORFFinder.java @@ -0,0 +1,422 @@ +package orffinder; + + +import helpers.MaskFactory; +import org.jetbrains.annotations.Contract; + +import java.io.*; +import java.math.BigDecimal; +import java.nio.BufferUnderflowException; +import java.nio.ByteOrder; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +// try -Xms512M -Xmx512M in VM options +// add -ea for enable assertions in VM options + +/** + * ORFFinder reads through a textfile (assumed format: nucleotide FASTA) to find ORFS + */ +public class ORFFinder { + + // constants + private static final byte HEADER = 62; // 00 11 11 10 // Header prefix > + private static final byte CR = 13; // 00 00 11 01 // Carriage Return + private static final byte LF = 10; // 00 00 10 10 // Line Feed + private static final byte A = 65; // 01 00 00 01 + private static final byte T = 84; // 01 01 01 00 + private static final byte C = 67; // 01 00 00 11 + private static final byte G = 71; // 01 00 01 11 + private static final byte N = 78; // 01 00 11 10 + private static final long ATG = (A) | (T << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 01 01 00 01 00 00 01 + private static final long TAG = (T) | (A << 8) | (G << 16); // 00 00 00 00 01 00 01 11 01 00 00 01 01 01 01 00 + private static final long TAA = (T) | (A << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 00 01 01 01 01 00 + private static final long TGA = (T) | (G << 8) | (A << 16); // 00 00 00 00 01 00 00 01 01 00 01 11 01 01 01 00 + private static final long CRLF_CHECK_1 = (CR << 8) | (LF << 16); // 00 00 00 00 00 00 10 10 00 00 11 01 00 00 00 00 // x + #13 + #10 + private static final long CRLF_CHECK_2 = (CR << 16); // 00 00 00 00 00 00 11 01 00 00 00 00 00 00 00 00 // x + y + #13 + private static final int MASK_3 = 0x00FFFFFF; + private static final long MASK_5 = 0xFFFFFFFFFFL; + + static String filename_RELATIVE_TEMP = "src/test/resources/data/Glennie the platypus.fa"; + private final ArrayList sequences = new ArrayList(100); + private File file; + private RandomAccessFile mainRAFile; + private FileChannel mainFileChannel; + private MappedByteBuffer mainBuffer; + + public static void main(String[] args) { + + } + + public ORFFinder(File file) throws IOException { + file = file; + mainRAFile = new RandomAccessFile(file, "r"); + mainFileChannel = mainRAFile.getChannel(); + // mainBuffer = new RandomAccessFile(file, "r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); // as oneliner + mainBuffer = mainFileChannel.map(FileChannel.MapMode.READ_ONLY, 0, mainFileChannel.size()); + mainBuffer.order(ByteOrder.LITTLE_ENDIAN); // SHOOT ME IN THE FOOT (took ~xxxhours to figure out) + + } + + public void setFile(File file) { + this.file = file; + } + + + /** + * Algorithm by Eric Langedijk + * ASCII TABLE (for reference) + * using ordinal values as keys maybe? later?: ATG 658471, TAG 846571, TAA 846565, TGA 847165 (changed use of hashmaps to arraylist for now) + * chars of interest and their ASCII values: (65, A) (84, T) (67, C) (71, G) (62, >) + */ + public void findOrfs() { + findOrfs(String.valueOf(file)); + } + + public void findOrfs(String filename) { + + // TIME LOGGING + long startTime = System.nanoTime(); + + // variables + StringBuilder currHeader; + byte b_byteAtPointer; + long currentCodonLong; + int position; + int charCounter; + int currentTextLine; + + // initialise some + Sequence currentSequence = null; + position = 0; + charCounter = 0; + currentTextLine = 0; + int delta; + + //debug stuff + int orfsCounted = 0; + + + MappedByteBuffer buffer = mainBuffer; + + final long lastValidDNACharacterPos = buffer.capacity() - 8; + + boolean UNIXLinefeeds = true; + // check which type of linefeed the file contains, if it contains CR assume all are CRLF + while (position < lastValidDNACharacterPos) { + b_byteAtPointer = buffer.get(); + if (b_byteAtPointer == CR) { + System.out.println("Encountered {CR} character, assuming all lines end with CRLF! - WINDOWS FILE"); + UNIXLinefeeds = false; + } + if (b_byteAtPointer == LF) { + break; + } + position++; + } + + if (UNIXLinefeeds) { + delta = 3; // for reading [current] + [T LF G] for example + } else { + delta = 4; // for reading [current] + [CR LF T G] for example + } + final boolean isUnix = UNIXLinefeeds; + + // reset pos to 0 before reading again + buffer.rewind(); + position = 0; + int p_pointerPos = 0; + + while (position < lastValidDNACharacterPos) { + // if c = #13 and c + 1 <> #10 then raise FuckingLinuxException + + b_byteAtPointer = buffer.get(p_pointerPos); + + switch (b_byteAtPointer) { + // end of line + + case LF: + currentTextLine++; + + break; + + // header line start (>) marks start of new sequence object + case HEADER: // > + // if sequence object was made, end it here at the start of a new header + if (currentSequence != null) { + currentSequence.EndPos = position; // TODO: 6-4-2020 make private? use setter? + currentSequence.RealSize = charCounter + 1; + //currentSequence.getStatistics(); + } + // build the string of the new header (thanks java for not being nice with string concat) + currHeader = new StringBuilder(); + buffer.position(p_pointerPos); + while (position <= lastValidDNACharacterPos && b_byteAtPointer != LF) { + b_byteAtPointer = buffer.get(); + if (b_byteAtPointer != CR) { + currHeader.append((char) b_byteAtPointer); + } + p_pointerPos++; + position++; + + } //end while headerbuilder + + currentTextLine++; + currentSequence = new Sequence(currHeader.toString(), currentTextLine, position); + + currHeader = null; + sequences.add(currentSequence); + charCounter = 0; + continue; // do not increment position but continue + + + // check orf start + case A: + assert currentSequence != null : "NO FUCKING DNA"; + + // put byes 0,1,2 of buffer.getInt into currentCodon + // (read 4 bytes from here but only use first 3 ) + currentCodonLong = buffer.getInt(p_pointerPos) & MASK_3; + + + if (currentCodonLong == ATG) { + currentSequence.addNewORF(position, charCounter, charCounter % 3); + + } else { + // if 0,1,3 bytes wasn't enough, check 5 bytes briefly too + currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); + + if (currentCodonLong == ATG) { + currentSequence.addNewORF(position, charCounter, charCounter % 3); + } + } + + break; + + // check if orf ends + case T: + assert currentSequence != null : "NO FUCKING DNA"; + + currentCodonLong = buffer.getInt(position) & MASK_3; + + if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { + currentSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3); + + } else { + currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); + if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { + currentSequence.updateORFs(position + delta, charCounter + delta, charCounter % 3); + + } + } + + break; + + } // end switch (b_byteAtPointer) + + if (b_byteAtPointer >= 40) { + charCounter++; // count chars valued higher than A, assume in {A,T,C,G,N} + } + p_pointerPos++; + position++; + + } // end while loop that reads over file + + // round up the last sequence made (if any were made) + if (currentSequence != null) { + if (currentSequence.EndPos == 0) { + currentSequence.EndPos = lastValidDNACharacterPos; + currentSequence.RealSize = charCounter + 1; + } + } + //currentSequence.getStatistics(); + + + // Print logged time + logTime(startTime, 4); + + + } + + public void printStats() { + for (Sequence seq : sequences) { + seq.getStatistics(); + } + } + + private static long compress(long i, boolean isUnix) { + if (isUnix) { + return compressUnix(i); + } else { + return compressWindows(i); + } + } + + private static long compressWindows(long i) { + if (MaskFactory.GetByte_1(i) == LF) { + return CRLFCompress1(i); + } else if (MaskFactory.GetByte_2(i) == LF) { + return CRLFCompress2(i); + } else { + return 0; + } + } + + + private static long CRLFCompress1(long i) { + return (i & 0xFF) | ((i & 0xFFFF000000L) >> 16); + } + + + private static long CRLFCompress2(long i) { + // compress from a + b + CR + LF + c + return (i & 0xFFFF) | ((i & 0xFF00000000L) >> 16); + + } + + private static long compressUnix(long i) { + if (MaskFactory.GetByte_1(i) == LF) { + return LFCompress1(i); + } else if (MaskFactory.GetByte_2(i) == LF) { + return LFCompress2(i); + } else { + return 0; + } + } + + + private static long LFCompress1(long i) { + return (i & 0xFF) | ((i & 0xFFFF0000) >> 8); + } + + + private static long LFCompress2(long i) { + return (i & 0xFF) | ((i & 0xFF000000) >> 8); + } + + + + public void getallOrfs() { + long startTime = System.nanoTime(); + + System.out.println("getting all ORFS..."); + String orfString; + int orfsFound = 0; + for (Sequence seq : sequences + ) { + for (ORF orf : seq + ) { + orfString = getOrf(orf); + orfsFound++; + } + } + logTime(startTime, 4); + System.out.println("got " + orfsFound + " orf Strings"); + } + + + public String getOrf(ORF orf) { + + int c; + StringBuilder dna = new StringBuilder(); + + int endpos = (int) orf.getEndpos(); + if (endpos + 1 < mainBuffer.capacity()) { + for (int i = orf.getOffset(); i < endpos; i++) { + // todo change endpos in ORF + c = mainBuffer.get(i); + if (c >= A) { // skip whitechars + dna.append((char) c); + } + + } + return dna.toString(); + } + // todo exception + System.out.println("dna impossible length"); + System.out.println("buffer cap: " +mainBuffer.capacity()); + System.out.println("endpos: " +endpos); + return ""; + + } + + public List getInfoForVisualisation() { + + List num = new ArrayList<>(); + for (Sequence sequence : sequences) { + int length = (int) sequence.RealSize; + num.add(length); + } + return num; + } + + + + + private void logTime(long startTime, int verbose) { + long endTime = System.nanoTime(); + long duration = (endTime - startTime); + switch (verbose) { + case 5: // nanoseconds only + System.out.println("Duration : " + duration + " nanoSeconds"); + break; + case 4: + BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); + System.out.println("Duration : " + planckSeconds + " planckSeconds"); + case 3: + System.out.println("Duration : " + duration + " nanoSeconds"); + case 2: + long mseconds = duration / 1000000; + System.out.println("Duration : " + mseconds + " milliSeconds"); + case 1: + long seconds = duration / 1000000000; + System.out.println("Duration : " + seconds + " seconds"); + case 0: + default: + break; + } + + } + + private void logPlanckTime(double startTime) { + long endTime = System.nanoTime(); + double duration = (endTime - startTime); + BigDecimal planckSeconds = BigDecimal.valueOf((539124760000000000000000000000000000000000000.0 * duration * 0.000000001)); + System.out.println("THAT ONLY TOOK " + planckSeconds.toPlainString() + " planckSeconds!"); + } + + private void printConstants() { + StringBuilder constants = new StringBuilder(); + constants.append("A=").append(A); + constants.append("\nT=").append(T); + constants.append("\nC=").append(C); + constants.append("\nG=").append(G); + constants.append("\nATG=").append(ATG); + constants.append("\nTAG=").append(TAG); + constants.append("\nTAA=").append(TAA); + constants.append("\nTGA=").append(TGA); + constants.append("\nCRLF_CHECK_1=").append(CRLF_CHECK_1); + constants.append("\nCRLF_CHECK_2=").append(CRLF_CHECK_2); + constants.append("\nCRLF_CHECK_1BINARY=").append(Long.toBinaryString(CRLF_CHECK_1)); + constants.append("\nCRLF_CHECK_2BINARY=").append(Long.toBinaryString(CRLF_CHECK_2)); + constants.append("\nMASK_3=").append(MASK_3); + constants.append("\nMASK_5=").append(MASK_5); + constants.append("\nMASK_3BINARY=").append(Long.toBinaryString(MASK_3)); + constants.append("\nMASK_5BINARY=").append(Long.toBinaryString(MASK_5)); + + System.out.println(constants.toString()); + + } +} + + + + + + +// raise Exception.Create('hell') || Exception.Create('LITTLE_ENDIAN'); \ No newline at end of file diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java new file mode 100644 index 0000000..7f0a1d3 --- /dev/null +++ b/src/main/java/orffinder/Sequence.java @@ -0,0 +1,119 @@ +package orffinder; + +import java.util.ArrayList; +import java.util.Iterator; + +public class Sequence implements Iterable { + + final String header; + final int SequenceID; + private static int IDIncrement = 0; + final long lineNumber; + final long offset; // in file + public long EndPos; + public long RealSize; + + private ArrayList ORFList = new ArrayList(); + private ArrayList[] ORFTrackers = new ArrayList[3]; +//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work + + public Sequence(String currHeader, int currentTextLine, int position) { + SequenceID = IDIncrement++; + header = currHeader; + lineNumber = currentTextLine; + offset = position; // in file + ORFTrackers[0]= new ArrayList(); + ORFTrackers[1]= new ArrayList(); + ORFTrackers[2]= new ArrayList(); + } + + public void addNewORF(long position, long charCounter, int modulo) { + //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist + + ORFTrackers[modulo].add(new ORF(position, charCounter)); + } + + public void updateORFs(long endPos, long charCounter, int modulo) { + //ArrayList tracker = ORFTrackers.get(modulo); // for nested arraylist + assert (modulo >= 0 && modulo <= 2) : "MODULO CANT BE < 0 or > 2"; + ArrayList tracker = ORFTrackers[modulo]; + if (tracker.size() > 0) { + for ( ORF orf : tracker ) { + orf.endpos = endPos; + orf.counterEnd = charCounter; + + } + ORFList.addAll(tracker); + tracker.clear(); + } + } + + public long getRealSize() { + return RealSize; + } + + @Override + public Iterator iterator() { + return ORFList.iterator(); + } + + public String getStatistics() { + long totalOrfLength = 0; + long averageOrfLength = 0; + long shortestOrfLength= 0; + long longestOrfLength= 0; + int completedOrfCount = 0; + int incompleteOrfCount = 0; + + long size; + + for (ArrayList tracker : ORFTrackers) { + incompleteOrfCount += tracker.size(); + } + + for (ORF orf: ORFList ) { + completedOrfCount++; + size = orf.getSize(); + totalOrfLength += size; + + if (orf.getEndpos() != 0 && size < shortestOrfLength) { + shortestOrfLength = size; + } + if (size > longestOrfLength) { + longestOrfLength = size; + } + } + averageOrfLength = totalOrfLength / completedOrfCount; + + StringBuilder statistics = new StringBuilder("DNA header="); + statistics.append(header); + statistics.append("{ID=").append(SequenceID); + statistics.append(" StartPos=").append(offset); + statistics.append(" EndPos=").append(EndPos); + statistics.append(" CalculatedSize=").append(EndPos - offset); + statistics.append(" RealSize=").append(RealSize); + + + for (int i = 0; i < 10; i++) { + ORF o = ORFList.get(i); + statistics.append("\n\torf startpos=").append(o.getOffset()); + statistics.append(" endpos=").append(o.endpos); + statistics.append(" RealSize=").append(o.getSize()); + statistics.append(" StartCounter=").append(o.getCounterStart()); + statistics.append(" EndCounter=").append(o.counterEnd); + } + + statistics.append(" totalOrfLength=").append(totalOrfLength); + statistics.append(" averageOrfLength=").append(averageOrfLength); + statistics.append(" longestOrfLength=").append(longestOrfLength); + statistics.append(" shortestOrfLength=").append(shortestOrfLength); + statistics.append(" incompleteOrfCount=").append(incompleteOrfCount); + statistics.append(" completedOrfCount=").append(completedOrfCount); + statistics.append("}"); + + System.out.println(statistics.toString()); + return statistics.toString(); + + } +} + diff --git a/ORFF_GUI/ORFvis.java b/src/main/java/orfgui/ORFVisualiser.java similarity index 85% rename from ORFF_GUI/ORFvis.java rename to src/main/java/orfgui/ORFVisualiser.java index c0dcc83..3b22652 100644 --- a/ORFF_GUI/ORFvis.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -1,288 +1,288 @@ -package ORFF_GUI; - -import javax.swing.*; -import javax.swing.border.Border; -import java.awt.*; -import java.awt.event.*; -import java.io.*; -import java.util.List; - -public class ORFvis extends JFrame { - private JFrame mainFrame; - private JLabel headerLabel; - private JLabel statusLabel; - private JPanel controlPanel; - private JScrollPane displayfile; - private JTextField pathToFile; - private JTextArea textofFile; - private JLabel jl; - Color black= new Color(43, 43, 43); - Color lighter_black= new Color(60, 63, 65); - Color DarkBlue= new Color(47, 79, 79); - Color Blue= new Color( 30,200,255); - Image img = Toolkit.getDefaultToolkit().getImage("DNA-512.png"); - - public ORFvis() { - prepareGUI(); - } - - public static void main(String[] args) { - new SplashScreenDemo(); - ORFvis swingMenuDemo = new ORFvis(); - swingMenuDemo.HolderImage(); - swingMenuDemo.showFile(); - swingMenuDemo.showMenuDemo(); - - - - } - private void setLookAndFeel() { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { - e.printStackTrace(); - } - } - private void prepareGUI() { - setLookAndFeel(); - mainFrame = new JFrame("ORFF_GUI"); - mainFrame.setSize(1000, 1000); - mainFrame.setLayout(null); - mainFrame.getContentPane().setBackground(black); - mainFrame.setIconImage(img); - headerLabel = new JLabel("", JLabel.CENTER); - statusLabel = new JLabel("", JLabel.CENTER); - statusLabel.setSize(350, 100); - - mainFrame.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent windowEvent) { - System.exit(0); - } - }); - controlPanel = new JPanel(); - controlPanel.setBounds(1, 1, 950, 930); - controlPanel.setLayout(new BorderLayout(10,10)); - controlPanel.setBackground(black); - //mainFrame.add(headerLabel); - mainFrame.add(controlPanel); - //mainFrame.add(statusLabel); - controlPanel.setVisible(true); - mainFrame.setVisible(true); - } - - private void showFile() { - // creation of file display with scrolling bar - Border blackline = BorderFactory.createLineBorder(Blue); - Font titel = new Font("arial",Font.BOLD,16); - Font text = new Font("arial",Font.PLAIN,12); - textofFile = new JTextArea(200, 100); - textofFile.setBackground(lighter_black); - textofFile.setForeground(Color.white); - textofFile.setFont(text); - - displayfile = new JScrollPane(textofFile); - pathToFile = new JTextField("Path/of/File"); - pathToFile.setBackground(Blue); - pathToFile.setForeground(Color.white); - pathToFile.setEditable(false); - pathToFile.setFont(titel); - pathToFile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); - //pathToFile.setBounds(5, 5, 970, 25); - pathToFile.setPreferredSize(new Dimension(970,25)); - //displayfile.setBounds(5, 30, 970, 200); - - textofFile.setPreferredSize(new Dimension(940,100)); - - displayfile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); - //displayfile.setBorder(blackline); - displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); - displayfile.setPreferredSize(new Dimension(940,100)); - - textofFile.setText("Display of file content"); - - controlPanel.add(pathToFile, BorderLayout.NORTH); - controlPanel.add(displayfile,BorderLayout.CENTER); - } - - private void ORFvisualisatie(){ - Border blackline = BorderFactory.createLineBorder(Blue); - JPanel visScreen = new VisualisatiePane(); - visScreen.setBackground(lighter_black); - //visScreen.setBounds(5,240,970,685); - List list = Reader.getLengths(); - int largest = 0; - for (int length : list) { - if (length > largest) { - largest = length; - System.out.println(largest); - } - } - visScreen.setPreferredSize(new Dimension(largest,685)); - JScrollPane displayORF = new JScrollPane(visScreen); - displayORF.setBorder(blackline); - //displayORF.setBounds(5,240,970,685); - displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - controlPanel.add(displayORF,BorderLayout.SOUTH); - - // TODO: 31-3-2020 make visualisation - } - private void showMenuDemo() { - //create a menu bar - final JMenuBar menuBar = new JMenuBar(); - //create menus - JMenu fileMenu = new JMenu("File"); - JMenu editMenu = new JMenu("Blast"); - JMenu databaseMenu = new JMenu("Database"); - final JMenu linkMenu = new JMenu("if anything else"); - - //create menu items - JMenuItem New = new JMenuItem("New ORF search"); - New.setMnemonic(KeyEvent.VK_N); - New.setActionCommand("New"); - - JMenuItem Export = new JMenuItem("Export"); - Export.setActionCommand("Export"); - - JMenuItem Exit = new JMenuItem("Exit"); - Exit.setActionCommand("Exit"); - - JMenuItem selectBlastn = new JMenuItem("BLASTn"); - selectBlastn.setActionCommand("BLASTn"); - - JMenuItem selectBlastt = new JMenuItem("BLASTx"); - selectBlastt.setActionCommand("BLASTx"); - - JMenuItem selectTBlastX = new JMenuItem("tBLASTx"); - selectTBlastX.setActionCommand("tBLASTx"); - - JMenuItem Upload = new JMenuItem("Upload"); - Upload.setActionCommand("Upload"); - - JMenuItem Download = new JMenuItem("Download"); - Download.setActionCommand("Download"); - - MenuItemListener menuItemListener = new MenuItemListener(); - - - New.addActionListener(menuItemListener); - Export.addActionListener(menuItemListener); - Exit.addActionListener(menuItemListener); - selectBlastn.addActionListener(menuItemListener); - selectBlastt.addActionListener(menuItemListener); - selectTBlastX.addActionListener(menuItemListener); - Upload.addActionListener(menuItemListener); - Download.addActionListener(menuItemListener); - - final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Hide file", false); - showWindowMenu.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - - if (showWindowMenu.getState()) { - controlPanel.remove(displayfile); - mainFrame.repaint(); - } else { - controlPanel.add(displayfile); - mainFrame.repaint(); - - } - } - }); - final JCheckBoxMenuItem showLinksMenu = new JCheckBoxMenuItem( - "Show Translation", true); - showLinksMenu.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - - if (showLinksMenu.getState()) { - menuBar.remove(linkMenu); - mainFrame.repaint(); - } else { - menuBar.add(linkMenu); - mainFrame.repaint(); - } - } - }); - //add menu items to menus - fileMenu.add(New); - fileMenu.add(Export); - fileMenu.addSeparator(); - fileMenu.add(showWindowMenu); - fileMenu.addSeparator(); - fileMenu.add(showLinksMenu); - fileMenu.addSeparator(); - fileMenu.add(Exit); - - editMenu.add(selectBlastn); - editMenu.add(selectBlastt); - editMenu.add(selectTBlastX); - - databaseMenu.add(Upload); - databaseMenu.add(Download); - //add menu to menubar - menuBar.add(fileMenu); - menuBar.add(editMenu); - menuBar.add(databaseMenu); - - //add menubar to the frame - mainFrame.setJMenuBar(menuBar); - mainFrame.setVisible(true); - } - - private void HolderImage(){ - ImageIcon image = new ImageIcon("hatebed.gif"); - jl=new JLabel("",image,JLabel.CENTER); - controlPanel.add(jl,BorderLayout.SOUTH); - } - private void FileDisplayer(File file) throws IOException { - - BufferedReader input = new BufferedReader( - new InputStreamReader( - new FileInputStream( - file))); - textofFile.read(input, "READING FILE :)"); - } - class MenuItemListener implements ActionListener { - public void actionPerformed(ActionEvent e) { - // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) - switch (e.getActionCommand()){ - - case "New": - File file = Reader.FileChooser(); - pathToFile.setText(String.valueOf(file)); - try { - FileDisplayer(file); - } catch (IOException ex) { - ex.printStackTrace(); - } - ORFvisualisatie(); - controlPanel.repaint(); - controlPanel.remove(jl); - controlPanel.validate(); - case "Export": - System.out.println("hellooo"); - break; - case "BLASTn": - System.out.println("1"); - break; - case "BLASTx": - System.out.println("2"); - break; - case "tBLASTx": - System.out.println("3"); - break; - case "Exit": - System.out.println("you wanna exit :("); - break; - case "Upload": - System.out.println("uploading"); - break; - case "download": - System.out.println("downloading"); - break; - } - statusLabel.setText(e.getActionCommand() + " JMenuItem clicked."); - - } - } -} +package orfgui; +import helpers.Reader; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.util.List; + +public class ORFVisualiser extends JFrame { + private JFrame mainFrame; + private JLabel headerLabel; + private JLabel statusLabel; + private JPanel controlPanel; + private JScrollPane displayfile; + private JTextField pathToFile; + private JTextArea textofFile; + private JLabel jLabelEmptyHolderImage; + Color black= new Color(43, 43, 43); + Color lighter_black= new Color(60, 63, 65); + Color DarkBlue= new Color(47, 79, 79); + Color Blue= new Color( 30,200,255); + Image img = Toolkit.getDefaultToolkit().getImage("src/main/resources/DNA-512.png"); + + public ORFVisualiser() { + + + new SplashScreenDemo(); + prepareGUI(); + HolderImage(); + showFile(); + showMenuDemo(); + + } + + public static void main(String[] args) { + + ORFVisualiser swingMenuDemo = new ORFVisualiser(); + + + + + } + private void setLookAndFeel() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } + private void prepareGUI() { + setLookAndFeel(); + mainFrame = new JFrame("orfgui"); + mainFrame.setSize(1000, 1000); + mainFrame.setLayout(null); + mainFrame.getContentPane().setBackground(black); + mainFrame.setIconImage(img); + headerLabel = new JLabel("", JLabel.CENTER); + statusLabel = new JLabel("", JLabel.CENTER); + statusLabel.setSize(350, 100); + + mainFrame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent windowEvent) { + System.exit(0); + } + }); + controlPanel = new JPanel(); + controlPanel.setBounds(1, 1, 950, 930); + controlPanel.setLayout(new BorderLayout(10,10)); + controlPanel.setBackground(black); + //mainFrame.add(headerLabel); + mainFrame.add(controlPanel); + //mainFrame.add(statusLabel); + controlPanel.setVisible(true); + mainFrame.setVisible(true); + } + + private void showFile() { + // creation of file display with scrolling bar + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); + Font text = new Font("arial",Font.PLAIN,12); + textofFile = new JTextArea(200, 100); + textofFile.setBackground(lighter_black); + textofFile.setForeground(Color.white); + textofFile.setFont(text); + + displayfile = new JScrollPane(textofFile); + pathToFile = new JTextField("Path/of/File"); + pathToFile.setBackground(Blue); + pathToFile.setForeground(Color.white); + pathToFile.setEditable(false); + pathToFile.setFont(titel); + pathToFile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //pathToFile.setBounds(5, 5, 970, 25); + pathToFile.setPreferredSize(new Dimension(970,25)); + //displayfile.setBounds(5, 30, 970, 200); + + textofFile.setPreferredSize(new Dimension(940,100)); + + displayfile.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Blue)); + //displayfile.setBorder(blackline); + displayfile.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + displayfile.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); + displayfile.setPreferredSize(new Dimension(940,100)); + + textofFile.setText("Display of file content"); + + controlPanel.add(pathToFile, BorderLayout.NORTH); + controlPanel.add(displayfile,BorderLayout.CENTER); + } + + private void ORFvisualisatie(){ + Border blackline = BorderFactory.createLineBorder(Blue); + JPanel visScreen = new VisualisatiePane(); + visScreen.setBackground(lighter_black); + //visScreen.setBounds(5,240,970,685); + List list = Reader.getLengths(); + System.out.println("got lengths" + list.size()); + int largest = 0; + for (int length : list) { + if (length > largest) { + largest = length; + System.out.println(largest); + } + } + visScreen.setPreferredSize(new Dimension(largest,685)); + JScrollPane displayORF = new JScrollPane(visScreen); + displayORF.setBorder(blackline); + //displayORF.setBounds(5,240,970,685); + displayORF.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + displayORF.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + controlPanel.add(displayORF,BorderLayout.SOUTH); + + // TODO: 31-3-2020 make visualisation + } + private void showMenuDemo() { + //create a menu bar + final JMenuBar menuBar = new JMenuBar(); + //create menus + JMenu fileMenu = new JMenu("File"); + JMenu editMenu = new JMenu("Blast"); + JMenu databaseMenu = new JMenu("Database"); + final JMenu linkMenu = new JMenu("if anything else"); + + //create menu items + JMenuItem New = new JMenuItem("New ORF search"); + New.setMnemonic(KeyEvent.VK_N); + New.setActionCommand("New"); + + JMenuItem Export = new JMenuItem("Export"); + Export.setActionCommand("Export"); + + JMenuItem Exit = new JMenuItem("Exit"); + Exit.setActionCommand("Exit"); + + JMenuItem selectBlastn = new JMenuItem("BLASTn"); + selectBlastn.setActionCommand("BLASTn"); + + JMenuItem selectBlastt = new JMenuItem("BLASTx"); + selectBlastt.setActionCommand("BLASTx"); + + JMenuItem selectTBlastX = new JMenuItem("tBLASTx"); + selectTBlastX.setActionCommand("tBLASTx"); + + JMenuItem Upload = new JMenuItem("Upload"); + Upload.setActionCommand("Upload"); + + JMenuItem Download = new JMenuItem("Download"); + Download.setActionCommand("Download"); + + MenuItemListener menuItemListener = new MenuItemListener(); + + + New.addActionListener(menuItemListener); + Export.addActionListener(menuItemListener); + Exit.addActionListener(menuItemListener); + selectBlastn.addActionListener(menuItemListener); + selectBlastt.addActionListener(menuItemListener); + selectTBlastX.addActionListener(menuItemListener); + Upload.addActionListener(menuItemListener); + Download.addActionListener(menuItemListener); + + final JCheckBoxMenuItem showWindowMenu = new JCheckBoxMenuItem("Hide file", false); + showWindowMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showWindowMenu.getState()) { + controlPanel.remove(displayfile); + mainFrame.repaint(); + } else { + controlPanel.add(displayfile); + mainFrame.repaint(); + + } + } + }); + final JCheckBoxMenuItem showLinksMenu = new JCheckBoxMenuItem( + "Show Translation", true); + showLinksMenu.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + + if (showLinksMenu.getState()) { + menuBar.remove(linkMenu); + mainFrame.repaint(); + } else { + menuBar.add(linkMenu); + mainFrame.repaint(); + } + } + }); + //add menu items to menus + fileMenu.add(New); + fileMenu.add(Export); + fileMenu.addSeparator(); + fileMenu.add(showWindowMenu); + fileMenu.addSeparator(); + fileMenu.add(showLinksMenu); + fileMenu.addSeparator(); + fileMenu.add(Exit); + + editMenu.add(selectBlastn); + editMenu.add(selectBlastt); + editMenu.add(selectTBlastX); + + databaseMenu.add(Upload); + databaseMenu.add(Download); + //add menu to menubar + menuBar.add(fileMenu); + menuBar.add(editMenu); + menuBar.add(databaseMenu); + + //add menubar to the frame + mainFrame.setJMenuBar(menuBar); + mainFrame.setVisible(true); + } + + private void HolderImage(){ + ImageIcon image = new ImageIcon("src/main/resources/rhatebed.gif"); + jLabelEmptyHolderImage =new JLabel("",image,JLabel.CENTER); + controlPanel.add(jLabelEmptyHolderImage,BorderLayout.SOUTH); + } + private void FileDisplayer(File file) throws IOException { + + BufferedReader input = new BufferedReader( + new InputStreamReader( + new FileInputStream( + file))); + textofFile.read(input, "READING FILE :)"); + } + + class MenuItemListener implements ActionListener { + public void actionPerformed(ActionEvent e) { + // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) + + String actionEventName = e.getActionCommand(); + switch (actionEventName) { + + case "New": + File file = Reader.FileChooser(); + pathToFile.setText(String.valueOf(file)); +// try { // todo disabled due to memory issues +// FileDisplayer(file); +// } catch (IOException ex) { +// ex.printStackTrace(); +// } + ORFvisualisatie(); + controlPanel.repaint(); + controlPanel.remove(jLabelEmptyHolderImage); + controlPanel.validate(); + + case "Export": + case "BLASTn": + case "BLASTx": + case "tBLASTx": + case "Exit": + case "Upload": + case "download": + default: + break; + } + System.out.println("you pressed " + actionEventName); + statusLabel.setText(e.getActionCommand() + " JMenuItem clicked."); + + } + } +} diff --git a/ORFF_GUI/SplashScreenDemo.java b/src/main/java/orfgui/SplashScreenDemo.java similarity index 89% rename from ORFF_GUI/SplashScreenDemo.java rename to src/main/java/orfgui/SplashScreenDemo.java index 931562e..f811bb7 100644 --- a/ORFF_GUI/SplashScreenDemo.java +++ b/src/main/java/orfgui/SplashScreenDemo.java @@ -1,80 +1,80 @@ -package ORFF_GUI; - -import javax.swing.*; -import java.awt.*; - -public class SplashScreenDemo { - JFrame frame; - JLabel image=new JLabel(new ImageIcon("genes.gif")); - JLabel text=new JLabel("ORFFinder"); - JProgressBar progressBar=new JProgressBar(); - JLabel message=new JLabel(); - SplashScreenDemo() - { - createGUI(); - addImage(); - addText(); - addProgressBar(); - addMessage(); - runningPBar(); - } - public void createGUI(){ - frame=new JFrame(); - frame.getContentPane().setLayout(null); - frame.setUndecorated(true); - frame.setSize(600,400); - frame.setLocationRelativeTo(null); - Color x= new Color( 30,200,255); - frame.getContentPane().setBackground(x); - frame.setVisible(true); - - } - public void addImage(){ - image.setSize(600,200); - frame.add(image); - } - public void addText() - { - text.setFont(new Font("arial",Font.BOLD,30)); - text.setBounds(220,220,600,40); - text.setForeground(Color.white); - frame.add(text); - } - public void addMessage() - { - message.setBounds(250,320,200,40); - message.setForeground(Color.white); - message.setFont(new Font("arial",Font.BOLD,15)); - frame.add(message); - } - public void addProgressBar(){ - progressBar.setBounds(100,280,400,30); - progressBar.setBorderPainted(true); - progressBar.setStringPainted(true); - Color x= new Color(47, 79, 79); - progressBar.setBackground(Color.WHITE); - progressBar.setForeground(x); - progressBar.setValue(0); - frame.add(progressBar); - } - public void runningPBar(){ - int i=0; - - while( i<=100) - { - try{ - Thread.sleep(50); - progressBar.setValue(i); - message.setText("LOADING "+Integer.toString(i)+"%"); - i++; - if(i==100) - frame.dispose(); - }catch(Exception e){ - e.printStackTrace(); - } - - - - } - } -} +package orfgui; + +import javax.swing.*; +import java.awt.*; + +public class SplashScreenDemo { + JFrame frame; + JLabel image=new JLabel(new ImageIcon("src/main/resources/genes.gif")); + JLabel text=new JLabel("orffinder"); + JProgressBar progressBar=new JProgressBar(); + JLabel message=new JLabel(); + SplashScreenDemo() + { + createGUI(); + addImage(); + addText(); + addProgressBar(); + addMessage(); + runningPBar(); + } + public void createGUI(){ + frame=new JFrame(); + frame.getContentPane().setLayout(null); + frame.setUndecorated(true); + frame.setSize(600,400); + frame.setLocationRelativeTo(null); + Color x= new Color( 30,200,255); + frame.getContentPane().setBackground(x); + frame.setVisible(true); + + } + public void addImage(){ + image.setSize(600,200); + frame.add(image); + } + public void addText() + { + text.setFont(new Font("arial",Font.BOLD,30)); + text.setBounds(220,220,600,40); + text.setForeground(Color.white); + frame.add(text); + } + public void addMessage() + { + message.setBounds(250,320,200,40); + message.setForeground(Color.white); + message.setFont(new Font("arial",Font.BOLD,15)); + frame.add(message); + } + public void addProgressBar(){ + progressBar.setBounds(100,280,400,30); + progressBar.setBorderPainted(true); + progressBar.setStringPainted(true); + Color x= new Color(47, 79, 79); + progressBar.setBackground(Color.WHITE); + progressBar.setForeground(x); + progressBar.setValue(0); + frame.add(progressBar); + } + public void runningPBar(){ + int i=0; + + while( i<=100) + { + try{ + Thread.sleep(25); // todo echte dingen laden + progressBar.setValue(i); + message.setText("LOADING "+Integer.toString(i)+"%"); + i++; + if(i==100) + frame.dispose(); + }catch(Exception e){ + e.printStackTrace(); + } + + + + } + } +} diff --git a/ORFF_GUI/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java similarity index 77% rename from ORFF_GUI/VisualisatiePane.java rename to src/main/java/orfgui/VisualisatiePane.java index 7487fb9..1772e8b 100644 --- a/ORFF_GUI/VisualisatiePane.java +++ b/src/main/java/orfgui/VisualisatiePane.java @@ -1,35 +1,34 @@ -package ORFF_GUI; - -import java.awt.*; -import java.util.List; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; - -public class VisualisatiePane extends JPanel { - - @Override - protected void paintComponent(Graphics g) { - int firstline = 10; - super.paintComponent(g); - Graphics2D g2 = (Graphics2D) g; - g2.setColor(Color.WHITE); - g2.setStroke(new BasicStroke(2)); - List list = Reader.getLengths(); - for (Integer l:list){ - firstline = firstline + 30; - g.drawLine(10,10 + firstline,l-10,10 + firstline); - } - } - - //public static void createAndShowGui() { - // JFrame frame = new JFrame(); - // frame.add(new VisualisatiePane()); - // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // frame.setLocationByPlatform(true); - // frame.pack(); - // frame.setVisible(true); - - //} - +package orfgui; +import helpers.Reader; + +import javax.swing.*; +import java.awt.*; +import java.util.List; + +public class VisualisatiePane extends JPanel { + + @Override + protected void paintComponent(Graphics g) { + int firstline = 10; + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g; + g2.setColor(Color.WHITE); + g2.setStroke(new BasicStroke(2)); + List list = Reader.getLengths(); // todo solution + for (Integer l: list){ + firstline = firstline + 30; + g.drawLine(10,10 + firstline,l-10,10 + firstline); + } + } + + //public static void createAndShowGui() { + // JFrame frame = new JFrame(); + // frame.add(new VisualisatiePane()); + // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + // frame.setLocationByPlatform(true); + // frame.pack(); + // frame.setVisible(true); + + //} + } \ No newline at end of file diff --git a/DNA-512.png b/src/main/resources/DNA-512.png similarity index 100% rename from DNA-512.png rename to src/main/resources/DNA-512.png diff --git a/genes.gif b/src/main/resources/genes.gif similarity index 100% rename from genes.gif rename to src/main/resources/genes.gif diff --git a/hatebed.gif b/src/main/resources/hatebed.gif similarity index 100% rename from hatebed.gif rename to src/main/resources/hatebed.gif From 8c1025896081b6fe797f6c6941f0a0de086b6b84 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 14:38:40 +0200 Subject: [PATCH 13/43] added methods added some methods for gui usage --- src/main/java/orffinder/ORFFinder.java | 10 +++------- src/main/java/orffinder/Sequence.java | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java index 8b41a01..83e362b 100644 --- a/src/main/java/orffinder/ORFFinder.java +++ b/src/main/java/orffinder/ORFFinder.java @@ -345,14 +345,10 @@ public String getOrf(ORF orf) { } - public List getInfoForVisualisation() { - List num = new ArrayList<>(); - for (Sequence sequence : sequences) { - int length = (int) sequence.RealSize; - num.add(length); - } - return num; + public ArrayList getInfoForVisualisation() { + + return new ArrayList<>(sequences); } diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java index 7f0a1d3..5f7f660 100644 --- a/src/main/java/orffinder/Sequence.java +++ b/src/main/java/orffinder/Sequence.java @@ -12,6 +12,7 @@ public class Sequence implements Iterable { final long offset; // in file public long EndPos; public long RealSize; + private ArrayList tablelist; private ArrayList ORFList = new ArrayList(); private ArrayList[] ORFTrackers = new ArrayList[3]; @@ -56,7 +57,19 @@ public long getRealSize() { public Iterator iterator() { return ORFList.iterator(); } - + public ArrayList makeTable_list(){ + tablelist = new ArrayList(); + for(ORF orf:ORFList){ + String[] orfvalue = new String[5]; + orfvalue[0] = String.valueOf(SequenceID); + orfvalue[1] = String.valueOf(orf.getCounterStart()); + orfvalue[2] = String.valueOf(orf.counterEnd); + orfvalue[3] = String.valueOf(orf.getSize()); + orfvalue[4] = "sequence could be added"; + tablelist.add(orfvalue); + } + return tablelist; + } public String getStatistics() { long totalOrfLength = 0; long averageOrfLength = 0; From c93e33fcc4133b6d61eca080e7f7a950ad7532f7 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 14:40:58 +0200 Subject: [PATCH 14/43] more visualisation added a selection listner, rectangles voor orf kunnen gemaakt worden, and added a table bug met deze rectangles still there --- src/main/java/orfgui/ORFVisualiser.java | 119 ++++++++++++++++-- src/main/java/orfgui/Rectangle.java | 79 ++++++++++++ .../orfgui/SharedListSelectionHandler.java | 40 ++++++ src/main/java/orfgui/VisualisatiePane.java | 18 ++- 4 files changed, 240 insertions(+), 16 deletions(-) create mode 100644 src/main/java/orfgui/Rectangle.java create mode 100644 src/main/java/orfgui/SharedListSelectionHandler.java diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 3b22652..9298f5f 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -1,12 +1,17 @@ package orfgui; import helpers.Reader; +import orffinder.ORF; +import orffinder.Sequence; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.*; import java.io.*; +import java.util.ArrayList; import java.util.List; +import java.util.Random; public class ORFVisualiser extends JFrame { private JFrame mainFrame; @@ -17,6 +22,11 @@ public class ORFVisualiser extends JFrame { private JTextField pathToFile; private JTextArea textofFile; private JLabel jLabelEmptyHolderImage; + private ArrayList list; + private ArrayList reclist; + private JTable table; + private ListSelectionModel listSelectionModel; + Color black= new Color(43, 43, 43); Color lighter_black= new Color(60, 63, 65); Color DarkBlue= new Color(47, 79, 79); @@ -111,20 +121,41 @@ private void showFile() { controlPanel.add(displayfile,BorderLayout.CENTER); } + private ArrayList makeRec() { + System.out.println("im making more rectangles"); + + reclist = new ArrayList(); + int firstline = 10; + for (Sequence sequence : list) { + firstline = firstline + 30; + for (ORF orf : sequence) { + Random rand = new Random(); + int start = (int) orf.getCounterStart(); + int size = (int) orf.getSize(); + Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()); + Rectangle rec = new Rectangle(10 + start, firstline + 5, size, 10, randomColor); + reclist.add(rec); + } + } + System.out.println(reclist); + return reclist; + } private void ORFvisualisatie(){ Border blackline = BorderFactory.createLineBorder(Blue); - JPanel visScreen = new VisualisatiePane(); + JPanel visScreen = new VisualisatiePane(list,reclist); visScreen.setBackground(lighter_black); //visScreen.setBounds(5,240,970,685); - List list = Reader.getLengths(); + System.out.println("got lengths" + list.size()); int largest = 0; - for (int length : list) { - if (length > largest) { - largest = length; + for (Sequence sequence : list){ + int Length = (int) sequence.getRealSize(); + if (Length > largest) { + largest = Length; System.out.println(largest); + } } - } + System.out.println("largest"+ largest); visScreen.setPreferredSize(new Dimension(largest,685)); JScrollPane displayORF = new JScrollPane(visScreen); displayORF.setBorder(blackline); @@ -135,6 +166,64 @@ private void ORFvisualisatie(){ // TODO: 31-3-2020 make visualisation } + + private void ORFtable() { + DefaultTableModel tableModel = null; + ArrayList table_list = new ArrayList(); + if (table == null) { + String[] columnNames = {"ORF ID", "Start", "End", "Length", "Sequence ID"}; + tableModel = new DefaultTableModel(columnNames, 0); + + for (Sequence sequence : list) { + table_list = sequence.makeTable_list(); + for (String[] string : table_list) { + //System.out.println(Arrays.toString(string)); + tableModel.addRow(string); + } + table = new JTable(tableModel); + table.setModel(tableModel); + table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + tableModel.fireTableDataChanged(); + table.setCellSelectionEnabled(true); + table.repaint(); + //adding it to JScrollPane + JScrollPane sp = new JScrollPane(table); + //sp.repaint(); + sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + sp.setViewportView(table); + //controlPanel.repaint(); + listSelectionModel = table.getSelectionModel(); + listSelectionModel.addListSelectionListener( + new SharedListSelectionHandler() + ); + controlPanel.add(sp, BorderLayout.SOUTH); + } + } + if (table != null) { + tableModel = (DefaultTableModel) table.getModel(); + tableModel.setRowCount(0); + for (Sequence sequence : list) { + table_list = sequence.makeTable_list(); + for (String[] string : table_list) { + //System.out.println(Arrays.toString(string)); + tableModel.addRow(string); + } + table = new JTable(tableModel); + table.setCellSelectionEnabled(true); + table.setModel(tableModel); + table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + tableModel.fireTableDataChanged(); + table.repaint(); + //adding it to JScrollPane + JScrollPane sp = new JScrollPane(table); + //sp.repaint(); + sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + sp.setViewportView(table); + } + } + } private void showMenuDemo() { //create a menu bar final JMenuBar menuBar = new JMenuBar(); @@ -237,7 +326,7 @@ public void itemStateChanged(ItemEvent e) { } private void HolderImage(){ - ImageIcon image = new ImageIcon("src/main/resources/rhatebed.gif"); + ImageIcon image = new ImageIcon("src/main/resources/hatebed.gif"); jLabelEmptyHolderImage =new JLabel("",image,JLabel.CENTER); controlPanel.add(jLabelEmptyHolderImage,BorderLayout.SOUTH); } @@ -260,15 +349,19 @@ public void actionPerformed(ActionEvent e) { case "New": File file = Reader.FileChooser(); pathToFile.setText(String.valueOf(file)); -// try { // todo disabled due to memory issues -// FileDisplayer(file); -// } catch (IOException ex) { -// ex.printStackTrace(); -// } - ORFvisualisatie(); + try { // todo disabled due to memory issues + FileDisplayer(file); + } catch (IOException ex) { + ex.printStackTrace(); + } + list = Reader.getSeq_list(); + ORFtable(); + //reclist = makeRec(); + //ORFvisualisatie(); controlPanel.repaint(); controlPanel.remove(jLabelEmptyHolderImage); controlPanel.validate(); + break; case "Export": case "BLASTn": diff --git a/src/main/java/orfgui/Rectangle.java b/src/main/java/orfgui/Rectangle.java new file mode 100644 index 0000000..1df0908 --- /dev/null +++ b/src/main/java/orfgui/Rectangle.java @@ -0,0 +1,79 @@ +package orfgui; +import java.awt.*; + +public class Rectangle { + + private int width; + private int height; + private int xpos; + private int ypos; + private Color color; + + Rectangle() { + xpos = 1; + ypos = 1; + width = 1; + height = 1; + color = Color.WHITE; + + } + + Rectangle(int x, int y, int w, int h, Color c) { + xpos = x; + ypos = y; + width = w; + height = h; + color = c; + } + + public int getXpos() { + return xpos; + } + + public void setXpos(int x) { + xpos = x; + } + + public int getYpos() { + return ypos; + } + + public void setYpos(int y) { + ypos = y; + } + + public Color getColor() { + return color; + } + + public void setColor(Color c) { + color = c; + } + + public int getHeight() { + return height; + } + + public void setHeight(int h) { + height = h; + } + + public int getWidth() { + return width; + } + + public void setWidth(int w) { + width = w; + } + + @Override + public String toString() { + return "Rectangle{" + + "width=" + width + + ", height=" + height + + ", xpos=" + xpos + + ", ypos=" + ypos + + ", color=" + color + + '}'; + } +} diff --git a/src/main/java/orfgui/SharedListSelectionHandler.java b/src/main/java/orfgui/SharedListSelectionHandler.java new file mode 100644 index 0000000..a2b3ae0 --- /dev/null +++ b/src/main/java/orfgui/SharedListSelectionHandler.java @@ -0,0 +1,40 @@ +package orfgui; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.util.ArrayList; + +public class SharedListSelectionHandler implements ListSelectionListener { + private ArrayList indexlist; + + public void valueChanged(ListSelectionEvent e) { + indexlist = new ArrayList(); + System.out.println("i got input"); + ListSelectionModel lsm = (ListSelectionModel) e.getSource(); + + int firstIndex = e.getFirstIndex(); + int lastIndex = e.getLastIndex(); + boolean isAdjusting = e.getValueIsAdjusting(); + + if (lsm.isSelectionEmpty()) { + } else { + if (!isAdjusting) { + int minIndex = lsm.getMinSelectionIndex(); + int maxIndex = lsm.getMaxSelectionIndex(); + for (int i = minIndex; i <= maxIndex; i++) { + if (lsm.isSelectedIndex(i)) { + indexlist.add(i); + System.out.println(i); + } + } + } + } + } + + public ArrayList getIndexlist() { + return indexlist; + } +} + + diff --git a/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java index 1772e8b..9b0689f 100644 --- a/src/main/java/orfgui/VisualisatiePane.java +++ b/src/main/java/orfgui/VisualisatiePane.java @@ -1,12 +1,20 @@ package orfgui; import helpers.Reader; +import orffinder.Sequence; import javax.swing.*; import java.awt.*; +import java.util.ArrayList; import java.util.List; public class VisualisatiePane extends JPanel { + private ArrayList reclist; + private ArrayList seq_list; + VisualisatiePane(ArrayList list, ArrayList rectlist) { + seq_list = list; + reclist = rectlist; + } @Override protected void paintComponent(Graphics g) { int firstline = 10; @@ -14,10 +22,14 @@ protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.WHITE); g2.setStroke(new BasicStroke(2)); - List list = Reader.getLengths(); // todo solution - for (Integer l: list){ + for (Sequence s: seq_list){ + int size = (int) s.getRealSize(); firstline = firstline + 30; - g.drawLine(10,10 + firstline,l-10,10 + firstline); + g.drawLine(10,10 + firstline,size - 10,10 + firstline); + } + for (Rectangle rec : reclist) { + g.setColor(rec.getColor()); + g.drawRect(rec.getXpos(), rec.getYpos(), rec.getWidth(), rec.getHeight()); } } From b9e32dddc8a7140a5f4af38e91bfcca084b6c17b Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 14:51:59 +0200 Subject: [PATCH 15/43] edited makes more sense now --- src/main/java/helpers/Reader.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java index 8857512..ba34c24 100644 --- a/src/main/java/helpers/Reader.java +++ b/src/main/java/helpers/Reader.java @@ -1,10 +1,12 @@ package helpers; import orffinder.ORFFinder; +import orffinder.Sequence; import javax.swing.*; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.List; @@ -12,7 +14,7 @@ public class Reader { private static File file; private static ORFFinder orfFinder; - public static File FileChooser() { + public File FileChooser() { System.out.println("Reader.FileChooser() fired!"); // todo-debugprint JFileChooser jfc = new JFileChooser("."); jfc.setDialogTitle("Choose a directory to save your file: "); @@ -35,15 +37,13 @@ public static File FileChooser() { } orfFinder.findOrfs(); - + orfFinder.getallOrfs(); return file; } - public static List getLengths() { - int largest = 0; - List listoflengths = orfFinder.getInfoForVisualisation(); + public ArrayList getSeq_list() { - return listoflengths; + return orfFinder.getInfoForVisualisation(); } } From 11b2a6931f1ff7426be6c80fa6a02f7550af9377 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 14:53:01 +0200 Subject: [PATCH 16/43] compatibilty with reader fixed --- src/main/java/orfgui/ORFVisualiser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 9298f5f..9df4153 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -347,14 +347,15 @@ public void actionPerformed(ActionEvent e) { switch (actionEventName) { case "New": - File file = Reader.FileChooser(); + Reader reader = new Reader(); + File file = reader.FileChooser(); pathToFile.setText(String.valueOf(file)); try { // todo disabled due to memory issues FileDisplayer(file); } catch (IOException ex) { ex.printStackTrace(); } - list = Reader.getSeq_list(); + list = reader.getSeq_list(); ORFtable(); //reclist = makeRec(); //ORFvisualisatie(); From 58f716c2788f3129d37c33e1ec9d0571f8f27ea4 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 19:41:32 +0200 Subject: [PATCH 17/43] table functionality update when selecting a side panel will appear with a table. this table contains the ID and sequence of the selected orfs --- src/main/java/orfgui/ORFVisualiser.java | 140 ++++++++++++++++++------ 1 file changed, 107 insertions(+), 33 deletions(-) diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 9df4153..2e71e42 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -1,17 +1,19 @@ package orfgui; import helpers.Reader; import orffinder.ORF; +import orffinder.ORFFinder; import orffinder.Sequence; import javax.swing.*; import javax.swing.border.Border; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import java.awt.*; import java.awt.event.*; import java.io.*; -import java.util.ArrayList; +import java.util.*; import java.util.List; -import java.util.Random; public class ORFVisualiser extends JFrame { private JFrame mainFrame; @@ -19,6 +21,9 @@ public class ORFVisualiser extends JFrame { private JLabel statusLabel; private JPanel controlPanel; private JScrollPane displayfile; + private ORFFinder orfFinder; + private HashMap ORFlist; + private JTable selected_table; private JTextField pathToFile; private JTextArea textofFile; private JLabel jLabelEmptyHolderImage; @@ -63,7 +68,7 @@ private void prepareGUI() { setLookAndFeel(); mainFrame = new JFrame("orfgui"); mainFrame.setSize(1000, 1000); - mainFrame.setLayout(null); + mainFrame.setLayout(new BorderLayout(1,1)); mainFrame.getContentPane().setBackground(black); mainFrame.setIconImage(img); headerLabel = new JLabel("", JLabel.CENTER); @@ -80,7 +85,7 @@ public void windowClosing(WindowEvent windowEvent) { controlPanel.setLayout(new BorderLayout(10,10)); controlPanel.setBackground(black); //mainFrame.add(headerLabel); - mainFrame.add(controlPanel); + mainFrame.add(controlPanel,BorderLayout.CENTER); //mainFrame.add(statusLabel); controlPanel.setVisible(true); mainFrame.setVisible(true); @@ -157,6 +162,7 @@ private void ORFvisualisatie(){ } System.out.println("largest"+ largest); visScreen.setPreferredSize(new Dimension(largest,685)); + JScrollPane displayORF = new JScrollPane(visScreen); displayORF.setBorder(blackline); //displayORF.setBounds(5,240,970,685); @@ -171,20 +177,27 @@ private void ORFtable() { DefaultTableModel tableModel = null; ArrayList table_list = new ArrayList(); if (table == null) { - String[] columnNames = {"ORF ID", "Start", "End", "Length", "Sequence ID"}; + String[] columnNames = {"Sequence ID", "Start", "End", "Length", "ID", "parent Sequence"}; tableModel = new DefaultTableModel(columnNames, 0); + } + else{ + tableModel = (DefaultTableModel) table.getModel(); + int rows = selected_table.getRowCount(); + tableModel.fireTableRowsDeleted(0, rows - 1); + } for (Sequence sequence : list) { table_list = sequence.makeTable_list(); for (String[] string : table_list) { + //System.out.println(Arrays.toString(string)); tableModel.addRow(string); } table = new JTable(tableModel); + table.setCellSelectionEnabled(true); table.setModel(tableModel); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); tableModel.fireTableDataChanged(); - table.setCellSelectionEnabled(true); table.repaint(); //adding it to JScrollPane JScrollPane sp = new JScrollPane(table); @@ -192,37 +205,12 @@ private void ORFtable() { sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); sp.setViewportView(table); - //controlPanel.repaint(); listSelectionModel = table.getSelectionModel(); listSelectionModel.addListSelectionListener( new SharedListSelectionHandler() ); - controlPanel.add(sp, BorderLayout.SOUTH); - } - } - if (table != null) { - tableModel = (DefaultTableModel) table.getModel(); - tableModel.setRowCount(0); - for (Sequence sequence : list) { - table_list = sequence.makeTable_list(); - for (String[] string : table_list) { - //System.out.println(Arrays.toString(string)); - tableModel.addRow(string); - } - table = new JTable(tableModel); - table.setCellSelectionEnabled(true); - table.setModel(tableModel); - table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - tableModel.fireTableDataChanged(); - table.repaint(); - //adding it to JScrollPane - JScrollPane sp = new JScrollPane(table); - //sp.repaint(); - sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - sp.setViewportView(table); + controlPanel.add(sp,BorderLayout.SOUTH); } - } } private void showMenuDemo() { //create a menu bar @@ -324,7 +312,15 @@ public void itemStateChanged(ItemEvent e) { mainFrame.setJMenuBar(menuBar); mainFrame.setVisible(true); } - + private void MakeORFlist(){ + ORFlist = new HashMap<>(); + for(Sequence sequence : list){ + for(ORF orf : sequence){ + int ID = orf.getID(); + ORFlist.put(ID,orf); + } + } + } private void HolderImage(){ ImageIcon image = new ImageIcon("src/main/resources/hatebed.gif"); jLabelEmptyHolderImage =new JLabel("",image,JLabel.CENTER); @@ -338,7 +334,79 @@ private void FileDisplayer(File file) throws IOException { file))); textofFile.read(input, "READING FILE :)"); } + private void MakeSidePanel(ArrayList indexlist){ + MakeORFlist(); + DefaultTableModel tableModel = null; + JPanel sidepanel = new JPanel(); + if ( selected_table == null) { + String[] columnNames = {"ID", "Sequence"}; + tableModel = new DefaultTableModel(columnNames, 0); + } + else{ + sidepanel.remove(selected_table); + + tableModel = (DefaultTableModel) selected_table.getModel(); + tableModel.setRowCount(0); + } + for(String index : indexlist){ + ORF orf = ORFlist.get(Integer.parseInt(index)); + String sequence = orfFinder.getOrf(orf); + String[] value = new String[3]; + value[0] = index; + value[1] = sequence; + tableModel.addRow(value); + + } + selected_table = new JTable(tableModel); + selected_table.setModel(tableModel); + tableModel.fireTableDataChanged(); + selected_table.repaint(); + System.out.println(indexlist); + + sidepanel.setBackground(DarkBlue); + sidepanel.setLayout(new BorderLayout(5,5)); + sidepanel.setPreferredSize(new Dimension(300,1000)); + + selected_table.setPreferredSize(new Dimension(1000,300)); + + JScrollPane selected_table_scrollpane = new JScrollPane(); + selected_table_scrollpane.setViewportView(selected_table); + sidepanel.add(selected_table_scrollpane,BorderLayout.NORTH); + + sidepanel.validate(); + sidepanel.repaint(); + mainFrame.add(sidepanel, BorderLayout.EAST); + mainFrame.validate(); + mainFrame.repaint(); + } + class SharedListSelectionHandler implements ListSelectionListener { + public void valueChanged(ListSelectionEvent e) { + ArrayList indexlist = new ArrayList<>(); + ListSelectionModel lsm = (ListSelectionModel) e.getSource(); + + int firstIndex = e.getFirstIndex(); + int lastIndex = e.getLastIndex(); + boolean isAdjusting = e.getValueIsAdjusting(); + if (lsm.isSelectionEmpty()) { + } else { + if (!isAdjusting) { + int minIndex = lsm.getMinSelectionIndex(); + int maxIndex = lsm.getMaxSelectionIndex(); + for (int i = minIndex; i <= maxIndex; i++) { + if (lsm.isSelectedIndex(i)) { + String index = (String) table.getValueAt(i, 4); + indexlist.add(index); + MakeSidePanel(indexlist); + + } + } + + } + + } + } + } class MenuItemListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) @@ -349,6 +417,12 @@ public void actionPerformed(ActionEvent e) { case "New": Reader reader = new Reader(); File file = reader.FileChooser(); + try { + orfFinder = new ORFFinder(file); + orfFinder.findOrfs(); + } catch (IOException ex) { + ex.printStackTrace(); + } pathToFile.setText(String.valueOf(file)); try { // todo disabled due to memory issues FileDisplayer(file); From 47182cc9004ba8a006f1d1bf4e0e34c2c2f1a568 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 19:42:39 +0200 Subject: [PATCH 18/43] compatibilty with table --- src/main/java/orffinder/ORF.java | 15 ++++++++++++++- src/main/java/orffinder/Sequence.java | 11 ++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java index 648648b..ae470be 100644 --- a/src/main/java/orffinder/ORF.java +++ b/src/main/java/orffinder/ORF.java @@ -7,9 +7,19 @@ public class ORF { private long counterStart; // relative counter to dna public long counterEnd; // relative counter to dna without the fucking linefeeds -public ORF(long position, long charCounter) { + // currently testing + public Sequence parentSequence; + private int ID; + static int orfsmade = 0; + +public ORF(long position, long charCounter, Sequence parent) { + offset = position; counterStart = charCounter; + + // currently testing (speed) + parentSequence = parent; + ID = orfsmade++; } public long getSize() { @@ -28,6 +38,9 @@ public long getEndpos() { return endpos; } + public int getID(){ + return ID; + } } diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java index 5f7f660..e59c231 100644 --- a/src/main/java/orffinder/Sequence.java +++ b/src/main/java/orffinder/Sequence.java @@ -31,7 +31,7 @@ public Sequence(String currHeader, int currentTextLine, int position) { public void addNewORF(long position, long charCounter, int modulo) { //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist - ORFTrackers[modulo].add(new ORF(position, charCounter)); + ORFTrackers[modulo].add(new ORF(position, charCounter, this)); } public void updateORFs(long endPos, long charCounter, int modulo) { @@ -59,13 +59,15 @@ public Iterator iterator() { } public ArrayList makeTable_list(){ tablelist = new ArrayList(); + int orfIdMaker = 0; for(ORF orf:ORFList){ - String[] orfvalue = new String[5]; + String[] orfvalue = new String[6]; orfvalue[0] = String.valueOf(SequenceID); orfvalue[1] = String.valueOf(orf.getCounterStart()); orfvalue[2] = String.valueOf(orf.counterEnd); orfvalue[3] = String.valueOf(orf.getSize()); - orfvalue[4] = "sequence could be added"; + orfvalue[4] = String.valueOf(orfIdMaker++); + orfvalue[5] = String.valueOf(orf.parentSequence); tablelist.add(orfvalue); } return tablelist; @@ -114,6 +116,9 @@ public String getStatistics() { statistics.append(" RealSize=").append(o.getSize()); statistics.append(" StartCounter=").append(o.getCounterStart()); statistics.append(" EndCounter=").append(o.counterEnd); + statistics.append(" ID: ").append(o.getID()); + statistics.append(" PARENT: ").append(o.parentSequence); + } statistics.append(" totalOrfLength=").append(totalOrfLength); From b8b60f1c204fb587e732ddfd99e06ae111ca7720 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Wed, 8 Apr 2020 20:54:44 +0200 Subject: [PATCH 19/43] fixed bugs in select table --- src/main/java/orffinder/Sequence.java | 2 +- src/main/java/orfgui/ORFVisualiser.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java index e59c231..e1c4585 100644 --- a/src/main/java/orffinder/Sequence.java +++ b/src/main/java/orffinder/Sequence.java @@ -66,7 +66,7 @@ public ArrayList makeTable_list(){ orfvalue[1] = String.valueOf(orf.getCounterStart()); orfvalue[2] = String.valueOf(orf.counterEnd); orfvalue[3] = String.valueOf(orf.getSize()); - orfvalue[4] = String.valueOf(orfIdMaker++); + orfvalue[4] = String.valueOf(orf.getID()); orfvalue[5] = String.valueOf(orf.parentSequence); tablelist.add(orfvalue); } diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 2e71e42..ab3929a 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -24,6 +24,7 @@ public class ORFVisualiser extends JFrame { private ORFFinder orfFinder; private HashMap ORFlist; private JTable selected_table; + private JPanel sidepanel; private JTextField pathToFile; private JTextArea textofFile; private JLabel jLabelEmptyHolderImage; @@ -181,9 +182,9 @@ private void ORFtable() { tableModel = new DefaultTableModel(columnNames, 0); } else{ + tableModel = (DefaultTableModel) table.getModel(); - int rows = selected_table.getRowCount(); - tableModel.fireTableRowsDeleted(0, rows - 1); + tableModel.setRowCount(0); } for (Sequence sequence : list) { @@ -335,27 +336,25 @@ private void FileDisplayer(File file) throws IOException { textofFile.read(input, "READING FILE :)"); } private void MakeSidePanel(ArrayList indexlist){ - MakeORFlist(); DefaultTableModel tableModel = null; - JPanel sidepanel = new JPanel(); + sidepanel = new JPanel(); if ( selected_table == null) { String[] columnNames = {"ID", "Sequence"}; tableModel = new DefaultTableModel(columnNames, 0); } else{ sidepanel.remove(selected_table); - tableModel = (DefaultTableModel) selected_table.getModel(); tableModel.setRowCount(0); } for(String index : indexlist){ ORF orf = ORFlist.get(Integer.parseInt(index)); + String sequence = orfFinder.getOrf(orf); String[] value = new String[3]; value[0] = index; value[1] = sequence; tableModel.addRow(value); - } selected_table = new JTable(tableModel); selected_table.setModel(tableModel); @@ -396,12 +395,12 @@ public void valueChanged(ListSelectionEvent e) { for (int i = minIndex; i <= maxIndex; i++) { if (lsm.isSelectedIndex(i)) { String index = (String) table.getValueAt(i, 4); + System.out.println(index); indexlist.add(index); - MakeSidePanel(indexlist); } } - + MakeSidePanel(indexlist); } } @@ -430,6 +429,7 @@ public void actionPerformed(ActionEvent e) { ex.printStackTrace(); } list = reader.getSeq_list(); + MakeORFlist(); ORFtable(); //reclist = makeRec(); //ORFvisualisatie(); From 46e496a267fdbccc46903d5edd36eb70943bb6de Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 00:25:48 +0200 Subject: [PATCH 20/43] start ORFBLaster and FastaConverter --- .idea/workspace.xml | 25 +++++++++++++++++-- src/main/java/blast/ORFBlaster.java | 21 ++++++++++++++++ src/main/java/helpers/FastaConverter.java | 24 ++++++++++++++++++ .../java/HelperTests/TestFastaConverter.java | 19 ++++++++++++++ .../java/ORFFinderTests/TestCreatingORFs.java | 8 ++++++ 5 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blast/ORFBlaster.java create mode 100644 src/main/java/helpers/FastaConverter.java create mode 100644 src/test/java/HelperTests/TestFastaConverter.java create mode 100644 src/test/java/ORFFinderTests/TestCreatingORFs.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 6e2e2d3..f99eb07 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,21 +1,40 @@ - + + + + + + + + + + + + + + + @@ -75,7 +94,9 @@ - + + diff --git a/src/main/java/blast/ORFBlaster.java b/src/main/java/blast/ORFBlaster.java new file mode 100644 index 0000000..6e09d87 --- /dev/null +++ b/src/main/java/blast/ORFBlaster.java @@ -0,0 +1,21 @@ +package blast; + +import javax.management.InstanceAlreadyExistsException; + +public class ORFBlaster { + + + boolean ORFBlasterMade = false; + + public ORFBlaster() throws InstanceAlreadyExistsException { + + if (!ORFBlasterMade) { + + } else { + throw new InstanceAlreadyExistsException("Only one ORFBlaster should exist at any time"); + } + } + + + +} diff --git a/src/main/java/helpers/FastaConverter.java b/src/main/java/helpers/FastaConverter.java new file mode 100644 index 0000000..adc6db2 --- /dev/null +++ b/src/main/java/helpers/FastaConverter.java @@ -0,0 +1,24 @@ +package helpers; + +public class FastaConverter { + + private String filename; + + public FastaConverter() { + this("\\data\\Fasta"); + } + + public FastaConverter(String filename) { + filename = filename; + } + + + public void orfToFasta() { + orfToFasta(filename); + } + + public void orfToFasta(String filename) { + + } + +} diff --git a/src/test/java/HelperTests/TestFastaConverter.java b/src/test/java/HelperTests/TestFastaConverter.java new file mode 100644 index 0000000..899245e --- /dev/null +++ b/src/test/java/HelperTests/TestFastaConverter.java @@ -0,0 +1,19 @@ +package HelperTests; + +import helpers.FastaConverter; +import orffinder.Sequence; + +// todo test setting file somewhere randomly in pc, already existing files, non-text files... +// ... overwrite mode? ... god so many things to account for and we haven't even scraped the surface +public class TestFastaConverter { + + public static void main(String[] args) { + + FastaConverter fc = new FastaConverter(); + + Sequence seq = new Sequence("sequence 1", 0, 0); + seq.EndPos = 100; + seq.RealSize= 90; + + } +} diff --git a/src/test/java/ORFFinderTests/TestCreatingORFs.java b/src/test/java/ORFFinderTests/TestCreatingORFs.java new file mode 100644 index 0000000..f44ff84 --- /dev/null +++ b/src/test/java/ORFFinderTests/TestCreatingORFs.java @@ -0,0 +1,8 @@ +package ORFFinderTests; + + +/** + * Class to create 2 sequences both with 2 orfs + */ +public class TestCreatingORFs { +} From a91afab2d3c4adf3fdc8ad76704d857d23b0f913 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 03:29:01 +0200 Subject: [PATCH 21/43] Blast functionality part 1 --- .idea/uiDesigner.xml | 124 ++ .idea/workspace.xml | 39 +- blastOutput.xml | 1386 +++++++++++++++++ src/main/java/blast/ORFBlaster.java | 89 +- .../java/BlastTests/TestBlastProgramEnum.java | 19 + src/test/java/BlastTests/TestORFBlaster.java | 16 + 6 files changed, 1664 insertions(+), 9 deletions(-) create mode 100644 .idea/uiDesigner.xml create mode 100644 blastOutput.xml create mode 100644 src/test/java/BlastTests/TestBlastProgramEnum.java create mode 100644 src/test/java/BlastTests/TestORFBlaster.java diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..e96534f --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index f99eb07..2f53a62 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,8 @@ - - + - + + + + + + + + + + + + diff --git a/blastOutput.xml b/blastOutput.xml new file mode 100644 index 0000000..899c876 --- /dev/null +++ b/blastOutput.xml @@ -0,0 +1,1386 @@ + + + + blastn + BLASTN 2.10.0+ + Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), "Gapped BLAST and PSI-BLAST: a new generation of protein database search programs", Nucleic Acids Res. 25:3389-3402. + nt + Query_65393 + No definition line + 73 + + + 10 + 2 + -3 + 5 + 2 + L;m; + + + + + 1 + Query_65393 + No definition line + 73 + + + 1 + gi|1147572706|ref|XM_020234422.1| + PREDICTED: Ananas comosus protein LE25-like (LOC109711408), mRNA + XM_020234422 + 788 + + + 1 + 48.1739 + 52 + 0.0321691 + 6 + 47 + 626 + 584 + 1 + -1 + 37 + 37 + 1 + 43 + AAACGACATAATCGATCGATGCATGTA-ATATATATAGCTAGC + AAAGGACGTACTCGATCGATATATGTATATATATATAGCTAGC + ||| ||| || ||||||||| ||||| ||||||||||||||| + + + + + 2 + gi|1695378363|emb|LR597565.1| + Myripristis murdjan genome assembly, chromosome: 16 + LR597565 + 34798541 + + + 1 + 45.4688 + 49 + 0.3919 + 24 + 55 + 26832830 + 26832861 + 1 + 1 + 29 + 29 + 0 + 32 + ATGCATGTAATATATATAGCTAGCTAGCAGAT + ATGCATGTAATATAACTAGCTAGCTAACAGAT + |||||||||||||| |||||||||| ||||| + + + + + 3 + gi|1443043166|ref|XM_015792939.2| + PREDICTED: Oryza sativa Japonica Group flowering-promoting factor 1-like protein 2 (LOC4326826), mRNA + XM_015792939 + 1357 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 500 + 538 + 1 + 1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 4 + gi|1189419115|gb|CP018157.1| + Oryza sativa Indica Group cultivar Shuhui498 chromosome 1 sequence + CP018157 + 44361539 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 42016425 + 42016387 + 1 + -1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 5 + gi|937893927|dbj|AP014957.1| + Oryza sativa Japonica Group DNA, chromosome 1, cultivar: Nipponbare, complete sequence + AP014957 + 43270923 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 40943079 + 40943041 + 1 + -1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 6 + gi|932283207|gb|CP012616.1| + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 8 sequence + CP012616 + 28124818 + + + 1 + 44.5672 + 48 + 0.3919 + 16 + 60 + 26381930 + 26381885 + 1 + -1 + 38 + 38 + 1 + 46 + ATCGATCG-ATGCATGTAATATATATAGCTAGCTAGCAGATGCTAG + ATCGATCGGATACATGCGCTATATATAGCTAGCTAGCACTAGCTAG + |||||||| || |||| ||||||||||||||||||| ||||| + + + + + 7 + gi|932282494|gb|CP012609.1| + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 1 sequence + CP012609 + 44526634 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 42244183 + 42244145 + 1 + -1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 8 + gi|156765894|dbj|AK289267.1| + Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert sequence + AK289267 + 2399 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 21 + 59 + 1 + 1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 9 + gi|116013028|dbj|AK243663.1| + Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert sequence + AK243663 + 3045 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 21 + 59 + 1 + 1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 10 + gi|21104640|dbj|AP003246.3| + Oryza sativa Japonica Group genomic DNA, chromosome 1, PAC clone:P0423A12 + AP003246 + 178649 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 63863 + 63825 + 1 + -1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 11 + gi|1228964083|ref|XM_022189663.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X6, mRNA + XM_022189663 + 4477 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 12 + gi|1228964081|ref|XM_022189662.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X5, mRNA + XM_022189662 + 4534 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 13 + gi|1228964079|ref|XM_022189661.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X4, mRNA + XM_022189661 + 4594 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 14 + gi|1228964077|ref|XM_022189660.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X3, mRNA + XM_022189660 + 4708 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 15 + gi|1228964075|ref|XM_022189659.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X2, mRNA + XM_022189659 + 4594 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 16 + gi|1228964073|ref|XM_022189658.1| + PREDICTED: Acanthochromis polyacanthus EH domain binding protein 1 (ehbp1), transcript variant X1, mRNA + XM_022189658 + 4711 + + + 1 + 43.6655 + 47 + 1.36787 + 41 + 66 + 226 + 201 + 1 + -1 + 25 + 25 + 0 + 26 + AGCTAGCTAGCAGATGCTAGTCGACG + AGCTAGCTAGCCGATGCTAGTCGACG + ||||||||||| |||||||||||||| + + + + + 17 + gi|937906879|dbj|AP014959.1| + Oryza sativa Japonica Group DNA, chromosome 3, cultivar: Nipponbare, complete sequence + AP014959 + 36413819 + + + 1 + 43.6655 + 47 + 1.36787 + 16 + 54 + 15308603 + 15308644 + 1 + 1 + 37 + 37 + 3 + 42 + ATCGATCGAT-GCATGT-AATA-TATATAGCTAGCTAGCAGA + ATCGATCGATTGCATGTGAATCCTAAATAGCTAGCTAGCAGA + |||||||||| |||||| ||| || |||||||||||||||| + + + + + 18 + gi|44681488|gb|AC146521.2| + Oryza sativa chromosome 3 B1246D11 genomic sequence, complete sequence + AC146521 + 43277 + + + 1 + 43.6655 + 47 + 1.36787 + 16 + 54 + 40280 + 40239 + 1 + -1 + 37 + 37 + 3 + 42 + ATCGATCGAT-GCATGT-AATA-TATATAGCTAGCTAGCAGA + ATCGATCGATTGCATGTGAATCCTAAATAGCTAGCTAGCAGA + |||||||||| |||||| ||| || |||||||||||||||| + + + + + 19 + gi|18201762|gb|AC091733.3| + Genomic sequence for Oryza sativa, Nipponbare strain, clone OSJNBa0048F08, from chromosome 3, complete sequence + AC091733 + 155790 + + + 1 + 43.6655 + 47 + 1.36787 + 16 + 54 + 7986 + 7945 + 1 + -1 + 37 + 37 + 3 + 42 + ATCGATCGAT-GCATGT-AATA-TATATAGCTAGCTAGCAGA + ATCGATCGATTGCATGTGAATCCTAAATAGCTAGCTAGCAGA + |||||||||| |||||| ||| || |||||||||||||||| + + + + + 20 + gi|60301588|gb|AC147869.3| + Monodelphis domestica clone VMRC6-113K21, complete sequence + AC147869 + 157763 + + + 1 + 43.6655 + 47 + 1.36787 + 24 + 49 + 74085 + 74110 + 1 + 1 + 25 + 25 + 0 + 26 + ATGCATGTAATATATATAGCTAGCTA + ATGCATGTAGTATATATAGCTAGCTA + ||||||||| |||||||||||||||| + + + + + 21 + gi|1431907554|gb|CP030984.1| + Arachis hypogaea cultivar Shitouqi chromosome A02 + CP030984 + 99791824 + + + 1 + 42.7638 + 46 + 1.36787 + 28 + 55 + 70794261 + 70794288 + 1 + 1 + 26 + 26 + 0 + 28 + ATGTAATATATATAGCTAGCTAGCAGAT + ATATAATGTATATAGCTAGCTAGCAGAT + || |||| |||||||||||||||||||| + + + + + 22 + gi|1394724398|ref|XM_025185923.1| + PREDICTED: Pelodiscus sinensis pre-mRNA processing factor 40 homolog A (PRPF40A), mRNA + XM_025185923 + 4431 + + + 1 + 42.7638 + 46 + 1.36787 + 23 + 52 + 3416 + 3388 + 1 + -1 + 28 + 28 + 1 + 30 + GATGCATGTAATATATATAGCTAGCTAGCA + GATGCATGTAATATATAT-GCTATCTAGCA + |||||||||||||||||| |||| |||||| + + + + + 23 + gi|1614056729|emb|LR584431.1| + Salmo trutta genome assembly, chromosome: 16 + LR584431 + 61349433 + + + 1 + 41.8621 + 45 + 4.77432 + 27 + 51 + 56461638 + 56461614 + 1 + -1 + 24 + 24 + 0 + 25 + CATGTAATATATATAGCTAGCTAGC + CATGTAATATGTATAGCTAGCTAGC + |||||||||| |||||||||||||| + + + + + 24 + gi|1177648178|dbj|AP011474.1| + Oryza brachyantha genomic DNA, chromosome 6, BAC clone: OB_Ba0011H08, strain: IRGC 101232 + AP011474 + 131221 + + + 1 + 41.8621 + 45 + 4.77432 + 27 + 51 + 34172 + 34148 + 1 + -1 + 24 + 24 + 0 + 25 + CATGTAATATATATAGCTAGCTAGC + CATATAATATATATAGCTAGCTAGC + ||| ||||||||||||||||||||| + + + + + 25 + gi|1177648157|dbj|AP011473.1| + Oryza brachyantha genomic DNA, chromosome 6, BAC clone: OB_Ba0080O08, strain: IRGC 101232 + AP011473 + 124874 + + + 1 + 41.8621 + 45 + 4.77432 + 27 + 51 + 112830 + 112806 + 1 + -1 + 24 + 24 + 0 + 25 + CATGTAATATATATAGCTAGCTAGC + CATATAATATATATAGCTAGCTAGC + ||| ||||||||||||||||||||| + + + + + 26 + gi|1002859316|ref|XM_006655748.2| + PREDICTED: Oryza brachyantha protein HEADING DATE 3A (LOC102709849), mRNA + XM_006655748 + 1110 + + + 1 + 41.8621 + 45 + 4.77432 + 27 + 51 + 846 + 822 + 1 + -1 + 24 + 24 + 0 + 25 + CATGTAATATATATAGCTAGCTAGC + CATATAATATATATAGCTAGCTAGC + ||| ||||||||||||||||||||| + + + + + 27 + gi|937928473|dbj|AP014964.1| + Oryza sativa Japonica Group DNA, chromosome 8, cultivar: Nipponbare, complete sequence + AP014964 + 28443022 + + + 1 + 41.8621 + 45 + 4.77432 + 16 + 51 + 26848579 + 26848543 + 1 + -1 + 32 + 32 + 1 + 37 + ATCGATCG-ATGCATGTAATATATATAGCTAGCTAGC + ATCGATCGGATACATGCGCTATATATAGCTAGCTAGC + |||||||| || |||| |||||||||||||||||| + + + + + 28 + gi|924563519|gb|CP012528.1| + Drosophila busckii chromosome X sequence + CP012528 + 23724088 + + + 1 + 41.8621 + 45 + 4.77432 + 13 + 49 + 49158 + 49193 + 1 + 1 + 32 + 32 + 1 + 37 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTA + ATAATAGATATATGCATATA-TATATATAGCTAGCTA + ||||| ||| |||||| || |||||||||||||||| + + + + + 29 + gi|764574189|ref|XM_004297107.2| + PREDICTED: Fragaria vesca subsp. vesca nudix hydrolase 1-like (LOC101310019), mRNA + XM_004297107 + 729 + + + 1 + 41.8621 + 45 + 4.77432 + 32 + 56 + 560 + 536 + 1 + -1 + 24 + 24 + 0 + 25 + AATATATATAGCTAGCTAGCAGATG + AATATATATAGCTAGCTAGCAGCTG + |||||||||||||||||||||| || + + + + + 30 + gi|45736068|dbj|AP005439.3| + Oryza sativa Japonica Group genomic DNA, chromosome 8, BAC clone:OSJNBa0033D24 + AP005439 + 186132 + + + 1 + 41.8621 + 45 + 4.77432 + 16 + 51 + 184679 + 184643 + 1 + -1 + 32 + 32 + 1 + 37 + ATCGATCG-ATGCATGTAATATATATAGCTAGCTAGC + ATCGATCGGATACATGCGCTATATATAGCTAGCTAGC + |||||||| || |||| |||||||||||||||||| + + + + + 31 + gi|38175526|dbj|AP004464.3| + Oryza sativa Japonica Group genomic DNA, chromosome 8, PAC clone:P0665C04 + AP004464 + 177054 + + + 1 + 41.8621 + 45 + 4.77432 + 16 + 51 + 104127 + 104091 + 1 + -1 + 32 + 32 + 1 + 37 + ATCGATCG-ATGCATGTAATATATATAGCTAGCTAGC + ATCGATCGGATACATGCGCTATATATAGCTAGCTAGC + |||||||| || |||| |||||||||||||||||| + + + + + 32 + gi|1820206971|emb|LR778276.1| + Coregonus sp. 'balchen' genome assembly, chromosome: 24 + LR778276 + 50329371 + + + 1 + 40.9604 + 44 + 4.77432 + 40 + 66 + 36312859 + 36312885 + 1 + 1 + 25 + 25 + 0 + 27 + TAGCTAGCTAGCAGATGCTAGTCGACG + TAGCTAGCTAGCAGATGCTAGCGGACG + ||||||||||||||||||||| |||| + + + + + 33 + gi|1727324785|gb|CP032572.1| + Gossypium turneri isolate D10-2 chromosome D10_02 + CP032572 + 50570303 + + + 1 + 40.9604 + 44 + 4.77432 + 15 + 48 + 49864947 + 49864915 + 1 + -1 + 30 + 30 + 1 + 34 + AATCGATCGATGCATGTAATATATATAGCTAGCT + AATCGATC-ATGCATATAATATATATATATAGCT + |||||||| |||||| ||||||||||| ||||| + + + + + 34 + gi|1614056713|emb|LR584415.1| + Salmo trutta genome assembly, chromosome: 15 + LR584415 + 66900148 + + + 1 + 40.9604 + 44 + 4.77432 + 30 + 56 + 47518230 + 47518204 + 1 + -1 + 25 + 25 + 0 + 27 + GTAATATATATAGCTAGCTAGCAGATG + GTAATATGTATAGCTAGCTAGCTGATG + ||||||| |||||||||||||| |||| + + + + + 35 + gi|1593087303|emb|LR132023.2| + Betta splendens genome assembly, chromosome: 9 + LR132023 + 32137567 + + + 1 + 40.9604 + 44 + 4.77432 + 41 + 62 + 15525750 + 15525729 + 1 + -1 + 22 + 22 + 0 + 22 + AGCTAGCTAGCAGATGCTAGTC + AGCTAGCTAGCAGATGCTAGTC + |||||||||||||||||||||| + + + + + 36 + gi|1539176573|emb|LR132038.1| + Anabas testudineus genome assembly, chromosome: 9 + LR132038 + 28519589 + + + 1 + 40.9604 + 44 + 4.77432 + 41 + 62 + 4993861 + 4993840 + 1 + -1 + 22 + 22 + 0 + 22 + AGCTAGCTAGCAGATGCTAGTC + AGCTAGCTAGCAGATGCTAGTC + |||||||||||||||||||||| + + + + + 37 + gi|1560905426|gb|CP032301.1| + Anopheles stephensi strain Indian chromosome 3R + CP032301 + 43030556 + + + 1 + 40.9604 + 44 + 4.77432 + 7 + 45 + 23947586 + 23947549 + 1 + -1 + 33 + 33 + 1 + 39 + AACGACATAATCGATCGATGCATGTAATATATATAGCTA + AACG-CATAGCCGAGCGATGCATGTAAAAAATATAGCTA + |||| |||| ||| |||||||||||| | ||||||||| + + + + + 38 + gi|1331035489|emb|LT972198.1| + Larimichthys crocea genome assembly, chromosome: IX + LT972198 + 31309394 + + + 1 + 40.9604 + 44 + 4.77432 + 41 + 62 + 9058367 + 9058346 + 1 + -1 + 22 + 22 + 0 + 22 + AGCTAGCTAGCAGATGCTAGTC + AGCTAGCTAGCAGATGCTAGTC + |||||||||||||||||||||| + + + + + 39 + gi|1189419123|gb|CP018165.1| + Oryza sativa Indica Group cultivar Shuhui498 chromosome 9 sequence + CP018165 + 24760661 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 13522677 + 13522705 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + 40 + gi|1070251772|emb|LT594626.1| + Plasmodium malariae genome assembly, chromosome: 5 + LT594626 + 1887012 + + + 1 + 40.9604 + 44 + 4.77432 + 13 + 44 + 295943 + 295974 + 1 + 1 + 28 + 28 + 0 + 32 + ATAATCGATCGATGCATGTAATATATATAGCT + ATAAACAATCCATCCATGTAATATATATAGCT + |||| | ||| || |||||||||||||||||| + + + + + 41 + gi|937931852|dbj|AP014965.1| + Oryza sativa Japonica Group DNA, chromosome 9, cultivar: Nipponbare, complete sequence + AP014965 + 23012720 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 12226984 + 12227012 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + 42 + gi|916354808|gb|KT384371.1| + Oryza sativa hypothetical protein (LOC_Os09g20360), hypothetical protein (LOC_Os09g20370), hypothetical protein (LOC_Os09g20380), hypothetical protein (LOC_Os09g20390), and hypothetical protein (LOC_Os09g20400) genes, complete cds + KT384371 + 46463 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 9222 + 9250 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + 43 + gi|932283291|gb|CP012617.1| + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 9 sequence + CP012617 + 20520899 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 9730502 + 9730530 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + 44 + gi|663673455|emb|HG975449.1| + Solanum pennellii chromosome ch10, complete genome + HG975449 + 82529941 + + + 1 + 40.9604 + 44 + 4.77432 + 2 + 35 + 16288230 + 16288262 + 1 + 1 + 30 + 30 + 1 + 34 + TTATAAACGACATAATCGATCGATGCATGTAATA + TTCTAAACGAAATAATT-ATCGATGCATGTAATA + || ||||||| ||||| |||||||||||||||| + + + + + 45 + gi|657529838|ref|XM_008297637.1| + PREDICTED: Stegastes partitus ankyrin repeat and LEM domain containing 2 (ankle2), transcript variant X4, mRNA + XM_008297637 + 4935 + + + 1 + 40.9604 + 44 + 4.77432 + 41 + 62 + 169 + 190 + 1 + 1 + 22 + 22 + 0 + 22 + AGCTAGCTAGCAGATGCTAGTC + AGCTAGCTAGCAGATGCTAGTC + |||||||||||||||||||||| + + + + + 46 + gi|519687763|gb|JX581658.1| + Gossypium hirsutum clone NBRI_GE14330 microsatellite sequence + JX581658 + 359 + + + 1 + 40.9604 + 44 + 4.77432 + 15 + 48 + 320 + 288 + 1 + -1 + 30 + 30 + 1 + 34 + AATCGATCGATGCATGTAATATATATAGCTAGCT + AATCGATC-ATGCATATAATATATATATATAGCT + |||||||| |||||| ||||||||||| ||||| + + + + + 47 + gi|49388773|dbj|AP005580.3| + Oryza sativa Japonica Group genomic DNA, chromosome 9, BAC clone:OJ1759_F09 + AP005580 + 149501 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 84692 + 84720 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + 48 + gi|39725620|dbj|AP005525.2| + Oryza sativa Japonica Group genomic DNA, chromosome 9, PAC clone:P0564H06 + AP005525 + 146823 + + + 1 + 40.9604 + 44 + 4.77432 + 24 + 51 + 107612 + 107640 + 1 + 1 + 27 + 27 + 1 + 29 + ATGCATGTA-ATATATATAGCTAGCTAGC + ATGCATGTACACATATATAGCTAGCTAGC + ||||||||| | ||||||||||||||||| + + + + + + + 57063983 + 222477093 + 0 + 0 + 0.41 + 0.625 + 0.78 + + + + + diff --git a/src/main/java/blast/ORFBlaster.java b/src/main/java/blast/ORFBlaster.java index 6e09d87..616f7dc 100644 --- a/src/main/java/blast/ORFBlaster.java +++ b/src/main/java/blast/ORFBlaster.java @@ -1,21 +1,98 @@ package blast; -import javax.management.InstanceAlreadyExistsException; +import orffinder.ORF; +import org.biojava.nbio.core.sequence.io.util.IOUtils; +import org.biojava.nbio.ws.alignment.qblast.*; + +import java.io.*; +import java.util.List; + + +/** todo SEPARATE to different thread (run blasts in background) + * - [ ] method to blasts ORFs + * - [ ] methods (elsewhere) to store blast results ( maybe a custom blastresult object ) + * * [ ] (optional) implement independenlty --> A JFrame (extend) with some methods + */ + public class ORFBlaster { boolean ORFBlasterMade = false; - public ORFBlaster() throws InstanceAlreadyExistsException { - if (!ORFBlasterMade) { + private static final String BLAST_OUTPUT_FILE = "blastOutput.xml"; // todo filenotfound error if subdirectory ( now outputs to project folder ) + + NCBIQBlastService service = new NCBIQBlastService(); + NCBIQBlastAlignmentProperties queryProperties = new NCBIQBlastAlignmentProperties(); + NCBIQBlastOutputProperties outputProperties = new NCBIQBlastOutputProperties(); + + + public ORFBlaster() { + this("MJ.Lambers@student.han.nl"); // todo deprecate this + } + + public ORFBlaster(String email) { + + // todo implement email gui or something + service.setEmail(email); + /** + * important todo/think about: singleton. Never should there ever be 2 blasts running at once + */ - } else { - throw new InstanceAlreadyExistsException("Only one ORFBlaster should exist at any time"); - } } + public void blastORFselection(List orfs) { +// +// props.setBlastProgram(BlastProgramEnum.blastp); +// blastService. + } + + /** + * less generic, hardcoded blast-db combo methods + * got this from here https://github.com/swappyk/biojava/blob/master/biojava-ws/src/main/java/demo/NCBIQBlastServiceDemo.java + */ + public void blastn(String query) { + + queryProperties.setBlastProgram(BlastProgramEnum.blastn); + queryProperties.setBlastDatabase("nt"); + + outputProperties.setOutputFormat(BlastOutputFormatEnum.XML); + + String rid = null; + FileWriter writer = null; + BufferedReader reader = null; + try { + // send blast request and save request id + rid = service.sendAlignmentRequest(query, queryProperties); + + while (!service.isReady(rid)) { + System.out.println("Waiting for results. Sleeping for 25 seconds"); + Thread.sleep(25000); + } + + // read results when they are ready + InputStream in = service.getAlignmentResults(rid, outputProperties); + reader = new BufferedReader(new InputStreamReader(in)); + + File f = new File(BLAST_OUTPUT_FILE); + System.out.println("Saving query results in file " + f.getAbsolutePath()); + writer = new FileWriter(f); + + String line; + while ((line = reader.readLine()) != null) { + writer.write(line + System.getProperty("line.separator")); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + e.printStackTrace(); + } finally { + IOUtils.close(writer); + IOUtils.close(reader); + service.sendDeleteRequest(rid); + } + + } } diff --git a/src/test/java/BlastTests/TestBlastProgramEnum.java b/src/test/java/BlastTests/TestBlastProgramEnum.java new file mode 100644 index 0000000..71c9a1d --- /dev/null +++ b/src/test/java/BlastTests/TestBlastProgramEnum.java @@ -0,0 +1,19 @@ +package BlastTests; + +import org.biojava.nbio.ws.alignment.qblast.BlastProgramEnum; + +public class TestBlastProgramEnum { + + public static void main(String[] args) { + + + try { + System.out.println(BlastProgramEnum.valueOf("blast")); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + System.out.println(BlastProgramEnum.valueOf("blastp")); + } + + } +} diff --git a/src/test/java/BlastTests/TestORFBlaster.java b/src/test/java/BlastTests/TestORFBlaster.java new file mode 100644 index 0000000..c75aeb5 --- /dev/null +++ b/src/test/java/BlastTests/TestORFBlaster.java @@ -0,0 +1,16 @@ +package BlastTests; + +import blast.ORFBlaster; + +public class TestORFBlaster { + + private static final String SEQUENCE = "ATTATAAACGACATAATCGATCGATGCATGTAATATATATAGCTAGCTAGCAGATGCTAGTCGACGATGATGA"; + + public static void main(String[] args) { + + ORFBlaster orfBlaster = new ORFBlaster(); + orfBlaster.blastn(SEQUENCE); + } + + } + From 320463a4319586241489c724ef8563a8022be941 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 03:29:29 +0200 Subject: [PATCH 22/43] some todo notes on database --- src/main/java/Database/DatabaseManager.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/Database/DatabaseManager.java diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java new file mode 100644 index 0000000..9fb5fc0 --- /dev/null +++ b/src/main/java/Database/DatabaseManager.java @@ -0,0 +1,17 @@ +package Database; + + +/** + * + * Todo : everything + * plan for now : implement Java DB? (??) -- embedded derby (only needs JDK, no server) + * stuff needed for plan: + * - A DB setup script + * - methods to query db + */ +public class DatabaseManager { + + public DatabaseManager() { + + } +} From dc829386129a3295d9916edc7b547f05bae85ac2 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 13:32:39 +0200 Subject: [PATCH 23/43] added combobox with listner --- src/main/java/orfgui/ORFVisualiser.java | 95 ++++++++++++++++++++----- 1 file changed, 77 insertions(+), 18 deletions(-) diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index ab3929a..043048c 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -8,12 +8,13 @@ import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import javax.swing.plaf.ColorUIResource; import javax.swing.table.DefaultTableModel; +import javax.swing.table.JTableHeader; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; -import java.util.List; public class ORFVisualiser extends JFrame { private JFrame mainFrame; @@ -175,10 +176,12 @@ private void ORFvisualisatie(){ } private void ORFtable() { + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); DefaultTableModel tableModel = null; ArrayList table_list = new ArrayList(); if (table == null) { - String[] columnNames = {"Sequence ID", "Start", "End", "Length", "ID", "parent Sequence"}; + String[] columnNames = {"Sequence ID", "Start", "End", "Length", "ID"}; tableModel = new DefaultTableModel(columnNames, 0); } else{ @@ -195,6 +198,14 @@ private void ORFtable() { tableModel.addRow(string); } table = new JTable(tableModel); + table.setBackground(lighter_black); + table.setForeground(Color.white); + JTableHeader header = table.getTableHeader(); + header.setOpaque(false); + header.setFont(titel); + header.setBackground(Blue); + header.setForeground(Color.white); + table.setBorder(blackline); table.setCellSelectionEnabled(true); table.setModel(tableModel); table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); @@ -205,6 +216,7 @@ private void ORFtable() { //sp.repaint(); sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + sp.setBorder(blackline); sp.setViewportView(table); listSelectionModel = table.getSelectionModel(); listSelectionModel.addListSelectionListener( @@ -335,9 +347,11 @@ private void FileDisplayer(File file) throws IOException { file))); textofFile.read(input, "READING FILE :)"); } - private void MakeSidePanel(ArrayList indexlist){ + private void MakeSelected_Table(ArrayList indexlist){ DefaultTableModel tableModel = null; - sidepanel = new JPanel(); + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); + Font combotitel = new Font("arial",Font.BOLD,13); if ( selected_table == null) { String[] columnNames = {"ID", "Sequence"}; tableModel = new DefaultTableModel(columnNames, 0); @@ -348,30 +362,67 @@ private void MakeSidePanel(ArrayList indexlist){ tableModel.setRowCount(0); } for(String index : indexlist){ - ORF orf = ORFlist.get(Integer.parseInt(index)); + ORF orf = ORFlist.get(Integer.parseInt(index)); - String sequence = orfFinder.getOrf(orf); - String[] value = new String[3]; - value[0] = index; - value[1] = sequence; - tableModel.addRow(value); + String sequence = orfFinder.getOrf(orf); + String[] value = new String[3]; + value[0] = index; + value[1] = sequence; + tableModel.addRow(value); } selected_table = new JTable(tableModel); selected_table.setModel(tableModel); tableModel.fireTableDataChanged(); selected_table.repaint(); + selected_table.setPreferredSize(new Dimension(1000,1000)); System.out.println(indexlist); - sidepanel.setBackground(DarkBlue); - sidepanel.setLayout(new BorderLayout(5,5)); - sidepanel.setPreferredSize(new Dimension(300,1000)); - - - selected_table.setPreferredSize(new Dimension(1000,300)); - JScrollPane selected_table_scrollpane = new JScrollPane(); + selected_table_scrollpane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + selected_table_scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); selected_table_scrollpane.setViewportView(selected_table); - sidepanel.add(selected_table_scrollpane,BorderLayout.NORTH); + selected_table_scrollpane.setBorder(blackline); + selected_table_scrollpane.setPreferredSize(new Dimension(280,480)); + + JButton upload_button = new JButton("UPLOAD"); + upload_button.setPreferredSize(new Dimension(140,20)); + JButton blast_button = new JButton("BLAST"); + blast_button.setPreferredSize(new Dimension(140,20)); + + selected_table.setBackground(lighter_black); + selected_table.setForeground(Color.white); + selected_table.setBorder(blackline); + JTableHeader header = selected_table.getTableHeader(); + header.setOpaque(false); + header.setFont(titel); + header.setBackground(Blue); + header.setForeground(Color.white); + + String[] BLAST_types = { "BLASTn", "tBLASTx","BLASTx" }; + JComboBox Blast_option_box = new JComboBox<>(BLAST_types); + Blast_option_box.setPreferredSize(new Dimension(280,30)); + Blast_option_box.setBackground(DarkBlue); + Blast_option_box.setForeground(Color.black); + Blast_option_box.setFont(combotitel); + Blast_option_box.setOpaque(false); + Blast_option_box.addActionListener( new Blast_Actionlistner()); + + + sidepanel.add(selected_table_scrollpane); + sidepanel.add(upload_button); + sidepanel.add(blast_button); + sidepanel.add(Blast_option_box); + } + private void MakeSidePanel(ArrayList indexlist){ + Border blackline = BorderFactory.createLineBorder(Blue); + Font titel = new Font("arial",Font.BOLD,16); + sidepanel = new JPanel(); + + sidepanel.setBackground(black); + sidepanel.setLayout(new FlowLayout()); + sidepanel.setPreferredSize(new Dimension(300,1000)); + sidepanel.setBorder(blackline); + MakeSelected_Table(indexlist); sidepanel.validate(); sidepanel.repaint(); @@ -406,6 +457,14 @@ public void valueChanged(ListSelectionEvent e) { } } } + class Blast_Actionlistner implements java.awt.event.ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + JComboBox cb = (JComboBox)e.getSource(); + String petName = (String)cb.getSelectedItem(); + System.out.println(petName);; + } + } class MenuItemListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO: 30-3-2020 make it like so that blast can be called with Blast(blastn or whaterver you choose) From d15b52b72e29fd7f7ca9835261f6ab0a3352ecfb Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 13:37:26 +0200 Subject: [PATCH 24/43] added combobox with listner --- src/main/java/orfgui/ORFVisualiser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 043048c..3a85e36 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -3,6 +3,7 @@ import orffinder.ORF; import orffinder.ORFFinder; import orffinder.Sequence; +import org.forester.archaeopteryx.tools.Blast; import javax.swing.*; import javax.swing.border.Border; @@ -461,8 +462,8 @@ class Blast_Actionlistner implements java.awt.event.ActionListener { @Override public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); - String petName = (String)cb.getSelectedItem(); - System.out.println(petName);; + String Blasttype = (String)cb.getSelectedItem(); + System.out.println(Blasttype);; } } class MenuItemListener implements ActionListener { From 7c3542e9206e4e8f7b9fea5bd31dfb27666eb496 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 17:05:01 +0200 Subject: [PATCH 25/43] update database random database methods yet to be simplified and merged --- .../java/Database/CreateTableInsertRows.java | 82 +++++++++++++++++++ src/main/java/Database/DatabaseManager.java | 1 + src/main/java/Database/Readtable.java | 75 +++++++++++++++++ src/main/java/Database/UpdateTable.java | 64 +++++++++++++++ src/main/java/main/Controller.java | 3 + src/main/java/orffinder/Sequence.java | 3 +- src/main/java/orfgui/ORFVisualiser.java | 11 ++- 7 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 src/main/java/Database/CreateTableInsertRows.java create mode 100644 src/main/java/Database/Readtable.java create mode 100644 src/main/java/Database/UpdateTable.java diff --git a/src/main/java/Database/CreateTableInsertRows.java b/src/main/java/Database/CreateTableInsertRows.java new file mode 100644 index 0000000..f4bb909 --- /dev/null +++ b/src/main/java/Database/CreateTableInsertRows.java @@ -0,0 +1,82 @@ +package Database; + +import java.sql.*; +import java.util.Properties; + +public class CreateTableInsertRows { + + public static void main (String[] args) throws Exception + { + // Initialize connection variables. + String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; + String database = "owe7_pg1"; + String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; + String password = "password1"; + Connection connection = null; + + // Initialize connection object + try + { + String url = String.format("jdbc:mariadb://%s/%s", host, database); + + // Set connection properties. + Properties properties = new Properties(); + properties.setProperty("user", user); + properties.setProperty("password", password); + properties.setProperty("useSSL", "true"); + properties.setProperty("verifyServerCertificate", "true"); + properties.setProperty("requireSSL", "false"); + + // get connection + connection = DriverManager.getConnection(url, properties); + } + catch (SQLException e) + { + throw new SQLException("Failed to create connection to database.", e); + } + if (connection != null) + { + System.out.println("Successfully created connection to database."); + + // Perform some SQL queries over the connection. + try + { + // Drop previous table of same name if one exists. + Statement statement = connection.createStatement(); + statement.execute("DROP TABLE IF EXISTS inventory;"); + System.out.println("Finished dropping table (if existed)."); + + // Create table. + statement.execute("CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);"); + System.out.println("Created table."); + + // Insert some data into table. + int nRowsInserted = 0; + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO inventory (name, quantity) VALUES (?, ?);"); + preparedStatement.setString(1, "banana"); + preparedStatement.setInt(2, 150); + nRowsInserted += preparedStatement.executeUpdate(); + + preparedStatement.setString(1, "orange"); + preparedStatement.setInt(2, 154); + nRowsInserted += preparedStatement.executeUpdate(); + + preparedStatement.setString(1, "apple"); + preparedStatement.setInt(2, 100); + nRowsInserted += preparedStatement.executeUpdate(); + System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted)); + + // NOTE No need to commit all changes to database, as auto-commit is enabled by default. + + } + catch (SQLException e) + { + throw new SQLException("Encountered an error when executing given sql statement.", e); + } + } + else { + System.out.println("Failed to create connection to database."); + } + System.out.println("Execution finished."); + } +} diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java index 9fb5fc0..95eeffa 100644 --- a/src/main/java/Database/DatabaseManager.java +++ b/src/main/java/Database/DatabaseManager.java @@ -14,4 +14,5 @@ public class DatabaseManager { public DatabaseManager() { } + } diff --git a/src/main/java/Database/Readtable.java b/src/main/java/Database/Readtable.java new file mode 100644 index 0000000..ff6e4d2 --- /dev/null +++ b/src/main/java/Database/Readtable.java @@ -0,0 +1,75 @@ +package Database; + +import java.sql.*; +import java.util.Properties; + +public class Readtable { + + public static void main (String[] args) throws Exception + { + //Host: hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com + //Database: owe7_pg# (# vervangen door jouw projectgroepnr) + //User: owe7_pg#@hannl-hlo-bioinformatica-mysqlsrv + //Passw: blaat1234 + //Host: 3306 + // Initialize connection variables. + String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; + String database = "owe7_pg1"; + String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; + String password = "password1"; + int Host = 3306; + + Connection connection = null; + + // Initialize connection object + try + { + String url = String.format("jdbc:mariadb://%s/%s", host, database); + + // Set connection properties. + Properties properties = new Properties(); + properties.setProperty("user", user); + properties.setProperty("password", password); + properties.setProperty("useSSL", "true"); + properties.setProperty("verifyServerCertificate", "true"); + properties.setProperty("requireSSL", "false"); + + // get connection + connection = DriverManager.getConnection(url, properties); + } + catch (SQLException e) + { + throw new SQLException("Failed to create connection to database", e); + } + if (connection != null) + { + System.out.println("Successfully created connection to database."); + + // Perform some SQL queries over the connection. + try + { + + Statement statement = connection.createStatement(); + ResultSet results = statement.executeQuery("SELECT * from test;"); + while (results.next()) + { + String outputString = + String.format( + "Data row = (%s, %s)", + results.getString(1), + results.getString(2)); + + System.out.println(outputString); + } + } + catch (SQLException e) + { + throw new SQLException("Encountered an error when executing given sql statement", e); + } + } + else { + System.out.println("Failed to create connection to database."); + } + System.out.println("Execution finished."); + } +} diff --git a/src/main/java/Database/UpdateTable.java b/src/main/java/Database/UpdateTable.java new file mode 100644 index 0000000..2937606 --- /dev/null +++ b/src/main/java/Database/UpdateTable.java @@ -0,0 +1,64 @@ +package Database; + +import java.sql.*; +import java.util.Properties; + +public class UpdateTable { + public static void main (String[] args) throws Exception + { + // Initialize connection variables. + String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; + String database = "owe7_pg1"; + String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; + String password = "password1"; + + Connection connection = null; + + // Initialize connection object + try + { + String url = String.format("jdbc:mariadb://%s/%s", host, database); + + // set up the connection properties + Properties properties = new Properties(); + properties.setProperty("user", user); + properties.setProperty("password", password); + properties.setProperty("useSSL", "true"); + properties.setProperty("verifyServerCertificate", "true"); + properties.setProperty("requireSSL", "false"); + + // get connection + connection = DriverManager.getConnection(url, properties); + } + catch (SQLException e) + { + throw new SQLException("Failed to create connection to database.", e); + } + if (connection != null) + { + System.out.println("Successfully created connection to database."); + + // Perform some SQL queries over the connection. + try + { + // Modify some data in table. + int nRowsUpdated = 0; + PreparedStatement preparedStatement = connection.prepareStatement("UPDATE test SET quantity = ? WHERE name = ?;"); + preparedStatement.setInt(1, 200); + preparedStatement.setString(2, "banana"); + nRowsUpdated += preparedStatement.executeUpdate(); + System.out.println(String.format("Updated %d row(s) of data.", nRowsUpdated)); + + // NOTE No need to commit all changes to database, as auto-commit is enabled by default. + } + catch (SQLException e) + { + throw new SQLException("Encountered an error when executing given sql statement.", e); + } + } + else { + System.out.println("Failed to create connection to database."); + } + System.out.println("Execution finished."); + } +} \ No newline at end of file diff --git a/src/main/java/main/Controller.java b/src/main/java/main/Controller.java index 9099930..5c0aff0 100644 --- a/src/main/java/main/Controller.java +++ b/src/main/java/main/Controller.java @@ -5,4 +5,7 @@ public class Controller { public Controller() { } + + public static void BLAST() { + } } diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java index e1c4585..65e167a 100644 --- a/src/main/java/orffinder/Sequence.java +++ b/src/main/java/orffinder/Sequence.java @@ -61,13 +61,12 @@ public ArrayList makeTable_list(){ tablelist = new ArrayList(); int orfIdMaker = 0; for(ORF orf:ORFList){ - String[] orfvalue = new String[6]; + String[] orfvalue = new String[5]; orfvalue[0] = String.valueOf(SequenceID); orfvalue[1] = String.valueOf(orf.getCounterStart()); orfvalue[2] = String.valueOf(orf.counterEnd); orfvalue[3] = String.valueOf(orf.getSize()); orfvalue[4] = String.valueOf(orf.getID()); - orfvalue[5] = String.valueOf(orf.parentSequence); tablelist.add(orfvalue); } return tablelist; diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 3a85e36..f6fd471 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -1,15 +1,14 @@ package orfgui; import helpers.Reader; +import main.Controller; import orffinder.ORF; import orffinder.ORFFinder; import orffinder.Sequence; -import org.forester.archaeopteryx.tools.Blast; import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import javax.swing.plaf.ColorUIResource; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import java.awt.*; @@ -34,6 +33,7 @@ public class ORFVisualiser extends JFrame { private ArrayList reclist; private JTable table; private ListSelectionModel listSelectionModel; + private String Blasttype; Color black= new Color(43, 43, 43); Color lighter_black= new Color(60, 63, 65); @@ -349,6 +349,7 @@ private void FileDisplayer(File file) throws IOException { textofFile.read(input, "READING FILE :)"); } private void MakeSelected_Table(ArrayList indexlist){ + DefaultTableModel tableModel = null; Border blackline = BorderFactory.createLineBorder(Blue); Font titel = new Font("arial",Font.BOLD,16); @@ -462,9 +463,11 @@ class Blast_Actionlistner implements java.awt.event.ActionListener { @Override public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); - String Blasttype = (String)cb.getSelectedItem(); - System.out.println(Blasttype);; + Blasttype = (String)cb.getSelectedItem(); + + System.out.println(Blasttype); } + } class MenuItemListener implements ActionListener { public void actionPerformed(ActionEvent e) { From 2a3e4ad0ed20887ec745eb58b8903783b66a1e9c Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 17:05:35 +0200 Subject: [PATCH 26/43] added dependancy for database connection --- pom.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b601a94..a47c319 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ org.apache.maven.plugins maven-compiler-plugin - 11 - 11 + 8 + 8 @@ -58,6 +58,12 @@ RELEASE compile + + org.mariadb.jdbc + mariadb-java-client + 2.6.0 + + From 1d1bde6faa4cd400c6e28964d46758ff85375e70 Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 18:02:07 +0200 Subject: [PATCH 27/43] Merged and simplyfied all previous classes merged into methods of the database manager --- .../Database/Database/DatabaseManager.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/main/java/Database/Database/DatabaseManager.java diff --git a/src/main/java/Database/Database/DatabaseManager.java b/src/main/java/Database/Database/DatabaseManager.java new file mode 100644 index 0000000..3e80e34 --- /dev/null +++ b/src/main/java/Database/Database/DatabaseManager.java @@ -0,0 +1,108 @@ +package Database; + + +import java.sql.*; +import java.util.Properties; + +/** + * + * Todo : everything + * plan for now : implement Java DB? (??) -- embedded derby (only needs JDK, no server) + * stuff needed for plan: + * - A DB setup script + * - methods to query db + */ +public class DatabaseManager { + private Connection connection; + + public DatabaseManager() throws SQLException { + makeConnection(); + } + + public void makeConnection() throws SQLException { + connection = null; + + // Initialize connection object + try { + String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; + String database = "owe7_pg1"; + String url = String.format("jdbc:mariadb://%s/%s", host, database); + + // Set connection properties. + Properties properties = new Properties(); + String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; + properties.setProperty("user", user); + String password = "password1"; + properties.setProperty("password", password); + properties.setProperty("useSSL", "true"); + properties.setProperty("verifyServerCertificate", "true"); + properties.setProperty("requireSSL", "false"); + + // get connection + connection = DriverManager.getConnection(url, properties); + } catch (SQLException e) { + throw new SQLException("Failed to create connection to database", e); + } + if (connection != null) { + System.out.println("Successfully created connection to database."); + } + else{ + System.out.println("Failed to create connection to database."); + } + } + public void insert() throws SQLException { + int nRowsInserted = 0; + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test (name, quantity) VALUES (?, ?);"); + preparedStatement.setString(1, "banana"); + preparedStatement.setInt(2, 150); + nRowsInserted += preparedStatement.executeUpdate(); + + preparedStatement.setString(1, "orange"); + preparedStatement.setInt(2, 154); + nRowsInserted += preparedStatement.executeUpdate(); + + preparedStatement.setString(1, "apple"); + preparedStatement.setInt(2, 100); + nRowsInserted += preparedStatement.executeUpdate(); + System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted)); + } + public void download() throws SQLException { + try { + + Statement statement = connection.createStatement(); + ResultSet results = statement.executeQuery("SELECT * from test;"); + while (results.next()) { + String outputString = + String.format( + "Data row = (%s, %s)", + results.getString(1), + results.getString(2)); + + System.out.println(outputString); + } + } catch (SQLException e) { + throw new SQLException("Encountered an error when executing given sql statement", e); + } + System.out.println("Execution finished."); + } + public void update() throws SQLException { + try + { + // Modify some data in table. + int nRowsUpdated = 0; + PreparedStatement preparedStatement = connection.prepareStatement("UPDATE test SET quantity = ? WHERE name = ?;"); + preparedStatement.setInt(1, 200); + preparedStatement.setString(2, "banana"); + nRowsUpdated += preparedStatement.executeUpdate(); + System.out.println(String.format("Updated %d row(s) of data.", nRowsUpdated)); + + // NOTE No need to commit all changes to database, as auto-commit is enabled by default. + } + catch (SQLException e) + { + throw new SQLException("Encountered an error when executing given sql statement.", e); + } + System.out.println("Execution finished."); + } +} + From 97ea076872dd5f695980b47e2de46ba62e4b291c Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 18:22:29 +0200 Subject: [PATCH 28/43] Refactor 'Sequence' as 'FastaSequence' and removed redundant empty BlastManager, moved BlastManager up --- ...mariadb_jdbc_mariadb_java_client_2_6_0.xml | 13 ++ .../Database/Database/DatabaseManager.java | 108 -------------- src/main/java/Database/DatabaseManager.java | 92 +++++++++++- src/main/java/orffinder/FastaSequence.java | 136 ++++++++++++++++++ 4 files changed, 240 insertions(+), 109 deletions(-) create mode 100644 .idea/libraries/Maven__org_mariadb_jdbc_mariadb_java_client_2_6_0.xml delete mode 100644 src/main/java/Database/Database/DatabaseManager.java create mode 100644 src/main/java/orffinder/FastaSequence.java diff --git a/.idea/libraries/Maven__org_mariadb_jdbc_mariadb_java_client_2_6_0.xml b/.idea/libraries/Maven__org_mariadb_jdbc_mariadb_java_client_2_6_0.xml new file mode 100644 index 0000000..84803dd --- /dev/null +++ b/.idea/libraries/Maven__org_mariadb_jdbc_mariadb_java_client_2_6_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/Database/Database/DatabaseManager.java b/src/main/java/Database/Database/DatabaseManager.java deleted file mode 100644 index 3e80e34..0000000 --- a/src/main/java/Database/Database/DatabaseManager.java +++ /dev/null @@ -1,108 +0,0 @@ -package Database; - - -import java.sql.*; -import java.util.Properties; - -/** - * - * Todo : everything - * plan for now : implement Java DB? (??) -- embedded derby (only needs JDK, no server) - * stuff needed for plan: - * - A DB setup script - * - methods to query db - */ -public class DatabaseManager { - private Connection connection; - - public DatabaseManager() throws SQLException { - makeConnection(); - } - - public void makeConnection() throws SQLException { - connection = null; - - // Initialize connection object - try { - String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; - String database = "owe7_pg1"; - String url = String.format("jdbc:mariadb://%s/%s", host, database); - - // Set connection properties. - Properties properties = new Properties(); - String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; - properties.setProperty("user", user); - String password = "password1"; - properties.setProperty("password", password); - properties.setProperty("useSSL", "true"); - properties.setProperty("verifyServerCertificate", "true"); - properties.setProperty("requireSSL", "false"); - - // get connection - connection = DriverManager.getConnection(url, properties); - } catch (SQLException e) { - throw new SQLException("Failed to create connection to database", e); - } - if (connection != null) { - System.out.println("Successfully created connection to database."); - } - else{ - System.out.println("Failed to create connection to database."); - } - } - public void insert() throws SQLException { - int nRowsInserted = 0; - PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test (name, quantity) VALUES (?, ?);"); - preparedStatement.setString(1, "banana"); - preparedStatement.setInt(2, 150); - nRowsInserted += preparedStatement.executeUpdate(); - - preparedStatement.setString(1, "orange"); - preparedStatement.setInt(2, 154); - nRowsInserted += preparedStatement.executeUpdate(); - - preparedStatement.setString(1, "apple"); - preparedStatement.setInt(2, 100); - nRowsInserted += preparedStatement.executeUpdate(); - System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted)); - } - public void download() throws SQLException { - try { - - Statement statement = connection.createStatement(); - ResultSet results = statement.executeQuery("SELECT * from test;"); - while (results.next()) { - String outputString = - String.format( - "Data row = (%s, %s)", - results.getString(1), - results.getString(2)); - - System.out.println(outputString); - } - } catch (SQLException e) { - throw new SQLException("Encountered an error when executing given sql statement", e); - } - System.out.println("Execution finished."); - } - public void update() throws SQLException { - try - { - // Modify some data in table. - int nRowsUpdated = 0; - PreparedStatement preparedStatement = connection.prepareStatement("UPDATE test SET quantity = ? WHERE name = ?;"); - preparedStatement.setInt(1, 200); - preparedStatement.setString(2, "banana"); - nRowsUpdated += preparedStatement.executeUpdate(); - System.out.println(String.format("Updated %d row(s) of data.", nRowsUpdated)); - - // NOTE No need to commit all changes to database, as auto-commit is enabled by default. - } - catch (SQLException e) - { - throw new SQLException("Encountered an error when executing given sql statement.", e); - } - System.out.println("Execution finished."); - } -} - diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java index 95eeffa..3e80e34 100644 --- a/src/main/java/Database/DatabaseManager.java +++ b/src/main/java/Database/DatabaseManager.java @@ -1,6 +1,9 @@ package Database; +import java.sql.*; +import java.util.Properties; + /** * * Todo : everything @@ -10,9 +13,96 @@ * - methods to query db */ public class DatabaseManager { + private Connection connection; + + public DatabaseManager() throws SQLException { + makeConnection(); + } + + public void makeConnection() throws SQLException { + connection = null; - public DatabaseManager() { + // Initialize connection object + try { + String host = "hannl-hlo-bioinformatica-mysqlsrv.mysql.database.azure.com"; + String database = "owe7_pg1"; + String url = String.format("jdbc:mariadb://%s/%s", host, database); + // Set connection properties. + Properties properties = new Properties(); + String user = "owe7_pg1@hannl-hlo-bioinformatica-mysqlsrv"; + properties.setProperty("user", user); + String password = "password1"; + properties.setProperty("password", password); + properties.setProperty("useSSL", "true"); + properties.setProperty("verifyServerCertificate", "true"); + properties.setProperty("requireSSL", "false"); + + // get connection + connection = DriverManager.getConnection(url, properties); + } catch (SQLException e) { + throw new SQLException("Failed to create connection to database", e); + } + if (connection != null) { + System.out.println("Successfully created connection to database."); + } + else{ + System.out.println("Failed to create connection to database."); + } } + public void insert() throws SQLException { + int nRowsInserted = 0; + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test (name, quantity) VALUES (?, ?);"); + preparedStatement.setString(1, "banana"); + preparedStatement.setInt(2, 150); + nRowsInserted += preparedStatement.executeUpdate(); + + preparedStatement.setString(1, "orange"); + preparedStatement.setInt(2, 154); + nRowsInserted += preparedStatement.executeUpdate(); + preparedStatement.setString(1, "apple"); + preparedStatement.setInt(2, 100); + nRowsInserted += preparedStatement.executeUpdate(); + System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted)); + } + public void download() throws SQLException { + try { + + Statement statement = connection.createStatement(); + ResultSet results = statement.executeQuery("SELECT * from test;"); + while (results.next()) { + String outputString = + String.format( + "Data row = (%s, %s)", + results.getString(1), + results.getString(2)); + + System.out.println(outputString); + } + } catch (SQLException e) { + throw new SQLException("Encountered an error when executing given sql statement", e); + } + System.out.println("Execution finished."); + } + public void update() throws SQLException { + try + { + // Modify some data in table. + int nRowsUpdated = 0; + PreparedStatement preparedStatement = connection.prepareStatement("UPDATE test SET quantity = ? WHERE name = ?;"); + preparedStatement.setInt(1, 200); + preparedStatement.setString(2, "banana"); + nRowsUpdated += preparedStatement.executeUpdate(); + System.out.println(String.format("Updated %d row(s) of data.", nRowsUpdated)); + + // NOTE No need to commit all changes to database, as auto-commit is enabled by default. + } + catch (SQLException e) + { + throw new SQLException("Encountered an error when executing given sql statement.", e); + } + System.out.println("Execution finished."); + } } + diff --git a/src/main/java/orffinder/FastaSequence.java b/src/main/java/orffinder/FastaSequence.java new file mode 100644 index 0000000..4a5ada1 --- /dev/null +++ b/src/main/java/orffinder/FastaSequence.java @@ -0,0 +1,136 @@ +package orffinder; + +import java.util.ArrayList; +import java.util.Iterator; + +public class FastaSequence implements Iterable { + + final String header; + final int SequenceID; + private static int IDIncrement = 0; + final long lineNumber; + final long offset; // in file + public long EndPos; + public long RealSize; + private ArrayList tablelist; + + private ArrayList ORFList = new ArrayList(); + private ArrayList[] ORFTrackers = new ArrayList[3]; +//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work + + public FastaSequence(String currHeader, int currentTextLine, int position) { + SequenceID = IDIncrement++; + header = currHeader; + lineNumber = currentTextLine; + offset = position; // in file + ORFTrackers[0]= new ArrayList(); + ORFTrackers[1]= new ArrayList(); + ORFTrackers[2]= new ArrayList(); + } + + public void addNewORF(long position, long charCounter, int modulo) { + //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist + + ORFTrackers[modulo].add(new ORF(position, charCounter, this)); + } + + public void updateORFs(long endPos, long charCounter, int modulo) { + //ArrayList tracker = ORFTrackers.get(modulo); // for nested arraylist + assert (modulo >= 0 && modulo <= 2) : "MODULO CANT BE < 0 or > 2"; + ArrayList tracker = ORFTrackers[modulo]; + if (tracker.size() > 0) { + for ( ORF orf : tracker ) { + orf.endpos = endPos; + orf.counterEnd = charCounter; + + } + ORFList.addAll(tracker); + tracker.clear(); + } + } + + public long getRealSize() { + return RealSize; + } + + @Override + public Iterator iterator() { + return ORFList.iterator(); + } + public ArrayList makeTable_list(){ + tablelist = new ArrayList(); + int orfIdMaker = 0; + for(ORF orf:ORFList){ + String[] orfvalue = new String[5]; + orfvalue[0] = String.valueOf(SequenceID); + orfvalue[1] = String.valueOf(orf.getCounterStart()); + orfvalue[2] = String.valueOf(orf.counterEnd); + orfvalue[3] = String.valueOf(orf.getSize()); + orfvalue[4] = String.valueOf(orf.getID()); + tablelist.add(orfvalue); + } + return tablelist; + } + public String getStatistics() { + long totalOrfLength = 0; + long averageOrfLength = 0; + long shortestOrfLength= 0; + long longestOrfLength= 0; + int completedOrfCount = 0; + int incompleteOrfCount = 0; + + long size; + + for (ArrayList tracker : ORFTrackers) { + incompleteOrfCount += tracker.size(); + } + + for (ORF orf: ORFList ) { + completedOrfCount++; + size = orf.getSize(); + totalOrfLength += size; + + if (orf.getEndpos() != 0 && size < shortestOrfLength) { + shortestOrfLength = size; + } + if (size > longestOrfLength) { + longestOrfLength = size; + } + } + averageOrfLength = totalOrfLength / completedOrfCount; + + StringBuilder statistics = new StringBuilder("DNA header="); + statistics.append(header); + statistics.append("{ID=").append(SequenceID); + statistics.append(" StartPos=").append(offset); + statistics.append(" EndPos=").append(EndPos); + statistics.append(" CalculatedSize=").append(EndPos - offset); + statistics.append(" RealSize=").append(RealSize); + + + for (int i = 0; i < 10; i++) { + ORF o = ORFList.get(i); + statistics.append("\n\torf startpos=").append(o.getOffset()); + statistics.append(" endpos=").append(o.endpos); + statistics.append(" RealSize=").append(o.getSize()); + statistics.append(" StartCounter=").append(o.getCounterStart()); + statistics.append(" EndCounter=").append(o.counterEnd); + statistics.append(" ID: ").append(o.getID()); + statistics.append(" PARENT: ").append(o.parentSequence); + + } + + statistics.append(" totalOrfLength=").append(totalOrfLength); + statistics.append(" averageOrfLength=").append(averageOrfLength); + statistics.append(" longestOrfLength=").append(longestOrfLength); + statistics.append(" shortestOrfLength=").append(shortestOrfLength); + statistics.append(" incompleteOrfCount=").append(incompleteOrfCount); + statistics.append(" completedOrfCount=").append(completedOrfCount); + statistics.append("}"); + + System.out.println(statistics.toString()); + return statistics.toString(); + + } +} + From edab021160eae7010c677947895937a57c0dfa06 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 19:39:07 +0200 Subject: [PATCH 29/43] add field filename to FastaSequence --- src/main/java/orffinder/FastaSequence.java | 3 ++- src/main/java/orffinder/ORFFinder.java | 23 +++++++++------------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/orffinder/FastaSequence.java b/src/main/java/orffinder/FastaSequence.java index 4a5ada1..67ba58f 100644 --- a/src/main/java/orffinder/FastaSequence.java +++ b/src/main/java/orffinder/FastaSequence.java @@ -6,6 +6,7 @@ public class FastaSequence implements Iterable { final String header; + String filename; final int SequenceID; private static int IDIncrement = 0; final long lineNumber; @@ -18,7 +19,7 @@ public class FastaSequence implements Iterable { private ArrayList[] ORFTrackers = new ArrayList[3]; //final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work - public FastaSequence(String currHeader, int currentTextLine, int position) { + public FastaSequence(String filename, String currHeader, int currentTextLine, int position) { SequenceID = IDIncrement++; header = currHeader; lineNumber = currentTextLine; diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java index 83e362b..835d3f0 100644 --- a/src/main/java/orffinder/ORFFinder.java +++ b/src/main/java/orffinder/ORFFinder.java @@ -2,19 +2,15 @@ import helpers.MaskFactory; -import org.jetbrains.annotations.Contract; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; import java.math.BigDecimal; -import java.nio.BufferUnderflowException; import java.nio.ByteOrder; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.ArrayList; -import java.util.List; -import java.util.Random; // try -Xms512M -Xmx512M in VM options // add -ea for enable assertions in VM options @@ -43,7 +39,7 @@ public class ORFFinder { private static final long MASK_5 = 0xFFFFFFFFFFL; static String filename_RELATIVE_TEMP = "src/test/resources/data/Glennie the platypus.fa"; - private final ArrayList sequences = new ArrayList(100); + private final ArrayList sequences = new ArrayList(100); private File file; private RandomAccessFile mainRAFile; private FileChannel mainFileChannel; @@ -92,7 +88,7 @@ public void findOrfs(String filename) { int currentTextLine; // initialise some - Sequence currentSequence = null; + FastaSequence currentSequence = null; position = 0; charCounter = 0; currentTextLine = 0; @@ -167,7 +163,7 @@ public void findOrfs(String filename) { } //end while headerbuilder currentTextLine++; - currentSequence = new Sequence(currHeader.toString(), currentTextLine, position); + currentSequence = new FastaSequence(filename, currHeader.toString(), currentTextLine, position); currHeader = null; sequences.add(currentSequence); @@ -244,7 +240,7 @@ public void findOrfs(String filename) { } public void printStats() { - for (Sequence seq : sequences) { + for (FastaSequence seq : sequences) { seq.getStatistics(); } } @@ -307,7 +303,7 @@ public void getallOrfs() { System.out.println("getting all ORFS..."); String orfString; int orfsFound = 0; - for (Sequence seq : sequences + for (FastaSequence seq : sequences ) { for (ORF orf : seq ) { @@ -346,8 +342,7 @@ public String getOrf(ORF orf) { } - public ArrayList getInfoForVisualisation() { - + public ArrayList getInfoForVisualisation() { return new ArrayList<>(sequences); } From b4c7a0ec1734ebcfad6a357abd623429499eee9c Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 20:01:39 +0200 Subject: [PATCH 30/43] Hotfix fastasequence --- src/main/java/Database/DatabaseManager.java | 21 +++++++++++++- src/main/java/helpers/Reader.java | 24 ---------------- src/main/java/orffinder/ORF.java | 4 +-- src/main/java/orfgui/ORFVisualiser.java | 32 ++++++++++++++------- src/main/java/orfgui/VisualisatiePane.java | 10 +++---- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java index 3e80e34..34d7355 100644 --- a/src/main/java/Database/DatabaseManager.java +++ b/src/main/java/Database/DatabaseManager.java @@ -1,7 +1,10 @@ package Database; +import orffinder.ORF; + import java.sql.*; +import java.util.HashMap; import java.util.Properties; /** @@ -14,8 +17,10 @@ */ public class DatabaseManager { private Connection connection; + private HashMap Selected_ORFs; - public DatabaseManager() throws SQLException { + public DatabaseManager(HashMap selected_ORF_list) throws SQLException { + Selected_ORFs = selected_ORF_list; makeConnection(); } @@ -51,6 +56,20 @@ public void makeConnection() throws SQLException { } } public void insert() throws SQLException { + for(ORF orf : Selected_ORFs.keySet()){ + // all id are auto increment + String ORFtable_ORF_sequence = Selected_ORFs.get(orf); + int ORFtable_start = (int) orf.getCounterStart(); + int ORFtable_stop = (int) orf.counterEnd; + String Sequencetable_header = ""; + String Sequencetable_filename = "" ; + int Sequencetable_orfs_found = 0; + + + //ORF id : auto increment + + + } int nRowsInserted = 0; PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test (name, quantity) VALUES (?, ?);"); preparedStatement.setString(1, "banana"); diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java index ba34c24..f313a75 100644 --- a/src/main/java/helpers/Reader.java +++ b/src/main/java/helpers/Reader.java @@ -1,18 +1,11 @@ package helpers; -import orffinder.ORFFinder; -import orffinder.Sequence; - import javax.swing.*; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; public class Reader { private static File file; - private static ORFFinder orfFinder; public File FileChooser() { System.out.println("Reader.FileChooser() fired!"); // todo-debugprint @@ -26,24 +19,7 @@ public File FileChooser() { file = jfc.getSelectedFile(); } } - - try { - orfFinder = new ORFFinder(file); - - } catch (IOException e) { - - // todo popup - e.printStackTrace(); - } - - orfFinder.findOrfs(); - orfFinder.getallOrfs(); return file; } - public ArrayList getSeq_list() { - - return orfFinder.getInfoForVisualisation(); - } - } diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java index ae470be..0f8a012 100644 --- a/src/main/java/orffinder/ORF.java +++ b/src/main/java/orffinder/ORF.java @@ -8,11 +8,11 @@ public class ORF { public long counterEnd; // relative counter to dna without the fucking linefeeds // currently testing - public Sequence parentSequence; + public FastaSequence parentSequence; private int ID; static int orfsmade = 0; -public ORF(long position, long charCounter, Sequence parent) { +public ORF(long position, long charCounter, FastaSequence parent) { offset = position; counterStart = charCounter; diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index f6fd471..43cd746 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -1,9 +1,9 @@ package orfgui; +import Database.DatabaseManager; import helpers.Reader; -import main.Controller; +import orffinder.FastaSequence; import orffinder.ORF; import orffinder.ORFFinder; -import orffinder.Sequence; import javax.swing.*; import javax.swing.border.Border; @@ -14,6 +14,7 @@ import java.awt.*; import java.awt.event.*; import java.io.*; +import java.sql.SQLException; import java.util.*; public class ORFVisualiser extends JFrame { @@ -29,7 +30,7 @@ public class ORFVisualiser extends JFrame { private JTextField pathToFile; private JTextArea textofFile; private JLabel jLabelEmptyHolderImage; - private ArrayList list; + private ArrayList list; private ArrayList reclist; private JTable table; private ListSelectionModel listSelectionModel; @@ -134,7 +135,7 @@ private ArrayList makeRec() { reclist = new ArrayList(); int firstline = 10; - for (Sequence sequence : list) { + for (FastaSequence sequence : list) { firstline = firstline + 30; for (ORF orf : sequence) { Random rand = new Random(); @@ -156,7 +157,7 @@ private void ORFvisualisatie(){ System.out.println("got lengths" + list.size()); int largest = 0; - for (Sequence sequence : list){ + for (FastaSequence sequence : list){ int Length = (int) sequence.getRealSize(); if (Length > largest) { largest = Length; @@ -191,7 +192,7 @@ private void ORFtable() { tableModel.setRowCount(0); } - for (Sequence sequence : list) { + for (FastaSequence sequence : list) { table_list = sequence.makeTable_list(); for (String[] string : table_list) { @@ -328,7 +329,7 @@ public void itemStateChanged(ItemEvent e) { } private void MakeORFlist(){ ORFlist = new HashMap<>(); - for(Sequence sequence : list){ + for(FastaSequence sequence : list){ for(ORF orf : sequence){ int ID = orf.getID(); ORFlist.put(ID,orf); @@ -349,7 +350,7 @@ private void FileDisplayer(File file) throws IOException { textofFile.read(input, "READING FILE :)"); } private void MakeSelected_Table(ArrayList indexlist){ - + HashMap Selected_ORF_list = new HashMap(); DefaultTableModel tableModel = null; Border blackline = BorderFactory.createLineBorder(Blue); Font titel = new Font("arial",Font.BOLD,16); @@ -365,8 +366,8 @@ private void MakeSelected_Table(ArrayList indexlist){ } for(String index : indexlist){ ORF orf = ORFlist.get(Integer.parseInt(index)); - String sequence = orfFinder.getOrf(orf); + Selected_ORF_list.put(orf,sequence); String[] value = new String[3]; value[0] = index; value[1] = sequence; @@ -388,6 +389,14 @@ private void MakeSelected_Table(ArrayList indexlist){ JButton upload_button = new JButton("UPLOAD"); upload_button.setPreferredSize(new Dimension(140,20)); + upload_button.addActionListener(e -> { + try { + DatabaseManager database = new DatabaseManager(Selected_ORF_list); + + } catch (SQLException ex) { + ex.printStackTrace(); + } + }); JButton blast_button = new JButton("BLAST"); blast_button.setPreferredSize(new Dimension(140,20)); @@ -409,12 +418,12 @@ private void MakeSelected_Table(ArrayList indexlist){ Blast_option_box.setOpaque(false); Blast_option_box.addActionListener( new Blast_Actionlistner()); - sidepanel.add(selected_table_scrollpane); sidepanel.add(upload_button); sidepanel.add(blast_button); sidepanel.add(Blast_option_box); } + private void MakeSidePanel(ArrayList indexlist){ Border blackline = BorderFactory.createLineBorder(Blue); Font titel = new Font("arial",Font.BOLD,16); @@ -459,6 +468,7 @@ public void valueChanged(ListSelectionEvent e) { } } } + class Blast_Actionlistner implements java.awt.event.ActionListener { @Override public void actionPerformed(ActionEvent e) { @@ -491,7 +501,7 @@ public void actionPerformed(ActionEvent e) { } catch (IOException ex) { ex.printStackTrace(); } - list = reader.getSeq_list(); + list = orfFinder.getInfoForVisualisation(); MakeORFlist(); ORFtable(); //reclist = makeRec(); diff --git a/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java index 9b0689f..727ed06 100644 --- a/src/main/java/orfgui/VisualisatiePane.java +++ b/src/main/java/orfgui/VisualisatiePane.java @@ -1,17 +1,15 @@ package orfgui; -import helpers.Reader; -import orffinder.Sequence; +import orffinder.FastaSequence; import javax.swing.*; import java.awt.*; import java.util.ArrayList; -import java.util.List; public class VisualisatiePane extends JPanel { private ArrayList reclist; - private ArrayList seq_list; + private ArrayList seq_list; - VisualisatiePane(ArrayList list, ArrayList rectlist) { + VisualisatiePane(ArrayList list, ArrayList rectlist) { seq_list = list; reclist = rectlist; } @@ -22,7 +20,7 @@ protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.WHITE); g2.setStroke(new BasicStroke(2)); - for (Sequence s: seq_list){ + for (FastaSequence s: seq_list){ int size = (int) s.getRealSize(); firstline = firstline + 30; g.drawLine(10,10 + firstline,size - 10,10 + firstline); From f5ff7938731847cbee5fee8b6885fd16088802d0 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 20:06:12 +0200 Subject: [PATCH 31/43] hotfix fastasequence again --- blastOutput.xml | 32 ++++++------- src/main/java/helpers/Reader.java | 10 +++++ src/main/java/main/Settings.java | 2 +- src/main/java/orffinder/FastaSequence.java | 5 +-- src/main/java/orffinder/ORF.java | 4 +- src/main/java/orffinder/ORFFinder.java | 45 ++++++++++--------- src/main/java/orfgui/ORFVisualiser.java | 20 ++++----- src/main/java/orfgui/VisualisatiePane.java | 2 +- .../java/HelperTests/TestFastaConverter.java | 4 +- .../resources/data/Glennie the platypus.fa | 2 +- 10 files changed, 68 insertions(+), 58 deletions(-) diff --git a/blastOutput.xml b/blastOutput.xml index 899c876..06f87d1 100644 --- a/blastOutput.xml +++ b/blastOutput.xml @@ -112,7 +112,7 @@ 4 gi|1189419115|gb|CP018157.1| - Oryza sativa Indica Group cultivar Shuhui498 chromosome 1 sequence + Oryza sativa Indica Group cultivar Shuhui498 chromosome 1 fastaSequence CP018157 44361539 @@ -140,7 +140,7 @@ 5 gi|937893927|dbj|AP014957.1| - Oryza sativa Japonica Group DNA, chromosome 1, cultivar: Nipponbare, complete sequence + Oryza sativa Japonica Group DNA, chromosome 1, cultivar: Nipponbare, complete fastaSequence AP014957 43270923 @@ -168,7 +168,7 @@ 6 gi|932283207|gb|CP012616.1| - Oryza sativa Indica Group cultivar RP Bio-226 chromosome 8 sequence + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 8 fastaSequence CP012616 28124818 @@ -196,7 +196,7 @@ 7 gi|932282494|gb|CP012609.1| - Oryza sativa Indica Group cultivar RP Bio-226 chromosome 1 sequence + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 1 fastaSequence CP012609 44526634 @@ -224,7 +224,7 @@ 8 gi|156765894|dbj|AK289267.1| - Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert sequence + Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert fastaSequence AK289267 2399 @@ -252,7 +252,7 @@ 9 gi|116013028|dbj|AK243663.1| - Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert sequence + Oryza sativa Japonica Group cDNA, clone: J100089F08, full insert fastaSequence AK243663 3045 @@ -476,7 +476,7 @@ 17 gi|937906879|dbj|AP014959.1| - Oryza sativa Japonica Group DNA, chromosome 3, cultivar: Nipponbare, complete sequence + Oryza sativa Japonica Group DNA, chromosome 3, cultivar: Nipponbare, complete fastaSequence AP014959 36413819 @@ -504,7 +504,7 @@ 18 gi|44681488|gb|AC146521.2| - Oryza sativa chromosome 3 B1246D11 genomic sequence, complete sequence + Oryza sativa chromosome 3 B1246D11 genomic fastaSequence, complete fastaSequence AC146521 43277 @@ -532,7 +532,7 @@ 19 gi|18201762|gb|AC091733.3| - Genomic sequence for Oryza sativa, Nipponbare strain, clone OSJNBa0048F08, from chromosome 3, complete sequence + Genomic fastaSequence for Oryza sativa, Nipponbare strain, clone OSJNBa0048F08, from chromosome 3, complete fastaSequence AC091733 155790 @@ -560,7 +560,7 @@ 20 gi|60301588|gb|AC147869.3| - Monodelphis domestica clone VMRC6-113K21, complete sequence + Monodelphis domestica clone VMRC6-113K21, complete fastaSequence AC147869 157763 @@ -756,7 +756,7 @@ 27 gi|937928473|dbj|AP014964.1| - Oryza sativa Japonica Group DNA, chromosome 8, cultivar: Nipponbare, complete sequence + Oryza sativa Japonica Group DNA, chromosome 8, cultivar: Nipponbare, complete fastaSequence AP014964 28443022 @@ -784,7 +784,7 @@ 28 gi|924563519|gb|CP012528.1| - Drosophila busckii chromosome X sequence + Drosophila busckii chromosome X fastaSequence CP012528 23724088 @@ -1092,7 +1092,7 @@ 39 gi|1189419123|gb|CP018165.1| - Oryza sativa Indica Group cultivar Shuhui498 chromosome 9 sequence + Oryza sativa Indica Group cultivar Shuhui498 chromosome 9 fastaSequence CP018165 24760661 @@ -1148,7 +1148,7 @@ 41 gi|937931852|dbj|AP014965.1| - Oryza sativa Japonica Group DNA, chromosome 9, cultivar: Nipponbare, complete sequence + Oryza sativa Japonica Group DNA, chromosome 9, cultivar: Nipponbare, complete fastaSequence AP014965 23012720 @@ -1204,7 +1204,7 @@ 43 gi|932283291|gb|CP012617.1| - Oryza sativa Indica Group cultivar RP Bio-226 chromosome 9 sequence + Oryza sativa Indica Group cultivar RP Bio-226 chromosome 9 fastaSequence CP012617 20520899 @@ -1288,7 +1288,7 @@ 46 gi|519687763|gb|JX581658.1| - Gossypium hirsutum clone NBRI_GE14330 microsatellite sequence + Gossypium hirsutum clone NBRI_GE14330 microsatellite fastaSequence JX581658 359 diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java index f313a75..6ee4d69 100644 --- a/src/main/java/helpers/Reader.java +++ b/src/main/java/helpers/Reader.java @@ -1,7 +1,12 @@ package helpers; +import orffinder.ORFFinder; +import orffinder.FastaSequence; + import javax.swing.*; import java.io.File; +import java.io.IOException; +import java.util.ArrayList; public class Reader { @@ -22,4 +27,9 @@ public File FileChooser() { return file; } + public ArrayList getSeq_list() { + + return orfFinder.getInfoForVisualisation(); + } + } diff --git a/src/main/java/main/Settings.java b/src/main/java/main/Settings.java index 9a93757..3e221ce 100644 --- a/src/main/java/main/Settings.java +++ b/src/main/java/main/Settings.java @@ -1,5 +1,5 @@ public class Settings { - public static final int MINIMAL_ORF_LENGTH = 0; // used in Sequence to determine whether to keep an ORF or not + public static final int MINIMAL_ORF_LENGTH = 0; // used in FastaSequence to determine whether to keep an ORF or not } diff --git a/src/main/java/orffinder/FastaSequence.java b/src/main/java/orffinder/FastaSequence.java index 67ba58f..32e84f2 100644 --- a/src/main/java/orffinder/FastaSequence.java +++ b/src/main/java/orffinder/FastaSequence.java @@ -6,7 +6,6 @@ public class FastaSequence implements Iterable { final String header; - String filename; final int SequenceID; private static int IDIncrement = 0; final long lineNumber; @@ -19,7 +18,7 @@ public class FastaSequence implements Iterable { private ArrayList[] ORFTrackers = new ArrayList[3]; //final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work - public FastaSequence(String filename, String currHeader, int currentTextLine, int position) { + public FastaSequence(String currHeader, int currentTextLine, int position) { SequenceID = IDIncrement++; header = currHeader; lineNumber = currentTextLine; @@ -117,7 +116,7 @@ public String getStatistics() { statistics.append(" StartCounter=").append(o.getCounterStart()); statistics.append(" EndCounter=").append(o.counterEnd); statistics.append(" ID: ").append(o.getID()); - statistics.append(" PARENT: ").append(o.parentSequence); + statistics.append(" PARENT: ").append(o.parentFastaSequence); } diff --git a/src/main/java/orffinder/ORF.java b/src/main/java/orffinder/ORF.java index 0f8a012..f9c5a59 100644 --- a/src/main/java/orffinder/ORF.java +++ b/src/main/java/orffinder/ORF.java @@ -8,7 +8,7 @@ public class ORF { public long counterEnd; // relative counter to dna without the fucking linefeeds // currently testing - public FastaSequence parentSequence; + public FastaSequence parentFastaSequence; private int ID; static int orfsmade = 0; @@ -18,7 +18,7 @@ public ORF(long position, long charCounter, FastaSequence parent) { counterStart = charCounter; // currently testing (speed) - parentSequence = parent; + parentFastaSequence = parent; ID = orfsmade++; } diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java index 835d3f0..2dc3a92 100644 --- a/src/main/java/orffinder/ORFFinder.java +++ b/src/main/java/orffinder/ORFFinder.java @@ -39,7 +39,7 @@ public class ORFFinder { private static final long MASK_5 = 0xFFFFFFFFFFL; static String filename_RELATIVE_TEMP = "src/test/resources/data/Glennie the platypus.fa"; - private final ArrayList sequences = new ArrayList(100); + private final ArrayList fastaSequences = new ArrayList(100); private File file; private RandomAccessFile mainRAFile; private FileChannel mainFileChannel; @@ -88,7 +88,7 @@ public void findOrfs(String filename) { int currentTextLine; // initialise some - FastaSequence currentSequence = null; + FastaSequence currentFastaSequence = null; position = 0; charCounter = 0; currentTextLine = 0; @@ -144,10 +144,10 @@ public void findOrfs(String filename) { // header line start (>) marks start of new sequence object case HEADER: // > // if sequence object was made, end it here at the start of a new header - if (currentSequence != null) { - currentSequence.EndPos = position; // TODO: 6-4-2020 make private? use setter? - currentSequence.RealSize = charCounter + 1; - //currentSequence.getStatistics(); + if (currentFastaSequence != null) { + currentFastaSequence.EndPos = position; // TODO: 6-4-2020 make private? use setter? + currentFastaSequence.RealSize = charCounter + 1; + //currentFastaSequence.getStatistics(); } // build the string of the new header (thanks java for not being nice with string concat) currHeader = new StringBuilder(); @@ -163,17 +163,17 @@ public void findOrfs(String filename) { } //end while headerbuilder currentTextLine++; - currentSequence = new FastaSequence(filename, currHeader.toString(), currentTextLine, position); + currentFastaSequence = new FastaSequence(currHeader.toString(), currentTextLine, position); currHeader = null; - sequences.add(currentSequence); + fastaSequences.add(currentFastaSequence); charCounter = 0; continue; // do not increment position but continue // check orf start case A: - assert currentSequence != null : "NO FUCKING DNA"; + assert currentFastaSequence != null : "NO FUCKING DNA"; // put byes 0,1,2 of buffer.getInt into currentCodon // (read 4 bytes from here but only use first 3 ) @@ -181,14 +181,14 @@ public void findOrfs(String filename) { if (currentCodonLong == ATG) { - currentSequence.addNewORF(position, charCounter, charCounter % 3); + currentFastaSequence.addNewORF(position, charCounter, charCounter % 3); } else { // if 0,1,3 bytes wasn't enough, check 5 bytes briefly too currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); if (currentCodonLong == ATG) { - currentSequence.addNewORF(position, charCounter, charCounter % 3); + currentFastaSequence.addNewORF(position, charCounter, charCounter % 3); } } @@ -196,17 +196,17 @@ public void findOrfs(String filename) { // check if orf ends case T: - assert currentSequence != null : "NO FUCKING DNA"; + assert currentFastaSequence != null : "NO FUCKING DNA"; currentCodonLong = buffer.getInt(position) & MASK_3; if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { - currentSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3); + currentFastaSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3); } else { currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix); if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) { - currentSequence.updateORFs(position + delta, charCounter + delta, charCounter % 3); + currentFastaSequence.updateORFs(position + delta, charCounter + delta, charCounter % 3); } } @@ -224,13 +224,13 @@ public void findOrfs(String filename) { } // end while loop that reads over file // round up the last sequence made (if any were made) - if (currentSequence != null) { - if (currentSequence.EndPos == 0) { - currentSequence.EndPos = lastValidDNACharacterPos; - currentSequence.RealSize = charCounter + 1; + if (currentFastaSequence != null) { + if (currentFastaSequence.EndPos == 0) { + currentFastaSequence.EndPos = lastValidDNACharacterPos; + currentFastaSequence.RealSize = charCounter + 1; } } - //currentSequence.getStatistics(); + //currentFastaSequence.getStatistics(); // Print logged time @@ -240,7 +240,7 @@ public void findOrfs(String filename) { } public void printStats() { - for (FastaSequence seq : sequences) { + for (FastaSequence seq : fastaSequences) { seq.getStatistics(); } } @@ -303,7 +303,7 @@ public void getallOrfs() { System.out.println("getting all ORFS..."); String orfString; int orfsFound = 0; - for (FastaSequence seq : sequences + for (FastaSequence seq : fastaSequences ) { for (ORF orf : seq ) { @@ -343,7 +343,8 @@ public String getOrf(ORF orf) { public ArrayList getInfoForVisualisation() { - return new ArrayList<>(sequences); + + return new ArrayList<>(fastaSequences); } diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index 43cd746..a3db906 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -135,9 +135,9 @@ private ArrayList makeRec() { reclist = new ArrayList(); int firstline = 10; - for (FastaSequence sequence : list) { + for (FastaSequence fastaSequence : list) { firstline = firstline + 30; - for (ORF orf : sequence) { + for (ORF orf : fastaSequence) { Random rand = new Random(); int start = (int) orf.getCounterStart(); int size = (int) orf.getSize(); @@ -157,8 +157,8 @@ private void ORFvisualisatie(){ System.out.println("got lengths" + list.size()); int largest = 0; - for (FastaSequence sequence : list){ - int Length = (int) sequence.getRealSize(); + for (FastaSequence fastaSequence : list){ + int Length = (int) fastaSequence.getRealSize(); if (Length > largest) { largest = Length; System.out.println(largest); @@ -183,7 +183,7 @@ private void ORFtable() { DefaultTableModel tableModel = null; ArrayList table_list = new ArrayList(); if (table == null) { - String[] columnNames = {"Sequence ID", "Start", "End", "Length", "ID"}; + String[] columnNames = {"FastaSequence ID", "Start", "End", "Length", "ID"}; tableModel = new DefaultTableModel(columnNames, 0); } else{ @@ -192,8 +192,8 @@ private void ORFtable() { tableModel.setRowCount(0); } - for (FastaSequence sequence : list) { - table_list = sequence.makeTable_list(); + for (FastaSequence fastaSequence : list) { + table_list = fastaSequence.makeTable_list(); for (String[] string : table_list) { //System.out.println(Arrays.toString(string)); @@ -329,8 +329,8 @@ public void itemStateChanged(ItemEvent e) { } private void MakeORFlist(){ ORFlist = new HashMap<>(); - for(FastaSequence sequence : list){ - for(ORF orf : sequence){ + for(FastaSequence fastaSequence : list){ + for(ORF orf : fastaSequence){ int ID = orf.getID(); ORFlist.put(ID,orf); } @@ -356,7 +356,7 @@ private void MakeSelected_Table(ArrayList indexlist){ Font titel = new Font("arial",Font.BOLD,16); Font combotitel = new Font("arial",Font.BOLD,13); if ( selected_table == null) { - String[] columnNames = {"ID", "Sequence"}; + String[] columnNames = {"ID", "FastaSequence"}; tableModel = new DefaultTableModel(columnNames, 0); } else{ diff --git a/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java index 727ed06..79416d5 100644 --- a/src/main/java/orfgui/VisualisatiePane.java +++ b/src/main/java/orfgui/VisualisatiePane.java @@ -9,7 +9,7 @@ public class VisualisatiePane extends JPanel { private ArrayList reclist; private ArrayList seq_list; - VisualisatiePane(ArrayList list, ArrayList rectlist) { + VisualisatiePane(ArrayList list, ArrayList rectlist) { seq_list = list; reclist = rectlist; } diff --git a/src/test/java/HelperTests/TestFastaConverter.java b/src/test/java/HelperTests/TestFastaConverter.java index 899245e..589190c 100644 --- a/src/test/java/HelperTests/TestFastaConverter.java +++ b/src/test/java/HelperTests/TestFastaConverter.java @@ -1,7 +1,7 @@ package HelperTests; import helpers.FastaConverter; -import orffinder.Sequence; +import orffinder.FastaSequence; // todo test setting file somewhere randomly in pc, already existing files, non-text files... // ... overwrite mode? ... god so many things to account for and we haven't even scraped the surface @@ -11,7 +11,7 @@ public static void main(String[] args) { FastaConverter fc = new FastaConverter(); - Sequence seq = new Sequence("sequence 1", 0, 0); + FastaSequence seq = new FastaSequence("sequence 1", 0, 0); seq.EndPos = 100; seq.RealSize= 90; diff --git a/src/test/resources/data/Glennie the platypus.fa b/src/test/resources/data/Glennie the platypus.fa index 2fe00fd..a429d84 100644 --- a/src/test/resources/data/Glennie the platypus.fa +++ b/src/test/resources/data/Glennie the platypus.fa @@ -1,4 +1,4 @@ ->DS218343.1 Ornithorhynchus anatinus Scfld51825 genomic scaffold, whole genome shotgun sequence +>DS218343.1 Ornithorhynchus anatinus Scfld51825 genomic scaffold, whole genome shotgun fastaSequence CCCTTGGGAGACCTTTTCCCACTTACTTCTACCAGTTCACGACTATGGGGAGGGAGGAGTTCAAGCAGAG GCCTACCCATTTCCATTCCTAGCTTGGCTAGTGGCTAGCAAGTGGAAGGCAATCTGTTACAAGTCCCAAA CTCAGCTGTGCTGGGCAGAGCGGCACGGGAGAGAGTCAGGGCGGAGGCTCGAGTTTACTGCGCGGAAGGC From a33e453c6facaf17f0ef899df652bcd056f3c0ea Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 20:10:33 +0200 Subject: [PATCH 32/43] delete old sequence --- src/main/java/orffinder/Sequence.java | 136 -------------------------- 1 file changed, 136 deletions(-) delete mode 100644 src/main/java/orffinder/Sequence.java diff --git a/src/main/java/orffinder/Sequence.java b/src/main/java/orffinder/Sequence.java deleted file mode 100644 index 65e167a..0000000 --- a/src/main/java/orffinder/Sequence.java +++ /dev/null @@ -1,136 +0,0 @@ -package orffinder; - -import java.util.ArrayList; -import java.util.Iterator; - -public class Sequence implements Iterable { - - final String header; - final int SequenceID; - private static int IDIncrement = 0; - final long lineNumber; - final long offset; // in file - public long EndPos; - public long RealSize; - private ArrayList tablelist; - - private ArrayList ORFList = new ArrayList(); - private ArrayList[] ORFTrackers = new ArrayList[3]; -//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work - - public Sequence(String currHeader, int currentTextLine, int position) { - SequenceID = IDIncrement++; - header = currHeader; - lineNumber = currentTextLine; - offset = position; // in file - ORFTrackers[0]= new ArrayList(); - ORFTrackers[1]= new ArrayList(); - ORFTrackers[2]= new ArrayList(); - } - - public void addNewORF(long position, long charCounter, int modulo) { - //ORFTrackers.get(modulo).add(new ORF(position, charCounter)); // for nested arraylist - - ORFTrackers[modulo].add(new ORF(position, charCounter, this)); - } - - public void updateORFs(long endPos, long charCounter, int modulo) { - //ArrayList tracker = ORFTrackers.get(modulo); // for nested arraylist - assert (modulo >= 0 && modulo <= 2) : "MODULO CANT BE < 0 or > 2"; - ArrayList tracker = ORFTrackers[modulo]; - if (tracker.size() > 0) { - for ( ORF orf : tracker ) { - orf.endpos = endPos; - orf.counterEnd = charCounter; - - } - ORFList.addAll(tracker); - tracker.clear(); - } - } - - public long getRealSize() { - return RealSize; - } - - @Override - public Iterator iterator() { - return ORFList.iterator(); - } - public ArrayList makeTable_list(){ - tablelist = new ArrayList(); - int orfIdMaker = 0; - for(ORF orf:ORFList){ - String[] orfvalue = new String[5]; - orfvalue[0] = String.valueOf(SequenceID); - orfvalue[1] = String.valueOf(orf.getCounterStart()); - orfvalue[2] = String.valueOf(orf.counterEnd); - orfvalue[3] = String.valueOf(orf.getSize()); - orfvalue[4] = String.valueOf(orf.getID()); - tablelist.add(orfvalue); - } - return tablelist; - } - public String getStatistics() { - long totalOrfLength = 0; - long averageOrfLength = 0; - long shortestOrfLength= 0; - long longestOrfLength= 0; - int completedOrfCount = 0; - int incompleteOrfCount = 0; - - long size; - - for (ArrayList tracker : ORFTrackers) { - incompleteOrfCount += tracker.size(); - } - - for (ORF orf: ORFList ) { - completedOrfCount++; - size = orf.getSize(); - totalOrfLength += size; - - if (orf.getEndpos() != 0 && size < shortestOrfLength) { - shortestOrfLength = size; - } - if (size > longestOrfLength) { - longestOrfLength = size; - } - } - averageOrfLength = totalOrfLength / completedOrfCount; - - StringBuilder statistics = new StringBuilder("DNA header="); - statistics.append(header); - statistics.append("{ID=").append(SequenceID); - statistics.append(" StartPos=").append(offset); - statistics.append(" EndPos=").append(EndPos); - statistics.append(" CalculatedSize=").append(EndPos - offset); - statistics.append(" RealSize=").append(RealSize); - - - for (int i = 0; i < 10; i++) { - ORF o = ORFList.get(i); - statistics.append("\n\torf startpos=").append(o.getOffset()); - statistics.append(" endpos=").append(o.endpos); - statistics.append(" RealSize=").append(o.getSize()); - statistics.append(" StartCounter=").append(o.getCounterStart()); - statistics.append(" EndCounter=").append(o.counterEnd); - statistics.append(" ID: ").append(o.getID()); - statistics.append(" PARENT: ").append(o.parentSequence); - - } - - statistics.append(" totalOrfLength=").append(totalOrfLength); - statistics.append(" averageOrfLength=").append(averageOrfLength); - statistics.append(" longestOrfLength=").append(longestOrfLength); - statistics.append(" shortestOrfLength=").append(shortestOrfLength); - statistics.append(" incompleteOrfCount=").append(incompleteOrfCount); - statistics.append(" completedOrfCount=").append(completedOrfCount); - statistics.append("}"); - - System.out.println(statistics.toString()); - return statistics.toString(); - - } -} - From 3ab157b0b8d0ac71e7b254d303eb633a6904ec18 Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 20:20:04 +0200 Subject: [PATCH 33/43] get back a lost commit - filename in fastaseq --- .idea/workspace.xml | 8 +++++--- src/main/java/helpers/Reader.java | 11 ----------- src/main/java/orffinder/FastaSequence.java | 4 +++- src/main/java/orffinder/ORFFinder.java | 2 +- src/test/java/HelperTests/TestFastaConverter.java | 2 +- 5 files changed, 10 insertions(+), 17 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2f53a62..fad47f1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,7 +3,9 @@ - + + + - + diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java index 6ee4d69..07bdd6f 100644 --- a/src/main/java/helpers/Reader.java +++ b/src/main/java/helpers/Reader.java @@ -1,12 +1,7 @@ package helpers; -import orffinder.ORFFinder; -import orffinder.FastaSequence; - import javax.swing.*; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; public class Reader { @@ -26,10 +21,4 @@ public File FileChooser() { } return file; } - - public ArrayList getSeq_list() { - - return orfFinder.getInfoForVisualisation(); - } - } diff --git a/src/main/java/orffinder/FastaSequence.java b/src/main/java/orffinder/FastaSequence.java index 32e84f2..d8fea1f 100644 --- a/src/main/java/orffinder/FastaSequence.java +++ b/src/main/java/orffinder/FastaSequence.java @@ -5,7 +5,9 @@ public class FastaSequence implements Iterable { + final String header; + public String filename; final int SequenceID; private static int IDIncrement = 0; final long lineNumber; @@ -18,7 +20,7 @@ public class FastaSequence implements Iterable { private ArrayList[] ORFTrackers = new ArrayList[3]; //final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work - public FastaSequence(String currHeader, int currentTextLine, int position) { + public FastaSequence(String filename, String currHeader, int currentTextLine, int position) { SequenceID = IDIncrement++; header = currHeader; lineNumber = currentTextLine; diff --git a/src/main/java/orffinder/ORFFinder.java b/src/main/java/orffinder/ORFFinder.java index 2dc3a92..f605538 100644 --- a/src/main/java/orffinder/ORFFinder.java +++ b/src/main/java/orffinder/ORFFinder.java @@ -163,7 +163,7 @@ public void findOrfs(String filename) { } //end while headerbuilder currentTextLine++; - currentFastaSequence = new FastaSequence(currHeader.toString(), currentTextLine, position); + currentFastaSequence = new FastaSequence(filename, currHeader.toString(), currentTextLine, position); currHeader = null; fastaSequences.add(currentFastaSequence); diff --git a/src/test/java/HelperTests/TestFastaConverter.java b/src/test/java/HelperTests/TestFastaConverter.java index 589190c..6164668 100644 --- a/src/test/java/HelperTests/TestFastaConverter.java +++ b/src/test/java/HelperTests/TestFastaConverter.java @@ -11,7 +11,7 @@ public static void main(String[] args) { FastaConverter fc = new FastaConverter(); - FastaSequence seq = new FastaSequence("sequence 1", 0, 0); + FastaSequence seq = new FastaSequence("nofilename", "sequence 1", 0, 0); seq.EndPos = 100; seq.RealSize= 90; From 034340450abd5db63f2a22841b31103340905b6a Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:18:02 +0200 Subject: [PATCH 34/43] upload to sequence bug with getting last id and file returns null --- src/main/java/Database/DatabaseManager.java | 58 +++++++++++++++------ src/main/java/helpers/Reader.java | 8 +++ src/main/java/orffinder/FastaSequence.java | 5 +- src/main/java/orfgui/ORFVisualiser.java | 1 + 4 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java index 34d7355..16625aa 100644 --- a/src/main/java/Database/DatabaseManager.java +++ b/src/main/java/Database/DatabaseManager.java @@ -56,33 +56,37 @@ public void makeConnection() throws SQLException { } } public void insert() throws SQLException { + int nRowsInserted = 0; for(ORF orf : Selected_ORFs.keySet()){ // all id are auto increment String ORFtable_ORF_sequence = Selected_ORFs.get(orf); int ORFtable_start = (int) orf.getCounterStart(); int ORFtable_stop = (int) orf.counterEnd; - String Sequencetable_header = ""; - String Sequencetable_filename = "" ; - int Sequencetable_orfs_found = 0; + String Sequencetable_header = orf.parentFastaSequence.header; + String Sequencetable_filename = orf.parentFastaSequence.filename; + int Sequencetable_orfs_found = orf.parentFastaSequence.completedOrfCount; + int Sequencetable_length = (int) orf.parentFastaSequence.RealSize; + + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO sequence (header,filename,orfs_found,total_length) VALUES (?, ?, ?, ?);"); + preparedStatement.setString(1, Sequencetable_header); + preparedStatement.setString(2, "wtf"); // TODO: 9-4-2020 file gives null ?? heb het even veranderd om verdere foutmeldingen te vinden + preparedStatement.setInt(3, Sequencetable_orfs_found); + preparedStatement.setInt(4, Sequencetable_length); + nRowsInserted += preparedStatement.executeUpdate(); - //ORF id : auto increment + int last_id = Integer.parseInt(getlatestid()); // TODO: 9-4-2020 make this work + + PreparedStatement preparedStatement2 = connection.prepareStatement("INSERT INTO ORF (Sequence_id, start_position, stop_position, ORF_Sequence ) VALUES (?, ?, ?, ?);"); + preparedStatement2.setInt(1, last_id); + preparedStatement2.setInt(2, ORFtable_start); + preparedStatement2.setInt(3, ORFtable_stop); + preparedStatement2.setString(4, ORFtable_ORF_sequence); + nRowsInserted += preparedStatement2.executeUpdate(); } - int nRowsInserted = 0; - PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO test (name, quantity) VALUES (?, ?);"); - preparedStatement.setString(1, "banana"); - preparedStatement.setInt(2, 150); - nRowsInserted += preparedStatement.executeUpdate(); - - preparedStatement.setString(1, "orange"); - preparedStatement.setInt(2, 154); - nRowsInserted += preparedStatement.executeUpdate(); - - preparedStatement.setString(1, "apple"); - preparedStatement.setInt(2, 100); - nRowsInserted += preparedStatement.executeUpdate(); + System.out.println(String.format("Inserted %d row(s) of data.", nRowsInserted)); } public void download() throws SQLException { @@ -123,5 +127,25 @@ public void update() throws SQLException { } System.out.println("Execution finished."); } + public String getlatestid() throws SQLException { + String outputString = ""; + try { + + Statement statement = connection.createStatement(); + ResultSet results = statement.executeQuery("SELECT id FROM sequence \n" + + "ORDER BY id DESC \n" + + "LIMIT 1; "); + while (results.next()) { + outputString = + String.format( + "Data row = (%s)", + results.getString(1)); + + } + } catch (SQLException e) { + throw new SQLException("Encountered an error when executing given sql statement", e); + } + return outputString; + } } diff --git a/src/main/java/helpers/Reader.java b/src/main/java/helpers/Reader.java index 07bdd6f..c124d00 100644 --- a/src/main/java/helpers/Reader.java +++ b/src/main/java/helpers/Reader.java @@ -1,7 +1,12 @@ package helpers; +import orffinder.ORFFinder; +import orffinder.FastaSequence; + import javax.swing.*; import java.io.File; +import java.io.IOException; +import java.util.ArrayList; public class Reader { @@ -21,4 +26,7 @@ public File FileChooser() { } return file; } + + + } diff --git a/src/main/java/orffinder/FastaSequence.java b/src/main/java/orffinder/FastaSequence.java index d8fea1f..314a28e 100644 --- a/src/main/java/orffinder/FastaSequence.java +++ b/src/main/java/orffinder/FastaSequence.java @@ -6,7 +6,7 @@ public class FastaSequence implements Iterable { - final String header; + public final String header; public String filename; final int SequenceID; private static int IDIncrement = 0; @@ -14,6 +14,7 @@ public class FastaSequence implements Iterable { final long offset; // in file public long EndPos; public long RealSize; + public int completedOrfCount; private ArrayList tablelist; private ArrayList ORFList = new ArrayList(); @@ -78,7 +79,7 @@ public String getStatistics() { long averageOrfLength = 0; long shortestOrfLength= 0; long longestOrfLength= 0; - int completedOrfCount = 0; + completedOrfCount = 0; int incompleteOrfCount = 0; long size; diff --git a/src/main/java/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java index a3db906..f5634f7 100644 --- a/src/main/java/orfgui/ORFVisualiser.java +++ b/src/main/java/orfgui/ORFVisualiser.java @@ -392,6 +392,7 @@ private void MakeSelected_Table(ArrayList indexlist){ upload_button.addActionListener(e -> { try { DatabaseManager database = new DatabaseManager(Selected_ORF_list); + database.insert(); } catch (SQLException ex) { ex.printStackTrace(); From 0a9702139f94810ce45c8e7a1e6a42c74b889d8f Mon Sep 17 00:00:00 2001 From: Sannevastaveren <43061946+Sannevastaveren@users.noreply.github.com> Date: Thu, 9 Apr 2020 21:35:23 +0200 Subject: [PATCH 35/43] Fixed get last id bug --- src/main/java/Database/DatabaseManager.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/Database/DatabaseManager.java b/src/main/java/Database/DatabaseManager.java index 16625aa..54b9f83 100644 --- a/src/main/java/Database/DatabaseManager.java +++ b/src/main/java/Database/DatabaseManager.java @@ -132,19 +132,18 @@ public String getlatestid() throws SQLException { try { Statement statement = connection.createStatement(); - ResultSet results = statement.executeQuery("SELECT id FROM sequence \n" + - "ORDER BY id DESC \n" + - "LIMIT 1; "); + ResultSet results = statement.executeQuery("SELECT max(id) FROM sequence "); while (results.next()) { outputString = String.format( - "Data row = (%s)", - results.getString(1)); + "%s", + results.getInt(1)); } } catch (SQLException e) { throw new SQLException("Encountered an error when executing given sql statement", e); } + System.out.println(outputString); return outputString; } } From 59e1e15e1408560afa32454a7131908b7c89bcca Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 21:54:18 +0200 Subject: [PATCH 36/43] relocate testfile --- src/test/java/ORFFinderTests/TestORFFinder.java | 2 +- .../data/{Glennie the platypus.fa => Glennie_the_platypus.fa} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/test/resources/data/{Glennie the platypus.fa => Glennie_the_platypus.fa} (100%) diff --git a/src/test/java/ORFFinderTests/TestORFFinder.java b/src/test/java/ORFFinderTests/TestORFFinder.java index 22b3475..868e21e 100644 --- a/src/test/java/ORFFinderTests/TestORFFinder.java +++ b/src/test/java/ORFFinderTests/TestORFFinder.java @@ -9,7 +9,7 @@ public class TestORFFinder { public static void main(String[] args) { try { - File testfile = new File("D:\\GitHub\\Course7Informatica\\src\\test\\resources\\data\\DNA.txt"); + File testfile = new File("src/test/resources/data/Glennie_the_platypus.fa"); ORFFinder orfFinder = new ORFFinder(testfile); orfFinder.findOrfs();// orfFinder.printStats(); diff --git a/src/test/resources/data/Glennie the platypus.fa b/src/test/resources/data/Glennie_the_platypus.fa similarity index 100% rename from src/test/resources/data/Glennie the platypus.fa rename to src/test/resources/data/Glennie_the_platypus.fa From 9e0b10f0d9488944a0df2b649236adafcb673d9e Mon Sep 17 00:00:00 2001 From: Milain Lambers Date: Thu, 9 Apr 2020 21:54:56 +0200 Subject: [PATCH 37/43] fix wrong orf end in getOrf needed +1 range --- .idea/compiler.xml | 2 +- .idea/workspace.xml | 27 ++++++++++++++++--- Course7Informatica.iml | 3 ++- src/main/java/orffinder/ORFFinder.java | 12 ++++----- .../java/ORFFinderTests/TestORFFinder.java | 18 +++++++++++++ 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 06dfe98..073127d 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,7 +10,7 @@ - + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fad47f1..fb115c9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,12 @@ + - + - + + @@ -54,7 +60,7 @@ - + + +