/*
* 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.secstruc;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.biojava.nbio.structure.Group;
import org.biojava.nbio.structure.GroupIterator;
import org.biojava.nbio.structure.ResidueNumber;
import org.biojava.nbio.structure.Structure;
/**
* This class contains methods for obtaining and converting secondary structure
* information from BioJava {@link Structure}s.
*
* @author Aleix Lafita
* @since 4.1.1
*
*/
public class SecStrucTools {
/**
* Obtain the List of secondary structure information (SecStrucInfo) of a
* Structure.
*
* @param s
* Structure with SS assignments
* @return List of SecStrucInfo objects
*/
public static List<SecStrucInfo> getSecStrucInfo(Structure s) {
List<SecStrucInfo> listSSI = new ArrayList<SecStrucInfo>();
GroupIterator iter = new GroupIterator(s);
while (iter.hasNext()) {
Group g = iter.next();
if (g.hasAminoAtoms()) {
Object p = g.getProperty(Group.SEC_STRUC);
if (!(p == null)) {
SecStrucInfo ss = (SecStrucInfo) p;
listSSI.add(ss);
}
}
}
return listSSI;
}
public static void assignSecStruc( Structure s,List<SecStrucInfo> listSSI){
for ( SecStrucInfo ssi : listSSI){
ssi.getGroup().setProperty(Group.SEC_STRUC,ssi);
}
}
/**
* Obtain the List of secondary structure elements (SecStrucElement) of a
* Structure.
*
* @param s
* Structure with SS assignments
* @return List of SecStrucElement objects
*/
public static List<SecStrucElement> getSecStrucElements(Structure s) {
List<SecStrucElement> listSSE = new ArrayList<SecStrucElement>();
GroupIterator iter = new GroupIterator(s);
// SecStruc information - initialize
SecStrucType type = SecStrucType.coil;
ResidueNumber previous = new ResidueNumber();
ResidueNumber start = new ResidueNumber();
String chainId = "";
int count = 0; // counts the number of residues in SSE
// Create a map for the IDs of the SSE in the structure
Map<SecStrucType, Integer> ids = new TreeMap<SecStrucType, Integer>();
for (SecStrucType t : SecStrucType.values())
ids.put(t, 1);
while (iter.hasNext()) {
Group g = iter.next();
if (g.hasAminoAtoms()) {
Object p = g.getProperty(Group.SEC_STRUC);
if (p == null)
continue;
SecStrucInfo ss = (SecStrucInfo) p;
if (count > 0) {
// If chain and type are equal increment counter
if (ss.type == type && chainId == g.getChainId()) {
previous = g.getResidueNumber();
count++;
continue;
} else {
// Save the current SSE if chain or type change
SecStrucElement sse = new SecStrucElement(type, start,
previous, count, ids.get(type), chainId);
listSSE.add(sse);
ids.put(type, ids.get(type) + 1);
count = 0;
// Initialize a new SSE one
if (ss.type != SecStrucType.coil) {
type = ss.type;
start = g.getResidueNumber();
previous = start;
chainId = g.getChainId();
count = 1;
}
}
} else {
// This is for the first residue only
if (ss.type != SecStrucType.coil) {
type = ss.type;
start = g.getResidueNumber();
previous = start;
chainId = g.getChainId();
count = 1;
}
}
}
}
return listSSE;
}
/**
* Obtain the List of secondary structure elements (SecStrucElement) of a
* List of Groups (assumed to be sequential, this is, connected in the
* original Structure).
*
* @param groups
* Structure with SS assignments
* @return List of SecStrucElement objects
*/
public static List<SecStrucElement> getSecStrucElements(List<Group> groups) {
List<SecStrucElement> listSSE = new ArrayList<SecStrucElement>();
// SecStruc information - initialize
SecStrucType type = SecStrucType.coil;
ResidueNumber previous = new ResidueNumber();
ResidueNumber start = new ResidueNumber();
String chainId = "";
int count = 0; // counts the number of residues in SSE
// Create a map for the IDs of the SSE in the structure
Map<SecStrucType, Integer> ids = new TreeMap<SecStrucType, Integer>();
for (SecStrucType t : SecStrucType.values())
ids.put(t, 1);
for (Group g : groups) {
if (g.hasAminoAtoms()) {
Object p = g.getProperty(Group.SEC_STRUC);
if (p == null)
continue;
SecStrucInfo ss = (SecStrucInfo) p;
if (count > 0) {
// If chain and type are equal increment counter
if (ss.type == type && chainId == g.getChainId()) {
previous = g.getResidueNumber();
count++;
continue;
} else {
// Save the current SSE if chain or type change
SecStrucElement sse = new SecStrucElement(type, start,
previous, count, ids.get(type), chainId);
listSSE.add(sse);
ids.put(type, ids.get(type) + 1);
count = 0;
// Initialize a new SSE one
if (ss.type != SecStrucType.coil) {
type = ss.type;
start = g.getResidueNumber();
previous = start;
chainId = g.getChainId();
count = 1;
}
}
} else {
// This is for the first residue only
if (ss.type != SecStrucType.coil) {
type = ss.type;
start = g.getResidueNumber();
previous = start;
chainId = g.getChainId();
count = 1;
}
}
}
}
return listSSE;
}
}