#include "pdb.h" int buried_min_sides = -1 ; double buried_radius = 6.0 ; double buried_middle_position_ratio = 3 ; static double middle_position_raduis ; static void (*buried_function) () ; void check_if_buried (atom_record *atom,atom_record **neibours, int count) { int sides[27] = {0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0} ; int ii ; double x = atom->x ; double y = atom->y ; double z = atom->z ; double lowx = x - middle_position_raduis ; double highx = x + middle_position_raduis ; double lowy = y - middle_position_raduis ; double highy = y + middle_position_raduis ; double lowz = z - middle_position_raduis ; double highz = z + middle_position_raduis ; for(ii = 0 ; ii< count ; ii++) { atom_record * neibour = neibours[ii] ; if (PROTEIN_ATOM_P(neibour)) { double nx = neibour->x; double ny = neibour->y; double nz = neibour->z; int index = nx < lowx ? 0 : (nx < highx ? 9 : 18 ) ; if(ny > highy ) index += 6; else if (ny > lowy) index += 3 ; if(nz > highz ) index += 2; else if (nz > lowz) index += 1 ; sides[index] = 1 ; } } { int sum =0 ; for(ii = 0 ; ii < 27; ii++) if (sides[ii]) sum++ ; if (sum >= buried_min_sides) { SWITCH_ON(atom,BURIED_WATER) ; if (buried_function != NULL) (*buried_function)(atom) ; } else SWITCH_OFF(atom,BURIED_WATER) ; } } void initialize_buried_check() { buried_min_sides = 18 ; SET_INT_FROM_OPTION(buried_min_sides,"bmin_sides") ; SET_DOUBLE_FROM_OPTION (buried_middle_position_ratio, "bmiddle") ; SET_DOUBLE_FROM_OPTION (buried_radius, "bradius") ; } void traverse_buried_water(file_records *file,void (*function) ()) { double old_distance_check = distance_check ; buried_function = function ; if(buried_min_sides < 0) buried_min_sides = 18 ; distance_check = buried_radius ; middle_position_raduis =distance_check / buried_middle_position_ratio ; setup_neibouring_cube(file, distance_check) ; traverse_file_water_atoms(file,always_call_with_neibours,check_if_buried) ; distance_check = old_distance_check ; } void flag_buried_water(file_records *file) { traverse_buried_water(file , NULL) ; } void dont_ignore_atom(atom_record *atom) { SWITCH_OFF(atom,IGNORE_ATOM) ; } void dont_ignore_buried_water(file_records *file) { traverse_buried_water(file , dont_ignore_atom) ; }