Convert ReSpecTh XML file to ChemKED-compliant dictionary.

    Args:
        filename_xml (`str`): Name of ReSpecTh XML file to be converted.
        file_author (`str`, optional): Name to override original file author
        file_author_orcid (`str`, optional): ORCID of file author
        validate (`bool`, optional, keyword-only): Set to `True` to validate the resulting
            property dictionary with `ChemKED`. Set to `False` if the file is being loaded and will
            be validated at some other point before use.

def ReSpecTh_to_ChemKED(filename_xml, file_author='', file_author_orcid='', *, validate=False):
    """Convert ReSpecTh XML file to ChemKED-compliant dictionary.

    Args:
        filename_xml (`str`): Name of ReSpecTh XML file to be converted.
        file_author (`str`, optional): Name to override original file author
        file_author_orcid (`str`, optional): ORCID of file author
        validate (`bool`, optional, keyword-only): Set to `True` to validate the resulting
            property dictionary with `ChemKED`. Set to `False` if the file is being loaded and will
            be validated at some other point before use.
    """
    # get all information from XML file
    tree = etree.parse(filename_xml)
    root = tree.getroot()

    # get file metadata
    properties = get_file_metadata(root)

    # get reference info
    properties['reference'] = get_reference(root)
    # Save name of original data filename
    properties['reference']['detail'] = (properties['reference'].get('detail', '') +
                                         'Converted from ReSpecTh XML file ' +
                                         os.path.basename(filename_xml)
                                         )

    # Ensure ignition delay, and get which kind of experiment
    properties.update(get_experiment_kind(root))

    # Get properties shared across the file
    properties['common-properties'] = get_common_properties(root)

    # Determine definition of ignition delay
    properties['common-properties']['ignition-type'] = get_ignition_type(root)

    # Now parse ignition delay datapoints
    properties['datapoints'] = get_datapoints(root)

    # Ensure inclusion of pressure rise or volume history matches apparatus.
    has_pres_rise = ('pressure-rise' in properties['common-properties'] or
                     any([True for dp in properties['datapoints'] if 'pressure-rise' in dp])
                     )
    if has_pres_rise and properties['apparatus']['kind'] == 'rapid compression machine':
        raise KeywordError('Pressure rise cannot be defined for RCM.')

    has_vol_hist = any(
        [t.get('type') == 'volume' for dp in properties['datapoints']
         for t in dp.get('time-histories', [{}])]
    )
    if has_vol_hist and properties['apparatus']['kind'] == 'shock tube':
        raise KeywordError('Volume history cannot be defined for shock tube.')

    # add any additional file authors
    if file_author_orcid and not file_author:
        raise KeywordError('If file_author_orcid is specified, file_author must be as well')

    if file_author:
        temp_author = {'name': file_author}
        if file_author_orcid:
            temp_author['ORCID'] = file_author_orcid
        properties['file-authors'].append(temp_author)

    # Now go through datapoints and apply common properties
    for idx in range(len(properties['datapoints'])):
        for prop in properties['common-properties']:
            properties['datapoints'][idx][prop] = properties['common-properties'][prop]

    if validate:
        chemked.ChemKED(dict_input=properties)

    return properties