[gmx-users] Amber run parameters conversion 1.1

Anton Feenstra feenstra at chem.vu.nl
Wed Dec 4 14:08:36 CET 2002


Hi All,


Never can seem to get it right the first time... 

- Fixed conversion of cutoff from A to nm. THIS IS IMPORTANT!
- removed some debug stuff.
- parse through comments from mdin file.


-- 
Groetjes,

Anton
 ________ ___________________________________________________________
|        | Anton Feenstra                                            |
| .      | Dept. of Pharmacochemistry - Vrije Universiteit Amsterdam |
| |----  | De Boelelaan 1083 - 1081 HV Amsterdam - The Netherlands   |
| |----  | Tel: +31 20 44 47608 - Fax: +31 20 44 47610               |
| ' __   | Feenstra at chem.vu.nl - http://www.chem.vu.nl/afdelingen/FAR|
|  /  \  |-----------------------------------------------------------|
| (    ) | Dept. of Biophysical Chemistry - University of Groningen  |
|  \__/  | Nijenborgh 4 - 9747 AG Groningen - The Netherlands        |
|   __   | Tel +31 50 363 4327 - Fax +31 50 363 4800                 |
|  /  \  | K.A.Feenstra at chem.rug.nl - http://md.chem.rug.nl/~anton   |
| (    ) |-----------------------------------------------------------|
|  \__/  | "I Can't Shake It" (Dinosaur Jr)                          |
|________|___________________________________________________________|
-------------- next part --------------
#!/usr/bin/awk -f

# Amber2gmx 1.1
# Reads Amber parameter file (mdin) and converts to Gromacs .mdp file
# Version 1.1
# Copyright (c) 2002
# Anton Feenstra - Vrije Universiteit Amsterdam - The Netherlands

# strings:

function strip_space(s)
{
  gsub(" ","",s);
  return s;
}

function fix_newline(m,s)
{
  gsub("\n","\n"s,m);
  return m;
}

function outfile(fnm, n)
{
  if (fnm=="-") fnm="amber";
  gsub("\\.in","",fnm);
  if(n)
    fnm = fnm n;
  fnm = fnm".mdp";
  
  return fnm;
}
  
# message:

function error(m)
{
  nerr++;
  print "ERROR: "fix_newline(m,"       ")".";
}

function warning(m)
{
  nwarn++;
  print "WARNING: "fix_newline(m,"         ")".";
}  

function unimpl(m)
{
  warning("Unimplemented feature: "m);
}

function note(m)
{
  nnote++;
  print "NOTE: "fix_newline(m,"      ")".";
}  

# specific messages:

function unsupported_parameter(p,v,m)
{
  warning("unsupported parameter '"p"' ("v", "m")");
}

function ignore_parameter(p,v,m)
{
  note("ignoring parameter '"p"' ("v", "m")");
}

function set_fudge(p,v)
{
  warning("in the '[ defaults ]' section of your .top file, \n"\
	  "set parameter 'Fudge"p"' to '"1/v"'");
}

function unsupported_parameter_value(p,v,m)
{
  error("unsupported value '"v"' for '"p"' ("m")");
}

# maths:

function min(a,b)
{
  return a<b?a:b;
}

function max(a,b)
{
  return a>b?a:b;
}

# parsing:

