Exemplo n.º 1
0
- `distance` : distance from the central source
'''
import os
import glob
import traceback
import warnings

import ChiantiPy.tools.io as chio

try:
    xuvtop = os.environ['XUVTOP']
    Defaults = chio.defaultsRead()
    Ip = chio.ipRead()
    MasterList = chio.masterListRead()
    IoneqAll = chio.ioneqRead(ioneqname=Defaults['ioneqfile'])
    ChiantiVersion = chio.versionRead()
    keywordArgs = [
        'temperature', 'eDensity', 'hDensity', 'pDensity', 'radTemperature',
        'rStar', 'distance'
    ]
    AbundanceDefault = chio.abundanceRead(abundancename=Defaults['abundfile'])

    AbundanceList = []
    for fname in glob.glob(os.path.join(xuvtop, 'abundance', '*.abund')):
        AbundanceList.append(os.path.splitext(os.path.basename(fname))[0])
    Abundance = {
        abundance: chio.abundanceRead(abundancename=abundance)
        for abundance in AbundanceList
    }
except (KeyError, IOError) as e:
    print(traceback.format_exc())
Exemplo n.º 2
0
        vFile.close()
        return versionStr.strip()

    import chianti.core as ch

logger = logging.getLogger(__name__)

masterlist_ions_path = os.path.join(os.getenv('XUVTOP'), "masterlist",
                                    "masterlist_ions.pkl")

masterlist_ions_file = open(masterlist_ions_path, 'rb')
masterlist_ions = pickle.load(masterlist_ions_file).keys()
# Exclude the "d" ions for now
masterlist_ions = [_ for _ in masterlist_ions if re.match("^[a-z]+_\d+$", _)]

masterlist_version = versionRead()


class ChiantiIonReaderError(Exception):
    pass


class ChiantiIonReader(object):
    """
        Class for reading ion data from the CHIANTI database

        Attributes
        ----------
        ion: chianti.core.ion instance

        Methods
Exemplo n.º 3
0
    def _get_levels_lines(self, get_collisions=False):
        """Generates `levels`, `lines`  and `collisions` DataFrames.

        Parameters
        ----------
        get_collisions : bool, optional
            Grab collisional data, by default False.
        """
        lvl_list = []
        lns_list = []
        col_list = []
        for ion in self.ions:

            ch_ion = convert_species_tuple2chianti_str(ion)
            reader = ChiantiIonReader(ch_ion)

            # Do not keep levels if lines are not available.
            try:
                lvl = reader.levels
                lns = reader.lines

            except ChiantiIonReaderError:
                logger.info(f'Missing levels/lines data for `{ch_ion}`.')
                continue

            lvl['atomic_number'] = ion[0]
            lvl['ion_charge'] = ion[1]

            # Indexes must start from zero
            lvl.index = range(0, len(lvl))
            lvl.index.name = 'level_index'
            lvl_list.append(reader.levels)

            lns['atomic_number'] = ion[0]
            lns['ion_charge'] = ion[1]
            lns_list.append(lns)

            if get_collisions:
                try:
                    col = reader.collisions
                    col['atomic_number'] = ion[0]
                    col['ion_charge'] = ion[1]
                    col_list.append(col)

                except ChiantiIonReaderError:
                    logger.info(f'Missing collisional data for `{ch_ion}`.')

        levels = pd.concat(lvl_list, sort=True)
        levels = levels.rename(columns={'J': 'j'})
        levels['method'] = None
        levels['priority'] = self.priority
        levels = levels.reset_index()
        levels = levels.set_index(
            ['atomic_number', 'ion_charge', 'level_index'])
        levels = levels[['energy', 'j', 'label', 'method', 'priority']]

        lines = pd.concat(lns_list, sort=True)
        lines = lines.reset_index()
        lines = lines.rename(
            columns={
                'lower_level_index': 'level_index_lower',
                'upper_level_index': 'level_index_upper',
                'gf_value': 'gf'
            })

        # Kurucz levels starts from zero, Chianti from 1.
        lines['level_index_lower'] = lines['level_index_lower'] - 1
        lines['level_index_upper'] = lines['level_index_upper'] - 1

        lines = lines.set_index([
            'atomic_number', 'ion_charge', 'level_index_lower',
            'level_index_upper'
        ])
        lines['energy_upper'] = None
        lines['energy_lower'] = None
        lines['j_upper'] = None
        lines['j_lower'] = None
        lines = lines[[
            'energy_upper', 'j_upper', 'energy_lower', 'j_lower', 'wavelength',
            'gf'
        ]]

        lines['wavelength'] = u.Quantity(lines['wavelength'],
                                         u.AA).to('nm').value

        col_columns = [
            'temperatures', 'collision_strengths', 'gf', 'energy', 'ttype',
            'cups'
        ]
        if get_collisions:
            collisions = pd.concat(col_list, sort=True)
            collisions = collisions.reset_index()
            collisions = collisions.rename(
                columns={
                    'lower_level_index': 'level_index_lower',
                    'upper_level_index': 'level_index_upper',
                    'gf_value': 'gf',
                })
            collisions['level_index_lower'] -= 1
            collisions['level_index_upper'] -= 1
            collisions = collisions.set_index([
                'atomic_number', 'ion_charge', 'level_index_lower',
                'level_index_upper'
            ])
            collisions = collisions[col_columns]
            self.collisions = collisions

        else:
            self.collisions = pd.DataFrame(columns=[col_columns])

        self.levels = levels
        self.lines = lines
        self.version = versionRead()
Exemplo n.º 4
0
- `distance` : distance from the central source
'''
import os
import glob
import traceback
import warnings

import ChiantiPy.tools.io as chio

try:
    xuvtop = os.environ['XUVTOP']
    Defaults = chio.defaultsRead()
    Ip = chio.ipRead()
    MasterList = chio.masterListRead()
    IoneqAll = chio.ioneqRead(ioneqname=Defaults['ioneqfile'])
    ChiantiVersion = chio.versionRead()
    keywordArgs = ['temperature', 'eDensity', 'hDensity', 'pDensity', 'radTemperature',
                   'rStar', 'distance']
    AbundanceDefault = chio.abundanceRead(abundancename=Defaults['abundfile'])

    AbundanceList = []
    for fname in glob.glob(os.path.join(xuvtop, 'abundance', '*.abund')):
        AbundanceList.append(os.path.splitext(os.path.basename(fname))[0])
    Abundance = {abundance: chio.abundanceRead(abundancename=abundance)
                 for abundance in AbundanceList}
except (KeyError, IOError) as e:
    print(traceback.format_exc())
    if isinstance(e, KeyError):
        warnings.warn(
            'XUVTOP environment variable not set. You will not be able to access any data from the CHIANTI database.')
    else: