Source code for opmcoils.metrics

"""Metrics for evaluating coil designs."""

# Authors: Mainak Jas <mjas@mgh.harvard.edu>
#          Padma Sundaram <padma@nmr.mgh.harvard.edu>

import numpy as np

def _percent_error(biplanar_coil, target_field, target_points, target_type):
    field = biplanar_coil.predict(target_points)
    ax = {'x': 0, 'y': 1, 'z': 2}[target_type.split('_')[1][0]]
    return np.abs((field[:, ax] - target_field[:, ax]) / target_field[:, ax])

[docs] def homogeneity(biplanar_coil, target_field, target_points, target_type, allowed_error=0.05): """Compute homogeneity percentage with discretized current loops.""" err = _percent_error(biplanar_coil, target_field, target_points, target_type) count = np.sum(err <= allowed_error) return count / target_field.shape[0] * 100
[docs] def efficiency(biplanar_coil, target_points, target_points_z, target_type): """Compute efficiency with discretized current loops.""" ax = {'x': 0, 'y': 1, 'z': 2}[target_type.split('_')[1][0]] current_loops = biplanar_coil.line_conductor_ mesh = biplanar_coil.remove_shield() if mesh is not None: field_nounits = biplanar_coil.predict(target_points) field_z_nounits = biplanar_coil.predict(target_points_z) biplanar_coil.add_shield(mesh) field_nounits_shield = biplanar_coil.predict(target_points) field_z_nounits_shield = biplanar_coil.predict(target_points_z) shield_factor = field_nounits_shield / field_nounits shield_factor_z = field_z_nounits_shield / field_z_nounits if 'dc' in target_type: field = current_loops.magnetic_field(points=target_points) if mesh is not None: field *= shield_factor # print(field * 1e-3 * 1e9) efficiency = np.mean(field * 1e-3 * 1e9, axis=0)[ax] unit = 'nT / mA' elif 'grad' in target_type: field = current_loops.magnetic_field(points=target_points_z) if mesh is not None: field *= shield_factor_z dB = (field[-1, ax] - field[0, ax]) * 1e-3 * 1e9 # nT dz = target_points_z[-1, 2] - target_points_z[0, 2] # add statement to assert dz remains constant efficiency = dB / dz unit = 'nT / m / mA' return efficiency, unit
def error(biplanar_coil, target_field, target_points, target_type): """Compute error percentage with idealized current loops. coil : The coil object. target_field : array, shape (n_points, 3) The target field target_type : str 'gradient_x' | 'gradient_y' | 'dc_x' | 'dc_y' etc. """ return np.mean( _percent_error(biplanar_coil, target_field, target_points, target_type)) * 100