def VR(VR=None, description=None):
    """ Value Representation (VR) <-> Description lookup.

    :param VR: Takes the VR and returns its description
    :param description: Take the description of a VR and returns the VR
    """
    value_repr = {'AE': 'Application Entity', 'AS': 'Age String', 'AT':
        'Attribute Tag', 'CS': 'Code String', 'DA': 'Date', 'DS':
        'Decimal String', 'DT': 'Date/Time', 'FL':
        'Floating Point Single (4 bytes)', 'FD':
        'Floating Point Double (8 bytes)', 'IS': 'Integer String', 'LO':
        'Long String', 'LT': 'Long Text', 'OB': 'Other Byte', 'OF':
        'Other Float', 'OW': 'Other Word', 'PN': 'Person Name', 'SH':
        'Short String', 'SL': 'Signed Long', 'SQ': 'Sequence of Items',
        'SS': 'Signed Short', 'ST': 'Short Text', 'TM': 'Time', 'UI':
        'Unique Identifier', 'UL': 'Unsigned Long', 'UN': 'Unknown', 'US':
        'Unsigned Short', 'UT': 'Unlimited Text'}
    assert VR or description, 'Either VR or description required to map VR'
    if VR is not None:
        VR = VR.upper()
        if VR in value_repr:
            return value_repr[VR]
    for key, value in value_repr.iteritems():
        if description == value:
            return key
    return None
