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 + + + + + + + + + \ 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&auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), "Gapped BLAST and PSI-BLAST: a new generation of protein database search programs", Nucleic Acids Res. 25:3389-3402. + nt + Query_65393 + No definition line + 73 + + + 10 + 2 + -3 + 5 + 2 + L;m; + + + + + 1 + Query_65393 + No definition line + 73 + + + 1 + gi|1147572706|ref|XM_020234422.1| + PREDICTED: Ananas comosus protein LE25-like (LOC109711408), mRNA + XM_020234422 + 788 + + + 1 + 48.1739 + 52 + 0.0321691 + 6 + 47 + 626 + 584 + 1 + -1 + 37 + 37 + 1 + 43 + AAACGACATAATCGATCGATGCATGTA-ATATATATAGCTAGC + AAAGGACGTACTCGATCGATATATGTATATATATATAGCTAGC + ||| ||| || ||||||||| ||||| ||||||||||||||| + + + + + 2 + gi|1695378363|emb|LR597565.1| + Myripristis murdjan genome assembly, chromosome: 16 + LR597565 + 34798541 + + + 1 + 45.4688 + 49 + 0.3919 + 24 + 55 + 26832830 + 26832861 + 1 + 1 + 29 + 29 + 0 + 32 + ATGCATGTAATATATATAGCTAGCTAGCAGAT + ATGCATGTAATATAACTAGCTAGCTAACAGAT + |||||||||||||| |||||||||| ||||| + + + + + 3 + gi|1443043166|ref|XM_015792939.2| + PREDICTED: Oryza sativa Japonica Group flowering-promoting factor 1-like protein 2 (LOC4326826), mRNA + XM_015792939 + 1357 + + + 1 + 44.5672 + 48 + 0.3919 + 13 + 51 + 500 + 538 + 1 + 1 + 33 + 33 + 0 + 39 + ATAATCGATCGATGCATGTAATATATATAGCTAGCTAGC + ATAATCAATCCATCCACATAATATATAGAGCTAGCTAGC + |||||| ||| || || ||||||||| ||||||||||| + + + + + 4 + gi|1189419115|gb|CP018157.1| + Oryza sativa Indica Group cultivar Shuhui498 chromosome 1 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 +