package org.biojava.nbio.structure.cluster; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * Some utility methods commonly used for Subunit clusters. They take as input a * List of {@link SubunitCluster}, the output of the {@link SubunitClusterer}. * * @author Aleix Lafita * @since 5.0.0 * */ public class SubunitClusterUtils { /** Prevent instantiation **/ private SubunitClusterUtils() { } /** * Return a canonical String representation of the stoichiometry of a group * of Subunits. * <P> * This method only uses alphabetic charaters for Subunit ids. For * stoichiometries with a large number of entities, ? will be used when all * alphabetic characters are used. * * @param clusters * List of Subunit clusters * @return String representation of the stoichiometry */ public static String getStoichiometryString(List<SubunitCluster> clusters) { // List number of members in each cluster List<Integer> stoichiometries = clusters.stream().map(c -> c.size()) .collect(Collectors.toList()); Collections.sort(stoichiometries); Collections.reverse(stoichiometries); // build formula string String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; StringBuilder formula = new StringBuilder(); for (int i = 0; i < stoichiometries.size(); i++) { String key = "?"; if (i < alpha.length()) key = alpha.substring(i, i + 1); formula.append(key); if (stoichiometries.get(i) > 1) formula.append(stoichiometries.get(i)); } return formula.toString(); } /** * A pseudostoichiometric {@link SubunitCluster} was obtained using the * {@link SubunitClustererMethod#STRUCTURE} similarity. * * @param clusters * @return true if any of the clusters is pseudostoichiometric, false * otherwise */ public static boolean isPseudoStoichiometric(List<SubunitCluster> clusters) { for (SubunitCluster c : clusters) { if (c.getClustererMethod() == SubunitClustererMethod.STRUCTURE) return true; } return false; } }