001/* 002 * BioJava development code 003 * 004 * This code may be freely distributed and modified under the 005 * terms of the GNU Lesser General Public Licence. This should 006 * be distributed with the code. If you do not have a copy, 007 * see: 008 * 009 * http://www.gnu.org/copyleft/lesser.html 010 * 011 * Copyright for this code is held jointly by the individual 012 * authors. These should be listed in @author doc comments. 013 * 014 * For more information on the BioJava project and its aims, 015 * or to join the biojava-l mailing list, visit the home page 016 * at: 017 * 018 * http://www.biojava.org/ 019 * 020 */ 021package org.biojava.nbio.structure; 022 023import java.io.Serializable; 024import java.util.ArrayList; 025import java.util.List; 026 027import org.slf4j.Logger; 028import org.slf4j.LoggerFactory; 029 030/** 031 * An internal utility class for StructureImpl to make it easier to manage poly and nonpoly chains. 032 * Not to exposed to users through API. 033 * 034 * Created by andreas on 5/3/16. 035 * @author Andreas Prlic 036 * @since 5.0 037 */ 038public class Model implements Serializable { 039 040 private static final long serialVersionUID = 5320613424668781882L; 041 042 private static final Logger logger = LoggerFactory.getLogger(Model.class); 043 044 private List<Chain> polyChains; 045 private List<Chain> nonPolyChains; 046 private List<Chain> waterChains; 047 048 public Model(){ 049 polyChains = new ArrayList<>(); 050 nonPolyChains = new ArrayList<>(); 051 waterChains = new ArrayList<>(); 052 } 053 054 public List<Chain> getPolyChains() { 055 return polyChains; 056 } 057 058 public List<Chain> getNonPolyChains() { 059 return nonPolyChains; 060 } 061 062 public List<Chain> getWaterChains() { 063 return waterChains; 064 } 065 066 /** 067 * Get all chains: polymeric, non-polymeric and water 068 * @return 069 */ 070 public List<Chain> getChains(){ 071 ArrayList<Chain> chains = new ArrayList<>(); 072 073 chains.addAll(polyChains); 074 chains.addAll(nonPolyChains); 075 chains.addAll(waterChains); 076 077 chains.trimToSize(); 078 079 return chains; 080 } 081 082 public void setChains(List<Chain> modelChains) { 083 084 polyChains.clear(); 085 nonPolyChains.clear(); 086 waterChains.clear(); 087 088 for (Chain c : modelChains){ 089 addChain(c); 090 } 091 } 092 093 public void addChain(Chain c) { 094 EntityInfo info = c.getEntityInfo(); 095 096 if ( info == null || info.getType() == null) { 097 logger.info("No entity info could be found while adding chain with asym id {} (author id {}). Will consider it a polymer chain.", c.getId(), c.getName()); 098 polyChains.add(c); 099 100 } else if ( info.getType() == EntityType.POLYMER) { 101 polyChains.add(c); 102 103 } else if (info.getType() == EntityType.NONPOLYMER) { 104 nonPolyChains.add(c); 105 106 } else if (info.getType() == EntityType.WATER) { 107 waterChains.add(c); 108 109 } else if (info.getType() == EntityType.MACROLIDE) { 110 logger.warn("Chain with asym id {} (author id {}) has entity type 'macrolide', considering it non-polymeric", c.getId(), c.getName()); 111 nonPolyChains.add(c); 112 113 } else { 114 logger.warn("Chain with asym id {} (author id {}) has unsupported entity type '{}'. Will not add it to the Structure.", c.getId(), c.getName(), info.getType().toString()); 115 // ignore it 116 117 } 118 } 119 120 /** 121 * Returns the total number of chains in this model: polymeric, non-polymeric and water 122 * @return 123 */ 124 public int size() { 125 return polyChains.size() + nonPolyChains.size() + waterChains.size(); 126 } 127 128 @Override 129 public String toString() { 130 return "["+polyChains.size()+" poly chains, "+nonPolyChains.size()+" non-poly chains, "+waterChains.size()+" water chains]"; 131 } 132}