static void write_constr_pdb(const char *fn, const char *title, gmx_mtop_t *mtop, int start, int homenr, t_commrec *cr, rvec x[], matrix box) { char fname[STRLEN], format[STRLEN]; FILE *out; int dd_ac0 = 0, dd_ac1 = 0, i, ii, resnr; gmx_domdec_t *dd; char *anm, *resnm; dd = NULL; if (DOMAINDECOMP(cr)) { dd = cr->dd; dd_get_constraint_range(dd, &dd_ac0, &dd_ac1); start = 0; homenr = dd_ac1; } if (PAR(cr)) { sprintf(fname, "%s_n%d.pdb", fn, cr->sim_nodeid); } else { sprintf(fname, "%s.pdb", fn); } sprintf(format, "%s\n", get_pdbformat()); out = gmx_fio_fopen(fname, "w"); fprintf(out, "TITLE %s\n", title); gmx_write_pdb_box(out, -1, box); for (i = start; i < start+homenr; i++) { if (dd != NULL) { if (i >= dd->nat_home && i < dd_ac0) { continue; } ii = dd->gatindex[i]; } else { ii = i; } gmx_mtop_atominfo_global(mtop, ii, &anm, &resnr, &resnm); fprintf(out, format, "ATOM", (ii+1)%100000, anm, resnm, ' ', resnr%10000, ' ', 10*x[i][XX], 10*x[i][YY], 10*x[i][ZZ]); } fprintf(out, "TER\n"); gmx_fio_fclose(out); }
void write_pdbfile_indexed(FILE *out, const char *title, t_atoms *atoms, rvec x[], int ePBC, matrix box, char chainid, int model_nr, int nindex, const int index[], gmx_conect conect, gmx_bool bTerSepChains) { gmx_conect_t *gc = (gmx_conect_t *)conect; char resnm[6], nm[6]; int i, ii; int resind, resnr; enum PDB_record type; unsigned char resic, ch; char altloc; real occup, bfac; gmx_bool bOccup; int chainnum, lastchainnum; gmx_residuetype_t*rt; const char *p_restype; const char *p_lastrestype; gmx_residuetype_init(&rt); fprintf(out, "TITLE %s\n", (title && title[0]) ? title : gmx::bromacs().c_str()); if (box && ( norm2(box[XX]) || norm2(box[YY]) || norm2(box[ZZ]) ) ) { gmx_write_pdb_box(out, ePBC, box); } if (atoms->pdbinfo) { /* Check whether any occupancies are set, in that case leave it as is, * otherwise set them all to one */ bOccup = TRUE; for (ii = 0; (ii < nindex) && bOccup; ii++) { i = index[ii]; bOccup = bOccup && (atoms->pdbinfo[i].occup == 0.0); } } else { bOccup = FALSE; } fprintf(out, "MODEL %8d\n", model_nr > 0 ? model_nr : 1); lastchainnum = -1; p_restype = NULL; for (ii = 0; ii < nindex; ii++) { i = index[ii]; resind = atoms->atom[i].resind; chainnum = atoms->resinfo[resind].chainnum; p_lastrestype = p_restype; gmx_residuetype_get_type(rt, *atoms->resinfo[resind].name, &p_restype); /* Add a TER record if we changed chain, and if either the previous or this chain is protein/DNA/RNA. */ if (bTerSepChains && ii > 0 && chainnum != lastchainnum) { /* Only add TER if the previous chain contained protein/DNA/RNA. */ if (gmx_residuetype_is_protein(rt, p_lastrestype) || gmx_residuetype_is_dna(rt, p_lastrestype) || gmx_residuetype_is_rna(rt, p_lastrestype)) { fprintf(out, "TER\n"); } lastchainnum = chainnum; } strncpy(resnm, *atoms->resinfo[resind].name, sizeof(resnm)-1); resnm[sizeof(resnm)-1] = 0; strncpy(nm, *atoms->atomname[i], sizeof(nm)-1); nm[sizeof(nm)-1] = 0; /* rename HG12 to 2HG1, etc. */ xlate_atomname_gmx2pdb(nm); resnr = atoms->resinfo[resind].nr; resic = atoms->resinfo[resind].ic; if (chainid != ' ') { ch = chainid; } else { ch = atoms->resinfo[resind].chainid; if (ch == 0) { ch = ' '; } } if (resnr >= 10000) { resnr = resnr % 10000; } if (atoms->pdbinfo) { type = static_cast<enum PDB_record>(atoms->pdbinfo[i].type); altloc = atoms->pdbinfo[i].altloc; if (!isalnum(altloc)) { altloc = ' '; } occup = bOccup ? 1.0 : atoms->pdbinfo[i].occup; bfac = atoms->pdbinfo[i].bfac; } else { type = epdbATOM; occup = 1.0; bfac = 0.0; altloc = ' '; } gmx_fprintf_pdb_atomline(out, type, i+1, nm, altloc, resnm, ch, resnr, resic, 10*x[i][XX], 10*x[i][YY], 10*x[i][ZZ], occup, bfac, atoms->atom[i].elem); if (atoms->pdbinfo && atoms->pdbinfo[i].bAnisotropic) { fprintf(out, "ANISOU%5d %-4.4s%4.4s%c%4d%c %7d%7d%7d%7d%7d%7d\n", (i+1)%100000, nm, resnm, ch, resnr, (resic == '\0') ? ' ' : resic, atoms->pdbinfo[i].uij[0], atoms->pdbinfo[i].uij[1], atoms->pdbinfo[i].uij[2], atoms->pdbinfo[i].uij[3], atoms->pdbinfo[i].uij[4], atoms->pdbinfo[i].uij[5]); } } fprintf(out, "TER\n"); fprintf(out, "ENDMDL\n"); if (NULL != gc) { /* Write conect records */ for (i = 0; (i < gc->nconect); i++) { fprintf(out, "CONECT%5d%5d\n", gc->conect[i].ai+1, gc->conect[i].aj+1); } } gmx_residuetype_destroy(rt); }
void write_pdbfile_indexed(FILE *out,char *title, t_atoms *atoms,rvec x[], int ePBC,matrix box,char chain, int model_nr, atom_id nindex, atom_id index[]) { char resnm[6],nm[6],ch,pdbform[128],pukestring[100]; atom_id i,ii; int resnr,type; real occup,bfac; bool bOccup; int nlongname=0; bromacs(pukestring,99); fprintf(out,"TITLE %s\n",(title && title[0])?title:pukestring); if (bWideFormat) { fprintf(out,"REMARK This file does not adhere to the PDB standard\n"); fprintf(out,"REMARK As a result of, some programs may not like it\n"); } if (box && ( norm2(box[XX]) || norm2(box[YY]) || norm2(box[ZZ]) ) ) { gmx_write_pdb_box(out,ePBC,box); } if (atoms->pdbinfo) { /* Check whether any occupancies are set, in that case leave it as is, * otherwise set them all to one */ bOccup = TRUE; for (ii=0; (ii<nindex) && bOccup; ii++) { i = index[ii]; bOccup = bOccup && (atoms->pdbinfo[i].occup == 0.0); } } else bOccup = FALSE; if (!bTER) fprintf(out,"MODEL %8d\n",model_nr>=0 ? model_nr : 1); for (ii=0; ii<nindex; ii++) { i=index[ii]; resnr=atoms->atom[i].resnr; strcpy(resnm,*atoms->resname[resnr]); strcpy(nm,*atoms->atomname[i]); /* rename HG12 to 2HG1, etc. */ xlate_atomname_gmx2pdb(nm); resnr++; if (resnr>=10000) resnr = resnr % 10000; if (chain) ch=chain; else if (atoms->atom[i].chain) ch=atoms->atom[i].chain; else ch=' '; if (atoms->pdbinfo) { type = atoms->pdbinfo[i].type; occup = bOccup ? 1.0 : atoms->pdbinfo[i].occup; bfac = atoms->pdbinfo[i].bfac; } else { type = 0; occup = 1.0; bfac = 0.0; } if (bWideFormat) strcpy(pdbform,"%-6s%5u %-4.4s %3.3s %c%4d %10.5f%10.5f%10.5f%8.4f%8.4f\n"); else { if (strlen(nm)<4) strcpy(pdbform,pdbformat); else { strcpy(pdbform,pdbformat4); if (strlen(nm) > 4) { int maxwln=20; if (nlongname < maxwln) { fprintf(stderr,"WARNING: Writing out atom name (%s) longer than 4 characters to .pdb file\n",nm); } else if (nlongname == maxwln) { fprintf(stderr,"WARNING: More than %d long atom names, will not write more warnings\n",maxwln); } nlongname++; } } strcat(pdbform,"%6.2f%6.2f\n"); } fprintf(out,pdbform,pdbtp[type],(i+1)%100000,nm,resnm,ch,resnr, 10*x[i][XX],10*x[i][YY],10*x[i][ZZ],occup,bfac); if (atoms->pdbinfo && atoms->pdbinfo[i].bAnisotropic) { fprintf(out,"ANISOU%5u %-4.4s%3.3s %c%4d %7d%7d%7d%7d%7d%7d\n", (i+1)%100000,nm,resnm,ch,resnr, atoms->pdbinfo[i].uij[0],atoms->pdbinfo[i].uij[1], atoms->pdbinfo[i].uij[2],atoms->pdbinfo[i].uij[3], atoms->pdbinfo[i].uij[4],atoms->pdbinfo[i].uij[5]); } } fprintf(out,"TER\n"); if (!bTER) fprintf(out,"ENDMDL\n"); }
void write_pdbfile_indexed(FILE *out, const char *title, t_atoms *atoms, rvec x[], int ePBC, matrix box, char chainid, int model_nr, atom_id nindex, atom_id index[], gmx_conect conect, gmx_bool bTerSepChains) { gmx_conect_t *gc = (gmx_conect_t *)conect; char resnm[6], nm[6], pdbform[128], pukestring[100]; atom_id i, ii; int resind, resnr, type; unsigned char resic, ch; real occup, bfac; gmx_bool bOccup; int nlongname = 0; int chainnum, lastchainnum; int lastresind, lastchainresind; gmx_residuetype_t rt; const char *p_restype; const char *p_lastrestype; gmx_residuetype_init(&rt); bromacs(pukestring, 99); fprintf(out, "TITLE %s\n", (title && title[0]) ? title : pukestring); if (bWideFormat) { fprintf(out, "REMARK This file does not adhere to the PDB standard\n"); fprintf(out, "REMARK As a result of, some programs may not like it\n"); } if (box && ( norm2(box[XX]) || norm2(box[YY]) || norm2(box[ZZ]) ) ) { gmx_write_pdb_box(out, ePBC, box); } if (atoms->pdbinfo) { /* Check whether any occupancies are set, in that case leave it as is, * otherwise set them all to one */ bOccup = TRUE; for (ii = 0; (ii < nindex) && bOccup; ii++) { i = index[ii]; bOccup = bOccup && (atoms->pdbinfo[i].occup == 0.0); } } else { bOccup = FALSE; } fprintf(out, "MODEL %8d\n", model_nr > 0 ? model_nr : 1); lastchainresind = -1; lastchainnum = -1; resind = -1; p_restype = NULL; for (ii = 0; ii < nindex; ii++) { i = index[ii]; lastresind = resind; resind = atoms->atom[i].resind; chainnum = atoms->resinfo[resind].chainnum; p_lastrestype = p_restype; gmx_residuetype_get_type(rt, *atoms->resinfo[resind].name, &p_restype); /* Add a TER record if we changed chain, and if either the previous or this chain is protein/DNA/RNA. */ if (bTerSepChains && ii > 0 && chainnum != lastchainnum) { /* Only add TER if the previous chain contained protein/DNA/RNA. */ if (gmx_residuetype_is_protein(rt, p_lastrestype) || gmx_residuetype_is_dna(rt, p_lastrestype) || gmx_residuetype_is_rna(rt, p_lastrestype)) { fprintf(out, "TER\n"); } lastchainnum = chainnum; lastchainresind = lastresind; } strncpy(resnm, *atoms->resinfo[resind].name, sizeof(resnm)-1); strncpy(nm, *atoms->atomname[i], sizeof(nm)-1); /* rename HG12 to 2HG1, etc. */ xlate_atomname_gmx2pdb(nm); resnr = atoms->resinfo[resind].nr; resic = atoms->resinfo[resind].ic; if (chainid != ' ') { ch = chainid; } else { ch = atoms->resinfo[resind].chainid; if (ch == 0) { ch = ' '; } } if (resnr >= 10000) { resnr = resnr % 10000; } if (atoms->pdbinfo) { type = atoms->pdbinfo[i].type; occup = bOccup ? 1.0 : atoms->pdbinfo[i].occup; bfac = atoms->pdbinfo[i].bfac; } else { type = 0; occup = 1.0; bfac = 0.0; } if (bWideFormat) { strcpy(pdbform, "%-6s%5u %-4.4s %3.3s %c%4d%c %10.5f%10.5f%10.5f%8.4f%8.4f %2s\n"); } else { /* Check whether atomname is an element name */ if ((strlen(nm) < 4) && (gmx_strcasecmp(nm, atoms->atom[i].elem) != 0)) { strcpy(pdbform, pdbformat); } else { strcpy(pdbform, pdbformat4); if (strlen(nm) > 4) { int maxwln = 20; if (nlongname < maxwln) { fprintf(stderr, "WARNING: Writing out atom name (%s) longer than 4 characters to .pdb file\n", nm); } else if (nlongname == maxwln) { fprintf(stderr, "WARNING: More than %d long atom names, will not write more warnings\n", maxwln); } nlongname++; } } strcat(pdbform, "%6.2f%6.2f %2s\n"); } fprintf(out, pdbform, pdbtp[type], (i+1)%100000, nm, resnm, ch, resnr, (resic == '\0') ? ' ' : resic, 10*x[i][XX], 10*x[i][YY], 10*x[i][ZZ], occup, bfac, atoms->atom[i].elem); if (atoms->pdbinfo && atoms->pdbinfo[i].bAnisotropic) { fprintf(out, "ANISOU%5u %-4.4s%3.3s %c%4d%c %7d%7d%7d%7d%7d%7d\n", (i+1)%100000, nm, resnm, ch, resnr, (resic == '\0') ? ' ' : resic, atoms->pdbinfo[i].uij[0], atoms->pdbinfo[i].uij[1], atoms->pdbinfo[i].uij[2], atoms->pdbinfo[i].uij[3], atoms->pdbinfo[i].uij[4], atoms->pdbinfo[i].uij[5]); } } fprintf(out, "TER\n"); fprintf(out, "ENDMDL\n"); if (NULL != gc) { /* Write conect records */ for (i = 0; (i < gc->nconect); i++) { fprintf(out, "CONECT%5d%5d\n", gc->conect[i].ai+1, gc->conect[i].aj+1); } } gmx_residuetype_destroy(rt); }