Source code for ttlab.xps.XPS

import matplotlib.pyplot as plt
from .XPS_data_reader import XPSDataReader
from .XPS_functions import XPSFunctions
from plotly.offline import init_notebook_mode, iplot
import plotly.graph_objs as go
import numpy as np


[docs]class XPS: """ XPS class for cool XPS stuff Attributes ---------- filename_survey='your_survey_file.csv' Filename of survey. filename_multi='your_multi_file.csv' Filename of multi. gridfs_survey: pymongo database handle Database handle of survey. gridfs_multi='handle' Database handle of multi. """ def __init__(self, filename_survey=None, filename_multi=None, gridfs_survey=None,gridfs_multi=None, new_file_version=None): self.filename_survey = filename_survey self.filename_multi = filename_multi if new_file_version: self.survey_data = XPSDataReader.read_new_survey(filename=self.filename_survey, gridfs=gridfs_survey) self.multi_data = XPSDataReader.read_new_multi(filename=self.filename_multi, gridfs=gridfs_multi) else: self.survey_data = XPSDataReader.read_survey(filename=self.filename_survey, gridfs=gridfs_survey) self.multi_data = XPSDataReader.read_multi(filename=self.filename_multi,gridfs=gridfs_multi) self.is_survey_shifted = False self.is_multi_shifted = False
[docs] def shift_survey(self, background_model='shirley',show_fit=False): """Shifts the survey by setting C1 to 284.8eV. Parameters ---------- background_model : str Which awesome background model. Shirley, and shit show_fit : Boolean Show fit or dooont! Returns ------- None """ if self.is_survey_shifted: return peak_position, error = XPSFunctions.find_carbon_peak(self.survey_data.energy,self.survey_data.counts,background_model,show_fit=show_fit) self.survey_data.energy = self.survey_data.energy-(peak_position-284.8) self.is_survey_shifted = True
[docs] def shift_multi(self, background_model='shirley',show_fit=False): """Shifts tmulti by setting C1 to 284.8eV. Parameters ---------- background_model : str Which awesome background model. Shirley, and shit show_fit : Boolean Show fit or dooont! Returns ------- None """ if self.is_multi_shifted: return peak_position, error = XPSFunctions.find_carbon_peak(self.multi_data.energy['C1s'], self.multi_data.counts['C1s'],background_model,show_fit=show_fit) for orbital in self.orbitals: self.multi_data.energy[orbital] = self.multi_data.energy[orbital] - (peak_position - 284.8) self.is_multi_shifted = True
@property def orbitals(self): return list(self.multi_data.energy)
[docs] def get_energy_multi(self,orbital): """ Get the energy axis. Parameters ---------- orbital : str Enter orbital! Returns ------- array """ return self.multi_data.energy[orbital]
[docs] def get_counts_multi(self,orbital): """ Get counts Parameters ---------- orbital : str Enter orbital! Returns ------- array """ return self.multi_data.counts[orbital]
[docs] def get_energy_survey(self,range=None): """ Get energy Parameters ---------- range : [start, end] Enter range in eV of retunring Survey ! Returns ------- array """ if range: start_index = self._find_index_of_nearest(array = self.survey_data.energy,value=max(range)) end_index = self._find_index_of_nearest(array = self.survey_data.energy, value=min(range)) return self.survey_data.energy[start_index:end_index] return self.survey_data.energy
[docs] def get_counts_survey(self,range=None): """ Get counts Parameters ---------- range : array Array with upper and lower energy range: [lower_range, upper_range] Returns ------- counts : array """ if range: start_index = self._find_index_of_nearest(array=self.survey_data.energy, value=max(range)) end_index = self._find_index_of_nearest(array=self.survey_data.energy, value=min(range)) return self.survey_data.counts[start_index:end_index] return self.survey_data.counts
[docs] def plot_orbital(self, orbital, ax=None, offset=0): """ Plot one orbital. Parameters ---------- orbital : str Enter orbital! ax : Axes object Returns ------- ax : Axes object """ counts = self.multi_data.counts[orbital] energy = self.multi_data.energy[orbital] if ax is None: ax = plt.axes() ax.plot(energy,counts+offset) ax.set_xlabel('Energy [eV]') ax.set_ylabel('Counts [a.u.]') ax.invert_xaxis() ax.legend() return ax
[docs] def plotly_orbitals(self,title=''): """ cool overview with plotly Parameters ---------- title : str TITLE Returns ------- array """ init_notebook_mode(connected=True) data = [] for orbital in self.orbitals: x = self.multi_data.energy[orbital] y = self.multi_data.counts[orbital] trace = XPS._create_x_y_trace(x, y, orbital) data.append(trace) layout = XPS._get_plotly_layout(title=title) fig = go.Figure(data=data, layout=layout) return iplot(fig)
[docs] def plotly_survey(self,title=''): """ Get energy Parameters ---------- range : [] Enter range in eV of retunring Survey ! Returns ------- array """ init_notebook_mode(connected=True) x = self.survey_data.energy y = self.survey_data.counts trace = XPS._create_x_y_trace(x, y,'Survey') layout = XPS._get_plotly_layout(title=title) fig = go.Figure(data=[trace], layout=layout) return iplot(fig)
[docs] def plotly_all(self,title=''): """ Get energy Parameters ---------- range : [] Enter range in eV of retunring Survey ! Returns ------- array """ init_notebook_mode(connected=True) data = [] x = self.survey_data.energy y = self.survey_data.counts trace = XPS._create_x_y_trace(x, y,'Survey') data.append(trace) for orbital in self.orbitals: x = self.multi_data.energy[orbital] y = self.multi_data.counts[orbital] trace = XPS._create_x_y_trace(x, y, orbital) data.append(trace) layout = XPS._get_plotly_layout(title=title) fig = go.Figure(data=data, layout=layout) return iplot(fig)
@staticmethod def _create_x_y_trace(x, y, name): return go.Scatter(x=x, y=y, name=name) @staticmethod def _get_plotly_layout(title=''): return go.Layout( title=title, xaxis=dict( autorange='reversed', title='Energy [eV]', titlefont=dict( family='Courier New, monospace', size=18, color='#7f7f7f' ) ), yaxis=dict( title='Counts [a.u.]', titlefont=dict( family='Courier New, monospace', size=18, color='#7f7f7f' ), exponentformat='e', showexponent='all' ) ) @staticmethod def _find_index_of_nearest(array, value): return (np.abs(array - value)).argmin()