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

org.biojava.nbio.structure.io.mmcif.SimpleMMcifParser Maven / Gradle / Ivy

There is a newer version: 7.2.2
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/
 *
 * created at Mar 4, 2008
 */
package org.biojava.nbio.structure.io.mmcif;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.vecmath.Matrix4d;

import org.biojava.nbio.structure.Structure;
import org.biojava.nbio.structure.io.MMCIFFileReader;
import org.biojava.nbio.structure.io.StructureIOFile;
import org.biojava.nbio.structure.io.mmcif.model.AtomSite;
import org.biojava.nbio.structure.io.mmcif.model.AuditAuthor;
import org.biojava.nbio.structure.io.mmcif.model.Cell;
import org.biojava.nbio.structure.io.mmcif.model.ChemComp;
import org.biojava.nbio.structure.io.mmcif.model.ChemCompAtom;
import org.biojava.nbio.structure.io.mmcif.model.ChemCompBond;
import org.biojava.nbio.structure.io.mmcif.model.ChemCompDescriptor;
import org.biojava.nbio.structure.io.mmcif.model.DatabasePDBremark;
import org.biojava.nbio.structure.io.mmcif.model.DatabasePDBrev;
import org.biojava.nbio.structure.io.mmcif.model.DatabasePdbrevRecord;
import org.biojava.nbio.structure.io.mmcif.model.Entity;
import org.biojava.nbio.structure.io.mmcif.model.EntityPolySeq;
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcGen;
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcNat;
import org.biojava.nbio.structure.io.mmcif.model.EntitySrcSyn;
import org.biojava.nbio.structure.io.mmcif.model.Exptl;
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompDescriptor;
import org.biojava.nbio.structure.io.mmcif.model.PdbxChemCompIdentifier;
import org.biojava.nbio.structure.io.mmcif.model.PdbxEntityNonPoly;
import org.biojava.nbio.structure.io.mmcif.model.PdbxNonPolyScheme;
import org.biojava.nbio.structure.io.mmcif.model.PdbxPolySeqScheme;
import org.biojava.nbio.structure.io.mmcif.model.PdbxStructAssembly;
import org.biojava.nbio.structure.io.mmcif.model.PdbxStructAssemblyGen;
import org.biojava.nbio.structure.io.mmcif.model.PdbxStructOperList;
import org.biojava.nbio.structure.io.mmcif.model.Refine;
import org.biojava.nbio.structure.io.mmcif.model.Struct;
import org.biojava.nbio.structure.io.mmcif.model.StructAsym;
import org.biojava.nbio.structure.io.mmcif.model.StructConn;
import org.biojava.nbio.structure.io.mmcif.model.StructKeywords;
import org.biojava.nbio.structure.io.mmcif.model.StructNcsOper;
import org.biojava.nbio.structure.io.mmcif.model.StructRef;
import org.biojava.nbio.structure.io.mmcif.model.StructRefSeq;
import org.biojava.nbio.structure.io.mmcif.model.StructRefSeqDif;
import org.biojava.nbio.structure.io.mmcif.model.StructSite;
import org.biojava.nbio.structure.io.mmcif.model.StructSiteGen;
import org.biojava.nbio.structure.io.mmcif.model.Symmetry;
import org.biojava.nbio.structure.jama.Matrix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A simple mmCif file parser
 *
 *
 * Usage:
 * 
String file = "path/to/mmcif/file";
StructureIOFile pdbreader = new MMCIFFileReader();

Structure s = pdbreader.getStructure(file);
System.out.println(s);

// you can convert it to a PDB file...
System.out.println(s.toPDB());

 * 
