layer2/AtomInfo.h (349 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_AtomInfo
#define _H_AtomInfo
#include"Rep.h"
#include"Setting.h"
#include"Version.h"
#if _PyMOL_VERSION_int < 1770
#define AtomInfoVERSION 176
#define BondInfoVERSION 176
#elif _PyMOL_VERSION_int < 1810
#define AtomInfoVERSION 177
#define BondInfoVERSION 177
#else
#define AtomInfoVERSION 181
#define BondInfoVERSION 181
#endif
/* FLAGS 0-3 have the following conventional usage for molecular modeling */
/* FLAG 0 - Atoms of interest - i.e. a ligand in an active site */
#define cAtomFlag_focus 0x00000001
/* FLAG 1 - Free atoms - those which can move subject to a force-field */
#define cAtomFlag_free 0x00000002
/* FLAG 2 - Restrained atoms - atoms subject to a harmonic restraint */
#define cAtomFlag_restrain 0x00000004
/* FLAG 3 - Fixed atoms - no movement allowed */
#define cAtomFlag_fix 0x00000008
/* FLAG 4 - Exclude these atoms when performing simulation, minimization */
#define cAtomFlag_exclude 0x00000010
/* FLAG 5 - Study atoms */
#define cAtomFlag_study 0x00000020
/* FLAGS 6-7 are for polymer sub-classification */
#define cAtomFlag_protein 0x00000040
#define cAtomFlag_nucleic 0x00000080
/* FLAGS 8-15 are free for end users to manipulate */
/* FLAGS 16-21 are reserved for external GUIs and linked applications */
/* FLAGS 22-23 are for temporary use only (inside of self-contained loops) */
/* FLAGS 24-31 are reserved for PyMOL's internal use */
/* FLAG 24 - don't surface these atoms (waters, ligands, etc.) */
#define cAtomFlag_exfoliate 0x01000000
/* FLAG 25 - ignore atoms altogether when surfacing */
#define cAtomFlag_ignore 0x02000000
/* FLAG 26 - disable cartoon smoothing for these atoms */
#define cAtomFlag_no_smooth 0x04000000
/* FLAG 27 - polymer */
#define cAtomFlag_polymer 0x08000000
/* FLAG 28 - waters */
#define cAtomFlag_solvent 0x10000000
/* FLAG 29 - organics */
#define cAtomFlag_organic 0x20000000
/* FLAG 30 - inorganics */
#define cAtomFlag_inorganic 0x40000000
/* FLAG 31 - guide atom: e.g. CA in proteins */
#define cAtomFlag_guide 0x80000000
#define cAtomFlag_class 0xF8000000
#define cAtomFlag_class_mask 0x07FFFFFF
#define cResnLen 5
#define cResiLen 5
#define cAtomNameLen 4
#define cElemNameLen 4
#define cSegiLen 4
#define cTextTypeLen 20
#define cLabelTypeLen 20
#define cAtomInfoTetrahedral 4
#define cAtomInfoPlanar 3
#define cAtomInfoLinear 2
#define cAtomInfoSingle 1
#define cAtomInfoNone 5
#define cAN_LP 0
#define cAN_H 1
#define cAN_He 2
#define cAN_Li 3
#define cAN_Be 4
#define cAN_B 5
#define cAN_C 6
#define cAN_N 7
#define cAN_O 8
#define cAN_F 9
#define cAN_Ne 10
#define cAN_Na 11
#define cAN_Mg 12
#define cAN_Al 13
#define cAN_Si 14
#define cAN_P 15
#define cAN_S 16
#define cAN_Cl 17
#define cAN_Ar 18
#define cAN_K 19
#define cAN_Ca 20
#define cAN_Ti 22
#define cAN_V 23
#define cAN_Cr 24
#define cAN_Mn 25
#define cAN_Fe 26
#define cAN_Co 27
#define cAN_Ni 28
#define cAN_Cu 29
#define cAN_Zn 30
#define cAN_Ga 31
#define cAN_Ge 32
#define cAN_As 33
#define cAN_Se 34
#define cAN_Br 35
#define cAN_Kr 36
#define cAN_Rb 37
#define cAN_Sr 38
#define cAN_Y 39
#define cAN_Pd 46
#define cAN_Ag 47
#define cAN_Cd 48
#define cAN_In 49
#define cAN_Sn 50
#define cAN_Sb 51
#define cAN_Te 52
#define cAN_I 53
#define cAN_Xe 54
#define cAN_Cs 55
#define cAN_Ba 56
#define cAN_Ce 58
#define cAN_Pt 78
#define cAN_Au 79
#define cAN_Hg 80
#define cAN_Tl 81
#define cAN_Pb 82
#define cAN_U 92
#define SDF_CHIRALITY_ODD 1 // odd / clockwise
#define SDF_CHIRALITY_EVEN 2 // even / counterclockwise
#define SDF_CHIRALITY_EITHER 3 // either or unmarked
typedef char Chain[2];
typedef char SSType[2];
typedef char SegIdent[cSegiLen + 1];
typedef char ResIdent[cResiLen + 1];
typedef char ResName[cResnLen + 1];
typedef char AtomName[cAtomNameLen + 1];
typedef char ElemName[cElemNameLen + 1];
// for customType (not geom)
#define cAtomInfoNoType -9999
inline char makeInscode(char c) {
return (c <= ' ') ? '\0' : c;
}
struct ElementTableItemType {
const char * name;
const char * symbol;
float vdw;
float weight;
};
extern const ElementTableItemType ElementTable[];
extern const int ElementTableSize;
typedef struct BondType {
int index[2];
int id;
int unique_id;
#ifdef _PYMOL_IP_EXTRAS
int oldid;
#endif
signed char order; // 0-4
signed char temp1; // bool? where used?
signed char stereo; // 0-6 Only for SDF (MOL) format in/out
bool has_setting; /* setting based on unique_id */
} BondType;
typedef struct AtomInfoType {
float * anisou; // only allocate with get_anisou
lexidx_t segi;
lexidx_t chain;
lexidx_t resn;
lexidx_t name;
lexidx_t textType;
lexidx_t custom;
lexidx_t label;
int resv;
int customType;
int priority;
float b, q, vdw, partialCharge;
int selEntry;
int color;
int id; // PDB ID
unsigned int flags;
int temp1; /* kludge fields - to remove */
int unique_id; /* introduced in version 0.77 */
int discrete_state; /* state+1 for atoms in discrete objects */
float elec_radius; /* radius for PB calculations */
int rank;
int visRep; /* bitmask for all reps */
#ifdef _PYMOL_IP_EXTRAS
int oldid; // for undo
int prop_id;
#endif
// boolean flags
bool hetatm : 1;
bool bonded : 1;
bool deleteFlag : 1;
bool masked : 1;
bool hb_donor : 1;
bool hb_acceptor : 1;
bool has_setting : 1; /* setting based on unique_id */
/* be careful not to write at these as (int*) */
signed char formalCharge; // values typically in range -2..+2
signed char cartoon; /* 0 = default which is auto (use ssType) */
signed char geom; // cAtomInfo*
signed char valence; // 0-4
signed char protons; /* atomic number */
char inscode;
ElemName elem; // redundant with "protons" ?
SSType ssType; /* blank or 'L' = turn/loop, 'H' = helix, 'S' = beta-strand/sheet */
Chain alt;
// small value optimized bitfields
unsigned char stereo : 2; // 0-3 Only for SDF (MOL) format in/out
unsigned char chemFlag : 2; // 0,1,2
unsigned char protekted : 2; // 0,1,2
unsigned char mmstereo : 2; // 0/R/S/?
// methods
bool isHydrogen() const {
return protons == cAN_H;
}
bool isMetal() const {
return (
(protons > 2 && protons < 5) ||
(protons > 10 && protons < 14) ||
(protons > 18 && protons < 32) ||
(protons > 36 && protons < 51) ||
(protons > 54 && protons < 85) ||
protons > 86);
}
char getInscode(bool space=false) const {
if (space && !inscode)
return ' ';
return inscode;
}
void setInscode(char c) {
inscode = makeInscode(c);
}
void setResi(const char * resi) {
if (sscanf(resi, "%d%c", &resv, &inscode) == 1 || inscode <= ' ')
inscode = '\0';
}
// for AtomInfoHistory
void setResi(int resv_, char inscode_) {
resv = resv_;
setInscode(inscode_);
}
/*
* Return true if any representation, which is displayable by this
* atom, is shown
*/
bool isVisible() const {
if(visRep & (
// point reps
cRepSphereBit | cRepEllipsoidBit | cRepLabelBit |
// surface reps
cRepSurfaceBit | cRepDotBit | cRepMeshBit |
// polymer reps (actually only shown for guide atoms or if
// *_trace_atoms=1 or cartoon_ring_finder=4)
cRepCartoonBit | cRepRibbonBit)) {
return true;
} else if(bonded) {
// bond reps
if (visRep & (cRepCylBit | cRepLineBit))
return true;
} else {
// nonbonded reps
if (visRep & (cRepNonbondedSphereBit | cRepNonbondedBit))
return true;
}
return false;
}
// get the anisou array, allocate if null
float * get_anisou() { return (anisou ? anisou : (anisou = new float[6])); }
// read-only anisou access, no allocation
const float * get_anisou() const { return anisou; }
bool has_anisou() const { return anisou; }
} AtomInfoType;
void AtomInfoFree(PyMOLGlobals * G);
int AtomInfoInit(PyMOLGlobals * G);
void BondTypeInit(BondType *bt);
void BondTypeInit2(BondType *bt, int i1, int i2, int order);
void AtomInfoPurge(PyMOLGlobals * G, AtomInfoType * ai);
void AtomInfoCopy(PyMOLGlobals * G, const AtomInfoType * src, AtomInfoType * dst, int copy_properties=true);
int AtomInfoReserveUniqueID(PyMOLGlobals * G, int unique_id);
int AtomInfoIsUniqueIDActive(PyMOLGlobals * G, int unique_id);
int AtomInfoGetNewUniqueID(PyMOLGlobals * G);
void AtomInfoCleanAtomName(char *name);
#ifndef _PYMOL_NOPY
int AtomInfoSetSettingFromPyObject(PyMOLGlobals * G, AtomInfoType *ai, int setting_id, PyObject *val);
#endif
PyObject *SettingGetIfDefinedPyObject(PyMOLGlobals * G, AtomInfoType * ai, int setting_id);
void AtomInfoBondCopy(PyMOLGlobals * G, const BondType * src, BondType * dst);
int AtomInfoCheckUniqueID(PyMOLGlobals * G, AtomInfoType * ai);
void AtomInfoAssignParameters(PyMOLGlobals * G, AtomInfoType * I);
void AtomInfoFreeSortedIndexes(PyMOLGlobals * G, int **index, int **outdex);
void AtomInfoPrimeColors(PyMOLGlobals * G);
void AtomInfoAssignColors(PyMOLGlobals * G, AtomInfoType * at1);
int AtomInfoGetColor(PyMOLGlobals * G, const AtomInfoType * at1);
int AtomInfoGetExpectedValence(PyMOLGlobals * G, const AtomInfoType * I);
int AtomInfoIsFreeCation(PyMOLGlobals * G, const AtomInfoType * I);
PyObject *AtomInfoAsPyList(PyMOLGlobals * G, const AtomInfoType * at);
int AtomInfoFromPyList(PyMOLGlobals * G, AtomInfoType * at, PyObject * list);
int AtomInfoMatch(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2, bool, bool);
int AtomInfoCompareAll(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoCompare(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoCompareIgnoreRank(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoCompareIgnoreHet(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoCompareIgnoreRankHet(PyMOLGlobals * G, const AtomInfoType * at1,
const AtomInfoType * at2);
float AtomInfoGetBondLength(PyMOLGlobals * G, const AtomInfoType * ai1, const AtomInfoType * ai2);
int AtomInfoSameResidue(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoSameResidueP(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoSameChainP(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoSameSegmentP(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoSequential(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2,
int mode);
#define AtomInfoCheckUniqueBondID AtomInfoCheckUniqueID
int AtomInfoCheckUniqueBondID(PyMOLGlobals * G, BondType * bi);
void AtomInfoPurgeBond(PyMOLGlobals * G, BondType * bi);
void AtomInfoBracketResidue(PyMOLGlobals * G, const AtomInfoType * ai0, int n0,
const AtomInfoType * ai, int *st, int *nd);
void AtomInfoBracketResidueFast(PyMOLGlobals * G, const AtomInfoType * ai0, int n0, int cur,
int *st, int *nd);
int AtomInfoUniquefyNames(PyMOLGlobals * G, const AtomInfoType * atInfo0, int n0,
AtomInfoType * atInfo1, int *flag1, int n1);
int AtomInfoGetCarbColor(PyMOLGlobals * G);
bool AtomResiFromResv(char *resi, size_t size, int resv, char inscode);
inline bool AtomResiFromResv(char *resi, size_t size, const AtomInfoType * ai) {
return AtomResiFromResv(resi, size, ai->resv, ai->inscode);
}
int AtomInfoKnownWaterResName(PyMOLGlobals * G, const char *resn);
int AtomInfoKnownPolymerResName(const char *resn);
int AtomInfoKnownProteinResName(const char *resn);
int AtomInfoKnownNucleicResName(const char *resn);
void AtomInfoGetPDB3LetHydroName(PyMOLGlobals * G, const char *resn, const char *iname, char *oname);
#define cAIC_ct 0x0001
#define cAIC_fc 0x0002
#define cAIC_pc 0x0004
#define cAIC_b 0x0008
#define cAIC_q 0x0010
#define cAIC_id 0x0020
#define cAIC_flags 0x0080
#define cAIC_tt 0x0100
#define cAIC_state 0x0200
#define cAIC_rank 0x0400
#define cAIC_custom 0x0800
#define cAIC_IDMask (cAIC_id|cAIC_rank)
#define cAIC_PDBMask (cAIC_b|cAIC_q|cAIC_id|cAIC_rank)
#define cAIC_MMDMask (cAIC_pc|cAIC_ct|cAIC_id|cAIC_rank)
#define cAIC_MOLMask (cAIC_fc|cAIC_id|cAIC_rank)
#define cAIC_AllMask 0xFFFF
void AtomInfoCombine(PyMOLGlobals * G, AtomInfoType * dst, AtomInfoType * src, int mask);
int AtomInfoNameOrder(PyMOLGlobals * G, const AtomInfoType * at1, const AtomInfoType * at2);
int AtomInfoUpdateAutoColor(PyMOLGlobals * G);
typedef struct {
int resv1, resv2;
char inscode1, inscode2;
unsigned char chain1, chain2;
unsigned char type;
int next;
} SSEntry;
int BondTypeCompare(PyMOLGlobals * G, const BondType * bt1, const BondType * bt2);
void atomicnumber2elem(char * dst, int protons);
/*
* atom-level and bond-level settings
*/
template <typename T>
int AtomInfoCheckSetting(PyMOLGlobals * G, T * item, int index) {
return (item->has_setting && SettingUniqueCheck(G, item->unique_id, index));
}
#define AtomInfoCheckBondSetting AtomInfoCheckSetting
template <typename V, typename T> void SettingSet(PyMOLGlobals * G, int index, V value, T * ai) {
AtomInfoCheckUniqueID(G, ai);
ai->has_setting = true;
SettingUniqueSet(G, ai->unique_id, index, value);
}
/*
* Return true if `item` has the requested setting defined and the
* value could be assigned to `out`.
*/
template <typename V, typename T>
bool AtomSettingGetIfDefined(PyMOLGlobals * G, T * item, int index, V * out) {
return item->has_setting &&
SettingUniqueGetIfDefined<V>(G, item->unique_id, index, out);
}
/*
* Return the `item`-level setting value or `default_`, if `index` is not
* defined for `item`.
*/
template <typename V, typename T>
V AtomSettingGetWD(PyMOLGlobals * G, T * item, int index, V default_) {
V out;
if (AtomSettingGetIfDefined<V, T>(G, item, index, &out))
return out;
return default_;
}
#define BondSettingGetWD AtomSettingGetWD
// stereochemistry
const char * AtomInfoGetStereoAsStr(const AtomInfoType * ai);
void AtomInfoSetStereo(AtomInfoType * ai, const char * stereo);
void AtomInfoGetAlignedPDBResidueName(PyMOLGlobals * G,
const AtomInfoType * ai,
ResName & resn);
void AtomInfoGetAlignedPDBAtomName(PyMOLGlobals * G,
const AtomInfoType * ai,
const ResName & resn,
AtomName & name);
#endif