package statalign.postprocess.plugins;
import java.io.IOException;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import statalign.base.InputData;
import statalign.base.State;
import statalign.model.ext.ModelExtManager;
import statalign.postprocess.TreeVisualizer;
import statalign.postprocess.gui.treeviews.HorizontalCladogramTreeView;
import statalign.postprocess.gui.treeviews.HorizontalPhylogramTreeView;
import statalign.postprocess.gui.treeviews.NetworkTreeView;
import statalign.postprocess.gui.treeviews.TreeView;
import statalign.postprocess.gui.treeviews.VerticalPhylogramTreeView;
import statalign.postprocess.utils.NewickParser;
public class CurrentTreeVisualizer extends TreeVisualizer {
// Functions
public CurrentTreeVisualizer() {
// Configuration
outputable = true;
postprocessable = true;
postprocessWrite = true;
sampling = false;
rnaAssociated = false;
}
@Override
public void init(ModelExtManager manager) {
if(show) {
super.init(new TreeView[]{
new VerticalPhylogramTreeView(),
new HorizontalCladogramTreeView(),
new HorizontalPhylogramTreeView(),
new NetworkTreeView()
});
}
}
@Override
public Icon getIcon() {
return new ImageIcon(ClassLoader.getSystemResource("icons/tree.gif"));
// return new ImageIcon("icons/tree.gif");
}
@Override
public String getTabName() {
return "Tree";
}
@Override
public String getTip() {
return "Current tree in the Markov chain";
}
@Override
public double getTabOrder() {
return 3.0d;
}
@Override
public void newPeek(State state) {
// System.out.println("CurrentTreeVisualizer: New peek.");
String sampledTree = state.getNewickStringWithLabels();
NewickParser parser = new NewickParser(sampledTree);
TreeNode node = parser.parse();
if(show) {
for (TreeView view : treeViews) {
view.newSample(node);
}
refreshGUI();
}
}
@Override
public String getFileExtension() {
return "tree";
}
@Override
public void beforeFirstSample(InputData input) {
super.beforeFirstSample(input); // Mandatory.
String[] names = new String[input.seqs.size()];
for (int i = 0; i < names.length; i++) {
names[i] = input.seqs.getSeqName(i).replaceAll(" ", "");
}
if (postprocessWrite) {
try {
outputFile.write("#NEXUS\n\nBEGIN Taxa;\nDIMENSIONS ntax="
+ names.length + ";\nTAXLABELS\n");
for (int i = 0; i < names.length; i++) {
outputFile.write("[" + (i + 1) + "] '" + names[i] + "'\n");
}
outputFile.write(";\nEND; [Taxa]\nBEGIN Trees;\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void newSample(State state, int no, int total) {
// System.out.println("CurrentTreeVisualizer: New sample.");
//state.updateNewickStringWithLabels();
String sampledTree = state.getNewickStringWithLabels();
if(show) {
// TODO: START OF FIXif (withNumbers) sb.append("["+node+"]");
NewickParser parser = new NewickParser(sampledTree);
TreeNode node = parser.parse();
for (TreeView view : treeViews) {
view.newSample(node);
}
refreshGUI();
}
// TODO: END OF FIX
if (sampling) {
try {
if (state.isBurnin) file.write("Burnin " + no + "\tTree:\t" + sampledTree + "\n");
else file.write("Sample " + no + "\tTree:\t" + sampledTree + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
if (postprocessWrite) {
try {
outputFile.write("[" + no + "] tree 'tree_" + no + "'= "
+ sampledTree + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void afterLastSample() {
if (postprocessWrite) {
try {
outputFile.write("END; [Trees]\n" + "BEGIN st_Assumptions;\n"
+ "\ttreestransform=TreeSelector;\n"
+ "\tsplitstransform=EqualAngle;\n"
+ "\tSplitsPostProcess filter=dimension value=4;\n"
+ "\tautolayoutnodelabels;\nEND; [st_Assumptions]");
outputFile.flush();
outputFile.close();
} catch (IOException ioex) {
ioex.printStackTrace();
}
}
}
}