add apo related, c++ source code to convert winclada.tre

This commit is contained in:
kuoi 2023-02-28 03:26:37 +08:00
parent 6e3f8f9cd0
commit fa83172efb
3 changed files with 208 additions and 20 deletions

View file

@ -1,6 +1,6 @@
# TNT Script used by Guoyi # TNT Script used by Guoyi
This script follows MIT and part of script is from setk.run belonging to Salvador Arias (Instituto Miguel Lillo, San Miguel de Tucumán, Argentina). The TNT script follows MIT and part of script is from setk.run belonging to Salvador Arias (Instituto Miguel Lillo, San Miguel de Tucumán, Argentina).
## Usage ## Usage
@ -20,19 +20,59 @@ This script follows MIT and part of script is from setk.run belonging to Salvado
- Calculate Relative Bremer support, jackknifing, and bootstrap. - Calculate Relative Bremer support, jackknifing, and bootstrap.
- Map apomorphic characters on the consensus tree.
- Calculate TL, CI, and RI. - Calculate TL, CI, and RI.
## Options ## Options
- Results instructions are at the end of `tnt.log`. - Results instructions are at the end of `tnt.log`.
- `trees.tre`, `con.tre` are trees with taxaname. - `trees.tre`, `con.tre` are trees with taxname.
- `trees_no.tre`, `con_no.tre` are trees without taxaname. - `trees_no.tre`, `con_no.tre` are trees without taxname.
- `con_no.tre` can be put into Winclada with your tnt matrix file `filename`.
- `nelsen` can be replaced by `majority`. - `nelsen` can be replaced by `majority`.
- `xmult` and `mult` replications and hold trees number can be adjusted. - `xmult` and `mult` replications and hold trees number can be adjusted.
- `winclada.tre` can be transferred to the acceptable format for WinClada by tnt2winclada and the output file can be put into Winclada with your tnt matrix file `filename` for mapping apomorphic characters and homoplasy.
# TNT2WinClada
```
~|~|\ |~|~ ~) | |o._ |~| _ _| _
| | \| | /_ \/\/ || ||_|(_|(_|(_|
MIT, Guoyi Zhang, 2023
```
## Function
Convert TNT output tree file without tags and taxname, e.g. `winclada.tre` produced by TNT script, to WinClada acceptable format tree.
## Compile
### Linux & Unix
```
g++ tnt2winclada.cpp -o tnt2winclada
```
or
```
clang++ -o tnt2winclada tnt2winclada.cpp
```
### Windows
```
cl /EHsc tnt2winclada.cpp
```
## Usage
```
tnt2winclada -i ${input_file} -o ${output_file}
```

View file

