All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.biojava.nbio.structure.secstruc.DSSPParser Maven / Gradle / Ivy

There is a newer version: 7.1.3
Show newest version
/*
 *                    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.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.biojava.nbio.structure.Group;
import org.biojava.nbio.structure.ResidueNumber;
import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.StructureException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Class to parse a DSSP file (output of the DSSP program),
 * that contains the secondary structure assignment of a structure.
 * 

* This class has been ported from the OWL Java library for * Structural Bioinformatics (https://github.com/eppic-team/owl). *

* As of September 2015, the DSSP source code and executables can * be downloaded from http://swift.cmbi.ru.nl/gv/dssp/. * * @author Aleix Lafita * @since 4.1.1 * */ public class DSSPParser { private static final Logger logger = LoggerFactory.getLogger(DSSPParser.class); /** * Parse a DSSP output file and return the secondary structure * annotation as a List of {@link SecStrucState} objects. * * @param dsspIs an InputStream to a DSSP file * @param structure Structure object associated to the dssp * @param assign assigns the SS to the structure if true * @return a List of SS annotation objects * @throws StructureException * @throws IOException */ public static List parseInputStream(InputStream dsspIs, Structure structure, boolean assign) throws IOException, StructureException { BufferedReader reader = new BufferedReader(new InputStreamReader(dsspIs)); return generalParse(reader, structure, assign); } /** * Parse a DSSP output file and return the secondary structure * annotation as a List of {@link SecStrucState} objects. * * @param dsspPath path to the DSSP file to parse * @param structure Structure object associated to the dssp * @param assign assigns the SS to the structure if true * @return a List of SS annotation objects * @throws StructureException * @throws IOException */ public static List parseFile(String dsspPath, Structure structure, boolean assign) throws IOException, StructureException { File file = new File(dsspPath); Reader read = new FileReader(file); BufferedReader reader = new BufferedReader(read); return generalParse(reader, structure, assign); } /** * Parse a DSSP format String and return the secondary structure * annotation as a List of {@link SecStrucState} objects. * * @param dsspOut String with the DSSP output to parse * @param structure Structure object associated to the dssp * @param assign assigns the SS to the structure if true * @return a List of SS annotation objects * @throws StructureException * @throws IOException */ public static List parseString(String dsspOut, Structure structure, boolean assign) throws IOException, StructureException { Reader read = new StringReader(dsspOut); BufferedReader reader = new BufferedReader(read); return generalParse(reader, structure, assign); } private static List generalParse(BufferedReader reader, Structure structure, boolean assign) throws IOException, StructureException { String startLine = " # RESIDUE AA STRUCTURE BP1 BP2 ACC"; String line; List secstruc = new ArrayList<>(); //Find the first line of the DSSP output while((line = reader.readLine()) != null) { if(line.startsWith(startLine)) break; } while((line = reader.readLine()) != null) { String indexStr = line.substring(0,5).trim(); String resNumStr = line.substring(5,10).trim(); //Only happens if dssp inserts a line indicating a chain break if(!"".equals(resNumStr)) { int index = Integer.parseInt(indexStr); //Get the group of the structure corresponding to the residue int resNum = Integer.parseInt(resNumStr); char insCode = line.charAt(10); String chainId = line.substring(11,13).trim(); ResidueNumber r = new ResidueNumber(chainId, resNum, insCode); Group parent = structure.getPolyChainByPDB(chainId) .getGroupByPDB(r); SecStrucType ssType = SecStrucType.fromCharacter(line.charAt(16)); SecStrucState ss = new SecStrucState(parent, SecStrucInfo.DSSP_ASSIGNMENT, ssType); //Parse the Bridge partners - TODO parallel or antiparallel? String bp = line.substring(25,29).trim(); if (!"".equals(bp)) { BetaBridge bb = new BetaBridge( index, Integer.parseInt(bp), BridgeType.parallel); ss.addBridge(bb); } else logger.warn("Unable to parse beta Bridge for resn "+index); bp = line.substring(29,33).trim(); if (!"".equals(bp)) { BetaBridge bb = new BetaBridge( index, Integer.parseInt(bp), BridgeType.parallel); ss.addBridge(bb); } else logger.warn("Unable to parse beta Bridge for resn "+index); //Parse the energy terms of donor and acceptor for (int i=0; i<4; i++){ int a = 42 + i*11; int b = a + 8; String val = line.substring(a,b).trim(); if ("".equals(val)) { logger.warn("Unable to parse energy for resn "+index); continue; } String[] p = val.split(","); int partner = Integer.parseInt(p[0]); if (partner != 0) partner += index; double energy = Double.parseDouble(p[1]) * 1000.0; switch(i){ case 0: ss.getAccept1().setPartner(partner); ss.getAccept1().setEnergy(energy); break; case 1: ss.getDonor1().setPartner(partner); ss.getDonor1().setEnergy(energy); break; case 2: ss.getAccept2().setPartner(partner); ss.getAccept2().setEnergy(energy); break; case 3: ss.getDonor2().setPartner(partner); ss.getDonor1().setEnergy(energy); break; } } //Angle properties String val = line.substring(91,97).trim(); if (!"".equals(val)) ss.setKappa(Float.parseFloat(val)); else logger.warn("Unable to parse kappa for resn "+index); val = line.substring(103,109).trim(); if (!"".equals(val)) ss.setPhi(Float.parseFloat(val)); else logger.warn("Unable to parse phi for resn "+index); val = line.substring(109,116).trim(); if (!"".equals(val)) ss.setPsi(Float.parseFloat(val)); else logger.warn("Unable to parse psi for resn "+index); if (assign) parent.setProperty(Group.SEC_STRUC, ss); secstruc.add(ss); } } reader.close(); return secstruc; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy