Re: A possibel wrong coding in Parameters::read_charmm_parameter_file(char *)

From: Marcos Sotomayor (sotomayo_at_ks.uiuc.edu)
Date: Wed Apr 05 2006 - 11:01:27 CDT

Oops! Got confused... that function is reading parameter files not psf
files. Sorry about that. However, I think is the same thing.... its
skipping the line of the label.

Marcos

  On Wed, 5 Apr 2006, Marcos Sotomayor wrote:

>
>
>
> Hi Qikai,
>
> After having a quick look at the code you sent, it seems to me that NAMD
> is just skipping (as it should) the line that contains the label
> indicating that after that line bonds are listed in the psf file
> (something like "71702 !NBOND: bonds", followed by the list of bonds).
> Then it continues reading the actual info. Have a look at the format of a
> psf file in the appendix of the NAMD tutorial
>
> http://www.ks.uiuc.edu/Training/Tutorials/namd/namd-tutorial-unix-html/index.html
>
> Marcos
>
> On Wed, 5 Apr 2006, Qikai Li wrote:
>
>> Hi, all
>>
>> When I browse the NAMD source code, I've noticed that when the option
>> for reading CHARMM-style parameter file in on, you will likely to get
>> an empty tree rather than the expected.
>> The following is the snapshot of the code segment. Here, we have two
>> variables to play around, it's the variable skipline that results in
>> unexpected behavior.
>> For example, if we have a valid key, for example, "bond", then we set
>> both variables:
>> par_type=1;
>> skipline=1;
>>
>> However, in following line parsing part, we use condition:
>> if ( (par_type != 0) && (!skipline) )
>>
>> Thus, a valid "bond" item is simply skipped. Similarly for other types
>> of items, in the end we will have an empty tree!
>>
>> The same is true for NAMD version 2.6b1.
>>
>> I hope I'm wrong.
>>
>>
>> Qikai LI
>> MSE of GA Tech.
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> // Parameters.C, @ line 432
>> void Parameters::read_charmm_parameter_file(char *fname)
>>
>> {
>> int par_type=0; // What type of parameter are we currently
>> // dealing with? (vide infra)
>> int skipline; // skip this line?
>> char buffer[512]; // Buffer to store each line of the file
>> char first_word[512]; // First word of the current line
>> FILE *pfile; // File descriptor for the parameter
>> file
>>
>> /* Check to make sure that we haven't previously been told */
>> /* that all the files were read */
>> if (AllFilesRead)
>> {
>> NAMD_die("Tried to read another parameter file after being told that
>> all files were read!");
>> }
>>
>> /* Try and open the file */
>> if ( (pfile = fopen(fname, "r")) == NULL)
>> {
>> char err_msg[256];
>>
>> sprintf(err_msg, "UNABLE TO OPEN CHARMM PARAMETER FILE %s\n", fname);
>> NAMD_die(err_msg);
>> }
>>
>> /* Keep reading in lines until we hit the EOF
>> */
>> while (NAMD_read_line(pfile, buffer) != -1)
>> {
>> /* Get the first word of the line */
>> NAMD_find_first_word(buffer, first_word);
>> skipline=0;
>>
>> /* First, screen out things that we ignore. */ /*
>> blank lines, lines that start with '!' or '*', lines that */
>> /* start with "END". */
>> if (!NAMD_blank_string(buffer) &&
>> (strncmp(first_word, "!", 1) != 0) &&
>> (strncmp(first_word, "*", 1) != 0) &&
>> (strncasecmp(first_word, "END", 3) != 0))
>> {
>> /* Now, determine the apropriate parameter type. */
>> if (strncasecmp(first_word, "bond", 4)==0)
>> {
>> par_type=1; skipline=1;
>> }
>> else if (strncasecmp(first_word, "angl", 4)==0)
>> {
>> par_type=2; skipline=1;
>> }
>> else if (strncasecmp(first_word, "thet", 4)==0)
>> {
>> par_type=2; skipline=1;
>> }
>> else if (strncasecmp(first_word, "dihe", 4)==0)
>> {
>> par_type=3; skipline=1;
>> }
>> else if (strncasecmp(first_word, "phi", 3)==0)
>> {
>> par_type=3; skipline=1;
>> }
>> else if (strncasecmp(first_word, "impr", 4)==0)
>> {
>> par_type=4; skipline=1;
>> }
>> else if (strncasecmp(first_word, "imph", 4)==0)
>> {
>> par_type=4; skipline=1;
>> }
>> else if (strncasecmp(first_word, "nbon", 4)==0)
>> {
>> par_type=5; skipline=1;
>> }
>> else if (strncasecmp(first_word, "nonb", 4)==0)
>> {
>> par_type=5; skipline=1;
>> }
>> else if (strncasecmp(first_word, "nbfi", 4)==0)
>> {
>> par_type=6; skipline=1;
>> }
>> else if (strncasecmp(first_word, "hbon", 4)==0)
>> {
>> par_type=7; skipline=1;
>> }
>> else if ((strncasecmp(first_word, "nbxm", 4) == 0) ||
>> (strncasecmp(first_word, "grou", 4) == 0) ||
>> (strncasecmp(first_word, "cdie", 4) == 0) ||
>> (strncasecmp(first_word, "shif", 4) == 0) ||
>> (strncasecmp(first_word, "vgro", 4) == 0) ||
>> (strncasecmp(first_word, "vdis", 4) == 0) ||
>> (strncasecmp(first_word, "vswi", 4) == 0) ||
>> (strncasecmp(first_word, "cutn", 4) == 0) ||
>> (strncasecmp(first_word, "ctof", 4) == 0) ||
>> (strncasecmp(first_word, "cton", 4) == 0) ||
>> (strncasecmp(first_word, "eps", 3) == 0) ||
>> (strncasecmp(first_word, "e14f", 4) == 0) ||
>> (strncasecmp(first_word, "wmin", 4) == 0) ||
>> (strncasecmp(first_word, "aexp", 4) == 0) ||
>> (strncasecmp(first_word, "rexp", 4) == 0) ||
>> (strncasecmp(first_word, "haex", 4) == 0) ||
>> (strncasecmp(first_word, "aaex", 4) == 0) ||
>> (strncasecmp(first_word, "noac", 4) == 0) ||
>> (strncasecmp(first_word, "hbno", 4) == 0) ||
>> (strncasecmp(first_word, "cuth", 4) == 0) ||
>> (strncasecmp(first_word, "ctof", 4) == 0) ||
>> (strncasecmp(first_word, "cton", 4) == 0) ||
>> (strncasecmp(first_word, "cuth", 4) == 0) ||
>> (strncasecmp(first_word, "ctof", 4) == 0) ||
>> (strncasecmp(first_word, "cton", 4) == 0) )
>> {
>> if ((par_type != 5) && (par_type != 6) && (par_type != 7))
>> {
>> char err_msg[512];
>>
>> sprintf(err_msg, "ERROR IN CHARMM PARAMETER FILE
>> %s\nLINE=*%s*",fname, buffer);
>> NAMD_die(err_msg);
>> }
>> else
>> {
>> skipline = 1;
>> }
>> } else if (par_type == 0)
>> {
>> /* This is an unknown paramter. */
>> /* This is BAD */
>> char err_msg[512];
>>
>> sprintf(err_msg, "UNKNOWN PARAMETER IN CHARMM PARAMETER FILE
>> %s\nLINE=*%s*",fname, buffer);
>> NAMD_die(err_msg);
>> }
>> }
>> else
>> {
>> skipline=1;
>> }
>>
>> if ( (par_type != 0) && (!skipline) )
>> {
>> /* Now, call the appropriate function based */
>> /* on the type of parameter we have */
>> /* I know, this should really be a switch ... */
>> if (par_type == 1)
>> {
>> add_bond_param(buffer);
>> NumBondParams++;
>> }
>> else if (par_type == 2)
>> {
>> add_angle_param(buffer);
>> NumAngleParams++;
>> }
>> else if (par_type == 3)
>> {
>> add_dihedral_param(buffer, pfile);
>> NumDihedralParams++;
>> }
>> else if (par_type == 4)
>> {
>> add_improper_param(buffer, pfile);
>> NumImproperParams++;
>> }
>> else if (par_type == 5)
>> {
>> add_vdw_param(buffer);
>> NumVdwParams++;
>> }
>> else if (par_type == 6)
>> {
>> add_vdw_pair_param(buffer);
>> NumVdwPairParams++;
>> }
>> else if (par_type == 7)
>> {
>> add_hb_pair_param(buffer); }
>> else
>> {
>> /* This really should not occour! */
>> /* This is an internal error. */
>> /* This is VERY BAD */
>> char err_msg[512];
>>
>> sprintf(err_msg, "INTERNAL ERROR IN CHARMM PARAMETER FILE
>> %s\nLINE=*%s*",fname, buffer);
>> NAMD_die(err_msg);
>> }
>> }
>> }
>>
>> /* Close the file */
>> fclose(pfile);
>>
>> return;
>> }
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>
>

This archive was generated by hypermail 2.1.6 : Wed Feb 29 2012 - 15:43:28 CST