def generate_mol_atom_subset_map(md_topology, md_subset_topology, resname = 'MOL', **kwargs):
    """
    generate an index dictionary map from the topology to the subset topology

    arguments
        md_topology : mdtraj.topology
            topology that will be queried (often a solvated small molecule or a molecule in complex)
        md_subset_topology : mdtraj.Topology
            topology subset that will be queried (this is often a vacuum topology of a small molecule of interest)
        resname : str, default 'MOL'
            resname string that will be extracted for map

    returns
        index_map : dict
            index map of {md_top_atom_index : md_subset_top_atom_index} of the matching atoms where key is the index of the md_topology atom and the value is the index of the matching md_subset_topology atom
        species_str : list of str
            list of atom elements corresponding to the index_map

    NOTE : there are internal consistency check to ensure that the atom names are consistent between the two topologies

    """

    top_indices = md_topology.select(f'resname {resname}')
    subset_top_indices = md_subset_topology.select(f"resname {resname}")
    assert len(top_indices) == len(subset_top_indices)

    top_atom_names = [md_topology.atom(i).name for i in top_indices]
    subset_top_atom_names = [md_subset_topology.atom(i).name for i in subset_top_indices]
    assert all(i==j for i,j in zip(top_atom_names, subset_top_atom_names))

    index_map = {top_index : subset_top_index for top_index, subset_top_index in zip(top_indices, subset_top_indices)}
    species_str = [md_subset_topology.atom(i).element.symbol for i in subset_top_indices]
    return index_map, species_str