629 lines
13 KiB
Text
629 lines
13 KiB
Text
macro=;
|
||
|
||
log %7.tnt.log;
|
||
|
||
/*primary notification*/
|
||
if ( (argnumber == 0) || (argnumber >7) )
|
||
silent -console;
|
||
quote
|
||
/----------------------------------------------------\
|
||
| GUOYI TNT SCRIPT 2022-2023 MIT |
|
||
| You need to give your filename |
|
||
| shell> tnt run guoyi.tnt filename, (Linux & Mac) |
|
||
| shell> tnt run guoyi.run filename(semicolon) (Win) |
|
||
| ============================== |
|
||
| === Parameters Details === |
|
||
| ============================== |
|
||
| filename type weight K cons resamp prefix |
|
||
| - filename extension must be lower case |
|
||
| fasta (fas/fasta), tnt (tnt/ss), nexus |
|
||
| (nex/nexus) format are allowed |
|
||
| - type should be 32, dna, prot, num |
|
||
| num=number, dna=DNA, prot=protein |
|
||
| 32=max number allowed (default) |
|
||
| - weight should be iw, ew, eiw |
|
||
| iw=implied weight, ew=equal weight |
|
||
| eiw=extended implied weight (default) |
|
||
| N.B. K of ew must followed 0 (=NA) |
|
||
| - K is 12 (default) following Goloboff |
|
||
| et al. 2017 (Cladistics 34: 407–437) |
|
||
| it must more than 0 |
|
||
| - cons should be str, mjr, hlf |
|
||
| mjr=majority rule, hlf=half |
|
||
| str=strict (default) |
|
||
| - resamp should be sum of what you want |
|
||
| jak=1, boot=2, sym=4 relative-bremer |
|
||
| (rbr)=0.1, bremer(br)=0.2 |
|
||
| i.e rbr+jak+boot+sym=7.1 (default) |
|
||
| - prefix can be empty, or a string |
|
||
| default is empty |
|
||
\----------------------------------------------------/;
|
||
proc/;
|
||
end
|
||
|
||
/*Var for handling args*/
|
||
var:
|
||
dojak doboot dosym dobrs dorbrs rsmp dobremer
|
||
dostr domjr dohlf contype
|
||
doew doiw doeiw dowt wtstring wttype
|
||
kvalue
|
||
search
|
||
isfas istnt isnex input;
|
||
|
||
set dojak 0; set doboot 0; set dosym 0; set dobrs 0; set dorbrs 0; set rsmp 0; set dobremer 0;
|
||
set dostr 0; set domjr 0; set dohlf 0;
|
||
set doew 0; set doiw 0; set doeiw 0; set dowt 0; set wttype 0;
|
||
set kvalue 12;
|
||
set search 0;
|
||
set isfas 0; set istnt 0; set isnex 0;
|
||
|
||
goto=%0;
|
||
|
||
/*Get prefix and extension of input*/
|
||
set input $%1;
|
||
|
||
/*confirm input format*/
|
||
if ((eqstring [ $input>. fas ]) || (eqstring [ $input>. fasta ]))
|
||
set isfas 1;
|
||
else
|
||
if ((eqstring [ $input>. tnt ]) || (eqstring [ $input>. ss ]))
|
||
set istnt 1;
|
||
else
|
||
if ((eqstring [ $input>. nex ]) || (eqstring [ $input>. nexus ]))
|
||
set isnex 1;
|
||
else
|
||
errmsg extension name of input file must be fas/fasta (for fas format), tnt/ss (for Hennig86/NONA/TNT format), nex/nexus (for nex format);
|
||
end end end
|
||
|
||
/*handle weighting type*/
|
||
if (argnumber>=3)
|
||
set wtstring $%3;
|
||
if (eqstring [ $wtstring ew ])
|
||
set doew 1;
|
||
set wttype 1;
|
||
else
|
||
if (eqstring [ $wtstring iw ])
|
||
set doiw 1;
|
||
set wttype 2;
|
||
else
|
||
if (eqstring [ $wtstring eiw ])
|
||
set doeiw 1;
|
||
set wttype 3;
|
||
else
|
||
goto wttypeerr;
|
||
end end end
|
||
else
|
||
set doeiw 1;
|
||
set wttype 3;
|
||
end
|
||
|
||
if ('doiw' || 'doeiw')
|
||
set dowt 1;
|
||
end
|
||
|
||
/*handle k value*/
|
||
if (argnumber>=4)
|
||
set kvalue %4;
|
||
if ( 'doew' && ('kvalue' != 0))
|
||
goto kvalueerr;
|
||
end
|
||
end
|
||
|
||
/*handle resmaple type*/
|
||
if (argnumber<6)
|
||
set dojak 1; set doboot 1; set dosym 1; set dorbrs 1;
|
||
else
|
||
set rsmp %6;
|
||
loop 1 5
|
||
if ('rsmp' >= 4)
|
||
set dosym 1;
|
||
set rsmp 'rsmp'-4;
|
||
else
|
||
if ('rsmp' >= 2)
|
||
set doboot 1;
|
||
set rsmp 'rsmp'-2;
|
||
else
|
||
if ('rsmp' >= 1)
|
||
set dojak 1;
|
||
set rsmp 'rsmp'-1;
|
||
else
|
||
if ('rsmp' >= 0.2)
|
||
set dobrs 1;
|
||
set rsmp 'rsmp'-0.2;
|
||
else
|
||
if ('rsmp' >= 0.1)
|
||
set dorbrs 1;
|
||
set rsmp 'rsmp'-0.1;
|
||
end end end end end
|
||
stop
|
||
end
|
||
|
||
if ('rsmp' != 0)
|
||
errmsg Input 'rsmp' is illegal;
|
||
end
|
||
|
||
if ('dobrs' || 'dorbrs')
|
||
set dobremer 1;
|
||
end
|
||
|
||
/*handle consensus type*/
|
||
if (argnumber>=6)
|
||
set contype $%5;
|
||
if ('dobremer')
|
||
set dostr 1;
|
||
if (eqstring [ $contype str ])
|
||
else
|
||
if (eqstring [ $contype mjr ])
|
||
goto bremererr;
|
||
else
|
||
if (eqstring [ $contype hlf ])
|
||
goto bremererr;
|
||
else
|
||
goto contypeerr;
|
||
end end end
|
||
else
|
||
if (eqstring [ $contype str ])
|
||
set dostr 1;
|
||
else
|
||
if (eqstring [ $contype mjr ])
|
||
set domjr 1;
|
||
else
|
||
if (eqstring [ $contype hlf ])
|
||
set dohlf 1;
|
||
else
|
||
goto contypeerr;
|
||
end end end
|
||
end
|
||
else
|
||
if (argnumber==5)
|
||
set contype $%5;
|
||
if ((eqstring [ $contype mjr ]) || (eqstring [ $contype hlf ]))
|
||
goto bremererr;
|
||
else
|
||
if (eqstring [ $contype str ])
|
||
set dostr 1;
|
||
else
|
||
goto contypeerr;
|
||
end end
|
||
else
|
||
set dostr 1;
|
||
end end
|
||
|
||
/*Basic settings*/
|
||
taxname+1000;
|
||
taxname=;
|
||
mxram 10240;
|
||
if(argnumber>=2)
|
||
nstates %2;
|
||
else
|
||
nstates 32;
|
||
end
|
||
nstates NOGAPS;
|
||
|
||
/*Set K*/
|
||
if ('dowt')
|
||
piwe='kvalue';
|
||
end
|
||
|
||
/*Reopen tnt*/
|
||
if ('istnt' || 'isnex')
|
||
procedure $input;
|
||
else
|
||
if ('isfas')
|
||
procedure & $input;
|
||
end end
|
||
hold 10000;
|
||
|
||
/*handle search*/
|
||
if (ntax<=24) /*taxa lower than 25 (including 25)*/
|
||
if ('doeiw')
|
||
set search 2;
|
||
else
|
||
set search 1;
|
||
end
|
||
else
|
||
if (ntax<74) /*taxa lower than 75 do mult*/
|
||
set search 2;
|
||
else
|
||
set search 3;
|
||
end
|
||
end
|
||
|
||
/*Report what will be done*/
|
||
quote
|
||
/-----------------------------------------------\;
|
||
if ('wttype'==1)
|
||
quote
|
||
| Equal weighting will be used. |;
|
||
else
|
||
if ('wttype'==2)
|
||
quote
|
||
| Implied weighting will be used, K is 'kvalue'. |;
|
||
else
|
||
if ('wttype'==3)
|
||
quote
|
||
| Ex-implied weighting will be used, K is 'kvalue'. |;
|
||
end end end
|
||
|
||
if ('search'==1)
|
||
quote
|
||
| Implicit enumeration will be performed. |;
|
||
else
|
||
if ('search'==2)
|
||
quote
|
||
| TBR Mult will be performed. |;
|
||
else
|
||
if ('search'==3)
|
||
quote
|
||
| Xmult will be performed. |;
|
||
end end end
|
||
|
||
if ('dostr')
|
||
quote
|
||
| Strict consensus will be used. |;
|
||
else
|
||
if ('domjr')
|
||
quote
|
||
| Majority-rule consensus will be used. |;
|
||
else
|
||
if ('dohlf')
|
||
quote
|
||
| Half strict consensus will be used. |;
|
||
end end end
|
||
|
||
quote
|
||
| resample.svg will contain a tree with |;
|
||
if ('dorbrs')
|
||
quote
|
||
| relative bremer support |;
|
||
end
|
||
if ('dobrs')
|
||
quote
|
||
| bremer support |;
|
||
end
|
||
if ('dojak')
|
||
quote
|
||
| jackknifing |;
|
||
end
|
||
if ('doboot')
|
||
quote
|
||
| bootstrap |;
|
||
end
|
||
if ('dosym')
|
||
quote
|
||
| symmetric resampling |;
|
||
end
|
||
|
||
quote
|
||
| Apomorphic characters mapping will be shown |
|
||
| on the apo.svg and saved to apo*.tre. |
|
||
| TL, CI and RI will be calculated finally. |
|
||
\------------------------------------------------/;
|
||
|
||
/*Implied weighting settings*/
|
||
if ('doiw')
|
||
piwe&;
|
||
else
|
||
if ('doeiw')
|
||
xpiwe(*;
|
||
log %7.eiw.log;
|
||
piwe&;
|
||
log/;
|
||
log + %7.tnt.log;
|
||
end end
|
||
|
||
/*Search trees*/
|
||
if ('search'==1)
|
||
ienum;
|
||
else
|
||
if ('search'==2)
|
||
mult=replic 1000 tbr hold 10;
|
||
bbreak=tbr fill;
|
||
else
|
||
if ('search'==3)
|
||
sect: slack 40;
|
||
xmult=hit 50 replications 20 drift 10 ratchet 10 fuse 10 hold 1 keepall;
|
||
bbreak=tbr fill;
|
||
end end end
|
||
|
||
/*Export trees*/
|
||
export= %7.trees.tre;
|
||
taxname-;
|
||
export= %7.trees_no.tre;
|
||
tsave *= %7.trees.tnt.tre;
|
||
taxname=;
|
||
tsave = %7.trees.ctf;
|
||
|
||
/*Get npars number*/
|
||
var: npars;
|
||
set npars ntrees;
|
||
|
||
/*Get consensus tree*/
|
||
if ('dostr')
|
||
nelsen * 0.'npars';
|
||
else
|
||
if ('domjr')
|
||
majority * 0.'npars';
|
||
else
|
||
if ('dohlf')
|
||
comcomp * 0.'npars';
|
||
end end end
|
||
|
||
/*Get the consensus tree number*/
|
||
var: contree;
|
||
set contree ntrees;
|
||
|
||
/*Store consensus tree to tree vault*/
|
||
hold /+0;
|
||
tv>/;
|
||
tchoose 0.'npars';
|
||
|
||
/*Get rbr/br/jak/boot/sym support and get consensus tree*/
|
||
ttags=;
|
||
ttags]; /*in one line*/
|
||
|
||
/* jak=1, boot=2, sym=4, */
|
||
/* jak+boot=3, */
|
||
/* jak+sym=5, boot+sym=6, */
|
||
/* jak+boot+sym=7, */
|
||
|
||
/* relative-bremer=0.1, bremer=0.2 */
|
||
/* bremer+relative-bremer=0.3 */
|
||
|
||
if ('dobremer')
|
||
|
||
/*set value of suboptimal from most parsimony tree */
|
||
sub: 0;
|
||
|
||
/*calculate relative bremer support*/
|
||
if ('dorbrs')
|
||
bs ]!! 0;
|
||
end
|
||
|
||
/*calculate bremer support*/
|
||
if ('dobrs')
|
||
macfloat 1; /*set the br value float*/
|
||
bsupport !! 0;
|
||
end
|
||
|
||
end
|
||
|
||
/*Choose final tree*/
|
||
tv<;
|
||
tchoose/;
|
||
|
||
/*adjust to zero following Pablo Goloboff*/
|
||
sub 0;
|
||
|
||
/*jakknifing*/
|
||
if ('dojak')
|
||
resample jak replications 1000 from 0; /*from 0 will orphan other trees*/
|
||
end
|
||
|
||
/*bootstrap*/
|
||
if ('doboot')
|
||
resample boot replications 1000 from 0;
|
||
end
|
||
|
||
/*symmetric resampling*/
|
||
if ('dosym')
|
||
resample sym replications 1000 from 0;
|
||
end
|
||
|
||
/*Export consensus tree with supports*/
|
||
ttags & %7.resample.svg thickness 7 italics fontsize 15;
|
||
log %7.resample.log;
|
||
quote /-------------resample tags start---------------\;
|
||
ttags/;
|
||
quote \-------------resample tags stop----------------/;
|
||
log/;
|
||
log + %7.tnt.log;
|
||
export < %7.resample.tre;
|
||
taxname-;
|
||
export - %7.resample_no.tre;
|
||
ttags-;
|
||
taxname=;
|
||
|
||
/*Export consensus tree*/
|
||
tchoose /;
|
||
export - %7.original.tre;
|
||
taxname-;
|
||
export - %7.original_no.tre;
|
||
tsave = %7.original.ctf;
|
||
tsave *= %7.original.tnt.tre;
|
||
|
||
/*Apomorphic characters*/
|
||
export = %7.winclada.tre;
|
||
taxname =;
|
||
ttags=;
|
||
apo >0;
|
||
log %7.apo.log;
|
||
quote /-----------apomorphy tags start --------------\;
|
||
ttags/;
|
||
quote \-----------apomorphy tags stop ---------------/;
|
||
log/;
|
||
log + %7.tnt.log;
|
||
ttags & %7.apo.svg thickness 7 italics fontsize 15;
|
||
export < %7.apo.tre;
|
||
taxname-;
|
||
export - %7.apo_no.tre;
|
||
ttags-;
|
||
|
||
/*Character Analysis*/
|
||
log %7.homo.log;
|
||
chomo;
|
||
cscores;
|
||
log/;
|
||
log + %7.tnt.log;
|
||
|
||
/*Caulculate TL/CI/RI score*/
|
||
report-;
|
||
var: themin themax CI RI TL ;
|
||
set themin minsteps;
|
||
set themax maxsteps;
|
||
set TL length[0];
|
||
set CI 'themin'/'TL'; /*CI=1 means no homoplasy*/
|
||
if ('themax' != 'themin')
|
||
set RI ('themax'-'TL')/('themax'-'themin'); /*RI=1 character fits perfetcly*/
|
||
else
|
||
set RI 999;
|
||
end
|
||
|
||
/*Report CI/RI/TL */
|
||
log %7.report.log;
|
||
macfloat 3;
|
||
quote Consistency Index (CI) is 'CI';
|
||
if ('RI' == 999)
|
||
quote Retention Index (RI) is NA;
|
||
else
|
||
quote Retention Index (RI) is 'RI';
|
||
end
|
||
quote Tree Length (TL) is 'TL';
|
||
log/;
|
||
|
||
watch-;
|
||
/*Generate ss file for winclada*/
|
||
log %7.winclada.ss;
|
||
/*get basic info*/
|
||
var: taxnum chanum;
|
||
set taxnum ntax+1;
|
||
set chanum nchar+1;
|
||
/*output head*/
|
||
quote
|
||
xread
|
||
'
|
||
Data saved from TNT
|
||
'
|
||
'chanum' 'taxnum';
|
||
/*outhead body*/
|
||
xread!;
|
||
/*output split symnol*/
|
||
runc!
|
||
tntprintf(";\n\n");
|
||
!
|
||
/*output the tread*/
|
||
taxname-;
|
||
tp*;
|
||
/*output the end*/
|
||
runc!
|
||
tntprintf("proc/;\n");
|
||
!
|
||
log/;
|
||
log + %7.tnt.log;
|
||
|
||
/*Report*/
|
||
quote
|
||
/----------------------------------------------\
|
||
| The analysis has been finished. |
|
||
| The file `tnt.log` contains |
|
||
| the performing details |
|
||
| The file `trees*.tre` contain |
|
||
| trees found by mult and xmult |
|
||
| The file `original*.tre` contain |
|
||
| consensus tree without label |
|
||
| The file `resample*.tre` contain |
|
||
| consensus tree with support |
|
||
| The file `apo*.tre` contain |
|
||
| tree with apomorphic character |
|
||
| The file `*_no.tre` contain |
|
||
| tree with `taxname-` |
|
||
| The file `*.ctf` tree file is |
|
||
| only readable for TNT |
|
||
| The file `*.tnt.tre` contain |
|
||
| is the tre file without taxname |
|
||
| The file `resample.svg` contain |;
|
||
|
||
if ('dostr')
|
||
quote
|
||
| strict consensus tree with |;
|
||
else
|
||
if ('domjr')
|
||
quote
|
||
| majority-rule consensus tree with |;
|
||
else
|
||
if ('dohlf')
|
||
quote
|
||
| half strict consensus tree with |;
|
||
end end end
|
||
|
||
if ('dorbrs')
|
||
quote
|
||
| relative bremer support |;
|
||
end
|
||
if ('dobrs')
|
||
quote
|
||
| bremer support |;
|
||
end
|
||
if ('dojak')
|
||
quote
|
||
| jackknifing |;
|
||
end
|
||
if ('doboot')
|
||
quote
|
||
| bootstrap |;
|
||
end
|
||
if ('dosym')
|
||
quote
|
||
| symmetric resampling |;
|
||
end
|
||
|
||
if ('doew')
|
||
quote
|
||
| under equal weighting |;
|
||
else
|
||
if ('doiw')
|
||
quote
|
||
| under implied weighting, |
|
||
| K value is 'kvalue' |;
|
||
else
|
||
if ('doeiw')
|
||
quote
|
||
| under extended implied weighting, |
|
||
| K value is 'kvalue' |;
|
||
end end end
|
||
|
||
quote
|
||
| The file `apo.svg` contains the |
|
||
| tree with apomorphy mapping |
|
||
| The file `report.log` contains the |
|
||
| CI RI TL publish-needed info |
|
||
| The file `resample/apo.log` contains |
|
||
| the tree tags text |
|
||
| The file `homo.log` contains the report |
|
||
| of character homoplasy |;
|
||
|
||
if ('doeiw')
|
||
quote
|
||
| The file `eiw.log` contains the report |
|
||
| of character concavities |;
|
||
end
|
||
|
||
quote
|
||
| The file `winclada.tre` can be |
|
||
| converted by tnt2winclada |
|
||
| The file `winclada.ss` can be read by |
|
||
| winclada directly |
|
||
\----------------------------------------------/;
|
||
|
||
/*Quit*/
|
||
zzz;
|
||
|
||
/*consensus type error*/
|
||
label contypeerr
|
||
errmsg Consensus type must be str mjr or hlf;
|
||
proc/;
|
||
|
||
/*weighting type error*/
|
||
label wttypeerr
|
||
errmsg Weighting type must be ew, iw or eiw;
|
||
proc/;
|
||
|
||
/*equal weighting k value error*/
|
||
label kvalueerr
|
||
errmsg Equal weighting (ew) must be followed with 0 instead of 'kvalue';
|
||
proc/;
|
||
|
||
/*bremer support not strict consensus error*/
|
||
label bremererr
|
||
errmsg Bremer support or any bremer support variations must use strict consensus;
|
||
proc/;
|