function set_parameter(p, v)
{
# keep track of settings:
  if (parameter_set[p]) warning("Duplicate parameter '"p"' ("v")");
  parameter_set[p]=1;
# general flags
  if (p=="timlim")      ignore_parameter(p,v,"Time Limit in seconds");
  else if (p=="imin") {
    if (v==0)           parm["integrator"] = "md"; 
    else if (v==1)      parm["integrator"] = "steep";
    else unsupported_parameter_value(p,v);
  }
  else if (p=="nmropt") {
    if (v!=0) unsupported_parameter_value(p,v,"NMR optimizations");
  }
  else if (p=="ntx")    ignore_parameter(p,v,"Read coordinates");
  else if (p=="irest")  ignore_parameter(p,v,"Restart flag");
  else if (p=="ntrx" ||
# output
	   p=="ntxo" ||
	   p=="ioutfm") ignore_parameter(p,v,"Coordinate format");
  else if (p=="ntpr")   parm["nstlog"]    = v;
  else if (p=="ntwr")   parm["nstxout"]   = parm["nstvout"] = v;
  else if (p=="ntwx")   parm["nstxtcout"] = v;
  else if (p=="ntwv")   {
    if (parm["nstvout"]==0) parm["nstvout"]   = v;
    else                    parm["nstvout"]   = min(parm["nstvout"],v);
  }
  else if (p=="ntwe")   parm["nstenergy"] = v;
  else if (p=="ntwxm" ||
	   p=="ntwvm" ||
	   p=="ntwem")  ignore_parameter(p,v,"Output steps limit");
  else if (p=="ntwprt") {
    if (v<0)            warning("Should write only solute atoms");
    else if (v>0)       warning("Should write only atoms 1-"v);
  }
# potential function
  else if (p=="ntf")    ignore_parameter(p,v,"Force evaluation");
  else if (p=="ntb") {  parm["pbc"] = "xyz";
    if (v==0)           parm["pbc"] = "none";
    else if (v==1)      parm["Pcoupl"] = "No";
    else if (v==2)      parm["Pcoupl"] = "Yes";
    else unsupported_parameter_value(p,v);
  }
  else if (p=="idiel") {
    if (v!=1) unsupported_parameter_value(p,v,"Dielectric function");
  }
  else if (p=="dielc")  parm["epsilon_r"] = v;
  else if (p=="cut")    parm["rcoulomb"]  = parm["rvwd"] = v*A2nm;
  else if (p=="ntnb") {
    if (v==0)           parm["nstlist"] = 0;
    else if (v==1)      parm["nstlist"] = 25;
    else unsupported_parameter_value(p,v);
  }
  else if (p=="nsnb")   parm["nstlist"] = v;
  else if (p=="ntid")   unsupported_parameter(p,v,"Water pairlist");
  else if (p=="scnb")   set_fudge("LJ",v);
  else if (p=="scee")   set_fudge("QQ",v);
  else if (p=="cut2nd") parm["rlist"]     = v*A2nm;
  else if (p=="ichdna") {
    if (v!=0) unsupported_parameter_value(p,v,"(Un)Charge end hydrogens");
  }
# soft repulsion
  else if (p=="isftrp") {
    if (v!=0) unsupported_parameter_value(p,v,"Soft repulsions");
  }
  else if (p=="rwell")  unsupported_parameter(p,v,"Soft repulsions");
# polarizability
  else if (p=="ipol") {
    if (v!=0) unsupported_parameter_value(p,v,"Polarizability");
  }
  else if (p=="n3b"||
	   p=="nion")   unsupported_parameter(p,v,"");
# freeze and posre
  else if (p=="ibelly") freeze = v;
  else if (p=="ntr")    posre  = v;
# EM (and nrun and nstlim from MD section below)
  else if (p=="maxcyc" || 
	   p=="ncyc"||
	   p=="nrun"||
	   p=="nstlim") {
    gp = "nsteps";
    if ( !parm[gp] ) parm[gp] = v; else parm[gp] *= v;
    note("Parameter '"p"' ("v") incorporated into '"gp"' ("parm[gp] ")");
  }
  else if (p=="ntmin")  {
    if (v==0)           if (parm["integrator"]!="md") parm["integrator"]="cg";
    else if (v==1) unsupported_parameter_value(p,v);
    else if (v==2)      if (parm["integrator"]!="md") parm["integrator"]="steep";
    else unsupported_parameter_value(p,v);
  }
  else if (p=="dx0")    parm["emstep"] = v*A2nm;
  else if (p=="dxm")    ignore_parameter(p,v,"");
  else if (p=="drms") 
    warning("Parameter '"p"' ("v", RMS of gradient, kcal/mol A)\n"\
	    "should be converted to 'emtol' (Max force, kJ/mol nm)");
# MD (nrun and nstlim are in EM section above)
  else if (p=="ndfmin") ignore_parameter(p,v,"");
  else if (p=="ntcm")  {
    if (v==0)           parm["nstcomm"] = 0;
    else if (v==1)      parm["nstcomm"] = parm["nsteps"]*10;
    else unsupported_parameter_value(p,v);
  }
  else if (p=="nscm")   parm["nstcomm"] = v;
  else if (p=="init")  {
    if (v==3)           parm["gen_vel"] = "yes";
    else if (v==4)      parm["gen_vel"] = "no";
    else unsupported_parameter_value(p,v);
  }
  else if (p=="t")      parm["t_init"] = v;
  else if (p=="dt")     parm["dt"] = v;
# Temperature
  else if (p=="temp0")  reft  = v;
  else if (p=="tempi")  tempi = v;
  else if (p=="heat")   heat  = v;
  else if (p=="ig")     parm["gen_seed"] = v;
  else if (p=="ntt")  {
    if ( v==0 || v==1 || v==5 ) {
      if (v==0)         parm["tcoupl"] = "no";
      if (v==1 || v==5) parm["tcoupl"] = "berendsen";
      if (v==1) {
	parm["ref_t"]  = "reft";
	parm["tau_t"]  = "tautp";
      }
      if (v==2 || v==5) { 
	parm["tc_grps"] = "Solute Solvent";
	parm["ref_t"]   = "reft reft";
      }
      if (v==2)         parm["tau_t"] = "tautp 0";
      if (v==5)         parm["tau_t"] = "tautp tauts";
    }
    else
      unsupported_parameter_value(p,v);
  }
  else if (p=="isolvp") ignore_parameter(p,v,"Last solute atom");
  else if (p=="dtemp")  unsupported_parameter(p,v,"");
  else if (p=="tautp")  tautp = v;
  else if (p=="tauts")  tauts = v;
  else if (p=="vlimit") {
    if (v!=0) unsupported_parameter_value(p,v,"Velocity Limit");
  }
# 'peacs'
  else if (p=="tauv0") {
    if (v!=0) unsupported_parameter_value(p,v,"PEACS temperature algorithm");
  }
  else if (p=="tauv")   ignore_parameter(p,v,"");
  else if (p=="vzero")  ignore_parameter(p,v,"");
# pressure
  else if (p=="ntp")  {
    if (v==0)           parm["pcoupl"] = "no";
    else if (v==1)      parm["pcoupl"] = "berendsen";
    else if (v==2) {
      parm["pcoupl"] = "berendsen";
      parm["pcoupltype"] = "isotropic";
    }
    else unsupported_parameter_value(p,v);
  }
  else if (p=="comp")   parm["compressibility"] = v*1e-6;
  else if (p=="taup")   parm["tau_p"] = v;
  else if (p=="npscal") {
    if (v!=0) unsupported_parameter_value(p,v,"");
  }
# shake
  else if (p=="ntc")  {
    if (v==0)           parm["constraints"] = "none";
    else if (v==1)      parm["constraints"] = "hbonds";
    else if (v==2)      parm["constraints"] = "all-bonds";
    else unsupported_parameter_value(p,v);
  }
  else if (p=="tol")    parm["shake_tol"] = v;
# special water treatment
  else if (p=="imgslt") {
    if (v!=0) unsupported_parameter_value(p,v,"Solvent imaging");
  }
  else if (p=="iftres") {
    if (v!=1) unsupported_parameter_value(p,v,"Intermolecular interactions");
  }
  else if (p=="jfastw"||
	   p=="watnam"||
	   p=="owtnam"||
	   p=="hwtnam1"||
	   p=="hwtnam2") ignore_parameter(p,v,"Fast water");
# pme
  else if (p=="iewald")  {
    if (v==0)           parm["coulombtype"] = "cut-off";
    else if (v==1) {
      parm["coulombtype"] = "PME";
      warning("Special input parameters for PME (fftgrid) not converted");
    }
    else unsupported_parameter_value(p,v);
  }
}

