示例#1
0
def get_wf_xas(absorbing_atom, structure, feff_input_set="pymatgen.io.feff.sets.MPXANESSet",
               edge="K", radius=10.0, feff_cmd="feff", db_file=None, metadata=None,
               user_tag_settings=None, use_primitive=False):
    """
    Returns FEFF XANES/EXAFS spectroscopy workflow.

    Args:
        absorbing_atom (str/int): absorbing atom symbol or site index. If the symbol is given,
             then the returned workflow will have fireworks for each absorbing site with the
             same symbol.
        structure (Structure): input structure
        feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then either the entire path to the class or spectrum type must be provided
                e.g. "pymatgen.io.feff.sets.MPXANESSet" or "XANES"
        edge (str): absorption edge. Example: K, L1, L2, L3
        radius (float): cluster radius in angstroms. Ignored for K space calculations
        feff_cmd (str): path to the feff binary
        db_file (str):  path to the db file.
        metadata (dict): meta data
        user_tag_settings (dict): override feff default tag settings
        use_primitive (bool): convert the structure to primitive form. This helps to
            reduce the number of fireworks in the workflow if the absorbing atom is
            specified by its atomic symbol.

    Returns:
        Workflow
    """
    if use_primitive:
        structure = structure.get_primitive_structure()

    # get the absorbing atom site index/indices
    ab_atom_indices = get_absorbing_atom_indices(structure, absorbing_atom)

    override_default_feff_params = {"user_tag_settings": user_tag_settings}

    spectrum_type = get_feff_input_set_obj(feff_input_set, ab_atom_indices[0], structure).__class__.__name__[2:-3]

    # add firework for each absorbing atom site index
    fws = []
    for ab_idx in ab_atom_indices:
        fw_metadata = dict(metadata) if metadata else {}
        fw_metadata["absorbing_atom_index"] = ab_idx
        fw_name = "{}-{}-{}".format(spectrum_type, edge, ab_idx)
        fws.append(XASFW(ab_idx, structure, edge=edge, radius=radius,
                         feff_input_set=feff_input_set, feff_cmd=feff_cmd, db_file=db_file,
                         metadata=fw_metadata, name=fw_name,
                         override_default_feff_params=override_default_feff_params))

    wf_metadata = dict(metadata) if metadata else {}
    wf_metadata["absorbing_atom_indices"] = list(ab_atom_indices)
    wfname = "{}:{}:{} edge".format(structure.composition.reduced_formula,
                                    "{} spectroscopy".format(spectrum_type), edge)

    return Workflow(fws, name=wfname, metadata=wf_metadata)
