int add_atomtype(gpp_atomtype_t ga, t_symtab *tab, t_atom *a, const char *name, t_param *nb, int bondatomtype, real radius, real vol, real surftens, int atomnumber, real gb_radius, real S_hct) { int i; for (i = 0; (i < ga->nr); i++) { if (strcmp(*ga->atomname[i], name) == 0) { if (NULL != debug) { fprintf(debug, "Trying to add atomtype %s again. Skipping it.\n", name); } break; } } if (i == ga->nr) { ga->nr++; srenew(ga->atom, ga->nr); srenew(ga->atomname, ga->nr); srenew(ga->nb, ga->nr); srenew(ga->bondatomtype, ga->nr); srenew(ga->radius, ga->nr); srenew(ga->vol, ga->nr); srenew(ga->surftens, ga->nr); srenew(ga->atomnumber, ga->nr); srenew(ga->gb_radius, ga->nr); srenew(ga->S_hct, ga->nr); return set_atomtype(ga->nr-1, ga, tab, a, name, nb, bondatomtype, radius, vol, surftens, atomnumber, gb_radius, S_hct); } else { return i; } }
void pcmfin(int nth,int isubred) { unsigned int substrismin; int newatom, i, ibondcount, ibonded, ibondorder, icoord, imetcount, ioffset, ispin, iprint, isubmap[MAXSS], j, numbonds, niatom; int newat, newtype, ifile, isMetal, biotype, itype; long int mask; char ianame[3]; float ddcount, xtmp, ytmp, ztmp; FILE *pcminfile; imetcount = 0; isMetal = FALSE; ddcount = 0; substrismin = False; fxtor.nfxtor = 0; pcmfile.nocaps = False; numbonds = 0; ibondcount = 0; newatom = 0; newtype = 0; for (i = 0; i < MAXSS; i++) { isubmap[i] = 0; } ioffset = 0; pcminfile = fopen_path(Openbox.path,Openbox.fname,"r"); if (pcminfile == NULL) { message_alert("Error Opening PCM file","PCM Setup"); fprintf(pcmoutfile,"PCMFIN error opening file %d %s\n",nth,Openbox.fname); return; } if (default_intype != MMX) read_atomtypes(default_intype); ifile = 0; if (nth != 1) { while ( FetchRecord(pcminfile,pcmfile.string) ) { if (strncasecmp(pcmfile.string,"{PCM",4) == 0) { ifile++; if (ifile == nth) break; } } }else { FetchRecord(pcminfile,pcmfile.string); } /* finished scaning to starting structure now read file */ if (isubred == 0) { sscanf(pcmfile.string, "{PCM %60c", Struct_Title); clean_string(Struct_Title); } else { if (natom < 1 ) { sscanf(pcmfile.string, "{PCM %60c", Struct_Title); clean_string(Struct_Title); } } L_30: FetchRecord(pcminfile,pcmfile.string); *(pcmfile.string + strlen(pcmfile.string) ) = '\0'; if (feof(pcminfile)) goto L_170; pcmfile.head = 1; NL; L_40: if (strcmp(pcmfile.token, "NA") == 0) { gettoken(); if (pcmfile.head == 1000) goto L_30; niatom = atoi(pcmfile.token); if (niatom + ioffset > MAXATOM) { natom = ioffset; fclose(pcminfile); message_alert(" Maximum number of atoms exceeded in PCMFIN","PCM Setup"); fprintf(pcmoutfile," unable to continue reading, more than Max atoms %d\n",MAXATOM); return; } niatom += ioffset; NL; goto L_30; } else if (strcmp(pcmfile.token,"ATOMTYPES") == 0) { gettoken(); if (pcmfile.head == 1000) goto L_30; default_intype = atoi(pcmfile.token); read_atomtypes(default_intype); NL; goto L_30; } else if (strcmp(pcmfile.token, "NT") == 0) /* This is for Amino Acids */ { NL; i = atoi(pcmfile.token); /* i is atom number of N terminus */ mask = 1L << NTERM; /* use bit 0 of substr 1 for N terminus*/ atom[i+ioffset].flags |= mask; NL; if (strcmp(pcmfile.token, "CT") == 0) { NL; i = atoi(pcmfile.token); /* i is atom number of C terminus */ mask = 1L << CNTERM; /* use bit 1 of substr 1 for C terminus */ atom[i+ioffset].flags |= mask; } } else if (strcmp(pcmfile.token, "5PRIME") == 0) /* This is for Nucleic Acids */ { NL; i = atoi(pcmfile.token); /* i is atom number of 5prime terminus */ mask = 1L << P5; atom[i+ioffset].flags |= mask; }else if (strcmp(pcmfile.token, "3PRIME") == 0) /* This is for Nucleic Acids */ { NL; i = atoi(pcmfile.token); /* i is atom number of C terminus */ mask = 1L << P3; /* use bit 1 of substr 1 for C terminus */ atom[i+ioffset].flags |= mask; } else if (strcmp(pcmfile.token, "FG") == 0) /* This is for functional groups */ { NL; i = atoi(pcmfile.token); /* i is atom number of connect point */ mask = 1L << DUMMY; /* use bit 0 of substr 1 for connect*/ atom[i+ioffset].flags |= mask; } else if (strcmp(pcmfile.token, "OT") == 0) /* This is for Sugars */ { NL; i = atoi(pcmfile.token); /* i is atom number of O terminus */ mask = 1L << NTERM; /* use bit 0 of substr 1 for O terminus*/ atom[i+ioffset].flags |= mask; NL; if (strcmp(pcmfile.token, "CT") == 0) { NL; i = atoi(pcmfile.token); /* i is atom number of H terminus */ mask = 1L << CNTERM; /* use bit 1 of substr 1 for H terminus */ atom[i+ioffset].flags |= mask; } NL; if (strcmp(pcmfile.token, "OTWO") == 0) { NL; i = atoi(pcmfile.token); /* i is atom number of H terminus */ oh2 = i+ioffset; } NL; if (strcmp(pcmfile.token, "OTHR") == 0) { NL; i = atoi(pcmfile.token); /* i is atom number of H terminus */ oh3 = i+ioffset; } NL; if (strcmp(pcmfile.token, "OSIX") == 0) { NL; i = atoi(pcmfile.token); /* i is atom number of H terminus */ oh6 = i+ioffset; } } else if (strcmp(pcmfile.token,"START") == 0) /* flag for polybuild */ { NL; i = atoi(pcmfile.token); mask = 1L << DUMMY; atom[i+ioffset].flags |= mask; NL; // END NL; i = atoi(pcmfile.token); mask = 1L << DUMMY; atom[i+ioffset].flags |= mask; } else if (strcmp(pcmfile.token,"NMOL") == 0) { NL; NL; NL; NL; NL; NL; NL; goto L_30; } else if (strcmp(pcmfile.token, "OPT") == 0) { NL; // para NL; optimize_data.param_avail = atoi(pcmfile.token); NL; // conv NL; optimize_data.converge = atoi(pcmfile.token); NL; // ie NL; optimize_data.initial_energy = atof(pcmfile.token); NL; // fe NL; optimize_data.final_energy = atof(pcmfile.token); NL; // iH NL; optimize_data.initial_heat = atof(pcmfile.token); NL; // fH NL; optimize_data.final_heat = atof(pcmfile.token); goto L_30; } else if (strcmp(pcmfile.token, "SS") == 0) { goto L_30; } else if (strcmp(pcmfile.token, "AT") == 0) { NL; newat = atoi(pcmfile.token); // atom serial number if (newat + ioffset > MAXATOM) { message_alert(" Maximum number of atoms exceeded in PCMFIN at atom read","PCM Setup"); fprintf(pcmoutfile,"atom read %d %d %d\n",newat,ioffset,natom); natom = ioffset + newat - 1; fclose(pcminfile); exit(0); } newat += ioffset; NL; if (isdigit(*pcmfile.token)) { newtype = atoi(pcmfile.token); } else // character string for metal atom { strcpy(ianame,pcmfile.token); isMetal = TRUE; i = strlen(ianame); if ( i == 2) ianame[1] = tolower(ianame[1]); } NL; xtmp = atof(pcmfile.token); NL; ytmp = (atof(pcmfile.token)); NL; ztmp = atof(pcmfile.token); NL; if (isMetal == FALSE) { itype = newtype; get_atomname(newtype,ianame); if (default_intype == MM3) itype = mm3_mmxtype(newtype); else if (default_intype == MMFF94) itype = mmff_mmxtype(newtype); newatom = make_atom(newtype, xtmp, ytmp, ztmp,ianame); if (default_intype == MM3) set_atomtype(newatom, itype,newtype,0,0,0); else if (default_intype == MMFF94) set_atomtype(newatom, itype,0,newtype,0,0); }else if (isMetal == TRUE) { newatom = make_atom(0, xtmp, ytmp, ztmp,ianame); isMetal = FALSE; } L_90: if (strcmp(pcmfile.token, "B") == 0) { /* Reading bonds now */ NL; j = 0; L_100: j += 1; if (pcmfile.state == NUMERIC) { ibonded = atoi(pcmfile.token); ibonded += ioffset; } else { goto L_90; } NL; if (pcmfile.state == NUMERIC) { ibondorder = atoi(pcmfile.token); } else { fprintf(stdout, "missing a bondorder, assuming 1\n"); goto L_40; } if (newatom < ibonded) make_bond(newatom, ibonded, ibondorder); if (ibondorder == 9) { atom[newatom].flags |= (1L << METCOORD_MASK); atom[ibonded].flags |= (1L << METCOORD_MASK); } NL; goto L_100; }else if ( strcmp(pcmfile.token, "P")== 0) { atom[newatom].flags |= (1L << PI_MASK); NL; goto L_90; }else if (strcmp(pcmfile.token, "D") == 0) // biomolecule marking { NL; biotype = atoi(pcmfile.token); atom[newatom].biotype = biotype; NL; goto L_90; }else if (strcmp(pcmfile.token,"M")==0) { NL; icoord = atoi(pcmfile.token); if (icoord == 0) { atom[newatom].flags |= (1L << SATMET_MASK); } else if (icoord == 2) { atom[newatom].flags |= (1L << GT18e_MASK); } else{ atom[newatom].flags |= (1L << GT18e_MASK); atom[newatom].flags |= (1L << SATMET_MASK); } NL; if (pcmfile.state != 1) goto L_90; ispin = atoi(pcmfile.token); if (ispin == 0) { atom[newatom].flags |= (1L << LOWSPIN_MASK); } else if (ispin == 1) { atom[newatom].flags |= (1L << SQPLAN_MASK); } else { atom[newatom].flags |= (1L << LOWSPIN_MASK); atom[newatom].flags |= (1L << SQPLAN_MASK); } NL; goto L_90; }else if (strcmp(pcmfile.token,"S")== 0) { NL; if (pcmfile.state == NUMERIC) { j = atoi(pcmfile.token); mask = (1L << j); NL; goto L_90; } else { goto L_90; } }else if (strcmp(pcmfile.token,"H")== 0) { atom[newatom].flags |= (1L << HBOND_MASK); NL; goto L_90; }else if (strcmp(pcmfile.token,"C")==0) { NL; atom[newatom].charge = atof(pcmfile.token); NL; goto L_90; } else if (strcmp(pcmfile.token,"ML") == 0) { NL; j = atoi(pcmfile.token); atom[newatom].molecule = j; goto L_90; }else if (strcmp(pcmfile.token,"R")== 0) { NL; atom[newatom].radius = atof(pcmfile.token); NL; goto L_90; } } else if (strncasecmp(pcmfile.token, "}",1) == 0) { goto L_170; /* end of structure */ } else if (strcmp(pcmfile.token, "FL") == 0) { NL; L_120: if (strcmp(pcmfile.token, "PRINT") == 0) { iprint = 1; NL; if (pcmfile.state == ALPHABETIC) goto L_120; iprint = atoi(pcmfile.token); NL; goto L_120; } else if (strcmp(pcmfile.token, "DIELC") == 0) { NL; if (pcmfile.state != 1) goto L_120; // units.dielec = atof(pcmfile.token); NL; goto L_120; } else if (strcmp(pcmfile.token, "UV") == 0) { NL; if (pcmfile.state != 1) goto L_120; pistuf.iuv = atoi(pcmfile.token); NL; goto L_120; } else if (strcmp(pcmfile.token, "PIPR") == 0) { NL; if (pcmfile.state != 1) goto L_120; pistuf.jprint = atoi(pcmfile.token); NL; goto L_120; } else if (strcmp(pcmfile.token, "PIPL") == 0) { NL; if (pcmfile.state != 1) goto L_120; pistuf.nplane = atoi(pcmfile.token); NL; goto L_120; } else if (strcmp(pcmfile.token, "EINT") == 0) { NL; if (pcmfile.state != 1) goto L_120; minim_values.ndc = atoi(pcmfile.token); NL; goto L_120; } } else if (strcmp(pcmfile.token, "CO") == 0) { } else if (strcmp(pcmfile.token, "FBND") == 0) { NL; ts_bondorder.fbnd[0] = atof(pcmfile.token); NL; ts_bondorder.fbnd[1] = atof(pcmfile.token); NL; ts_bondorder.fbnd[2] = atof(pcmfile.token); NL; ts_bondorder.fbnd[3] = atof(pcmfile.token); NL; ts_bondorder.fbnd[4] = atof(pcmfile.token); NL; ts_bondorder.fbnd[5] = atof(pcmfile.token); NL; ts_bondorder.fbnd[6] = atof(pcmfile.token); NL; ts_bondorder.fbnd[7] = atof(pcmfile.token); NL; ts_bondorder.fbnd[8] = atof(pcmfile.token); NL; ts_bondorder.fbnd[9] = atof(pcmfile.token); NL; ts_bondorder.fbnd[10] = atof(pcmfile.token); NL; ts_bondorder.fbnd[11] = atof(pcmfile.token); NL; ts_bondorder.fbnd[12] = atof(pcmfile.token); NL; ts_bondorder.fbnd[13] = atof(pcmfile.token); NL; ts_bondorder.fbnd[14] = atof(pcmfile.token); } else if (strcmp(pcmfile.token, "FIX") == 0) { NL; if (strcmp(pcmfile.token, "DIS") == 0) { NL; fixdis.ifxstr[fixdis.nfxstr][0] = atoi(pcmfile.token); NL; fixdis.ifxstr[fixdis.nfxstr][1] = atoi(pcmfile.token); NL; L_1223: if (strcmp(pcmfile.token, "R") == 0) { NL; fixdis.fxstrd[fixdis.nfxstr] = atof(pcmfile.token); NL; goto L_1223; } else if (strcmp(pcmfile.token, "K") == 0) { NL; fixdis.fxstrc[fixdis.nfxstr] = atof(pcmfile.token); fixdis.nfxstr +=1; NL; goto L_1223; } } } else if (strcmp(pcmfile.token, "DD") == 0) { if (isubred == 1) goto L_30; NL; if (pcmfile.state == NUMERIC) { fxtor.iatom[fxtor.nfxtor][0] = atoi(pcmfile.token); NL; fxtor.iatom[fxtor.nfxtor][1] = atoi(pcmfile.token); NL; fxtor.iatom[fxtor.nfxtor][2] = atoi(pcmfile.token); NL; fxtor.iatom[fxtor.nfxtor][3] = atoi(pcmfile.token); NL; L_150: if (strcmp(pcmfile.token, "FROM") == 0) { NL; fxtor.start_ang[fxtor.nfxtor] = atoi(pcmfile.token); fxtor.curr_ang[fxtor.nfxtor] = fxtor.start_ang[fxtor.nfxtor]; NL; goto L_150; } else if (strcmp(pcmfile.token, "TO") == 0) { NL; fxtor.final_ang[fxtor.nfxtor] = atoi(pcmfile.token); NL; goto L_150; } else if (strcmp(pcmfile.token, "BY") == 0) { NL; fxtor.step[fxtor.nfxtor] = atoi(pcmfile.token); fxtor.nfxtor++; NL; goto L_150; } } } goto L_30; L_170: fclose(pcminfile); for (i=1; i <= natom; i++) { if (atom[i].mmx_type == 5) { flags.noh = True; break; } } if (default_intype != MMX) read_atomtypes(MMX); return; }