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 * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
7 * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
8 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
9 * and including many others, as listed in the AUTHORS file in the
10 * top-level source 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.
46 #include "gromacs/commandline/pargs.h"
47 #include "gromacs/commandline/viewit.h"
48 #include "gromacs/correlationfunctions/autocorr.h"
49 #include "gromacs/fileio/enxio.h"
50 #include "gromacs/fileio/gmxfio.h"
51 #include "gromacs/fileio/tpxio.h"
52 #include "gromacs/fileio/trxio.h"
53 #include "gromacs/fileio/xvgr.h"
54 #include "gromacs/gmxana/gmx_ana.h"
55 #include "gromacs/gmxana/gstat.h"
56 #include "gromacs/math/functions.h"
57 #include "gromacs/math/units.h"
58 #include "gromacs/math/vec.h"
59 #include "gromacs/mdlib/energyoutput.h"
60 #include "gromacs/mdtypes/inputrec.h"
61 #include "gromacs/mdtypes/md_enums.h"
62 #include "gromacs/topology/ifunc.h"
63 #include "gromacs/topology/mtop_lookup.h"
64 #include "gromacs/topology/mtop_util.h"
65 #include "gromacs/topology/topology.h"
66 #include "gromacs/trajectory/energyframe.h"
67 #include "gromacs/trajectoryanalysis/topologyinformation.h"
68 #include "gromacs/utility/arraysize.h"
69 #include "gromacs/utility/cstringutil.h"
70 #include "gromacs/utility/fatalerror.h"
71 #include "gromacs/utility/gmxassert.h"
72 #include "gromacs/utility/pleasecite.h"
73 #include "gromacs/utility/smalloc.h"
74 #include "gromacs/utility/strconvert.h"
76 static real minthird = -1.0 / 3.0, minsixth = -1.0 / 6.0;
78 static double mypow(double x, double y)
82 return std::pow(x, y);
90 static real blk_value(t_enxblock* blk, int sub, int index)
92 range_check(index, 0, blk->sub[sub].nr);
93 if (blk->sub[sub].type == xdr_datatype_float)
95 return blk->sub[sub].fval[index];
97 else if (blk->sub[sub].type == xdr_datatype_double)
99 return blk->sub[sub].dval[index];
103 gmx_incons("Unknown datatype in t_enxblock");
107 static int* select_it(int nre, char* nm[], int* nset)
112 gmx_bool bVerbose = TRUE;
114 if ((getenv("GMX_ENER_VERBOSE")) != nullptr)
119 fprintf(stderr, "Select the terms you want from the following list\n");
120 fprintf(stderr, "End your selection with 0\n");
124 for (k = 0; (k < nre);)
126 for (j = 0; (j < 4) && (k < nre); j++, k++)
128 fprintf(stderr, " %3d=%14s", k + 1, nm[k]);
130 fprintf(stderr, "\n");
137 if (1 != scanf("%d", &n))
139 gmx_fatal(FARGS, "Error reading user input");
141 if ((n > 0) && (n <= nre))
148 for (i = (*nset) = 0; (i < nre); i++)
161 static void get_orires_parms(const char* topnm, t_inputrec* ir, int* nor, int* nex, int** label, real** obs)
171 read_tpx(topnm, ir, box, &natoms, nullptr, nullptr, &mtop);
172 top = gmx_mtop_t_to_t_topology(&mtop, FALSE);
174 ip = top.idef.iparams;
175 iatom = top.idef.il[F_ORIRES].iatoms;
177 /* Count how many distance restraint there are... */
178 nb = top.idef.il[F_ORIRES].nr;
181 gmx_fatal(FARGS, "No orientation restraints in topology!\n");
188 for (i = 0; i < nb; i += 3)
190 (*label)[i / 3] = ip[iatom[i]].orires.label;
191 (*obs)[i / 3] = ip[iatom[i]].orires.obs;
192 if (ip[iatom[i]].orires.ex >= *nex)
194 *nex = ip[iatom[i]].orires.ex + 1;
197 fprintf(stderr, "Found %d orientation restraints with %d experiments", *nor, *nex);
198 done_top_mtop(&top, &mtop);
201 static int get_bounds(real** bounds, int** index, int** dr_pair, int* npairs, const InteractionDefinitions& idef)
203 int i, j, k, type, ftype, natom;
208 gmx::ArrayRef<const t_functype> functype = idef.functype;
209 gmx::ArrayRef<const t_iparams> iparams = idef.iparams;
211 /* Count how many distance restraint there are... */
212 nb = idef.il[F_DISRES].size();
215 gmx_fatal(FARGS, "No distance restraints in topology!\n");
218 /* Allocate memory */
223 /* Fill the bound array */
225 for (gmx::index i = 0; i < functype.ssize(); i++)
228 if (ftype == F_DISRES)
231 label1 = iparams[i].disres.label;
232 b[nb] = iparams[i].disres.up1;
239 /* Fill the index array */
241 const InteractionList& disres = idef.il[F_DISRES];
242 gmx::ArrayRef<const int> iatom = disres.iatoms;
243 for (i = j = k = 0; (i < disres.size());)
246 ftype = functype[type];
247 natom = interaction_function[ftype].nratoms + 1;
248 if (label1 != iparams[type].disres.label)
251 label1 = iparams[type].disres.label;
261 gmx_incons("get_bounds for distance restraints");
271 calc_violations(real rt[], real rav3[], int nb, const int index[], real bounds[], real* viol, double* st, double* sa)
273 const real sixth = 1.0 / 6.0;
275 double rsum, rav, sumaver, sumt;
279 for (i = 0; (i < nb); i++)
283 for (j = index[i]; (j < index[i + 1]); j++)
287 viol[j] += mypow(rt[j], -3.0);
289 rav += gmx::square(rav3[j]);
290 rsum += mypow(rt[j], -6);
292 rsum = std::max(0.0, mypow(rsum, -sixth) - bounds[i]);
293 rav = std::max(0.0, mypow(rav, -sixth) - bounds[i]);
302 static void analyse_disre(const char* voutfn,
309 const gmx_output_env_t* oenv)
312 double sum, sumt, sumaver;
315 /* Subtract bounds from distances, to calculate violations */
316 calc_violations(violaver, violaver, nbounds, pair, bounds, nullptr, &sumt, &sumaver);
319 fprintf(stdout, "\nSum of violations averaged over simulation: %g nm\n", sumaver);
320 fprintf(stdout, "Largest violation averaged over simulation: %g nm\n\n", sumt);
322 vout = xvgropen(voutfn, "r\\S-3\\N average violations", "DR Index", "nm", oenv);
325 for (i = 0; (i < nbounds); i++)
327 /* Do ensemble averaging */
329 for (j = pair[i]; (j < pair[i + 1]); j++)
331 sumaver += gmx::square(violaver[j] / real(nframes));
333 sumaver = std::max(0.0, mypow(sumaver, minsixth) - bounds[i]);
336 sum = std::max(sum, sumaver);
337 fprintf(vout, "%10d %10.5e\n", index[i], sumaver);
340 for (j = 0; (j < dr.ndr); j++)
342 fprintf(vout, "%10d %10.5e\n", j, mypow(violaver[j] / real(nframes), minthird));
347 fprintf(stdout, "\nSum of violations averaged over simulation: %g nm\n", sumt);
348 fprintf(stdout, "Largest violation averaged over simulation: %g nm\n\n", sum);
350 do_view(oenv, voutfn, "-graphtype bar");
353 static void print_time(FILE* fp, double t)
355 fprintf(fp, "%12.6f", t);
358 int gmx_nmr(int argc, char* argv[])
360 const char* desc[] = {
361 "[THISMODULE] extracts distance or orientation restraint",
362 "data from an energy file. The user is prompted to interactively",
363 "select the desired terms.[PAR]",
365 "When the [TT]-viol[tt] option is set, the time averaged",
366 "violations are plotted and the running time-averaged and",
367 "instantaneous sum of violations are recalculated. Additionally",
368 "running time-averaged and instantaneous distances between",
369 "selected pairs can be plotted with the [TT]-pairs[tt] option.[PAR]",
371 "Options [TT]-ora[tt], [TT]-ort[tt], [TT]-oda[tt], [TT]-odr[tt] and",
372 "[TT]-odt[tt] are used for analyzing orientation restraint data.",
373 "The first two options plot the orientation, the last three the",
374 "deviations of the orientations from the experimental values.",
375 "The options that end on an 'a' plot the average over time",
376 "as a function of restraint. The options that end on a 't'",
377 "prompt the user for restraint label numbers and plot the data",
378 "as a function of time. Option [TT]-odr[tt] plots the RMS",
379 "deviation as a function of restraint.",
380 "When the run used time or ensemble averaged orientation restraints,",
381 "option [TT]-orinst[tt] can be used to analyse the instantaneous,",
382 "not ensemble-averaged orientations and deviations instead of",
383 "the time and ensemble averages.[PAR]",
385 "Option [TT]-oten[tt] plots the eigenvalues of the molecular order",
386 "tensor for each orientation restraint experiment. With option",
387 "[TT]-ovec[tt] also the eigenvectors are plotted.[PAR]",
391 static gmx_bool bPrAll = FALSE;
392 static gmx_bool bDp = FALSE, bOrinst = FALSE, bOvec = FALSE;
395 { "-dp", FALSE, etBOOL, { &bDp }, "Print energies in high precision" },
396 { "-skip", FALSE, etINT, { &skip }, "Skip number of frames between data points" },
401 "Also print the exact average and rmsd stored in the energy frames (only when 1 term is "
403 { "-orinst", FALSE, etBOOL, { &bOrinst }, "Analyse instantaneous orientation data" },
404 { "-ovec", FALSE, etBOOL, { &bOvec }, "Also plot the eigenvectors with [TT]-oten[tt]" }
406 const char* drleg[] = { "Running average", "Instantaneous" };
408 FILE /* *out = NULL,*/ *out_disre = nullptr, *fp_pairs = nullptr, *fort = nullptr,
409 *fodt = nullptr, *foten = nullptr;
412 gmx_enxnm_t* enm = nullptr;
414 int nre, teller, teller_disre;
415 int nor = 0, nex = 0, norfr = 0, enx_i = 0;
416 real *bounds = nullptr, *violaver = nullptr, *oobs = nullptr, *orient = nullptr, *odrms = nullptr;
417 int * index = nullptr, *pair = nullptr, norsel = 0, *orsel = nullptr, *or_label = nullptr;
418 int nbounds = 0, npairs;
419 gmx_bool bDisRe, bDRAll, bORA, bORT, bODA, bODR, bODT, bORIRE, bOTEN;
421 double sumaver, sumt;
422 int * set = nullptr, i, j, k, nset, sss;
423 char ** pairleg, **odtleg, **otenleg;
424 char** leg = nullptr;
425 const char *anm_j, *anm_k, *resnm_j, *resnm_k;
426 int resnr_j, resnr_k;
427 const char* orinst_sub = "@ subtitle \"instantaneous\"\n";
429 gmx_output_env_t* oenv;
430 t_enxblock* blk_disre = nullptr;
433 t_filenm fnm[] = { { efEDR, "-f", nullptr, ffREAD },
434 { efEDR, "-f2", nullptr, ffOPTRD },
435 { efTPR, "-s", nullptr, ffOPTRD },
436 // { efXVG, "-o", "energy", ffWRITE },
437 { efXVG, "-viol", "violaver", ffOPTWR },
438 { efXVG, "-pairs", "pairs", ffOPTWR },
439 { efXVG, "-ora", "orienta", ffOPTWR },
440 { efXVG, "-ort", "orientt", ffOPTWR },
441 { efXVG, "-oda", "orideva", ffOPTWR },
442 { efXVG, "-odr", "oridevr", ffOPTWR },
443 { efXVG, "-odt", "oridevt", ffOPTWR },
444 { efXVG, "-oten", "oriten", ffOPTWR } };
445 #define NFILE asize(fnm)
449 if (!parse_common_args(&argc, argv, PCA_CAN_VIEW | PCA_CAN_BEGIN | PCA_CAN_END, NFILE, fnm,
450 npargs, pa, asize(desc), desc, 0, nullptr, &oenv))
455 bDRAll = opt2bSet("-pairs", NFILE, fnm);
456 bDisRe = opt2bSet("-viol", NFILE, fnm) || bDRAll;
457 bORA = opt2bSet("-ora", NFILE, fnm);
458 bORT = opt2bSet("-ort", NFILE, fnm);
459 bODA = opt2bSet("-oda", NFILE, fnm);
460 bODR = opt2bSet("-odr", NFILE, fnm);
461 bODT = opt2bSet("-odt", NFILE, fnm);
462 bORIRE = bORA || bORT || bODA || bODR || bODT;
463 bOTEN = opt2bSet("-oten", NFILE, fnm);
464 if (!(bDRAll || bDisRe || bORA || bORT || bODA || bODR || bODT || bORIRE || bOTEN))
466 printf("No output selected. Run with -h to see options. Terminating program.\n");
471 fp = open_enx(ftp2fn(efEDR, NFILE, fnm), "r");
472 do_enxnms(fp, &nre, &enm);
473 free_enxnms(nre, enm);
475 t_inputrec irInstance;
476 t_inputrec* ir = &irInstance;
478 gmx::TopologyInformation topInfo;
479 std::unique_ptr<gmx_localtop_t> top;
484 get_orires_parms(ftp2fn(efTPR, NFILE, fnm), ir, &nor, &nex, &or_label, &oobs);
508 fprintf(stderr, "Select the orientation restraint labels you want (-1 is all)\n");
509 fprintf(stderr, "End your selection with 0\n");
515 srenew(orsel, j + 1);
516 if (1 != scanf("%d", &(orsel[j])))
518 gmx_fatal(FARGS, "Error reading user input");
520 } while (orsel[j] > 0);
523 fprintf(stderr, "Selecting all %d orientation restraints\n", nor);
526 for (i = 0; i < nor; i++)
533 /* Build the selection */
535 for (i = 0; i < j; i++)
537 for (k = 0; k < nor; k++)
539 if (or_label[k] == orsel[i])
548 fprintf(stderr, "Orientation restraint label %d not found\n", orsel[i]);
552 snew(odtleg, norsel);
553 for (i = 0; i < norsel; i++)
555 snew(odtleg[i], 256);
556 sprintf(odtleg[i], "%d", or_label[orsel[i]]);
560 fort = xvgropen(opt2fn("-ort", NFILE, fnm), "Calculated orientations",
561 "Time (ps)", "", oenv);
562 if (bOrinst && output_env_get_print_xvgr_codes(oenv))
564 fprintf(fort, "%s", orinst_sub);
566 xvgr_legend(fort, norsel, odtleg, oenv);
570 fodt = xvgropen(opt2fn("-odt", NFILE, fnm), "Orientation restraint deviation",
571 "Time (ps)", "", oenv);
572 if (bOrinst && output_env_get_print_xvgr_codes(oenv))
574 fprintf(fodt, "%s", orinst_sub);
576 xvgr_legend(fodt, norsel, odtleg, oenv);
578 for (i = 0; i < norsel; i++)
587 foten = xvgropen(opt2fn("-oten", NFILE, fnm), "Order tensor", "Time (ps)", "", oenv);
588 snew(otenleg, bOvec ? nex * 12 : nex * 3);
589 for (i = 0; i < nex; i++)
591 for (j = 0; j < 3; j++)
593 sprintf(buf, "eig%d", j + 1);
594 otenleg[(bOvec ? 12 : 3) * i + j] = gmx_strdup(buf);
598 for (j = 0; j < 9; j++)
600 sprintf(buf, "vec%d%s", j / 3 + 1, j % 3 == 0 ? "x" : (j % 3 == 1 ? "y" : "z"));
601 otenleg[12 * i + 3 + j] = gmx_strdup(buf);
605 xvgr_legend(foten, bOvec ? nex * 12 : nex * 3, otenleg, oenv);
606 for (j = 0; j < 3; j++)
616 topInfo.fillFromInputFile(ftp2fn(efTPR, NFILE, fnm));
617 top = std::make_unique<gmx_localtop_t>(topInfo.mtop()->ffparams);
618 gmx_mtop_generate_local_top(*topInfo.mtop(), top.get(), ir->efep != efepNO);
620 nbounds = get_bounds(&bounds, &index, &pair, &npairs, top->idef);
621 snew(violaver, npairs);
622 out_disre = xvgropen(opt2fn("-o", NFILE, fnm), "Sum of Violations", "Time (ps)", "nm", oenv);
623 xvgr_legend(out_disre, 2, drleg, oenv);
626 fp_pairs = xvgropen(opt2fn("-pairs", NFILE, fnm), "Pair Distances", "Time (ps)",
627 "Distance (nm)", oenv);
628 if (output_env_get_print_xvgr_codes(oenv))
630 fprintf(fp_pairs, "@ subtitle \"averaged (tau=%g) and instantaneous\"\n", ir->dr_tau);
635 /* Initiate counters */
640 /* This loop searches for the first frame (when -b option is given),
641 * or when this has been found it reads just one energy frame
645 bCont = do_enx(fp, &fr);
648 timecheck = check_times(fr.t);
650 } while (bCont && (timecheck < 0));
652 if ((timecheck == 0) && bCont)
655 * Define distance restraint legends. Can only be done after
656 * the first frame has been read... (Then we know how many there are)
658 blk_disre = find_block_id_enxframe(&fr, enxDISRE, nullptr);
659 if (bDisRe && bDRAll && !leg && blk_disre)
661 const InteractionList& ilist = top->idef.il[F_DISRES];
662 gmx::ArrayRef<const int> fa = ilist.iatoms;
663 const t_iparams* ip = top->idef.iparams.data();
664 if (blk_disre->nsub != 2 || (blk_disre->sub[0].nr != blk_disre->sub[1].nr))
666 gmx_incons("Number of disre sub-blocks not equal to 2");
669 ndisre = blk_disre->sub[0].nr;
670 if (ndisre != ilist.size() / 3)
673 "Number of disre pairs in the energy file (%d) does not match the "
674 "number in the run input file (%d)\n",
675 ndisre, ilist.size() / 3);
677 snew(pairleg, ndisre);
679 for (i = 0; i < ndisre; i++)
681 snew(pairleg[i], 30);
684 mtopGetAtomAndResidueName(topInfo.mtop(), j, &molb, &anm_j, &resnr_j, &resnm_j, nullptr);
685 mtopGetAtomAndResidueName(topInfo.mtop(), k, &molb, &anm_k, &resnr_k, &resnm_k, nullptr);
686 sprintf(pairleg[i], "%d %s %d %s (%d)", resnr_j, anm_j, resnr_k, anm_k,
687 ip[fa[3 * i]].disres.label);
689 set = select_it(ndisre, pairleg, &nset);
691 for (i = 0; (i < nset); i++)
693 snew(leg[2 * i], 32);
694 sprintf(leg[2 * i], "a %s", pairleg[set[i]]);
695 snew(leg[2 * i + 1], 32);
696 sprintf(leg[2 * i + 1], "i %s", pairleg[set[i]]);
698 xvgr_legend(fp_pairs, 2 * nset, leg, oenv);
702 * Printing time, only when we do not want to skip frames
704 if (!skip || teller % skip == 0)
708 /*******************************************
709 * D I S T A N C E R E S T R A I N T S
710 *******************************************/
713 GMX_RELEASE_ASSERT(blk_disre != nullptr,
714 "Trying to dereference NULL blk_disre pointer");
716 float* disre_rt = blk_disre->sub[0].fval;
717 float* disre_rm3tav = blk_disre->sub[1].fval;
719 double* disre_rt = blk_disre->sub[0].dval;
720 double* disre_rm3tav = blk_disre->sub[1].dval;
723 print_time(out_disre, fr.t);
724 if (violaver == nullptr)
726 snew(violaver, ndisre);
729 /* Subtract bounds from distances, to calculate violations */
730 calc_violations(disre_rt, disre_rm3tav, nbounds, pair, bounds, violaver,
733 fprintf(out_disre, " %8.4f %8.4f\n", sumaver, sumt);
736 print_time(fp_pairs, fr.t);
737 for (i = 0; (i < nset); i++)
740 fprintf(fp_pairs, " %8.4f", mypow(disre_rm3tav[sss], minthird));
741 fprintf(fp_pairs, " %8.4f", disre_rt[sss]);
743 fprintf(fp_pairs, "\n");
749 /*******************************************
751 *******************************************/
754 t_enxblock* blk = find_block_id_enxframe(&fr, enx_i, nullptr);
759 gmx_fatal(FARGS, "Orientational restraints read in incorrectly.");
762 if (blk->sub[0].nr != nor)
765 "Number of orientation restraints in energy file (%d) does "
766 "not match with the topology (%d)",
767 blk->sub[0].nr, nor);
771 for (i = 0; i < nor; i++)
773 orient[i] += blk_value(blk, 0, i);
778 for (i = 0; i < nor; i++)
780 real v = blk_value(blk, 0, i);
781 odrms[i] += gmx::square(v - oobs[i]);
786 fprintf(fort, " %10f", fr.t);
787 for (i = 0; i < norsel; i++)
789 fprintf(fort, " %g", blk_value(blk, 0, orsel[i]));
795 fprintf(fodt, " %10f", fr.t);
796 for (i = 0; i < norsel; i++)
798 fprintf(fodt, " %g", blk_value(blk, 0, orsel[i]) - oobs[orsel[i]]);
804 blk = find_block_id_enxframe(&fr, enxORT, nullptr);
809 gmx_fatal(FARGS, "Orientational restraints read in incorrectly");
812 if (blk->sub[0].nr != nex * 12)
815 "Number of orientation experiments in energy file (%d) does "
816 "not match with the topology (%d)",
817 blk->sub[0].nr / 12, nex);
819 fprintf(foten, " %10f", fr.t);
820 for (i = 0; i < nex; i++)
822 for (j = 0; j < (bOvec ? 12 : 3); j++)
824 fprintf(foten, " %g", blk_value(blk, 0, i * 12 + j));
827 fprintf(foten, "\n");
833 } while (bCont && (timecheck == 0));
836 fprintf(stderr, "\n");
840 xvgrclose(out_disre);
858 FILE* out = xvgropen(opt2fn("-ora", NFILE, fnm), "Average calculated orientations",
859 "Restraint label", "", oenv);
860 if (bOrinst && output_env_get_print_xvgr_codes(oenv))
862 fprintf(out, "%s", orinst_sub);
864 for (i = 0; i < nor; i++)
866 fprintf(out, "%5d %g\n", or_label[i], orient[i] / real(norfr));
872 FILE* out = xvgropen(opt2fn("-oda", NFILE, fnm), "Average restraint deviation",
873 "Restraint label", "", oenv);
874 if (bOrinst && output_env_get_print_xvgr_codes(oenv))
876 fprintf(out, "%s", orinst_sub);
878 for (i = 0; i < nor; i++)
880 fprintf(out, "%5d %g\n", or_label[i], orient[i] / real(norfr) - oobs[i]);
886 FILE* out = xvgropen(opt2fn("-odr", NFILE, fnm), "RMS orientation restraint deviations",
887 "Restraint label", "", oenv);
888 if (bOrinst && output_env_get_print_xvgr_codes(oenv))
890 fprintf(out, "%s", orinst_sub);
892 for (i = 0; i < nor; i++)
894 fprintf(out, "%5d %g\n", or_label[i], std::sqrt(odrms[i] / real(norfr)));
898 // Clean up orires variables.
911 analyse_disre(opt2fn("-viol", NFILE, fnm), teller_disre, violaver, bounds, index, pair,
915 const char* nxy = "-nxy";
917 do_view(oenv, opt2fn_null("-ora", NFILE, fnm), nxy);
918 do_view(oenv, opt2fn_null("-ort", NFILE, fnm), nxy);
919 do_view(oenv, opt2fn_null("-oda", NFILE, fnm), nxy);
920 do_view(oenv, opt2fn_null("-odr", NFILE, fnm), nxy);
921 do_view(oenv, opt2fn_null("-odt", NFILE, fnm), nxy);
922 do_view(oenv, opt2fn_null("-oten", NFILE, fnm), nxy);
924 output_env_done(oenv);