示例#2
0
    def __init__(self, absorbing_atom, structure, feff_input_set="ELNES", edge="K", radius=10.,
                 name="EELS spectroscopy", beam_energy=100, beam_direction=None, collection_angle=1,
                 convergence_angle=1, user_eels_settings=None, feff_cmd="feff",
                 override_default_feff_params=None, db_file=None, parents=None, metadata=None,
                 **kwargs):
        """
        Write the input set for FEFF-EELSS spectroscopy, run feff and insert the core-loss spectrum
        to the database(or dump to a json file if db_file=None).

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then the entire path to the class or the spectrum type must be provide
                e.g. "pymatgen.io.feff.sets.MPELNESSet" or "ELNES"
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            beam_energy (float): Incident beam energy in keV
            beam_direction (list): Incident beam direction. If None, the cross section will be averaged.
            collection_angle (float): Detector collection angle in mrad.
            convergence_angle (float): Beam convergence angle in mrad.
            user_eels_settings (dict): override default EELS config. See MPELNESSet.yaml for supported keys.
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            db_file (str): path to the db file.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}

        feff_input_set = get_feff_input_set_obj(feff_input_set, absorbing_atom, structure, edge,
                                                radius, beam_energy, beam_direction, collection_angle,
                                                convergence_angle, user_eels_settings=user_eels_settings,
                                                **override_default_feff_params)
        spectrum_type = feff_input_set.__class__.__name__[2:-3]

        t = [WriteFeffFromIOSet(absorbing_atom=absorbing_atom, structure=structure, radius=radius,
                                feff_input_set=feff_input_set),
             RunFeffDirect(feff_cmd=feff_cmd),
             PassCalcLocs(name=name),
             SpectrumToDbTask(absorbing_atom=absorbing_atom, structure=structure,
                              db_file=db_file, spectrum_type=spectrum_type, edge=edge,
                              output_file="eels.dat", metadata=metadata)]

        super(EELSFW, self).__init__(t, parents=parents, name="{}-{}".
                                     format(structure.composition.reduced_formula, name), **kwargs)
示例#3
0
    def __init__(self, absorbing_atom, structure, paths, degeneracies=None, edge="K", radius=10.0,
                 name="EXAFS Paths", feff_input_set="pymatgen.io.feff.sets.MPEXAFSSet", feff_cmd="feff",
                 override_default_feff_params=None, parents=None, filepad_file=None, labels=None,
                 metadata=None, **kwargs):
        """
        Write the input set for FEFF-EXAFS spectroscopy with customized scattering paths, run feff,
        and insert the scattering amplitude output files(feffNNNN.dat files) to filepad.

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            paths (list): list of paths. A path = list of site indices that defines the path legs.
            degeneracies (list): degeneracy of each path.
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            feff_input_set (FeffDictSet)
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            filepad_file (str): path to the filepad config file.
            labels (list): list of label used to tag the files inserted into filepad.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}
        override_default_feff_params.update({"user_tag_settings": {"CONTROL": "0 0 0 0 1 1",
                                                                   "PRINT": "0 0 0 1 0 3"}})

        feff_input_set = get_feff_input_set_obj(feff_input_set, absorbing_atom, structure, edge=edge,
                                                radius=radius, **override_default_feff_params)

        t = [CopyFeffOutputs(calc_loc=True),
             WriteFeffFromIOSet(absorbing_atom=absorbing_atom, structure=structure, radius=radius,
                                feff_input_set=feff_input_set),
             WriteEXAFSPaths(feff_input_set=feff_input_set, paths=paths, degeneracies=degeneracies),
             RunFeffDirect(feff_cmd=feff_cmd),
             AddPathsToFilepadTask(filepad_file=filepad_file, labels=labels, metadata=metadata)]

        super(EXAFSPathsFW, self).__init__(t, parents=parents, name="{}-{}".format(
            structure.composition.reduced_formula, name), **kwargs)
