diff --git a/README.md b/README.md index 3b59162aa963268ce274afab8ec29166e517fe30..4f68195edc20e56865d6e7b8cdcc76facce9c8fb 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,26 @@ [_REQ_](https://research.pasteur.fr/fr/tool/r%CE%B5q-assessing-branch-supports-o%C6%92-a-distance-based-phylogenetic-tree-with-the-rate-o%C6%92-elementary-quartets/) is a command line program written in [Java](https://docs.oracle.com/javase/8/docs/technotes/guides/language/index.html) that estimates the rate of elementary quartets (REQ) for each internal branch of an unrooted binary phylogenetic tree from a distance matrix, as described by [Guénoche and Garreta (2001)](https://doi.org/10.1007/3-540-45727-5_5). +## Installation + +Clone this repository using the following command line: +```bash +git clone https://gitlab.pasteur.fr/GIPhy/REQ.git +``` + ## Compilation and execution -The source code of _REQ_ is inside the _src_ directory and can be compiled and executed in two different ways. + +The source code of _REQ_ is inside the _src_ directory and can be compiled and executed in two different ways. #### Building an executable jar file -On computers with [Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) (6 or higher) installed, a Java executable jar file can be created. -In a command-line window, go to the _src_ directory and type: +On computers with [Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) (6 or higher) installed, a Java executable jar file can be created by typing the following command lines inside the _src/_ directory: ```bash -javac REQ.java -echo Main-Class: REQ > MANIFEST.MF -jar -cmvf MANIFEST.MF REQ.jar REQ.class -rm MANIFEST.MF REQ.class +javac REQ.java +echo Main-Class: REQ > MANIFEST.MF +jar -cmvf MANIFEST.MF REQ.jar REQ.class +rm MANIFEST.MF REQ.class ``` This will create the executable jar file `REQ.jar` that can be run with the following command line model: ```bash @@ -23,12 +30,12 @@ java -jar REQ.jar [files] #### Building a native executable -On computers with [GraalVM](hhttps://www.graalvm.org/downloads/) installed, a native executable can also be built. +On computers with [GraalVM](hhttps://www.graalvm.org/downloads/) installed, a native executable can be built. In a command-line window, go to the _src_ directory, and type: ```bash -javac REQ.java +javac REQ.java native-image REQ REQ -rm REQ.class +rm -f REQ.build_artifacts.txt REQ.class ``` This will create the native executable `REQ` that can be launched with the following command line model: ```bash diff --git a/src/REQ.java b/src/REQ.java index 4f85213796ddbe4d064dfea17fbd4e236391a2f2..1c3f577aed10ab9b490dacd69842b152a25b6879 100644 --- a/src/REQ.java +++ b/src/REQ.java @@ -3,7 +3,7 @@ REQ: assessing branch supports of a distance-based phylogenetic tree with rates of elementary quartets - Copyright (C) 2017,2018,2019,2020 Institut Pasteur + Copyright (C) 2017-2024 Institut Pasteur This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -19,15 +19,32 @@ Contact: Alexis Criscuolo alexis.criscuolo@pasteur.fr Genome Informatics & Phylogenetics (GIPhy) giphy.pasteur.fr - Bioinformatics and Biostatistics Hub research.pasteur.fr/team/hub-giphy - USR 3756 IP CNRS research.pasteur.fr/team/bioinformatics-and-biostatistics-hub - Dpt. Biologie Computationnelle research.pasteur.fr/department/computational-biology + Centre de Ressources Biologiques de l'Institut Pasteur (CRBIP) research.pasteur.fr/en/b/VTq Institut Pasteur, Paris, FRANCE research.pasteur.fr + 4888888883 + 48800007 4003 1 + 4880000007 400001 83 101 100 01 4000009 888888888 101 888888888 08 80 888888888 + 4000000008 8000001 83 181 10101 01 601 1 181 181 181 08 80 181 + 40000000008 8000001 803 181 10 101 01 60003 181 181 181 08 80 181 + 100888880008 800007 60003 181 10 10101 4 109 181 181 181 68 87 181 + 81 68888 80887 600008 101 10 001 0000007 101 101 101 600009 101 + 808883 1 887 6000008 + 8000000003 480000008 + 600000000083 888000000007 10000000 40 4000009 888888888 10000000 08 80 1000000 + 60000000008 80000000007 180 39 4000 601 1 181 10 08 80 10 39 + 6000000008 8000000007 18000007 47 00 60003 181 1000000 08 80 1000007 + 680000008 800000087 180 40000000 4 109 181 10 68 87 10 06 + 6888008 8000887 100 47 00 0000007 101 10000000 600009 10 00 + 688 8887 + ######################################################################################################## */ /* ######################################################################################################## + ### v2.1 (240328ac) + + fixed bug when a leaf is not present in the distance matrix + + no change in the quite obfuscated code style ### v2.0.200528ac + verify that the input tree is unrooted and fully binary + faster running times by minimizing String conversion @@ -41,7 +58,7 @@ import java.text.*; public class REQ { // constants - final static String VERSION = "v2.0.200528ac"; + final static String VERSION = "v2.1 (240328ac)"; final static int MAX = 32760; final static int INF = Integer.MAX_VALUE; @@ -75,7 +92,10 @@ public class REQ { //### man ############################################################################################################################################################################ if ( args.length < 3 ) { System.out.println(""); - System.out.println(" REQ " + VERSION); + System.out.println(" REQ " + VERSION + " Copyright (C) 2017-2024 Institut Pasteur"); + System.out.println(""); + System.out.println(" >-< https://research.pasteur.fr/fr/b/_LV"); + System.out.println(" >-< https://gitlab.pasteur.fr/GIPhy/REQ"); System.out.println(""); System.out.println(" USAGE: REQ <dfile> <tfile> <outfile> [-v]"); System.out.println(""); @@ -124,12 +144,12 @@ public class REQ { while ( --u >= 0 ) switch ( tr.charAt(u) ) { case '(': - if ( tr.charAt(++u) != '(' ) { tr = tr.replace(u, v, String.valueOf(j=lbl.indexOf(tr.substring(u, v)))); - if ( j != -1 ) tip[--i] = (short) j; else { System.err.println(tr.substring(u, v) + " is not inside distance matrix"); System.exit(1); } } + if ( tr.charAt(++u) != '(' ) { tr = tr.replace(u, v, String.valueOf(j=lbl.indexOf(line=tr.substring(u, v)))); + if ( j != -1 ) tip[--i] = (short) j; else { System.err.println(line + " does not belong to the distance matrix labels"); System.exit(1); } } --u; break; case ',': - if ( tr.charAt(++u) != '(' ) { tr = tr.replace(u, v, String.valueOf(j=lbl.indexOf(tr.substring(u, v)))); - if ( j != -1 ) tip[--i] = (short) j; else { System.err.println(tr.substring(u, v) + " is not inside distance matrix"); System.exit(1); } } + if ( tr.charAt(++u) != '(' ) { tr = tr.replace(u, v, String.valueOf(j=lbl.indexOf(line=tr.substring(u, v)))); + if ( j != -1 ) tip[--i] = (short) j; else { System.err.println(line + " does not belong to the distance matrix labels"); System.exit(1); } } v = --u; break; case ')': ++d; v = u; break; } @@ -143,8 +163,8 @@ public class REQ { //# sup last tr = tr.insert(0, '('); sup = apc(tr, tr.lastIndexOf(")")); tr = tr.insert(sup, ')'); //# NOTE: closing parenthesis at index 'sup' should not be considered for REQ calculations last = tr.lastIndexOf(")"); - //# NOTE: totip[x] = id in tip[] of the taxon at or right after position x in tr //# tr = "( ( 1 , 3 ) , ( 0 , 2 ) ) ;" tip = [1,3,0,2] - totip = new short[x=tr.length()]; //# totip = [0,0,0,1,1,2,2,2,2,3,4,4,4,4] + //# NOTE: totip[x] = id in tip[] of the taxon right after position x in tr //# tr = "( ( 1 , 3 ) , ( 0 , 2 ) ) ;" tip = [1,3,0,2] + totip = new short[x=tr.length()]; //# totip = [0,0,0,1,1,2,2,2,2,3,4,4,4,4] s = (short) n; while ( --x >= 0 ) { switch ( tr.charAt(x) ) { case '(': case ',': if ( tr.charAt(++x) != '(' ) totip[x] = --s; --x; break; } totip[x] = s; } are = new ArrayList<Double>(n); std = new BitSet(n); u = 0;