Skip to content

Commit 58b00ff

Browse files
authored
Merge pull request #707 from edlunde-dnastar/linelength424
CONECT/LINK line-length bug fix for the PDB Parser (already in BioJava Master branch).
2 parents 5d753fd + e88637c commit 58b00ff

File tree

2 files changed

+135
-51
lines changed

2 files changed

+135
-51
lines changed

biojava-structure/src/main/java/org/biojava/nbio/structure/io/PDBFileParser.java

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,8 @@ private void switchCAOnly(){
20222022

20232023
/** safes repeating a few lines ... */
20242024
private Integer conect_helper (String line,int start,int end) {
2025+
if (line.length() < end) return null;
2026+
20252027
String sbond = line.substring(start,end).trim();
20262028
int bond = -1 ;
20272029
Integer b = null ;
@@ -2348,7 +2350,15 @@ private void pdb_SSBOND_Handler(String line){
23482350
private void pdb_LINK_Handler(String line) {
23492351

23502352
if (params.isHeaderOnly()) return;
2353+
2354+
// Check for the minimal set of fields.
2355+
if (line.length()<56) {
2356+
logger.info("LINK line has length under 56. Ignoring it.");
2357+
return;
2358+
}
23512359

2360+
int len = line.length();
2361+
23522362
String name1 = line.substring(12, 16).trim();
23532363
String altLoc1 = line.substring(16, 17).trim();
23542364
String resName1 = line.substring(17, 20).trim();
@@ -2361,10 +2371,13 @@ private void pdb_LINK_Handler(String line) {
23612371
String resName2 = line.substring(47, 50).trim();
23622372
String chainID2 = line.substring(51, 52).trim();
23632373
String resSeq2 = line.substring(52, 56).trim();
2364-
String iCode2 = line.substring(56, 57).trim();
2374+
String iCode2 = null; // Might get trimmed if blank.
2375+
if (len > 56) iCode2 = line.substring(56, 57).trim();
23652376

2366-
String sym1 = line.substring(59, 65).trim();
2367-
String sym2 = line.substring(66, 72).trim();
2377+
String sym1 = null;
2378+
if (len > 64) sym1 = line.substring(59, 65).trim();
2379+
String sym2 = null;
2380+
if (len > 71) sym2 = line.substring(66, 72).trim();
23682381

23692382
// System.err.println("LINK");
23702383
// System.err.println("\tName: " + name1);
@@ -2695,54 +2708,54 @@ public Structure parsePDBFile(BufferedReader buf)
26952708

26962709
String recordName = line.substring (0, 6).trim ();
26972710

2698-
if (recordName.equals("ATOM"))
2699-
pdb_ATOM_Handler(line);
2700-
else if (recordName.equals("SEQRES"))
2701-
pdb_SEQRES_Handler(line);
2702-
else if (recordName.equals("HETATM"))
2703-
pdb_ATOM_Handler(line);
2704-
else if (recordName.equals("MODEL"))
2705-
pdb_MODEL_Handler(line);
2706-
else if (recordName.equals("HEADER"))
2707-
pdb_HEADER_Handler(line);
2708-
else if (recordName.equals("AUTHOR"))
2709-
pdb_AUTHOR_Handler(line);
2710-
else if (recordName.equals("TITLE"))
2711-
pdb_TITLE_Handler(line);
2712-
else if (recordName.equals("SOURCE"))
2713-
sourceLines.add(line); //pdb_SOURCE_Handler
2714-
else if (recordName.equals("COMPND"))
2715-
compndLines.add(line); //pdb_COMPND_Handler
2716-
else if (recordName.equals("JRNL"))
2717-
pdb_JRNL_Handler(line);
2718-
else if (recordName.equals("EXPDTA"))
2719-
pdb_EXPDTA_Handler(line);
2720-
else if (recordName.equals("CRYST1"))
2721-
pdb_CRYST1_Handler(line);
2722-
else if (recordName.startsWith("MTRIX"))
2723-
pdb_MTRIXn_Handler(line);
2724-
else if (recordName.equals("REMARK"))
2725-
pdb_REMARK_Handler(line);
2726-
else if (recordName.equals("CONECT"))
2727-
pdb_CONECT_Handler(line);
2728-
else if (recordName.equals("REVDAT"))
2729-
pdb_REVDAT_Handler(line);
2730-
else if (recordName.equals("DBREF"))
2731-
pdb_DBREF_Handler(line);
2732-
else if (recordName.equals("SITE"))
2733-
pdb_SITE_Handler(line);
2734-
else if (recordName.equals("SSBOND"))
2735-
pdb_SSBOND_Handler(line);
2736-
else if (recordName.equals("LINK"))
2737-
pdb_LINK_Handler(line);
2738-
else if ( params.isParseSecStruc()) {
2739-
if ( recordName.equals("HELIX") ) pdb_HELIX_Handler ( line ) ;
2740-
else if (recordName.equals("SHEET")) pdb_SHEET_Handler(line ) ;
2741-
else if (recordName.equals("TURN")) pdb_TURN_Handler( line ) ;
2742-
}
2743-
else {
2744-
// this line type is not supported, yet.
2745-
// we ignore it
2711+
try {
2712+
if (recordName.equals("ATOM"))
2713+
pdb_ATOM_Handler(line);
2714+
else if (recordName.equals("SEQRES"))
2715+
pdb_SEQRES_Handler(line);
2716+
else if (recordName.equals("HETATM"))
2717+
pdb_ATOM_Handler(line);
2718+
else if (recordName.equals("MODEL"))
2719+
pdb_MODEL_Handler(line);
2720+
else if (recordName.equals("HEADER"))
2721+
pdb_HEADER_Handler(line);
2722+
else if (recordName.equals("AUTHOR"))
2723+
pdb_AUTHOR_Handler(line);
2724+
else if (recordName.equals("TITLE"))
2725+
pdb_TITLE_Handler(line);
2726+
else if (recordName.equals("SOURCE"))
2727+
sourceLines.add(line); //pdb_SOURCE_Handler
2728+
else if (recordName.equals("COMPND"))
2729+
compndLines.add(line); //pdb_COMPND_Handler
2730+
else if (recordName.equals("JRNL"))
2731+
pdb_JRNL_Handler(line);
2732+
else if (recordName.equals("EXPDTA"))
2733+
pdb_EXPDTA_Handler(line);
2734+
else if (recordName.equals("CRYST1"))
2735+
pdb_CRYST1_Handler(line);
2736+
else if (recordName.startsWith("MTRIX"))
2737+
pdb_MTRIXn_Handler(line);
2738+
else if (recordName.equals("REMARK"))
2739+
pdb_REMARK_Handler(line);
2740+
else if (recordName.equals("CONECT"))
2741+
pdb_CONECT_Handler(line);
2742+
else if (recordName.equals("REVDAT"))
2743+
pdb_REVDAT_Handler(line);
2744+
else if (recordName.equals("DBREF"))
2745+
pdb_DBREF_Handler(line);
2746+
else if (recordName.equals("SITE"))
2747+
pdb_SITE_Handler(line);
2748+
else if (recordName.equals("SSBOND"))
2749+
pdb_SSBOND_Handler(line);
2750+
else if (recordName.equals("LINK"))
2751+
pdb_LINK_Handler(line);
2752+
else if ( params.isParseSecStruc()) {
2753+
if ( recordName.equals("HELIX") ) pdb_HELIX_Handler ( line ) ;
2754+
else if (recordName.equals("SHEET")) pdb_SHEET_Handler(line ) ;
2755+
else if (recordName.equals("TURN")) pdb_TURN_Handler( line ) ;
2756+
}
2757+
} catch (StringIndexOutOfBoundsException ex) {
2758+
logger.warn("Unable to parse [" + line + "]");
27462759
}
27472760

27482761

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.biojava.nbio.structure.io;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import java.io.ByteArrayInputStream;
6+
import java.io.IOException;
7+
import java.io.InputStream;
8+
9+
import org.biojava.nbio.structure.Atom;
10+
import org.biojava.nbio.structure.Chain;
11+
import org.biojava.nbio.structure.Group;
12+
import org.biojava.nbio.structure.Structure;
13+
import org.junit.Test;
14+
15+
/**
16+
* This class will test parsing short CONECT lines.
17+
*/
18+
public class TestShortLines {
19+
20+
@Test
21+
public void testConect() throws IOException {
22+
PDBFileParser pdbPars = new PDBFileParser();
23+
FileParsingParameters params = pdbPars.getFileParsingParameters();
24+
params.setCreateAtomBonds(true);
25+
26+
// CONECTS will be deprecated, but will we create bonds?
27+
// Like the LINK records, should BioJava create BondImpl when params.setCreateAtomBonds(true)?
28+
29+
StringBuilder sb = new StringBuilder();
30+
sb.append("HETATM 2398 P FAD A 500 8.398 46.448 73.490 1.00 13.51 P \n");
31+
sb.append("HETATM 2399 PA FAD A 500 6.089 45.580 75.235 1.00 15.88 P \n");
32+
sb.append("HETATM 2400 O1P FAD A 500 7.908 47.684 72.869 1.00 4.19 O \n");
33+
sb.append("CONECT 2400 2398\n");
34+
String shortLine = sb.toString();
35+
Structure s;
36+
// Parse short
37+
try(InputStream is = new ByteArrayInputStream(shortLine.getBytes())) {
38+
s = pdbPars.parsePDBFile(is);
39+
}
40+
41+
// After 4.2, CONECTS are deprecated, but there is not yet an implementation
42+
// describing how CONECTS will be replaced - will Bonds be created?
43+
assertEquals(1, s.getConnections().size());
44+
}
45+
46+
@Test
47+
public void testLINK() throws IOException {
48+
Structure s;
49+
PDBFileParser pdbPars = new PDBFileParser();
50+
FileParsingParameters params = pdbPars.getFileParsingParameters();
51+
params.setCreateAtomBonds(true);
52+
53+
StringBuilder sb = new StringBuilder();
54+
sb.append("ATOM 2412 C21 2EG A 7 0.888 44.973 72.238 1.00 29.17 C \n");
55+
sb.append("ATOM 2413 C22 2EG B 19 0.888 44.973 72.238 1.00 29.17 C \n");
56+
//sb.append("LINK C21 2EG A 7 C22 2EG B 19 1555 1555 1.56 ");
57+
sb.append("LINK C21 2EG A 7 C22 2EG B 19\n");
58+
String shortLine = sb.toString();
59+
60+
// Parse short
61+
try(InputStream is = new ByteArrayInputStream(shortLine.getBytes())) {
62+
s = pdbPars.parsePDBFile(is);
63+
}
64+
65+
// Should be a bond present in the Atoms.
66+
Chain c = s.getChain(0, 0);
67+
Group g = c.getAtomGroups().get(0);
68+
Atom a = g.getAtom(0);
69+
assertEquals(1, a.getBonds().size());
70+
}
71+
}

0 commit comments

Comments
 (0)