322 #include <libxml/parser.h>
323 #include <libxml/tree.h>
334 #define SMALL 0.000001
335 #define XML_BUFFER 1024
336 #define XML_SAMPLE 256
339 #define LOCATION_HEADER 0
340 #define LOCATION_COORDINATES 1
341 #define LOCATION_TRAILER 2
344 #define APPEND_STRINGLIST(x, y) \
345 if(((y)!=NULL) && ((x)!=NULL)) { \
355 int NPartial,
PDB **ppdb,
PDB **pp,
357 static void ProcessElementField(
char *element,
char *element_field);
358 static void ProcessChargeField(
int *charge,
char *charge_field);
359 static void StoreConectRecords(
WHOLEPDB *wpdb,
char *buffer);
361 static BOOL SetPDBDateField(
char *pdb_date,
char *pdbml_date);
362 static void ParseHeaderRecordsPDBML(
WHOLEPDB *wpdb, xmlDoc *document);
363 static STRINGLIST *ParseHeaderPDBML(xmlDoc *document);
364 static STRINGLIST *ParseTitlePDBML(xmlDoc *document);
365 static STRINGLIST *ParseCompndPDBML(xmlDoc *document,
PDB *pdb);
366 static STRINGLIST *ParseSourcePDBML(xmlDoc *document);
367 static STRINGLIST *ParseResolPDBML(xmlDoc *document);
368 static STRINGLIST *ParseSeqresPDBML(xmlDoc *document);
369 static STRINGLIST *ParseModresPDBML(xmlDoc *document);
370 static int ParseConectPDBML(xmlDoc *document,
PDB *pdb);
371 static STRINGLIST *TitleStringlist(
char *titlestring);
373 int *lines_stored,
COMPND *compnd);
375 int *lines_stored,
int mol_id,
377 static char **GetEntityChainLabels(
int entity,
PDB *pdb,
int *nChains);
378 static STRINGLIST *SeqresStringlist(
int nchains,
char **chains,
385 #if !defined(__APPLE__) && !defined(MS_WINDOWS)
386 FILE *
popen(
char *,
char *);
726 element_buff[4] =
"",
746 #if defined(GUNZIP_SUPPORT) && !defined(MS_WINDOWS)
750 # ifndef SINGLE_CHAR_FILECHECK
771 #if defined(GUNZIP_SUPPORT) && !defined(MS_WINDOWS)
773 # ifndef SINGLE_CHAR_FILECHECK
776 signature[i] = fgetc(fpin);
778 ungetc(signature[i], fpin);
779 if(((signature[0] == (
int)0x1F) &&
780 (signature[1] == (
int)0x8B) &&
781 (signature[2] == (
int)0x08)) ||
782 ((signature[0] == (
int)0x1F) &&
783 (signature[1] == (
int)0x9D) &&
784 (signature[2] == (
int)0x90)))
790 signature[0] = fgetc(fpin);
791 ungetc(signature[0], fpin);
792 if(signature[0] == (
int)0x1F) gzipped_file =
TRUE;
800 sprintf(cmd,
"gunzip >/tmp/readpdb_%d", (
int)getpid());
806 while((ch=fgetc(fpin))!=EOF)
811 sprintf(cmd,
"/tmp/readpdb_%d", (
int)getpid());
812 if((fp = fopen(cmd,
"r"))==
NULL)
831 if(cmd[0]) unlink(cmd);
835 if(cmd[0]) unlink(cmd);
843 while(fgets(buffer,159,fp))
848 if(!strncmp(buffer,
"MODEL ",6))
857 if((ModelCount != ModelNum) && (ModelCount != 0))
869 if(!strncmp(buffer,
"ATOM ", 6) ||
870 !strncmp(buffer,
"HETATM", 6) ||
871 !strncmp(buffer,
"MODEL ", 6))
875 else if(!strncmp(buffer,
"CONECT", 6) ||
876 !strncmp(buffer,
"MASTER", 6) ||
877 !strncmp(buffer,
"END ", 6))
897 if(!strncmp(buffer,
"CONECT", 6))
898 StoreConectRecords(wpdb, buffer);
906 "%6s%5d%1x%5s%4s%1s%4d%1s%3x%8lf%8lf%8lf%6lf%6lf%6x%4s%2s%2s",
907 record_type,&atnum,atnambuff,resnam,chain,&resnum,insert,
908 &x,&y,&z,&occ,&bval,segid,element_buff,charge_buff)
911 if((!strncmp(record_type,
"ATOM ",6)) ||
912 (!strncmp(record_type,
"HETATM",6) && AllAtoms))
921 strncpy(atnam_raw, atnambuff, 4);
923 altpos = atnambuff[4];
929 ProcessElementField(element, element_buff);
930 ProcessChargeField(&charge, charge_buff);
933 if(strlen(element) == 0)
961 if((altpos ==
' ') ||
962 (occ > (
double)0.999) ||
970 if(!StoreOccRankAtom(OccRank,multi,NPartial,
975 if(cmd[0]) unlink(cmd);
999 if(cmd[0]) unlink(cmd);
1022 strcpy(p->
atnam, atnam);
1024 strcpy(p->
resnam, resnam);
1025 strcpy(p->
chain, chain);
1026 strcpy(p->
insert, insert);
1028 strcpy(p->
segid, segid);
1040 strncpy(CurAtom,atnam,8);
1043 if(strncmp(CurAtom,atnam,strlen(CurAtom)-1) ||
1045 CurIns != insert[0])
1050 if(!StoreOccRankAtom(OccRank,multi,NPartial,
1055 if(cmd[0]) unlink(cmd);
1061 strncpy(CurAtom,atnam,8);
1070 multi[NPartial].atnum = atnum;
1071 multi[NPartial].resnum = resnum;
1072 multi[NPartial].x = (
REAL)x;
1073 multi[NPartial].y = (
REAL)y;
1074 multi[NPartial].z = (
REAL)z;
1075 multi[NPartial].occ = (
REAL)occ;
1076 multi[NPartial].bval = (
REAL)bval;
1077 multi[NPartial].formal_charge = charge;
1078 multi[NPartial].partial_charge = (
REAL)charge;
1079 multi[NPartial].access = 0.0;
1080 multi[NPartial].radius = 0.0;
1081 multi[NPartial].atomInfo =
NULL;
1082 multi[NPartial].next =
NULL;
1083 strcpy(multi[NPartial].record_type, record_type);
1084 strcpy(multi[NPartial].atnam, atnam);
1086 strcpy(multi[NPartial].atnam_raw, atnam_raw);
1087 strcpy(multi[NPartial].resnam, resnam);
1088 strcpy(multi[NPartial].chain, chain);
1089 strcpy(multi[NPartial].insert, insert);
1090 strcpy(multi[NPartial].element, element);
1092 multi[NPartial].altpos = altpos;
1094 strcpy(multi[NPartial].segid, segid);
1100 charge_buff[0] =
'\0';
1107 if(!StoreOccRankAtom(OccRank,multi,NPartial,&wpdb->
pdb,&p,
1112 if(cmd[0]) unlink(cmd);
1117 if(cmd[0]) unlink(cmd);
1160 int NPartial,
PDB **ppdb,
PDB **pp,
1167 LastOcc = (
REAL)0.0;
1169 if(OccRank < 1) OccRank = 1;
1171 for(i=0; i<OccRank; i++)
1176 for(j=0; j<NPartial; j++)
1178 if(multi[j].occ >= MaxOcc)
1180 MaxOcc = multi[j].occ;
1187 multi[IMaxOcc].occ = (
REAL)-1.0;
1192 if(MaxOcc < (
REAL)0.0)
break;
1200 if(MaxOcc < (
REAL)0.0)
1226 (*pp)->atnum = multi[IMaxOcc].atnum;
1227 (*pp)->resnum = multi[IMaxOcc].resnum;
1228 (*pp)->x = multi[IMaxOcc].x;
1229 (*pp)->y = multi[IMaxOcc].y;
1230 (*pp)->z = multi[IMaxOcc].z;
1231 (*pp)->occ = MaxOcc;
1232 (*pp)->bval = multi[IMaxOcc].bval;
1233 (*pp)->formal_charge = multi[IMaxOcc].formal_charge;
1234 (*pp)->partial_charge = multi[IMaxOcc].partial_charge;
1235 (*pp)->access = multi[IMaxOcc].access;
1236 (*pp)->radius = multi[IMaxOcc].radius;
1237 (*pp)->atomInfo =
NULL;
1240 (*pp)->altpos = multi[IMaxOcc].altpos;
1241 strcpy((*pp)->record_type, multi[IMaxOcc].record_type);
1242 strcpy((*pp)->atnam, multi[IMaxOcc].atnam);
1244 strcpy((*pp)->atnam_raw, multi[IMaxOcc].atnam_raw);
1245 strcpy((*pp)->resnam, multi[IMaxOcc].resnam);
1246 strcpy((*pp)->chain, multi[IMaxOcc].chain);
1247 strcpy((*pp)->insert, multi[IMaxOcc].insert);
1248 strcpy((*pp)->element, multi[IMaxOcc].element);
1250 strcpy((*pp)->segid, multi[IMaxOcc].segid);
1253 if(strlen((*pp)->atnam) > 4)
1254 ((*pp)->atnam)[4] =
'\0';
1256 ((*pp)->atnam)[3] =
' ';
1306 if(newname[2] ==
' ')
1319 if(isdigit(name[0]))
1328 name[len] = name[0];
1337 name[len] = name[0];
1380 for(p=pdb; p!=
NULL; p=q)
1385 for(r=p; r!=q;
NEXT(r))
1390 fprintf(stderr,
"\n\nAlt pos found for record:\n");
1397 alts[altCount++] = r;
1406 if(altCount < MAXPARTIAL)
1408 alts[altCount++] = s;
1410 fprintf(stderr,
"Partner atom found in res:\n");
1416 fprintf(stderr,
"Warning==> More than %d alternative \
1417 conformations in\n", MAXPARTIAL);
1418 fprintf(stderr,
" residue %c%d%c atom %s. \
1419 Increase MAXPARTIAL in ReadPDB.c\n", s->
chain[0],
1434 fprintf(stderr,
"No partner found in residue\n");
1445 if(altCount < MAXPARTIAL)
1447 alts[altCount++] = s;
1449 fprintf(stderr,
"Partner found outside \
1456 fprintf(stderr,
"Warning==> More than %d \
1457 alternative conformations in\n", MAXPARTIAL);
1458 fprintf(stderr,
" residue %c%d%c atom \
1459 %s. Increase MAXPARTIAL in ReadPDB.c\n", s->
chain[0],
1485 fprintf(stderr,
"No alternates found. Resetting ALT \
1495 for(i=0; i<altCount; i++)
1497 if(alts[i]->occ > alts[highest]->occ)
1502 for(i=0; i<altCount; i++)
1507 fprintf(stderr,
"Highest occupancy selected:\n");
1520 fprintf(stderr,
"Deleting current record \
1542 fprintf(stderr,
"Deleting Alt pos record:\n");
1638 xmlParserCtxtPtr ctxt;
1640 xmlNode *root_node =
NULL,
1658 char store_atnam[8] =
"",
1680 size_t = fread(xml_buffer, 1,
XML_BUFFER, fpin);
1681 ctxt = xmlCreatePushParserCtxt(
NULL,
NULL, xml_buffer,
size_t,
"file");
1682 while ((
size_t = fread(xml_buffer, 1,
XML_BUFFER, fpin)) > 0)
1684 xmlParseChunk(ctxt, xml_buffer,
size_t, 0);
1686 xmlParseChunk(ctxt, xml_buffer, 0, 1);
1687 document = ctxt->myDoc;
1688 xmlFreeParserCtxt(ctxt);
1690 if(document ==
NULL)
1693 xmlFreeDoc(document);
1700 root_node = xmlDocGetRootElement(document);
1701 if(root_node ==
NULL)
1704 xmlFreeDoc(document);
1711 for(n=root_node->children; n!=
NULL;
NEXT(n))
1714 if(!strcmp(
"atom_siteCategory", (
char *)n->name))
1722 if(sites_node ==
NULL)
1725 xmlFreeDoc(document);
1733 for(atom_node = sites_node->children; atom_node;
1734 atom_node = atom_node->next)
1736 if(!strcmp(
"atom_site", (
char *)atom_node->name))
1741 if(curr_pdb ==
NULL)
1745 xmlFreeDoc(document);
1753 strcpy(curr_pdb->
chain,
"");
1754 strcpy(curr_pdb->
atnam,
"");
1755 strcpy(curr_pdb->
resnam,
"");
1756 strcpy(curr_pdb->
insert,
" ");
1757 strcpy(curr_pdb->
element,
"");
1758 strcpy(curr_pdb->
segid,
"");
1759 auth_seq_id_set =
FALSE;
1762 for(n=atom_node->children; n!=
NULL;
NEXT(n))
1764 if(n->type != XML_ELEMENT_NODE){
continue; }
1765 content = xmlNodeGetContent(n);
1770 xmlFreeDoc(document);
1777 if(!strcmp((
char *)n->name,
"B_iso_or_equiv"))
1779 sscanf((
char *)content,
"%lf", &content_lf);
1782 else if(!strcmp((
char *)n->name,
"Cartn_x"))
1784 sscanf((
char *)content,
"%lf", &content_lf);
1785 curr_pdb->
x = (
REAL)content_lf;
1787 else if(!strcmp((
char *)n->name,
"Cartn_y"))
1789 sscanf((
char *)content,
"%lf",&content_lf);
1790 curr_pdb->
y = (
REAL)content_lf;
1792 else if(!strcmp((
char *)n->name,
"Cartn_z"))
1794 sscanf((
char *)content,
"%lf", &content_lf);
1795 curr_pdb->
z = (
REAL)content_lf;
1797 else if(!strcmp((
char *)n->name,
"auth_asym_id"))
1799 strcpy(curr_pdb->
chain, (
char *)content);
1801 else if(!strcmp((
char *)n->name,
"auth_atom_id"))
1803 strcpy(curr_pdb->
atnam, (
char *)content);
1805 else if(!strcmp((
char *)n->name,
"auth_comp_id"))
1807 strcpy(curr_pdb->
resnam, (
char *)content);
1809 else if(!strcmp((
char *)n->name,
"auth_seq_id"))
1811 sscanf((
char *)content,
"%lf", &content_lf);
1813 auth_seq_id_set =
TRUE;
1815 else if(!strcmp((
char *)n->name,
"pdbx_PDB_ins_code"))
1820 strncpy(curr_pdb->
insert, (
char *)content, 8);
1822 else if(!strcmp((
char *)n->name,
"group_PDB"))
1825 strncpy(curr_pdb->
record_type, (
char *)content, 8);
1828 else if(!strcmp((
char *)n->name,
"occupancy"))
1830 content_lf = (
REAL)0.0;
1831 sscanf((
char *)content,
"%lf", &content_lf);
1832 curr_pdb->
occ = (
REAL)content_lf;
1834 else if(!strcmp((
char *)n->name,
"label_alt_id"))
1837 curr_pdb->
altpos = strlen((
char *)content) ? content[0]:
' ';
1839 else if(!strcmp((
char *)n->name,
"pdbx_PDB_model_num"))
1841 content_lf = (
REAL)0.0;
1842 sscanf((
char *)content,
"%lf", &content_lf);
1843 model_number = (int)content_lf;
1845 else if(!strcmp((
char *)n->name,
"type_symbol"))
1848 strncpy(curr_pdb->
element, (
char *)content, 8);
1850 else if(!strcmp((
char *)n->name,
"label_asym_id"))
1852 if(strlen(curr_pdb->
chain) == 0)
1855 strncpy(curr_pdb->
chain, (
char *)content, 8);
1858 else if(!strcmp((
char *)n->name,
"label_atom_id"))
1860 if(strlen(curr_pdb->
atnam) == 0)
1863 strncpy(curr_pdb->
atnam, (
char *)content, 8);
1866 else if(!strcmp((
char *)n->name,
"label_comp_id"))
1868 if(strlen(curr_pdb->
resnam) == 0)
1871 strncpy(curr_pdb->
resnam, (
char *)content, 8);
1874 else if(!strcmp((
char *)n->name,
"label_entity_id"))
1877 (strlen((
char *)content) > 0))
1879 content_lf = (
REAL)0.0;
1880 sscanf((
char *)content,
"%lf", &content_lf);
1884 else if(!strcmp((
char *)n->name,
"label_seq_id"))
1886 if((auth_seq_id_set ==
FALSE) &&
1887 (strlen((
char *)content) > 0))
1889 content_lf = (
REAL)0.0;
1890 sscanf((
char *)content,
"%lf", &content_lf);
1894 else if(!strcmp((
char *)n->name,
"pdbx_formal_charge"))
1896 content_lf = (
REAL)0.0;
1897 sscanf((
char *)content,
"%lf", &content_lf);
1901 else if(!strcmp((
char *)n->name,
"seg_id"))
1903 if(strlen(curr_pdb->
segid) == 0)
1906 strncpy(curr_pdb->
segid, (
char *)content, 8);
1922 if(strlen(curr_pdb->
atnam) == 1)
1929 if(strlen(curr_pdb->
atnam) == 4)
1935 else if(strlen(curr_pdb->
element) == 1)
1958 sprintf(pad_resnam,
"%3s", curr_pdb->
resnam);
1961 strncpy(curr_pdb->
resnam, pad_resnam, 8);
1964 if(strlen(curr_pdb->
chain) == 0)
1966 strcpy(curr_pdb->
chain,
" ");
1973 if(model_number > 1)
1979 if(model_number != ModelNum)
1985 if(model_number > ModelNum)
1997 if(!AllAtoms && strncmp(curr_pdb->
record_type,
"ATOM ", 6))
2007 if((NPartial != 0) && strcmp(curr_pdb->
atnam,store_atnam))
2010 if(StoreOccRankAtom(OccRank,multi,NPartial,&wpdb->
pdb,
2021 xmlFreeDoc(document);
2036 curr_pdb->
atnum = natom + 1;
2040 if((curr_pdb->
altpos !=
' ') && (NPartial < MAXPARTIAL))
2050 strncpy(store_atnam, curr_pdb->
atnam, 8);
2065 wpdb->
pdb = curr_pdb;
2073 end_pdb->next = curr_pdb;
2085 if(!StoreOccRankAtom(OccRank,multi,NPartial,&wpdb->
pdb,&end_pdb,
2090 xmlFreeDoc(document);
2102 xmlFreeDoc(document);
2116 ParseConectPDBML(document, wpdb->
pdb);
2119 ParseHeaderRecordsPDBML(wpdb, document);
2124 xmlFreeDoc(document);
2163 #if !defined(SINGLE_CHAR_FILECHECK) && !defined(MS_WINDOWS)
2175 if(c == EOF || feof(fp))
break;
2176 buffer[i] = (char)c;
2181 for(i = strlen(buffer) - 1; i >= 0; i--)
2183 ungetc(buffer[i], fp);
2187 if(!strncmp(buffer,
"<?xml ",6)) found_xml =
TRUE;
2190 for(i = 0; i < strlen(buffer); i++)
2192 if(buffer[i] !=
'\n')
continue;
2195 if(!strncmp(&buffer[i+1],
"<?xml ",6)) found_xml =
TRUE;
2196 if(!strncmp(&buffer[i+1],
"<PDBx:datablock ",16)) found_pdbx =
TRUE;
2199 return ((found_xml && found_pdbx) ?
TRUE :
FALSE);
2208 if(c == EOF || feof(fp))
return FALSE;
2233 static void ProcessElementField(
char *element,
char *element_field)
2235 char element_sym[4] =
"";
2236 char *element_ptr =
NULL;
2239 if(strlen(element_field) >= 2)
2241 strncpy(element_sym, element_field, 2);
2242 element_sym[2] =
'\0';
2244 strcpy(element,element_ptr);
2264 static void ProcessChargeField(
int *charge,
char *charge_field)
2267 if(strlen(charge_field) >= 2 && isdigit(charge_field[0]))
2269 *charge = charge_field[0] -
'0';
2273 if(strlen(charge_field) >= 2 && charge_field[1] ==
'-')
2275 *charge = *charge * -1;
2389 static void StoreConectRecords(
WHOLEPDB *wpdb,
char *buffer)
2391 char record_type[8];
2399 fsscanf(buffer,
"%6s%5d%5d%5d%5d%5d",
2400 record_type,&atoms[0],&atoms[1],&atoms[2],&atoms[3],&atoms[4]);
2415 if(atoms[i] == p->
atnum)
2426 if(atomsP[0] !=
NULL)
2428 for(i=1; i<nConect; i++)
2432 for(j=0; j<atomsP[0]->
nConect; j++)
2434 if(atomsP[i] !=
NULL)
2436 if(atomsP[0]->conect[j] == atomsP[i])
2445 if(!gotLink && (atomsP[0]->nConect <
MAXCONECT))
2447 if(atomsP[i] !=
NULL)
2456 for(i=1; i<nConect; i++)
2458 if(atomsP[i] !=
NULL)
2462 for(j=0; j<atomsP[i]->
nConect; j++)
2464 if(atomsP[i]->conect[j] == atomsP[0])
2472 if(!gotLink && (atomsP[i]->nConect <
MAXCONECT))
2496 static void ParseHeaderRecordsPDBML(
WHOLEPDB *wpdb, xmlDoc *document)
2507 *title_lines =
NULL,
2508 *compnd_lines =
NULL,
2509 *source_lines =
NULL,
2510 *seqres_lines =
NULL,
2511 *modres_lines =
NULL,
2512 *resol_lines =
NULL,
2516 if(wpdb ==
NULL || document ==
NULL)
2522 wpdb_header = ParseHeaderPDBML(document);
2523 title_lines = ParseTitlePDBML(document);
2524 compnd_lines = ParseCompndPDBML(document, wpdb->
pdb);
2525 source_lines = ParseSourcePDBML(document);
2526 resol_lines = ParseResolPDBML(document);
2527 seqres_lines = ParseSeqresPDBML(document);
2528 modres_lines = ParseModresPDBML(document);
2532 APPEND_STRINGLIST(last, title_lines);
2533 APPEND_STRINGLIST(last, compnd_lines);
2534 APPEND_STRINGLIST(last, source_lines);
2535 APPEND_STRINGLIST(last, resol_lines);
2536 APPEND_STRINGLIST(last, seqres_lines);
2537 APPEND_STRINGLIST(last, modres_lines);
2544 wpdb->
header = wpdb_header;
2584 static STRINGLIST *ParseHeaderPDBML(xmlDoc *document)
2594 xmlNode *root_node =
NULL,
2598 xmlChar *content, *attribute;
2600 char header_line[82] =
"",
2601 header_field[41] =
"",
2603 date_field[10] =
"";
2606 root_node = xmlDocGetRootElement(document);
2607 for(node = root_node->children; node;
NEXT(node))
2609 if(node->type != XML_ELEMENT_NODE){
continue; }
2612 if(!strcmp(
"struct_keywordsCategory", (
char *)node->name))
2614 for(subnode = node->children; subnode;
NEXT(subnode))
2616 for(n=subnode->children; n;
NEXT(n))
2618 if(strcmp(
"pdbx_keywords", (
char *)n->name)){
continue; }
2619 if((content = xmlNodeGetContent(n))!=
NULL)
2621 strncpy(header_field, (
char *)content,40);
2629 if(!strcmp(
"database_PDB_revCategory", (
char *)node->name))
2631 for(subnode = node->children; subnode;
NEXT(subnode))
2633 for(n=subnode->children; n;
NEXT(n))
2635 if(strcmp(
"date_original", (
char *)n->name)){
continue; }
2636 if((content = xmlNodeGetContent(n))!=
NULL)
2639 SetPDBDateField(date_field, (
char *)content);
2647 if(!strcmp(
"entryCategory", (
char *)node->name))
2649 for(subnode = node->children; subnode;
NEXT(subnode))
2651 if(strcmp(
"entry", (
char *)subnode->name)){
continue; }
2653 if((attribute = xmlGetProp(subnode, (xmlChar *)
"id"))!=
NULL)
2655 strncpy(pdb_field, (
char *)attribute,4);
2656 pdb_field[4] =
'\0';
2665 if(!strlen(header_field))
2667 strcpy(header_field,
"Converted from PDBML");
2669 sprintf(header_line,
"HEADER %-40s%9s %4s \n",
2670 header_field, date_field, pdb_field);
2677 return(header_lines);
2695 static STRINGLIST *ParseTitlePDBML(xmlDoc *document)
2705 xmlNode *root_node =
NULL,
2713 root_node = xmlDocGetRootElement(document);
2714 for(node = root_node->children; node;
NEXT(node))
2716 if(node->type != XML_ELEMENT_NODE){
continue; }
2719 if(!strcmp(
"structCategory", (
char *)node->name))
2721 for(subnode = node->children; subnode;
NEXT(subnode))
2723 for(n=subnode->children; n;
NEXT(n))
2725 if(strcmp(
"title", (
char *)n->name)){
continue; }
2726 if((content = xmlNodeGetContent(n))!=
NULL)
2729 title_lines = TitleStringlist((
char *)content);
2740 return(title_lines);
2759 static STRINGLIST *ParseCompndPDBML(xmlDoc *document,
PDB *pdb)
2769 xmlNode *root_node =
NULL,
2773 xmlChar *content, *attribute;
2781 char **chains =
NULL,
2782 compnd_type[16] =
"";
2785 root_node = xmlDocGetRootElement(document);
2786 for(node = root_node->children; node;
NEXT(node))
2788 if(node->type != XML_ELEMENT_NODE){
continue; }
2792 if(!strcmp(
"entityCategory", (
char *)node->name))
2795 for(subnode = node->children; subnode;
NEXT(subnode))
2797 if(strcmp(
"entity", (
char *)subnode->name)){
continue; }
2802 compnd.
chain[0] =
'\0';
2805 compnd.
ec[0] =
'\0';
2808 compnd.
other[0] =
'\0';
2809 compnd_type[0] =
'\0';
2812 if((attribute = xmlGetProp(subnode, (xmlChar *)
"id"))!=
NULL)
2814 sscanf((
char *)attribute,
"%i", &compnd.
molid);
2819 for(n=subnode->children; n;
NEXT(n))
2821 if(n->type != XML_ELEMENT_NODE){
continue; }
2823 if((content = xmlNodeGetContent(n))!=
NULL)
2825 if(!strcmp(
"details", (
char *)n->name))
2827 strcpy(compnd.
other, (
char *)content);
2829 else if(!strcmp(
"pdbx_description", (
char *)n->name))
2831 strcpy(compnd.
molecule, (
char *)content);
2833 else if(!strcmp(
"pdbx_fragment", (
char *)n->name))
2835 strcpy(compnd.
fragment, (
char *)content);
2837 else if(!strcmp(
"pdbx_ec", (
char *)n->name))
2839 strcpy(compnd.
ec, (
char *)content);
2841 else if(!strcmp(
"pdbx_mutation", (
char *)n->name))
2843 strcpy(compnd.
mutation, (
char *)content);
2845 else if(!strcmp(
"pdbx_engineered", (
char *)n->name))
2849 else if(!strcmp(
"type", (
char *)n->name))
2851 strcpy(compnd_type, (
char *)content);
2859 if(strcmp(compnd_type,
"polymer")){
continue; }
2863 chains = GetEntityChainLabels(compnd.
molid , pdb, &nchains);
2867 for(i=0; i<nchains; i++)
2871 strncat(compnd.
chain,
", ",3);
2873 strncat(compnd.
chain,chains[i],8);
2881 compnd_lines = CompndStringlist(compnd_lines, &nlines,
2891 return(compnd_lines);
2909 static STRINGLIST *ParseSourcePDBML(xmlDoc *document)
2919 xmlNode *root_node =
NULL,
2923 xmlChar *content, *attribute;
2924 double content_lf = 0.0;
2926 int source_lines_stored = 0;
2933 root_node = xmlDocGetRootElement(document);
2934 for(node = root_node->children; node;
NEXT(node))
2936 if(node->type != XML_ELEMENT_NODE){
continue; }
2940 if(!strcmp(
"entity_src_genCategory", (
char *)node->name) ||
2941 !strcmp(
"entity_src_natCategory", (
char *)node->name))
2943 for(subnode = node->children; subnode;
NEXT(subnode))
2946 if(strcmp(
"entity_src_gen", (
char *)subnode->name) &&
2947 strcmp(
"entity_src_nat", (
char *)subnode->name))
2958 if((attribute = xmlGetProp(subnode,
2959 (xmlChar *)
"entity_id"))!=
NULL)
2961 sscanf((
char *)attribute,
"%i", &mol_id);
2965 for(n=subnode->children; n;
NEXT(n))
2967 if(n->type != XML_ELEMENT_NODE){
continue; }
2968 if((content = xmlNodeGetContent(n))!=
NULL)
2970 if(!strcmp(
"pdbx_gene_src_common_name",
2972 !strcmp(
"common_name", (
char *)n->name))
2977 else if(!strcmp(
"pdbx_gene_src_scientific_name",
2979 !strcmp(
"pdbx_organism_scientific",
2985 else if(!strcmp(
"pdbx_gene_src_ncbi_taxonomy_id",
2987 !strcmp(
"pdbx_ncbi_taxonomy_id",
2990 sscanf((
char *)content,
"%lf", &content_lf);
2993 else if(!strcmp(
"pdbx_gene_src_strain",
2995 !strcmp(
"strain", (
char *)n->name))
2997 strncpy(source.
strain, (
char *)content,
3006 source_lines = SourceStringlist(source_lines,
3007 &source_lines_stored,
3016 return(source_lines);
3037 static STRINGLIST *ParseResolPDBML(xmlDoc *document)
3047 xmlNode *root_node =
NULL,
3051 xmlChar *content, *attribute;
3052 REAL resolution = (-1.0),
3058 char resol_line[82] =
"";
3061 root_node = xmlDocGetRootElement(document);
3062 for(node = root_node->children; node;
NEXT(node))
3064 if(node->type != XML_ELEMENT_NODE){
continue; }
3067 if(!strcmp(
"refine_ls_shellCategory", (
char *)node->name))
3069 for(subnode = node->children; subnode;
NEXT(subnode))
3071 if(!strcmp(
"refine_ls_shell", (
char *)subnode->name))
3074 if((attribute = xmlGetProp(subnode,
3075 (xmlChar *)
"d_res_high"))!=
NULL)
3077 sscanf((
char *)attribute,
"%lf", &resolution);
3079 sprintf(resol_line,
"REMARK 2 RESOLUTION. %5.2f \
3080 ANGSTROMS. \n", resolution);
3084 for(n=subnode->children; n!=
NULL;
NEXT(n))
3086 if(!strcmp(
"R_factor_R_free", (
char *)n->name))
3088 if((content = xmlNodeGetContent(n))!=
NULL)
3090 sscanf((
char *)content,
"%lf", &RFree);
3094 else if(!strcmp(
"R_factor_R_work", (
char *)n->name))
3096 if((content = xmlNodeGetContent(n))!=
NULL)
3098 sscanf((
char *)content,
"%lf", &RWork);
3103 if((RWork > (
REAL)(-0.99)) || (RFree > (
REAL)(-0.99)))
3105 sprintf(resol_line,
"REMARK 3 REFINEMENT. \
3109 sprintf(resol_line,
"REMARK 3 FIT TO DATA USED IN \
3113 if(RWork > (
REAL)(-0.99))
3115 sprintf(resol_line,
"REMARK 3 R VALUE \
3116 (WORKING SET) : %5.3f \n", RWork);
3119 if(RFree > (
REAL)(-0.99))
3121 sprintf(resol_line,
"REMARK 3 FREE R VALUE \
3122 : %5.3f \n", RFree);
3127 if((attribute = xmlGetProp(subnode,
3128 (xmlChar *)
"pdbx_refine_id"))
3131 sprintf(resol_line,
"REMARK 200 EXPERIMENTAL DETAILS \
3134 sprintf(resol_line,
"REMARK 200 EXPERIMENT TYPE \
3135 : %-35s\n", (
char *)attribute);
3146 return(resol_lines);
3164 static STRINGLIST *ParseSeqresPDBML(xmlDoc *document)
3174 xmlNode *root_node =
NULL,
3178 xmlChar *content, *attribute;
3182 char **chains =
NULL;
3186 char curr_chain[8] =
"",
3192 root_node = xmlDocGetRootElement(document);
3193 for(node = root_node->children; node;
NEXT(node))
3195 if(node->type != XML_ELEMENT_NODE){
continue; }
3198 if(!strcmp(
"pdbx_poly_seq_schemeCategory", (
char *)node->name))
3201 for(subnode = node->children; subnode;
NEXT(subnode))
3203 if(strcmp(
"pdbx_poly_seq_scheme", (
char *)subnode->name))
3212 if((attribute = xmlGetProp(subnode, (xmlChar *)
"mon_id"))
3215 strncpy(resnam, (
char *)attribute,8);
3220 for(n=subnode->children; n;
NEXT(n))
3222 if(n->type != XML_ELEMENT_NODE){
continue; }
3223 content = xmlNodeGetContent(n);
3225 if(!strcmp(
"pdb_strand_id", (
char *)n->name))
3227 strncpy(curr_chain, (
char *)content,8);
3239 chains = (
char **)malloc(
sizeof(
char *));
3242 if(chains ==
NULL || residue_list ==
NULL)
3249 chains = (
char **)realloc(chains,
3250 (nchains)*
sizeof(
char *));
3257 if((chains ==
NULL) || (residue_list ==
NULL))
3263 if((chains[nchains - 1] =
3264 (
char *)malloc(8 *
sizeof(
char))) ==
NULL)
3268 strncpy(chains[nchains - 1], curr_chain,8);
3271 residue_list[nchains - 1] =
NULL;
3275 residue_list[nchains-1] =
3279 strncpy(prev_chain, curr_chain,8);
3283 seqres_lines = SeqresStringlist(nchains, chains, residue_list);
3288 for(i=0; i<nchains; i++)
3303 return(seqres_lines);
3321 static STRINGLIST *ParseModresPDBML(xmlDoc *document)
3331 xmlNode *root_node =
NULL,
3335 xmlChar *content, *attribute;
3336 double content_lf = 0.0;
3338 char pdb_field[5] =
"";
3341 char modres_line[82] =
"",
3342 modres_resnam[8] =
"",
3343 modres_chain[8] =
"",
3344 modres_insert[2] =
" ",
3345 modres_stdnam[8] =
"",
3346 modres_comment[42] =
"";
3347 int modres_seqnum = 0;
3350 root_node = xmlDocGetRootElement(document);
3351 for(node = root_node->children; node;
NEXT(node))
3353 if(node->type != XML_ELEMENT_NODE){
continue; }
3357 if(!strcmp(
"entryCategory", (
char *)node->name))
3359 for(subnode = node->children; subnode;
NEXT(subnode))
3361 if(strcmp(
"entry", (
char *)subnode->name)){
continue; }
3363 if((attribute = xmlGetProp(subnode, (xmlChar *)
"id"))!=
NULL)
3365 strncpy(pdb_field, (
char *)attribute,4);
3366 pdb_field[4] =
'\0';
3373 if(!strcmp(
"pdbx_struct_mod_residueCategory", (
char *)node->name))
3376 for(subnode = node->children; subnode;
NEXT(subnode))
3378 if(strcmp(
"pdbx_struct_mod_residue", (
char *)subnode->name))
3382 strcpy(modres_resnam,
"");
3383 strcpy(modres_chain,
"");
3385 strcpy(modres_insert,
" ");
3386 strcpy(modres_stdnam,
"");
3387 strcpy(modres_comment,
"");
3390 for(n=subnode->children; n;
NEXT(n))
3392 if(n->type != XML_ELEMENT_NODE){
continue; }
3393 if((content = xmlNodeGetContent(n))!=
NULL)
3396 if(!strcmp(
"auth_asym_id", (
char *)n->name))
3398 strncpy(modres_chain, (
char *)content,8);
3400 else if(!strcmp(
"auth_comp_id", (
char *)n->name))
3402 strncpy(modres_resnam, (
char *)content,8);
3404 else if(!strcmp(
"auth_seq_id", (
char *)n->name))
3406 sscanf((
char *)content,
"%lf", &content_lf);
3407 modres_seqnum = (
REAL)content_lf;
3409 else if(!strcmp(
"details", (
char *)n->name))
3411 strncpy(modres_comment, (
char *)content,41);
3413 else if(!strcmp(
"parent_comp_id", (
char *)n->name))
3415 strncpy(modres_stdnam, (
char *)content,8);
3417 else if(!strcmp(
"label_asym_id", (
char *)n->name))
3419 if(strlen(modres_chain) == 0)
3421 strncpy(modres_chain, (
char *)content,8);
3424 else if(!strcmp(
"label_comp_id", (
char *)n->name))
3426 if(strlen(modres_resnam) == 0)
3428 strncpy(modres_resnam, (
char *)content,8);
3431 else if(!strcmp(
"label_seq_id", (
char *)n->name))
3433 if(modres_seqnum == 0)
3435 sscanf((
char *)content,
"%lf", &content_lf);
3436 modres_seqnum = (
REAL)content_lf;
3439 else if(!strcmp(
"PDB_ins_code", (
char *)n->name))
3441 strncpy(modres_insert, (
char *)content,8);
3449 sprintf(modres_line,
"MODRES %4s %3s %1s %4d%1s %3s %-40s",
3450 pdb_field, modres_resnam, modres_chain,
3451 modres_seqnum, modres_insert, modres_stdnam,
3454 strncat(modres_line,
"\n",2);
3465 return(modres_lines);
3489 static char **GetEntityChainLabels(
int entity,
PDB *pdb,
int *nChains)
3500 char **chains =
NULL,
3517 for(i=0; i < *nChains && !found; i++)
3532 if( (chains = (
char **)malloc(
sizeof(
char *))) ==
NULL )
3538 if((chains = (
char **)realloc(chains,
3539 (*nChains+1)*
sizeof(
char *)))
3545 if((chains[*nChains] = (
char *)malloc(8*
sizeof(
char)))
3550 strncpy(chains[*nChains],p->
chain, 8);
3555 strncpy(prev_chain, p->
chain, 8);
3579 static BOOL SetPDBDateField(
char *pdb_date,
char *pdbml_date)
3581 char month_letter[12][4] = {
"JAN",
"FEB",
"MAR",
"APR",
"MAY",
"JUN",
3582 "JUL",
"AUG",
"SEP",
"OCT",
"NOV",
"DEC"};
3589 items = sscanf(pdbml_date,
"%4d-%2d-%2d", &year, &month, &day);
3593 year == 0 || month == 0 || day == 0 ||
3594 day < 1 || day > 31 ||
3595 month < 1 || month > 12 ||
3599 strncpy(pdb_date,
" ", 10);
3604 sprintf(pdb_date,
"%02d-%3s-%02d",
3605 day, month_letter[month - 1], year % 100);
3626 static int ParseConectPDBML(xmlDoc *document,
PDB *pdb)
3637 xmlNode *root_node =
NULL,
3639 *conect_node =
NULL,
3657 root_node = xmlDocGetRootElement(document);
3659 for(n=root_node->children; n!=
NULL;
NEXT(n))
3662 if(!strcmp(
"struct_connCategory", (
char *)n->name))
3671 if(sites_node !=
NULL)
3674 for(conect_node = sites_node->children; conect_node;
3675 conect_node = conect_node->next)
3677 if(conect_node->type != XML_ELEMENT_NODE){
continue; }
3680 valid_conect =
FALSE;
3684 strcpy(conect_one.
chain,
"");
3685 strcpy(conect_one.
atnam,
"");
3686 strcpy(conect_one.
resnam,
"");
3687 strcpy(conect_one.
insert,
" ");
3688 strcpy(conect_one.
element,
"");
3689 strcpy(conect_one.
segid,
"");
3691 strcpy(conect_two.
chain,
"");
3692 strcpy(conect_two.
atnam,
"");
3693 strcpy(conect_two.
resnam,
"");
3694 strcpy(conect_two.
insert,
" ");
3695 strcpy(conect_two.
element,
"");
3696 strcpy(conect_two.
segid,
"");
3699 for(n=conect_node->children; n!=
NULL;
NEXT(n))
3701 if(n->type != XML_ELEMENT_NODE){
continue; }
3702 if((content = xmlNodeGetContent(n))==
NULL)
3715 if(!strcmp((
char *)n->name,
"conn_type_id"))
3717 if(!strncmp((
char *)content,
"covale",6) ||
3718 !strncmp((
char *)content,
"disulf",6) ||
3719 !strncmp((
char *)content,
"modres",6))
3722 valid_conect =
TRUE;
3727 valid_conect =
FALSE;
3734 if(!strcmp((
char *)n->name,
"ptnr1_auth_asym_id"))
3736 strcpy(conect_one.
chain, (
char *)content);
3738 else if(!strcmp((
char *)n->name,
"ptnr1_auth_comp_id"))
3740 strcpy(conect_one.
resnam, (
char *)content);
3742 else if(!strcmp((
char *)n->name,
"ptnr1_auth_seq_id"))
3744 sscanf((
char *)content,
"%lf", &content_lf);
3747 else if(!strcmp((
char *)n->name,
"ptnr1_label_asym_id"))
3749 if(strlen(conect_one.
chain) == 0)
3751 strncpy(conect_one.
chain, (
char *)content, 8);
3754 else if(!strcmp((
char *)n->name,
"ptnr1_label_atom_id"))
3756 if(strlen(conect_one.
atnam) == 0)
3758 strncpy(conect_one.
atnam, (
char *)content, 8);
3762 else if(!strcmp((
char *)n->name,
"ptnr1_label_comp_id"))
3764 if(strlen(conect_one.
resnam) == 0)
3766 strncpy(conect_one.
resnam, (
char *)content, 8);
3769 else if(!strcmp((
char *)n->name,
"ptnr1_label_seq_id"))
3771 if((conect_one.
resnum == 0) &&
3772 (strlen((
char *)content) > 0))
3774 content_lf = (
REAL)0.0;
3775 sscanf((
char *)content,
"%lf", &content_lf);
3779 else if(!strcmp((
char *)n->name,
"ptnr2_auth_asym_id"))
3781 strcpy(conect_two.
chain, (
char *)content);
3783 else if(!strcmp((
char *)n->name,
"ptnr2_auth_comp_id"))
3785 strcpy(conect_two.
resnam, (
char *)content);
3787 else if(!strcmp((
char *)n->name,
"ptnr2_auth_seq_id"))
3789 sscanf((
char *)content,
"%lf", &content_lf);
3792 else if(!strcmp((
char *)n->name,
"ptnr2_label_asym_id"))
3794 if(strlen(conect_two.
chain) == 0)
3796 strncpy(conect_two.
chain, (
char *)content, 8);
3799 else if(!strcmp((
char *)n->name,
"ptnr2_label_atom_id"))
3801 if(strlen(conect_two.
atnam) == 0)
3803 strncpy(conect_two.
atnam, (
char *)content, 8);
3807 else if(!strcmp((
char *)n->name,
"ptnr2_label_comp_id"))
3809 if(strlen(conect_two.
resnam) == 0)
3811 strncpy(conect_two.
resnam, (
char *)content, 8);
3814 else if(!strcmp((
char *)n->name,
"ptnr2_label_seq_id"))
3816 if((conect_two.
resnum == 0) &&
3817 (strlen((
char *)content) > 0))
3819 content_lf = (
REAL)0.0;
3820 sscanf((
char *)content,
"%lf", &content_lf);
3837 if(!valid_conect){
continue; }
3843 for( p=pdb; p!=
NULL && (conect_a ==
NULL || conect_b ==
NULL);
3847 (p->resnum == conect_one.
resnum) &&
3848 !strncmp(p->atnam,conect_one.
atnam,8))
3854 (p->resnum == conect_two.
resnum) &&
3855 !strncmp(p->atnam,conect_two.
atnam,8))
3862 if(!(conect_a && conect_b)){
continue; }
3912 char *record,
int *lines_stored,
3913 char *token,
char *content,
3924 char content_line[82] =
"",
3925 content_field[71] =
"",
3926 *content_string =
NULL;
3935 if(strlen(content) == 0)
3941 nlines = *lines_stored;
3944 if((content_string = (
char *)malloc((1+strlen(token) +
3946 strlen(terminator))*
sizeof(
char)))
3954 strcpy(content_string, token );
3955 strcpy(&content_string[strlen(token)], content);
3956 strcpy(&content_string[strlen(token)+strlen(content)], terminator);
3959 if(strncmp(content_string,
" CHAIN: ", 8))
3960 UPPER(content_string);
3963 for(i=0; i<strlen(content_string); i++)
3965 if(content_string[i] ==
' ' ) cut_to = i;
3966 if(i == strlen(content_string) - 1) cut_to = i+1;
3969 if( (i && !((i - cut_from)%70)) ||
3970 (i == strlen(content_string)-1) )
3973 cut_to = (cut_from == cut_to) ? i : cut_to;
3974 strncpy(content_field,
3975 &content_string[cut_from],
3977 content_field[cut_to - cut_from] =
'\0';
3984 sprintf(content_line,
"%-6s %s\n", record, content_field);
3986 if(stringlist ==
NULL)
3993 sprintf(content_line,
"%-6s %3d%s\n",
3994 record, nlines, content_field);
3996 if(stringlist ==
NULL)
4005 free(content_string);
4008 *lines_stored = nlines;
4030 static STRINGLIST *TitleStringlist(
char *titlestring)
4043 title_stringlist = DoStoreStringlist(
NULL,
"TITLE", &start_line,
"",
4046 return title_stringlist;
4071 int *lines_stored,
COMPND *compnd)
4081 char mol_id[4] =
"";
4084 if(compnd->
molid == 0)
4090 sprintf(mol_id,
"%i",compnd->
molid);
4091 if(*lines_stored == 0)
4094 stringlist = DoStoreStringlist(stringlist,
"COMPND",
4095 lines_stored,
"MOL_ID: ",
4100 DoStoreStringlist(stringlist,
"COMPND",
4101 lines_stored,
" MOL_ID: ",
4106 DoStoreStringlist(stringlist,
"COMPND",
4107 lines_stored,
" MOLECULE: ",
4111 DoStoreStringlist(stringlist,
"COMPND",
4112 lines_stored,
" CHAIN: ",
4113 compnd->
chain,
";");
4116 DoStoreStringlist(stringlist,
"COMPND",
4117 lines_stored,
" FRAGMENT: ",
4121 DoStoreStringlist(stringlist,
"COMPND",
4122 lines_stored,
" EC: ",
4126 DoStoreStringlist(stringlist,
"COMPND",
4127 lines_stored,
" ENGINEERED: ",
4131 DoStoreStringlist(stringlist,
"COMPND",
4132 lines_stored,
" MUTATION: ",
4136 DoStoreStringlist(stringlist,
"COMPND",
4137 lines_stored,
" OTHER_DETAILS: ",
4138 compnd->
other,
";");
4165 int *lines_stored,
int mol_id,
4176 char buffer[8] =
"";
4179 sprintf(buffer,
"%i",mol_id);
4180 if(*lines_stored == 0)
4183 stringlist = DoStoreStringlist(stringlist,
"SOURCE",
4184 lines_stored,
"MOL_ID: ",
4189 DoStoreStringlist(stringlist,
"SOURCE",
4190 lines_stored,
" MOL_ID: ",
4195 DoStoreStringlist(stringlist,
"SOURCE",
4196 lines_stored,
" ORGANISM_SCIENTIFIC: ",
4200 DoStoreStringlist(stringlist,
"SOURCE",
4201 lines_stored,
" ORGANISM_COMMON: ",
4205 sprintf(buffer,
"%i",source->
taxid);
4206 DoStoreStringlist(stringlist,
"SOURCE",
4207 lines_stored,
" ORGANISM_TAXID: ",
4211 DoStoreStringlist(stringlist,
"SOURCE",
4212 lines_stored,
" STRAIN: ",
4237 static STRINGLIST *SeqresStringlist(
int nchains,
char **chains,
4249 int i = 0, j = 0, nres = 0;
4251 char seqres_line[82] =
"";
4252 char residue_field[5] =
"";
4253 char sequence_field[53] =
"";
4257 for(i=0; i<nchains; i++)
4261 for(residue = residues[i]; residue !=
NULL;
NEXT(residue))
4267 for(residue=residues[i], j=0, nline=0;
4272 sprintf(residue_field,
"%4s",residue->string);
4273 strncat(sequence_field,residue_field,4);
4274 if(j%13 == 0 || j == nres)
4278 sprintf(seqres_line,
"SEQRES%4d%2s %4d %-52s \n",
4279 nline,chains[i],nres,sequence_field);
4280 sequence_field[0] =
'\0';
#define FINDPREV(p, s, l)
BOOL blAddConect(PDB *p, PDB *q)
char strain[MAXPDBANNOTATION]
PDB * blReadPDBAll(FILE *fp, int *natom)
Include file for PDB routines.
FILE * popen(char *, char *)
char fragment[MAXPDBANNOTATION]
PDB * blReadPDBAtoms(FILE *fp, int *natom)
void blWritePDBRecord(FILE *fp, PDB *pdb)
char engineered[MAXPDBANNOTATION]
char * blFixAtomName(char *name, REAL occup)
BOOL blCheckFileFormatPDBML(FILE *fp)
WHOLEPDB * blReadWholePDB(FILE *fpin)
void blFreeStringList(STRINGLIST *StringList)
int fsscanf(char *buffer, char *format,...)
WHOLEPDB * blReadWholePDBAtoms(FILE *fpin)
char other[MAXPDBANNOTATION]
char commonName[MAXPDBANNOTATION]
Include file for fsscanf()
char synonym[MAXPDBANNOTATION]
PDB * blReadPDB(FILE *fp, int *natom)
char ec[MAXPDBANNOTATION]
WHOLEPDB * blDoReadPDB(FILE *fpin, BOOL AllAtoms, int OccRank, int ModelNum, BOOL DoWhole)
char chain[MAXPDBANNOTATION]
Port-specific defines to allow us to use things like popen() in a clean compile.
PDB * blReadPDBAtomsOccRank(FILE *fp, int *natom, int OccRank)
void blCopyPDB(PDB *out, PDB *in)
PDB * blReadPDBOccRank(FILE *fp, int *natom, int OccRank)
STRINGLIST * blStoreString(STRINGLIST *StringList, char *string)
Header file for general purpose routines.
int blChindex(char *string, char ch)
PDB * blRemoveAlternates(PDB *pdb)
#define LOCATION_COORDINATES
#define CHAINMATCH(chain1, chain2)
#define KILLLEADSPACES(y, x)
void blFreeWholePDB(WHOLEPDB *wpdb)
System-type variable type definitions.
PDB * blFindNextResidue(PDB *pdb)
char molecule[MAXPDBANNOTATION]
Type definitions for maths.
struct pdb_entry * conect[MAXCONECT]
char chain[blMAXCHAINLABEL]
void blSetElementSymbolFromAtomName(char *element, char *atom_name)
char scientificName[MAXPDBANNOTATION]
void blRenumAtomsPDB(PDB *pdb, int offset)
#define PADMINTERM(string, len)
char mutation[MAXPDBANNOTATION]
WHOLEPDB * blDoReadPDBML(FILE *fpin, BOOL AllAtoms, int OccRank, int ModelNum, BOOL DoWhole)