function post_process()
{
  if (freeze) unimpl("Freeze groups");
  if (posre) unimpl("Position restraints");
  if (tempi)
    parm["gen_temp"] = tempi;
  if (heat)
    parm["gen_temp"] *= heat;
  gsub("reft", reft, parm["ref_t"]); 
  gsub("tauts",tauts,parm["tau_t"]);
  gsub("tautp",tautp,parm["tau_t"]);
}

function output(outfile)
{
  print "Writing "outfile".";
  print ";" > outfile;
  print "; This file was converted by "PROGRAM" "VER" from "FILENAME > outfile;
  print "; Copyright (c) 2002 Anton Feenstra" > outfile;
  print ";" > outfile;
  print "; parameters will not always be the verbatim translation" > outfile;
  print "; CHECK PARAMETERS CAREFULLY BEFORE RUNNING!" > outfile;
  print "; Amber default values are not considered" > outfile;
  print "; Check mdout.mdp (from grompp) for Gromacs default values" > outfile;
  print ";" > outfile;
  print "; There were", nnote, "notes,", nwarn, "warnings and", 
    nerr, "errors during conversion" > outfile;
  print ";" > outfile;
  for(i=0; i<ncmt; i++)
    print "; "comments[i] > outfile;
  print ";" > outfile;
  print "" > outfile;
  for(i in parm)
    printf("%-20s = %s\n", i, parm[i]) > outfile;
}

