diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4ed3132
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+
+src/test/resources/data/DNA.txt
+target/*
+
+
+classes/
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/artifacts/Course7Informatica_jar.xml b/.idea/artifacts/Course7Informatica_jar.xml
new file mode 100644
index 0000000..91690e4
--- /dev/null
+++ b/.idea/artifacts/Course7Informatica_jar.xml
@@ -0,0 +1,50 @@
+
+
+ $PROJECT_DIR$/classes/artifacts/Course7Informatica_jar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/unnamed.xml b/.idea/artifacts/unnamed.xml
new file mode 100644
index 0000000..3682257
--- /dev/null
+++ b/.idea/artifacts/unnamed.xml
@@ -0,0 +1,47 @@
+
+
+ $PROJECT_DIR$/classes/artifacts/unnamed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..073127d
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__cglib_cglib_3_2_8.xml b/.idea/libraries/Maven__cglib_cglib_3_2_8.xml
new file mode 100644
index 0000000..8284faf
--- /dev/null
+++ b/.idea/libraries/Maven__cglib_cglib_3_2_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_code_findbugs_annotations_3_0_1.xml b/.idea/libraries/Maven__com_google_code_findbugs_annotations_3_0_1.xml
new file mode 100644
index 0000000..12c6803
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_code_findbugs_annotations_3_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_1.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_1.xml
new file mode 100644
index 0000000..09453c9
--- /dev/null
+++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 0000000..d411041
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml
new file mode 100644
index 0000000..ec857e4
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_jcip_jcip_annotations_1_0.xml b/.idea/libraries/Maven__net_jcip_jcip_annotations_1_0.xml
new file mode 100644
index 0000000..d29c82f
--- /dev/null
+++ b/.idea/libraries/Maven__net_jcip_jcip_annotations_1_0.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_extras_beanshell_bsh_2_0b6.xml b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.xml
new file mode 100644
index 0000000..3b84834
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_extras_beanshell_bsh_2_0b6.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_hamcrest_hamcrest_2_1.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_2_1.xml
new file mode 100644
index 0000000..b170293
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_2_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..f58bbc1
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_2_1.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_2_1.xml
new file mode 100644
index 0000000..3b34e7a
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_2_1.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_jmock_jmock_2_12_0.xml b/.idea/libraries/Maven__org_jmock_jmock_2_12_0.xml
new file mode 100644
index 0000000..be4daa1
--- /dev/null
+++ b/.idea/libraries/Maven__org_jmock_jmock_2_12_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jmock_jmock_imposters_2_12_0.xml b/.idea/libraries/Maven__org_jmock_jmock_imposters_2_12_0.xml
new file mode 100644
index 0000000..e6be483
--- /dev/null
+++ b/.idea/libraries/Maven__org_jmock_jmock_imposters_2_12_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jmock_jmock_junit4_2_12_0.xml b/.idea/libraries/Maven__org_jmock_jmock_junit4_2_12_0.xml
new file mode 100644
index 0000000..d68c568
--- /dev/null
+++ b/.idea/libraries/Maven__org_jmock_jmock_junit4_2_12_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jmock_jmock_legacy_2_12_0.xml b/.idea/libraries/Maven__org_jmock_jmock_legacy_2_12_0.xml
new file mode 100644
index 0000000..e5d5691
--- /dev/null
+++ b/.idea/libraries/Maven__org_jmock_jmock_legacy_2_12_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jmock_jmock_testjar_2_12_0.xml b/.idea/libraries/Maven__org_jmock_jmock_testjar_2_12_0.xml
new file mode 100644
index 0000000..6dfd7f9
--- /dev/null
+++ b/.idea/libraries/Maven__org_jmock_jmock_testjar_2_12_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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/.idea/libraries/Maven__org_objenesis_objenesis_3_0_1.xml b/.idea/libraries/Maven__org_objenesis_objenesis_3_0_1.xml
new file mode 100644
index 0000000..8178067
--- /dev/null
+++ b/.idea/libraries/Maven__org_objenesis_objenesis_3_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_ow2_asm_asm_7_1.xml b/.idea/libraries/Maven__org_ow2_asm_asm_7_1.xml
new file mode 100644
index 0000000..1d8827d
--- /dev/null
+++ b/.idea/libraries/Maven__org_ow2_asm_asm_7_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/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/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..8989cfd
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1586298334998
+
+
+ 1586298334998
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Course7Informatica.iml b/Course7Informatica.iml
new file mode 100644
index 0000000..c564664
--- /dev/null
+++ b/Course7Informatica.iml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 8173e4f..26354ac 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,31 @@
-# Course7Informatica
\ No newline at end of file
+# ORFFinder
+Welcome to our repository.
+
+### [Find latest releases here](https://github.com/Queuebee2/Course7Informatica/releases)
+
+# Installation
+Download the **ORFFinder.jar** from the release page and run it using java.
+
+
+### java version 11+
+Install the latest version of java, version 11 and above should run the program fine as of now. Tested with Java 11, 12.
+
+### using windows
+Assuming java is correctly installed and set as the default program to open .jar files, a (double) click on **ORFFinder.jar** after navigating to its directory should launch the program.
+
+### using Linux
+use `java -jar ORFFinder.jar` to launch the program
+
+# Usage
+
+### opening a fasta file
+In the menubar, select file `File` then `New ORF search`. A filechooser should appear. Select the fastafile you want to find ORFs in and click `save`.
+
+ORFs should now automatically be determined for each sequence (determined by > headers) in the fastafile
+
+
+### uploading ORFs
+To save ORFs, select the ORFs and press `UPLOAD`.
+
+### Blasting ORFs
+this feature isn't implemented in the current release.
diff --git a/blastOutput.xml b/blastOutput.xml
new file mode 100644
index 0000000..06f87d1
--- /dev/null
+++ b/blastOutput.xml
@@ -0,0 +1,1386 @@
+
+
+
+ blastn
+ BLASTN 2.10.0+
+ Stephen F. Altschul, Thomas L. Madden, Alejandro A. Schä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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence, complete fastaSequence
+ 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 fastaSequence for Oryza sativa, Nipponbare strain, clone OSJNBa0048F08, from chromosome 3, complete fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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 fastaSequence
+ 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/pom.xml b/pom.xml
new file mode 100644
index 0000000..fecd095
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+
+ groupId
+ Course7Informatica
+ 1.0-SNAPSHOT
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
+
+
+
+
+ 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
+
+
+ org.jetbrains
+ annotations
+ RELEASE
+ compile
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 2.6.0
+
+
+ org.jmock
+ jmock-junit4
+ 2.12.0
+
+
+
+
+
+
+ biojava-maven-repo
+ BioJava repository
+ http://www.biojava.org/download/maven/
+
+
+
+
\ No newline at end of file
diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4c26e45
--- /dev/null
+++ b/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: app
+
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
new file mode 100644
index 0000000..3760d6a
--- /dev/null
+++ b/src/main/java/Database/DatabaseManager.java
@@ -0,0 +1,227 @@
+package Database;
+
+
+import orffinder.FastaSequence;
+import orffinder.ORF;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+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;
+ private HashMap Selected_ORFs;
+
+ 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.");
+ }
+ }
+
+
+ /**
+ * TODO translate to java
+ * make hashmap
+ * for orf in selectedOrfs.keys():
+ * if orf.parent in hashmap.keys():
+ * arraylist = hashmap.get(parent)
+ * arraylist.add(orf)
+ * else
+ * make new arralist
+ * arraylist.add(orf)
+ * hashmap.put(orf.parent, arraylist)
+ */
+
+ /**
+ *
+ * @param selected_ORF_list
+ * @throws SQLException
+ */
+ public void insert(HashMap selected_ORF_list) throws SQLException {
+
+ Selected_ORFs = selected_ORF_list;
+ ArrayList seqlist = new ArrayList<>();
+ int nRowsInserted = 0;
+ System.out.println("amount of orfs selected: " + Selected_ORFs.size());
+
+ for(ORF orf : Selected_ORFs.keySet()){
+ FastaSequence seq = orf.getParentFastaSequence(); //todo ? problem: if multiple sequences, what do we do?
+ if (!seqlist.contains(seq)){
+ seqlist.add(seq); // todo: sort selected orfs into buckets of Sequence:
+ }
+ }
+
+ for (FastaSequence seq : seqlist){
+ String Sequencetable_header = seq.header;
+ String Sequencetable_filename = seq.getFilename();
+ int Sequencetable_orfs_found = seq.completedOrfCount;
+ int Sequencetable_length = (int) seq.RealSize;
+
+ PreparedStatement preparedStatement = connection.prepareStatement(
+ "INSERT INTO sequence " +
+ "(header,filename,orfs_found,total_length) " +
+ "VALUES (?, ?, ?, ?);");
+ preparedStatement.setString(1, Sequencetable_header);
+ preparedStatement.setString(2, Sequencetable_filename); // 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();
+ }
+ for(ORF orf : Selected_ORFs.keySet()){
+ // all id are auto increment
+ String ORFtable_ORF_sequence = Selected_ORFs.get(orf);
+ int ORFtable_start = orf.getStartPosInSequence();
+ int ORFtable_stop = (int) orf.counterEnd;
+
+
+ int last_id = Integer.parseInt(getlatestid()); // TODO: 9-4-2020 make this work // TODO TRY getLatestIdByHeader (new method, pass seq or header&filename)
+
+ 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();
+
+
+ }
+
+ 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)); // todo 12 ORFS -> 16 rows??? 4 -> 8
+
+ // 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.");
+ }
+
+ public String getlatestid() throws SQLException {
+ String outputString = "";
+ try {
+ Statement statement = connection.createStatement();
+ ResultSet results = statement.executeQuery("SELECT max(id) FROM sequence ");
+ while (results.next()) {
+ outputString =
+ String.format(
+ "%s",
+ results.getInt(1));
+
+ }
+ } catch (SQLException e) {
+ throw new SQLException("getlatestid: Encountered an error when executing given sql statement", e);
+ }
+ System.out.println(outputString);
+ return outputString;
+ }
+
+
+ /**
+ * get the latest ID of a sequence from database based on header and filename
+ * @param sequence
+ * @return
+ */
+ public String getLatestIdByHeader(FastaSequence sequence) throws SQLException {
+ return getLatestIdByHeader(sequence.header, sequence.getFilename());
+ }
+
+ public String getLatestIdByHeader(String sequenceHeader, String sequenceFilename) throws SQLException {
+ String outputString = "";
+ try {
+ Statement statement = connection.createStatement();
+ ResultSet results = statement.executeQuery(
+ "select max(id) " +
+ "from Sequence " +
+ "where header like '%'"+sequenceHeader+"'%' " +
+ "and filename like '%'"+sequenceFilename+"'%';");
+
+ while (results.next()) {
+ outputString =
+ String.format(
+ "%s",
+ results.getInt(1));
+
+ }
+ } catch (SQLException e) {
+ throw new SQLException("getLatestIdByHeader: Encountered an error when executing given sql statement", e);
+ }
+ System.out.println(outputString);
+ return outputString;
+ }
+
+}
+
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/META-INF/MANIFEST.MF b/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4c26e45
--- /dev/null
+++ b/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: app
+
diff --git a/src/main/java/app.java b/src/main/java/app.java
new file mode 100644
index 0000000..786c613
--- /dev/null
+++ b/src/main/java/app.java
@@ -0,0 +1,13 @@
+import orfgui.ORFVisualiser;
+
+import java.sql.SQLException;
+
+public class app {
+ public static void main(String[] args) {
+ try {
+ new ORFVisualiser();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/blast/ORFBlaster.java b/src/main/java/blast/ORFBlaster.java
new file mode 100644
index 0000000..e541709
--- /dev/null
+++ b/src/main/java/blast/ORFBlaster.java
@@ -0,0 +1,100 @@
+package blast;
+
+import orffinder.ORF;
+import orffinder.ORFFinder;
+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;
+
+
+ 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
+ */
+
+ }
+
+ public void blastORFselection(List orfs, ORFFinder finder) {
+
+
+ for ( ORF orf : orfs) {
+
+ }
+ }
+
+ /**
+ * 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/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/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..c124d00
--- /dev/null
+++ b/src/main/java/helpers/Reader.java
@@ -0,0 +1,32 @@
+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 {
+ private static File file;
+
+ public 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();
+ }
+ }
+ return file;
+ }
+
+
+
+}
diff --git a/src/main/java/main/Controller.java b/src/main/java/main/Controller.java
new file mode 100644
index 0000000..5c0aff0
--- /dev/null
+++ b/src/main/java/main/Controller.java
@@ -0,0 +1,11 @@
+package main;
+
+public class Controller {
+
+ public Controller() {
+
+ }
+
+ public static void BLAST() {
+ }
+}
diff --git a/src/main/java/main/Settings.java b/src/main/java/main/Settings.java
new file mode 100644
index 0000000..3e221ce
--- /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 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
new file mode 100644
index 0000000..2ca8b88
--- /dev/null
+++ b/src/main/java/orffinder/FastaSequence.java
@@ -0,0 +1,165 @@
+package orffinder;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+public class FastaSequence implements Iterable, Serializable {
+
+
+ public final String header;
+ private String fastaFilename;
+ public final int SequenceID;
+ private static int IDIncrement = 0;
+ final long lineNumber;
+ final long offset; // in file
+ public long EndPos;
+ public long RealSize;
+ private ORFFinder finder;
+ private ArrayList tablelist;
+
+
+ private ArrayList ORFList = new ArrayList();
+ private ArrayList[] ORFTrackers = new ArrayList[3];
+ public int completedOrfCount = ORFList.size();
+//final ArrayList> ORFTrackers = new ArrayList < ArrayList < ORF >> (3); // if above doesnt work
+
+ public FastaSequence(ORFFinder finder, String filename, String currHeader, int currentTextLine, int position) {
+ this.SequenceID = IDIncrement++;
+ this.fastaFilename = filename;
+ this.finder = finder;
+ header = currHeader;
+ lineNumber = currentTextLine;
+ offset = position; // in file
+ ORFTrackers[0]= new ArrayList();
+ ORFTrackers[1]= new ArrayList();
+ ORFTrackers[2]= new ArrayList();
+ }
+
+// public FastaSequence(String mock) {
+// if (mock.equals("mock)")) {
+// header = "mocking header";
+// lineNumber = 10;
+// offset = 700;
+// filename = "mockFilename";
+// } else {
+// throw new IllegalArgumentException("mock fastasequence failed");
+// }
+// }
+
+ public void addNewORF(int position, int 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;
+ }
+
+ public ORFFinder getORFFinder() {
+ return finder;
+ }
+
+ public String getFilename() {
+ return fastaFilename;
+ }
+
+ @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.getStartPosInFile());
+ 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;
+ 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.getEndPosInSequence());
+ statistics.append(" EndCounter=").append(o.counterEnd);
+ statistics.append(" ID: ").append(o.getID());
+ statistics.append(" PARENT: ").append(o.getParentFastaSequence());
+
+ }
+
+ 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/orffinder/ORF.java b/src/main/java/orffinder/ORF.java
new file mode 100644
index 0000000..66f7788
--- /dev/null
+++ b/src/main/java/orffinder/ORF.java
@@ -0,0 +1,106 @@
+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
+
+ // currently testing
+ private FastaSequence parentFastaSequence;
+ private int ID;
+ static int orfsmade = 0;
+
+// public ORF(String mockery) {
+// if (mockery.equals("mock")) {
+// offset = 10;
+// endpos = 23;
+// counterStart = 100;
+// counterEnd = 113;
+// parentFastaSequence = new FastaSequence("mock");
+// } else {
+// throw new IllegalArgumentException("mock ORF failed");
+// }
+//
+// }
+
+public ORF(int position, int charCounter, FastaSequence parent) {
+
+ offset = position;
+ counterStart = charCounter;
+
+ // currently testing (speed)
+ parentFastaSequence = parent;
+ ID = orfsmade++;
+}
+
+ public int getLength() {
+ return getSize();
+ }
+
+ public int getSize() {
+ return (int) (counterEnd-counterStart);
+ }
+
+
+ /**
+ *
+ * @return int: absolute byte-offset in ansii fasta file
+ */
+ public int getOffset() {
+ return (int) offset;
+ }
+
+ public int getStartPosInFile() {
+ return getOffset();
+ }
+
+ public int getEndPosInFile() {
+ return (int) getEndpos();
+ }
+
+ public int getStartPosInSequence() {
+ return (int) counterStart;
+ }
+
+ public int getEndPosInSequence() {
+ return (int) counterEnd;
+ }
+
+ @Deprecated
+ public long getCounterStart() {
+ return counterStart;
+ }
+
+ /**
+ *
+ * @return int: absolute byte-end in ansii fasta file
+ */
+ public int getEndpos() {
+ return (int) endpos;
+ }
+
+ public int getID(){
+ return ID;
+ }
+
+ public FastaSequence getParentFastaSequence() {
+ return parentFastaSequence;
+ }
+
+ public String toFastaFormat() {
+ StringBuilder fastaBuilder = new StringBuilder();
+
+ fastaBuilder.append("> ORF:").append(getParentFastaSequence().getFilename()+":");
+
+ fastaBuilder.append(counterStart+":"+counterEnd).append(":"+ (getLength() % 3) + "\n"); // pos and frame!
+ String ORFDNASequnceString = getParentFastaSequence().getORFFinder().getOrf(this);
+ fastaBuilder.append(ORFDNASequnceString).append("\n");
+
+ return fastaBuilder.toString();
+ }
+}
+
+
+// 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..927b219
--- /dev/null
+++ b/src/main/java/orffinder/ORFFinder.java
@@ -0,0 +1,409 @@
+package orffinder;
+
+
+import helpers.MaskFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.math.BigDecimal;
+import java.nio.ByteOrder;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+
+// 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 fastaSequences = new ArrayList(100);
+ private File file;
+ private RandomAccessFile mainRAFile;
+ private FileChannel mainFileChannel;
+ private MappedByteBuffer mainBuffer;
+
+ public static void main(String[] args) {
+
+ }
+
+ public ORFFinder() {
+ // SHOOT ME IN THE FOOT (took ~xxxhours to figure out)
+
+ }
+
+ public void setFile(File file) throws IOException {
+ this.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);
+ }
+
+
+ /**
+ * 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() {
+
+ // TIME LOGGING
+ long startTime = System.nanoTime();
+
+ // variables
+ StringBuilder currHeader;
+ byte b_byteAtPointer;
+ long currentCodonLong;
+ int position;
+ int charCounter;
+ int currentTextLine;
+
+ // initialise some
+ FastaSequence currentFastaSequence = 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 (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();
+ 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++;
+ currentFastaSequence = new FastaSequence(this, file.getName(), currHeader.toString(), currentTextLine, position);
+
+ currHeader = null;
+ fastaSequences.add(currentFastaSequence);
+ charCounter = 0;
+ continue; // do not increment position but continue
+
+
+ // check orf start
+ case A:
+ 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 )
+ currentCodonLong = buffer.getInt(p_pointerPos) & MASK_3;
+
+
+ if (currentCodonLong == ATG) {
+ 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) {
+ currentFastaSequence.addNewORF(position, charCounter, charCounter % 3);
+ }
+ }
+
+ break;
+
+ // check if orf ends
+ case T:
+ assert currentFastaSequence != null : "NO FUCKING DNA";
+
+ currentCodonLong = buffer.getInt(position) & MASK_3;
+
+ if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) {
+ currentFastaSequence.updateORFs(position + 2, charCounter + 2, charCounter % 3);
+
+ } else {
+ currentCodonLong = compress(buffer.getLong(p_pointerPos), isUnix);
+ if (currentCodonLong == TAG || currentCodonLong == TAA || currentCodonLong == TGA) {
+ currentFastaSequence.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 (currentFastaSequence != null) {
+ if (currentFastaSequence.EndPos == 0) {
+ currentFastaSequence.EndPos = lastValidDNACharacterPos;
+ currentFastaSequence.RealSize = charCounter + 1;
+ }
+ }
+ //currentFastaSequence.getStatistics();
+
+
+ // Print logged time
+ logTime(startTime, 4);
+
+
+ }
+
+ public void printStats() {
+ for (FastaSequence seq : fastaSequences) {
+ 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 (FastaSequence seq : fastaSequences
+ ) {
+ 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 = orf.getEndpos() + 1;
+ 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 ArrayList getSequences() {
+ return getFastaSequences();
+ }
+ public ArrayList getFastaSequences() {
+ return fastaSequences;
+ }
+
+ 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/orfgui/ORFVisualiser.java b/src/main/java/orfgui/ORFVisualiser.java
new file mode 100644
index 0000000..c30f0b6
--- /dev/null
+++ b/src/main/java/orfgui/ORFVisualiser.java
@@ -0,0 +1,533 @@
+package orfgui;
+import Database.DatabaseManager;
+import helpers.Reader;
+import orffinder.FastaSequence;
+import orffinder.ORF;
+import orffinder.ORFFinder;
+
+import javax.swing.*;
+import javax.swing.border.Border;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.JTableHeader;
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.sql.SQLException;
+import java.util.*;
+
+public class ORFVisualiser extends JFrame {
+ private JFrame mainFrame;
+ private JLabel headerLabel;
+ private JLabel statusLabel;
+ private JPanel controlPanel;
+ private JScrollPane displayfile;
+ private ORFFinder orfFinder;
+ private HashMap ORFlist;
+ private JTable selected_table;
+ private JPanel sidepanel;
+ private JTextField pathToFile;
+ private JTextArea textofFile;
+ private JLabel jLabelEmptyHolderImage;
+ private ArrayList list;
+ private ArrayList reclist;
+ private JTable table;
+ private HashMap Selected_ORF_list;
+ private ListSelectionModel listSelectionModel;
+ private String Blasttype;
+ private DatabaseManager database;
+
+ 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() throws SQLException {
+
+
+ new SplashScreenDemo();
+ prepareGUI();
+ HolderImage();
+ showFile();
+ showMenuDemo();
+
+ }
+
+ public static void main(String[] args) throws SQLException {
+ ORFVisualiser swingMenuDemo = new ORFVisualiser();
+
+
+
+
+ }
+ private void setLookAndFeel() {
+ try {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
+ e.printStackTrace();
+ }
+ }
+ private void prepareGUI() throws SQLException {
+ database = new DatabaseManager();
+ setLookAndFeel();
+ mainFrame = new JFrame("orfgui");
+ mainFrame.setSize(1000, 1000);
+ mainFrame.setLayout(new BorderLayout(1,1));
+ 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,BorderLayout.CENTER);
+ //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 ArrayList makeRec() {
+ System.out.println("im making more rectangles");
+
+ reclist = new ArrayList();
+ int firstline = 10;
+ for (FastaSequence fastaSequence : list) {
+ firstline = firstline + 30;
+ for (ORF orf : fastaSequence) {
+ Random rand = new Random();
+ int start = (int) orf.getStartPosInSequence();
+ 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(list,reclist);
+ visScreen.setBackground(lighter_black);
+ //visScreen.setBounds(5,240,970,685);
+
+ System.out.println("got lengths" + list.size());
+ int largest = 0;
+ for (FastaSequence fastaSequence : list){
+ int Length = (int) fastaSequence.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);
+ //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 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 = {"FastaSequence ID", "Start", "End", "Length", "ID"};
+ tableModel = new DefaultTableModel(columnNames, 0);
+ }
+ else{
+
+ tableModel = (DefaultTableModel) table.getModel();
+ tableModel.setRowCount(0);
+ }
+
+ for (FastaSequence fastaSequence : list) {
+ table_list = fastaSequence.makeTable_list();
+ for (String[] string : table_list) {
+
+ //System.out.println(Arrays.toString(string));
+ 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);
+ 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.setBorder(blackline);
+ sp.setViewportView(table);
+ listSelectionModel = table.getSelectionModel();
+ listSelectionModel.addListSelectionListener(
+ new SharedListSelectionHandler()
+ );
+ controlPanel.add(sp,BorderLayout.SOUTH);
+ }
+ }
+ 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 MakeORFlist(){
+ ORFlist = new HashMap<>();
+ for(FastaSequence fastaSequence : list){
+ for(ORF orf : fastaSequence){
+ 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);
+ 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 :)");
+ }
+ private void MakeSelected_Table(ArrayList indexlist){
+ Selected_ORF_list = new HashMap();
+ DefaultTableModel tableModel = null;
+ 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", "FastaSequence"};
+ 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);
+ Selected_ORF_list.put(orf,sequence);
+ 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);
+
+ 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);
+ 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));
+ upload_button.addActionListener(e -> {
+ try {
+ System.out.println("amount "+Selected_ORF_list.size());
+ database.insert(Selected_ORF_list);
+
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ });
+ 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();
+ 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);
+ System.out.println(index);
+ indexlist.add(index);
+
+ }
+ }
+ MakeSidePanel(indexlist);
+ }
+
+ }
+ }
+ }
+
+ class Blast_Actionlistner implements java.awt.event.ActionListener {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JComboBox cb = (JComboBox)e.getSource();
+ Blasttype = (String)cb.getSelectedItem();
+
+ System.out.println(Blasttype);
+ }
+
+ }
+ 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":
+ Reader reader = new Reader();
+ File file = reader.FileChooser();
+ try {
+ orfFinder = new ORFFinder();
+ orfFinder.setFile(file);
+ orfFinder.findOrfs();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ pathToFile.setText(String.valueOf(file));
+ try { // todo disabled due to memory issues
+ FileDisplayer(file);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ list = orfFinder.getFastaSequences();
+ MakeORFlist();
+ ORFtable();
+ //reclist = makeRec();
+ //ORFvisualisatie();
+ controlPanel.repaint();
+ controlPanel.remove(jLabelEmptyHolderImage);
+ controlPanel.validate();
+ break;
+
+ 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/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/SplashScreenDemo.java b/src/main/java/orfgui/SplashScreenDemo.java
new file mode 100644
index 0000000..f811bb7
--- /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("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/src/main/java/orfgui/VisualisatiePane.java b/src/main/java/orfgui/VisualisatiePane.java
new file mode 100644
index 0000000..79416d5
--- /dev/null
+++ b/src/main/java/orfgui/VisualisatiePane.java
@@ -0,0 +1,44 @@
+package orfgui;
+import orffinder.FastaSequence;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.ArrayList;
+
+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;
+ super.paintComponent(g);
+ Graphics2D g2 = (Graphics2D) g;
+ g2.setColor(Color.WHITE);
+ g2.setStroke(new BasicStroke(2));
+ for (FastaSequence s: seq_list){
+ int size = (int) s.getRealSize();
+ firstline = firstline + 30;
+ 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());
+ }
+ }
+
+ //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 0000000..8075687
Binary files /dev/null and b/src/main/resources/DNA-512.png differ
diff --git a/src/main/resources/genes.gif b/src/main/resources/genes.gif
new file mode 100644
index 0000000..e48a847
Binary files /dev/null and b/src/main/resources/genes.gif differ
diff --git a/src/main/resources/hatebed.gif b/src/main/resources/hatebed.gif
new file mode 100644
index 0000000..00d84a5
Binary files /dev/null and b/src/main/resources/hatebed.gif differ
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..9f13cac
--- /dev/null
+++ b/src/test/java/BlastTests/TestORFBlaster.java
@@ -0,0 +1,52 @@
+package BlastTests;
+
+import blast.ORFBlaster;
+import orffinder.FastaSequence;
+import orffinder.ORF;
+import orffinder.ORFFinder;
+import org.jmock.Mockery;
+
+public class TestORFBlaster {
+
+ private static final Mockery context = new Mockery();
+
+ // TODO FIX ILLEGALARGUMENTEXCEPTION :(
+ public static void main(String[] args) {
+ // set up
+ final ORFFinder finder = context.mock(ORFFinder.class);
+ //context.setDefaultResultForType(ORFFinder.class, "AAAAAAAAATTACHGGG");
+
+ final ORFBlaster orfBlaster = new ORFBlaster();
+ FastaSequence sequence = new FastaSequence(finder, "test filename", "test header", 0, 0);
+ ORF orf = new ORF(14, 0, sequence);
+
+ // expectations
+// context.checking(new Expectations() {{
+// oneOf (ORFFinder.class).getOrf(ORF.class); will(returnValue("ATACGAGGCAGTACT"));}
+//
+// });
+ // String fastaString = orf.toFastaFormat();
+ //orfBlaster.blastn(fastaString);
+
+
+ }
+// private static final String SEQUENCE = "ATTATAAACGACATAATCGATCGATGCATGTAATATATATAGCTAGCTAGCAGATGCTAGTCGACGATGATGA";
+//
+// public static void main(String[] args) {
+//
+// Mockery mocky = new Mockery();
+// mocky.checking(new ExpectationBuilder() {
+// @Override
+// public void buildExpectations(Action action, ExpectationCollector expectationCollector) {
+//
+// }
+// });
+// ORFBlaster orfBlaster = new ORFBlaster();
+// ORFFinder finder = new ORFFinder(mocky);
+// FastaSequence = new FastaSequence()
+// ORF = new ORF();
+// orfBlaster.blastn(SEQUENCE);
+// }
+
+ }
+
diff --git a/src/test/java/GUITests/TestORFVis.java b/src/test/java/GUITests/TestORFVis.java
new file mode 100644
index 0000000..c854485
--- /dev/null
+++ b/src/test/java/GUITests/TestORFVis.java
@@ -0,0 +1,16 @@
+package GUITests;
+
+import orfgui.ORFVisualiser;
+
+import java.sql.SQLException;
+
+public class TestORFVis {
+
+ public static void main(String[] args) {
+ try {
+ new ORFVisualiser();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/test/java/HelperTests/TestFastaConverter.java b/src/test/java/HelperTests/TestFastaConverter.java
new file mode 100644
index 0000000..2a9bb09
--- /dev/null
+++ b/src/test/java/HelperTests/TestFastaConverter.java
@@ -0,0 +1,15 @@
+package HelperTests;
+
+import helpers.FastaConverter;
+
+// 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();
+
+
+ }
+}
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 {
+}
diff --git a/src/test/java/ORFFinderTests/TestORFFinder.java b/src/test/java/ORFFinderTests/TestORFFinder.java
new file mode 100644
index 0000000..4930b06
--- /dev/null
+++ b/src/test/java/ORFFinderTests/TestORFFinder.java
@@ -0,0 +1,40 @@
+package ORFFinderTests;
+
+import orffinder.FastaSequence;
+import orffinder.ORF;
+import orffinder.ORFFinder;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class TestORFFinder {
+
+ public static void main(String[] args) {
+ try {
+ File testfile = new File("src/test/resources/data/Glennie_the_platypus.fa");
+ ORFFinder orfFinder = new ORFFinder();
+ orfFinder.setFile(testfile);
+ orfFinder.findOrfs();//
+ orfFinder.printStats();
+ orfFinder.getallOrfs();
+ ArrayList bob = orfFinder.getFastaSequences();
+
+ for ( FastaSequence sequence : bob ) {
+
+ int count = 0;
+ for ( ORF orf : sequence ) {
+ System.out.println(orf.toFastaFormat());
+ count++;
+ if (count > 10) {
+ break;
+ }
+ }
+
+
+ }
+ } 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..a429d84
--- /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 fastaSequence
+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
+