📄 score.c
字号:
( contact, label, molecule, &grid->receptor, atom, rec_atom, &score ); inter->total += score; }}/* ///////////////////////////////////////////////////////////////Routine to compute the intramolecular contact scorebetween two ligand atoms.2/97 te/////////////////////////////////////////////////////////////// */void calc_intra_contact( SCORE_CONTACT *contact, LABEL *label, MOLECULE *molecule, int atomi, int atomj, SCORE_PART *intra){ float score; calc_pairwise_contact ( contact, label, molecule, molecule, atomi, atomj, &score ); intra->total += score;}/* ///////////////////////////////////////////////////////////////Routine to compute the contact score between any two atoms.2/97 te/////////////////////////////////////////////////////////////// */void calc_pairwise_contact( SCORE_CONTACT *contact, LABEL *label, MOLECULE *origin, MOLECULE *target, int origin_atom, int target_atom, float *score){ float reference; float sq_distance; if ( origin->atom[origin_atom].heavy_flag && target->atom[target_atom].heavy_flag && ((sq_distance = square_distance (origin->coord[origin_atom], target->coord[target_atom])) < SQR (contact->distance)) ) { reference = contact->clash_overlap * (label->vdw.member[origin->atom[origin_atom].vdw_id].radius + label->vdw.member[target->atom[target_atom].vdw_id].radius); if (sq_distance < SQR (reference)) *score = contact->clash_penalty; else *score = -1; } else *score = 0;}/* ///////////////////////////////////////////////////////////////Routine to add contact score components.2/97 te/////////////////////////////////////////////////////////////// */void sum_contact( SCORE_PART *sum, SCORE_PART *increment){ sum->total += increment->total;}/* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Routine to compute the intermolecular energy score betweena ligand atom and the receptor.2/97 te/////////////////////////////////////////////////////////////// */void calc_inter_energy( SCORE_GRID *grid, SCORE_ENERGY *energy, LABEL *label, MOLECULE *molecule, int atom, SCORE_PART *inter){ if (!energy->vdw_init_flag) initialize_vdw_energy (energy, &label->vdw); if (label->vdw.member[molecule->atom[atom].vdw_id].well_depth != 0.0) { if (grid->flag) calc_inter_energy_grid (grid, energy, label, molecule, atom, inter); else calc_inter_score_cont ( grid, (void *) energy, energy->distance, (void (*)()) calc_inter_energy_cont, label, molecule, atom, inter ); }}/* ///////////////////////////////////////////////////////////////Routine to initialize vdw parameters.2/97 te/////////////////////////////////////////////////////////////// */void initialize_vdw_energy( SCORE_ENERGY *energy, LABEL_VDW *label_vdw){ int i; if (!label_vdw->init_flag) get_vdw_labels (label_vdw); ecalloc ( (void **) &energy->vdwA, label_vdw->total, sizeof (float), "energy vdwA terms", global.outfile ); ecalloc ( (void **) &energy->vdwB, label_vdw->total, sizeof (float), "energy vdwB terms", global.outfile ); for (i = 0; i < label_vdw->total; i++) { energy->vdwA[i] = sqrt (label_vdw->member[i].well_depth * (float) energy->attractive_exponent / (float) (energy->repulsive_exponent - energy->attractive_exponent) * pow (2 * label_vdw->member[i].radius, energy->repulsive_exponent)); energy->vdwB[i] = sqrt (label_vdw->member[i].well_depth * (float) energy->repulsive_exponent / (float) (energy->repulsive_exponent - energy->attractive_exponent) * pow (2 * label_vdw->member[i].radius, energy->attractive_exponent)); } energy->dielectric_factor = 332.0 / energy->dielectric_factor; energy->vdw_init_flag = TRUE;}/* /////////////////////////////////////////////////////////////// */void free_vdw_energy (SCORE_ENERGY *energy){ efree ((void **) &energy->vdwA); efree ((void **) &energy->vdwB);}/* ///////////////////////////////////////////////////////////////Routine to compute the intermolecular energy score using a precomputed grid.2/97 te/////////////////////////////////////////////////////////////// */void calc_inter_energy_grid( SCORE_GRID *grid, SCORE_ENERGY *energy, LABEL *label, MOLECULE *molecule, int atom, SCORE_PART *inter){ int index[8]; int out_flag; XYZ cube_coord; void get_index_ (XYZ, XYZ, float *, int *, int *, int *, float *); float get_value_ (float *, XYZ, int *); if (label->vdw.member[molecule->atom[atom].vdw_id].well_depth != 0.0) { get_index_ ( molecule->coord[atom], grid->origin, &grid->spacing, grid->span, &out_flag, index, cube_coord ); if (out_flag == 0) { inter->vdw += ( energy->vdwA[molecule->atom[atom].vdw_id] * get_value_(energy->avdw, cube_coord, index) - energy->vdwB[molecule->atom[atom].vdw_id] * get_value_(energy->bvdw, cube_coord, index) ) * energy->scale_vdw; inter->electro += molecule->atom[atom].charge * get_value_(energy->es, cube_coord, index) * energy->scale_electro; inter->total = inter->vdw + inter->electro; } }}/* ///////////////////////////////////////////////////////////////Routine to compute the intermolecular energy score in a continuousfashion given a ligand atom and a receptor atom.2/97 te/////////////////////////////////////////////////////////////// */void calc_inter_energy_cont( SCORE_GRID *grid, SCORE_ENERGY *energy, LABEL *label, MOLECULE *molecule, int atom, int rec_atom, SCORE_PART *inter){ float vdwA, vdwB, electro; if (label->vdw.member[grid->receptor.atom[rec_atom].vdw_id].well_depth != 0.0) { calc_pairwise_energy ( energy, label, molecule, &grid->receptor, atom, rec_atom, &vdwA, &vdwB, &electro ); inter->vdw += (vdwA - vdwB) * energy->scale_vdw; inter->electro += electro * energy->scale_electro; inter->total = inter->vdw + inter->electro; }}/* ///////////////////////////////////////////////////////////////Routine to compute the intramolecular energy scorebetween two ligand atoms.2/97 te/////////////////////////////////////////////////////////////// */void calc_intra_energy( SCORE_ENERGY *energy, LABEL *label, MOLECULE *molecule, int atomi, int atomj, SCORE_PART *intra){ float vdwA, vdwB, electro; calc_pairwise_energy ( energy, label, molecule, molecule, atomi, atomj, &vdwA, &vdwB, &electro ); intra->vdw += (vdwA - vdwB) * energy->scale_vdw; intra->electro += electro * energy->scale_electro; intra->total = intra->vdw + intra->electro;/* fprintf (global.outfile, "%s %s %f\n", molecule->atom[atomi].name, molecule->atom[atomj].name, vdwA - vdwB + electro);*/}/* ///////////////////////////////////////////////////////////////Routine to compute the energy score between any two atoms.2/97 te/////////////////////////////////////////////////////////////// */void calc_pairwise_energy( SCORE_ENERGY *energy, LABEL *label, MOLECULE *origin, MOLECULE *target, int origin_atom, int target_atom, float *vdwA, float *vdwB, float *electro){ int power_exponent; float power_distance; float distance; int square_flag = TRUE; if (!energy->vdw_init_flag) initialize_vdw_energy (energy, &label->vdw); if ( (label->vdw.member[origin->atom[origin_atom].vdw_id].well_depth != 0.0) && (label->vdw.member[target->atom[target_atom].vdw_id].well_depth != 0.0) && ((distance = square_distance (origin->coord[origin_atom], target->coord[target_atom])) <= SQR (energy->distance)) ) { distance = 1.0 / MAX (distance, DISTANCE_MIN); if (energy->repulsive_exponent % 2) { power_exponent = energy->repulsive_exponent; distance = sqrt (distance); square_flag = FALSE; } else power_exponent = energy->repulsive_exponent / 2; POWER (distance, power_exponent, power_distance); *vdwA = energy->vdwA[origin->atom[origin_atom].vdw_id] * energy->vdwA[target->atom[target_atom].vdw_id] * power_distance; if (square_flag == TRUE) { if (energy->repulsive_exponent % 2) { power_exponent = energy->attractive_exponent; distance = sqrt (distance); square_flag = FALSE; } else power_exponent = energy->attractive_exponent / 2; } else power_exponent = energy->attractive_exponent; POWER (distance, power_exponent, power_distance); *vdwB = energy->vdwB[origin->atom[origin_atom].vdw_id] * energy->vdwB[target->atom[target_atom].vdw_id] * power_distance; *electro = energy->dielectric_factor * origin->atom[origin_atom].charge * target->atom[target_atom].charge * (energy->distance_dielectric == TRUE ? (square_flag == TRUE ? distance : SQR (distance)) : (square_flag == TRUE ? sqrt (distance) : distance)); } else *vdwA = *vdwB = *electro = 0;}/* ///////////////////////////////////////////////////////////////Routine to add energy score components.2/97 te/////////////////////////////////////////////////////////////// */void sum_energy( SCORE_PART *sum, SCORE_PART *increment){ sum->vdw += increment->vdw; sum->electro += increment->electro; sum->total = sum->vdw + sum->electro;}/* /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Routine to compute the intermolecular chemical score betweena ligand atom and the receptor.2/97 te
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -