/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.datamodel;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import jalview.analysis.AverageDistanceEngine;
import jalview.bin.Console;
public class GroupSet implements GroupSetI
{
List groups = Arrays.asList();
public GroupSet(GroupSet grps)
{
abs = grps.abs;
colorMap = new HashMap(grps.colorMap);
groups = new ArrayList(grps.groups);
newick = grps.newick;
thresh = grps.thresh;
treeType = grps.treeType;
}
public GroupSet()
{
// TODO Auto-generated constructor stub
}
public GroupSet(boolean abs2, float thresh2, List groups2,
String treeType2, String newick2)
{
abs = abs2;
thresh = thresh2;
groups = groups2;
treeType = treeType2;
newick = newick2;
}
@Override
public boolean hasGroups()
{
return groups != null;
}
String newick = null;
@Override
public String getNewick()
{
return newick;
}
@Override
public boolean hasTree()
{
return newick != null && newick.length() > 0;
}
boolean abs = false;
double thresh = 0;
String treeType = null;
@Override
public void updateGroups(List colGroups)
{
if (colGroups != null)
{
groups = colGroups;
}
}
@Override
public BitSet getGroupsFor(int column)
{
if (groups != null)
{
for (BitSet gp : groups)
{
if (gp.get(column))
{
return gp;
}
}
}
// return singleton set;
BitSet bs = new BitSet();
bs.set(column);
return bs;
}
HashMap colorMap = new HashMap<>();
@Override
public Color getColourForGroup(BitSet bs)
{
if (bs == null)
{
return Color.white;
}
Color groupCol = colorMap.get(bs);
if (groupCol == null)
{
return Color.white;
}
return groupCol;
}
@Override
public void setColorForGroup(BitSet bs, Color color)
{
colorMap.put(bs, color);
}
@Override
public void restoreGroups(List newgroups, String treeMethod,
String tree, double thresh2)
{
treeType = treeMethod;
groups = newgroups;
thresh = thresh2;
newick = tree;
}
@Override
public boolean hasCutHeight()
{
return groups != null && thresh != 0;
}
@Override
public double getCutHeight()
{
return thresh;
}
@Override
public String getTreeMethod()
{
return treeType;
}
public static GroupSet makeGroups(ContactMatrixI matrix, boolean autoCut)
{
return makeGroups(matrix, autoCut, 0, autoCut);
}
public static GroupSet makeGroups(ContactMatrixI matrix, boolean auto,
float thresh, boolean abs)
{
AverageDistanceEngine clusterer = new AverageDistanceEngine(null, null,
matrix, true);
double height = clusterer.findHeight(clusterer.getTopNode());
Console.debug("Column tree height: " + height);
String newick = new jalview.io.NewickFile(clusterer.getTopNode(), false,
true).print();
String treeType = "UPGMA";
Console.trace("Newick string\n" + newick);
List nodegroups;
float cut = -1f;
if (auto)
{
double rootw = 0;
int p = 2;
BinaryNode bn = clusterer.getTopNode();
while (p-- > 0 & bn.left() != null)
{
if (bn.left() != null)
{
bn = bn.left();
}
if (bn.left() != null)
{
rootw = bn.height;
}
}
thresh = Math.max((float) (rootw / height) - 0.01f, 0);
cut = thresh;
nodegroups = clusterer.groupNodes(thresh);
}
else
{
if (abs ? (height > thresh) : (0 < thresh && thresh < 1))
{
cut = abs ? thresh : (float) (thresh * height);
Console.debug("Threshold " + cut + " for height=" + height);
nodegroups = clusterer.groupNodes(cut);
}
else
{
nodegroups = new ArrayList();
nodegroups.add(clusterer.getTopNode());
}
}
List groups = new ArrayList<>();
for (BinaryNode root : nodegroups)
{
BitSet gpset = new BitSet();
for (BinaryNode leaf : clusterer.findLeaves(root))
{
gpset.set((Integer) leaf.element());
}
groups.add(gpset);
}
GroupSet grps = new GroupSet(abs, (cut == -1f) ? thresh : cut, groups,
treeType, newick);
return grps;
}
@Override
public List getGroups()
{
return groups;
}
}