label_vdw.c

来自「最经典的分子对结软件」· C语言 代码 · 共 429 行

C
429
字号
/*                                                                    *//*                        Copyright UCSF, 1997                        *//*                                                                    *//*Written by Todd Ewing10/95*/#include "define.h"#include "utility.h"#include "mol.h"#include "global.h"#include "label_node.h"#include "label_vdw.h"/* ==================================================================== */void get_vdw_labels (LABEL_VDW *label_vdw){  int i, definition_total, definition_count;  STRING100 line, model;  FILE *vdw_file;  label_vdw->init_flag = TRUE;  vdw_file = efopen (label_vdw->file_name, "r", global.outfile);/** Count up the number of label_vdw->member declarations and definitions,* then allocate memory* 6/95 te*/  label_vdw->total = 1;  definition_count = 0;  while (fgets (line, 100, vdw_file) != NULL)  {    if (!strncmp (line, "name", 4))      label_vdw->total++;    if (!strncmp (line, "definition", 10))      definition_count++;  }  rewind (vdw_file);  definition_total = definition_count;  ecalloc  (    (void **) &label_vdw->member,    label_vdw->total,    sizeof (VDW_MEMBER),    "label_vdw->member structures",    global.outfile  );  ecalloc  (    (void **) &label_vdw->definition,    definition_count,    sizeof (NODE),    "atom label_vdw->member definitions",    global.outfile  );/** Read in the atom label_vdw->member definitions* 6/95 te*/  strcpy (label_vdw->member[0].name, "null");  for (i = 0; i < label_vdw->total; i++)    label_vdw->member[i].valence = INT_MAX;  label_vdw->total = 1;  definition_count = definition_total = 0;  while (fgets (line, 100, vdw_file) != NULL)  {/**   Process label_vdw->member declaration*   6/95 te*/    if (!strncmp (line, "name", 4))    {      label_vdw->member[label_vdw->total - 1].definition_total =        definition_total;      definition_total = 0;      label_vdw->member[label_vdw->total].definition =        &label_vdw->definition[definition_count];      if (sscanf (line, "%*s %s", label_vdw->member[label_vdw->total].name) < 1)      {        fprintf (global.outfile, "Incomplete vdw member declaration.\n");        exit (EXIT_FAILURE);      }      label_vdw->total++;    }    else if (!strncmp (line, "atom_model", 10))    {      if (sscanf (line, "%*s %s", model) != 1)      {        fprintf (global.outfile, "Incomplete atom_model specification.\n");        exit (EXIT_FAILURE);      }      label_vdw->member[label_vdw->total - 1].atom_model = tolower (model[0]);      if ((label_vdw->member[label_vdw->total - 1].atom_model != 'a') &&        (label_vdw->member[label_vdw->total - 1].atom_model != 'u') &&        (label_vdw->member[label_vdw->total - 1].atom_model != 'e'))      {        fprintf (global.outfile,          "Atom_model specification restricted to ALL, UNITED, or EITHER.\n");        exit (EXIT_FAILURE);      }    }    else if (!strncmp (line, "heavy_flag", 8))    {      if (sscanf (line, "%*s %d",        &label_vdw->member[label_vdw->total - 1].heavy_flag) != 1)      {        fprintf (global.outfile, "Incomplete heavy_flag specification.\n");        exit (EXIT_FAILURE);      }    }    else if (!strncmp (line, "radius", 6))    {      if (sscanf (line, "%*s %f",        &label_vdw->member[label_vdw->total - 1].radius) != 1)      {        fprintf (global.outfile, "Incomplete radius specification.\n");        exit (EXIT_FAILURE);      }    }    else if (!strncmp (line, "well_depth", 10))    {      if (sscanf (line, "%*s %f",        &label_vdw->member[label_vdw->total - 1].well_depth) != 1)      {        fprintf (global.outfile, "Incomplete well_depth specification.\n");        exit (EXIT_FAILURE);      }    }    else if (!strncmp (line, "valence", 7))    {      if (sscanf (line, "%*s %d",        &label_vdw->member[label_vdw->total - 1].valence) != 1)      {        fprintf (global.outfile, "Incomplete valence specification.\n");        exit (EXIT_FAILURE);      }    }/**   Process label_vdw->member definition*   6/95 te*/    else if (!strncmp (line, "definition", 10))    {      strtok (white_line (line), " ");      if (!assign_node        (&label_vdw->definition[definition_count], TRUE))      {        fprintf (global.outfile,          "Error assigning vdw member definitions.\n");        exit (EXIT_FAILURE);      }      definition_count++;      definition_total++;    }  }/** Update last label_vdw->member info also* 6/95 te*/  label_vdw->member[label_vdw->total - 1].definition_total = definition_total;  efclose (&vdw_file);/** Calculate parameters* 6/95 te*/  for (i = 0; i < label_vdw->total; i++)  {    if (label_vdw->member[i].heavy_flag)      label_vdw->member[i].bump_id =        NINT (10.0 * label_vdw->member[i].radius);    else      label_vdw->member[i].bump_id = 0;  }/** Print out the label_vdw->member and their definitions* 6/95 te*//*  if (global.output_volume == 'v')  {    fprintf (global.outfile, "\n____VDW_Label_Definitions____\n\n");    for (i = 1; i < label_vdw->total; i++)    {      MFPUTC ('_', 40);      fprintf (global.outfile, "\n");      fprintf (global.outfile, "%-20s%s\n", "name",        label_vdw->member[i].name);      fprintf (global.outfile, "%-20s%8c\n", "atom_model",        label_vdw->member[i].atom_model);      fprintf (global.outfile, "%-20s%8.3f\n", "radius",        label_vdw->member[i].radius);      fprintf (global.outfile, "%-20s%8.3f\n", "well_depth",        label_vdw->member[i].well_depth);      fprintf (global.outfile, "%-20s%8d\n", "heavy_flag",        label_vdw->member[i].heavy_flag);      fprintf (global.outfile, "%-20s%8d\n", "bump_id",        label_vdw->member[i].bump_id);      fprintf (global.outfile, "\n");      for (j = 0; j < label_vdw->member[i].definition_total; j++)      {        fprintf (global.outfile, "%-20s", "definition");        print_node (&label_vdw->member[i].definition[j], 0);        fprintf (global.outfile, "\n");      }      fprintf (global.outfile, "\n");    }    fprintf (global.outfile, "\n\n");  }*/}/* ////////////////////////////////////////////////////////////////////// */void free_vdw_labels (LABEL_VDW *label_vdw){  int i, j;  for (i = 0; i < label_vdw->total; i++)    for (j = 0; j < label_vdw->member[i].definition_total; j++)      free_node (&label_vdw->member[i].definition[j]);  efree ((void **) &label_vdw->member);  efree ((void **) &label_vdw->definition);}/* ////////////////////////////////////////////////////////////////////// */int assign_vdw_labels(  LABEL_VDW *label_vdw,  int atom_model,  MOLECULE *molecule){  int i, j, k;  int vdw_assigned = FALSE;  if (!label_vdw->init_flag)    get_vdw_labels (label_vdw);  for (i = 0; i < molecule->total.atoms; i++)  {    for (j = 1; j < label_vdw->total; j++)    {      if ((atom_model == 'a') &&        (label_vdw->member[j].atom_model == 'u'))          continue;      if ((atom_model == 'u') &&        (label_vdw->member[j].atom_model == 'a'))          continue;      for (k = 0; k < label_vdw->member[j].definition_total; k++)        if (check_atom          (molecule, i, &label_vdw->member[j].definition[k]))        {          molecule->atom[i].vdw_id = j;          vdw_assigned = TRUE;        }    }    if (!vdw_assigned)    {      fprintf (global.outfile,        "WARNING assign_vdw_labels: "        "No vdw parameters for %1d %s %s %1d %s %s.\n",        i + 1, molecule->atom[i].name, molecule->atom[i].type,        molecule->atom[i].subst_id,        molecule->subst[molecule->atom[i].subst_id].name,        molecule->info.name);      return NULL;    }    if (molecule->atom[i].neighbor_total >       label_vdw->member[molecule->atom[i].vdw_id].valence)    {      for (j = k = 0; j < molecule->atom[i].neighbor_total; j++)        if (strcmp (molecule->atom[molecule->atom[i].neighbor[j].id].type, "LP")          &&          strcmp (molecule->atom[molecule->atom[i].neighbor[j].id].type, "Du"))          k++;      if (k > label_vdw->member[molecule->atom[i].vdw_id].valence)      {        fprintf (global.outfile,          "WARNING assign_vdw_labels: Atom valence violated for "          "%s %s %s %d %s %d.\n",          molecule->info.name,          molecule->info.comment,          molecule->subst[molecule->atom[i].subst_id].name,          molecule->atom[i].subst_id + 1,          molecule->atom[i].name, i + 1);        return FALSE;      }    }/**   Check to see if partial charge should be transferred from an atom*   that is excluded from the current model (ie. aliphatic hydrogen in*   a united atom model) to one that is*   6/95 te*/    if ((atom_model == 'u') &&      (ABS (label_vdw->member[molecule->atom[i].vdw_id].well_depth) < 0.00001))    {      if (molecule->atom[i].neighbor_total == 1)      {        molecule->atom[molecule->atom[i].neighbor[0].id].charge +=          molecule->atom[i].charge;        molecule->atom[i].charge = 0.0;      }      else      {        fprintf (global.outfile,          "WARNING assign_vdw_labels: "          "Unable to transfer partial charge away from "          "%s %s %s %d %s %d.\n",          molecule->info.name,          molecule->info.comment,          molecule->subst[molecule->atom[i].subst_id].name,          molecule->atom[i].subst_id + 1,          molecule->atom[i].name, i + 1);        molecule->atom[i].charge = 0.0;      }    }  }  for (i = molecule->transform.heavy_total = 0; i < molecule->total.atoms; i++)  {    molecule->atom[i].heavy_flag =      label_vdw->member[molecule->atom[i].vdw_id].heavy_flag;    if (molecule->atom[i].heavy_flag == TRUE)      molecule->transform.heavy_total++;  }  if (global.output_volume == 'v')  {    fprintf (global.outfile, "____VDW_Assignments____\n");    fprintf (global.outfile, "%s:\n\n", molecule->info.name);    for (i = 0; i < molecule->total.atoms; i++)      fprintf (global.outfile, "%6d %4s %5s %-20s %d %d\n", i + 1,        molecule->atom[i].name,        molecule->atom[i].type,        label_vdw->member[molecule->atom[i].vdw_id].name,        molecule->atom[i].heavy_flag,        label_vdw->member[molecule->atom[i].vdw_id].bump_id);    fprintf (global.outfile, "\n\n");  }  return TRUE;}/* ////////////////////////////////////////////////////////////////////// */int count_heavies(  MOLECULE	*molecule,  int		segment_id){  int i;  int heavy_total;  if (segment_id == NEITHER)  {    for (i = heavy_total = 0; i < molecule->total.atoms; i++)      if (molecule->atom[i].heavy_flag)        heavy_total++;    return heavy_total;  }  else if ((segment_id >= 0) && (segment_id < molecule->total.segments))  {    for    (      i = heavy_total = 0;      i < molecule->segment[segment_id].atom_total;      i++    )      if (molecule->atom[molecule->segment[segment_id].atom[i]].heavy_flag)        heavy_total++;    return heavy_total;  }  else    return NEITHER;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?