示例#4
0
    def __init__(self, absorbing_atom, structure, feff_input_set="XANES", edge="K", radius=10.0,
                 name="XAS spectroscopy", feff_cmd="feff", override_default_feff_params=None,
                 db_file=None, parents=None, metadata=None, **kwargs):
        """
        Write the input set for FEFF-XAS spectroscopy, run FEFF and insert the absorption
        coefficient to the database (or dump to a json file if db_file=None).

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then either the entire path to the class or spectrum type must be provided
                e.g. "pymatgen.io.feff.sets.MPXANESSet" or "XANES"
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            db_file (str): path to the db file.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}

        feff_input_set = get_feff_input_set_obj(feff_input_set, absorbing_atom, structure, edge=edge,
                                                radius=radius, **override_default_feff_params)
        spectrum_type = feff_input_set.__class__.__name__[2:-3]

        t = [WriteFeffFromIOSet(absorbing_atom=absorbing_atom, structure=structure, radius=radius,
                                feff_input_set=feff_input_set),
             RunFeffDirect(feff_cmd=feff_cmd),
             PassCalcLocs(name=name),
             SpectrumToDbTask(absorbing_atom=absorbing_atom, structure=structure,
                              db_file=db_file, spectrum_type=spectrum_type, edge=edge,
                              output_file="xmu.dat", metadata=metadata)]

        super(XASFW, self).__init__(t, parents=parents, name="{}-{}".
                                    format(structure.composition.reduced_formula, name), **kwargs)
示例#5
0
def get_wf_eels(absorbing_atom,
                structure=None,
                feff_input_set="pymatgen.io.feff.sets.MPELNESSet",
                edge="K",
                radius=10.,
                beam_energy=100,
                beam_direction=None,
                collection_angle=1,
                convergence_angle=1,
                user_eels_settings=None,
                user_tag_settings=None,
                feff_cmd="feff",
                db_file=None,
                metadata=None,
                use_primitive=False):
    """
    Returns FEFF ELNES/EXELFS spectroscopy workflow.

    Args:
        absorbing_atom (str): absorbing atom symbol
        structure (Structure): input structure. If None and mp_id is provided, the corresponding
            structure will be fetched from the Materials Project db.
        feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then either the entire path to the class or spectrum type must be provided
                e.g. "pymatgen.io.feff.sets.MPELNESSet" or "ELNES"
        edge (str): absorption edge. K, L1, L2, L3
        radius (float): cluster radius in angstroms. Ignored for reciprocal space calculations
        beam_energy (float): the incident beam energy in keV
        beam_direction (list): incident beam direction. Default is none ==> the spectrum will be
            averaged over all directions.
        collection_angle (float): collection angle in mrad
        convergence_angle (float): convergence angle in mrad
        user_eels_settings (dict): override default eels settings.
        user_tag_settings (dict): override other general feff default tag settings.
        feff_cmd (str): path to the feff binary
        db_file (str):  path to the db file.
        metadata (dict): meta data
        use_primitive (bool): convert the structure to primitive form. This helps to
            reduce the number of fireworks in the workflow if the absorbing atoms is
            specified by its atomic symbol.

    Returns:
        Workflow
    """
    if use_primitive:
        structure = structure.get_primitive_structure()

    # get the absorbing atom site index/indices
    ab_atom_indices = [absorbing_atom] if isinstance(
        absorbing_atom, int) else structure.indices_from_symbol(absorbing_atom)

    override_default_feff_params = {"user_tag_settings": user_tag_settings}

    spectrum_type = get_feff_input_set_obj(feff_input_set, ab_atom_indices[0],
                                           structure).__class__.__name__[2:-3]

    # add firework for each absorbing atom site index
    fws = []
    for ab_idx in ab_atom_indices:
        fw_metadata = dict(metadata) if metadata else {}
        fw_metadata["absorbing_atom_index"] = ab_idx
        fw_name = "{}-{}-{}".format(spectrum_type, edge, ab_idx)
        fws.append(
            EELSFW(ab_idx,
                   structure,
                   feff_input_set=feff_input_set,
                   edge=edge,
                   radius=radius,
                   beam_energy=beam_energy,
                   beam_direction=beam_direction,
                   collection_angle=collection_angle,
                   convergence_angle=convergence_angle,
                   user_eels_settings=user_eels_settings,
                   feff_cmd=feff_cmd,
                   db_file=db_file,
                   metadata=fw_metadata,
                   name=fw_name,
                   override_default_feff_params=override_default_feff_params))

    wfname = "{}:{}:{} edge".format(structure.composition.reduced_formula,
                                    "{} spectroscopy".format(spectrum_type),
                                    edge)
    wf_metadata = dict(metadata) if metadata else {}
    wf_metadata["absorbing_atom_indices"] = list(ab_atom_indices)

    return Workflow(fws, name=wfname, metadata=wf_metadata)
示例#6
0
def get_wf_eels(absorbing_atom, structure=None, feff_input_set="pymatgen.io.feff.sets.MPELNESSet",
                edge="K", radius=10., beam_energy=100, beam_direction=None, collection_angle=1,
                convergence_angle=1, user_eels_settings=None, user_tag_settings=None, feff_cmd="feff",
                db_file=None, metadata=None, use_primitive=False):
    """
    Returns FEFF ELNES/EXELFS spectroscopy workflow.

    Args:
        absorbing_atom (str): absorbing atom symbol
        structure (Structure): input structure. If None and mp_id is provided, the corresponding
            structure will be fetched from the Materials Project db.
        feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then either the entire path to the class or spectrum type must be provided
                e.g. "pymatgen.io.feff.sets.MPELNESSet" or "ELNES"
        edge (str): absorption edge. K, L1, L2, L3
        radius (float): cluster radius in angstroms. Ignored for reciprocal space calculations
        beam_energy (float): the incident beam energy in keV
        beam_direction (list): incident beam direction. Default is none ==> the spectrum will be
            averaged over all directions.
        collection_angle (float): collection angle in mrad
        convergence_angle (float): convergence angle in mrad
        user_eels_settings (dict): override default eels settings.
        user_tag_settings (dict): override other general feff default tag settings.
        feff_cmd (str): path to the feff binary
        db_file (str):  path to the db file.
        metadata (dict): meta data
        use_primitive (bool): convert the structure to primitive form. This helps to
            reduce the number of fireworks in the workflow if the absorbing atoms is
            specified by its atomic symbol.

    Returns:
        Workflow
    """
    if use_primitive:
        structure = structure.get_primitive_structure()

    # get the absorbing atom site index/indices
    ab_atom_indices = get_absorbing_atom_indices(structure, absorbing_atom)

    override_default_feff_params = {"user_tag_settings": user_tag_settings}

    spectrum_type = get_feff_input_set_obj(feff_input_set, ab_atom_indices[0], structure).__class__.__name__[2:-3]

    # add firework for each absorbing atom site index
    fws = []
    for ab_idx in ab_atom_indices:
        fw_metadata = dict(metadata) if metadata else {}
        fw_metadata["absorbing_atom_index"] = ab_idx
        fw_name = "{}-{}-{}".format(spectrum_type, edge, ab_idx)
        fws.append(EELSFW(ab_idx, structure, feff_input_set=feff_input_set, edge=edge, radius=radius,
                          beam_energy=beam_energy, beam_direction=beam_direction,
                          collection_angle=collection_angle, convergence_angle=convergence_angle,
                          user_eels_settings=user_eels_settings, feff_cmd=feff_cmd, db_file=db_file,
                          metadata=fw_metadata, name=fw_name,
                          override_default_feff_params=override_default_feff_params))

    wfname = "{}:{}:{} edge".format(structure.composition.reduced_formula,
                                    "{} spectroscopy".format(spectrum_type), edge)
    wf_metadata = dict(metadata) if metadata else {}
    wf_metadata["absorbing_atom_indices"] = list(ab_atom_indices)

    return Workflow(fws, name=wfname, metadata=wf_metadata)
示例#7
0
    def __init__(self,
                 absorbing_atom,
                 structure,
                 feff_input_set="ELNES",
                 edge="K",
                 radius=10.,
                 name="EELS spectroscopy",
                 beam_energy=100,
                 beam_direction=None,
                 collection_angle=1,
                 convergence_angle=1,
                 user_eels_settings=None,
                 feff_cmd="feff",
                 override_default_feff_params=None,
                 db_file=None,
                 parents=None,
                 metadata=None,
                 **kwargs):
        """
        Write the input set for FEFF-EELSS spectroscopy, run feff and insert the core-loss spectrum
        to the database(or dump to a json file if db_file=None).

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then the entire path to the class or the spectrum type must be provide
                e.g. "pymatgen.io.feff.sets.MPELNESSet" or "ELNES"
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            beam_energy (float): Incident beam energy in keV
            beam_direction (list): Incident beam direction. If None, the cross section will be averaged.
            collection_angle (float): Detector collection angle in mrad.
            convergence_angle (float): Beam convergence angle in mrad.
            user_eels_settings (dict): override default EELS config. See MPELNESSet.yaml for supported keys.
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            db_file (str): path to the db file.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}

        feff_input_set = get_feff_input_set_obj(
            feff_input_set,
            absorbing_atom,
            structure,
            edge,
            radius,
            beam_energy,
            beam_direction,
            collection_angle,
            convergence_angle,
            user_eels_settings=user_eels_settings,
            **override_default_feff_params)
        spectrum_type = feff_input_set.__class__.__name__[2:-3]

        t = [
            WriteFeffFromIOSet(absorbing_atom=absorbing_atom,
                               structure=structure,
                               radius=radius,
                               feff_input_set=feff_input_set),
            RunFeffDirect(feff_cmd=feff_cmd),
            PassCalcLocs(name=name),
            SpectrumToDbTask(absorbing_atom=absorbing_atom,
                             structure=structure,
                             db_file=db_file,
                             spectrum_type=spectrum_type,
                             edge=edge,
                             output_file="eels.dat",
                             metadata=metadata)
        ]

        super(EELSFW, self).__init__(t,
                                     parents=parents,
                                     name="{}-{}".format(
                                         structure.composition.reduced_formula,
                                         name),
                                     **kwargs)
