Skip to content

Commit 130f342

Browse files
committed
Improving GUI robustness wrt deme count.
1 parent bc4f6e4 commit 130f342

File tree

2 files changed

+53
-5
lines changed

2 files changed

+53
-5
lines changed

src/beast/app/multitypetree/beauti/InitMigrationModelConnector.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@
2323
import beast.evolution.likelihood.TreeLikelihood;
2424
import beast.evolution.tree.SCMigrationModel;
2525
import beast.evolution.tree.StructuredCoalescentMultiTypeTree;
26+
import beast.evolution.tree.TraitSet;
2627

28+
import java.util.HashSet;
2729
import java.util.List;
30+
import java.util.Set;
2831

2932

3033
/**
@@ -37,6 +40,15 @@
3740
* @author Tim Vaughan ([email protected])
3841
*/
3942
public class InitMigrationModelConnector {
43+
44+
public static int uniqueTraitsInData(StructuredCoalescentMultiTypeTree scTree) {
45+
Set<String> uniqueTypes = new HashSet<>();
46+
TraitSet typeTraitSet = scTree.typeTraitInput.get();
47+
for (String taxonName : typeTraitSet.taxaInput.get().getTaxaNames())
48+
uniqueTypes.add(typeTraitSet.getStringValue(taxonName));
49+
50+
return uniqueTypes.size();
51+
}
4052

4153
public static boolean customConnector(BeautiDoc doc) {
4254

@@ -56,6 +68,37 @@ public static boolean customConnector(BeautiDoc doc) {
5668
String rateMatrixStr = getParameterString((RealParameter)migModel.rateMatrixInput.get());
5769
String popSizesStr = getParameterString((RealParameter)migModel.popSizesInput.get());
5870

71+
// Ensure model has minimum number of demes
72+
int uniqueTraitCount = uniqueTraitsInData(tree);
73+
StringBuilder rateMatrixStrBuilder = new StringBuilder();
74+
StringBuilder popSizesStrBuilder = new StringBuilder();
75+
if (migModel.getNTypes()<uniqueTraitCount) {
76+
for (int i=0; i<uniqueTraitCount; i++) {
77+
popSizesStrBuilder.append(" 1.0");
78+
for (int j=0; j<uniqueTraitCount; j++) {
79+
if (j == i)
80+
continue;
81+
82+
rateMatrixStrBuilder.append(" 1.0");
83+
}
84+
}
85+
86+
popSizesStr = popSizesStrBuilder.toString();
87+
rateMatrixStr = rateMatrixStrBuilder.toString();
88+
89+
((RealParameter)migModel.popSizesInput.get()).setDimension(uniqueTraitCount);
90+
((RealParameter)migModel.popSizesInput.get()).valuesInput.setValue(popSizesStr,
91+
(RealParameter)migModel.popSizesInput.get());
92+
93+
((RealParameter)migModel.rateMatrixInput.get()).setDimension(uniqueTraitCount*(uniqueTraitCount-1));
94+
((RealParameter)migModel.rateMatrixInput.get()).valuesInput.setValue(rateMatrixStr,
95+
(RealParameter)migModel.rateMatrixInput.get());
96+
97+
((RealParameter)migModel.popSizesInput.get()).initAndValidate();
98+
((RealParameter)migModel.rateMatrixInput.get()).initAndValidate();
99+
migModel.initAndValidate();
100+
}
101+
59102
((RealParameter)migModelInit.popSizesInput.get()).setDimension(migModel.getNTypes());
60103

61104
((RealParameter)migModelInit.popSizesInput.get()).valuesInput.setValue(

src/beast/evolution/tree/StructuredCoalescentMultiTypeTree.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@
2929

3030
import java.io.FileNotFoundException;
3131
import java.io.PrintStream;
32-
import java.util.ArrayList;
33-
import java.util.Collections;
34-
import java.util.List;
32+
import java.util.*;
3533

3634
/**
3735
* A multi-type tree generated randomly from leaf types and a migration matrix
@@ -118,7 +116,7 @@ public void initAndValidate() {
118116
// Obtain leaf colours from explicit input or alignment:
119117
leafTypes = Lists.newArrayList();
120118
leafNames = Lists.newArrayList();
121-
if (leafTypesInput.get() != null) {
119+
if (leafTypesInput.get() != null) {
122120
for (int i=0; i<leafTypesInput.get().getDimension(); i++) {
123121
leafTypes.add(leafTypesInput.get().getValue(i));
124122
leafNames.add(String.valueOf(i));
@@ -137,7 +135,14 @@ public void initAndValidate() {
137135
}
138136

139137
}
140-
138+
139+
// Count unique leaf types:
140+
int nUniqueLeafTypes = new HashSet<>(leafTypes).size();
141+
if (nUniqueLeafTypes > migModel.getNTypes())
142+
throw new IllegalArgumentException("There are " + nUniqueLeafTypes
143+
+ " unique leaf types but the model only includes "
144+
+ migModel.getNTypes() + " unique types!");
145+
141146
nLeaves = leafTypes.size();
142147

143148
// Set leaf times if specified:

0 commit comments

Comments
 (0)