@ -1,5 +1,6 @@
log tnt.log; log tnt.log;
macro=; macro=;
taxname+1000;
taxname=; taxname=;
mxram 10240; mxram 10240;
nstates 32; nstates 32;
@ -22,7 +23,9 @@ quote - | Implied weighting will be estimated. |;
quote - | TBR Mult and Xmult will be performed. |; quote - | TBR Mult and Xmult will be performed. |;
quote - | Strict consensus will be used. |; quote - | Strict consensus will be used. |;
quote - | Relative bremer support, jackknifing and |; quote - | Relative bremer support, jackknifing and |;
quote - | bootstrap will be shown on the svg. |; quote - | bootstrap will be shown on the con.svg. |;
quote - | Apomorphic characters mapping will be shown |;
quote - | on the apo.svg and saved to apo*.tre. |;
quote - | TL, CI and RI will be calculated finally. |; quote - | TL, CI and RI will be calculated finally. |;
quote - \------------------------------------------------/; quote - \------------------------------------------------/;
@ -40,11 +43,10 @@ var:
maxIts maxIts
; ;
if (ntax<0) if (ntax<0)
quote NO HAY DATOS!; quote There is no data;
proc/; proc/;
end end
set gVal 1; /** find the value of g **/
/** busca el valor de g **/
loop 0 nchar loop 0 nchar
if (!isinfo[#1]) continue; end if (!isinfo[#1]) continue; end
if (!isact[#1]) continue; end if (!isact[#1]) continue; end
@ -54,21 +56,21 @@ loop 0 nchar
set gVal 'a'-'b'; set gVal 'a'-'b';
end end
stop stop
quote valor de g = 'gVal'; quote g value: 'gVal';
set actK 10; set actK 10;
set minK 0; set minK 0;
set maxK 500; /** Asume 500 como el maximo posible valor de K **/ set maxK 500; /** Assume 500 as the maximum possible value of K **/
set maxIts 0; set maxIts 0;
/** busca el mejor valor de K **/ /** find the best value of K **/
loop 0 1 loop 0 1
quote actual valor de k = 'actK'; quote actual k value: 'actK';
set a 1-('actK'/('actK'+1)); set a 1-('actK'/('actK'+1));
quote 'a'; quote 'a';
set b ('actK'/('actK'+'gVal'-1))-('actK'/('actK'+'gVal')); set b ('actK'/('actK'+'gVal'-1))-('actK'/('actK'+'gVal'));
quote 'b'; quote 'b';
set Nval 'a'/'b'; set Nval 'a'/'b';
quote valor de N = 'Nval'; quote N value: 'Nval';
if (('Nval'>14.8)&&('Nval'<15.2)) endloop; end /** N esta en el rango **/ if (('Nval'>14.8)&&('Nval'<15.2)) endloop; end /** N is in range **/
if ('Nval'>15.2) if ('Nval'>15.2)
set minK 'actK'; set minK 'actK';
else else
@ -77,16 +79,16 @@ loop 0 1
set a ('maxK'-'minK')/2; set a ('maxK'-'minK')/2;
set actK 'minK' + 'a'; set actK 'minK' + 'a';
set maxIts ++; set maxIts ++;
if ('maxIts'==100) endloop; end /** salida de emergencia **/ if ('maxIts'==100) endloop; end /** emergency exit **/
setloop 0; setloop 0;
stop stop
/** Si salio de emergencia **/ /** If out of emergency **/
if ('maxIts'==100) if ('maxIts'==100)
quote NO SE TERMINARON LAS ITERACIONES; quote Iterations are not finished;
quote mejor K encontrado: 'actK'; quote Best K is 'actK';
proc /; proc /;
end end
quote Valor de K: 'actK' (N='Nval'); quote K value: 'actK' (N='Nval');
piwe='actK'; piwe='actK';
/*Reopen tnt*/ /*Reopen tnt*/
@ -130,6 +132,18 @@ export < con.tre;
taxname-; taxname-;
export - con_no.tre; export - con_no.tre;
/*Apomorphic characters*/
export = winclada.tre;
taxname =;
ttags-;
ttags=;
apo >0;
ttags & apo.svg thickness 7 italics fontsize 15;
export < apo.tre;
taxname-;
export - apo_no.tre;
ttags-;
/*Caulculate TL/CI/RI score*/ /*Caulculate TL/CI/RI score*/
length *; length *;
report-; report-;
@ -164,12 +178,18 @@ quote - | The file `trees*.tre` contain |;
quote - | trees found by mult and xmult |; quote - | trees found by mult and xmult |;
quote - | The file `con*.tre` contain |; quote - | The file `con*.tre` contain |;
quote - | strict consensus tree |; quote - | strict consensus tree |;
quote - | The file `apo*.tre` contain |;
quote - | tree with apomorphic character |;
quote - | The file `*_no.tre` contain |; quote - | The file `*_no.tre` contain |;
quote - | tree with `taxaname-` |; quote - | tree with `taxaname-` |;
quote - | The file `con.svg` contain |; quote - | The file `con.svg` contain |;
quote - | strict consensus tree with |; quote - | strict consensus tree with |;
quote - | relative bremer, jak and boot |; quote - | relative bremer, jak and boot |;
quote - | support on the tree |; quote - | support on the tree |;
quote - | The file `apo.svg` contain the |;
quote - | tree with apomorphy mapping |;
quote - | The file `winclada.tre` can be |;
quote - | converted by tnt2winclada |;
quote - \----------------------------------------------/; quote - \----------------------------------------------/;
/*Quit*/ /*Quit*/

128
tnt2winclada.cpp Normal file
View file

@ -0,0 +1,128 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
string inputFileName, outputFileName, tnt_format, winclada_format;
void argument(int argc, char** argv);
int read_tnt();
void showhelp(int help_num);
void parse_line(int trelen);
void add_space (string winclada, char x);
bool isNum(string strnum);
void show_help (int help_num){
if (help_num == 0) {
cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl;
cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl;
cout << "TNT2WinClada MIT\nplease use -h to see more help" << endl;
} else {
cout << "~|~|\\ |~|~ ~) | |o._ |~| _ _| _ " << endl;
cout << " | | \\| | /_ \\/\\/ || ||_|(_|(_|(_|" << endl;
cout << "-h help;\n-i input: -i ${input_file};\n-o output: -o ${output_file}" << endl;
}
}
void argument(int argc, char **argv) {
// -i -h -o option
int x=0, y = 0, z=0;
for (int i = 0; i < argc; i++) {
if (argc == 2 && string(argv[1]) == "-h") {
show_help(1);
x++;
return;
}
if (argc != 5 || string(argv[1]) != "-i" || string(argv[3]) != "-o") {
show_help(0);
return;
}
if (string(argv[i]) == "-i") {
i++;
inputFileName = argv[i];
y++;
}
if (string(argv[i]) == "-o") {
i++;
outputFileName = argv[i];
z++;
}
}
if (x==0 && (y==0 || z==0)) {
cout << "input or output can't be empty." << endl;
}
}
int read_tnt() {
int trelen;
ifstream inputFile(inputFileName);
if (inputFile.is_open()) {
getline(inputFile, tnt_format);
inputFile.close();
trelen = tnt_format.length();
} else {
cout << "File can't be opened" << endl;
}
inputFile.close();
return trelen;
}
void add_space (char x) {
int i = 0;
string winclada;
for (i=0; i<tnt_format.length(); i++) {
if (tnt_format[i] != x) {
winclada=winclada+tnt_format[i];
} else {
winclada=winclada+" "+tnt_format[i]+" ";
}
}
tnt_format=winclada;
}
bool isNum(string strnum) {
char* p;
strtol(strnum.c_str(), &p, 10);
return *p == 0;
}
void parse_line (int trelen) {
// add space
char x1 = '(', x2 = ')', x3= ',';
add_space(x1);
add_space(x2);
add_space(x3);
// use space as separator
istringstream istr(tnt_format);
string buffer;
int tem;
while (getline(istr, buffer, ' ')) {
istr >> buffer;
if(isNum(buffer)){
tem = stoi(buffer)-1;
buffer = to_string(tem);
}
winclada_format=winclada_format+buffer;
}
}
void write_winclada() {
ofstream outputFile(outputFileName);
if (outputFile.is_open()) {
outputFile << winclada_format;
} else {
cout << "File can't be written" << endl;
}
outputFile.close();
}
int main (int argc, char **argv){
argument(argc, argv);
int trelen;
trelen = read_tnt();
parse_line(trelen);
write_winclada();
return 0;
}