Manual
User Manual: Pdf
Open the PDF directly: View PDF .
Page Count: 20
Download | |
Open PDF In Browser | View PDF |
Grapa User manual Summary Grapa....................................................................................................................................................1 User manual.....................................................................................................................................1 1.General description............................................................................................................................3 1.1.Description of Grapa.................................................................................................................3 1.2.Features overlook......................................................................................................................3 2.Installation........................................................................................................................................4 2.1.Prerequisites..............................................................................................................................4 2.2.Installation................................................................................................................................4 2.3.Getting started...........................................................................................................................4 3.General organization of the package................................................................................................5 4.Graph object.....................................................................................................................................6 4.1.Keywords to Graph...................................................................................................................6 5.Curve object......................................................................................................................................9 5.1.Provided Curve child classes....................................................................................................9 5.2.Keywords to Curve.................................................................................................................12 6.Automated data processing scripts.................................................................................................14 6.1.Load all files from one folder.................................................................................................14 6.2.JV data fit cell-by-cell.............................................................................................................14 6.3.JV data fit separately...............................................................................................................14 6.4.JV sample maps:.....................................................................................................................14 6.5.JV boxplots.............................................................................................................................14 6.6.Processing of C-V data temperature series.............................................................................14 6.7.Processing of C-f data temperature series...............................................................................15 7.Configuration file...........................................................................................................................16 8.How to read my own data files ?....................................................................................................17 8.1.Example:.................................................................................................................................17 9.How to define my own Curve type ?..............................................................................................19 9.1.Example..................................................................................................................................19 10.A few more details........................................................................................................................20 10.1.CurveSpectrum.....................................................................................................................20 Last update: 11.02.2018, together with grapa v0.5.0.3 1 1. General description 1.1. Description of Grapa Grapa is a python package providing a graphical interface and the underlying code dedicated to the visualization, analysis and presentation of scientific data, with a focus on photovoltaic research. A wide range of data formats can loaded by default. The produced graphs are saved both as graphical objects and as text files for later modifications. The data analysis functions currently focus on photovoltaics and semiconductor material science. Advanced analysis or fitting functions are notably provided for the following characterization techniques: EQE, JV, C-V, C-f, TRPL, SIMS (list not exhaustive). The software has extended capabilities for advanced plotting, and can be used for creating highquality figures for scientific publications. Last, the user can add to the software and to the graphical interface his own specific data loading functions as well new data types and analysis functions, with no modification of the existing code. Grapa stands for “GRAphing and Photovoltaics Analysis”. Cheers! 1.2. • • • • • • • • • • Features overlook Open and merge a wide range of experimental data. Data import possible from clipboard. Graphical data presentation and graph customisation. Graph export in various file formats with user-defined dpi. Additionally, create a .txt file containing the raw data for later modifications. The supported image formats are the one supported by the savefig function of matplotlib. .emf is also supported, provided a path to an inkscape executable is provided in the config.txt file. Drop-down menu to switch between data-relevant views (e.g. log-view for JV data, Tauc plot for EQE) Drop-down menu to switch between linear or logarithmic data visualisation. A data picker allows selecting and storing chosen data points. Can colorize a graph using color gradients. Some data types can be fitted. The parameters of the fitted curves can be modified afterwards. Data can be loaded from other files or from clipboard, then converted to the desired data type to benefit from data visualisation and processing and fitting options. 2 2. Installation 2.1. Prerequisites Grapa was developed using the Winpython environment, with versions corresponding to python 3.4 and 3.5. Retrocompatibility with earlier versions of python is not ensured. Grapa was developed using matplotlib 1.5 and should be compatible with version 2.0 and later. 2.2. Installation There are several options to install grapa. The easiest is certainly pip install grapa Alternatively, the source can be retrieved from the development page on github. Download the latest release and place its content in a folder named “grapa” somewhere on your hard drive, and can be run with your favorite python distribution. https://github.com/carronr/grapa 2.3. Getting started The software graphical user interface GUI can be started by executing the function import grapa grapa.grapa() Grapa can also be used in scripts. Just above the console, a checkbox "Commands in console" should help you to get started with scripting with grapa. Enjoy! 3 3. General organization of the package The grapa packages comes with a graphical user interface (GUI), which allows handling most features of the package. Most matplotlib plotting methods are supported, as well as insets and subplots. Using grapa in python code allows further customization of the produced graphs. Notably some matplotlib functions are not fully supported by the package. The Graph.plot() method returns the produced figure and axes for further modifications. Existing figures and axes can as well be provided. The central object of the package is the Graph object. A graph is stored in a Graph object. The Graph class can be thought as a combination of a dict storing plotting information (axes, text annotations, etc.) together with a list of Curves which stores the data and the corresponding plotting information (color, aspect, etc.). The interfaces are organized as to handle pairs of (x,y) vector data, although this might not always be true. 4 4. Graph object The Graph object can notably plot and export itself. As provided grapa can open a range of file formats. Just have a try on your own files, grapa might be able to parse it if the data are organized column-wise. Otherwise child classes of Graph can be implemented in order to read your own files (see the corresponding section of this howto) 4.1. Keywords to Graph A Graph object notably contains a dict storing information related to plotting. Below is a list of possible keywords arranged bycategories, with a brief explanation of the possible values and examples. == Figure == figsize Figure size (inch). (6.0, 4.0) subplots_adjust Margins (relative to figure). 0.15 (bottom only), [0.125, 0.1, 0.9, 0.9] left,b,r,top, [1,1,5,3.5,'abs'] dpi Resolution dots-per-inch. 300 fontsize Font size of titles, annotations, etc. 12 title Graph title, based on ax.set_title(). My data ['A dataset', {'color':'r'}] == Axes == xlim Limits of x axis, based on ax.set_xlim(). [2,9] ['',4] ylim Limits of y axis, based on ax.set_ylim(). [0,100] [0,''] xlabel Label of x axis, based on ax.set_xlabel(). Axis x [unit] ['My label', {'size':6, 'color':'r'}] ylabel Label of y axis, based on ax.set_ylabel(). Axis y [unit] ['My label', {'size':6, 'color':'r'}] xticksstep Value difference between ticks on x axis, or ticks positions. Loosely based on ax.xaxis.set_ticks() 0.01 [0,1,2] yticksstep Value difference between ticks on y axis, or ticks positions. Loosely based on ax.yaxis.set_ticks() 0.01 5 [0,1,2] xtickslabels Customized ticks. First is a list of values, then a list of labels, then possibly options. Loosely based on plt.xticks() [[0,1],['some','value']] [None, None, {'rotation':45, 'size': 6, 'color':'r'}]" ytickslabels Customized ticks. First is a list of values, then a list of labels, then possibly options. Loosely based on plt.yticks() [[0,1],['some','value']] [None, None, {'rotation':45, 'size': 6, 'color':'r'}] xlabel_coords Position of xlabel, based on ax.xaxis.set_label_coords(). -0.1 [0.5,-0.15] ylabel_coords Position of ylabel, based on ax.yaxis.set_label_coords(). -0.1 [-0.1,0.5] == Legends == legendproperties Position, or keywords to ax.legend() best sw {'bbox_to_anchor':(0.2,0.8), 'ncol':2, 'fontsize':8} legendtitle Legend title Some title ['Some title', {'size':25}] == Annotations == axhline Horizontal line(s), based on ax.axhline(). 0 [-1, 1] axvline Vertical line(s), based on ax.axvline(). 0 [-1, 1] text Annotations, use GUI window if possible. Text, textxy, textargs must be elements, or list with same number of elements. Some text ['Here', 'There'] textxy Use GUI window if possible. (0.05, 0.95) [(0.2, 0.3), (0.8, 0.9)] textargs Use GUI window if possible. {'fontsize':15} [{'horizontalalignment': 'right', 'xytext': (0.4, 0.65), 'arrowprops': {'shrink': 0.05}, 'xy': (0.46, 0.32)}, {}] == Secondary axes == twiny_xlabel Secondary x axis label. Other axis x [unit] ['My label', {'size':6, 'color':'r'}] twinx_ylabel Secondary y axis label. Other axis x [unit] ['My label', {'size':6, 'color':'r'}] twiny_xlim Secondary x axis limits. [2,9] ['',4] twinx_ylim Secondary y axis limits. 6 [0,100] [0,''] == Misc == alter Data transform keyword, specific to the type of manipulated data. Linear ['nmeV', 'tauc'] typeplot General graph plotting instruction, based on ax.set_xscale() and ax.set_yscale(). plot semilogx arbitraryfunctions A list of instructions. Each instruction is a list as: [method of ax, list of arguments, dict of keyword arguments] [['xaxis.set_ticks', [[1.5, 5.5]], {'minor':True}], ['set_xticklabels', [['a','b']], {'minor':True}]] [['set_axis_off', [], {}]] [['yaxis.set_major_formatter', ['StrMethodFormatter({x:.2f})'], {}]] [['xaxis.set_minor_locator', ['MultipleLocator(0.5)'], {}]] 7 5. Curve object A Curve object contains the data as well as a dict storing information dedicated to the Curve, notably plotting information. Child classes of Curve can be implemented in order to provide you the suitable data analysis tools. A list of possible keywords to the Curves is presented below. 5.1. Provided Curve child classes Parsing of several file formats is provided, and data types are supported for processing of specific types of measurements. Every Curve type provides dedicated functions (for analysis, plotting, etc.) as well as specific data visualizations accessible from a drop-down menu in the GUI. The provided Curve types can be organized in two groups. First the Curve types related to data manipulation and presentation: Subplot Used to create an array of axes in the figure, organized in a grid paving the space available based on the gridspec formalism of matplotlib. Unless specified otherwise, the next Curves will be displayed in the newly created axes. • • • • • • • • File subplot: a path to a graph file to be inserted as subplot. If not provided, the Curve’s data will be showed in the created axis. Colspan, rowpan: how many grid locations the subplot will fill Update subplot: a dict whose elements will to given to the graph loaded by file subplot Number cols: how many columns there are in the grid Transpose: by default the grid is filled row-by-row. If set the grid is filled column-bycolumn Show id: displays small (a), (b) etc. on top-left corner of each created axes. Coordinates relative to that corner can also be provided (in figure fraction) Width ratios, height ratios: list of relative width/heights for the axes in the grid Subplots_adjust: margins and spacings of the graphs: [left, bottom, right, top, wspace, hspace] Inset Creates new axes in the figure and plot an external graph file inside. When combining subplots and insets the inset curves must be placed after the subplots. • • • Fileinset: a path to a graph file to be inserted as inset. If not provided, this and the next curve’s data will be showed in the created axis. Coords: where to place the new axis Update inset: a dict whose elements will to given to the graph loaded by fileinset Image handles pictures as well as display of matrices 8 • • • • • • Plot type: imshow, contour, contour. Choose imshow for pictures. Data file: indicate path to a picture or to a data matrix file Transpose, rotate: seld-explaining. Rotation in degrees for image, by 90° steps for matrices Extent: allow zooming on the image. See matplotlib help for imshow for more details cmap, vmin, vmax: provides a colormap, and min and max values for matrices aspect ratio, interpolation Math operations • • • Addition, subtraction, multiplication and division with a scalar or a Curve. Operations with another Curve perform an interpolation of both Curves on the different x values. Negation (0 - Curve) and inversion (1 / Curve) operations Swap x and y series The second group of Curve types is related to data analysis, with a focus on photovoltaics and material science. EQE external quantum efficiency Analysis functions • • • • • • Data visualization Bandgap from Tauc (E * EQE)^2, manual tuning of the curve fit possible Bandgap from derivative Bandgap from exact Tauc method (E * ln(1EQE))^2 EQE current, using the AM1.5G solar spectrum Fit of low-energy side exponential decay (Urbach tail) Loading of the Empa 20.4% cell EQE • • EQE vs eV instead of nm Tauc plot (E*EQE)^2 vs E • logarithmic view log(abs(J Jsc)) • Log10 of absolute value JV, temperature-dependent JV • • • • Area correction Calculation of Voc, Jsc, FF, Eff, MPP Fit of the JV curve using diode with 2 resistors model Manual tuning of the curve fit possible, as well as resampling to higher number of points. Jsc – Voc pairs Jsc-Voc pairs at different light intensities and temperatures • • • Area correction. Fit of Voc vs Jsc: fit the diode ideality factor and J0, while separating the data according the the temperature. Limits to Jsc and Voc can be set. Separate according to temperature: separate the data source according to the temperature 9 PL spectrum • • • Add arbitrary offset (a dark is probably more suited) Substract dark: dark correction (curve subtraction) Convert x axis data from nm to eV • • nm to eV nm to cm-1 Some curves are automatically hidden at data loading. Edge detection on elemental traces Depth calibration Adjustment of elemental yield coefficients to match known elemental ratios over some data range Computation of arbitrary elemental ratios Generation of arbitrary elemental ratio curves (e.g. GGI, Ga+In, etc.) • Sputter time or depth (once calibrated) • • • Mott-Schottky plot (1/C^2 vs V) Carrier density N vs V N vs apparent depth SIMS • • • • • • C-V capacitance-voltage • Fit Mott-Schottky C-f capacitance-frequency Further data processing to be performed by peak selection in derivative visualization and Arrhenius fitting. • • Semilogx Derivative • semilogy • Channel to Energy [keV] conversion TRPL time-resolved photoluminescence decays • • Add temporal offset, add vertical (background level) offset Fit decay with constant plus arbitrary number of exponentials functions, with possibility of fixing some parameters. The residuals can also be shown. XRF MCA 10 5.2. Keywords to Curve A Curve object contains a dict storing information notably related to plotting. The keywords are not restricted, and only the keywords corresponding to the signature of the matplotlib plotting function will be given to the plotting method. Please have a look to the matplotlib documentation for a list of possible keywords. Keyword DetailsExamples type Plotting method of Axes. Only a few have been extensively tested, but most should work as far as a specific argument order is not required. == usual methods == 'plot', 'fill', 'errorbar', 'scatter', 'boxplot' == similar to plot == 'semilogx', 'semilogy', 'loglog', 'plot_date', 'stem', 'step', 'triplot', == (no linespec) == 'bar', 'barbs', 'barh', 'cohere', 'csd', 'fill_between', 'fill_betweenx', 'hexbin', 'hist2d', 'quiver', 'xcorr', == 1D vector data == 'acorr', 'angle_spectrum', 'eventplot', 'hist', 'magnitude_spectrum', 'phase_spectrum', 'pie', 'psd', 'specgram', == other == 'spy', 'stackplot', 'violinplot', 'imshow', 'contour', 'contourf' linespec Format string. --or label Curve label to be shown in legend. Experiment C == Display == color Curve color. r purple [0.5,0,0] alpha Transparency. 0.5 1 linewidth Linewidth in points 1.5 marker o s markersize Size of marker in points. 2.5 markerfacecolor Marker inner color. r [0.5,0,0] markeredgecolor Marker border color. 11 r [0.5,0,0] markeredgewidth Marker border with in points. 1.5 == Offsets == offset Offset to data. -10 [2,20] muloffset Multiplitcative offset to data. 0.01 [10, 1e2] == For specific curve types == facecolor Color of "fill" Curve types. Fill r [0.5,0,0] cmap Colormap, for Curve types which accept this keyword (scatter, etc.) afmhot inferno [[0.91,0.25,1], [1.09,0.75,1], 'hls'] vminmax Bounds values for cmap. [0,7] [3, ''] colorbar If not empty display a colorbar according to keyword cmap. 1 {'ticks': [-1, 0, 2]} {'orientation':'horizontal', 'adjust':[0.1, 0.1, 0.7, 0.1]} xerr x error for curve type "errorbar". 1 5 yerr y error for curve type "errorbar". 1 5 == Misc == labelhide Use "1" to hide label in the graph. 1 ax_twinx Plot curve on secondary axis. True ax_twiny Plot curve on secondary axis. True linestyle Use "none" to hide a Curve. none ['key', value] User-defined keyword-values pairs. Will be fed to the plotting method if possible. Only necessary in the GUI. ['fillstyle', 'top'] ['comment', 'a valuable info'] 12 6. Automated data processing scripts A few scripts are provided for data processing. Here is a short description of the required input and of the effect of the scripts. 6.1. Load all files from one folder Quite obvious 6.2. JV data fit cell-by-cell asks for a folder, loads all JV data in that folder, perform area correction if 2-column cell/area file is found (a search for such file is reported in console at beginning of script execution), • for each cell, select one dark and one illuminated curve, if possible, • fit the data with the 1 diode with 2 resistors model The output the following: • • • • • • For each cell, compiled dark+illuminated plots. Have a look to the quality of the fit. Compiled database files of the cell properties (all, dark only, illuminated only). Graphical sample maps of the different JV parameters values. 6.3. JV data fit separately Similar the JV data fit cel-by-cell. All JV files in a folder are fitted and the results are compiled in a database file. 6.4. JV sample maps: Asks for a JV database file (either output of JV setup, or of cell-by-cell script above) Output a graphical representation of each cells JV parameters 6.5. JV boxplots Creates boxplot graphs from column-organized data files in a given folder. • asks for a folder, • open each JV database files present and create boxplots for each relevant JV parameter. If no file is recognized as a JV database file, tries to aggregate column-wise the data found in each of the data file. 6.6. Processing of C-V data temperature series Processes a folder containing C-V data as function of temperature (1 curve per file). Produces a series of graphs (only the last is shown in the user interface) • • asks for a folder, generates the following graphs: C vs V, 1/C^2 vs V (Mott-Schottky), apparent doping vs depth, built-in voltage versus temperature. 13 6.7. Processing of C-f data temperature series Processes a folder containing C-f data as function of temperature (1 curve per file). Produces a series of graphs (only the last is shown in the user interface) • asks for a folder, • generates the following graphs: C vs f, derivative(C, log(f)) vs f, impedance angle. From the aggregated data the inflection points can be selected using the data picker, and the defect energy can be extracted from an Arrhenius relation. 14 7. Configuration file Some user preferences can be stored in a configuration file and indicated to the Graph object at creation. A personalized configuration file can also be provided to the GUI when using a application launcher as a second argument (it will be retrieved using sys.argv[1]) The configuration file will be opened by grapa as a standard Graph. Whenever needed the software will query for provided values, and use default settings if no suitable keyword is found. A configuration file may look like this one: # only keywords (first word) matters: comment line are read, maybe stored with corresponding keyword (e.g. '#'), but never refered to # repeating a keyword will overwrite the content of first instance # graph labels default unit presentation: [unit], (unit), / unit, or [], (), / graph_labels_units [] # graph labels presence of symbols (ie: $C$ in 'Capacitance $C$ [nF]') graph_labels_symbols False # path to inkscape executable, to export in .emf image format. Can be a string, or a list of strings inkscape_path["C:\Program Files\Inkscape\inkscape.exe"] # GUI default colorscales. Each colorscale is represented as a string (matplotlib colorscales), or a list of colors. # Each color can be a [r,g,b] triplet, a [r,g,b,a] quadruplet, or a [h,l,s,'hls'] quadruplet. rgb, rgba, hls, hsv colorscape are supported. GUI_colorscale00 [[1,0,0], [1,1,0.5], [0,1,0]] GUI_colorscale01 [[1,0.3,0], [0.7,0,0.7], [0,0.3,1]] GUI_colorscale02 [[1,0.43,0], [0,0,1]] GUI_colorscale03 [[0.91,0.25,1], [1.09,0.75,1], 'hls'] GUI_colorscale04 [[0.70,0.25,1], [0.50,0.75,1], 'hls'] GUI_colorscale05 [[1,0,1], [1,0.5,1], [0.5,0.75,1], 'hls'] GUI_colorscale07 'inferno' GUI_colorscale10 'gnuplot2' GUI_colorscale11 'viridis' GUI_colorscale12 'afmhot' GUI_colorscale13 'YlGn' # default saving image format save_imgformat .png 15 8. How to read my own data files ? You will need to create in folder datatypes a file with name graphMyfile.py (must start with graph with a small g). This file contains a class GraphMyfile (capital G, same ending as file name) that inherits from class Graph. The class must contain at least 1 attribute and 2 methods: • FILEIO_GRAPHTYPE: some string identifier, for internal use. • isFileReadable(cls, fileName, fileExt, line1='', line2='', line3='', **kwargs) Must return True is the file can be opened using your class, otherwise False • readDataFromFile(self, attributes, **kwargs) Actually opens the file, which can be access from self.filename. attributes is a dict which can be given to the constructor of the Curves. 8.1. Example: Let us assume your data file is organized as follows (file howto/example_sinx_x.txt): This is my own data format My label -29.9 -0.033394483 -29.7 -0.033316063 -29.5 -0.03189937 -29.3 -0.029182928 -29.1 -0.025257719 -28.9 -0.020264268 -28.7 -0.014387719 -28.5 -0.007851075 Such a column-organized file can very likely be opened using the provided methods. Still, you may want to add your own stuff there. In file howto/graphMydata.py is provided an example how such a file can be parsed. To have to example work just copy the file into the datatypes folder. The class is organized as follows: import numpy as np from grapa.graph import Graph from grapa.curve import Curve class GraphMydata(Graph): # will be used by grapa code FILEIO_GRAPHTYPE = 'MyCurve' # 3-element list, default x and y axis labels: [text, symbol, unit] AXISLABELS = [['theta', '\theta', 'unit'], ['value', '', 'unit']] @classmethod def isFileReadable(cls, fileName, fileExt, line1='', line2='', line3='', **kwargs): """ This function returns True if the file can be opened with this class. Please be selective so as not to open other file formats by mistake. 16 Are provided the file name, extension, and the 3 first lines of the file """ if fileExt == '.txt' and line1 == 'This is my own data format': return True return False def readDataFromFile(self, attributes, **kwargs): """ This function parses your files The file can be opened using open(self.filename, 'r') """ # interpret headers - here only attribute 'label' attrs = {} f = open(self.filename, 'r') f.readline() attrs['label'] = f.readline().strip() f.close() # read data data = np.array([[np.nan], [np.nan]]) kw = {'skip_header': 2, 'usecols': [0, 1]} try: data = np.transpose(np.genfromtxt(self.filename, **kw)) except Exception as e: if not self.silent: print('WARNING cannot read file', self.filename) print(type(e), e) # create Curve object(s) try: from grapa.datatypes.curveMycurve import CurveMycurve self.append(CurveMycurve(data, attributes)) except ImportError: self.append(Curve(data, attributes)) self.curve(-1).update(attrs) # file content may override default attributes # cosmetics # some default settings self.update({'ylim': [-1.2, 1.2], 'xlabel': self.formatAxisLabel(GraphMydata.AXISLABELS[0]), 'ylabel': self.formatAxisLabel(GraphMydata.AXISLABELS[1])}) 17 9. How to define my own Curve type ? You’ll need to create in folder datatypes a file named curveMycurve.py (file name must start with curve with a small c). The file must contain a class CurveMycurve (capital C, same ending as the file name) inheriting from class Curve. 9.1. Example An example is provided in file howto/curveMycurve.py. To have the example work just place a copy of the example files in the folder datatypes. The structure is as follows: import numpy as np from grapa.curve import Curve class CurveMycurve(Curve): # so the Curve class information is retrieved when opening an existing file CURVE = 'Curve mycurve' def __init__(self, data, attributes, silent=False): """ Constructor with minimal structure: Curve.__init__, and then set the 'Curve' parameter. """ Curve.__init__(self, data, attributes, silent=silent) self.update ({'Curve': CurveMycurve.CURVE}) # GUI RELATED FUNCTIONS def funcListGUI(self, **kwargs) """ Fills in the Curve actions specific to the Curve type """ def alterListGUI(self) """ Determines the possible data visualisations. """ # data transform function def y_derivative(self, index=np.nan, xyValue=None) # data transform function def y_abs(self, index=np.nan, xyValue=None) # function called by user def statsAndAddition(self, what) # a Curve type specific function printing help for the user def printHelp(self) 18 10. A few more details... 10.1. CurveSpectrum Curve Spectrum offers functions to compute the optical absorption coefficient α from reflectance and transmittance curves of layers. The resulting curve is in units of [cm -1]. The computation of α is based on the Beer-Lambert law of an estimate of the light absorption in the layer. Warning: The calculations presented below rely on various assumptions ans simplifications. For more accurate data treatment, various analytical approaches were developped in the literature. The use of dedicated optical modelization software is also recommended. Beer-Lambert law R, A and T denote the reflectance, absorptance and transmittance of the layer, and d the layer thickness. Figure 1: Schematics of the light propagation in a sample consisting of a single layer. The reflection at surfaces are here negleted. The Beer-Lambert law describes the attenuation of a propagating beam in a medium, and is expressed as I (d)=I 0 exp(−α d ) , with I0 the initial intensity and α the attenuation coefficient. Assuming the reflection mostly takes place at the first interface (which is wrong, but here a suitably good approximation when the light absorption is more important than reflections), one obtains: T= I (d)=(1−R) exp(−α d ) ⇒ α= −1 T ln d 1−R Presence of a (weakly) absorbing substrate In real-life measurements, the layer of interest is generally on top of a substrate. The reflectance and transmittance can be characterized for both the naked substrate and the layer on substrate. On would need to perform a "virtual" measurement, where only the layer of interest would be characterized. An estimate to the optical absorption coefficient α can be obtained as follows. 19 Again, we assume that the reflectance only occurs at the first interface. This is mostly satisfied if the refractive index of the layer of interst is higher than that of the substrate: ZnO on soda-lime glass (SLG) for example. With a relatively low value of n around 1.5, SLG is a relatively good substrate. Conversely Si has a very high refractive index and thus large amplitude of reflection at interfaces, and will not well satisfy this hypothesis even far in the infrared. Figure 2: Schematics of light propagation in (a) a substrate, (b) a substrate covered with a layer, and (c) ideal optical measurement on a free-standing layer. The reflection at interfaces are here neglected. Then, assuming that fraction of (transmitted light) over (incoming light) in the substrate are equal for both measurements : T substrate T tot = 1−R substrate 1−R tot− A tot ,layer ⇔ A tot ,layer =1−R tot− T tot T substrate (1−R substrate ) Finally, assuming R layer= R tot , and assuming T layer =1−Rlayer −A layer=T tot A layer = A tot ,layer , 1−R substrate . T substrate It follows that: α= T layer −1 −1 T tot (1−R substrate ) ln = ln . d 1−R layer d (1−R tot )T substrate Warning: This data treatment only provides an estimation of α. For accurate results please use a more refined analytical treatment, or a dedicated optical modelization software. 20
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Page Count : 20 Language : zxx Creator : Writer Producer : LibreOffice 5.1 Create Date : 2018:02:11 22:27:47+01:00EXIF Metadata provided by EXIF.tools