package statalign.base.thread;
import java.io.File;
import statalign.base.MainManager;
import statalign.base.Mcmc;
import statalign.base.Tree;
import statalign.base.TreeAlgo;
import statalign.base.mcmc.StatAlignMcmc;
import statalign.io.RawSequences;
import statalign.ui.MainFrame;
/**
* The main (suspendable) thread for background MCMC calculation.
*
* @author novak
*/
public class MainThread extends StoppableThread {
/**
* Reference to the (singleton) MainManager object encapsulating all settings and data
* that an MCMC run depends on.
*/
public MainManager owner;
/**
* Constructs a new MainThread that can be used to fire a background MCMC calculation.
*
* @param owner Reference to the MainManager object.
*/
public MainThread(MainManager owner) {
this.owner = owner;
}
/**
* Start background MCMC calculation.
*/
@Override
public synchronized void run() {
try {
owner.inputData.pars.fixAlign = owner.inputData.useAlign >= 2;
owner.inputData.pars.fixTopology = owner.inputData.useTree >= 2;
owner.inputData.pars.fixEdge = owner.inputData.useTree >= 3;
owner.inputData.pars.doReportDuringBurnin = owner.inputData.doReportDuringBurnin;
// initialise model extension plugins for run
owner.modelExtMan.initRun(owner.inputData);
RawSequences seqs = owner.inputData.seqs;
if(owner.frame != null) {
owner.frame.statusText.setText(" Generating initial tree and alignment...");
}
System.out.println("\nPreparing initial tree and alignment...\n");
// remove gaps and whitespace
//owner.inputData.title = new File(owner.fullPath).getName();
owner.inputData.setBaseFile(new File(owner.fullPath));
String[] nongapped = new String[seqs.size()];
StringBuilder builder = new StringBuilder();
int i, j;
char ch;
for(i = 0; i < nongapped.length; i++) {
builder.setLength(0);
String seq = seqs.getSequence(i);
for(j = 0; j < seq.length(); j++) {
ch = seq.charAt(j);
if(Character.isWhitespace(ch) || ch == '-')
continue;
builder.append(ch);
}
nongapped[i] = builder.toString();
}
String[] names = seqs.getSeqnames().toArray(new String[seqs.size()]);
TreeAlgo treeAlgo = new TreeAlgo();
Tree tree;
if(owner.inputData.useTree > 0) {
tree = treeAlgo.rearrangeTree(owner.inputData.tree, names);
treeAlgo.addAlignSeqsToTree(tree, nongapped, names,
owner.inputData.model, new File(owner.fullPath).getName());
} else {
tree = treeAlgo.buildNJTree(nongapped, seqs.getSeqnames().toArray(new String[seqs.size()]),
owner.inputData.model, new File(owner.fullPath).getName());
}
System.out.println("Initial tree: "+tree.printedTree()+"\n");
// Tree tree = new Tree(nongapped, seqs.seqNames.toArray(new String[seqs.seqNames.size()]),
// owner.inputData.model,
// owner.inputData.model.attachedScoringScheme,
// new File(owner.fullPath).getName());
Mcmc mcmc = new StatAlignMcmc(tree, owner.inputData.pars, owner.postProcMan, owner.modelExtMan);
int errorCode = mcmc.doMCMC();
owner.finished(errorCode, null);
System.out.println(errorCode == 0 ? "Ready." : "Stopped.");
} catch(StoppedException e) {
if (owner.frame != null) {
owner.frame.statusText.setText(MainFrame.IDLE_STATUS_MESSAGE);
}
owner.finished(2, null);
System.out.println("Stopped.");
} catch (IllegalArgumentException e) {
e.printStackTrace();
printStateInfo();
String msg = e.getMessage();
if(msg != null)
System.err.println("Plugin error: "+msg);
} catch(Exception e) {
e.printStackTrace();
printStateInfo();
if(owner.frame != null) {
System.out.println("Here is the error: " + e.getClass());
owner.frame.statusText.setText(MainFrame.IDLE_STATUS_MESSAGE);
//ErrorMessage.showPane(owner.frame,e.getLocalizedMessage(),true);
}
owner.finished(-1, e);
}
}
private void printStateInfo() {
System.err.println(owner.modelExtMan.getMcmc().tree.printedTree());
owner.modelExtMan.getMcmc().tree.checkPointers();
owner.modelExtMan.getMcmc().tree.root.recomputeCheckLogLike();
System.err.println(owner.fullPath);
String align[] = owner.modelExtMan.getMcmc().getState().getFullAlign();
for (int i=0; i<align.length; i++) {
System.err.println(align[i]);
}
}
}