#ifndef chimera_PDBio_h #define chimera_PDBio_h #if defined(_MSC_VER) && (_MSC_VER >= 1020) #pragma once #endif #include #include #include #include #include #include #include #include #include #include "pdb/PDB.h" #include "_molecule_config.h" #include "Residue.h" #include "chimtypes.h" namespace molecule { class MOLECULE_IMEX PDBio: public otf::WrapPyObj { public: virtual ~PDBio(); public: inline static Real bondLengthTolerance(); inline static void setBondLengthTolerance(Real t); static bool standardResidue(const std::string &); static bool standardResidue(Symbol type) { return standardResidue(type.str()); } static void addStandardResidue(const std::string &); static void removeStandardResidue(const std::string &); static void setAtomOrderFunc(const std::vector& (*orderFunc)(Symbol)); static std::vector recordOrder; enum What { ATOMS, ATOMQRS, COVALENT_BONDS, HYDROGEN_BONDS, SALT_BRIDGES, HEADERS, ALL_CONECT, SECONDARY_STRUCTURE, ALL_FRAMES, DELIMITER_MODEL, NUM_FLAGS }; std::vector readPDBstream(std::istream &input, const char *filename, int *lineNum, std::ostream *errOut=NULL); std::vector readPDBfile(const char *filename, std::ostream *errOut=NULL); void writePDBstream(const std::vector &mols, std::ostream &os, const char *filename); void writePDBfile(const std::vector &, const char *filename); inline bool ok(); inline std::string error(); inline bool explodeNMR(); inline void setExplodeNMR(bool b); std::vector &whatToDo() { return what; } std::vector &readMask() { return rMask; } std::vector &writeMask() { return wMask; } bool (*readPDB())(PDB *, Molecule *, const std::map *) { return rFunc; } void setReadPDB(bool (*r)(PDB *, Molecule *, const std::map *)) { rFunc = r; } void setPostprocessAtom(void (*)(PDB *, Molecule *, Residue *, Atom *, const std::map *)); private: std::vector what; std::vector rMask, wMask; bool (*rFunc)(PDB *, Molecule *, const std::map *); bool wFunc; private: bool explode; std::string ioErr; static Real tolerance; int outModelNum; static const std::vector& (*orderFunc)(Symbol); bool readOneMolecule(std::istream &, Molecule *, const char *, int *, std::map > &, std::vector *, std::vector *, std::vector *, std::vector *, std::vector *, std::set *, bool *, std::ostream *); static void assignSecondaryStructure(Molecule *m, const std::vector &ss, std::ostream *errOut); void writeCoordSet(std::ostream &, const Molecule *, const CoordSet *, std::map *rev_asn, std::set *written); void writeConect(std::ostream &, const Molecule *, const CoordSet *, std::map *rev_asn, std::set *written); void (*postprocessAtom)(PDB *, Molecule *, Residue *, Atom *, const std::map *); static void addImpliedHBonds(Molecule *, std::vector *, std::vector *, std::ostream *); public: static void connectMolecule(Molecule *, std::vector *, std::vector *, std::set *, std::set *); public: static void addHBond(std::map &atomSerialNums, int from, int to, std::ostream *); static void addHBond(Atom *, Atom *); private: void writeHBondConect(Atom *, std::ostream &, const Molecule *, const CoordSet *, std::map *) const; public: private: void writeMetalComplexConect(Atom *, std::ostream &, const Molecule *, const CoordSet *, std::map *) const; public: virtual PyObject* wpyNew() const; static const std::vector &getRecordOrder(); typedef bool (*preWFtype)(std::ostream &, PDB *, bool *, PDB *, const Molecule *, const CoordSet *, Atom *, const std::map *); typedef void (*postWFtype)(std::ostream &, PDB *, bool *, PDB *, const Molecule *, const CoordSet *, Atom *, const std::map *); void addPreWriteFunc(int, preWFtype); void addPostWriteFunc(int, postWFtype); private: static bool readANISOU(PDB *, Molecule *, const std::map *); static void writeANISOU(std::ostream &, PDB *, bool *, PDB *, const Molecule *, const CoordSet *, Atom *, const std::map *); public: static PDBio *writer; // kludge for wFunc std::map > preWFuncs; std::map > postWFuncs; public: PDBio(); PDBio(const std::vector &w); PDBio(const std::vector &w, const std::vector &rm, const std::vector &wm); }; } // namespace molecule #endif