/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ package org.biojava.nbio.structure.symmetry.misc; import org.biojava.nbio.structure.symmetry.utils.BlastClustReader; import java.util.*; import java.util.Map.Entry; public class ProteinComplexSignature { private BlastClustReader blastClust = null; private String pdbId = ""; private List<String> chainIds = null; private List<ChainSignature> chainSignatures = new ArrayList<ChainSignature>(); public ProteinComplexSignature(String pdbId, List<String> chainIds, BlastClustReader blastClust) { this.pdbId = pdbId; this.chainIds = chainIds; this.blastClust = blastClust; getChainSignatures(); } public String getComplexSignature() { StringBuilder builder = new StringBuilder(); for (ChainSignature s: chainSignatures) { builder.append(s.toString()); } return builder.toString(); } public String getCompositionId(String chainId) { for (ChainSignature s: chainSignatures) { if (s.getChainIds().contains(chainId)) { return s.getCompositionId(); } } return ""; } public String getComplexStoichiometry() { StringBuilder s = new StringBuilder(); for (ChainSignature c: chainSignatures) { s.append(c.getCompositionId()); if (c.getChainIds().size() >1) { s.append(c.getChainIds().size()); } } return s.toString(); } public int getSubunitTypeCount() { return chainSignatures.size(); } private List<ChainSignature> getChainSignatures() { String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; Map<String,Integer> mapCounts = new TreeMap<String,Integer>(); Map<String,List<String>> mapChainIds = new TreeMap<String, List<String>>(); for (String chainId: chainIds) { String rep = blastClust.getRepresentativeChain(pdbId, chainId); Integer value = mapCounts.get(rep); if (value == null) { mapCounts.put(rep, 1); List<String> list = new ArrayList<String>(); list.add(chainId); mapChainIds.put(rep, list); } else { value+=1; mapCounts.put(rep, value); List<String> list = mapChainIds.get(rep); list.add(chainId); } } for (Entry<String, Integer> entry: mapCounts.entrySet()) { List<String> chainIds = mapChainIds.get(entry.getKey()); ChainSignature chainSignature = new ChainSignature(entry.getKey(), entry.getValue(), chainIds); chainSignatures.add(chainSignature); } Collections.sort(chainSignatures); for (int i = 0; i < chainSignatures.size(); i++) { ChainSignature c = chainSignatures.get(i); if (i < alpha.length()) { c.setCompositionId(alpha.substring(i,i+1)); } else { c.setCompositionId("?"); } } return chainSignatures; } }