Exemplo n.º 1
0
 def get_energies(method):
     '''
     Small helper method to query all energies for the selected levels
     that match a specific method.
     '''
     q = (self.session.query(
         LevelEnergy.level_id.label('level_id'),
         LevelEnergy.quantity.to('eV').value.label('energy')).join(
             subq, LevelEnergy.level_id == subq.c.level_id).filter(
                 LevelEnergy.method == method))
     return pd.DataFrame(q.all(),
                         columns=query_columns(q)).set_index('level_id')
Exemplo n.º 2
0
    def _get_all_lines_data(self):
        """
        This function returns line data about the selected atoms from the selected
        DataSources. The data is returned in a pandas DataFrame.  The index is
        'line_id' and the following columns exist:
        lower_level_id, upper_level_id, wavelength [angstrom], gf, loggf

        Note that the wavelength is given as vacuum wavelength
        """
        levels_subq = self._build_levels_q()

        wavelength = aliased(LineWavelength)
        gf = aliased(LineGFValue)

        lines_q = (
                self.session.
                query(
                    Line.line_id.label('line_id'),
                    Line.lower_level_id.label('lower_level_id'),
                    Line.upper_level_id.label('upper_level_id'),
                    wavelength.quantity.to('angstrom').value.label('wavelength'),
                    gf.quantity.value.label('gf'),
                    wavelength.medium.label('wl_medium')
                    ).
                join(wavelength).
                join(gf).
                join(
                    levels_subq,
                    Line.lower_level_id == levels_subq.c.level_id)
                )

        lines = pd.DataFrame(
                lines_q.all(),
                columns=query_columns(lines_q)
                ).set_index('line_id')

        air_mask = lines['wl_medium'] == MEDIUM_AIR
        lines.loc[air_mask, 'wavelength'] = convert_wavelength_air2vacuum(
            lines.loc[air_mask, 'wavelength'])
        lines.pop('wl_medium')

        lines['loggf'] = np.log10(lines['gf'])

        if lines.index.duplicated().any():
            raise ValueError(
                    'There are duplicated line_ids, something went wrong!')
        return lines
Exemplo n.º 3
0
 def get_energies(method):
     '''
     Small helper method to query all energies for the selected levels
     that match a specific method.
     '''
     q = (
             self.session.
             query(
                 LevelEnergy.level_id.label('level_id'),
                 LevelEnergy.quantity.to('eV').value.label('energy')
                 ).
             join(
                 subq,
                 LevelEnergy.level_id == subq.c.level_id
                 ).
             filter(
                 LevelEnergy.method == method
                 )
             )
     return pd.DataFrame(
             q.all(),
             columns=query_columns(q)
             ).set_index('level_id')
Exemplo n.º 4
0
    def _get_all_levels_data(self):
        """
        This function returns level data about the selected atoms from the selected
        DataSources. The data is returned in a pandas DataFrame.  The index is
        'level_id' and the following columns exist:
        atomic_number, ion_number, g, energy [eV]

        Note about the energy: The database has three different values for the
        method of determining the energy: meas(ured), theor(etical) and None
        (for ground states from NIST afaik) A level can have multiple energies
        associated, that is a measured and a theoretical energy.  In that case,
        we pick the energy in order of availability according to the list above
        (1st measured etc.)
        """
        subq = self._build_levels_q()
        levels_data_q = (self.session.query(
            Level.level_id.label('level_id'),
            Level.atomic_number.label('atomic_number'),
            Level.ion_charge.label('ion_number'),
            Level.g.label('g'),
        ).join(subq, Level.level_id == subq.c.level_id))

        def get_energies(method):
            '''
            Small helper method to query all energies for the selected levels
            that match a specific method.
            '''
            q = (self.session.query(
                LevelEnergy.level_id.label('level_id'),
                LevelEnergy.quantity.to('eV').value.label('energy')).join(
                    subq, LevelEnergy.level_id == subq.c.level_id).filter(
                        LevelEnergy.method == method))
            return pd.DataFrame(q.all(),
                                columns=query_columns(q)).set_index('level_id')

        levels = pd.DataFrame(
            levels_data_q.all(),
            columns=query_columns(levels_data_q)).set_index('level_id')

        energies = [get_energies(k) for k in ['meas', 'theor', None]]

        energy = pd.DataFrame(index=levels.index)
        energy['energy'] = np.nan

        for df in energies:  # Go backwards and skip the last
            # update data based on index
            energy.update(df, overwrite=False)

        levels['energy'] = energy.energy

        if levels.g.isnull().any():
            print("Some of the ground state g-values are not available."
                  " This is likely because very heavy elements are included"
                  "and is not unusual. They will be omitted from these"
                  "calculations")
            levels = levels.loc[~levels.g.isnull()]
        if levels.isnull().any().any():
            raise ValueError('Inconsistent database, some values are None.' +
                             str(levels[levels.isnull()]))

        return levels
Exemplo n.º 5
0
    def _get_all_levels_data(self):
        """
        This function returns level data about the selected atoms from the selected
        DataSources. The data is returned in a pandas DataFrame.  The index is
        'level_id' and the following columns exist:
        atomic_number, ion_number, g, energy [eV]

        Note about the energy: The database has three different values for the
        method of determining the energy: meas(ured), theor(etical) and None
        (for ground states from NIST afaik) A level can have multiple energies
        associated, that is a measured and a theoretical energy.  In that case,
        we pick the energy in order of availability according to the list above
        (1st measured etc.)
        """
        subq = self._build_levels_q()
        levels_data_q = (
                self.session.
                query(
                    Level.level_id.label('level_id'),
                    Level.atomic_number.label('atomic_number'),
                    Level.ion_charge.label('ion_number'),
                    Level.g.label('g'),
                    ).
                join(
                    subq,
                    Level.level_id == subq.c.level_id
                    )
                )

        def get_energies(method):
            '''
            Small helper method to query all energies for the selected levels
            that match a specific method.
            '''
            q = (
                    self.session.
                    query(
                        LevelEnergy.level_id.label('level_id'),
                        LevelEnergy.quantity.to('eV').value.label('energy')
                        ).
                    join(
                        subq,
                        LevelEnergy.level_id == subq.c.level_id
                        ).
                    filter(
                        LevelEnergy.method == method
                        )
                    )
            return pd.DataFrame(
                    q.all(),
                    columns=query_columns(q)
                    ).set_index('level_id')

        levels = pd.DataFrame(
                levels_data_q.all(),
                columns=query_columns(levels_data_q)
                ).set_index('level_id')

        energies = [get_energies(k) for k in ['meas', 'theor', None]]

        energy = pd.DataFrame(index=levels.index)
        energy['energy'] = np.nan

        for df in energies:  # Go backwards and skip the last
            # update data based on index
            energy.update(df, overwrite=False)

        levels['energy'] = energy.energy

        if levels.g.isnull().any():
            print ("Some of the ground state g-values are not available."
                    " This is likely because very heavy elements are included"
                    "and is not unusual. They will be omitted from these"
                    "calculations")
            levels = levels.loc[~levels.g.isnull()]
        if levels.isnull().any().any():
            raise ValueError(
                    'Inconsistent database, some values are None.' +
                    str(levels[levels.isnull()]))

        return levels