#include "pdb.h" void shift_atom(atom_record * atom, double * minmax,int index) { atom->x -= minimum_x; atom->y -= minimum_y; atom->z -= minimum_z; } void record_atom_in_grid(atom_record *atom, grid_descriptor *gd,int index) { double edge = gd->edge ; int xplace = (int)rint((atom->x - gd->origx)/edge) ; int yplace = (int)rint((atom->y - gd->origy)/edge) ; int zplace = (int)rint((atom->z - gd->origz)/edge) ; int zdim = gd->zdim; int ydim = gd->ydim; int ta , tb ; atom_record **grid = gd->grid ; if (atom->flags & IGNORE_ATOM) return ; ta= xplace * ydim + yplace; tb = ta * zdim + zplace ; atom->chaining = grid[tb] ; grid[tb] = atom ; } grid_descriptor * gridify (file_records *file,double edge ,double margin) { minimum_x -= margin; minimum_y -= margin; minimum_z -= margin; maximum_x += margin; maximum_y += margin; maximum_z += margin; { int xdim = (int)ceil((maximum_x - minimum_x) /edge) ; int ydim = (int)ceil((maximum_y - minimum_y) /edge) ; int zdim = (int)ceil((maximum_z - minimum_z) /edge) ; atom_record **newgrid = (atom_record **) malloc_and_zero (xdim * ydim *zdim * sizeof(atom_record *)) ; grid_descriptor * gd = (grid_descriptor *) malloc(sizeof (grid_descriptor)) ; gd->xdim = xdim; gd->ydim = ydim; gd->zdim = zdim; gd->origx = minimum_x ; gd->origy = minimum_y ; gd->origz = minimum_z ; gd->yzdim = ydim * zdim; gd->edge = edge ; gd->grid = newgrid ; traverse_file_atom_records(file, record_atom_in_grid, gd) ; return gd ; } } void traverse_grid(grid_descriptor *gd, void(*function)(), int inset) { int xx = inset; int yy = inset; int zz = inset; GRID_SLOTS(gd) int xyzdim = xdim * yzdim ; int limx = xdim - inset ; int limy = ydim - inset ; int limz = zdim - inset ; int xa,ya,za ; for (xa = inset * yzdim; xa < limx * yzdim ; xa += yzdim) { yy = inset ; for (ya = inset * zdim +xa ; ya < xa + limy * zdim; ya += zdim) { zz = inset ; for (za = inset +ya ; za < ya + limz ; za ++ ) { (*function)(gd, xx,yy,zz) ; zz++; } yy++ ; } xx ++ ; } } void free_grid(grid_descriptor *gd) { free(gd->grid) ; free(gd) ; }