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