Source code for fairmd.lipids.bin.evaluate_quality

#!/usr/bin/env python3
"""
Perform comparison of experiments and simulations.

The script compares according to **EXPERIMENT** field inside :ref:`the simulation README.yaml file <readmesimu>`.
In the standard protocol, it should be run *after* :ref:`fmdl_match_experiments <match_experiments_py>`.

**Usage:**

.. code-block:: console

    fmdl_evaluate_quality [--op-only | --ff-only] [ --idlist=414,536 ]

No arguments means that both OP and FF qualities are evaluated for everything.
"""

import argparse

import fairmd.lipids.quality as qq
from fairmd.lipids.experiment import ExperimentCollection


def _evaluate_op_qualities(simulations) -> int:
    counter = 0
    opexps = ExperimentCollection.load_from_data("OPExperiment")
    for simulation in simulations:
        evaluator = qq.OPQualityEvaluator(simulation, opexps)
        if evaluator.evaluate_one():
            evaluator.save_results()
            counter += 1
    return counter


def _evaluate_ff_qualities(simulations) -> int:
    counter = 0
    ffexps = ExperimentCollection.load_from_data("FFExperiment")
    for simulation in simulations:
        print("Evaluating Sim#%d:" % simulation["ID"])
        evaluator = qq.FFQualityEvaluator(simulation, ffexps)
        if evaluator.evaluate_one():
            evaluator.save_results()
            counter += 1
    return counter


[docs] def evaluate_quality_impl(id_list: list[int] | None = None, *, do_op: bool = True, do_ff: bool = True) -> None: simulations = qq.QualSimulation.load_all_paired(id_list) evaluated_op_counter = _evaluate_op_qualities(simulations) if do_op else 0 evaluated_ff_counter = _evaluate_ff_qualities(simulations) if do_ff else 0 print("The number of systems with evaluated order parameters:", evaluated_op_counter) print("The number of systems with evaluated form factors:", evaluated_ff_counter)
[docs] def evaluate_quality(): parser = argparse.ArgumentParser() parser.add_argument( "--op-only", action="store_true", help="Evaluate order parameters only (skip form factors)", ) parser.add_argument( "--ff-only", action="store_true", help="Evaluate form factors only (skip order parameters)", ) parser.add_argument( "--idlist", type=lambda s: [int(x) for x in s.split(",")], default=None, help="Comma-separated list of IDs to evaluate (e.g. 1,2,3)", ) args = parser.parse_args() if args.op_only and args.ff_only: msg = "Incompatible arguments. Please choose one." raise RuntimeError(msg) evaluate_quality_impl( id_list=args.idlist, do_op=not args.ff_only, do_ff=not args.op_only, )
if __name__ == "__main__": evaluate_quality()