2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
66 #include "mtop_util.h"
81 real *aver1,*aver2,*aver_3,*aver_6;
84 static void init5(int n)
90 static void reset5(void)
94 for(i=0; (i<ntop); i++) {
100 int tpcomp(const void *a,const void *b)
108 return (1e7*(tpb->v-tpa->v));
111 static void add5(int ndr,real viol)
116 for(i=1; (i<ntop); i++)
117 if (top[i].v < top[mini].v)
119 if (viol > top[mini].v) {
125 static void print5(FILE *fp)
129 qsort(top,ntop,sizeof(top[0]),tpcomp);
130 fprintf(fp,"Index:");
131 for(i=0; (i<ntop); i++)
132 fprintf(fp," %6d",top[i].n);
133 fprintf(fp,"\nViol: ");
134 for(i=0; (i<ntop); i++)
135 fprintf(fp," %6.3f",top[i].v);
139 static void check_viol(FILE *log,t_commrec *cr,
140 t_ilist *disres,t_iparams forceparams[],
141 t_functype functype[],rvec x[],rvec f[],
142 t_forcerec *fr,t_pbc *pbc,t_graph *g,t_dr_result dr[],
143 int clust_id,int isize,atom_id index[],real vvindex[],
147 int i,j,nat,n,type,nviol,ndr,label;
148 real ener,rt,mviol,tviol,viol,lam,dvdl,drt;
149 static gmx_bool bFirst=TRUE;
159 forceatoms=disres->iatoms;
160 for(j=0; (j<isize); j++) {
163 nat = interaction_function[F_DISRES].nratoms+1;
164 for(i=0; (i<disres->nr); ) {
165 type = forceatoms[i];
167 label = forceparams[type].disres.label;
169 fprintf(debug,"DISRE: ndr = %d, label = %d i=%d, n =%d\n",
172 gmx_fatal(FARGS,"tpr inconsistency. ndr = %d, label = %d\n",ndr,label);
175 } while (((i+n) < disres->nr) &&
176 (forceparams[forceatoms[i+n]].disres.label == label));
178 calc_disres_R_6(cr->ms,n,&forceatoms[i],forceparams,
179 (const rvec*)x,pbc,fcd,NULL);
181 if (fcd->disres.Rt_6[0] <= 0)
182 gmx_fatal(FARGS,"ndr = %d, rt_6 = %f",ndr,fcd->disres.Rt_6[0]);
184 rt = pow(fcd->disres.Rt_6[0],-1.0/6.0);
185 dr[clust_id].aver1[ndr] += rt;
186 dr[clust_id].aver2[ndr] += sqr(rt);
188 dr[clust_id].aver_3[ndr] += drt;
189 dr[clust_id].aver_6[ndr] += fcd->disres.Rt_6[0];
191 ener=interaction_function[F_DISRES].ifunc(n,&forceatoms[i],forceparams,
192 (const rvec*)x,f,fr->fshift,
193 pbc,g,lam,&dvdl,NULL,fcd,NULL);
194 viol = fcd->disres.sumviol;
199 add5(forceparams[type].disres.label,viol);
203 for(j=0; (j<isize); j++) {
204 if (index[j] == forceparams[type].disres.label)
205 vvindex[j]=pow(fcd->disres.Rt_6[0],-1.0/6.0);
211 dr[clust_id].nv = nviol;
212 dr[clust_id].maxv = mviol;
213 dr[clust_id].sumv = tviol;
214 dr[clust_id].averv= tviol/ndr;
215 dr[clust_id].nframes++;
218 fprintf(stderr,"\nThere are %d restraints and %d pairs\n",
229 real up1,r,rT3,rT6,viol,violT3,violT6;
232 static int drs_comp(const void *a,const void *b)
236 da = (t_dr_stats *)a;
237 db = (t_dr_stats *)b;
239 if (da->viol > db->viol)
241 else if (da->viol < db->viol)
247 static void dump_dump(FILE *log,int ndr,t_dr_stats drs[])
249 static const char *core[] = { "All restraints", "Core restraints" };
250 static const char *tp[] = { "linear", "third power", "sixth power" };
251 real viol_tot,viol_max,viol=0;
256 for(bCore = FALSE; (bCore <= TRUE); bCore++) {
257 for(kkk=0; (kkk<3); kkk++) {
262 for(i=0; (i<ndr); i++) {
263 if (!bCore || (bCore && drs[i].bCore)) {
269 viol = drs[i].violT3;
272 viol = drs[i].violT6;
275 gmx_incons("Dumping violations");
277 viol_max = max(viol_max,viol);
284 if ((nrestr > 0) || (bCore && (nrestr < ndr))) {
286 fprintf(log,"+++++++ %s ++++++++\n",core[bCore]);
287 fprintf(log,"+++++++ Using %s averaging: ++++++++\n",tp[kkk]);
288 fprintf(log,"Sum of violations: %8.3f nm\n",viol_tot);
290 fprintf(log,"Average violation: %8.3f nm\n",viol_tot/nrestr);
291 fprintf(log,"Largest violation: %8.3f nm\n",viol_max);
292 fprintf(log,"Number of violated restraints: %d/%d\n",nviol,nrestr);
298 static void dump_viol(FILE *log,int ndr,t_dr_stats *drs,gmx_bool bLinear)
302 fprintf(log,"Restr. Core Up1 <r> <rT3> <rT6> <viol><violT3><violT6>\n");
303 for(i=0; (i<ndr); i++) {
304 if (bLinear && (drs[i].viol == 0))
306 fprintf(log,"%6d%5s%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n",
307 drs[i].index,yesno_names[drs[i].bCore],
308 drs[i].up1,drs[i].r,drs[i].rT3,drs[i].rT6,
309 drs[i].viol,drs[i].violT3,drs[i].violT6);
313 static gmx_bool is_core(int i,int isize,atom_id index[])
316 gmx_bool bIC = FALSE;
318 for(kk=0; !bIC && (kk<isize); kk++)
319 bIC = (index[kk] == i);
324 static void dump_stats(FILE *log,int nsteps,int ndr,t_ilist *disres,
325 t_iparams ip[],t_dr_result *dr,
326 int isize,atom_id index[],t_atoms *atoms)
332 fprintf(log,"++++++++++++++ STATISTICS ++++++++++++++++++++++++\n");
335 nra = interaction_function[F_DISRES].nratoms+1;
336 for(i=0; (i<ndr); i++) {
337 /* Search for the appropriate restraint */
338 for( ; (j<disres->nr); j+=nra) {
339 if (ip[disres->iatoms[j]].disres.label == i)
343 drs[i].bCore = is_core(i,isize,index);
344 drs[i].up1 = ip[disres->iatoms[j]].disres.up1;
345 drs[i].r = dr->aver1[i]/nsteps;
346 drs[i].rT3 = pow(dr->aver_3[i]/nsteps,-1.0/3.0);
347 drs[i].rT6 = pow(dr->aver_6[i]/nsteps,-1.0/6.0);
348 drs[i].viol = max(0,drs[i].r-drs[i].up1);
349 drs[i].violT3 = max(0,drs[i].rT3-drs[i].up1);
350 drs[i].violT6 = max(0,drs[i].rT6-drs[i].up1);
352 int j1 = disres->iatoms[j+1];
353 int j2 = disres->iatoms[j+2];
354 atoms->pdbinfo[j1].bfac += drs[i].violT3*5;
355 atoms->pdbinfo[j2].bfac += drs[i].violT3*5;
358 dump_viol(log,ndr,drs,FALSE);
360 fprintf(log,"+++ Sorted by linear averaged violations: +++\n");
361 qsort(drs,ndr,sizeof(drs[0]),drs_comp);
362 dump_viol(log,ndr,drs,TRUE);
364 dump_dump(log,ndr,drs);
369 static void dump_clust_stats(FILE *fp,int ndr,t_ilist *disres,
370 t_iparams ip[],t_blocka *clust,t_dr_result dr[],
371 char *clust_name[],int isize,atom_id index[])
374 double sumV,maxV,sumVT3,sumVT6,maxVT3,maxVT6;
378 fprintf(fp,"++++++++++++++ STATISTICS ++++++++++++++++++++++\n");
379 fprintf(fp,"Cluster NFrames SumV MaxV SumVT MaxVT SumVS MaxVS\n");
383 for(k=0; (k<clust->nr); k++) {
384 if (dr[k].nframes == 0)
386 if (dr[k].nframes != (clust->index[k+1]-clust->index[k]))
387 gmx_fatal(FARGS,"Inconsistency in cluster %s.\n"
388 "Found %d frames in trajectory rather than the expected %d\n",
389 clust_name[k],dr[k].nframes,
390 clust->index[k+1]-clust->index[k]);
392 gmx_fatal(FARGS,"Inconsistency with cluster %d. Invalid name",k);
394 nra = interaction_function[F_DISRES].nratoms+1;
395 sumV = sumVT3 = sumVT6 = maxV = maxVT3 = maxVT6 = 0;
396 for(i=0; (i<ndr); i++) {
397 /* Search for the appropriate restraint */
398 for( ; (j<disres->nr); j+=nra) {
399 if (ip[disres->iatoms[j]].disres.label == i)
403 drs[i].bCore = is_core(i,isize,index);
404 drs[i].up1 = ip[disres->iatoms[j]].disres.up1;
405 drs[i].r = dr[k].aver1[i]/dr[k].nframes;
406 if ((dr[k].aver_3[i] <= 0) || (dr[k].aver_3[i] != dr[k].aver_3[i]))
407 gmx_fatal(FARGS,"dr[%d].aver_3[%d] = %f",k,i,dr[k].aver_3[i]);
408 drs[i].rT3 = pow(dr[k].aver_3[i]/dr[k].nframes,-1.0/3.0);
409 drs[i].rT6 = pow(dr[k].aver_6[i]/dr[k].nframes,-1.0/6.0);
410 drs[i].viol = max(0,drs[i].r-drs[i].up1);
411 drs[i].violT3 = max(0,drs[i].rT3-drs[i].up1);
412 drs[i].violT6 = max(0,drs[i].rT6-drs[i].up1);
414 sumVT3 += drs[i].violT3;
415 sumVT6 += drs[i].violT6;
416 maxV = max(maxV,drs[i].viol);
417 maxVT3 = max(maxVT3,drs[i].violT3);
418 maxVT6 = max(maxVT6,drs[i].violT6);
420 if (strcmp(clust_name[k],"1000") == 0) {
423 fprintf(fp,"%-10s%6d%8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n",
425 dr[k].nframes,sumV,maxV,sumVT3,maxVT3,sumVT6,maxVT6);
432 static void init_dr_res(t_dr_result *dr,int ndr)
434 snew(dr->aver1,ndr+1);
435 snew(dr->aver2,ndr+1);
436 snew(dr->aver_3,ndr+1);
437 snew(dr->aver_6,ndr+1);
445 static void dump_disre_matrix(const char *fn,t_dr_result *dr,int ndr,
446 int nsteps,t_idef *idef,gmx_mtop_t *mtop,
447 real max_dr,int nlevels,gmx_bool bThird)
451 int n_res,a_offset,mb,mol,a;
453 int iii,i,j,nra,nratoms,tp,ri,rj,index,nlabel,label;
455 real **matrix,*t_res,hi,*w_dr,rav,rviol;
456 t_rgb rlo = { 1, 1, 1 };
457 t_rgb rhi = { 0, 0, 0 };
461 snew(resnr,mtop->natoms);
464 for(mb=0; mb<mtop->nmolblock; mb++) {
465 atoms = &mtop->moltype[mtop->molblock[mb].type].atoms;
466 for(mol=0; mol<mtop->molblock[mb].nmol; mol++) {
467 for(a=0; a<atoms->nr; a++) {
468 resnr[a_offset+a] = n_res + atoms->atom[a].resind;
470 n_res += atoms->nres;
471 a_offset += atoms->nr;
476 for(i=0; (i<n_res); i++)
479 for(i=0; (i<n_res); i++)
480 snew(matrix[i],n_res);
481 nratoms = interaction_function[F_DISRES].nratoms;
482 nra = (idef->il[F_DISRES].nr/(nratoms+1));
488 for(i=0; (i<idef->il[F_DISRES].nr); i+=nratoms+1) {
489 tp = idef->il[F_DISRES].iatoms[i];
490 label = idef->iparams[tp].disres.label;
492 if (label != index) {
493 /* Set index pointer */
496 gmx_fatal(FARGS,"nlabel is %d, label = %d",nlabel,label);
498 gmx_fatal(FARGS,"ndr = %d, index = %d",ndr,index);
499 /* Update the weight */
500 w_dr[index] = 1.0/nlabel;
508 printf("nlabel = %d, index = %d, ndr = %d\n",nlabel,index,ndr);
510 for(i=0; (i<ndr); i++) {
511 for(j=ptr[i]; (j<ptr[i+1]); j+=nratoms+1) {
512 tp = idef->il[F_DISRES].iatoms[j];
513 ai = idef->il[F_DISRES].iatoms[j+1];
514 aj = idef->il[F_DISRES].iatoms[j+2];
519 rav = pow(dr->aver_3[i]/nsteps,-1.0/3.0);
521 rav = dr->aver1[i]/nsteps;
523 fprintf(debug,"DR %d, atoms %d, %d, distance %g\n",i,ai,aj,rav);
524 rviol = max(0,rav-idef->iparams[tp].disres.up1);
525 matrix[ri][rj] += w_dr[i]*rviol;
526 matrix[rj][ri] += w_dr[i]*rviol;
527 hi = max(hi,matrix[ri][rj]);
528 hi = max(hi,matrix[rj][ri]);
536 printf("Warning: the maxdr that you have specified (%g) is smaller than\nthe largest value in your simulation (%g)\n",max_dr,hi);
539 printf("Highest level in the matrix will be %g\n",hi);
541 write_xpm(fp,0,"Distance Violations","<V> (nm)","Residue","Residue",
542 n_res,n_res,t_res,t_res,matrix,0,hi,rlo,rhi,&nlevels);
546 int gmx_disre(int argc,char *argv[])
548 const char *desc[] = {
549 "[TT]g_disre[tt] computes violations of distance restraints.",
550 "If necessary, all protons can be added to a protein molecule ",
551 "using the [TT]g_protonate[tt] program.[PAR]",
552 "The program always",
553 "computes the instantaneous violations rather than time-averaged,",
554 "because this analysis is done from a trajectory file afterwards",
555 "it does not make sense to use time averaging. However,",
556 "the time averaged values per restraint are given in the log file.[PAR]",
557 "An index file may be used to select specific restraints for",
559 "When the optional [TT]-q[tt] flag is given a [TT].pdb[tt] file coloured by the",
560 "amount of average violations.[PAR]",
561 "When the [TT]-c[tt] option is given, an index file will be read",
562 "containing the frames in your trajectory corresponding to the clusters",
563 "(defined in another manner) that you want to analyze. For these clusters",
564 "the program will compute average violations using the third power",
565 "averaging algorithm and print them in the log file."
568 static int nlevels = 20;
569 static real max_dr = 0;
570 static gmx_bool bThird = TRUE;
572 { "-ntop", FALSE, etINT, {&ntop},
573 "Number of large violations that are stored in the log file every step" },
574 { "-maxdr", FALSE, etREAL, {&max_dr},
575 "Maximum distance violation in matrix output. If less than or equal to 0 the maximum will be determined by the data." },
576 { "-nlevels", FALSE, etINT, {&nlevels},
577 "Number of levels in the matrix output" },
578 { "-third", FALSE, etBOOL, {&bThird},
579 "Use inverse third power averaging or linear for matrix output" }
582 FILE *out=NULL,*aver=NULL,*numv=NULL,*maxxv=NULL,*xvg=NULL;
594 int ntopatoms,natoms,i,j,kkk;
597 rvec *x,*f,*xav=NULL;
601 atom_id *index=NULL,*ind_fit=NULL;
603 t_cluster_ndx *clust=NULL;
604 t_dr_result dr,*dr_clust=NULL;
606 real *vvindex=NULL,*w_rls=NULL;
612 gmx_rmpbc_t gpbc=NULL;
615 { efTPX, NULL, NULL, ffREAD },
616 { efTRX, "-f", NULL, ffREAD },
617 { efXVG, "-ds", "drsum", ffWRITE },
618 { efXVG, "-da", "draver", ffWRITE },
619 { efXVG, "-dn", "drnum", ffWRITE },
620 { efXVG, "-dm", "drmax", ffWRITE },
621 { efXVG, "-dr", "restr", ffWRITE },
622 { efLOG, "-l", "disres", ffWRITE },
623 { efNDX, NULL, "viol", ffOPTRD },
624 { efPDB, "-q", "viol", ffOPTWR },
625 { efNDX, "-c", "clust", ffOPTRD },
626 { efXPM, "-x", "matrix", ffOPTWR }
628 #define NFILE asize(fnm)
630 cr = init_par(&argc,&argv);
631 CopyRight(stderr,argv[0]);
632 parse_common_args(&argc,argv,PCA_CAN_TIME | PCA_CAN_VIEW | PCA_BE_NICE,
633 NFILE,fnm,asize(pa),pa,asize(desc),desc,0,NULL,&oenv);
635 gmx_log_open(ftp2fn(efLOG,NFILE,fnm),cr,FALSE,0,&fplog);
640 read_tpxheader(ftp2fn(efTPX,NFILE,fnm),&header,FALSE,NULL,NULL);
641 snew(xtop,header.natoms);
642 read_tpx(ftp2fn(efTPX,NFILE,fnm),&ir,box,&ntopatoms,xtop,NULL,NULL,&mtop);
643 bPDB = opt2bSet("-q",NFILE,fnm);
646 snew(ind_fit,ntopatoms);
647 snew(w_rls,ntopatoms);
648 for(kkk=0; (kkk<ntopatoms); kkk++) {
654 *atoms = gmx_mtop_global_atoms(&mtop);
656 if (atoms->pdbinfo == NULL) {
657 snew(atoms->pdbinfo,atoms->nr);
661 top = gmx_mtop_generate_local_top(&mtop,&ir);
665 if (ir.ePBC != epbcNONE) {
666 if (ir.bPeriodicMols)
669 g = mk_graph(fplog,&top->idef,0,mtop.natoms,FALSE,FALSE);
672 if (ftp2bSet(efNDX,NFILE,fnm)) {
673 rd_index(ftp2fn(efNDX,NFILE,fnm),1,&isize,&index,&grpname);
674 xvg=xvgropen(opt2fn("-dr",NFILE,fnm),"Individual Restraints","Time (ps)",
678 for(i=0; (i<isize); i++) {
681 sprintf(leg[i],"index %d",index[i]);
683 xvgr_legend(xvg,isize,(const char**)leg,oenv);
689 init_disres(fplog,&mtop,&ir,NULL,FALSE,&fcd,NULL,FALSE);
691 natoms=read_first_x(oenv,&status,ftp2fn(efTRX,NFILE,fnm),&t,&x,box);
694 init_dr_res(&dr,fcd.disres.nres);
695 if (opt2bSet("-c",NFILE,fnm)) {
696 clust = cluster_index(fplog,opt2fn("-c",NFILE,fnm));
697 snew(dr_clust,clust->clust->nr+1);
698 for(i=0; (i<=clust->clust->nr); i++)
699 init_dr_res(&dr_clust[i],fcd.disres.nres);
702 out =xvgropen(opt2fn("-ds",NFILE,fnm),
703 "Sum of Violations","Time (ps)","nm",oenv);
704 aver=xvgropen(opt2fn("-da",NFILE,fnm),
705 "Average Violation","Time (ps)","nm",oenv);
706 numv=xvgropen(opt2fn("-dn",NFILE,fnm),
707 "# Violations","Time (ps)","#",oenv);
708 maxxv=xvgropen(opt2fn("-dm",NFILE,fnm),
709 "Largest Violation","Time (ps)","nm",oenv);
712 mdatoms = init_mdatoms(fplog,&mtop,ir.efep!=efepNO);
713 atoms2md(&mtop,&ir,0,NULL,0,mtop.natoms,mdatoms);
714 update_mdatoms(mdatoms,ir.fepvals->init_lambda);
716 fprintf(fplog,"Made forcerec\n");
717 init_forcerec(fplog,oenv,fr,NULL,&ir,&mtop,cr,box,FALSE,
718 NULL,NULL,NULL,NULL,NULL,FALSE,-1);
720 if (ir.ePBC != epbcNONE)
721 gpbc = gmx_rmpbc_init(&top->idef,ir.ePBC,natoms,box);
725 if (ir.ePBC != epbcNONE) {
726 if (ir.bPeriodicMols)
727 set_pbc(&pbc,ir.ePBC,box);
729 gmx_rmpbc(gpbc,natoms,box,x);
733 if (j > clust->maxframe)
734 gmx_fatal(FARGS,"There are more frames in the trajectory than in the cluster index file. t = %8f\n",t);
735 my_clust = clust->inv_clust[j];
736 range_check(my_clust,0,clust->clust->nr);
737 check_viol(fplog,cr,&(top->idef.il[F_DISRES]),
738 top->idef.iparams,top->idef.functype,
739 x,f,fr,pbc_null,g,dr_clust,my_clust,isize,index,vvindex,&fcd);
742 check_viol(fplog,cr,&(top->idef.il[F_DISRES]),
743 top->idef.iparams,top->idef.functype,
744 x,f,fr,pbc_null,g,&dr,0,isize,index,vvindex,&fcd);
746 reset_x(atoms->nr,ind_fit,atoms->nr,NULL,x,w_rls);
747 do_fit(atoms->nr,w_rls,x,x);
749 /* Store the first frame of the trajectory as 'characteristic'
750 * for colouring with violations.
752 for(kkk=0; (kkk<atoms->nr); kkk++)
753 copy_rvec(x[kkk],xav[kkk]);
758 fprintf(xvg,"%10g",t);
759 for(i=0; (i<isize); i++)
760 fprintf(xvg," %10g",vvindex[i]);
763 fprintf(out, "%10g %10g\n",t,dr.sumv);
764 fprintf(aver, "%10g %10g\n",t,dr.averv);
765 fprintf(maxxv,"%10g %10g\n",t,dr.maxv);
766 fprintf(numv, "%10g %10d\n",t,dr.nv);
769 } while (read_next_x(oenv,status,&t,natoms,x,box));
771 if (ir.ePBC != epbcNONE)
772 gmx_rmpbc_done(gpbc);
775 dump_clust_stats(fplog,fcd.disres.nres,&(top->idef.il[F_DISRES]),
776 top->idef.iparams,clust->clust,dr_clust,
777 clust->grpname,isize,index);
780 dump_stats(fplog,j,fcd.disres.nres,&(top->idef.il[F_DISRES]),
781 top->idef.iparams,&dr,isize,index,
782 bPDB ? atoms : NULL);
784 write_sto_conf(opt2fn("-q",NFILE,fnm),
785 "Coloured by average violation in Angstrom",
786 atoms,xav,NULL,ir.ePBC,box);
788 dump_disre_matrix(opt2fn_null("-x",NFILE,fnm),&dr,fcd.disres.nres,
789 j,&top->idef,&mtop,max_dr,nlevels,bThird);
796 do_view(oenv,opt2fn("-dr",NFILE,fnm),"-nxy");
798 do_view(oenv,opt2fn("-dn",NFILE,fnm),"-nxy");
799 do_view(oenv,opt2fn("-da",NFILE,fnm),"-nxy");
800 do_view(oenv,opt2fn("-ds",NFILE,fnm),"-nxy");
801 do_view(oenv,opt2fn("-dm",NFILE,fnm),"-nxy");
807 gmx_log_close(fplog);