BioJava:CookBook:PDB:hibernate
How to serialize a protein structure to a database
There is an add-on to BioJava that provides Hibernate mappings for the protein structure classes at BioJava Structure Hibernate. It mainly consists of the Hibernate mappings files,with a few Java helper classes.
I am not sure if this code should be joint with the core BioJava SVN, but then BioJava should not directly depend on Hibernate… –Andreas 17:42, 8 October 2007 (EDT)
If you have BioJava Structure Hibernate installed, you can do something like:
See also the example page
```java
import org.biojava.nbio.structure.Chain; import org.biojava.nbio.structure.Compound; import org.biojava.nbio.structure.Group; import org.biojava.nbio.structure.Structure; import org.biojava.nbio.structure.hibernate.HibernateUtil; import org.biojava.nbio.structure.hibernate.StructureFile; import org.biojava.nbio.structure.io.PDBFileReader; import org.hibernate.HibernateException; import org.hibernate.Session; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; import java.util.List;
/** A class that finds all PDB files from the filesystem and stores them in the database.
* A current release of PDB (2007 - September) takes about one night for an upload
* (without the atoms).
*
*
*/
public class DemoWritePDBFiles {
public static void main(String[] args) {
// init log4j
//org.apache.log4j.BasicConfigurator.configure();
if (args.length < 1 ) {
System.err.println("please provide PDB directory as argument");
System.exit(0);
}
// init the installation
File pdbLocation = new File(args[0]);
System.out.println("searching in " + pdbLocation);
// init the demo class
DemoWritePDBFiles demo = new DemoWritePDBFiles();
// now we find all PDB files under the provided directory
List
/** get all PDBfiles from a directory
*
* @param dir the directory where the PDB files are located
* @return all PDB files
*/
public List
List
if ( ! dir.isDirectory()){
throw new IllegalArgumentException("path is not a directory " + dir);
}
// This filter only returns directories
FileFilter fileFilter = new FileFilter() {
public boolean accept(File file) {
return file.isDirectory();
}
};
File[] subfiles = dir.listFiles(fileFilter);
for (File f: subfiles){
List
}
String[] all = dir.list();
for (int i = 0 ; i < all.length;i++ ){
// filenames are like 'pdb1234.ent.gz'
String file = all[i];
if ( (file.endsWith(".pdb.gz")) ||
( file.endsWith(".ent.gz")) ||
(file.endsWith(".pdb")) ||
(file.endsWith(".ent"))
){
allpdbs.add(new File(dir+File.separator + file));
}
}
return allpdbs;
}
/** upload the set of PDB files into the database
*
* @param pdbfiles - list of PDBFiles
* @throws HibernateException
*/
public void storeFiles(List
//long loopStart = System.currentTimeMillis();
PDBFileReader pdbreader = new PDBFileReader();
int i=0;
for (File f: pdbfiles){
i++;
System.out.println(f);
StructureFile struFile = new StructureFile();
struFile.setPath(f.toString());
System.out.println("# "+i + " / " + l + " " + f);
try {
// associate the biojava Structure container class with
// the location of the PDB file in the filesystem
Structure s = pdbreader.getStructure(f);
struFile.setPDBCode(s.getPDBCode());
struFile.setStructure(s);
// now we write it
createAndStoreStructure(struFile);
} catch (Exception e){
e.printStackTrace();
}
}
}
/** does the actual Hibernate serialisation
*
* @param struFile
*/
private void createAndStoreStructure(StructureFile struFile ) {
//System.out.println(s);
Structure s = struFile.getStructure();
// open a new Hibernate session
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
//System.err.println("saving struc");
for (Compound compound : s.getCompounds()){
session.save(compound);
}
// save the toplevel container
session.saveOrUpdate(s);
// save the file path
session.saveOrUpdate(struFile);
for (Chain chain:s.getChains(0)){
session.saveOrUpdate(chain);
for (Group g: chain.getAtomGroups()){
g.setParent(chain);
session.saveOrUpdate(g);
/* at the moment writing Atoms is very slow,
* it needs some more optimization ... :-(
* patches are welcome!
*
* Therefore by default writing the Atoms is disabled.
* if you want to do that, uncomment these lines, as well as the
* lines in HetatomImpl.hbm.xml
*/
//for ( Atom a: g.getAtoms())
// session.saveOrUpdate(a);
}
//System.err.println("saving groups seqres");
for (Group g: chain.getSeqResGroups()){
g.setParent(chain);
session.saveOrUpdate(g);
/* see above
*/
//for ( Atom a: g.getAtoms())
// session.saveOrUpdate(a);
}
}
session.flush();
session.getTransaction().commit();
session.clear();
HibernateUtil.getSessionFactory().close();
}
} ```