# include "NFracSurf.h" void NPrintResidueRecord (FILE * ff, residue_record * r) { { fprintf(ff,"%7s%4d %-4s %-4s%c%4d%c","RESIDUE",r->index, "X",r->resname,r->chain,r->number,r->x_char); fprintf(ff," : %6d -> %6d : %8x %8x", r->start,r->end,r->flags,r->file); if (r->restype != NULL) { fprintf(ff," : %3s = %3d (%3d atoms)", r->restype->name,r->restype->index,r->restype->atomnum); } fprintf(ff,"\n"); if (r->ca != NULL) write_pdb_record(ff,r->ca,0); } } static void SelectTriPeptide (int SelectP, residue_record * r1,residue_record * r2, residue_record * r3) # define TRIPEP_SELECT(a,b) \ if(SelectP){\ SWITCH_OFF(a,b);\ } else {\ SWITCH_ON(a,b);\ } { int ii; if (r1 != NULL) { if (r1->ca && r1->c && r1->n && r1->o) { TRIPEP_SELECT(r1->ca,FLAG_1_DESELECT); TRIPEP_SELECT(r1->c, FLAG_1_DESELECT); TRIPEP_SELECT(r1->n, FLAG_1_DESELECT); TRIPEP_SELECT(r1->o, FLAG_1_DESELECT); TRIPEP_SELECT(r1->ca,FLAG_2_DESELECT); TRIPEP_SELECT(r1->c, FLAG_2_DESELECT); TRIPEP_SELECT(r1->n, FLAG_2_DESELECT); TRIPEP_SELECT(r1->o, FLAG_2_DESELECT); } else { STDERR("SelectTriPeptide(): r1->{ca,c,n,o} == 0"); NPrintResidueRecord(stderr,r1); } } if (r3 != NULL) { if (r3->ca && r3->c && r3->n && r3->o) { TRIPEP_SELECT(r3->ca,FLAG_1_DESELECT); TRIPEP_SELECT(r3->c, FLAG_1_DESELECT); TRIPEP_SELECT(r3->n, FLAG_1_DESELECT); TRIPEP_SELECT(r3->o, FLAG_1_DESELECT); TRIPEP_SELECT(r3->ca,FLAG_2_DESELECT); TRIPEP_SELECT(r3->c, FLAG_2_DESELECT); TRIPEP_SELECT(r3->n, FLAG_2_DESELECT); TRIPEP_SELECT(r3->o, FLAG_2_DESELECT); } else { STDERR("SelectTriPeptide(): r3->{ca,c,n,o} == 0"); NPrintResidueRecord(stderr,r3); } } if (r2 != NULL) { atom_record **atoms = r2->file->atoms ; for(ii = r2->start; ii< r2->end ; ii++) { atom_record *a = atoms[ii] ; TRIPEP_SELECT(a,FLAG_1_DESELECT); TRIPEP_SELECT(a,FLAG_2_DESELECT); } } # undef TRIPEP_SELECT } static void Find_FracSurf_ForTriPeptide (residue_record * r1,residue_record * r2, residue_record * r3, double probe) { int ii; SelectTriPeptide(1,r1,r2,r3); # ifdef OFF PrintAtomFlags(r2->ca); write_pdb_file(stderr,r2->file,IO_SHORT|IO_ONLY_SELECTED); # endif calculate_surface(r2->file,probe); if (r2 != NULL) { atom_record **atoms = r2->file->atoms ; int ii; for(ii = r2->start; ii< r2->end ; ii++) { atom_record *a = atoms[ii] ; a->occ = a->surface ; /* ->occ = ->v[4] = GXG_ASA */ } } SelectTriPeptide(0,r1,r2,r3); } void Find_FracSurf_ForFile (file_records * f, double probe, double FracThresh, double SurfThresh) { int ii,jj; int n = f->atomnum ; FlagOffEverywhere(f,FLAG_1_DESELECT); FlagOnForWaters(f,FLAG_1_DESELECT); FlagOffEverywhere(f,FLAG_2_DESELECT); FlagOnForWaters(f,FLAG_2_DESELECT); SCALAR_TO_ATOM_VECTS(f->atoms,occ,n,-2); SCALAR_TO_ATOM_VECTS(f->atoms,b,n,-2); SCALAR_TO_ATOM_VECTS(f->atoms,surface,n,-2); SCALAR_TO_ATOM_VECTS(f->atoms,volume,n,-2); /* ->occ = ->b = ->volume = ->surface = -1 */ calculate_surface(f,probe); /* ->volume = ->v[7] = ASA */ COPY_ATOM_VECTS_1TO2(f->atoms,surface,f->atoms,volume,n); SCALAR_TO_ATOM_VECTS(f->atoms,surface,n,-3); { int * resnum_vector = f->resnum ; residue_record ***residues = f->residues ; residue_record * PreviousResidue = NULL ; FlagOnEverywhere(f,FLAG_1_DESELECT); FlagOnEverywhere(f,FLAG_2_DESELECT); for(ii =0 ; ii< 128; ii++) { int limit = resnum_vector[ii] ; # ifdef OFF fprintf(stderr,"ii = %4c = %d limit = %4d\n",ii,ii,limit); # endif if(limit > 2) { residue_record **chain_residues = residues[ii] ; assert(chain_residues[0]->file = f); for(jj = 1 ; jj< limit -1 ; jj++) { Find_FracSurf_ForTriPeptide (chain_residues[jj-1],chain_residues[jj],chain_residues[jj+1],probe); } Find_FracSurf_ForTriPeptide(NULL,chain_residues[0],chain_residues[1],probe); Find_FracSurf_ForTriPeptide (chain_residues[limit-2],chain_residues[limit-1],NULL,probe); } } } for (ii=0; iiatomnum; ii++) { atom_record * a = f->atoms[ii]; a->dumm_solvents = 0; a->surface = a->occ ; if (a->surface == -2 || a->volume == -2) { a->occ = -1 ; } else { if (a->surface != 0) { a->b = a->volume / a->surface ; /* ->b = ->v[5] = FracSurf */ } else { a->b = 0 ; } if (a->volume <= SurfThresh) { a->occ = 1; } else { if (a->b < FracThresh) { a->occ = 2 ; } else { a->occ = 3 ; } } } } }