function clear_parms()
{
  for(i in parameter_set)
    delete parameter_set[i];
  for(i in parm)
    delete parm[i];
}

# initialize:

BEGIN {
  VER = "1.1";
  PROGRAM = "amber2mdp"
  print "This is "PROGRAM" Version "VER".";
  print "Copyright (c) 2002 Anton Feenstra";
  print "Anton Feenstra - Vrije Universiteit Amsterdam - The Netherlands";
  print "";
  print "Reads Amber parameter file (mdin) and converts to Gromacs .mdp file";
  print "";

  ncntrl= 0;
  nwarn = 0;
  nerr  = 0;
  
  ncmt  = 0;
  
  # conversion parameters:
  A2nm  = 0.1;
}

FNR == 1  && NR != 1 {
  print "There were", nnote, "notes, ", nwarn, "warnings and", nerr, "errors";
  terr  += nerr;
  twarn += nwarn;
  tnote += nnote;
  
  nerr  = 0;
  nwarn = 0;
  nnote = 0;
  
  nctrl = 0;
  
  for(i=0;i<ncmt;i++) delete comments[i];
  ncmt  = 0;
}

# store comments
/^#/ {
  sub("^#","");
  sub("^ ","");
  comments[ncmt]=$0;
  ncmt++;
  next;
}

# parse parameter block
! /^#/ {
  gsub(" *= *","=");
  gsub(", *"," ");
  np = split ($0, parms, " ");
# print np, $0;
  for(i=1; i<=np; i++) {
    if ( substr(parms[i],1,1) == "&" ) {
      pblock = block;
      block = substr(parms[i],2);
      if (block == "cntrl") {
	print "Start of control block";
	cntrl = 1;
      }
      else if (block == "end") {
	if (ignore) 
	  printf(")\n");
	else if (cntrl) {
	  print "End of control block";
	  post_process();
	  output(outfile(FILENAME,nctrl));
	  clear_parms();
	  nctrl++;
	}
	else
	  print "End of block ("pblock").";
	ignore = 0;
	cntrl=0;
      }
      else {
	printf("Skipping unknown block "block" (");
	ignore = 1;
      }
    } 
    else if (ignore)
      printf(" "parms[i]);
    else if (cntrl) {
      if (split(parms[i], words, " *= *")!=2) 
	error("wrong format: "parms[i]);
      tolower(words[1]); tolower(words[2]);
      set_parameter(words[1],words[2]);
    }
    else {
      print "Skipping unknown line: "$0;
      next;
    }
  }
}

# finalize
END {
  print "There were", nnote, "notes, ", nwarn, "warnings and", nerr, "errors";
  if (tnote || twarn || terr) {
    print "";
    print "In total:", tnote, "notes, ", twarn, "warnings and", terr, "errors";
  }
}

#last line


More information about the gromacs.org_gmx-users mailing list