* For more documentation see http://biojava.org/wiki/BioJava:CookBook#Protein_Structure. * * @author Andreas Prlic * @author Jose Duarte * @since 1.7 */ public class SimpleMMcifParser implements MMcifParser { /** * The header appearing at the beginning of a mmCIF file. * A "block code" can be added to it of no more than 32 chars. * See http://www.iucr.org/__data/assets/pdf_file/0019/22618/cifguide.pdf */ public static final String MMCIF_TOP_HEADER = "data_"; public static final String COMMENT_CHAR = "#"; public static final String LOOP_START = "loop_"; public static final String FIELD_LINE = "_"; // the following are the 3 valid quoting characters in CIF /** * Quoting character ' */ private static final char S1 = '\''; /** * Quoting character " */ private static final char S2 = '\"'; /** * Quoting character ; (multi-line quoting) */ public static final String STRING_LIMIT = ";"; private List consumers ; private Struct struct ; private static final Logger logger = LoggerFactory.getLogger(SimpleMMcifParser.class); public SimpleMMcifParser(){ consumers = new ArrayList(); struct = null; } @Override public void addMMcifConsumer(MMcifConsumer consumer) { consumers.add(consumer); } @Override public void clearConsumers() { consumers.clear(); } @Override public void removeMMcifConsumer(MMcifConsumer consumer) { consumers.remove(consumer); } public static void main(String[] args){ String file = "/Users/andreas/WORK/PDB/mmCif/a9/1a9n.cif.gz"; //String file = "/Users/andreas/WORK/PDB/MMCIF/1gav.mmcif"; //String file = "/Users/andreas/WORK/PDB/MMCIF/100d.cif"; //String file = "/Users/andreas/WORK/PDB/MMCIF/1a4a.mmcif"; System.out.println("parsing " + file); StructureIOFile pdbreader = new MMCIFFileReader(); try { Structure s = pdbreader.getStructure(file); System.out.println(s); // convert it to a PDB file... System.out.println(s.toPDB()); } catch (IOException e) { e.printStackTrace(); } } @Override public void parse(InputStream inStream) throws IOException { parse(new BufferedReader(new InputStreamReader(inStream))); } @Override public void parse(BufferedReader buf) throws IOException { triggerDocumentStart(); // init container objects... struct = new Struct(); String line = null; boolean inLoop = false; boolean inLoopData = false; List loopFields = new ArrayList(); List lineData = new ArrayList(); Set loopWarnings = new HashSet(); // used only to reduce logging statements String category = null; // the first line is a data_PDBCODE line, test if this looks like a mmcif file line = buf.readLine(); if (line == null || !line.startsWith(MMCIF_TOP_HEADER)){ logger.error("This does not look like a valid mmCIF file! The first line should start with 'data_', but is: '" + line+"'"); triggerDocumentEnd(); return; } while ( (line = buf.readLine ()) != null ){ if (line.isEmpty() || line.startsWith(COMMENT_CHAR)) continue; logger.debug(inLoop + " " + line); if (line.startsWith(MMCIF_TOP_HEADER)){ // either first line in file, or beginning of new section if ( inLoop) { //System.out.println("new data and in loop: " + line); inLoop = false; inLoopData = false; lineData.clear(); loopFields.clear(); } } if ( inLoop) { if ( line.startsWith(LOOP_START)){ loopFields.clear(); inLoop = true; inLoopData = false; continue; } if ( line.matches("\\s*"+FIELD_LINE+"\\w+.*")) { if (inLoopData && line.startsWith(FIELD_LINE)) { logger.debug("Found a field line after reading loop data. Toggling to inLoop=false"); inLoop = false; inLoopData = false; loopFields.clear(); // a boring normal line List data = processLine(line, buf, 2); if ( data.size() < 1){ // this can happen if empty lines at end of file lineData.clear(); continue; } String key = data.get(0); int pos = key.indexOf("."); if ( pos < 0 ) { // looks like a chem_comp file // line should start with data, otherwise something is wrong! if (! line.startsWith(MMCIF_TOP_HEADER)){ logger.warn("This does not look like a valid mmCIF file! The first line should start with 'data_', but is '" + line+"'"); triggerDocumentEnd(); return; } // ignore the first line... category=null; lineData.clear(); continue; } category = key.substring(0,pos); String value = data.get(1); loopFields.add(key.substring(pos+1,key.length())); lineData.add(value); logger.debug("Found data for category {}: {}", key, value); continue; } // found another field. String txt = line.trim(); if ( txt.indexOf('.') > -1){ String[] spl = txt.split("\\."); category = spl[0]; String attribute = spl[1]; loopFields.add(attribute); logger.debug("Found category: {}, attribute: {}",category, attribute); if ( spl.length > 2){ logger.warn("Found nested attribute in {}, not supported yet!",txt); } } else { category = txt; logger.debug("Found category without attribute: {}",category); } } else { // in loop and we found a data line lineData = processLine(line, buf, loopFields.size()); logger.debug("Found a loop data line with {} data fields", lineData.size()); logger.debug("Data fields: {}", lineData.toString()); if ( lineData.size() != loopFields.size()){ logger.warn("Expected {} data fields, but found {} in line: {}",loopFields.size(),lineData.size(),line); } endLineChecks(category, loopFields, lineData, loopWarnings); lineData.clear(); inLoopData = true; } } else { // not in loop if ( line.startsWith(LOOP_START)){ if ( category != null) endLineChecks(category, loopFields, lineData, loopWarnings); resetBuffers(loopFields, lineData, loopWarnings); category = null; inLoop = true; inLoopData = false; logger.debug("Detected LOOP_START: '{}'. Toggling to inLoop=true", LOOP_START); continue; } else { logger.debug("Normal line "); inLoop = false; // a boring normal line List data = processLine(line, buf, 2); if ( data.size() < 1){ // this can happen if empty lines at end of file lineData.clear(); continue; } String key = data.get(0); int pos = key.indexOf("."); if ( pos < 0 ) { // looks like a chem_comp file // line should start with data, otherwise something is wrong! if (! line.startsWith(MMCIF_TOP_HEADER)){ logger.warn("This does not look like a valid mmCIF file! The first line should start with 'data_', but is '" + line+"'"); triggerDocumentEnd(); return; } // ignore the first line... category=null; lineData.clear(); continue; } if (category!=null && !key.substring(0,pos).equals(category)) { // we've changed category: need to flush the previous one endLineChecks(category, loopFields, lineData, loopWarnings); resetBuffers(loopFields, lineData, loopWarnings); } category = key.substring(0,pos); String value = data.get(1); loopFields.add(key.substring(pos+1,key.length())); lineData.add(value); logger.debug("Found data for category {}: {}", key, value); } } } if (category!=null && lineData.size()>0 && lineData.size()==loopFields.size()) { // the last category in the file will still be missing, we add it now endLineChecks(category, loopFields, lineData, loopWarnings); resetBuffers(loopFields, lineData, loopWarnings); } if (struct != null){ triggerStructData(struct); } triggerDocumentEnd(); } private void resetBuffers(List loopFields, List lineData, Set loopWarnings) { loopFields.clear(); lineData.clear(); loopWarnings.clear(); } private List processSingleLine(String line){ List data = new ArrayList(); if ( line.trim().length() == 0){ return data; } if ( line.trim().length() == 1){ if ( line.startsWith(STRING_LIMIT)) return data; } boolean inString = false; // semicolon (;) quoting boolean inS1 = false; // single quote (') quoting boolean inS2 = false; // double quote (") quoting String word = ""; for (int i=0; i< line.length(); i++ ){ Character c = line.charAt(i); Character nextC = null; if (i < line.length() - 1) nextC = line.charAt(i+1); Character prevC = null; if (i>0) prevC = line.charAt(i-1); if (c == ' ') { if ( ! inString){ if ( ! word.equals("")) data.add(word.trim()); word = ""; } else { // we are in a string, add the space word += c; } } else if (c == S1 ) { if ( inString){ boolean wordEnd = false; if (! inS2) { if (nextC==null || Character.isWhitespace(nextC)){ i++; wordEnd = true; } } if ( wordEnd ) { // at end of string if ( ! word.equals("")) data.add(word.trim()); word = ""; inString = false; inS1 = false; } else { word += c; } } else if (prevC==null || prevC==' ') { // the beginning of a new string inString = true; inS1 = true; } else { word += c; } } else if ( c == S2 ){ if ( inString){ boolean wordEnd = false; if (! inS1) { if (nextC==null || Character.isWhitespace(nextC)){ i++; wordEnd = true; } } if ( wordEnd ) { // at end of string if ( ! word.equals("")) data.add(word.trim()); word = ""; inString = false; inS2 = false; } else { word += c; } } else if (prevC==null || prevC==' ') { // the beginning of a new string inString = true; inS2 = true; } else { word += c; } } else { word += c; } } if ( ! word.trim().equals("")) data.add(word); return data; } /** * Get the content of a cif entry * * @param line * @param buf * @return */ private List processLine(String line, BufferedReader buf, int fieldLength) throws IOException{ //System.out.println("XX processLine " + fieldLength + " " + line); // go through the line and process each character List lineData = new ArrayList(); boolean inString = false; StringBuilder bigWord = null; while ( true ){ if ( line.startsWith(STRING_LIMIT)){ if (! inString){ inString = true; if ( line.length() > 1) bigWord = new StringBuilder(line.substring(1)); else bigWord = new StringBuilder(""); } else { // the end of a word lineData.add(bigWord.toString()); bigWord = null; inString = false; } } else { if ( inString ) bigWord.append(line); else { List dat = processSingleLine(line); for (String d : dat){ lineData.add(d); } } } //System.out.println("in process line : " + lineData.size() + " " + fieldLength); if ( lineData.size() > fieldLength){ logger.warn("wrong data length ("+lineData.size()+ ") should be ("+fieldLength+") at line " + line + " got lineData: " + lineData); return lineData; } if ( lineData.size() == fieldLength) return lineData; line = buf.readLine(); if ( line == null) break; } return lineData; } private void endLineChecks(String category,List loopFields, List lineData, Set loopWarnings ) throws IOException{ logger.debug("Processing category {}, with fields: {}",category,loopFields.toString()); // System.out.println("parsed the following data: " +category + " fields: "+ // loopFields + " DATA: " + // lineData); if ( loopFields.size() != lineData.size()){ logger.warn("looks like we got a problem with nested string quote characters:"); throw new IOException("data length ("+ lineData.size() + ") != fields length ("+loopFields.size()+ ") category: " +category + " fields: "+ loopFields + " DATA: " + lineData ); } if ( category.equals("_entity")){ Entity e = (Entity) buildObject( Entity.class.getName(), loopFields,lineData, loopWarnings); triggerNewEntity(e); } else if ( category.equals("_struct")){ struct = (Struct) buildObject( Struct.class.getName(), loopFields, lineData, loopWarnings); } else if ( category.equals("_atom_site")){ AtomSite a = (AtomSite) buildObject( AtomSite.class.getName(), loopFields, lineData, loopWarnings); triggerNewAtomSite(a); } else if ( category.equals("_database_PDB_rev")){ DatabasePDBrev dbrev = (DatabasePDBrev) buildObject( DatabasePDBrev.class.getName(), loopFields, lineData, loopWarnings); triggerNewDatabasePDBrev(dbrev); } else if ( category.equals("_database_PDB_rev_record")){ DatabasePdbrevRecord dbrev = (DatabasePdbrevRecord) buildObject( DatabasePdbrevRecord.class.getName(), loopFields, lineData, loopWarnings); triggerNewDatabasePDBrevRecord(dbrev); }else if ( category.equals("_database_PDB_remark")){ DatabasePDBremark remark = (DatabasePDBremark) buildObject( DatabasePDBremark.class.getName(), loopFields, lineData, loopWarnings); triggerNewDatabasePDBremark(remark); } else if ( category.equals("_exptl")){ Exptl exptl = (Exptl) buildObject( Exptl.class.getName(), loopFields,lineData, loopWarnings); triggerExptl(exptl); } else if ( category.equals("_cell")){ Cell cell = (Cell) buildObject( Cell.class.getName(), loopFields,lineData, loopWarnings); triggerNewCell(cell); } else if ( category.equals("_symmetry")){ Symmetry symmetry = (Symmetry) buildObject( Symmetry.class.getName(), loopFields,lineData, loopWarnings); triggerNewSymmetry(symmetry); } else if ( category.equals("_struct_ncs_oper")) { // this guy is special because of the [] in the field names StructNcsOper sNcsOper = getStructNcsOper(loopFields,lineData); triggerNewStructNcsOper(sNcsOper); } else if ( category.equals("_struct_ref")){ StructRef sref = (StructRef) buildObject( StructRef.class.getName(), loopFields,lineData, loopWarnings); triggerNewStrucRef(sref); } else if ( category.equals("_struct_ref_seq")){ StructRefSeq sref = (StructRefSeq) buildObject( StructRefSeq.class.getName(), loopFields,lineData, loopWarnings); triggerNewStrucRefSeq(sref); } else if ( category.equals("_struct_ref_seq_dif")) { StructRefSeqDif sref = (StructRefSeqDif) buildObject( StructRefSeqDif.class.getName(), loopFields, lineData, loopWarnings); triggerNewStrucRefSeqDif(sref); } else if ( category.equals("_struct_site_gen")) { StructSiteGen sref = (StructSiteGen) buildObject( StructSiteGen.class.getName(), loopFields, lineData, loopWarnings); triggerNewStructSiteGen(sref); } else if ( category.equals("_struct_site")) { StructSite sref = (StructSite) buildObject( StructSite.class.getName(), loopFields, lineData, loopWarnings); triggerNewStructSite(sref); } else if ( category.equals("_entity_poly_seq")){ EntityPolySeq exptl = (EntityPolySeq) buildObject( EntityPolySeq.class.getName(), loopFields,lineData, loopWarnings); triggerNewEntityPolySeq(exptl); } else if ( category.equals("_entity_src_gen")){ EntitySrcGen entitySrcGen = (EntitySrcGen) buildObject( EntitySrcGen.class.getName(), loopFields,lineData, loopWarnings); triggerNewEntitySrcGen(entitySrcGen); } else if ( category.equals("_entity_src_nat")){ EntitySrcNat entitySrcNat = (EntitySrcNat) buildObject( EntitySrcNat.class.getName(), loopFields,lineData, loopWarnings); triggerNewEntitySrcNat(entitySrcNat); } else if ( category.equals("_pdbx_entity_src_syn")){ EntitySrcSyn entitySrcSyn = (EntitySrcSyn) buildObject( EntitySrcSyn.class.getName(), loopFields,lineData, loopWarnings); triggerNewEntitySrcSyn(entitySrcSyn); } else if ( category.equals("_struct_asym")){ StructAsym sasym = (StructAsym) buildObject( StructAsym.class.getName(), loopFields,lineData, loopWarnings); triggerNewStructAsym(sasym); } else if ( category.equals("_pdbx_poly_seq_scheme")){ PdbxPolySeqScheme ppss = (PdbxPolySeqScheme) buildObject( PdbxPolySeqScheme.class.getName(), loopFields,lineData, loopWarnings); triggerNewPdbxPolySeqScheme(ppss); } else if ( category.equals("_pdbx_nonpoly_scheme")){ PdbxNonPolyScheme ppss = (PdbxNonPolyScheme) buildObject( PdbxNonPolyScheme.class.getName(), loopFields,lineData, loopWarnings); triggerNewPdbxNonPolyScheme(ppss); } else if ( category.equals("_pdbx_entity_nonpoly")){ PdbxEntityNonPoly pen = (PdbxEntityNonPoly) buildObject( PdbxEntityNonPoly.class.getName(), loopFields,lineData, loopWarnings ); triggerNewPdbxEntityNonPoly(pen); } else if ( category.equals("_struct_keywords")){ StructKeywords kw = (StructKeywords)buildObject( StructKeywords.class.getName(), loopFields,lineData, loopWarnings ); triggerNewStructKeywords(kw); } else if (category.equals("_refine")){ Refine r = (Refine)buildObject( Refine.class.getName(), loopFields,lineData, loopWarnings ); triggerNewRefine(r); } else if (category.equals("_chem_comp")){ ChemComp c = (ChemComp)buildObject( ChemComp.class.getName(), loopFields, lineData, loopWarnings ); triggerNewChemComp(c); } else if (category.equals("_audit_author")) { AuditAuthor aa = (AuditAuthor)buildObject( AuditAuthor.class.getName(), loopFields, lineData, loopWarnings); triggerNewAuditAuthor(aa); } else if (category.equals("_pdbx_chem_comp_descriptor")) { ChemCompDescriptor ccd = (ChemCompDescriptor) buildObject( ChemCompDescriptor.class.getName(), loopFields, lineData, loopWarnings); triggerNewChemCompDescriptor(ccd); } else if (category.equals("_pdbx_struct_oper_list")) { // this guy is special since we convert to Matrices and shift vectors... // and because it contains [] in field names PdbxStructOperList structOper = getPdbxStructOperList(loopFields,lineData); triggerNewPdbxStructOper(structOper); } else if (category.equals("_pdbx_struct_assembly")) { PdbxStructAssembly sa = (PdbxStructAssembly) buildObject( PdbxStructAssembly.class.getName(), loopFields, lineData, loopWarnings); triggerNewPdbxStructAssembly(sa); } else if (category.equals("_pdbx_struct_assembly_gen")) { PdbxStructAssemblyGen sa = (PdbxStructAssemblyGen) buildObject( PdbxStructAssemblyGen.class.getName(), loopFields, lineData, loopWarnings); triggerNewPdbxStructAssemblyGen(sa); } else if ( category.equals("_chem_comp_atom")){ ChemCompAtom atom = (ChemCompAtom)buildObject( ChemCompAtom.class.getName(), loopFields,lineData, loopWarnings); triggerNewChemCompAtom(atom); }else if ( category.equals("_chem_comp_bond")){ ChemCompBond bond = (ChemCompBond)buildObject( ChemCompBond.class.getName(), loopFields,lineData, loopWarnings); triggerNewChemCompBond(bond); } else if ( category.equals("_pdbx_chem_comp_identifier")){ PdbxChemCompIdentifier id = (PdbxChemCompIdentifier)buildObject( PdbxChemCompIdentifier.class.getName(), loopFields,lineData, loopWarnings); triggerNewPdbxChemCompIdentifier(id); } else if ( category.equals("_pdbx_chem_comp_descriptor")){ PdbxChemCompDescriptor id = (PdbxChemCompDescriptor)buildObject( PdbxChemCompDescriptor.class.getName(), loopFields,lineData, loopWarnings); triggerNewPdbxChemCompDescriptor(id); } else if ( category.equals("_struct_conn")){ StructConn id = (StructConn)buildObject( StructConn.class.getName(), loopFields,lineData, loopWarnings); triggerNewStructConn(id); } else { logger.debug("Using a generic bean for category {}",category); // trigger a generic bean that can deal with all missing data types... triggerGeneric(category,loopFields,lineData); } } private PdbxStructOperList getPdbxStructOperList(List loopFields, List lineData) { PdbxStructOperList so = new PdbxStructOperList(); //System.out.println(loopFields); //System.out.println(lineData); String id = lineData.get(loopFields.indexOf("id")); so.setId(id); so.setType(lineData.get(loopFields.indexOf("type"))); Matrix matrix = new Matrix(3,3); for (int i = 1 ; i <=3 ; i++){ for (int j =1 ; j <= 3 ; j++){ String max = String.format("matrix[%d][%d]",j,i); String val = lineData.get(loopFields.indexOf(max)); Double d = Double.parseDouble(val); matrix.set(j-1,i-1,d); // matrix.set(i-1,j-1,d); } } double[] coords =new double[3]; for ( int i = 1; i <=3 ; i++){ String v = String.format("vector[%d]",i); String val = lineData.get(loopFields.indexOf(v)); Double d = Double.parseDouble(val); coords[i-1] = d; } so.setMatrix(matrix); so.setVector(coords); return so; } public void triggerNewPdbxStructOper(PdbxStructOperList structOper) { for(MMcifConsumer c : consumers){ c.newPdbxStructOperList(structOper); } } private StructNcsOper getStructNcsOper(List loopFields, List lineData) { StructNcsOper sNcsOper = new StructNcsOper(); int id = Integer.parseInt(lineData.get(loopFields.indexOf("id"))); sNcsOper.setId(id); sNcsOper.setCode(lineData.get(loopFields.indexOf("code"))); int detailsPos = loopFields.indexOf("details"); if ( detailsPos > -1) sNcsOper.setDetails(lineData.get(detailsPos)); Matrix4d op = new Matrix4d(); op.setElement(3, 0, 0.0); op.setElement(3, 1, 0.0); op.setElement(3, 2, 0.0); op.setElement(3, 3, 1.0); for (int i = 1 ; i <=3 ; i++){ for (int j =1 ; j <= 3 ; j++){ String max = String.format("matrix[%d][%d]",i,j); String val = lineData.get(loopFields.indexOf(max)); Double d = Double.parseDouble(val); op.setElement(i-1,j-1,d); } } for ( int i = 1; i <=3 ; i++){ String v = String.format("vector[%d]",i); String val = lineData.get(loopFields.indexOf(v)); Double d = Double.parseDouble(val); op.setElement(i-1, 3, d); } sNcsOper.setOperator(op); return sNcsOper; } public void triggerNewStructNcsOper(StructNcsOper sNcsOper) { for(MMcifConsumer c : consumers){ c.newStructNcsOper(sNcsOper); } } private Object buildObject(String className, List loopFields, List lineData, Set warnings) { Object o = null; Class c = null; try { // build up the Entity object from the line data... c = Class.forName(className); o = c.newInstance(); } catch (InstantiationException e){ logger.error( "Error while constructing {}: {}", className, e.getMessage()); return null; } catch (ClassNotFoundException e){ logger.error( "Error while constructing {}: {}", className, e.getMessage()); return null; } catch (IllegalAccessException e) { logger.error( "Error while constructing {}: {}", className, e.getMessage()); return null; } Method[] methods = c.getMethods(); Map methodMap = new HashMap(); for (Method m : methods) { methodMap.put(m.getName(),m); } int pos = -1 ; for (String key: loopFields){ pos++; String val = lineData.get(pos); // a necessary fix in order to be able to handle keys that contain hyphens (e.g. _symmetry.space_group_name_H-M) // java can't use hyphens in variable names thus the corresponding bean can't use the hyphen and we replace it by underscore if (key.contains("-")) key = key.replace('-', '_'); // building up the setter method name: need to upper case the first letter, leave the rest untouched String methodName = "set" + key.substring(0,1).toUpperCase() + key.substring(1, key.length()); Method m = methodMap.get(methodName); if ( m == null) { // no method found in model class with the name found in file if (!key.contains("[")) { // the fields with square brackets are handled elsewhere, see for instance getStructNcsOper String warning = "Trying to set field " + key + " in "+ c.getName() +" found in file, but no corresponding field could be found in model class (value:" + val + ")"; String warnkey = key+"-"+c.getName(); // Suppress duplicate warnings or attempts to store empty data if( val.equals("?") || val.equals(".") || ( warnings != null && warnings.contains(warnkey)) ) { logger.debug(warning); } else { logger.warn(warning); } if(warnings != null) { warnings.add(warnkey); } } continue; } // now we populate the object with the values by invoking the corresponding setter method, // note that all of the mmCif container classes have only one argument (they are beans) Class[] pType = m.getParameterTypes(); try { if ( pType[0].getName().equals(Integer.class.getName())) { if ( val != null && ! val.equals("?") && !val.equals(".")) { Integer intVal = Integer.parseInt(val); m.invoke(o, intVal); } } else { // default val is a String m.invoke(o, val); } } catch (IllegalAccessException e) { logger.error("Could not invoke setter {} with value {} for class {}", methodName, val, className); } catch (InvocationTargetException e) { logger.error("Could not invoke setter {} with value {} for class {}", methodName, val, className); } } return o; } public void triggerGeneric(String category, List loopFields, List lineData){ for(MMcifConsumer c : consumers){ c.newGenericData(category, loopFields, lineData); } } public void triggerNewEntity(Entity entity){ for(MMcifConsumer c : consumers){ c.newEntity(entity); } } public void triggerNewEntityPolySeq(EntityPolySeq epolseq){ for(MMcifConsumer c : consumers){ c.newEntityPolySeq(epolseq); } } public void triggerNewEntitySrcGen(EntitySrcGen entitySrcGen){ for(MMcifConsumer c : consumers){ c.newEntitySrcGen(entitySrcGen); } } public void triggerNewEntitySrcNat(EntitySrcNat entitySrcNat){ for(MMcifConsumer c : consumers){ c.newEntitySrcNat(entitySrcNat); } } public void triggerNewEntitySrcSyn(EntitySrcSyn entitySrcSyn){ for(MMcifConsumer c : consumers){ c.newEntitySrcSyn(entitySrcSyn); } } public void triggerNewChemComp(ChemComp cc){ for(MMcifConsumer c : consumers){ c.newChemComp(cc); } } public void triggerNewStructAsym(StructAsym sasym){ for(MMcifConsumer c : consumers){ c.newStructAsym(sasym); } } private void triggerStructData(Struct struct){ for(MMcifConsumer c : consumers){ c.setStruct(struct); } } private void triggerNewAtomSite(AtomSite atom){ for(MMcifConsumer c : consumers){ c.newAtomSite(atom); } } private void triggerNewAuditAuthor(AuditAuthor aa){ for(MMcifConsumer c : consumers){ c.newAuditAuthor(aa); } } private void triggerNewDatabasePDBrev(DatabasePDBrev dbrev){ for(MMcifConsumer c : consumers){ c.newDatabasePDBrev(dbrev); } } private void triggerNewDatabasePDBrevRecord(DatabasePdbrevRecord dbrev){ for(MMcifConsumer c : consumers){ c.newDatabasePDBrevRecord(dbrev); } } private void triggerNewDatabasePDBremark(DatabasePDBremark remark){ for(MMcifConsumer c : consumers){ c.newDatabasePDBremark(remark); } } private void triggerExptl(Exptl exptl){ for(MMcifConsumer c : consumers){ c.newExptl(exptl); } } private void triggerNewCell(Cell cell) { for(MMcifConsumer c : consumers){ c.newCell(cell); } } private void triggerNewSymmetry(Symmetry symmetry) { for(MMcifConsumer c : consumers){ c.newSymmetry(symmetry); } } private void triggerNewStrucRef(StructRef sref){ for(MMcifConsumer c : consumers){ c.newStructRef(sref); } } private void triggerNewStrucRefSeq(StructRefSeq sref){ for(MMcifConsumer c : consumers){ c.newStructRefSeq(sref); } } private void triggerNewStrucRefSeqDif(StructRefSeqDif sref){ for(MMcifConsumer c : consumers){ c.newStructRefSeqDif(sref); } } private void triggerNewPdbxPolySeqScheme(PdbxPolySeqScheme ppss){ for(MMcifConsumer c : consumers){ c.newPdbxPolySeqScheme(ppss); } } private void triggerNewPdbxNonPolyScheme(PdbxNonPolyScheme ppss){ for(MMcifConsumer c : consumers){ c.newPdbxNonPolyScheme(ppss); } } public void triggerNewPdbxEntityNonPoly(PdbxEntityNonPoly pen){ for (MMcifConsumer c: consumers){ c.newPdbxEntityNonPoly(pen); } } public void triggerNewStructKeywords(StructKeywords kw){ for (MMcifConsumer c: consumers){ c.newStructKeywords(kw); } } public void triggerNewRefine(Refine r){ for (MMcifConsumer c: consumers){ c.newRefine(r); } } public void triggerDocumentStart(){ for(MMcifConsumer c : consumers){ c.documentStart(); } } public void triggerDocumentEnd(){ for(MMcifConsumer c : consumers){ c.documentEnd(); } } public void triggerNewChemCompDescriptor(ChemCompDescriptor ccd) { for(MMcifConsumer c : consumers){ c.newChemCompDescriptor(ccd); } } private void triggerNewPdbxStructAssembly(PdbxStructAssembly sa) { for(MMcifConsumer c : consumers){ c.newPdbxStrucAssembly(sa); } } private void triggerNewPdbxStructAssemblyGen(PdbxStructAssemblyGen sa) { for(MMcifConsumer c : consumers){ c.newPdbxStrucAssemblyGen(sa); } } private void triggerNewChemCompAtom(ChemCompAtom atom) { for(MMcifConsumer c : consumers){ c.newChemCompAtom(atom); } } private void triggerNewChemCompBond(ChemCompBond bond) { for(MMcifConsumer c : consumers){ c.newChemCompBond(bond); } } private void triggerNewPdbxChemCompIdentifier(PdbxChemCompIdentifier id) { for(MMcifConsumer c : consumers){ c.newPdbxChemCompIndentifier(id); } } private void triggerNewPdbxChemCompDescriptor(PdbxChemCompDescriptor id) { for(MMcifConsumer c : consumers){ c.newPdbxChemCompDescriptor(id); } } private void triggerNewStructConn(StructConn id) { for(MMcifConsumer c : consumers){ c.newStructConn(id); } } private void triggerNewStructSiteGen(StructSiteGen id) { for (MMcifConsumer c : consumers) { c.newStructSiteGen(id); } } private void triggerNewStructSite(StructSite id) { for (MMcifConsumer c : consumers) { c.newStructSite(id); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy