diff --git a/msspecbook/Activity08/Activity08.ipynb b/msspecbook/Activity08/Activity08.ipynb index e530123..a1e20e7 100644 --- a/msspecbook/Activity08/Activity08.ipynb +++ b/msspecbook/Activity08/Activity08.ipynb @@ -9,12 +9,85 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "id": "1df76138-c957-4da2-bcc8-ec977c209b81", + "cell_type": "markdown", + "id": "394b0c02-f28e-4074-86e5-9dfdf0447adb", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "intro" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5a4036dc-d087-419f-9a44-749a8b313d5c", + "metadata": {}, + "source": [ + "(aln-paper)=\n", + ":::{seealso}\n", + "based on this paper from V. Lebedev *et al.*\n", + "[J. Cryst. Growth. **207(4)** p266-72 (1999)](https://doi.org/10.1016/S0022-0248(99)00375-9)\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "fc1cf08e-77ba-49ea-99a9-8a7bac7c98c7", + "metadata": {}, + "source": [ + ":::{figure-md} AlN-fig1\n", + "\"AlN\n", + "\n", + "legend\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "fc180c7b-eb23-47c6-8d18-e092bc777843", + "metadata": {}, + "source": [ + ":::{figure-md} AlN-fig2\n", + "\"AlN\n", + "\n", + "legend\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "86c20245-abca-4587-bccf-90e0fb09f73c", + "metadata": {}, + "source": [ + ":::{figure-md} AlN-fig3\n", + "\"AlN\n", + "\n", + "legend\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "8a3a48ef-196f-435a-b342-3a73e62160f8", + "metadata": {}, + "source": [ + ":::{figure-md} AlN-fig4\n", + "\"AlN\n", + "\n", + "legend\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "abc64fdb-5895-4112-a987-66b3420d78eb", + "metadata": {}, + "source": [ + ":::{figure-md} AlN-fig5\n", + "\"AlN\n", + "\n", + "legend\n", + ":::" + ] } ], "metadata": { diff --git a/msspecbook/Activity08/AlN.py b/msspecbook/Activity08/AlN.py new file mode 100644 index 0000000..b424f72 --- /dev/null +++ b/msspecbook/Activity08/AlN.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +# coding: utf8 + + +from ase.build import bulk +import numpy as np +from msspec.calculator import MSSPEC, XRaySource +from msspec.utils import hemispherical_cluster, get_atom_index + +def create_clusters(nplanes=6): + def get_AlN_tags_planes(side, emitter): + AlN = # AlN is a Wurtzite crystal with a=3.11 and c=4.975 angstroms # <= HERE + [atom.set('tag', i) for i, atom in enumerate(AlN)] + if side == 'Al': + AlN.rotate([0,0,1],[0,0,-1]) + Al_planes = range(0, nplanes, 2) + N_planes = range(1, nplanes, 2) + else: + N_planes = range(0, nplanes, 2) + Al_planes = range(1, nplanes, 2) + if emitter == 'Al': + tags = [0, 2] + planes = Al_planes + else: + tags = [1, 3] + planes = N_planes + return AlN, tags, planes + + clusters = [] + for side in ('Al', 'N'): + for emitter in ('Al', 'N'): + AlN, tags, planes = get_AlN_tags_planes(side, emitter) + for emitter_tag in tags: + for emitter_plane in planes: + cluster = # hemis…, construct the cluster here with # <= HERE + # 2 planes below the emitter + cluster.absorber = get_atom_index(cluster, 0, 0, 0) + cluster.info.update({ + 'emitter_plane': emitter_plane, + 'emitter_tag' : emitter_tag, + 'emitter' : emitter, + 'side' : side, + }) + clusters.append(cluster) + print("Added cluster {}-side, emitter {}(tag {:d}) in " + "plane #{:d}".format(side, emitter, emitter_tag, + emitter_plane)) + return clusters + + +def compute(clusters, theta=np.arange(-20., 80., 1.), phi=0.): + data = None + for ic, cluster in enumerate(clusters): + # Retrieve info from cluster object + side = cluster.info['side'] + emitter = cluster.info['emitter'] + plane = cluster.info['emitter_plane'] + tag = cluster.info['emitter_tag'] + + # Set the level and the kinetic energy + if emitter == 'Al': + level = ##### # <= HERE + ke = ##### # <= HERE + elif emitter == 'N': + level = ##### # <= HERE + ke = ##### # <= HERE + + calc = # Create a calculator using the RA series expansion algorithm # <= HERE + + calc.source_parameters.energy = ##### # <= HERE + calc.source_parameters.theta = ##### # <= HERE + + calc.detector_parameters.angular_acceptance = ##### # <= HERE + calc.detector_parameters.average_sampling = 'medium' + + calc.calculation_parameters.scattering_order = max(1, min(4, plane)) + calc.calculation_parameters.path_filtering = 'forward_scattering' + calc.calculation_parameters.off_cone_events = 1 + [a.set('forward_angle', 30.) for a in cluster] + + calc.set_atoms(cluster) + + data = calc.get_theta_scan(level=level, theta=theta, phi=phi, + kinetic_energy=ke, data=data) + dset = data[-1] + dset.title = "\'{}\' side - {}({}) tag #{:d}, plane #{:d}".format( + side, emitter, level, tag, plane) + + return data + + +def analysis(data): + tmp_data = {} + for dset in data: + info = dset.get_cluster().info + side = info['side'] + emitter = info['emitter'] + try: + key = '{}_{}'.format(side, emitter) + tmp_data[key] += dset.cross_section + except KeyError: + tmp_data[key] = dset.cross_section.copy() + + tmp_data['theta'] = dset.theta.copy() + tmp_data['Al_side'] = tmp_data['Al_Al'] / tmp_data['Al_N'] + tmp_data['N_side'] = tmp_data['N_Al'] / tmp_data['N_N'] + + # now add all columns + substrate_dset = data.add_dset('Total substrate signal') + substrate_dset.add_columns(**tmp_data) + + view = substrate_dset.add_view('Ratios', + title=r'Al(2p)/N(1s) ratios on both polar ' + r'sides of AlN in the (10$\bar{1}$0) ' + r'azimuthal plane', + xlabel=r'$\Theta (\degree$)', + ylabel='Intenisty ratio') + view.select('theta', 'Al_side', legend='Al side', + where="theta >= 0 and theta <=70") + view.select('theta', 'N_side', legend='N side', + where="theta >= 0 and theta <=70") + view.set_plot_options(autoscale=True) + + return data + + +clusters = create_clusters() +data = compute(clusters) +data = analysis(data) +data.view() + diff --git a/msspecbook/Activity08/AlN_completed.py b/msspecbook/Activity08/AlN_completed.py new file mode 100644 index 0000000..e33f297 --- /dev/null +++ b/msspecbook/Activity08/AlN_completed.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python +# coding: utf8 + +from ase.build import bulk +import numpy as np +from msspec.calculator import MSSPEC, XRaySource +from msspec.utils import hemispherical_cluster, get_atom_index + +def create_clusters(nplanes=6): + def get_AlN_tags_planes(side, emitter): + AlN = bulk('AlN', crystalstructure='wurtzite', a=3.11, c=4.975) + [atom.set('tag', i) for i, atom in enumerate(AlN)] + if side == 'Al': + AlN.rotate([0,0,1],[0,0,-1]) + Al_planes = range(0, nplanes, 2) + N_planes = range(1, nplanes, 2) + else: + N_planes = range(0, nplanes, 2) + Al_planes = range(1, nplanes, 2) + if emitter == 'Al': + tags = [0, 2] + planes = Al_planes + else: + tags = [1, 3] + planes = N_planes + return AlN, tags, planes + + clusters = [] + for side in ('Al', 'N'): + for emitter in ('Al', 'N'): + AlN, tags, planes = get_AlN_tags_planes(side, emitter) + for emitter_tag in tags: + for emitter_plane in planes: + cluster = hemispherical_cluster(AlN, + emitter_tag=emitter_tag, + emitter_plane=emitter_plane, + planes=emitter_plane+2) + cluster.absorber = get_atom_index(cluster, 0, 0, 0) + cluster.info.update({ + 'emitter_plane': emitter_plane, + 'emitter_tag' : emitter_tag, + 'emitter' : emitter, + 'side' : side, + }) + clusters.append(cluster) + print("Added cluster {}-side, emitter {}(tag {:d}) in " + "plane #{:d}".format(side, emitter, emitter_tag, + emitter_plane)) + return clusters + + +def compute(clusters, theta=np.arange(-20., 80., 1.), phi=0.): + data = None + for ic, cluster in enumerate(clusters): + # Retrieve info from cluster object + side = cluster.info['side'] + emitter = cluster.info['emitter'] + plane = cluster.info['emitter_plane'] + tag = cluster.info['emitter_tag'] + + # Set the level and the kinetic energy + if emitter == 'Al': + level = '2p' + ke = 1407. + elif emitter == 'N': + level = '1s' + ke = 1083. + + calc = MSSPEC(spectroscopy='PED', algorithm='expansion') + + calc.source_parameters.energy = XRaySource.AL_KALPHA + calc.source_parameters.theta = -35 + + calc.detector_parameters.angular_acceptance = 4. + calc.detector_parameters.average_sampling = 'medium' + + calc.calculation_parameters.scattering_order = max(1, min(4, plane)) + calc.calculation_parameters.path_filtering = 'forward_scattering' + calc.calculation_parameters.off_cone_events = 1 + [a.set('forward_angle', 30.) for a in cluster] + + calc.set_atoms(cluster) + + data = calc.get_theta_scan(level=level, theta=theta, phi=phi, + kinetic_energy=ke, data=data) + dset = data[-1] + dset.title = "\'{}\' side - {}({}) tag #{:d}, plane #{:d}".format( + side, emitter, level, tag, plane) + + return data + + +def analysis(data): + tmp_data = {} + for dset in data: + info = dset.get_cluster().info + side = info['side'] + emitter = info['emitter'] + try: + key = '{}_{}'.format(side, emitter) + tmp_data[key] += dset.cross_section + except KeyError: + tmp_data[key] = dset.cross_section.copy() + + tmp_data['theta'] = dset.theta.copy() + tmp_data['Al_side'] = tmp_data['Al_Al'] / tmp_data['Al_N'] + tmp_data['N_side'] = tmp_data['N_Al'] / tmp_data['N_N'] + + # now add all columns + substrate_dset = data.add_dset('Total substrate signal') + substrate_dset.add_columns(**tmp_data) + + view = substrate_dset.add_view('Ratios', + title=r'Al(2p)/N(1s) ratios on both polar ' + r'sides of AlN in the (10$\bar{1}$0) ' + r'azimuthal plane', + xlabel=r'$\Theta (\degree$)', + ylabel='Intenisty ratio') + view.select('theta', 'Al_side', legend='Al side', + where="theta >= 0 and theta <=70") + view.select('theta', 'N_side', legend='N side', + where="theta >= 0 and theta <=70") + view.set_plot_options(autoscale=True) + + return data + + +clusters = create_clusters() +data = compute(clusters) +data = analysis(data) +data.view() + diff --git a/msspecbook/Activity08/fig1.jpg b/msspecbook/Activity08/fig1.jpg new file mode 100644 index 0000000..a99c89b Binary files /dev/null and b/msspecbook/Activity08/fig1.jpg differ diff --git a/msspecbook/Activity08/fig2.jpg b/msspecbook/Activity08/fig2.jpg new file mode 100644 index 0000000..1e21dbe Binary files /dev/null and b/msspecbook/Activity08/fig2.jpg differ diff --git a/msspecbook/Activity08/fig3.jpg b/msspecbook/Activity08/fig3.jpg new file mode 100644 index 0000000..f5170ee Binary files /dev/null and b/msspecbook/Activity08/fig3.jpg differ diff --git a/msspecbook/Activity08/fig4.jpg b/msspecbook/Activity08/fig4.jpg new file mode 100644 index 0000000..3e844f2 Binary files /dev/null and b/msspecbook/Activity08/fig4.jpg differ diff --git a/msspecbook/Activity08/fig5.jpg b/msspecbook/Activity08/fig5.jpg new file mode 100644 index 0000000..ce46083 Binary files /dev/null and b/msspecbook/Activity08/fig5.jpg differ