Source code for schrodinger.test.stu.outcomes.custom.perceptual_diff
"""
Contains the workup is `perceptual_diff`
@copyright: Schrodinger, LLC. All rights reserved.
"""
import os
import socket
import sys
from schrodinger.test.stu import common
from schrodinger.test.stu.outcomes.standard_workups import WorkupFailure
from schrodinger.utils import subprocess
logger = common.logger
def _get_perceptual_diff_loc():
perceptualdiff = 'perceptualdiff'
platform = sys.platform.lower()
if platform.startswith('win'):
platform = 'WIN32-x86'
perceptualdiff += '.exe'
elif 'darwin' in platform:
platform = 'Darwin-x86_64'
else:
platform = 'Linux-x86_64'
return os.path.join(os.environ['SCHRODINGER_LIB'], platform,
'perceptualdiff-1.1.1', perceptualdiff)
[docs]def perceptual_diff(std_image, test_image):
"""
Run Perceptual Diff to compare a test image to a standard.
The workup requires access to the shared installation of Perceptual Diff
in /nfs/software/lib/<platform>/. It expects host-specific std images to
be located in a subdirectory of the test named references/<hostname>/.
For example, for the host pdx-desk-l03.schrodinger.com, refeerences are
expected in stu_<testid>/references/pdx-desk-l03.schrodinger.com/.
usage: custom.perceptual_diff.perceptual_diff(std_image, test_image)
"""
test_image_full_path = os.path.join(os.getcwd(), test_image)
std_image_full_path = os.path.join(os.getcwd(), 'references',
socket.gethostname(), std_image)
if not os.path.isfile(test_image_full_path):
raise WorkupFailure('Could not find test file: '
'{}'.format(test_image_full_path))
elif not os.path.isfile(std_image_full_path):
raise WorkupFailure('Could not find reference file: '
'{}'.format(std_image_full_path))
else:
per_diff = _get_perceptual_diff_loc()
per_diff_cmd = [per_diff, std_image_full_path, test_image_full_path]
try:
exit_code = subprocess.call(per_diff_cmd)
except Exception as err:
raise WorkupFailure('ERROR: Perceptual Diff failed '
'with error {}'.format(err))
if exit_code == 0:
return True
else:
raise WorkupFailure('Perceptual Diff comparison failed. {} does '
'not match {}'.format(std_image_full_path,
test_image_full_path))