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)
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)
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)
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)
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)
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)
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)
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)
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)