in layer2/AtomInfo.cpp [2409:2794]
void AtomInfoAssignParameters(PyMOLGlobals * G, AtomInfoType * I)
{
const char *n = NULL;
char *e = NULL;
int pri;
e = I->elem;
// elem from protons (except for LP, assume protons=0 if uninitialized)
if(!*e && I->protons > 0) {
atomicnumber2elem(e, I->protons);
}
// elem from name
if(!*e) { /* try to guess atomic type from name */
n = LexStr(G, I->name);
while(((*n) >= '0') && ((*n) <= '9') && (*(n + 1)))
n++;
strncpy(e, n, cElemNameLen);
switch (*e) {
case '\0':
break;
case 'C':
if(*(e + 1) == 'A') {
if(!WordMatchExact(G, G->lex_const.CA, I->resn, true)
&& (!WordMatchExact(G, "CA+", LexStr(G, I->resn), true)))
/* CA intpreted as carbon, not calcium */
*(e + 1) = 0;
} else if(!((*(e + 1) == 'a') || /* CA intpreted as carbon, not calcium */
(*(e + 1) == 'l') || (*(e + 1) == 'L') ||
(*(e + 1) == 'u') || (*(e + 1) == 'U') ||
(*(e + 1) == 'o') || (*(e + 1) == 'O') ||
(*(e + 1) == 's') || (*(e + 1) == 'S') ||
(*(e + 1) == 'r') || (*(e + 1) == 'R')
))
*(e + 1) = 0;
break;
case 'H':
if(!((*(e + 1) == 'e')
))
*(e + 1) = 0;
break;
case 'D': /* take deuterium to hydrogen */
*(e + 1) = 0;
break;
case 'N':
if(!((*(e + 1) == 'i') || (*(e + 1) == 'I') ||
(*(e + 1) == 'a') || (*(e + 1) == 'A') ||
(*(e + 1) == 'b') || (*(e + 1) == 'B')
))
*(e + 1) = 0;
break;
case 'S':
if(!((*(e + 1) == 'e') || (*(e + 1) == 'E') ||
(*(e + 1) == 'r') || (*(e + 1) == 'R') ||
(*(e + 1) == 'c') || (*(e + 1) == 'C') ||
(*(e + 1) == 'b') || (*(e + 1) == 'B')
))
*(e + 1) = 0;
break;
case 'O':
if(!((*(e + 1) == 's')))
*(e + 1) = 0;
break;
case 'Q':
*(e + 1) = 0;
break;
}
if(*(e + 1) && (e[1] != 'P' || e[0] != 'L'))
*(e + 1) = tolower(*(e + 1));
}
// priority
n = LexStr(G, I->name);
while((*n >= '0') && (*n <= '9') && (*(n + 1)))
n++;
if(toupper(*n) != I->elem[0]) {
pri = 1000; /* unconventional atom name -- make no assignments */
} else if(SettingGetGlobal_b(G, cSetting_pdb_standard_order)) {
switch (*n) {
case 'N':
case 'C':
case 'O':
case 'S':
switch (*(n + 1)) {
case 0:
switch (*n) {
case 'N':
pri = 1;
break;
case 'C':
pri = 3;
break;
case 'O':
pri = 4;
break;
default:
pri = 1000;
break;
}
break;
case 'A':
switch (*n) {
case 'C':
pri = 2;
break;
default:
pri = 5;
break; /* generic alpha atom */
}
break;
case 'B':
pri = 6;
break; /* generic beta atom, etc. */
case 'G':
pri = 7;
break;
case 'D':
pri = 8;
break;
case 'E':
pri = 9;
break;
case 'Z':
pri = 10;
break;
case 'H':
pri = 11;
break;
case 'I':
pri = 12;
break;
case 'J':
pri = 13;
break;
case 'K':
pri = 14;
break;
case 'L':
pri = 15;
break;
case 'M':
pri = 16;
break;
case 'N':
pri = 17;
break;
case 'X':
switch (*(n + 2)) {
case 'T':
pri = 999;
break;
default:
case 0:
pri = 16;
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
pri = 0;
n++;
while(*n) {
if(*n == 'P') {
pri -= 200;
break;
} else if((*n == '*') || (*n == '\'')) {
pri = (-100) - pri;
break;
} else if((*n < '0') || (*n > '9'))
break;
pri *= 10;
pri += (*n - '0');
n++;
}
pri += 300;
break;
default:
pri = 500;
break;
}
break;
case 'P': /* this will place the phosphate before CNO numbered atoms */
pri = 20;
break;
case 'D':
case 'H':
switch (*(n + 1)) {
case 0:
pri = 1001;
break;
case 'A':
case 'B':
pri = 1003;
break;
case 'G':
pri = 1004;
break;
case 'D':
pri = 1005;
break;
case 'E':
pri = 1006;
break;
case 'Z':
pri = 1007;
break;
case 'H':
pri = 1008;
break;
case 'I':
pri = 1009;
break;
case 'J':
pri = 1010;
break;
case 'K':
pri = 1011;
break;
case 'L':
pri = 1012;
break;
case 'M':
pri = 1013;
break;
case 'N':
pri = 1002;
break;
case 'X':
pri = 1999;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
pri = 1020;
n++;
while(*n) {
pri *= 10;
pri += (*n - '0');
n++;
}
pri += 25;
break;
default:
pri = 1500;
break;
}
break;
default:
pri = 1000;
break;
}
} else {
switch (*n) {
case 'N':
case 'C':
case 'O':
case 'S':
switch (*(n + 1)) {
case 0:
switch (*n) {
case 'N':
pri = 1;
break;
case 'C':
pri = 997;
break;
case 'O':
pri = 998;
break;
default:
pri = 1000;
break;
}
break;
case 'A':
pri = 3;
break; /* generic alpha */
case 'B':
pri = 4;
break;
case 'G':
pri = 5;
break;
case 'D':
pri = 6;
break;
case 'E':
pri = 7;
break;
case 'Z':
pri = 8;
break;
case 'H':
pri = 9;
break;
case 'I':
pri = 10;
break;
case 'J':
pri = 11;
break;
case 'K':
pri = 12;
break;
case 'L':
pri = 13;
break;
case 'M':
pri = 14;
break;
case 'N':
pri = 15;
break;
case 'X':
switch (*(n + 2)) {
case 'T':
pri = 999;
break;
default:
case 0:
pri = 16;
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
pri = 0;
n++;
while(*n) {
pri *= 10;
pri += (*n - '0');
n++;
}
pri += 25;
break;
default:
pri = 500;
break;
}
break;
default:
pri = 1000;
break;
}
}
I->priority = pri;
// protons from elem or name
if (I->protons < 1)
set_protons(G, I);
// vdw from protons
if(I->vdw == 0.0) {
if (I->protons > -1 && I->protons < ElementTableSize) {
I->vdw = ElementTable[I->protons].vdw;
} else {
I->vdw = 1.80F;
}
}
}