io_ligand.c

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

C
550
字号
/*                                                                    *//*                        Copyright UCSF, 1997                        *//*                                                                    *//*Written by Todd Ewing10/95*/#include "define.h"#include "utility.h"#include "mol.h"#include "global.h"#include "dock.h"#include "search.h"#include "label.h"#include "score.h"#include "score_dock.h"#include "io.h"#include "mol_prep.h"#include "io_ligand.h"#include "transform.h"#include "rotrans.h"/* ////////////////////////////////////////////////////////////// */int get_ligand(  DOCK *dock,  SCORE *score,  LABEL *label,  MOLECULE *lig_ref,  MOLECULE *lig_init,  int need_bonds,  int chemical_label,  int vdw_label){  int return_value;  FILE_NAME ready_file_name;  FILE *ready_file, *quit_file;/** Perform parallel client operations, if necessary* 10/95 te*/  if (dock->parallel.flag && !dock->parallel.server)  {/**   If the ligand file has already been open, then close it now*   11/96 te*/    if (dock->ligand_file != NULL)    {      fclose (dock->ligand_file);      remove (dock->ligand_file_name);    }/**   Announce that we are ready to accept a job*   10/95 te*/    sprintf (dock->ligand_file_name, "%s_%s.ptr",      dock->parallel.server_name,      dock->parallel.client_name[0]);    sprintf (ready_file_name, "%s.ready", dock->parallel.client_name[0]);    ready_file = rfopen (ready_file_name, "w", global.outfile);    fclose (ready_file);  /**   Wait until the ready file has been removed by the server*   10/95 te*/    while (ready_file = fopen (ready_file_name, "r"))    {      fclose (ready_file);      if (quit_file = fopen (dock->quit_file_name, "r"))      {        fclose (quit_file);        remove (ready_file_name);        remove (dock->ligand_file_name);        return EOF;      }    }    dock->ligand_file = rfopen (dock->ligand_file_name, "r", global.outfile);  }/** Reset molecule data structure* 2/96 te*/  reset_molecule (lig_ref);  lig_ref->info.file_position = ftell (dock->ligand_file);/** Read in coordinates of molecule* 6/95 te*/  return_value =    read_molecule    (      lig_ref,      lig_init,      dock->ligand_file_name,      dock->ligand_file,      !label->chemical.screen.process_flag    );  if (return_value != TRUE)    return return_value;/** Prepare molecule for docking* 6/95 te*/  if (!label->chemical.screen.process_flag &&    ((return_value =      prepare_molecule      (        lig_init,        dock->ligand_file_name,        dock->ligand_file,        label,        score->energy.atom_model,        need_bonds,        chemical_label,        vdw_label      )) != TRUE))    return return_value;/** Check number of heavy atoms* 6/96 te*/  if (dock->multiple_ligands && vdw_label &&    ((lig_init->transform.heavy_total > dock->max_heavies) ||    (lig_init->transform.heavy_total < dock->min_heavies)))  {    if (global.output_volume != 't')      fprintf (global.outfile, "Skipped %s (%d heavy atoms).\n",        lig_init->info.name, lig_init->transform.heavy_total);    return NULL;  }  return TRUE;}/* ////////////////////////////////////////////////////////////////// */int write_ligand(  DOCK *dock,  SCORE *score,  MOLECULE *molecule,  FILE_NAME input_molecule_file_name,  FILE *molecule_file){  int i;  char *molecule_file_name;  FILE_NAME ready_file_name, delegate_file_name;  FILE *ready_file, *quit_file;/** Perform parallel server operations* 10/95 te*/  if (dock->parallel.server)  {/**   Look for a client that is ready to process a molecule*   10/95 te*/    for (molecule_file_name = NULL; !molecule_file_name;)    {      for (i = 0; i < dock->parallel.client_total; i++)      {        sprintf (ready_file_name, "%s.ready", dock->parallel.client_name[i]);          if (ready_file = fopen (ready_file_name, "r"))        {          fclose (ready_file);          sprintf            (delegate_file_name, "%s_%s.ptr",            dock->parallel.server_name, dock->parallel.client_name[i]);          molecule_file_name = delegate_file_name;          molecule_file = rfopen (molecule_file_name, "w", global.outfile);          break;        }      }      if (quit_file = fopen (dock->quit_file_name, "r"))      {        fclose (quit_file);        return EOF;      }    }  }  else    molecule_file_name = input_molecule_file_name;/** Write out coordinates of molecule* 7/95 te*/  write_ligand_info  (    dock,    score,    molecule,    molecule_file_name,    molecule_file  );/** Perform server duties* 10/95 te*/  if (dock->parallel.server)  {    efclose (&molecule_file);    rremove (ready_file_name, global.outfile);  }  return TRUE;}/* ////////////////////////////////////////////////////////////////// */void write_ligand_info(  DOCK *dock,  SCORE *score,  MOLECULE *molecule,  FILE_NAME molecule_file_name,  FILE *molecule_file){  enum FILE_FORMAT format;  char *flag = NULL;  void write_header    (DOCK *, SCORE *, MOLECULE *, FILE *, char *);  void write_trailer    (DOCK *, SCORE *, MOLECULE *, FILE *);  molecule->info.output_id =    ++(score->type[molecule->score.type].number_written);/** Determine format of output file* 2/96 te*/  format = check_file_extension (molecule_file_name, TRUE);/** Assign the proper flag to identify comment info in coordinate file* 2/96 te*/  switch (format)  {    case Mol2:      flag = "##########";      break;    case Pdb:    case Xpdb:      flag = "REMARK    ";      break;    case Ptr:    case Sph:      flag = "";      break;  }/** Write out comment information in proper format* 2/96 te*/  switch (format)  {    case Mol2:    case Pdb:    case Xpdb:    {/**     Score information is put in header before coordinates*     2/96 te*/      write_header      (        dock,        score,        molecule,        molecule_file,        flag      );      write_molecule      (        molecule,        dock->ligand_file_name,        molecule_file_name,        molecule_file      );      break;    }    case Ptr:    {/**     Score information is put in trailer on same line as pointer information*     2/96 te*/      write_molecule      (        molecule,        dock->ligand_file_name,        molecule_file_name,        molecule_file      );      write_trailer      (        dock,        score,        molecule,        molecule_file      );      break;    }    case Sph:    {/**     No score header information is written*     2/96 te*/      write_molecule      (        molecule,        dock->ligand_file_name,        molecule_file_name,        molecule_file      );      break;    }  }}/* ////////////////////////////////////////////////////////////////// */void write_header(  DOCK *dock,  SCORE *score,  MOLECULE *molecule,  FILE *molecule_file,  char *flag){  fprintf (molecule_file, "%s %-11s : %d\n", flag, "Number",    molecule->info.output_id);  if (molecule->info.input_id != NEITHER)    fprintf (molecule_file, "%s %-11s : %d\n", flag, "Source num",      molecule->info.input_id);  fprintf    (molecule_file, "%s %-11s : %s\n", flag, "Name", molecule->info.name);  fprintf    (molecule_file, "%s %-11s : %s\n", flag, "Description",    molecule->info.comment);  if (molecule->transform.refl_flag != NEITHER)    fprintf (molecule_file, "%s %-11s : %d\n", flag, "Reflect",      molecule->transform.refl_flag);  if (score->bump.flag)    fprintf (molecule_file, "%s %-40s : %10d\n", flag, "Number of bumps",      molecule->score.bumpcount);  if (molecule->score.total != INITIAL_SCORE)  {    if (molecule->score.type == NONE)      fprintf (molecule_file, "%s %-40s : %10.2f\n", flag, "Score",        molecule->score.total);    else if (molecule->score.type == CONTACT)      fprintf (molecule_file, "%s %-40s : %10.2f\n", flag, "Contact score",        molecule->score.total);    else if (molecule->score.type == CHEMICAL)    {      fprintf (molecule_file, "%s %-40s : %10.2f\n", flag, "Chemical score",        molecule->score.total);      if (score->inter_flag)      {        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intermolecular van der Waals", molecule->score.inter.vdw);        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intermolecular electrostatic", molecule->score.inter.electro);      }      if (score->intra_flag)      {        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intramolecular van der Waals", molecule->score.intra.vdw);        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intramolecular electrostatic", molecule->score.intra.electro);      }    }        else if (molecule->score.type == ENERGY)    {      fprintf (molecule_file, "%s %-40s : %10.2f\n", flag, "Energy score",        molecule->score.total);      if (score->inter_flag)      {        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intermolecular van der Waals", molecule->score.inter.vdw);        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intermolecular electrostatic", molecule->score.inter.electro);      }      if (score->intra_flag)      {        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intramolecular van der Waals", molecule->score.intra.vdw);        fprintf (molecule_file, "%s %-40s   %10.2f\n", flag,          "  intramolecular electrostatic", molecule->score.intra.electro);      }    }    else if (molecule->score.type == RMSD)      fprintf (molecule_file, "%s %-40s : %10.2f\n", flag, "RMSD score",        molecule->score.total);  }  if (dock->multiple_conforms ||    dock->multiple_orients ||    score->type[molecule->score.type].minimize)    fprintf (molecule_file, "%s %-40s : %10.2f\n",      flag, "RMSD from input orientation (A)", molecule->transform.rmsd);}/* ////////////////////////////////////////////////////////////////// */void write_trailer(  DOCK *dock,  SCORE *score,  MOLECULE *molecule,  FILE *molecule_file){/** Move back one byte to overwrite the previous new line character* 2/96 te*/  fseek (molecule_file, -7, SEEK_END);/** Output score information* 6/95 te*/  if (score->bump.flag)    fprintf (molecule_file, " <BMP> %d", molecule->score.bumpcount);  if (molecule->score.total != INITIAL_SCORE)  {    if (molecule->score.type == NONE)      fprintf (molecule_file, " <SCORE> %.2f", molecule->score.total);    else if (molecule->score.type == CONTACT)      fprintf (molecule_file, " <CNT> %.2f", molecule->score.total);    else if (molecule->score.type == CHEMICAL)    {      fprintf (molecule_file, " <CHM> %.2f", molecule->score.total);      if (score->inter_flag)      {        fprintf (molecule_file, " <INTER_VDW> %.2f",          molecule->score.inter.vdw);        fprintf (molecule_file, " <INTER_ELE> %.2f",          molecule->score.inter.electro);      }      if (score->intra_flag)      {        fprintf (molecule_file, " <INTRA_VDW> %.2f",          molecule->score.intra.vdw);        fprintf (molecule_file, " <INTRA_ELE> %.2f",          molecule->score.intra.electro);      }    }    else if (molecule->score.type == ENERGY)    {      fprintf (molecule_file, " <NRG> %.2f", molecule->score.total);      if (score->inter_flag)      {        fprintf (molecule_file, " <INTER_VDW> %.2f",          molecule->score.inter.vdw);        fprintf (molecule_file, " <INTER_ELE> %.2f",          molecule->score.inter.electro);      }      if (score->intra_flag)      {        fprintf (molecule_file, " <INTRA_VDW> %.2f",          molecule->score.intra.vdw);        fprintf (molecule_file, " <INTRA_ELE> %.2f",          molecule->score.intra.electro);      }    }    else if (molecule->score.type == RMSD)      fprintf (molecule_file, " <RMS> %.2f", molecule->score.total);  }  if (dock->multiple_orients || score->type[molecule->score.type].minimize)    fprintf (molecule_file, " <RMSD> %.2f", molecule->transform.rmsd);  fprintf (molecule_file, " <END>\n");}

⌨️ 快捷键说明

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