diff --git a/.gitignore b/.gitignore
index c142c39a9..812d3fafb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,6 @@ oauth-credentials.json
service-account-key.json
*.py[cod]
+# ignore media files in scripts folder
+scripts/*.mp3
+scripts/*.mp4
diff --git a/INTERNAL.md b/INTERNAL.md
index ba1a34b1c..4200eb335 100644
--- a/INTERNAL.md
+++ b/INTERNAL.md
@@ -5,16 +5,20 @@
Follow the below instructions to upload/update a tutorial video:
1. Create a metadata file similar to the one in [here](lang/en/docs/tutorials/dft/electronic/band-gap.json).
+
+ > Note: For each step, the time elapsed between `startTime` and `endTime` should approximately be the duration of the spoken sentence.
+ > I.e. this is almost impossible to get right on the first try and will need further refinement.
-2. Make sure to remove `youTubeId`. This field is automatically added by the [video manager](video-manager.py) script once the video is uploaded.
+3. Make sure to remove `youTubeId`. This field is automatically added by the [video manager](video-manager.py) script once the video is uploaded.
-3. In metadata file, `descriptionLinks` is a list of links which are added to video description. See [description template](video-description.jinja) for more details.
+4. In metadata file, `descriptionLinks` is a list of links which are added to video description. See [description template](video-description.jinja) for more details.
-4. Run the below command to add voice to the video:
+5. Run the below command to add voice to the video:
-```bash
-python video-manager.py voiceover --file PATH_TO_ORIGINAL_VIDEO --metadata PATH_TO_METADATA --audio PATH_TO_SAVE_AUDIO --output PATH_TO_SAVE_NEW_VIDEO
-```
+ ```bash
+ python video-manager.py voiceover --file PATH_TO_ORIGINAL_VIDEO --metadata PATH_TO_METADATA --audio PATH_TO_SAVE_AUDIO --output PATH_TO_SAVE_NEW_VIDEO
+ ```
+ whereby `PATH_TO_SAVE_AUDIO` and `PATH_TO_SAVE_NEW_VIDEO` should have the file extension `.mp3` and `.mp4`, respectively.
5. Retry step 4 with adjusted `youTubeCaptions` data until the optimal outcome is achieved.
@@ -22,15 +26,15 @@ python video-manager.py voiceover --file PATH_TO_ORIGINAL_VIDEO --metadata PATH_
7. Run the below command to upload/update the video once metadata is ready:
-```bash
-python video-manager.py upload --file PATH_TO_VIDEO --metadata PATH_TO_METADATA
-```
+ ```bash
+ python video-manager.py upload --file PATH_TO_VIDEO --metadata PATH_TO_METADATA
+ ```
8. The video privacy status is set to `unlisted` by default. Pass privacy status as below to override it:
-```bash
-python video-manager.py update --file PATH_TO_VIDEO --metadata PATH_TO_METADATA --privacyStatus public
-```
+ ```bash
+ python video-manager.py update --file PATH_TO_VIDEO --metadata PATH_TO_METADATA --privacyStatus public
+ ```
9. Commit the new changes to metadata file such as `youTubeId` and push.
diff --git a/data/esse b/data/esse
index 7caf56c18..1afead425 160000
--- a/data/esse
+++ b/data/esse
@@ -1 +1 @@
-Subproject commit 7caf56c181bc95f0827acde244cdb9fa527538ba
+Subproject commit 1afead425842c3f67ccec58fba669c337b5b1b70
diff --git a/images/properties-directory/band-offset.png b/images/properties-directory/band-offset.png
new file mode 100644
index 000000000..ec1abe28d
--- /dev/null
+++ b/images/properties-directory/band-offset.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:508d4b56d74ca243e2c985aada13cbbe0007adbbc6f01a69768b382f8dcf662c
+size 62012
diff --git a/images/tutorials/macroscopically-averaged-potential-lineup.png b/images/tutorials/macroscopically-averaged-potential-lineup.png
new file mode 100644
index 000000000..426bcaf0d
--- /dev/null
+++ b/images/tutorials/macroscopically-averaged-potential-lineup.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df1713ec6677420da85bace38db4156c2bf88b2385cc9d72e7d85821f7e13043
+size 178990
diff --git a/images/tutorials/valence-band-maximum-with-reference.png b/images/tutorials/valence-band-maximum-with-reference.png
new file mode 100644
index 000000000..1360716fd
--- /dev/null
+++ b/images/tutorials/valence-band-maximum-with-reference.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e046853a47727825c05b2d05fdc666e57b276ef81da98e57ee2787083b2bdbc
+size 152545
diff --git a/images/tutorials/valence-band-offset-workflow.png b/images/tutorials/valence-band-offset-workflow.png
new file mode 100644
index 000000000..98d51ad1e
--- /dev/null
+++ b/images/tutorials/valence-band-offset-workflow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4ce88880c2b783481694c3d1e64731399b60904e3d6f033ccbf9d4ee29ca1fc
+size 671898
diff --git a/lang/en/docs/materials/classification/crystalline.md b/lang/en/docs/materials/classification/crystalline.md
index a07c745a4..c1969c3d7 100644
--- a/lang/en/docs/materials/classification/crystalline.md
+++ b/lang/en/docs/materials/classification/crystalline.md
@@ -2,7 +2,7 @@
The complete **crystal structure** [^1] of a **crystalline material** is obtained when a [set of atoms](../../properties-directory/structural/basis.md), known as the **basis atoms** or **repeating unit**, are convolved (combined) with each one of the lattice points of the underlying [Bravais lattice](../../properties-directory/structural/lattice.md).
-This results in a crystal structure with **long-range order**, which gives its corresponding [space group](../../properties-directory/structural/space-group.md) symmetry assignment.
+This results in a crystal structure with **long-range order**, which gives its corresponding [space group](../../properties-directory/structural/symmetry.md#space-group) symmetry assignment.
## Visualization
diff --git a/lang/en/docs/materials/classification/non-periodic.md b/lang/en/docs/materials/classification/non-periodic.md
index 1bbe773f6..b54f9ff56 100644
--- a/lang/en/docs/materials/classification/non-periodic.md
+++ b/lang/en/docs/materials/classification/non-periodic.md
@@ -1,8 +1,11 @@
# Non-Periodic Materials
-The complete **structure** of a **non-periodic chemcial system** is obtained from a [set of atoms](../../properties-directory/structural/non-periodic-basis.md), known as the **basis atoms**, that describe a set of non-repeating atoms that are held together by covalent or non-covalent interactions.
+The complete **structure** of a **non-periodic chemical system** is obtained from a
+[set of atoms](../../properties-directory/structural/basis.md), known as the **basis atoms**, that describe
+a set of non-repeating atoms that are held together by covalent or non-covalent interactions.
-This results in a structure with a specific geometry which gives it a defined [point-group](../../properties-directory/structural/point-group.md)[^1] symmetry assignment.
+This results in a structure with a specific geometry which gives it a defined
+[point-group](../../properties-directory/structural/symmetry.md#point-group)[^1] symmetry assignment.
Examples of **non-periodic structures** include **molecules**[^2], like **methane**[^3].
diff --git a/lang/en/docs/properties-directory/overview.md b/lang/en/docs/properties-directory/overview.md
index eb75c51b4..d12fc4d54 100644
--- a/lang/en/docs/properties-directory/overview.md
+++ b/lang/en/docs/properties-directory/overview.md
@@ -14,17 +14,18 @@ Below we provide a list of Materials properties that can be [extracted](../prope
### Scalar
-| Property | Overview |
-|:--------------------------------------------------- |:------------------------------------------------|
-| [Total Energy](scalar/total-energy.md) | The ground state energy (free energy) of the system |
-| [Fermi Energy](scalar/fermi-energy.md) | The highest energy level occupied by electrons in a system |
-| [Surface Energy](scalar/surface-energy.md) | The energy of a crystal surface |
-| [Formation Energy](scalar/formation-energy.md) | The energy required to create defects |
-| [Reaction Energy Barrier](scalar/reaction-energy-barrier.md) | The activation energy required by the reactants to undergo a chemical reaction |
-| [Pressure](scalar/pressure.md) | Scalar average pressure |
-| [Zero Point Energy](scalar/zero-point-energy.md) | Energy of the lowest vibrational level wrt to vacuum |
-| [Total Energy Contributions](scalar/total-energy.md#total-energy-contributions) | Ewald, Exchange correlation and Hartree contributions to the total energy |
-| [Total Force](scalar/total-force.md) | Sum of the atomic forces |
+| Property | Overview |
+|:--------------------------------------------------------------------------------|:-------------------------------------------------------------------------------|
+| [Total Energy](scalar/total-energy.md) | The ground state energy (free energy) of the system |
+| [Fermi Energy](scalar/fermi-energy.md) | The highest energy level occupied by electrons in a system |
+| [Surface Energy](scalar/surface-energy.md) | The energy of a crystal surface |
+| [Formation Energy](scalar/formation-energy.md) | The energy required to create defects |
+| [Reaction Energy Barrier](scalar/reaction-energy-barrier.md) | The activation energy required by the reactants to undergo a chemical reaction |
+| [Pressure](scalar/pressure.md) | Scalar average pressure |
+| [Zero Point Energy](scalar/zero-point-energy.md) | Energy of the lowest vibrational level wrt to vacuum |
+| [Total Energy Contributions](scalar/total-energy.md#total-energy-contributions) | Ewald, Exchange correlation and Hartree contributions to the total energy |
+| [Total Force](scalar/total-force.md) | Sum of the atomic forces |
+| [Valence Band Offset](scalar/valence-band-offset.md) | Relative position of the valence band across an interface |
### Non-Scalar
@@ -42,16 +43,16 @@ Below we provide a list of Materials properties that can be [extracted](../prope
### Structural
-| Property | Overview |
-|:--------------------------------------------------- |:------------------------------------------------|
-| [Magnetic Moments](structural/magnetic-moment.md) | The magnetic moment of ferromagnetic materials when the "Magnetism" modifier is activated |
-| [Basis Atoms](structural/basis.md) | The individual atoms comprised in the crystal structure |
-| [Atomic forces](structural/atomic-forces.md) | Force exerted on each atom by its surrounding |
-| [Bravais Lattice](structural/lattice.md) | The underlying Bravais Lattice of the crystal structure |
-| [Space Group](structural/space-group.md) | Information about the symmetry elements contained in crystal structure |
-| [Final Structure](structural/final-structure.md) | The final crystal structure obtained from basis atoms and lattice, and its visualization |
-| [InChI](structural/inchi.md) | The International Chemical Identifier for a non-periodic structure. |
-| [InchiKey](structural/inchi-key.md) | The fixed length, non-human readable identifier string derived from an InChI for a non-periodic structure. |
+| Property | Overview |
+|:--------------------------------------------------|:------------------------------------------------|
+| [Magnetic Moments](structural/magnetic-moment.md) | The magnetic moment of ferromagnetic materials when the "Magnetism" modifier is activated |
+| [Basis Atoms](structural/basis.md) | The individual atoms comprised in the crystal structure |
+| [Atomic forces](structural/atomic-forces.md) | Force exerted on each atom by its surrounding |
+| [Bravais Lattice](structural/lattice.md) | The underlying Bravais Lattice of the crystal structure |
+| [Symmetry](structural/symmetry.md) | Information about the symmetry elements contained in crystal structure |
+| [Final Structure](structural/final-structure.md) | The final crystal structure obtained from basis atoms and lattice, and its visualization |
+| [InChI](structural/inchi.md) | The International Chemical Identifier for a non-periodic structure. |
+| [InchiKey](structural/inchi-key.md) | The fixed length, non-human readable identifier string derived from an InChI for a non-periodic structure. |
### Elemental
diff --git a/lang/en/docs/properties-directory/scalar/valence-band-offset.json b/lang/en/docs/properties-directory/scalar/valence-band-offset.json
new file mode 100644
index 000000000..f14c13860
--- /dev/null
+++ b/lang/en/docs/properties-directory/scalar/valence-band-offset.json
@@ -0,0 +1,7 @@
+{
+ "tags": [
+ "valence band offset",
+ "2D materials",
+ "interface"
+ ]
+}
diff --git a/lang/en/docs/properties-directory/scalar/valence-band-offset.md b/lang/en/docs/properties-directory/scalar/valence-band-offset.md
new file mode 100644
index 000000000..0a06642d8
--- /dev/null
+++ b/lang/en/docs/properties-directory/scalar/valence-band-offset.md
@@ -0,0 +1,38 @@
+# Valence Band Offset
+
+ScalarElectronic
+
+The valence band offset (VBO) is the energy difference of the valence band edges $\varepsilon_{v}$ across a heterostructure interface.
+Note, that the VBO is not simply given by the difference of valence band maxima of the two materials, but also depends
+on the electronic distribution at the interface.
+{: style="width:420px"}
+Regarding conduction band edges $\varepsilon_{c}$ there exists an equivalent property, termed conduction band offset (CBO).
+
+The VBO plays an important role for the transport properties of charge
+carriers in heterojunction devices (e.g. hole injection efficiency). Using first principles calculations, the VBO can be
+determined through the potential lineup method [^1][^2][^3] or via the local density of states (LDOS) [^3]. For more details
+regarding the potential lineup method, see also the [valence band offset tutorial](../../tutorials/dft/electronic/valence-band-offset.md)
+
+## Example
+
+Its value can be estimated using the valence band offset [workflow](../../workflows/overview.md), and it is returned under the [Results Tab](../../jobs/ui/results-tab.md) interface with the following appearance (in eV).
+
+
+
+
+ Valence Band Offset
+
0.250
+
+
+
+
+## Schema
+
+The JSON schema and an example representation for this property can be found [here](../../properties/data/list.md#valence-band-offset).
+
+## Links
+
+[^1]: A. Baldereschi, S. Baroni, R. Resta, *Phys. Rev. Lett.* **61**, 734 (1988); DOI: [10.1103/PhysRevLett.61.734](https://www.doi.org/10.1103/PhysRevLett.61.734)
+[^2]: L. Colombo, R. Resta, S. Baroni, *Phys. Rev. B* **44**, 5572 (1991); DOI: [10.1103/physrevb.44.5572](https://www.doi.org/10.1103/physrevb.44.5572)
+[^3]: M. Peressi, N. Binggeli, A. Baldereschi, *J. Phys. D: Appl. Phys.* **31**, 1273-1299 (1998); DOI: [10.1088/0022-3727/31/11/002](https://www.doi.org/10.1088/0022-3727/31/11/002)
+
diff --git a/lang/en/docs/properties-directory/structural/point-group.md b/lang/en/docs/properties-directory/structural/point-group.md
deleted file mode 100644
index 4a7e82787..000000000
--- a/lang/en/docs/properties-directory/structural/point-group.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Point Group
-
-Non-ScalarStructural
-
-In geometry, point groups [^1] represent a description of the **symmetry** of the geometry when one point is kept fixed in space. Point groups can be used to describe the symmetry of a molecular structure.[^2] Generally the symmetry of a molecular structure can be used to categorize molecules due to the point groups ability to predict and explain a molecules chemical properties.
-
-There are 31 common point groups that tend to be applied to molecules.[^2] For example, benzene (C6H6) is categorized as D6h as it has a 6-fold symmetry around the center of the structure.
-Five types of symmetry elements are used to classify the a molecule by its point group:
-1. Symmetry Axis: An axis around which a rotation by 360o/n results in an indistinguishable structure from the original.
-2. Plane of Symmetry: A plane of reflection which generates an identical copy of the original.
-3. Inversion Center: Idential atoms exist at points (x, y, z) and (-x, -y, -z) when the molecule is plotted in 3-dimensional space.
-4. Rotation-reflection Axis: An axis in which a rotation by 360o/n, followed by a reflection in a plane perpendicular to the axis results in an indistinguishable copy of the original.
-5. Identity: No change in the structure results in the same structure. This operation is the equivalent of multiplying the coordinates of the structure by 1 (unity).
-
-## Notation
-
-Point Groups are labelled using Schoenflies notation[^3], and examples include D6h, C2v, and Td.
-## Schema
-
-The JSON schema and an example representation for this property can be found [here](../../properties/data/list.md#point-group-symmetry).
-
-## Links
-
-[^1]: [Wikipedia Point group, Website](https://en.wikipedia.org/wiki/Point_group)
-
-[^2]: [Wikipedia Molecular symmetry, Website](https://en.wikipedia.org/wiki/Molecular_symmetry)
-
-[^3]: [Wikipedia Schoenflies notation, Website](https://en.wikipedia.org/wiki/Schoenflies_notation)
diff --git a/lang/en/docs/properties-directory/structural/space-group.md b/lang/en/docs/properties-directory/structural/space-group.md
deleted file mode 100644
index f1ebad91c..000000000
--- a/lang/en/docs/properties-directory/structural/space-group.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Space Group
-
-Non-ScalarStructural
-
-In crystallography, space groups [^1] [^2] represent a description of the **symmetry** of the [crystal structure](../../materials/classification/crystalline.md), generated by the symmetric repetition of an atomic grouping which, by itself, may or may not be symmetrical. There are 230 space groups in total, and each crystal structure existent in nature belongs to one of them.
-
-In its simplest form, a space group may be derived from translational symmetry. It can be developed further by incorporating additional more complex symmetry elements, such as mirror planes, rotations, screw axes and glide planes.
-
-## Notation
-
-Space Groups are labelled by a distinctive notation convention, as tabulated in Ref. [^3]. For example, the space group of the [cubic-diamond crystal structure](basis.md#example-atomic-structure), which silicon, germanium and carbon (diamond) share in common, is labelled by the symbol "Fd-3m".
-
-## Schema
-
-The JSON schema and an example representation for this property can be found [here](../../properties/data/list.md#space-group-symmetry).
-
-## Links
-
-[^1]: [Lattices and Space-Group Theory; "Structure Determination by X-ray Crystallography", Authors: M. Ladd, R. Palmer (Springer 2013), Document](https://www.springer.com/cda/content/document/cda_downloaddocument/9781461439561-c1.pdf?SGWID=0-0-45-1414341-p174314670)
-
-[^2]: [Wikipedia Space group, Website](https://en.wikipedia.org/wiki/Space_group)
-
-[^3]: [Wikipedia List of space groups, Website](https://en.wikipedia.org/wiki/List_of_space_groups)
diff --git a/lang/en/docs/properties-directory/structural/symmetry.md b/lang/en/docs/properties-directory/structural/symmetry.md
new file mode 100644
index 000000000..99740a5a8
--- /dev/null
+++ b/lang/en/docs/properties-directory/structural/symmetry.md
@@ -0,0 +1,62 @@
+# Symmetry
+
+Non-ScalarStructural
+
+## Point Group
+
+In geometry, point groups [^1] represent a description of the **symmetry** of the geometry when one point is kept fixed
+in space. Point groups can be used to describe the symmetry of a molecular structure.[^2] Generally the symmetry of a
+molecular structure can be used to categorize molecules due to the point groups ability to predict and explain a
+molecules chemical properties.
+
+There are 31 common point groups that tend to be applied to molecules.[^2] For example, benzene (C6H6)
+is categorized as D6h as it has a 6-fold symmetry around the center of the structure.
+Five types of symmetry elements are used to classify the a molecule by its point group:
+1. Symmetry Axis: An axis around which a rotation by 360o/n results in an indistinguishable structure from the original.
+2. Plane of Symmetry: A plane of reflection which generates an identical copy of the original.
+3. Inversion Center: Idential atoms exist at points (x, y, z) and (-x, -y, -z) when the molecule is plotted in 3-dimensional space.
+4. Rotation-reflection Axis: An axis in which a rotation by 360o/n, followed by a reflection in a plane
+ perpendicular to the axis results in an indistinguishable copy of the original.
+5. Identity: No change in the structure results in the same structure. This operation is the equivalent of multiplying
+ the coordinates of the structure by 1 (unity).
+
+### Notation
+
+Point Groups are labelled using Schoenflies notation[^3], and examples include D6h, C2v, and Td.
+
+## Space Group
+
+Non-ScalarStructural
+
+In crystallography, space groups [^4] [^5] represent a description of the **symmetry** of the
+[crystal structure](../../materials/classification/crystalline.md), generated by the symmetric repetition of an atomic
+grouping which, by itself, may or may not be symmetrical. There are 230 space groups in total, and each crystal structure
+existent in nature belongs to one of them.
+
+In its simplest form, a space group may be derived from translational symmetry. It can be developed further by incorporating
+additional more complex symmetry elements, such as mirror planes, rotations, screw axes and glide planes.
+
+### Notation
+
+Space Groups are labelled by a distinctive notation convention, as tabulated in Ref. [^6]. For example, the space group
+of the [cubic-diamond crystal structure](basis.md#example-atomic-structure), which silicon, germanium and carbon (diamond)
+share in common, is labelled by the symbol "Fd-3m".
+
+
+## Schema
+
+The JSON schema and an example representation for this property can be found [here](../../properties/data/list.md#symmetry).
+
+## Links
+
+[^1]: [Wikipedia Point group, Website](https://en.wikipedia.org/wiki/Point_group)
+
+[^2]: [Wikipedia Molecular symmetry, Website](https://en.wikipedia.org/wiki/Molecular_symmetry)
+
+[^3]: [Wikipedia Schoenflies notation, Website](https://en.wikipedia.org/wiki/Schoenflies_notation)
+
+[^4]: [Lattices and Space-Group Theory; "Structure Determination by X-ray Crystallography", Authors: M. Ladd, R. Palmer (Springer 2013), Document](https://www.springer.com/cda/content/document/cda_downloaddocument/9781461439561-c1.pdf?SGWID=0-0-45-1414341-p174314670)
+
+[^5]: [Wikipedia Space group, Website](https://en.wikipedia.org/wiki/Space_group)
+
+[^6]: [Wikipedia List of space groups, Website](https://en.wikipedia.org/wiki/List_of_space_groups)
diff --git a/lang/en/docs/properties/data/list.md b/lang/en/docs/properties/data/list.md
index 0169d41b6..fe41ac562 100644
--- a/lang/en/docs/properties/data/list.md
+++ b/lang/en/docs/properties/data/list.md
@@ -100,6 +100,18 @@ This is the total average force present within the crystal structure.
{!esse/example/properties_directory/scalar/total_force.json!}
```
+### [Valence Band Offset](../../properties-directory/scalar/valence-band-offset.md)
+
+The valence band offset represents the energy difference of valence bands across a heterostructure interface.
+
+```json tab="Schema"
+{!esse/schema/properties_directory/scalar/valence_band_offset.json!}
+```
+
+```json tab="Example"
+{!esse/example/properties_directory/scalar/valence_band_offset.json!}
+```
+
## Non-Scalar Properties
### [Bandstructure](../../properties-directory/non-scalar/bandstructure.md)
@@ -292,11 +304,11 @@ Contains information about the coordinates of atoms within the unit cell by id.
Contains an array of the elements in the unit cell and the atom id’s association with each atom.
```json tab="Schema"
-{!esse/schema/properties_directory/structural/basis/atomic_elements.json!}
+{!esse/schema/properties_directory/structural/basis/atomic_element.json!}
```
```json tab="Example"
-{!esse/example/properties_directory/structural/basis/atomic_elements.json!}
+{!esse/example/properties_directory/structural/basis/atomic_element.json!}
```
### [Atomic Constraints](../../properties-directory/structural/basis.md)
@@ -416,28 +428,16 @@ The P norm measures how homogeneous a material is in terms of its chemical compo
{!esse/example/properties_directory/structural/p-norm.json!}
```
-### [Point Group Symmetry](../../properties-directory/structural/point-group.md)
+### [Symmetry](../../properties-directory/structural/symmetry.md)
-The Point Group of the structure, indicating the symmetry elements that it contains, is also available.
+The symmetry of the structure, indicating the point group and space group.
```json tab="Schema"
-{!esse/schema/properties_directory/structural/symmetry_symbol_point_group.json!}
+{!esse/schema/properties_directory/structural/symmetry.json!}
```
```json tab="Example"
-{!esse/example/properties_directory/structural/symmetry_symbol_point_group.json!}
-```
-
-### [Space Group Symmetry](../../properties-directory/structural/space-group.md)
-
-The Space Group of the structure, indicating the symmetry elements that it contains, is also available.
-
-```json tab="Schema"
-{!esse/schema/properties_directory/structural/symmetry_symbol_space_group.json !}
-```
-
-```json tab="Example"
-{!esse/example/properties_directory/structural/symmetry_symbol_space_group.json!}
+{!esse/example/properties_directory/structural/symmetry.json!}
```
### [Volume](../../properties-directory/structural/lattice.md)
@@ -452,17 +452,6 @@ The volume of the unit cell is given by the scalar triple product of the lattice
{!esse/example/properties_directory/structural/volume.json!}
```
-### [Molecular Weight](../../properties-directory/structural/molecular-weight.md)
-
-The mass of a [Non-Periodic](../../materials/classification/non-periodic.md) structure in units of g/mol. The molecular weight is a summation of the molecular weights of every atom constituting the structure.
-
-```json tab="Schema"
-{!esse/schema/properties_directory/structural/molecular-weight.json!}
-```
-
-```json tab="Example"
-{!esse/example/properties_directory/structural/molecular-weight.json!}
-```
## Links
[^1]: [Wikipedia - International Chemical Identifier (Website)](https://en.wikipedia.org/wiki/International_Chemical_Identifier)
diff --git a/lang/en/docs/tutorials/dft/electronic/overview.md b/lang/en/docs/tutorials/dft/electronic/overview.md
index d7014ccdc..bc679dabe 100644
--- a/lang/en/docs/tutorials/dft/electronic/overview.md
+++ b/lang/en/docs/tutorials/dft/electronic/overview.md
@@ -30,5 +30,9 @@ A similar Band Gap calculation with Quantum ESPRESSO is [available here](hse-qe-
## GW Calculations
-This [tutorial](gw-vasp-bg.md) illustrate how the results for the Band Gap can be more accurate through the use of the [GW Approximation](../../../models-directory/dft/notes.md#the-gw-approximation).
+This [tutorial](gw-vasp-bg.md) illustrates how the results for the Band Gap can be more accurate through the use of the [GW Approximation](../../../models-directory/dft/notes.md#the-gw-approximation).
+## Valence Band Offset
+
+We show how to calculate the [valence band offset](../../../properties-directory/scalar/valence-band-offset.md) for a
+heterostructure using the potential lineup method in [this tutorial](valence-band-offset.md).
diff --git a/lang/en/docs/tutorials/dft/electronic/valence-band-offset.json b/lang/en/docs/tutorials/dft/electronic/valence-band-offset.json
new file mode 100644
index 000000000..de46cd692
--- /dev/null
+++ b/lang/en/docs/tutorials/dft/electronic/valence-band-offset.json
@@ -0,0 +1,104 @@
+{
+ "descriptionLinks": [
+ "Calculate Electronic Band Structure with GW and Plasmon Pole Method: https://docs.exabyte.io/tutorials/dft/electronic/valence-band-offset/"
+ ],
+ "description": "This tutorial page explains how to calculate the valence band offset across a 2D interface using the potential lineup method. In this example, we chose an interface of WS2 and MoS2 monolayers, and use Quantum ESPRESSO as our main simulation engine.",
+ "title": "Mat3ra Tutorial: How to Calculate the Valence Band Offset",
+ "tags": [
+ {
+ "...": "../../../metadata/general.json#/tags"
+ },
+ {
+ "...": "../../../models-directory/dft.json#/tags"
+ },
+ {
+ "...": "../../../software-directory/modeling/quantum-espresso.json#/tags"
+ },
+ {
+ "...": "../../../properties-directory/scalar/valence-band-offset.json#/tags"
+ }
+ ],
+ "youTubeCaptions": [
+ {
+ "text": " Create a new simulation, by navigating to the job designer page.",
+ "startTime": "00:00:00.000",
+ "endTime": "00:00:04.000"
+ },
+ {
+ "text": "Then, choose select workflow from the job actions menu and select the valence band offset workflow.",
+ "startTime": "0:00:04.500",
+ "endTime": "0:00:12.000"
+ },
+ {
+ "text": "Then, choose select materials from the job actions menu and add the interface material.",
+ "startTime": "0:00:17.500",
+ "endTime": "0:00:21.500"
+ },
+ {
+ "text": "Add the monolayer materials corresponding to the left and right side of the interface via the material actions menu.",
+ "startTime": "0:00:27.000",
+ "endTime": "0:00:32.000"
+ },
+ {
+ "text": "Next click on the workflow tab in order to adjust the workflow parameters.",
+ "startTime": "0:00:33.000",
+ "endTime": "0:00:36.000"
+ },
+ {
+ "text": "First, adjust the window size for the macroscopic averaging to 5.7 bohr, which is approximately the distance between sulfur atoms in a monolayer.",
+ "startTime": "0:00:39.000",
+ "endTime": "0:00:49.500"
+ },
+ {
+ "text": "Adjust this parameter in each of the three subworkflows containing an averaging unit.",
+ "startTime": "0:00:50.500",
+ "endTime": "0:00:56.000"
+ },
+ {
+ "text": "Next, modify the size of the k-point grid and path.",
+ "startTime": "0:01:21.000",
+ "endTime": "0:01:25.000"
+ },
+ {
+ "text": "Due to the reduced dimensionality of the material, some points in the k-path can be removed.",
+ "startTime": "0:01:30.000",
+ "endTime": "0:01:36.000"
+ },
+ {
+ "text": "Just like before, the same settings also have to be modified in the remaining subworkflows.",
+ "startTime": "0:01:40.000",
+ "endTime": "0:01:42.500"
+ },
+ {
+ "text": "After that, navigate to compute tab, set the compute configuration and finally save the job when ready.",
+ "startTime": "0:02:13.000",
+ "endTime": "0:02:18.500"
+ },
+ {
+ "text": "It can then be submitted to the compute queue, for execution.",
+ "startTime": "0:02:21.000",
+ "endTime": "0:02:24.000"
+ },
+ {
+ "text": "Once the job has finished, open it, to inspect the final results.",
+ "startTime": "0:02:28.000",
+ "endTime": "0:02:30.500"
+ },
+ {
+ "text": "For each of the three materials, the results page presents the electronic band structure plot as well as the planar and macroscopic average of the electrostatic potential.",
+ "startTime": "0:02:32.000",
+ "endTime": "0:02:41.000"
+ },
+ {
+ "text": "The calculated value of the valence band offset is shown at the bottom of the page.",
+ "startTime": "0:02:46.000",
+ "endTime": "0:02:50.000"
+ },
+ {
+ "text": "This completes the present tutorial.",
+ "startTime": "0:02:52.000",
+ "endTime": "0:02:54.000"
+ }
+ ],
+ "youTubeId": "wHWEwDcARog"
+}
\ No newline at end of file
diff --git a/lang/en/docs/tutorials/dft/electronic/valence-band-offset.md b/lang/en/docs/tutorials/dft/electronic/valence-band-offset.md
new file mode 100644
index 000000000..056781be0
--- /dev/null
+++ b/lang/en/docs/tutorials/dft/electronic/valence-band-offset.md
@@ -0,0 +1,113 @@
+# Calculate Valence Band Offset
+
+This tutorial page explains how to calculate the [valence band offset](../../../properties-directory/scalar/valence-band-offset.md) (VBO)
+based on the potential lineup method[^1][^2][^3] using [Density Functional Theory](../../../models-directory/dft/overview.md).
+For this tutorial, we consider a 2D material interface MoS2/WS2 and use
+[Quantum Espresso](../../../software-directory/modeling/quantum-espresso/overview.md) as our main simulation engine.
+The content of this tutorial was also part of our 2021 webinar *2D Materials and their Electronic Properties*[^4]
+
+!!!note "Simulation engines considered in this tutorial"
+ The workflow presented in this tutorial is currently only available for
+ [Quantum ESPRESSO](../../../software-directory/modeling/quantum-espresso/overview.md).
+
+## Definitions
+
+### Valence Band Offset
+
+The [valence band offset](../../../properties-directory/scalar/valence-band-offset.md) is defined by the relative position
+of the valence band on both sides of the interface. This property is relevant to study the charge transport across
+interfaces such as semiconductor heterojunctions. Other properties related to the band profile at the interface are
+the *conduction band offset* and *Schottky barrier* (metal-semiconductor interface).
+
+### Potential Lineup Method
+This tutorial employs the potential lineup method in order to determine the valence band offset, which requires the
+calculation of the macroscopically averaged electrostatic potential and valence band maximum of the two materials.
+The valence band offset for an A/B interface can then be determined via:
+$$ \Delta E_{\mathrm{VBO}} = \Delta E_{v} + \Delta \overline{V}$$
+The first term, $\Delta E_{v}$, is usually referred to as the *band structure term* and defined as the difference
+of the two valence band maxima $\varepsilon_{v}$ referenced to the macroscopically averaged electrostatic potential $\overline{V}$
+in each material:
+$$ \Delta E_{v} = (\varepsilon_{v}^{A} - \overline{V}^{A}) - (\varepsilon_{v}^{B} - \overline{V}^{B}) $$
+{: style="width:600px"}
+The second term, $\Delta \overline{V}$, is determined from the lineup of the macroscopically averaged electrostatic potential in
+the interface heterostructure.
+{: style="width:600px"}
+
+
+## Choose Materials
+
+When creating the job, the user needs to select **three materials** corresponding to the MoS2/WS2 interface
+and the isolated monolayers of both MoS2 and WS2. Each of the structures is expected to be relaxed.
+The initial interface structure was taken from [materialsproject](https://materialsproject.org/materials/mp-1023954) and
+optimized via a variable-cell relaxation of the x- and y-components. The monolayer structures were extracted from the interface
+and optimized in the same way. The final structures are available on the Mat3ra platform:
+
+ - [MoS2/WS2 heterostructure](https://platform.mat3ra.com/exabyte-io/materials/cxgeoQwPJQJbgA2aD)
+ - [WS2 monolayer](https://platform.mat3ra.com/exabyte-io/materials/5JcsfbBPKFWjxGXkX)
+ - [MoS2 monolayer](https://platform.mat3ra.com/exabyte-io/materials/Cyr7Y6sefZsmZo6bH)
+
+!!!note "Order of Materials"
+ The VBO workflow assumes the interface structure to correspond to the first material, i.e. please be sure to load the interface
+ structure first.
+
+## Choose Workflow
+
+The [workflow](../../../workflows/overview.md) for calculating the valence band offset can be
+[imported](../../../workflows/actions/copy-bank.md) from the [Workflows Bank](../../../workflows/bank.md) into the account-owned
+[collection](../../../accounts/collections.md).
+This workflow can later be [selected](../../../jobs-designer/actions-header-menu/select-workflow.md) and added to the
+[Job being created](../../../jobs-designer/workflow-tab.md).
+A [representation of this workflow](https://github.com/Exabyte-io/wode.js/blob/2022.11.16-0/assets/workflows/espresso/valence_band_offset.yml)
+is also available as part of the Mat3ra workflow definitions repository ([wode.js](https://github.com/Exabyte-io/wode.js)).
+
+[](../../../images/tutorials/valence-band-offset-workflow.png)
+
+The workflow contains two subworkflows per material calculating the valence band maximum (via band structure),
+macroscopically averaged electrostatic potential, and its minima.
+As the system in this tutorial is a heterostructure built of monolayers, determining the value of the macroscopically
+averaged electrostatic potential in the region of the monolayer corresponds to finding the minima of $\overline{V}$.
+For multilayered heterostructures the problem becomes equivalent of finding plateaus of $\overline{V}$.
+The final subworkflow collects all the intermediate results and determines the value of the valence band offset.
+
+### Workflow Settings
+
+For the purpose of this tutorial, we set the size of the grid of k-points to 6 x 6 x 1 for each of the three PW-SCF units
+and adjust the k-path to reflect the reduced dimensionality (Γ-M-K-Γ). In addition, one should also adjust the size of the window
+for macroscopic averaging. For the present system we set this size to the distance between the sulfur atoms in both
+monolayers (ca. 5.7 bohr).
+
+## Submit Job
+
+Before [submitting](../../../jobs/actions/run.md) the [job](../../../jobs/overview.md), the user should click on the
+["Compute" tab](../../../jobs-designer/compute-tab.md) of [Job Designer](../../../jobs-designer/overview.md) and inspect
+the [compute parameters](../../../infrastructure/compute/parameters.md) included therein.
+
+## Examine results
+
+When all [unit](../../../workflows/components/units.md) computations are complete at the end of Job execution, switching
+to the [Results tab](../../../jobs/ui/results-tab.md) of [Job Viewer](../../../jobs/ui/viewer.md) will show the results
+of the simulation, including the valence band offset as well as the plots of the planar and macroscopic average of
+the electrostatic potentials.
+
+### Comparison with Experimental Value
+
+The calculated value of ~0.27 eV for the valence band offset is below the experimental[^5] value of 0.55 eV,
+but agrees with previous theoretical results[^6] of 0.32 eV and 0.22 eV, respectively.
+
+## Animation
+
+We demonstrate the above-mentioned steps involved in the creation and execution of a Valence Band Offset workflow in the following animation.
+
+
+
+
+
+## Links
+
+[^1]: A. Baldereschi, S. Baroni, R. Resta, *Phys. Rev. Lett.* **61**, 734 (1988); DOI: [10.1103/PhysRevLett.61.734](https://www.doi.org/10.1103/PhysRevLett.61.734)
+[^2]: L. Colombo, R. Resta, S. Baroni, *Phys. Rev. B* **44**, 5572 (1991); DOI: [10.1103/physrevb.44.5572](https://www.doi.org/10.1103/physrevb.44.5572)
+[^3]: M. Peressi, N. Binggeli, A. Baldereschi, *J. Phys. D: Appl. Phys.* **31**, 1273-1299 (1998); DOI: [10.1088/0022-3727/31/11/002](https://www.doi.org/10.1088/0022-3727/31/11/002)
+[^4]: [2D Materials and their Electronic Properties (Mat3ra YouTube)](https://youtu.be/5T9JMoj62P4)
+[^5]: C. Lu, *et. al*, *Phys. Status Solidi A*, 1900544 (2009); DOI: [10.1002/pssa.201900544](https://www.doi.org/10.1002/pssa.201900544)
+[^6]: E. Torun, H.P.C. Miranda, A. Molina-Sánchez, L. Wirtz, *Phys. Rev. B* **97**, 245427 (2018); DOI: [10.1103/PhysRevB.97.245427](https://www.doi.org/10.1103/PhysRevB.97.245427)
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 87e5a7101..c009ccbeb 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -59,6 +59,7 @@ markdown_extensions:
- pymdownx.extrarawhtml # Enables parsing of markdown inside html tags
- pymdownx.betterem # Better bold/italic text
- pymdownx.striphtml # Strip html comments before processing
+ - attr_list
# https://github.com/facelessuser/pymdown-extensions/blob/master/mkdocs.yml
# https://squidfunk.github.io/mkdocs-material/extensions/codehilite/
@@ -144,6 +145,7 @@ nav:
- Electronic density of states: tutorials/dft/electronic/density-of-states.md
- Electronic density mesh: tutorials/dft/electronic/electronic-density-mesh.md
- Fermi Surface: tutorials/dft/electronic/fermi-surface.md
+ - Valence Band Offset: tutorials/dft/electronic/valence-band-offset.md
- Vibrational Prop.:
- Overview: tutorials/dft/vibrational/overview.md
- Zero Point Energy: tutorials/dft/vibrational/zero-point-energy.md
@@ -404,7 +406,7 @@ nav:
- Default: materials/default.md
- Classification:
- Crystalline: materials/classification/crystalline.md
- - Non-Periodic materials/classification/non-periodic.md
+ - Non-Periodic: materials/classification/non-periodic.md
- User Interface:
- Explorer: materials/ui/explorer.md
- Designer: materials-designer/overview.md
@@ -606,6 +608,7 @@ nav:
- Pressure: properties-directory/scalar/pressure.md
- Total Force: properties-directory/scalar/total-force.md
- Reaction Energy Barrier: properties-directory/scalar/reaction-energy-barrier.md
+ - Valence Band Offset: properties-directory/scalar/valence-band-offset.md
- Non-scalar:
- Stress Tensor: properties-directory/non-scalar/stress-tensor.md
- Band Structure: properties-directory/non-scalar/bandstructure.md
@@ -624,7 +627,7 @@ nav:
- Basis: properties-directory/structural/basis.md
- Atomic Forces: properties-directory/structural/atomic-forces.md
- Lattice: properties-directory/structural/lattice.md
- - Space Group: properties-directory/structural/space-group.md
+ - Symmetry: properties-directory/structural/symmetry.md
- Final Structure: properties-directory/structural/final-structure.md
- Magnetic Moment: properties-directory/structural/magnetic-moment.md
- Inchi: properties-directory/structural/inchi.md
diff --git a/scripts/video-manager.py b/scripts/video-manager.py
index dc7bd195d..59dbc1147 100755
--- a/scripts/video-manager.py
+++ b/scripts/video-manager.py
@@ -5,6 +5,7 @@
import json
import googleapiclient.discovery
+from pathlib import Path
from jinja2 import Template
from google.cloud import texttospeech
from oauth2client.file import Storage
@@ -14,13 +15,14 @@
from utils import flatten, update_metadata, parseIncludeStatements, caption_time_to_milliseconds
SCOPE = "https://www.googleapis.com/auth/youtubepartner"
-CLIENT_SECRETS_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "oauth-key.json"))
-DESCRIPTION_TEMPLATE = os.path.abspath(os.path.join(os.path.dirname(__file__), "video-description.jinja"))
-SERVICE_ACCOUNT_KEY_FILE = os.path.abspath(os.path.join(os.path.dirname(__file__), "service-account-key.json"))
+SCRIPT_DIR = Path(__file__).resolve().parent
+CLIENT_SECRETS_FILE = SCRIPT_DIR / "oauth-key.json"
+DESCRIPTION_TEMPLATE = SCRIPT_DIR / "video-description.jinja"
+SERVICE_ACCOUNT_KEY_FILE = SCRIPT_DIR / "service-account-key.json"
DESCRIPTION_LINKS = [
- "Materials Modeling 2.0: https://exabyte.io/",
- "Exabyte.io Platform: https://platform.exabyte.io/register",
- "Exabyte.io Documentation: https://docs.exabyte.io/",
+ "Materials Modeling 2.0: https://mat3ra.com/",
+ "Mat3ra Platform: https://platform.mat3ra.com/register",
+ "Mat3ra Documentation: https://docs.mat3ra.com/",
]
LANGUAGE_CODE = 'en-US'
@@ -35,6 +37,8 @@ def get_oauth_credentials():
"""
Returns the credentials to establish connection to YouTube API.
"""
+ if not CLIENT_SECRETS_FILE.exists():
+ return None
flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=SCOPE)
storage = Storage("oauth-credentials.json")
credentials = storage.get()
@@ -47,14 +51,16 @@ def get_text_to_speech_api_client():
"""
Returns TextToSpeech API client.
"""
- return texttospeech.TextToSpeechClient.from_service_account_file(SERVICE_ACCOUNT_KEY_FILE)
+ return texttospeech.TextToSpeechClient.from_service_account_file(SERVICE_ACCOUNT_KEY_FILE.name)
def get_youtube_api_client():
"""
Returns YouTube API client.
"""
- return googleapiclient.discovery.build("youtube", "v3", credentials=get_oauth_credentials())
+ credentials = get_oauth_credentials()
+ if credentials is not None:
+ return googleapiclient.discovery.build("youtube", "v3", credentials=credentials)
def get_category_id(youtube_, category):
@@ -74,7 +80,7 @@ def get_category_id(youtube_, category):
def get_video_body_param(youtube_, metadata_):
"""
- Returns the body of the the request to YouTube API.
+ Returns the body of the request to YouTube API.
Args:
youtube_: YouTube API client instance.
metadata_ (dict): video metadata.
@@ -141,16 +147,17 @@ def create_svb_caption_content(metadata_):
"""
regex = re.compile(r'<.*?>')
caption_to_text = lambda c: "".join((c["startTime"], ",", c["endTime"], "\n", regex.sub('', c["text"])))
- return "\n\n".join([caption_to_text(caption) for caption in metadata_["youTubeCaptions"]])
+ captions = "\n\n".join([caption_to_text(caption) for caption in metadata_["youTubeCaptions"]])
+ return captions.encode("utf-8")
-def insert_caption(youtube_, youTubeId_, name, content):
+def insert_caption(youtube_, youtube_id_, name, content):
"""
Creates a caption from metadata and inserts it to YouTube.
Args:
youtube_: YouTube API client instance.
- youTubeId_: the ID of video.
+ youtube_id_: the ID of video.
name (str): caption name.
content (str): caption content.
"""
@@ -160,7 +167,7 @@ def insert_caption(youtube_, youTubeId_, name, content):
"snippet": {
"language": LANGUAGE_CODE,
"name": name,
- "videoId": youTubeId_
+ "videoId": youtube_id_
}
},
media_body=MediaInMemoryUpload(content)
@@ -180,11 +187,11 @@ def create_SSML_text(metadata_):
str
"""
text = ""
- previousEnd = 0
+ previous_end = 0
for caption in metadata_["youTubeCaptions"]:
- silence = caption_time_to_milliseconds(caption["startTime"]) - previousEnd
- text = "".join((text, "".format(silence), caption["text"]))
- previousEnd = caption_time_to_milliseconds(caption["endTime"])
+ silence = caption_time_to_milliseconds(caption["startTime"]) - previous_end
+ text = "".join((text, f"", caption["text"]))
+ previous_end = caption_time_to_milliseconds(caption["endTime"])
return "".join(("", text, ""))
@@ -226,14 +233,17 @@ def convert_text_to_speech(ssml_text, speech_path):
args = argparser.parse_args()
- if not os.path.exists(args.file): exit("video file does not exist!")
- if not os.path.exists(args.metadata): exit("metadata file does not exist!")
+ if not os.path.exists(args.file):
+ exit("video file does not exist!")
+ if not os.path.exists(args.metadata):
+ exit("metadata file does not exist!")
# extract metadata
metadata = parseIncludeStatements(args.metadata)
metadata["tags"] = list(set(flatten(metadata["tags"])))
tags_length = len(" ".join(metadata["tags"]))
- if tags_length > 500: exit("Too Many Tags ({})! The limit is 500 Characters!".format(tags_length))
+ if tags_length > 500:
+ exit("Too Many Tags ({})! The limit is 500 Characters!".format(tags_length))
metadata["privacyStatus"] = metadata.get("privacyStatus", args.privacyStatus)
metadata["descriptionLinks"] = metadata.get("descriptionLinks", []) + DESCRIPTION_LINKS
with open(DESCRIPTION_TEMPLATE) as f:
@@ -242,14 +252,15 @@ def convert_text_to_speech(ssml_text, speech_path):
youtube = get_youtube_api_client()
if args.command == "update":
- if not metadata.get("youTubeId"): exit("metadata does not contain youTubeId!")
+ if not metadata.get("youTubeId"):
+ exit("metadata does not contain youTubeId!")
update_video(youtube, metadata)
if args.command == "upload":
- youTubeId = insert_video(youtube, args.file, metadata)["id"]
+ youtube_id = insert_video(youtube, args.file, metadata)["id"]
caption_content = create_svb_caption_content(metadata)
- insert_caption(youtube, youTubeId, metadata["title"], caption_content)
- update_metadata(args.metadata, {"youTubeId": youTubeId})
+ insert_caption(youtube, youtube_id, metadata["title"], caption_content)
+ update_metadata(args.metadata, {"youTubeId": youtube_id})
if args.command == "voiceover":
ssml_text = create_SSML_text(metadata)