Skip to content

Commit 6e1c12d

Browse files
committed
Implemented reading of mmCIF 5.0 changes in the _pdbx_database_status
category and the new dbx_audit_revision_history. The deposition, release, and modification dates are read from these categories if available. This commit resolved biojava#678. Note, code that sets and gets the release date is commented out until the PdbHeader supports release date.
1 parent 8934e94 commit 6e1c12d

File tree

9 files changed

+2463
-2
lines changed

9 files changed

+2463
-2
lines changed

biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/ChemCompConsumer.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,18 @@ public void newStructSite(StructSite site) {
310310
public void newEntityPoly(EntityPoly entityPoly) {
311311

312312

313+
}
314+
315+
@Override
316+
public void newPdbxAuditRevisionHistory(PdbxAuditRevisionHistory history) {
317+
// TODO Auto-generated method stub
318+
319+
}
320+
321+
@Override
322+
public void newPdbxDatabaseStatus(PdbxDatabaseStatus status) {
323+
// TODO Auto-generated method stub
324+
313325
}
314326
}
315327

biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MMcifConsumer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public interface MMcifConsumer {
6868
public void newStructRefSeqDif(StructRefSeqDif sref);
6969
public void newStructSite(StructSite sref);
7070
public void newStructSiteGen(StructSiteGen sref);
71+
public void newPdbxAuditRevisionHistory(PdbxAuditRevisionHistory history);
72+
public void newPdbxDatabaseStatus(PdbxDatabaseStatus status);
7173
public void newPdbxPolySeqScheme(PdbxPolySeqScheme ppss);
7274
public void newPdbxNonPolyScheme(PdbxNonPolyScheme ppss);
7375
public void newPdbxEntityNonPoly(PdbxEntityNonPoly pen);

biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/MetalBondConsumer.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,16 @@ public FileParsingParameters getFileParsingParameters() {
259259
public Map<String,List<MetalBondDistance>> getDefinitions(){
260260
return definitions;
261261
}
262+
263+
@Override
264+
public void newPdbxAuditRevisionHistory(PdbxAuditRevisionHistory history) {
265+
// TODO Auto-generated method stub
266+
267+
}
268+
269+
@Override
270+
public void newPdbxDatabaseStatus(PdbxDatabaseStatus status) {
271+
// TODO Auto-generated method stub
272+
273+
}
262274
}

biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifConsumer.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,10 @@
7979
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcNat;
8080
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcSyn;
8181
import org.biojava.nbio.structure.io.mmcif.model.Exptl;
82+
import org.biojava.nbio.structure.io.mmcif.model.PdbxAuditRevisionHistory;
8283
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompDescriptor;
8384
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompIdentifier;
85+
import org.biojava.nbio.structure.io.mmcif.model.PdbxDatabaseStatus;
8486
import org.biojava.nbio.structure.io.mmcif.model.PdbxEntityNonPoly;
8587
import org.biojava.nbio.structure.io.mmcif.model.PdbxNonPolyScheme;
8688
import org.biojava.nbio.structure.io.mmcif.model.PdbxPolySeqScheme;
@@ -1412,6 +1414,68 @@ public void newDatabasePDBrev(DatabasePDBrev dbrev) {
14121414

14131415
structure.setPDBHeader(header);
14141416
}
1417+
1418+
@Override
1419+
public void newPdbxAuditRevisionHistory(PdbxAuditRevisionHistory history) {
1420+
1421+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
1422+
PDBHeader header = structure.getPDBHeader();
1423+
1424+
if ( header == null) {
1425+
header = new PDBHeader();
1426+
}
1427+
1428+
// first entry in revision history is the release date
1429+
if (history.getOrdinal().equals("1")){
1430+
try {
1431+
Date releaseDate = dateFormat.parse(history.getRevision_date());
1432+
// TODO uncomment when setRelDate method has been implemented
1433+
// header.setRelDate(releaseDate));
1434+
} catch (ParseException e){
1435+
logger.warn("Could not parse date string '{}', release date will be unavailable", history.getRevision_date());
1436+
}
1437+
} else {
1438+
// all other dates are revision dates;
1439+
// since this method may be called multiple times,
1440+
// the last revision date will "stick"
1441+
try {
1442+
Date revisionDate = dateFormat.parse(history.getRevision_date());
1443+
header.setModDate(revisionDate);
1444+
} catch (ParseException e){
1445+
logger.warn("Could not parse date string '{}', revision date will be unavailable", history.getRevision_date());
1446+
}
1447+
}
1448+
1449+
structure.setPDBHeader(header);
1450+
}
1451+
1452+
@Override
1453+
public void newPdbxDatabaseStatus(PdbxDatabaseStatus status) {
1454+
1455+
// the deposition date field is only available in mmCIF 5.0
1456+
1457+
if (status.getRecvd_initial_deposition_date() == null) {
1458+
// skip this method for older mmCIF versions
1459+
return;
1460+
}
1461+
1462+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
1463+
PDBHeader header = structure.getPDBHeader();
1464+
1465+
if (header == null) {
1466+
header = new PDBHeader();
1467+
}
1468+
1469+
// first entry in revision history is the release date
1470+
try {
1471+
Date depositionDate = dateFormat.parse(status.getRecvd_initial_deposition_date());
1472+
header.setDepDate(depositionDate);
1473+
} catch (ParseException e){
1474+
logger.warn("Could not parse date string '{}', deposition date will be unavailable", status.getRecvd_initial_deposition_date());
1475+
}
1476+
1477+
structure.setPDBHeader(header);
1478+
}
14151479

14161480
@Override
14171481
public void newDatabasePDBremark(DatabasePDBremark remark) {

biojava-structure/src/main/java/org/biojava/nbio/structure/io/mmcif/SimpleMMcifParser.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@
5959
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcSyn;
6060
import org.biojava.nbio.structure.io.mmcif.model.Exptl;
6161
import org.biojava.nbio.structure.io.mmcif.model.IgnoreField;
62+
import org.biojava.nbio.structure.io.mmcif.model.PdbxAuditRevisionHistory;
6263
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompDescriptor;
6364
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompIdentifier;
65+
import org.biojava.nbio.structure.io.mmcif.model.PdbxDatabaseStatus;
6466
import org.biojava.nbio.structure.io.mmcif.model.PdbxEntityNonPoly;
6567
import org.biojava.nbio.structure.io.mmcif.model.PdbxNonPolyScheme;
6668
import org.biojava.nbio.structure.io.mmcif.model.PdbxPolySeqScheme;
@@ -641,14 +643,28 @@ private void endLineChecks(String category,List<String> loopFields, List<String>
641643

642644
triggerNewDatabasePDBrev(dbrev);
643645

644-
} else if ( category.equals("_database_PDB_rev_record")){
646+
} else if ( category.equals("_database_PDB_rev_record")) {
645647
DatabasePdbrevRecord dbrev = (DatabasePdbrevRecord) buildObject(
646648
DatabasePdbrevRecord.class.getName(),
647649
loopFields, lineData, loopWarnings);
648650

649651
triggerNewDatabasePDBrevRecord(dbrev);
650652

651-
}else if ( category.equals("_database_PDB_remark")){
653+
} else if ( category.equals("_pdbx_audit_revision_history")) {
654+
PdbxAuditRevisionHistory history = (PdbxAuditRevisionHistory) buildObject(
655+
PdbxAuditRevisionHistory.class.getName(),
656+
loopFields, lineData, loopWarnings);
657+
658+
triggerNewPdbxAuditRevisionHistory(history);
659+
660+
} else if ( category.equals("_pdbx_database_status")) {
661+
PdbxDatabaseStatus status = (PdbxDatabaseStatus) buildObject(
662+
PdbxDatabaseStatus.class.getName(),
663+
loopFields, lineData, loopWarnings);
664+
665+
triggerNewPdbxDatabaseStatus(status);
666+
667+
}else if ( category.equals("_database_PDB_remark")) {
652668
DatabasePDBremark remark = (DatabasePDBremark) buildObject(
653669
DatabasePDBremark.class.getName(),
654670
loopFields, lineData, loopWarnings);
@@ -1102,6 +1118,19 @@ private void triggerNewAuditAuthor(AuditAuthor aa){
11021118
c.newAuditAuthor(aa);
11031119
}
11041120
}
1121+
1122+
private void triggerNewPdbxAuditRevisionHistory(PdbxAuditRevisionHistory history) {
1123+
for(MMcifConsumer c : consumers){
1124+
c.newPdbxAuditRevisionHistory(history);
1125+
}
1126+
}
1127+
1128+
private void triggerNewPdbxDatabaseStatus(PdbxDatabaseStatus status) {
1129+
for(MMcifConsumer c : consumers){
1130+
c.newPdbxDatabaseStatus(status);
1131+
}
1132+
}
1133+
11051134
private void triggerNewDatabasePDBrev(DatabasePDBrev dbrev){
11061135
for(MMcifConsumer c : consumers){
11071136
c.newDatabasePDBrev(dbrev);
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.biojava.nbio.structure.io.mmcif.model;
2+
3+
/**
4+
* Bean to hold data for _pdbx_audit_revision_history mmCIF category.
5+
*
6+
* @author Peter Rose
7+
* @since 5.0
8+
*/
9+
public class PdbxAuditRevisionHistory extends AbstractBean {
10+
private String ordinal;
11+
private String data_content_type;
12+
private String major_revision;
13+
private String minor_revision;
14+
private String revision_date;
15+
16+
public String getOrdinal() {
17+
return ordinal;
18+
}
19+
public void setOrdinal(String ordinal) {
20+
this.ordinal = ordinal;
21+
}
22+
public String getData_content_type() {
23+
return data_content_type;
24+
}
25+
public void setData_content_type(String data_content_type) {
26+
this.data_content_type = data_content_type;
27+
}
28+
public String getMajor_revision() {
29+
return major_revision;
30+
}
31+
public void setMajor_revision(String major_revision) {
32+
this.major_revision = major_revision;
33+
}
34+
public String getMinor_revision() {
35+
return minor_revision;
36+
}
37+
public void setMinor_revision(String minor_revision) {
38+
this.minor_revision = minor_revision;
39+
}
40+
public String getRevision_date() {
41+
return revision_date;
42+
}
43+
public void setRevision_date(String revision_date) {
44+
this.revision_date = revision_date;
45+
}
46+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package org.biojava.nbio.structure.io.mmcif.model;
2+
3+
/**
4+
* Bean to hold data for _pdbx_database_status mmCIF category.
5+
*
6+
* @author Peter Rose
7+
* @since 5.0
8+
*/
9+
public class PdbxDatabaseStatus extends AbstractBean {
10+
private String status_code;
11+
private String entry_id;
12+
private String recvd_initial_deposition_date;
13+
private String deposit_site;
14+
private String process_site;
15+
private String SG_entry;
16+
private String pdb_format_compatible;
17+
private String status_code_mr;
18+
private String status_code_sf;
19+
private String status_code_cs;
20+
21+
public String getStatus_code() {
22+
return status_code;
23+
}
24+
public void setStatus_code(String status_code) {
25+
this.status_code = status_code;
26+
}
27+
public String getEntry_id() {
28+
return entry_id;
29+
}
30+
public void setEntry_id(String entry_id) {
31+
this.entry_id = entry_id;
32+
}
33+
public String getRecvd_initial_deposition_date() {
34+
return recvd_initial_deposition_date;
35+
}
36+
public void setRecvd_initial_deposition_date(String recvd_initial_deposition_date) {
37+
this.recvd_initial_deposition_date = recvd_initial_deposition_date;
38+
}
39+
public String getDeposit_site() {
40+
return deposit_site;
41+
}
42+
public void setDeposit_site(String deposit_site) {
43+
this.deposit_site = deposit_site;
44+
}
45+
public String getProcess_site() {
46+
return process_site;
47+
}
48+
public void setProcess_site(String process_site) {
49+
this.process_site = process_site;
50+
}
51+
public String getSG_entry() {
52+
return SG_entry;
53+
}
54+
public void setSG_entry(String sG_entry) {
55+
SG_entry = sG_entry;
56+
}
57+
public String getPdb_format_compatible() {
58+
return pdb_format_compatible;
59+
}
60+
public void setPdb_format_compatible(String pdb_format_compatible) {
61+
this.pdb_format_compatible = pdb_format_compatible;
62+
}
63+
public String getStatus_code_mr() {
64+
return status_code_mr;
65+
}
66+
public void setStatus_code_mr(String status_code_mr) {
67+
this.status_code_mr = status_code_mr;
68+
}
69+
public String getStatus_code_sf() {
70+
return status_code_sf;
71+
}
72+
public void setStatus_code_sf(String status_code_sf) {
73+
this.status_code_sf = status_code_sf;
74+
}
75+
public String getStatus_code_cs() {
76+
return status_code_cs;
77+
}
78+
public void setStatus_code_cs(String status_code_cs) {
79+
this.status_code_cs = status_code_cs;
80+
}
81+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.biojava.nbio.structure.io.mmcif;
2+
3+
import static org.junit.Assert.*;
4+
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
import java.text.ParseException;
8+
import java.text.SimpleDateFormat;
9+
import java.util.Date;
10+
import java.util.Locale;
11+
12+
import org.biojava.nbio.structure.Structure;
13+
import org.biojava.nbio.structure.io.FileParsingParameters;
14+
import org.biojava.nbio.structure.io.MMCIFFileReader;
15+
import org.junit.Test;
16+
17+
public class TestMmcifV5Changes {
18+
19+
/**
20+
* Test date related changes in mmCIF 5.0 format
21+
* @throws IOException
22+
* @throws ParseException
23+
*/
24+
25+
@Test
26+
public void testReleaseDate() throws IOException, ParseException {
27+
Structure s = getStructure("/1stp_v50.cif");
28+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
29+
Date releaseDate = dateFormat.parse("1992-10-15");
30+
// TODO uncomment the following line once getRelDate has been implemented
31+
// assertEquals(releaseDate, s.getPDBHeader().getRelDate());
32+
}
33+
34+
@Test
35+
public void testDepositionDate() throws IOException, ParseException {
36+
Structure s = getStructure("/1stp_v50.cif");
37+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
38+
Date depositionDate = dateFormat.parse("1992-03-12");
39+
assertEquals(depositionDate, s.getPDBHeader().getDepDate());
40+
41+
}
42+
43+
@Test
44+
public void testRevisionDate() throws IOException, ParseException {
45+
Structure s = getStructure("/1stp_v50.cif");
46+
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.US);
47+
Date depositionDate = dateFormat.parse("2011-07-13");
48+
assertEquals(depositionDate, s.getPDBHeader().getModDate());
49+
50+
}
51+
52+
private Structure getStructure(String fileName) throws IOException{
53+
InputStream inStream = this.getClass().getResourceAsStream(fileName);
54+
assertNotNull(inStream);
55+
56+
MMCIFFileReader reader = new MMCIFFileReader();
57+
58+
return reader.getStructure(inStream) ;
59+
}
60+
}

0 commit comments

Comments
 (0)