void analyse(t_atoms *atoms,t_blocka *gb,char ***gn,bool bASK,bool bVerb) { t_aa_names *aan; eRestp *restp; char *resnm; atom_id *aid; int nra; int i; size_t j; if (bVerb) printf("Analysing residue names:\n"); snew(restp,atoms->nres); aid=mk_aid(atoms,restp,etOther,&nra,TRUE); add_grp(gb,gn,nra,aid,"System"); sfree(aid); aan = get_aa_names(); for(i=0; (i<atoms->nres); i++) { resnm = *atoms->resinfo[i].name; if ((restp[i] == etOther) && is_protein(aan,resnm)) restp[i] = etProt; if (restp[i] == etOther) for(j=0; (j<NDNA); j++) { if (strcasecmp(Sugars[j],resnm) == 0) restp[i] = etDNA; } } p_status(atoms->nres,restp,bVerb); done_aa_names(&aan); /* Protein */ aid=mk_aid(atoms,restp,etProt,&nra,TRUE); if (nra > 0) analyse_prot(restp,atoms,gb,gn,bASK,bVerb); sfree(aid); /* Non-Protein */ aid=mk_aid(atoms,restp,etProt,&nra,FALSE); if ((nra > 0) && (nra < atoms->nr)) add_grp(gb,gn,nra,aid,"Non-Protein"); sfree(aid); /* DNA */ aid=mk_aid(atoms,restp,etDNA,&nra,TRUE); if (nra > 0) { add_grp(gb,gn,nra,aid,"DNA"); analyse_dna(restp,atoms,gb,gn,bASK,bVerb); } sfree(aid); /* Other */ analyse_other(restp,atoms,gb,gn,bASK,bVerb); aid=mk_aid(atoms,restp,etOther,&nra,TRUE); if ((nra > 0) && (nra < atoms->nr)) add_grp(gb,gn,nra,aid,"Other"); sfree(aid); sfree(restp); }
void analyse(t_atoms *atoms,t_blocka *gb,char ***gn,gmx_bool bASK,gmx_bool bVerb) { gmx_residuetype_t rt; char *resnm; atom_id *aid; const char ** restype; int nra; int i,k; size_t j; int ntypes; char * p; const char ** p_typename; int iwater,iion; int nwater,nion; int found; if (bVerb) { printf("Analysing residue names:\n"); } /* Create system group, every single atom */ snew(aid,atoms->nr); for(i=0;i<atoms->nr;i++) { aid[i]=i; } add_grp(gb,gn,atoms->nr,aid,"System"); sfree(aid); /* For every residue, get a pointer to the residue type name */ gmx_residuetype_init(&rt); snew(restype,atoms->nres); ntypes = 0; p_typename = NULL; for(i=0;i<atoms->nres;i++) { resnm = *atoms->resinfo[i].name; gmx_residuetype_get_type(rt,resnm,&(restype[i])); /* Note that this does not lead to a N*N loop, but N*K, where * K is the number of residue _types_, which is small and independent of N. */ found = 0; for(k=0;k<ntypes && !found;k++) { found = !strcmp(restype[i],p_typename[k]); } if(!found) { srenew(p_typename,ntypes+1); p_typename[ntypes++] = strdup(restype[i]); } } if (bVerb) { p_status(restype,atoms->nres,p_typename,ntypes); } for(k=0;k<ntypes;k++) { aid=mk_aid(atoms,restype,p_typename[k],&nra,TRUE); /* Check for special types to do fancy stuff with */ if(!gmx_strcasecmp(p_typename[k],"Protein") && nra>0) { sfree(aid); /* PROTEIN */ analyse_prot(restype,atoms,gb,gn,bASK,bVerb); /* Create a Non-Protein group */ aid=mk_aid(atoms,restype,"Protein",&nra,FALSE); if ((nra > 0) && (nra < atoms->nr)) { add_grp(gb,gn,nra,aid,"non-Protein"); } sfree(aid); } else if(!gmx_strcasecmp(p_typename[k],"Water") && nra>0) { add_grp(gb,gn,nra,aid,p_typename[k]); /* Add this group as 'SOL' too, for backward compatibility with older gromacs versions */ add_grp(gb,gn,nra,aid,"SOL"); sfree(aid); /* Solvent, create a negated group too */ aid=mk_aid(atoms,restype,"Water",&nra,FALSE); if ((nra > 0) && (nra < atoms->nr)) { add_grp(gb,gn,nra,aid,"non-Water"); } sfree(aid); } else if(nra>0) { /* Other groups */ add_grp(gb,gn,nra,aid,p_typename[k]); sfree(aid); analyse_other(restype,atoms,gb,gn,bASK,bVerb); } } sfree(p_typename); sfree(restype); gmx_residuetype_destroy(rt); /* Create a merged water_and_ions group */ iwater = -1; iion = -1; nwater = 0; nion = 0; for(i=0;i<gb->nr;i++) { if(!gmx_strcasecmp((*gn)[i],"Water")) { iwater = i; nwater = gb->index[i+1]-gb->index[i]; } else if(!gmx_strcasecmp((*gn)[i],"Ion")) { iion = i; nion = gb->index[i+1]-gb->index[i]; } } if(nwater>0 && nion>0) { srenew(gb->index,gb->nr+2); srenew(*gn,gb->nr+1); (*gn)[gb->nr] = strdup("Water_and_ions"); srenew(gb->a,gb->nra+nwater+nion); if(nwater>0) { for(i=gb->index[iwater];i<gb->index[iwater+1];i++) { gb->a[gb->nra++] = gb->a[i]; } } if(nion>0) { for(i=gb->index[iion];i<gb->index[iion+1];i++) { gb->a[gb->nra++] = gb->a[i]; } } gb->nr++; gb->index[gb->nr]=gb->nra; } }