layer2/ObjectMolecule.h (409 lines of code) (raw):
/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#ifndef _H_ObjectMolecule
#define _H_ObjectMolecule
#include"os_python.h"
#include"PyMOLObject.h"
#include"AtomInfo.h"
#include"Vector.h"
#include"Color.h"
#include"Symmetry.h"
#include"DistSet.h"
#include "Executive_pre.h"
#include "CifFile.h"
#include <memory>
#ifdef _WEBGL
#endif
#define cKeywordAll "all"
#define cKeywordNone "none"
#define cKeywordSame "same"
#define cKeywordCenter "center"
#define cKeywordOrigin "origin"
#define cUndoMask 0xF
/*
* ObjectMolecule's Bond Path (BP) Record
*/
typedef struct ObjectMoleculeBPRec {
int *dist;
int *list;
int n_atom;
} ObjectMoleculeBPRec;
typedef struct ObjectMolecule {
/* base Object class */
CObject Obj;
/* array of pointers to coordinate sets; one set per state */
struct CoordSet **CSet;
/* number of coordinate sets */
int NCSet;
struct CoordSet *CSTmpl; /* template for trajectories, etc. */
/* array of bonds */
BondType *Bond;
/* array of atoms (infos) */
AtomInfoType *AtomInfo;
/* number of atoms and bonds */
int NAtom, prevNAtom;
int NBond, prevNBond;
/* is this object loaded as a discrete object? if so, number of states */
int DiscreteFlag;
int *DiscreteAtmToIdx;
struct CoordSet **DiscreteCSet;
/* proposed, for storing uniform trajectory data more efficiently:
int *UniformAtmToIdx, *UniformIdxToAtm; */
int CurCSet; /* Current state number */
int SeleBase; /* for internal usage by selector & only valid during selection process */
CSymmetry *Symmetry;
int *Neighbor;
float *UndoCoord[cUndoMask + 1];
int UndoState[cUndoMask + 1];
int UndoNIndex[cUndoMask + 1];
int UndoIter;
CGO *UnitCellCGO;
int BondCounter;
int AtomCounter;
/* not stored */
struct CSculpt *Sculpt;
int RepVisCacheValid;
int RepVisCache; /* for transient storage during updates */
// for reporting available assembly ids after mmCIF loading - SUBJECT TO CHANGE
std::shared_ptr<cif_file> m_ciffile;
const cif_data * m_cifdata;
// hetatm and ignore-flag by non-polymer classification
bool need_hetatm_classification;
// methods
int getState() const;
bool setNDiscrete(int natom);
bool updateAtmToIdx();
} ObjectMolecule;
/* this is a record that holds information for specific types of Operatations on Molecules, eg. translation/rotation/etc */
typedef struct ObjectMoleculeOpRec {
unsigned int code;
Vector3f v1, v2;
int cs1, cs2;
int i1, i2, i3, i4, i5, i6, *vc1, *i1VLA, *ii1, *vp1;
float f1, f2, *f1VLA, *f2VLA, *ff1;
double d[3][3], d1;
float *vv1, *vv2;
char *charVLA;
const char *s1;
ObjectMolecule **obj1VLA, *obj3;
AtomInfoType *ai, **ai1VLA;
PyObject *py_ob1;
#ifdef _WEBGL
#endif
float ttt[16], *mat1;
int nvv1, nvv2;
int include_static_singletons;
} ObjectMoleculeOpRec;
typedef struct {
float maxAngle;
float maxDistAtMaxAngle;
float maxDistAtZero;
float power_a, power_b;
float factor_a, factor_b; /* 0.5/(maxAngle^power_a), 0.5/(maxAngle^power_b)) */
float cone_dangle;
} HBondCriteria;
typedef struct {
int flag[3];
float matrix[16];
} PDBScale;
enum {
PDB_VARIANT_DEFAULT = 0,
PDB_VARIANT_PQR,
PDB_VARIANT_PDBQT,
PDB_VARIANT_VDB, /* VIPERdb */
};
typedef struct {
int variant;
int pqr_workarounds;
PDBScale scale;
int ignore_header_names;
int multi_object_status; /* 0 = unknown, 1 = is multi_object, -1 is not multi_object */
int multiplex;
inline bool is_pqr_file() const {
return variant == PDB_VARIANT_PQR;
}
} PDBInfoRec;
/* these four letter code are left over from an
earlier multicharacter constant implementation
and should be replaced with something more verbose */
#define OMOP_PDB1 1
#define OMOP_AVRT 2
#define OMOP_SFIT 3
#define OMOP_COLR 4
#define OMOP_VISI 5
#define OMOP_TTTF 6
#define OMOP_ALTR 7
#define OMOP_CSOC 8
#define OMOP_SUMC 9
#define OMOP_VERT 10
#define OMOP_SVRT 11
#define OMOP_MOME 12
#define OMOP_INVA 13
#define OMOP_MDST 14
#define OMOP_MNMX 15
#define OMOP_AlterState 16
#define OMOP_Flag 17
#define OMOP_LABL 18
#define OMOP_Identify 19
#define OMOP_Remove 20
#define OMOP_Protect 21
#define OMOP_Mask 22
#define OMOP_AddHydrogens 23
#define OMOP_SetB 24
#define OMOP_SaveUndo 25
#define OMOP_CountAtoms 26
#define OMOP_Cartoon 27
#define OMOP_Index 28
#define OMOP_PhiPsi 29
#define OMOP_SingleStateVertices 30
#define OMOP_IdentifyObjects 31
#define OMOP_FlagSet 32
#define OMOP_FlagClear 33
#define OMOP_PrepareFromTemplate 34
#define OMOP_SetGeometry 35
#define OMOP_CSetSumVertices 36
#define OMOP_CSetMoment 37
#define OMOP_CSetMinMax 38
#define OMOP_CSetIdxGetAndFlag 39
#define OMOP_CSetIdxSetFlagged 40
#define OMOP_GetObjects 41
#define OMOP_CSetMaxDistToPt 42
#define OMOP_MaxDistToPt 43
#define OMOP_CameraMinMax 44
#define OMOP_CSetCameraMinMax 45
#define OMOP_GetChains 46
#define OMOP_Spectrum 47
#if 0
#define OMOP_GetBFactors 48
#define OMOP_GetOccupancies 49
#define OMOP_GetPartialCharges 50
#endif
#define OMOP_StateVRT 51
#define OMOP_CheckVis 52
#define OMOP_OnOff 53
#define OMOP_Pop 54
#define OMOP_TransformR44f 55
#define OMOP_FixHydrogens 56
#define OMOP_Sort 57
#define OMOP_SetAtomicSetting 58
#define OMOP_CSetSumSqDistToPt 59
#define OMOP_RevalenceFromSource 60
#define OMOP_RevalenceByGuessing 61
#define OMOP_ReferenceStore 62
#define OMOP_ReferenceRecall 63
#define OMOP_ReferenceValidate 64
#define OMOP_ReferenceSwap 65
#define OMOP_RenameAtoms 66
#include"CoordSet.h"
typedef struct {
ObjectMolecule *trg_obj, *mbl_obj; /* target and mobile objects */
int *trg_vla, *mbl_vla;
int n_pair;
} ObjMolPairwise;
void ObjMolPairwiseInit(ObjMolPairwise * pairwise);
void ObjMolPairwisePurge(ObjMolPairwise * pairwise);
/* Metaphorics Annotated PDB stuff */
typedef struct M4XBondType { /* now used for non-bonds as well as h-bonds */
int atom1;
int atom2;
float strength;
} M4XBondType;
typedef struct {
WordType name;
int *site, n_site;
int *ligand, n_ligand;
int *water, n_water;
M4XBondType *hbond, *nbond;
int n_hbond, n_nbond;
} M4XContextType;
typedef struct {
ObjectNameType target;
int n_point;
int *id_at_point;
float *fitness;
} M4XAlignType;
typedef struct {
int annotated_flag;
int invisible;
int n_context;
M4XContextType *context;
int xname_flag;
ObjectNameType xname;
M4XAlignType *align;
} M4XAnnoType;
typedef struct {
ObjectNameType name;
} ObjMolMultiplexType;
/* loop iterators for the ObjectMolecule::Neighbor array
*
* Arguments: (Neighbor array, const int atom-index, int neighbor-atom-or-bond-index, int used-internally)
*
* Example:
* // iterate over neighbors of obj->AtomInfo[at]
* int neighbor_at, tmp;
* ITERNEIGHBORATOMS(obj->Neighbor, at, neighbor_at, tmp) {
* // do something with obj->AtomInfo[neighbor_at]
* }
*/
#define ITERNEIGHBORATOMS(N, a, n, i) for(i = N[a] + 1; (n = N[i]) > -1; i += 2)
#define ITERNEIGHBORBONDS(N, a, b, i) for(i = N[a] + 1; (b = N[i + 1]), N[i] > -1; i += 2)
void M4XAnnoInit(M4XAnnoType * m4x);
void M4XAnnoPurge(M4XAnnoType * m4x);
void M4XAlignInit(M4XAlignType * align);
void M4XAlignPurge(M4XAlignType * align);
int ObjectMoleculeGetMatrix(ObjectMolecule * I, int state, double **history);
int ObjectMoleculeSetMatrix(ObjectMolecule * I, int state, double *matrix);
int ObjectMoleculeGetTopNeighbor(PyMOLGlobals * G,
ObjectMolecule * I, int start, int excluded);
int ObjectMoleculeGetNearestAtomIndex(ObjectMolecule * I, const float *point, float cutoff,
int state, float *dist);
int ObjectMoleculeGetNearestBlendedColor(ObjectMolecule * I, const float *point, float cutoff,
int state, float *dist, float *color,
int sub_vdw);
int *ObjectMoleculeGetPrioritizedOtherIndexList(ObjectMolecule * I, struct CoordSet *cs);
int ObjectMoleculeGetPrioritizedOther(int *other, int a1, int a2, int *double_sided);
void ObjectMoleculeM4XAnnotate(ObjectMolecule * I, M4XAnnoType * m4x, const char *script_file,
int match_colors, int nbr_sele);
/* */
int ObjectMoleculeAreAtomsBonded2(ObjectMolecule * obj0, int a0, ObjectMolecule * obj1,
int a1);
int ObjectMoleculeIsAtomBondedToName(ObjectMolecule * obj, int a0, const char *name, int);
void ObjectMoleculeOpRecInit(ObjectMoleculeOpRec * op);
int ObjectMoleculeNewFromPyList(PyMOLGlobals * G, PyObject * list,
ObjectMolecule ** result);
PyObject *ObjectMoleculeAsPyList(ObjectMolecule * I);
int ObjectMoleculeGetSerial(ObjectMolecule * I);
int ObjectMoleculeSetStateTitle(ObjectMolecule * I, int state, const char *text);
const char *ObjectMoleculeGetStateTitle(ObjectMolecule * I, int state);
int ObjectMoleculeCheckFullStateSelection(ObjectMolecule * I, int sele, int state);
void ObjectMoleculeFree(ObjectMolecule * I); /* only for friends of ObjectMolecule */
int ObjectMoleculeSetStateOrder(ObjectMolecule * I, int * order, int len);
int ObjectMoleculeAddPseudoatom(ObjectMolecule * I, int sele_index, const char *name,
const char *resn, const char *resi, const char *chain,
const char *segi, const char *elem, float vdw,
int hetatm, float b, float q, const char *label,
float *pos, int color, int state, int more, int quiet);
ObjectMolecule *ObjectMoleculeNew(PyMOLGlobals * G, int discreteFlag);
int ObjectMoleculeSort(ObjectMolecule * I);
ObjectMolecule *ObjectMoleculeCopy(const ObjectMolecule * obj);
void ObjectMoleculeFixChemistry(ObjectMolecule * I, int sele1, int sele2, int invalidate);
ObjectMolecule *ObjectMoleculeLoadTOPFile(PyMOLGlobals * G, ObjectMolecule * obj,
const char *fname, int frame, int discrete);
ObjectMolecule *ObjectMoleculeLoadChemPyModel(PyMOLGlobals * G, ObjectMolecule * I,
PyObject * model, int frame, int discrete);
ObjectMolecule *ObjectMoleculeLoadTRJFile(PyMOLGlobals * G, ObjectMolecule * obj,
const char *fname, int frame, int interval,
int average, int start, int stop, int max,
const char *sele, int image, float *shift, int quiet);
ObjectMolecule *ObjectMoleculeLoadRSTFile(PyMOLGlobals * G, ObjectMolecule * obj,
const char *fname, int frame, int quiet, char mode);
ObjectMolecule *ObjectMoleculeLoadCoords(PyMOLGlobals * G, ObjectMolecule * I,
PyObject * coords, int frame);
ObjectMolecule *ObjectMoleculeLoadCoords(PyMOLGlobals * G, ObjectMolecule * I,
const float * coords, int coords_len, int frame=-1);
ObjectMolecule *ObjectMoleculeLoadCoords(PyMOLGlobals * G, const char * name,
const float * coords, int coords_len, int frame=-1);
ObjectMolecule *ObjectMoleculeReadStr(PyMOLGlobals * G, ObjectMolecule * I,
const char **next_entry,
cLoadType_t content_format, int frame,
int discrete, int quiet, int multiplex,
char *new_name,
short loadpropertiesall=false, OVLexicon *loadproplex=NULL);
ObjectMolecule *ObjectMoleculeReadPDBStr(PyMOLGlobals * G, ObjectMolecule * obj,
const char *molstr, int frame, int discrete,
M4XAnnoType * m4x, char *pdb_name,
const char **next_pdb, PDBInfoRec * pdb_info,
int quiet, int *model_number);
int ObjectMoleculeExtendIndices(ObjectMolecule * I, int state);
void ObjectMoleculeInvalidate(ObjectMolecule * I, int rep, int level, int state);
void ObjectMoleculeInvalidateAtomType(ObjectMolecule *I, int state);
void ObjectMoleculeRenderSele(ObjectMolecule * I, int curState, int sele, int vis_only SELINDICATORARG);
void ObjectMoleculeSeleOp(ObjectMolecule * I, int sele, ObjectMoleculeOpRec * op);
struct CoordSet *ObjectMoleculeGetCoordSet(ObjectMolecule * I, int setIndex);
void ObjectMoleculeBlindSymMovie(ObjectMolecule * I);
int ObjectMoleculeMerge(ObjectMolecule * I, AtomInfoType *&& ai,
struct CoordSet *cs, int bondSearchFlag,
int aic_mask, int invalidate);
void ObjectMoleculeUpdateNonbonded(ObjectMolecule * I);
int ObjectMoleculeUpdateNeighbors(ObjectMolecule * I);
int ObjectMoleculeMoveAtom(ObjectMolecule * I, int state, int index, float *v, int mode,
int log);
int ObjectMoleculeMoveAtomLabel(ObjectMolecule * I, int state, int index, float *v, int log, float *diff);
int ObjectMoleculeGetAtomVertex(ObjectMolecule * I, int state, int index, float *v);
int ObjectMoleculeGetAtomTxfVertex(ObjectMolecule * I, int state, int index, float *v);
int ObjectMoleculeGetAtomIndex(ObjectMolecule * I, int sele);
int ObjectMoleculeTransformSelection(ObjectMolecule * I, int state,
int sele, float *TTT, int log,
const char *sname, int homogenous, int global);
int ObjectMoleculeDoesAtomNeighborSele(ObjectMolecule * I, int index, int sele);
void ObjectMoleculeInferChemFromNeighGeom(ObjectMolecule * I, int state);
void ObjectMoleculeInferChemForProtein(ObjectMolecule * I, int state);
void ObjectMoleculeInferChemFromBonds(ObjectMolecule * I, int state);
void ObjectMoleculePurge(ObjectMolecule * I);
int ObjectMoleculeXferValences(ObjectMolecule * Ia, int sele1, int sele2,
int target_state, ObjectMolecule * Ib, int sele3,
int source_state, int quiet);
void ObjectMoleculeGuessValences(ObjectMolecule * I, int state, int *flag1, int *flag2,
int reset);
int ObjectMoleculeAddBond(ObjectMolecule * I, int sele0, int sele1, int order);
int ObjectMoleculeRemoveBonds(ObjectMolecule * I, int sele1, int sele2);
int ObjectMoleculeAutoDisableAtomNameWildcard(ObjectMolecule * I);
void ObjectMoleculeSaveUndo(ObjectMolecule * I, int state, int log);
void ObjectMoleculeUndo(ObjectMolecule * I, int dir);
int ObjectMoleculePrepareAtom(ObjectMolecule * I, int index, AtomInfoType * ai, bool uniquefy=true);
void ObjectMoleculeReplaceAtom(ObjectMolecule * I, int index, AtomInfoType&& ai);
int ObjectMoleculePreposReplAtom(ObjectMolecule * I, int index, AtomInfoType * ai);
void ObjectMoleculeCreateSpheroid(ObjectMolecule * I, int average);
int ObjectMoleculeSetAtomVertex(ObjectMolecule * I, int state, int index, float *v);
int ObjectMoleculeVerifyChemistry(ObjectMolecule * I, int state);
int ObjectMoleculeFindOpenValenceVector(ObjectMolecule * I, int state,
int index, float *v, float *seek,
int ignore_index);
int ObjectMoleculeFillOpenValences(ObjectMolecule * I, int index);
int ObjectMoleculeGetTotalAtomValence(ObjectMolecule * I, int atom);
int ObjectMoleculeAdjustBonds(ObjectMolecule * I, int sele0, int sele1, int mode,
int order);
int ObjectMoleculeAttach(ObjectMolecule * I, int index, AtomInfoType *&& nai);
int ObjectMoleculeFuse(ObjectMolecule * I, int index0, ObjectMolecule * src, int index1,
int mode, int move_flag);
int ObjectMoleculeRenameAtoms(ObjectMolecule * I, int *flag, int force);
int ObjectMoleculeAreAtomsBonded(ObjectMolecule * I, int i0, int i1);
void ObjectGotoState(ObjectMolecule * I, int state);
float ObjectMoleculeGetAvgHBondVector(ObjectMolecule * I, int atom, int state, float *v,
float *incoming);
int ObjectMoleculeCheckBondSep(ObjectMolecule * I, int a0, int a1, int dist);
int ObjectMoleculeGetPhiPsi(ObjectMolecule * I, int ca, float *phi, float *psi,
int state);
void ObjectMoleculeGetAtomSele(ObjectMolecule * I, int index, char *buffer);
void ObjectMoleculeGetAtomSeleFast(ObjectMolecule * I, int index, char *buffer);
void ObjectMoleculeGetAtomSeleLog(ObjectMolecule * I, int index, char *buffer, int quote);
void ObjectMoleculeUpdateIDNumbers(ObjectMolecule * I);
void ObjectMoleculeSculptImprint(ObjectMolecule * I, int state, int match_state,
int match_by_segment);
float ObjectMoleculeSculptIterate(ObjectMolecule * I, int state, int n_cycle,
float *center);
void ObjectMoleculeSculptClear(ObjectMolecule * I);
/* bond paths */
int ObjectMoleculeGetBondPaths(ObjectMolecule * I, int atom, int max,
ObjectMoleculeBPRec * bp);
int ObjectMoleculeInitBondPath(ObjectMolecule * I, ObjectMoleculeBPRec * bp);
int ObjectMoleculePurgeBondPath(ObjectMolecule * I, ObjectMoleculeBPRec * bp);
int ObjectMoleculeGetBondPath(ObjectMolecule * I, int atom, int max,
ObjectMoleculeBPRec * bp);
int ***ObjectMoleculeGetBondPrint(ObjectMolecule * I, int max_bond, int max_type,
int *dim);
int ObjectMoleculeConnect(ObjectMolecule * I, int *nbond, BondType ** bond, AtomInfoType * ai,
struct CoordSet *cs, int searchFlag, int connectModeOverride);
int ObjectMoleculeSetDiscrete(PyMOLGlobals * G, ObjectMolecule * I, int discrete);
float ObjectMoleculeGetMaxVDW(ObjectMolecule * I);
int ObjectMoleculeGetCheckHBond(AtomInfoType **h_real,
float *h_crd_ret,
ObjectMolecule * don_obj,
int don_atom,
int don_state,
ObjectMolecule * acc_obj,
int acc_atom, int acc_state, HBondCriteria * hbc);
void ObjectMoleculeInitHBondCriteria(PyMOLGlobals * G, HBondCriteria * hbc);
int ObjectMoleculeConvertIDsToIndices(ObjectMolecule * I, int *id, int n_id);
#define cObjectMoleculeDummyOrigin 1
#define cObjectMoleculeDummyCenter 2
ObjectMolecule *ObjectMoleculeDummyNew(PyMOLGlobals * G, int mode);
void ObjectMoleculeDummyUpdate(ObjectMolecule * I, int mode);
void ObjectMoleculeTransformState44f(ObjectMolecule * I, int state, float *matrix,
int log_trans, int homogenous, int transformed);
/* internal to ObjectMolecule */
struct CoordSet *ObjectMoleculePDBStr2CoordSet(PyMOLGlobals * G,
const char *buffer,
AtomInfoType ** atInfoPtr,
const char **restart_model,
char *segi_override,
M4XAnnoType * m4x,
char *pdb_name,
const char **next_pdb,
PDBInfoRec * pdb_info,
int quiet, int *model_number);
#ifndef NO_MMLIBS
int ObjectMoleculeUpdateAtomTypeInfoForState(PyMOLGlobals * G, ObjectMolecule * obj, int state, int initialize, int format);
#endif
#ifdef _PYMOL_IP_EXTRAS
int ObjectMoleculeUpdateMMStereoInfoForState(PyMOLGlobals * G, ObjectMolecule * obj, int state, int initialize=1);
#endif
#ifndef _PYMOL_NO_UNDO
void ObjectMoleculeSetAtomBondInfoTypeOldId(PyMOLGlobals * G, ObjectMolecule * obj);
void ObjectMoleculeSetAtomBondInfoTypeOldIdToNegOne(PyMOLGlobals * G, ObjectMolecule * obj);
#endif
void ObjectMoleculeAdjustDiscreteAtmIdx(ObjectMolecule *I, int *lookup, int nAtom);
void AtomInfoSettingGenerateSideEffects(PyMOLGlobals * G, ObjectMolecule *obj, int index, int id);
int *AtomInfoGetSortedIndex(PyMOLGlobals * G, ObjectMolecule * obj, AtomInfoType * rec, int n,
int **outdex);
ObjectMolecule *ObjectMoleculeReadMmtfStr(PyMOLGlobals * G, ObjectMolecule * I,
const char *st, int st_len, int frame, int discrete, int quiet, int multiplex, int zoom);
ObjectMolecule *ObjectMoleculeReadCifStr(PyMOLGlobals * G, ObjectMolecule * I,
const char *st, int frame, int discrete, int quiet, int multiplex, int zoom);
// object and object-state level setting
template <typename V> void SettingSet(int index, V value, ObjectMolecule * I, int state=-1) {
SettingSet(index, value, (CObject*)I, state);
}
#endif