in layer2/ObjectMolecule2.cpp [855:1424]
static void assign_pdb_known_residue(PyMOLGlobals * G, AtomInfoType * ai1,
AtomInfoType * ai2, int *bond_order)
{
int order = *(bond_order);
const char *name1 = LexStr(G, ai1->name);
const char *name2 = LexStr(G, ai2->name);
const char *resn1 = LexStr(G, ai1->resn);
/* nasty high-speed hack to get bond valences and formal charges
for standard residues */
if(((!name1[1]) && (!name2[1])) &&
(((name1[0] == 'C') && (name2[0] == 'O')) ||
((name1[0] == 'O') && (name2[0] == 'C')))) {
order = 2;
} else if((!name2[1]) && (name2[0] == 'C') && (!strcmp(name1, "OXT"))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if((!name1[1]) && (name1[0] == 'C') && (!strcmp(name2, "OXT"))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
} else {
switch (resn1[0]) {
case 'A':
switch (resn1[1]) {
case 'R':
switch (resn1[2]) {
case 'G': /* ARG... */
switch (resn1[3]) {
case 0:
case 'P': /* ARG, ARGP */
if(!strcmp(name1, "NH1")) {
ai1->formalCharge = 1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "NH1")) {
ai2->formalCharge = 1;
ai2->chemFlag = false;
}
break;
}
if(((!strcmp(name1, "CZ")) && (!strcmp(name2, "NH1"))) ||
((!strcmp(name2, "CZ")) && (!strcmp(name1, "NH1"))))
order = 2;
break;
}
break;
case 'S':
switch (resn1[2]) {
case 'P': /* ASP... */
switch (resn1[3]) {
case 0:
case 'M': /* ASP, ASPM minus assumption */
if(!strcmp(name1, "OD2")) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "OD2")) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
break;
}
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "OD1"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "OD1"))))
order = 2;
break;
case 'N': /* ASN */
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "OD1"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "OD1"))))
order = 2;
break;
}
break;
case 0:
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C8")) && (!strcmp(name2, "N7"))) ||
((!strcmp(name2, "C8")) && (!strcmp(name1, "N7"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "C5"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "C5"))))
order = 2;
else if(((!strcmp(name1, "C6")) && (!strcmp(name2, "N1"))) ||
((!strcmp(name2, "C6")) && (!strcmp(name1, "N1"))))
order = 2;
else if(((!strcmp(name1, "C2")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "N3"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
break;
}
break;
case 'C':
if(resn1[1] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "N3"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'D': /* deoxy nucleic acids */
switch (resn1[1]) {
case 'A':
if(resn1[2] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C8")) && (!strcmp(name2, "N7"))) ||
((!strcmp(name2, "C8")) && (!strcmp(name1, "N7"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "C5"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "C5"))))
order = 2;
else if(((!strcmp(name1, "C6")) && (!strcmp(name2, "N1"))) ||
((!strcmp(name2, "C6")) && (!strcmp(name1, "N1"))))
order = 2;
else if(((!strcmp(name1, "C2")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "N3"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'C':
if(resn1[2] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "N3"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'T':
if(resn1[2] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2"))))
ai1->formalCharge = -1;
else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2"))))
ai2->formalCharge = -1;
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "O4"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "O4"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'G':
if(resn1[2] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C6")) && (!strcmp(name2, "O6"))) ||
((!strcmp(name2, "C6")) && (!strcmp(name1, "O6"))))
order = 2;
else if(((!strcmp(name1, "C2")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "N3"))))
order = 2;
else if(((!strcmp(name1, "C8")) && (!strcmp(name2, "N7"))) ||
((!strcmp(name2, "C8")) && (!strcmp(name1, "N7"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "C5"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "C5"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'U':
if(resn1[2] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "O4"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "O4"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
}
break;
case 'G':
switch (resn1[1]) {
case 'L':
switch (resn1[2]) {
case 'U': /* GLU missing GLUN, GLUH, GLH handling */
switch (resn1[3]) {
case 0:
case 'M': /* minus */
if(!strcmp(name1, "OE2")) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "OE2")) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
break;
}
if(((!strcmp(name1, "CD")) && (!strcmp(name2, "OE1"))) ||
((!strcmp(name2, "CD")) && (!strcmp(name1, "OE1"))))
order = 2;
break;
case 'N': /* GLN or GLU */
if(((!strcmp(name1, "CD")) && (!strcmp(name2, "OE1"))) ||
((!strcmp(name2, "CD")) && (!strcmp(name1, "OE1"))))
order = 2;
break;
}
break;
case 0:
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C6")) && (!strcmp(name2, "O6"))) ||
((!strcmp(name2, "C6")) && (!strcmp(name1, "O6"))))
order = 2;
else if(((!strcmp(name1, "C2")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "N3"))))
order = 2;
else if(((!strcmp(name1, "C8")) && (!strcmp(name2, "N7"))) ||
((!strcmp(name2, "C8")) && (!strcmp(name1, "N7"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "C5"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "C5"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
break;
}
break;
case 'H':
switch (resn1[1]) {
case 'I':
switch (resn1[2]) {
case 'P':
if(!strcmp(name1, "ND1")) {
ai1->formalCharge = 1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "ND1")) {
ai2->formalCharge = 1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "ND1"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "ND1"))))
order = 2;
break;
case 'S':
switch (resn1[3]) {
case 'A': /* HISA Gromacs */
case 'D': /* HISD Quanta */
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "NE2"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "NE2"))))
order = 2;
break;
case 0: /* plain HIS */
case 'B': /* HISB Gromacs */
case 'E': /* HISE Quanta */
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "ND1"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "ND1"))))
order = 2;
break;
case 'H': /* HISH Gromacs */
case 'P': /* HISP Quanta */
if(!strcmp(name1, "ND1")) {
ai1->formalCharge = 1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "ND1")) {
ai2->formalCharge = 1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "ND1"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "ND1"))))
order = 2;
break;
}
break;
case 'E': /* HIE */
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "ND1"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "ND1"))))
order = 2;
break;
case 'D': /* HID */
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD2"))))
order = 2;
else if(((!strcmp(name1, "CE1")) && (!strcmp(name2, "NE2"))) ||
((!strcmp(name2, "CE1")) && (!strcmp(name1, "NE2"))))
order = 2;
break;
}
break;
}
break;
case 'I':
if(resn1[1] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C8")) && (!strcmp(name2, "N7"))) ||
((!strcmp(name2, "C8")) && (!strcmp(name1, "N7"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "C5"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "C5"))))
order = 2;
else if(((!strcmp(name1, "C6")) && (!strcmp(name2, "N1"))) ||
((!strcmp(name2, "C6")) && (!strcmp(name1, "N1"))))
order = 2;
else if(((!strcmp(name1, "C2")) && (!strcmp(name2, "N3"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "N3"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
case 'P':
switch (resn1[1]) {
case 'H': /* PHE */
if(resn1[2] == 'E') {
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD1"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD1"))))
order = 2;
else if(((!strcmp(name1, "CZ")) && (!strcmp(name2, "CE1"))) ||
((!strcmp(name2, "CZ")) && (!strcmp(name1, "CE1"))))
order = 2;
else if(((!strcmp(name1, "CE2")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CE2")) && (!strcmp(name1, "CD2"))))
order = 2;
break;
}
}
break;
case 'L':
switch (resn1[1]) {
case 'Y':
switch (resn1[2]) {
case 'S': /* LYS. */
switch (resn1[3]) {
case 0:
case 'P': /* LYS, LYSP */
if(!strcmp(name1, "NZ")) {
ai1->formalCharge = 1;
ai1->chemFlag = false;
} else if(!strcmp(name2, "NZ")) {
ai2->formalCharge = 1;
ai2->chemFlag = false;
}
break;
}
break;
}
break;
}
break;
case 'T':
switch (resn1[1]) {
case 'Y': /* TYR */
if(resn1[2] == 'R') {
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD1"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD1"))))
order = 2;
else if(((!strcmp(name1, "CZ")) && (!strcmp(name2, "CE1"))) ||
((!strcmp(name2, "CZ")) && (!strcmp(name1, "CE1"))))
order = 2;
else if(((!strcmp(name1, "CE2")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CE2")) && (!strcmp(name1, "CD2"))))
order = 2;
break;
}
break;
case 'R':
if(resn1[2] == 'P') {
if(((!strcmp(name1, "CG")) && (!strcmp(name2, "CD1"))) ||
((!strcmp(name2, "CG")) && (!strcmp(name1, "CD1"))))
order = 2;
else if(((!strcmp(name1, "CZ3")) && (!strcmp(name2, "CE3"))) ||
((!strcmp(name2, "CZ3")) && (!strcmp(name1, "CE3"))))
order = 2;
else if(((!strcmp(name1, "CZ2")) && (!strcmp(name2, "CH2"))) ||
((!strcmp(name2, "CZ2")) && (!strcmp(name1, "CH2"))))
order = 2;
else if(((!strcmp(name1, "CE2")) && (!strcmp(name2, "CD2"))) ||
((!strcmp(name2, "CE2")) && (!strcmp(name1, "CD2"))))
order = 2;
break;
}
break;
case 0:
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "O4"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "O4"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
break;
}
break;
case 'U':
if(resn1[1] == 0) {
if(((!strcmp(name1, "O2P")) || (!strcmp(name1, "OP2")))) {
ai1->formalCharge = -1;
ai1->chemFlag = false;
} else if(((!strcmp(name2, "O2P")) || (!strcmp(name2, "OP2")))) {
ai2->formalCharge = -1;
ai2->chemFlag = false;
}
if(((!strcmp(name1, "C2")) && (!strcmp(name2, "O2"))) ||
((!strcmp(name2, "C2")) && (!strcmp(name1, "O2"))))
order = 2;
else if(((!strcmp(name1, "C4")) && (!strcmp(name2, "O4"))) ||
((!strcmp(name2, "C4")) && (!strcmp(name1, "O4"))))
order = 2;
else if(((!strcmp(name1, "C5")) && (!strcmp(name2, "C6"))) ||
((!strcmp(name2, "C5")) && (!strcmp(name1, "C6"))))
order = 2;
else
if(((!strcmp(name1, "P"))
&& (((!strcmp(name2, "O1P")) || (!strcmp(name2, "OP1")))))
|| ((!strcmp(name2, "P"))
&& (((!strcmp(name1, "O1P")) || (!strcmp(name1, "OP1"))))))
order = 2;
}
break;
}
}
*(bond_order) = order;
}