示例#8
0
    def __init__(self,
                 absorbing_atom,
                 structure,
                 feff_input_set="XANES",
                 edge="K",
                 radius=10.0,
                 name="XAS spectroscopy",
                 feff_cmd="feff",
                 override_default_feff_params=None,
                 db_file=None,
                 parents=None,
                 metadata=None,
                 **kwargs):
        """
        Write the input set for FEFF-XAS spectroscopy, run FEFF and insert the absorption
        coefficient to the database (or dump to a json file if db_file=None).

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            feff_input_set (str or FeffDictSet subclass): The inputset for setting params. If string
                then either the entire path to the class or spectrum type must be provided
                e.g. "pymatgen.io.feff.sets.MPXANESSet" or "XANES"
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            db_file (str): path to the db file.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}

        feff_input_set = get_feff_input_set_obj(feff_input_set,
                                                absorbing_atom,
                                                structure,
                                                edge=edge,
                                                radius=radius,
                                                **override_default_feff_params)
        spectrum_type = feff_input_set.__class__.__name__[2:-3]

        t = [
            WriteFeffFromIOSet(absorbing_atom=absorbing_atom,
                               structure=structure,
                               radius=radius,
                               feff_input_set=feff_input_set),
            RunFeffDirect(feff_cmd=feff_cmd),
            PassCalcLocs(name=name),
            SpectrumToDbTask(absorbing_atom=absorbing_atom,
                             structure=structure,
                             db_file=db_file,
                             spectrum_type=spectrum_type,
                             edge=edge,
                             output_file="xmu.dat",
                             metadata=metadata)
        ]

        super(XASFW, self).__init__(t,
                                    parents=parents,
                                    name="{}-{}".format(
                                        structure.composition.reduced_formula,
                                        name),
                                    **kwargs)
示例#9
0
    def __init__(self,
                 absorbing_atom,
                 structure,
                 paths,
                 degeneracies=None,
                 edge="K",
                 radius=10.0,
                 name="EXAFS Paths",
                 feff_input_set="pymatgen.io.feff.sets.MPEXAFSSet",
                 feff_cmd="feff",
                 override_default_feff_params=None,
                 parents=None,
                 filepad_file=None,
                 labels=None,
                 metadata=None,
                 **kwargs):
        """
        Write the input set for FEFF-EXAFS spectroscopy with customized scattering paths, run feff,
        and insert the scattering amplitude output files(feffNNNN.dat files) to filepad.

        Args:
            absorbing_atom (str): absorbing atom symbol
            structure (Structure): input structure
            paths (list): list of paths. A path = list of site indices that defines the path legs.
            degeneracies (list): degeneracy of each path.
            edge (str): absorption edge
            radius (float): cluster radius in angstroms
            name (str)
            feff_input_set (FeffDictSet)
            feff_cmd (str): path to the feff binary
            override_default_feff_params (dict): override feff tag settings.
            parents (Firework): Parents of this particular Firework. FW or list of FWS.
            filepad_file (str): path to the filepad config file.
            labels (list): list of label used to tag the files inserted into filepad.
            metadata (dict): meta data
            **kwargs: Other kwargs that are passed to Firework.__init__.
        """
        override_default_feff_params = override_default_feff_params or {}
        override_default_feff_params.update({
            "user_tag_settings": {
                "CONTROL": "0 0 0 0 1 1",
                "PRINT": "0 0 0 1 0 3"
            }
        })

        feff_input_set = get_feff_input_set_obj(feff_input_set,
                                                absorbing_atom,
                                                structure,
                                                edge=edge,
                                                radius=radius,
                                                **override_default_feff_params)

        t = [
            CopyFeffOutputs(calc_loc=True),
            WriteFeffFromIOSet(absorbing_atom=absorbing_atom,
                               structure=structure,
                               radius=radius,
                               feff_input_set=feff_input_set),
            WriteEXAFSPaths(feff_input_set=feff_input_set,
                            paths=paths,
                            degeneracies=degeneracies),
            RunFeffDirect(feff_cmd=feff_cmd),
            AddPathsToFilepadTask(filepad_file=filepad_file,
                                  labels=labels,
                                  metadata=metadata)
        ]

        super(EXAFSPathsFW,
              self).__init__(t,
                             parents=parents,
                             name="{}-{}".format(
                                 structure.composition.reduced_formula, name),
                             **kwargs)