/*
* Utils.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.bss;
import java.awt.Desktop;
import java.awt.Frame;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import dr.evolution.tree.TreeUtils;
import org.apache.commons.math.random.MersenneTwister;
import dr.app.bss.test.AncestralSequenceTrait;
import dr.evolution.datatype.Codons;
import dr.evolution.datatype.DataType;
import dr.evolution.io.Importer.ImportException;
import dr.evolution.io.NewickImporter;
import dr.evolution.io.NexusImporter;
import dr.evolution.sequence.Sequence;
import dr.evolution.tree.NodeRef;
import dr.evolution.tree.Tree;
import dr.evolution.tree.TreeTraitProvider;
import dr.evolution.util.MutableTaxonList;
import dr.evolution.util.Taxa;
import dr.evolution.util.Taxon;
import dr.evomodel.tree.TreeModel;
import dr.inference.model.Parameter;
import dr.math.MathUtils;
/**
* @author Filip Bielejec
* @version $Id$
*/
public class Utils {
// ////////////////////
// ---THREAD UTILS---//
// ////////////////////
public static void sleep(int seconds) {
try {
Thread.sleep(seconds * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}// END: sleep
// ////////////////////////////////
// ---RANDOM NUMB3R GENERATION---//
// ////////////////////////////////
private static MersenneTwister random = new MersenneTwister(
MathUtils.nextLong());
public static double rLogNormal(double stdev, double mean) {
double rNorm = random.nextGaussian() * stdev + mean;
double rLognormal = Math.exp(rNorm);
return rLognormal;
}// END: drawRandom
public static int rMultinom(double[] probabilities) {
int range = probabilities.length + 1;
double[] distribution = new double[range];
double sumProb = 0;
for (double value : probabilities) {
sumProb += value;
}// END: probabilities loop
distribution[0] = 0;
for (int i = 1; i < range; ++i) {
distribution[i] = distribution[i - 1]
+ (probabilities[i - 1] / sumProb);
}// END: i loop
distribution[range - 1] = 1.0;
double key = random.nextDouble();
int mindex = 1;
int maxdex = range - 1;
int midpoint = mindex + (maxdex - mindex) / 2;
while (mindex <= maxdex) {
if (key < distribution[midpoint - 1]) {
maxdex = midpoint - 1;
} else if (key > distribution[midpoint]) {
mindex = midpoint + 1;
} else {
return midpoint - 1;
}
midpoint = mindex + (int) Math.ceil((maxdex - mindex) / 2);
}//END: mindex loop
System.out.println("Error in rMultinom!");
return range - 1;
}//END: rMultinom
// ////////////
// ---MATH---//
// ////////////
public static int sample(double[] probabilities) {
int samplePos = -Integer.MAX_VALUE;
double cumProb = 0.0;
double u = random.nextDouble();
for (int i = 0; i < probabilities.length; i++) {
cumProb += probabilities[i];
if (u <= cumProb) {
samplePos = i;
break;
}
}
return samplePos;
}// END: randomChoicePDF
public static void rescale(double[] logX) {
double max = max(logX);
for (int i = 0; i < logX.length; i++) {
logX[i] -= max;
}
}// END: rescale
public double getParameterVariance(Parameter param) {
int n = param.getSize();
double mean = getParameterMean(param);
double var = 0;
for (int i = 0; i < n; i++) {
var+= Math.pow( (param.getValue(i) - mean), 2);
}
var/= (n-1);
return var;
}// END: getParameterVariance
public double getParameterMean(Parameter param) {
double mean = 0;
int n = param.getSize();
for (int i = 0; i < n; i++) {
mean += param.getValue(i);
}
mean /= n;
return mean;
}// END: getParameterMean
public static double getNorm(double[] vector) {
double norm = 0;
for (int i = 0; i < vector.length; i++) {
norm += Math.pow(vector[i], 2);
}
return Math.sqrt(norm);
}// END: getNorm
public static void normalize(double[] vector) {
double norm = getNorm(vector);
for (int i = 0; i < vector.length; i++) {
vector[i] = vector[i] / norm;
}
}// END: normalize
// ////////////////////
// ---ARRAYS UTILS---//
// ////////////////////
public static void exponentiate(double[] array) {
for (int i = 0; i < array.length; i++) {
array[i] = Math.exp(array[i]);
}
}// END: exponentiate
public static int max(int[] array) {
int max = -Integer.MAX_VALUE;
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = (int)array[i];
}// END: if check
}// END: i loop
return max;
}// END: findMaximum
public static int max(double[] array) {
int max = -Integer.MAX_VALUE;
for (int i=0; i< array.length;i++) {
if (array[i] > max) {
max = (int)array[i];
}// END: if check
}// END: i loop
return max;
}// END: findMaximum
public static int max(ArrayList<Integer> array) {
int max = -Integer.MAX_VALUE;
for (Integer element : array) {
if (element > max) {
max = element;
}// END: if check
}// END: i loop
return max;
}// END: findMaximum
public static double sumArray(int[] array) {
double sum = 0.0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}// END: sumArray
public static double sumArray(double[] array) {
double sum = 0.0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
return sum;
}// END: sumArray
// /////////////////
// ---CONSTANTS---//
// /////////////////
// public static final int TREE_MODEL_ELEMENT = 0;
public static final int BRANCH_MODEL_ELEMENT = 1;
public static final int SITE_RATE_MODEL_ELEMENT = 2;
public static final int BRANCH_RATE_MODEL_ELEMENT = 3;
public static final int FREQUENCY_MODEL_ELEMENT = 4;
public static final int DEMOGRAPHIC_MODEL_ELEMENT = 5;
public static final String TOPOLOGY = "topology";
public static final String ABSOLUTE_HEIGHT = "absoluteHeight";
public static final String TREE_FILENAME = "treeFilename";
public static final String SUBSTITUTION_MODEL = "substitutionModel";
public static final String DEMOGRAPHIC_MODEL = "demographicModel";
public static final String FREQUENCY_MODEL = "frequencyModel";
public static final String CODON_UNIVERSAL = "codon-universal";
public static final String CHOOSE_FILE = "Choose file...";
public static final String EDIT_TAXA_SET = "Edit taxa set...";
public static final String ANCESTRAL_SEQUENCE = "ancestralSequence";
public static final String BSS_ICON = "icons/bss.png";
public static final String CHECK_ICON = "icons/check.png";
public static final String ERROR_ICON = "icons/error.png";
public static final String HAMMER_ICON = "icons/hammer.png";
public static final String CLOSE_ICON = "icons/close.png";
public static final String BIOHAZARD_ICON = "icons/biohazard.png";
public static final String BUBBLE_BLUE_ICON = "icons/bubble-blue.png";
public static final String SAVE_ICON = "icons/save.png";
public static final String TEXT_FILE_ICON = "icons/file.png";
public static final double[] UNIFORM_CODON_FREQUENCIES = new double[] {
0.0163936, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344, 0.01639344, 0.01639344, 0.01639344, 0.01639344,
0.01639344 };
public static final String STOP_CODONS[] = new String[] { "TAA", "TAG", "TGA" };
// ///////////////////////////////
// ---GENERAL UTILITY METHODS---//
// ///////////////////////////////
public static double logfactor(int n) {
double logfactor = 0.0;
for (int i = 1; i <= n; i++) {
logfactor += Math.log(i);
}
return logfactor;
}
public static double map(double value, double low1, double high1,
double low2, double high2) {
/**
* maps a single value from its range into another interval
*
* @param low1
* , high1 - range of value; low2, high2 - interval
* @return the mapped value
*/
return (value - low1) / (high1 - low1) * (high2 - low2) + low2;
}// END: map
public static String[] loadStrings(String filename) throws IOException {
int linesCount = countLines(filename);
String[] lines = new String[linesCount];
FileInputStream inputStream;
BufferedReader reader;
String line;
inputStream = new FileInputStream(filename);
reader = new BufferedReader(new InputStreamReader(inputStream,
Charset.forName("UTF-8")));
int i = 0;
while ((line = reader.readLine()) != null) {
lines[i] = line;
i++;
}
// Clean up
reader.close();
reader = null;
inputStream = null;
return lines;
}// END: loadStrings
public static int countLines(String filename) throws IOException {
InputStream is = new BufferedInputStream(new FileInputStream(filename));
byte[] c = new byte[1024];
int count = 0;
int readChars = 0;
boolean empty = true;
while ((readChars = is.read(c)) != -1) {
empty = false;
for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n') {
++count;
}
}
}
is.close();
return (count == 0 && !empty) ? 1 : count;
}// END: countLines
public static Taxa importTaxaFromFile(File file) throws IOException {
Taxa taxa = new Taxa();
Taxon taxon;
String[] lines = Utils.loadStrings(file.getAbsolutePath());
for (int i = 0; i < lines.length; i++) {
String[] line = lines[i].split("\\s+");
taxon = new Taxon(line[TaxaEditorTableModel.NAME_INDEX]);
taxon.setAttribute(Utils.ABSOLUTE_HEIGHT,
Double.valueOf(line[TaxaEditorTableModel.HEIGHT_INDEX]));
taxa.addTaxon(taxon);
}// END: i loop
return taxa;
}// END: importTaxaFromFile
public static Tree importTreeFromFile(File file) throws IOException,
ImportException {
Tree tree = null;
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
if (line.toUpperCase().startsWith("#NEXUS")) {
NexusImporter importer = new NexusImporter(reader);
tree = importer.importTree(null);
} else {
NewickImporter importer = new NewickImporter(reader);
tree = importer.importTree(null);
}
reader.close();
return tree;
}// END: importTreeFromFile
public static void removeTaxaWithAttributeValue(PartitionDataList dataList,
String attribute, String value) {
for (int i = 0; i < dataList.allTaxa.getTaxonCount(); i++) {
Taxon taxon = dataList.allTaxa.getTaxon(i);
if (taxon.getAttribute(attribute).toString()
.equalsIgnoreCase(value)) {
dataList.allTaxa.removeTaxon(taxon);
i--;
}
}
}// END: removeTaxaWithAttributeValue
public static void centreLine(String line, int pageWidth) {
int n = pageWidth - line.length();
int n1 = n / 2;
for (int i = 0; i < n1; i++) {
System.out.print(" ");
}
System.out.println(line);
}
public static int getSiteCount(PartitionDataList dataList) {
int siteCount = 0;
int to = 0;
for (PartitionData data : dataList) {
// siteCount += data.createPartitionSiteCount();
to = data.to;
if (to > siteCount) {
siteCount = to;
}
}
return siteCount;// + 1;
}// END: getSiteCount
public static int arrayIndex(String[] array, String element) {
List<String> vector = new ArrayList<String>();
for (int i = 0; i < array.length; i++) {
vector.add(array[i]);
}
return vector.indexOf(element);
}// END: arrayIndex
public static ArrayList<TreeModel> treesToList(PartitionDataList dataList) {
ArrayList<TreeModel> treeModelsList = new ArrayList<TreeModel>();
for (PartitionData data : dataList) {
treeModelsList.add(data.createTreeModel());
}
return treeModelsList;
}// END: treesToList
public static boolean taxonExists(Taxon taxon, MutableTaxonList taxonList) {
boolean exists = false;
for (Taxon taxon2 : taxonList) {
if (taxon.equals(taxon2)
// &&
// taxon.getAttribute(Utils.TREE_FILENAME).toString().equalsIgnoreCase(taxon2.getAttribute(Utils.TREE_FILENAME).toString())
) {
exists = true;
break;
}
}
return exists;
}// END: taxonExists
// private boolean isFileInList(File file) {
// boolean exists = false;
//
// for (File file2 : dataList.treesList) {
//
// if (file.getName().equalsIgnoreCase(file2.getName())) {
// exists = true;
// break;
// }
//
// }
//
// return exists;
// }// END: isFileInList
public static double getAbsoluteTaxonHeight(Taxon taxon, Tree tree) {
double height = 0.0;
for (int i = 0; i < tree.getExternalNodeCount(); i++) {
NodeRef externalNode = tree.getExternalNode(i);
Taxon externalNodeTaxon = tree.getNodeTaxon(externalNode);
if (externalNodeTaxon.equals(taxon)) {
height = tree.getNodeHeight(externalNode);
}
}// END: external node loop
return height;
}// END: getAbsoluteTaxonHeight
public static boolean isRecordInList(TreesTableRecord record,
ArrayList<TreesTableRecord> recordsList) {
boolean exists = false;
for (TreesTableRecord record2 : recordsList) {
if (record.getName().equalsIgnoreCase(record2.getName())) {
exists = true;
break;
}
}
return exists;
}// END: isRecordInList
public static boolean isTaxaInList(Taxa taxa, ArrayList<Taxa> taxaList) {
boolean exists = false;
for (Taxa taxa2 : taxaList) {
if (taxaToString(taxa, true).equalsIgnoreCase(
taxaToString(taxa2, true))) {
exists = true;
break;
}
}
return exists;
}// END: isTaxaInList
public static int taxaIsIdenticalWith(Taxa taxa, ArrayList<Taxa> taxaList) {
int index = -Integer.MAX_VALUE;
for (Taxa taxa2 : taxaList) {
if (taxaToString(taxa, true).equalsIgnoreCase(
taxaToString(taxa2, true))) {
index = taxaList.indexOf(taxa2);
break;
}
}
return index;
}// END: treeModelIsIdenticalWith
public static boolean isTreeModelInList(TreeModel treeModel,
ArrayList<TreeModel> treeModelList) {
boolean exists = false;
for (TreeModel treeModel2 : treeModelList) {
if (treeModel.getNewick().equalsIgnoreCase(treeModel2.getNewick())) {
exists = true;
break;
}
}
return exists;
}// END: isTreeModelInList
public static int treeModelIsIdenticalWith(TreeModel treeModel,
ArrayList<TreeModel> treeModelList) {
int index = -Integer.MAX_VALUE;
for (TreeModel treeModel2 : treeModelList) {
if (treeModel.getNewick().equalsIgnoreCase(treeModel2.getNewick())) {
index = treeModelList.indexOf(treeModel2);
break;
}
}
return index;
}// END: treeModelIsIdenticalWith
public static boolean isElementInList(PartitionData data,
ArrayList<PartitionData> partitionList, int elementIndex) {
boolean exists = false;
switch (elementIndex) {
case DEMOGRAPHIC_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (demographicModelToString(data).equalsIgnoreCase(
demographicModelToString(data2))) {
exists = true;
break;
}
}
break;
case BRANCH_RATE_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (clockRateModelToString(data).equalsIgnoreCase(
clockRateModelToString(data2))) {
exists = true;
break;
}
}
break;
case FREQUENCY_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (frequencyModelToString(data).equalsIgnoreCase(
frequencyModelToString(data2))) {
exists = true;
break;
}
}
break;
case BRANCH_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (branchSubstitutionModelToString(data).equalsIgnoreCase(
branchSubstitutionModelToString(data2))) {
exists = true;
break;
}
}
break;
case SITE_RATE_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (siteRateModelToString(data).equalsIgnoreCase(
siteRateModelToString(data2))) {
exists = true;
break;
}
}
break;
default:
throw new RuntimeException("Unknown element");
}// END: switch
return exists;
}// END: isModelInList
public static int isIdenticalWith(PartitionData data,
ArrayList<PartitionData> partitionList, int elementIndex) {
int index = -Integer.MAX_VALUE;
switch (elementIndex) {
case DEMOGRAPHIC_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (demographicModelToString(data).equalsIgnoreCase(
demographicModelToString(data2))) {
index = partitionList.indexOf(data2);
break;
}
}
break;
case BRANCH_RATE_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (clockRateModelToString(data).equalsIgnoreCase(
clockRateModelToString(data2))) {
index = partitionList.indexOf(data2);
break;
}
}
break;
case FREQUENCY_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (frequencyModelToString(data).equalsIgnoreCase(
frequencyModelToString(data2))) {
index = partitionList.indexOf(data2);
break;
}
}
break;
case BRANCH_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (branchSubstitutionModelToString(data).equalsIgnoreCase(
branchSubstitutionModelToString(data2))) {
index = partitionList.indexOf(data2);
break;
}
}
break;
case SITE_RATE_MODEL_ELEMENT:
for (PartitionData data2 : partitionList) {
if (siteRateModelToString(data).equalsIgnoreCase(
siteRateModelToString(data2))) {
index = partitionList.indexOf(data2);
break;
}
}
break;
default:
throw new RuntimeException("Unknown element");
}// END: switch
return index;
}// END: isIdenticalWith
// /////////////////
// ---GUI UTILS---//
// /////////////////
public static ImageIcon createImageIcon(String path) {
ImageIcon icon = null;
URL imgURL = BeagleSequenceSimulatorApp.class.getResource(path);
if (imgURL != null) {
icon = new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path + "\n");
}
return icon;
}// END: CreateImageIcon
public static boolean isBrowsingSupported() {
if (!Desktop.isDesktopSupported()) {
return false;
}
boolean result = false;
Desktop desktop = java.awt.Desktop.getDesktop();
if (desktop.isSupported(Desktop.Action.BROWSE)) {
result = true;
}
return result;
}// END: isBrowsingSupported
public static int getTabbedPaneComponentIndex(JTabbedPane tabbedPane,
String title) {
int index = -Integer.MAX_VALUE;
int count = tabbedPane.getTabCount();
for (int i = 0; i < count; i++) {
if (tabbedPane.getTitleAt(i).toString().equalsIgnoreCase(title)) {
index = i;
break;
}// END: title check
}// END: i loop
return index;
}// END: getComponentIndex
public static Frame getActiveFrame() {
Frame result = null;
Frame[] frames = Frame.getFrames();
for (int i = 0; i < frames.length; i++) {
Frame frame = frames[i];
if (frame.isVisible()) {
result = frame;
break;
}
}
return result;
}
public static String getMultipleWritePath(File outFile,
String defaultExtension, int i) {
String path = outFile.getParent();
String[] nameArray = outFile.getName().split("\\.", 2);
String name = ((i == 0) ? nameArray[0] : nameArray[0] + i);
String extension = (nameArray.length == 1) ? (defaultExtension)
: (nameArray[1]);
String fullPath = path + System.getProperty("file.separator") + name
+ "." + extension;
return fullPath;
}// END: getMultipleWritePath
public static String getWritePath(File outFile, String defaultExtension) {
String path = outFile.getParent();
String[] nameArray = outFile.getName().split("\\.", 2);
String name = nameArray[0];
String extension = (nameArray.length == 1) ? (defaultExtension)
: (nameArray[1]);
String fullPath = path + System.getProperty("file.separator") + name
+ "." + extension;
return fullPath;
}// END: getWritePath
public static void showDialog(final String message) {
if (SwingUtilities.isEventDispatchThread()) {
JOptionPane.showMessageDialog(getActiveFrame(), message, "Message",
JOptionPane.ERROR_MESSAGE,
Utils.createImageIcon(Utils.BUBBLE_BLUE_ICON));
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JOptionPane.showMessageDialog(getActiveFrame(), message,
"Message", JOptionPane.ERROR_MESSAGE,
Utils.createImageIcon(Utils.BUBBLE_BLUE_ICON));
}
});
}// END: edt check
}// END: showDialog
// ////////////////////////////////
// ---EXCEPTION HANDLING UTILS---//
// ////////////////////////////////
public static void handleException(final Throwable e, final String message) {
final Thread t = Thread.currentThread();
if (SwingUtilities.isEventDispatchThread()) {
showExceptionDialog(t, e, message);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showExceptionDialog(t, e, message);
}
});
}// END: edt check
}// END: uncaughtException
public static void handleException(final Throwable e) {
final Thread t = Thread.currentThread();
if (SwingUtilities.isEventDispatchThread()) {
showExceptionDialog(t, e);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
showExceptionDialog(t, e);
}
});
}// END: edt check
}// END: handleException
private static void showExceptionDialog(Thread t, Throwable e) {
String msg = String.format("Unexpected problem on thread %s: %s",
t.getName(), e.getMessage());
logException(t, e);
JOptionPane.showMessageDialog(Utils.getActiveFrame(), //
msg, //
"Error", //
JOptionPane.ERROR_MESSAGE, //
Utils.createImageIcon(Utils.ERROR_ICON));
}// END: showExceptionDialog
private static void showExceptionDialog(Thread t, Throwable e,
String message) {
String msg = String.format("Unexpected problem on thread %s: %s" + "\n"
+ message, t.getName(), e.getMessage());
logException(t, e);
JOptionPane.showMessageDialog(Utils.getActiveFrame(), //
msg, //
"Error", //
JOptionPane.ERROR_MESSAGE, //
Utils.createImageIcon(Utils.ERROR_ICON));
}// END: showExceptionDialog
private static void logException(Thread t, Throwable e) {
e.printStackTrace();
}// END: logException
// ///////////////////
// ---PRINT UTILS---//
// ///////////////////
public static void printMap(Map<?, ?> mp) {
Iterator<?> it = mp.entrySet().iterator();
while (it.hasNext()) {
Entry<?, ?> pairs = (Entry<?, ?>) it.next();
Object obj = pairs.getValue();
if (obj instanceof int[]) {
int[] seq = (int[]) obj;
System.out.print(pairs.getKey() + " =");
for (int i = 0; i < seq.length; ++i) {
System.out.print(" " + seq[i]);
}
System.out.println();
} else if (obj instanceof double[]) {
double[] seq = (double[]) obj;
System.out.print(pairs.getKey() + " =");
for (int i = 0; i < seq.length; ++i) {
System.out.print(" " + seq[i]);
}
System.out.println();
} else {
System.out.println(pairs.getKey() + " = " + pairs.getValue());
}// END: obj class check
}
}// END: printMap
public static void printHashMap(ConcurrentHashMap<?, ?> hashMap) {
Iterator<?> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry<?, ?> pairs = (Entry<?, ?>) iterator.next();
Taxon taxon = (Taxon) pairs.getKey();
int[] sequence = (int[]) pairs.getValue();
System.out.println(taxon.toString());
Utils.printArray(sequence);
}// END: while has next
}// END: printHashMap
public static void printArray(Object[] x) {
for (int i = 0; i < x.length; i++) {
System.out.print(x[i] + " ");
}
System.out.println();
}// END: printArray
public static void printArray(int[] x) {
for (int i = 0; i < x.length; i++) {
System.out.print(x[i] + " ");
}
System.out.println();
}// END: printArray
public static void printArray(double[] x) {
for (int i = 0; i < x.length; i++) {
System.out.print(x[i] + " ");
}
System.out.println();
}// END: printArray
public static void printArray(boolean[] x) {
for (int i = 0; i < x.length; i++) {
System.out.print(x[i] + " ");
}
System.out.println();
}
public static void printArray(String[] x) {
for (int i = 0; i < x.length; i++) {
System.out.println(x[i]);
}
}// END: printArray
public static void print2DArray(double[][] array) {
for (int row = 0; row < array.length; row++) {
for (int col = 0; col < array[row].length; col++) {
System.out.print(array[row][col] + " ");
}
System.out.print("\n");
}
}// END: print2DArray
public static void print2DArray(int[][] array) {
for (int row = 0; row < array.length; row++) {
for (int col = 0; col < array[row].length; col++) {
System.out.print(array[row][col] + " ");
}
System.out.print("\n");
}
}// END: print2DArray
public static void print2Arrays(int[] array1, double[] array2, int nrow) {
for (int row = 0; row < nrow; row++) {
System.out.print(array1[row] + " " + array2[row] + " ");
System.out.print("\n");
}
}// END: print2DArray
public static void print2DArray(double[][] array, int formatEvery) {
int i = 0;
for (int row = 0; row < array.length; row++) {
for (int col = 0; col < array[row].length; col++) {
if (i == formatEvery) {
System.out.print("\n");
i = 0;
}
System.out.print(array[row][col] + " ");
i++;
}
System.out.print("\n");
}
}// END: print2DArray
public static void printBranchSubstitutionModel(PartitionData data) {
System.out.print("\tBranch Substitution model: ");
System.out.print(branchSubstitutionModelToString(data));
System.out.print("\n");
}// END: printBranchSubstitutionModel
public static void printClockRateModel(PartitionData data) {
System.out.print("\tClock rate model: ");
System.out.print(clockRateModelToString(data));
System.out.print("\n");
}// END: printClockRateModel
public static void printFrequencyModel(PartitionData data) {
System.out.print("\tFrequency model: ");
System.out.print(frequencyModelToString(data));
System.out.print("\n");
}// END: printFrequencyModel
public static void printSiteRateModel(PartitionData data) {
System.out.print("\tSite rate model: ");
System.out.print(siteRateModelToString(data));
System.out.print("\n");
}// END: printFrequencyModel
public static void printDemographicModel(PartitionData data) {
System.out.print("\tDemographic model: ");
System.out.print(demographicModelToString(data));
System.out.print("\n");
}// END: printFrequencyModel
private static void printDataType(PartitionData data) {
System.out.print("\tData type: ");
System.out.print(dataTypeToString(data));
System.out.print("\n");
}// END: printDataType
public static void printTaxaSet(Taxa taxa) {
for (int i = 0; i < taxa.getTaxonCount(); i++) {
Taxon taxon = taxa.getTaxon(i);
System.out.print("\t\t " + taxonToString(taxon, false) + ("\n"));
}
}// END: printTaxaSet
public static void printTree(TreesTableRecord record) {
System.out.print(record.getTree().toString());
System.out.print("\n");
}// END: printTree
public static void printRecord(TreesTableRecord record) {
if (record == null) {
System.out.println("\tRecord: NOT SET");
} else if (record.isTreeSet()) {
System.out.print("\t" + record.getName() + ": ");
printTree(record);
} else if (record.isTaxaSet()) {
System.out.println("\t" + record.getName() + ":");
printTaxaSet(record.getTaxa());
} else {
//
}
}// END: printRecord
public static void printRecords(PartitionDataList dataList) {
for (TreesTableRecord record : dataList.recordsList) {
printRecord(record);
}// END: record loop
}// END: printRecords
public static void printPartitionData(PartitionData data) {
printRecord(data.record);
printDataType(data);
printDemographicModel(data);
System.out.println("\tFrom: " + data.from);
System.out.println("\tTo: " + data.to);
System.out.println("\tEvery: " + data.every);
printBranchSubstitutionModel(data);
printSiteRateModel(data);
printClockRateModel(data);
printFrequencyModel(data);
}// END: printPartitionData
public static void printPartitionDataList(PartitionDataList dataList) {
// System.out.println(dataList.get(0).from + " " +
// dataList.get(1).from);
if (BeagleSequenceSimulatorApp.DEBUG) {
System.out.println("Possible records: ");
printRecords(dataList);
}
System.out.println("\tSite count: " + getSiteCount(dataList));
System.out.println("\tOutput type: " + dataList.outputFormat);
if (dataList.setSeed) {
System.out.println("\tStarting seed: " + dataList.startingSeed);
}
int row = 1;
for (PartitionData data : dataList) {
System.out.println("Partition: " + row);
printPartitionData(data);
row++;
}// END: data list loop
}// END: printDataList
public static void printTaxonList(PartitionDataList dataList) {
System.out.println(taxaToString(dataList.allTaxa, true));
}// END: printTaxonList
public static Sequence intArray2Sequence(Taxon taxon, int[] seq,
int gapFlag, DataType dataType) {
StringBuilder sSeq = new StringBuilder();
int partitionSiteCount = seq.length;
if (dataType instanceof Codons) {
for (int i = 0; i < partitionSiteCount; i++) {
int state = seq[i];
if (state == gapFlag) {
sSeq.append(dataType.getTriplet(dataType.getGapState()));
} else {
sSeq.append(dataType.getTriplet(seq[i]));
}// END: gap check
}// END: replications loop
} else {
for (int i = 0; i < partitionSiteCount; i++) {
int state = seq[i];
if (state == gapFlag) {
sSeq.append(dataType.getCode(dataType.getGapState()));
} else {
sSeq.append(dataType.getCode(seq[i]));
}// END: gap check
}// END: replications loop
}// END: dataType check
return new Sequence(taxon, sSeq.toString());
}// END: intArray2Sequence
// //////////////////////
// ---TOSTRING UTILS---//
// //////////////////////
public static String taxonToString(Taxon taxon, boolean printNames) {
String string = null;
if (printNames) {
string = taxon.getId() + " ("
+ taxon.getAttribute(Utils.ABSOLUTE_HEIGHT) + ","
+ taxon.getAttribute(Utils.TREE_FILENAME) + ")";
} else {
string = taxon.getId() + " ("
+ taxon.getAttribute(Utils.ABSOLUTE_HEIGHT) + ")";
}
return string;
}// END: taxonToString
public static String taxaToString(Taxa taxa, boolean printNames) {
String string = "";
for (int i = 0; i < taxa.getTaxonCount(); i++) {
Taxon taxon = taxa.getTaxon(i);
string += taxonToString(taxon, printNames) + ("\n");
}
return string;
}// END: taxaToString
public static String partitionDataToString(PartitionData data,
TreeModel simulatedTreeModel
// , LinkedHashMap<NodeRef, int[]> sequencesMap
) {
String string = "";
// if (data.record.isTreeSet()) {
//
// string += ("Tree: " + data.record.getTree().toString())+ ("\n");
//
// } else if (data.record.isTaxaSet()) {
//
// string += ("Taxa Set: \n" + taxaToString(data.record.getTaxa(),
// false));//+ ("\n");
//
// } else {
// //
// }
string += ("Tree model: " + simulatedTreeModel.toString()) + ("\n");
// string += ("Tree model: "
// +annotatedTreeModelToString(simulatedTreeModel, sequencesMap,
// data.createDataType()) ) + ("\n");
string += ("From: " + data.from) + ("\n");
string += ("To: " + data.to) + ("\n");
string += ("Every: " + data.every) + ("\n");
string += ("Data type: ") + dataTypeToString(data) + ("\n");
string += ("Demographic model: ") + demographicModelToString(data)
+ ("\n");
string += ("Branch Substitution model: ")
+ branchSubstitutionModelToString(data) + ("\n");
string += ("Frequency model: ") + frequencyModelToString(data) + ("\n");
string += ("Site Rate model: ") + siteRateModelToString(data) + ("\n");
string += ("Clock Rate model: ") + clockRateModelToString(data)
+ ("\n");
return string;
}// END: partitionDataToString
public static String partitionDataListToString(PartitionDataList dataList, //
ArrayList<TreeModel> simulatedTreeModelList
// ,LinkedHashMap<Integer,LinkedHashMap<NodeRef, int[]>>
// partitionSequencesMap
) {
String string = "";
TreeModel simulatedTreeModel;
// LinkedHashMap<NodeRef, int[]> sequencesMap;
string += ("Site count: " + getSiteCount(dataList)) + ("\n");
if (dataList.setSeed) {
string += ("Starting seed: " + dataList.startingSeed) + ("\n");
}
int row = 0;
for (PartitionData data : dataList) {
simulatedTreeModel = simulatedTreeModelList.get(row);
// sequencesMap = partitionSequencesMap.get(row);
string += ("Partition: " + (row + 1)) + ("\n");
string += partitionDataToString(data, simulatedTreeModel
// , sequencesMap
);
string += ("\n");
row++;
}// END: data list loop
return string;
}// END: partitionDataListToString
// TODO: doesn't work
public static String annotatedTreeModelToString(TreeModel treeModel,
LinkedHashMap<NodeRef, int[]> sequencesMap, DataType dataType) {
StringBuffer buffer = new StringBuffer();
NumberFormat format = NumberFormat.getNumberInstance(Locale.ENGLISH);
boolean useTipLabels = true;
AncestralSequenceTrait ancestralSequence = new AncestralSequenceTrait(
sequencesMap, dataType);
TreeTraitProvider[] treeTraitProviders = new TreeTraitProvider[] { ancestralSequence };
TreeUtils.newick(treeModel, //
treeModel.getRoot(), //
useTipLabels, //
TreeUtils.BranchLengthType.LENGTHS_AS_TIME, //
format, //
null, //
treeTraitProviders, //
null, buffer);
return buffer.toString();
}
private static String dataTypeToString(PartitionData data) {
String string = PartitionData.dataTypes[data.dataTypeIndex];
return string;
}
public static String demographicModelToString(PartitionData data) {
String string = PartitionData.demographicModels[data.demographicModelIndex];
string += (" ( ");
for (int i = 0; i < PartitionData.demographicParameterIndices[data.demographicModelIndex].length; i++) {
string += data.demographicParameterValues[PartitionData.demographicParameterIndices[data.demographicModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
return string;
}
public static String clockRateModelToString(PartitionData data) {
String string = PartitionData.clockModels[data.clockModelIndex];
string += (" ( ");
for (int i = 0; i < PartitionData.clockParameterIndices[data.clockModelIndex].length; i++) {
string += data.clockParameterValues[PartitionData.clockParameterIndices[data.clockModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
if(data.clockModelIndex == data.LRC_INDEX) {
String space = (data.lrcParametersInRealSpace == true ? "real" : "log");
string += " ( " + "Parameters in " + space + " space )";
}
return string;
}
public static String frequencyModelToString(PartitionData data) {
String string = PartitionData.frequencyModels[data.frequencyModelIndex];
string += (" ( ");
for (int i = 0; i < data.frequencyParameterIndices[data.frequencyModelIndex].length; i++) {
string += data.frequencyParameterValues[data.frequencyParameterIndices[data.frequencyModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
return string;
}
public static String branchSubstitutionModelToString(PartitionData data) {
String string = PartitionData.substitutionModels[data.substitutionModelIndex];
string += (" ( ");
for (int i = 0; i < PartitionData.substitutionParameterIndices[data.substitutionModelIndex].length; i++) {
string += data.substitutionParameterValues[PartitionData.substitutionParameterIndices[data.substitutionModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
return string;
}
public static String siteRateModelToString(PartitionData data) {
String string = PartitionData.siteRateModels[data.siteRateModelIndex];
string += (" ( ");
for (int i = 0; i < PartitionData.siteRateModelParameterIndices[data.siteRateModelIndex].length; i++) {
string += data.siteRateModelParameterValues[PartitionData.siteRateModelParameterIndices[data.siteRateModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
return string;
}
public static String demographyModelToString(PartitionData data) {
String string = PartitionData.demographicModels[data.demographicModelIndex];
string += (" ( ");
for (int i = 0; i < PartitionData.demographicParameterIndices[data.demographicModelIndex].length; i++) {
string += data.demographicParameterValues[PartitionData.demographicParameterIndices[data.demographicModelIndex][i]];
string += " ";
}// END: indices loop
string += ")";
return string;
}
}// END: class