Skip to content

Commit bfb6a31

Browse files
committed
Fix biojava#449 by copying SEQRES to new chains
Conveniently, the reducing a chain doesn't alter the seqres so we just copy it.
1 parent e0c1ede commit bfb6a31

2 files changed

Lines changed: 79 additions & 11 deletions

File tree

biojava-structure/src/main/java/org/biojava/nbio/structure/SubstructureIdentifier.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -264,26 +264,27 @@ public Structure reduce(Structure s) throws StructureException {
264264
groups = Arrays.asList(chain.getGroupsByPDB(pdbresnum1, pdbresnum2));
265265
}
266266

267-
// Create new chain, if needed
268267
Chain c = null;
269-
if ( prevChainId == null) {
270-
// first chain...
271-
c = new ChainImpl();
272-
c.setChainID(chain.getChainID());
273-
newS.addChain(c,modelNr);
274-
} else if ( prevChainId.equals(chain.getChainID())) {
268+
269+
// Reuse prevChain
270+
if ( prevChainId != null && prevChainId.equals(chain.getChainID())) {
275271
c = newS.getChainByPDB(prevChainId,modelNr);
276-
277272
} else {
278273
try {
279274
c = newS.getChainByPDB(chain.getChainID(),modelNr);
280275
} catch (StructureException e){
281276
// chain not in structure yet...
282-
c = new ChainImpl();
283-
c.setChainID(chain.getChainID());
284-
newS.addChain(c,modelNr);
285277
}
286278
}
279+
// Create new chain
280+
if ( c == null) {
281+
// first chain...
282+
c = new ChainImpl();
283+
c.setChainID(chain.getChainID());
284+
newS.addChain(c,modelNr);
285+
c.setSeqResGroups(chain.getSeqResGroups());
286+
c.setSeqMisMatches(chain.getSeqMisMatches());
287+
}
287288

288289
// add the groups to the chain:
289290
for ( Group g: groups) {

biojava-structure/src/test/java/org/biojava/nbio/structure/align/util/AtomCacheTest.java

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,71 @@ public void testFetchBehavior() throws IOException, ParseException {
245245

246246
}
247247

248+
@Test
249+
public void testSeqRes() throws StructureException, IOException {
250+
String name;
251+
StructureIdentifier id;
252+
Structure full, reduced;
253+
Chain chain;
254+
List<Group> seqres;
255+
256+
// normal structure
257+
name = "1hh0";
258+
id = new SubstructureIdentifier(name);
259+
260+
full = id.loadStructure(cache);
261+
assertEquals("Wrong number of models in full "+name,1,full.nrModels());
262+
assertEquals("Wrong number of chains in full "+name,1,full.getChains().size());
263+
chain = full.getChain(0);
264+
seqres = chain.getSeqResGroups();
265+
assertEquals("Wrong seqres length in full "+name,46,seqres.size());
266+
267+
reduced = id.reduce(full);
268+
assertEquals("Wrong number of models in reduced "+name,1,reduced.nrModels());
269+
assertEquals("Wrong number of chains in reduced "+name,1,reduced.getChains().size());
270+
chain = reduced.getChain(0);
271+
seqres = chain.getSeqResGroups();
272+
assertEquals("Wrong seqres length in reduced "+name,46,seqres.size());
273+
274+
// single chain
275+
name = "1hh0.A";
276+
id = new SubstructureIdentifier(name);
277+
278+
full = id.loadStructure(cache);
279+
assertEquals("Wrong number of models in full "+name,1,full.nrModels());
280+
assertEquals("Wrong number of chains in full "+name,1,full.getChains().size());
281+
chain = full.getChain(0);
282+
seqres = chain.getSeqResGroups();
283+
assertEquals("Wrong seqres length in full "+name,46,seqres.size());
284+
285+
reduced = id.reduce(full);
286+
assertEquals("Wrong number of models in reduced "+name,1,reduced.nrModels());
287+
assertEquals("Wrong number of chains in reduced "+name,1,reduced.getChains().size());
288+
chain = reduced.getChain(0);
289+
seqres = chain.getSeqResGroups();
290+
assertEquals("Wrong seqres length in reduced "+name,46,seqres.size());
291+
292+
// subrange
293+
name = "1hh0.A:10-20";
294+
id = new SubstructureIdentifier(name);
295+
296+
full = id.loadStructure(cache);
297+
assertEquals("Wrong number of models in full "+name,1,full.nrModels());
298+
assertEquals("Wrong number of chains in full "+name,1,full.getChains().size());
299+
chain = full.getChain(0);
300+
seqres = chain.getSeqResGroups();
301+
assertEquals("Wrong seqres length in full "+name,46,seqres.size());
302+
assertEquals("Wrong SeqNum at first group in full",1,(int)chain.getAtomGroup(0).getResidueNumber().getSeqNum());
303+
304+
reduced = id.reduce(full);
305+
assertEquals("Wrong number of models in reduced "+name,1,reduced.nrModels());
306+
assertEquals("Wrong number of chains in reduced "+name,1,reduced.getChains().size());
307+
chain = reduced.getChain(0);
308+
seqres = chain.getSeqResGroups();
309+
assertEquals("Wrong seqres length in reduced "+name,46,seqres.size());
310+
311+
assertEquals("Wrong SeqNum at first group in reduced",10,(int)chain.getAtomGroup(0).getResidueNumber().getSeqNum());
312+
313+
}
314+
248315
}

0 commit comments

Comments
 (0)